Relax alias restrictions. (#7190)

Implement the alias rules from proposal #5389, wherein an alias is
permitted so long as the target has a constant value. While that
proposal is not yet accepted, this seems like a reasonable basis for
further iteration, and will be useful for the examples we're currently
pursuing.
This commit is contained in:
Richard Smith
2026-05-12 17:22:44 +00:00
committed by GitHub
parent d4063cad65
commit dd7cfdb149
35 changed files with 262 additions and 219 deletions
+1 -1
View File
@@ -64,7 +64,7 @@ fn Main() {
// CHECK:STDOUT: %return: ref %empty_tuple.type = return_slot %return.param
// CHECK:STDOUT: }
// CHECK:STDOUT: %A.ref: %A.type = name_ref A, %A.decl [concrete = constants.%A]
// CHECK:STDOUT: %B: %A.type = alias_binding B, %A.decl [concrete = constants.%A]
// CHECK:STDOUT: %B: %A.type = alias_binding B, %A.ref [concrete = constants.%A]
// CHECK:STDOUT: %Main.decl: %Main.type = fn_decl @Main [concrete = constants.%Main] {} {}
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -335,7 +335,7 @@ fn B() {}
// CHECK:STDOUT: }
// CHECK:STDOUT: %A.decl: %A.type = fn_decl @A [concrete = constants.%A] {} {}
// CHECK:STDOUT: %A.ref: %A.type = name_ref A, %A.decl [concrete = constants.%A]
// CHECK:STDOUT: %B: %A.type = alias_binding B, %A.decl [concrete = constants.%A]
// CHECK:STDOUT: %B: %A.type = alias_binding B, %A.ref [concrete = constants.%A]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @A();
@@ -220,7 +220,7 @@ fn Foo(unused a: const (const C)) {}
// CHECK:STDOUT: }
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type = fn_decl @Foo [concrete = constants.%Foo] {
// CHECK:STDOUT: %a.param_patt: %pattern_type = value_param_pattern [concrete]
// CHECK:STDOUT: %a.patt: %pattern_type = at_binding_pattern a, %a.param_patt [concrete]
@@ -480,7 +480,7 @@ fn Foo(unused a: const (const C)) {}
// CHECK:STDOUT: }
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
// CHECK:STDOUT: %Foo.decl: %Foo.type = fn_decl @Foo [concrete = constants.%Foo] {
// CHECK:STDOUT: %a.param_patt: %pattern_type = value_param_pattern [concrete]
// CHECK:STDOUT: %a.patt: %pattern_type = at_binding_pattern a, %a.param_patt [concrete]
@@ -596,7 +596,7 @@ fn Foo(unused a: const (const C)) {}
// CHECK:STDOUT: }
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type.47530a.1 = fn_decl @Foo.loc7 [concrete = constants.%Foo.9ec12f.1] {
// CHECK:STDOUT: %a.param_patt: %pattern_type = value_param_pattern [concrete]
// CHECK:STDOUT: %a.patt: %pattern_type = at_binding_pattern a, %a.param_patt [concrete]
@@ -651,7 +651,7 @@ fn Foo(unused a: const (const C)) {}
// CHECK:STDOUT: }
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type.47530a.1 = fn_decl @Foo.loc7 [concrete = constants.%Foo.9ec12f.1] {
// CHECK:STDOUT: %a.param_patt: %pattern_type = value_param_pattern [concrete]
// CHECK:STDOUT: %a.patt: %pattern_type = at_binding_pattern a, %a.param_patt [concrete]
@@ -710,7 +710,7 @@ fn Foo(unused a: const (const C)) {}
// CHECK:STDOUT: }
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type.47530a.1 = fn_decl @Foo.loc7 [concrete = constants.%Foo.9ec12f.1] {
// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete]
// CHECK:STDOUT: } {
@@ -788,7 +788,7 @@ fn Foo(unused a: const (const C)) {}
// CHECK:STDOUT: }
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type = fn_decl @Foo [concrete = constants.%Foo] {
// CHECK:STDOUT: %return.param_patt: %pattern_type = out_param_pattern [concrete]
// CHECK:STDOUT: %return.patt: %pattern_type = return_slot_pattern %return.param_patt, %D.ref [concrete]
@@ -888,7 +888,7 @@ fn Foo(unused a: const (const C)) {}
// CHECK:STDOUT: %default.import.loc2_30.1 = import <none>
// CHECK:STDOUT: %default.import.loc2_30.2 = import <none>
// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.C [concrete = constants.%C]
// CHECK:STDOUT: %D: type = alias_binding D, imports.%Main.C [concrete = constants.%C]
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
// CHECK:STDOUT: %Foo.decl: %Foo.type = fn_decl @Foo [concrete = constants.%Foo] {
// CHECK:STDOUT: %a.param_patt: %pattern_type = value_param_pattern [concrete]
// CHECK:STDOUT: %a.patt: %pattern_type = at_binding_pattern a, %a.param_patt [concrete]