Model var as a pattern operator (#4720)

Co-authored-by: Richard Smith <richard@metafoo.co.uk>
This commit is contained in:
Geoff Romer
2025-01-17 17:51:34 +00:00
committed by GitHub
co-authored by Richard Smith
parent 6572da7314
commit 13434f0e8a
510 changed files with 11819 additions and 3352 deletions
@@ -93,7 +93,15 @@ var f: () = F();
// CHECK:STDOUT: .f = %f
// CHECK:STDOUT: }
// CHECK:STDOUT: %default.import = import <invalid>
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %f.patt: %empty_tuple.type = binding_pattern f
// CHECK:STDOUT: %.loc6_1: %empty_tuple.type = var_pattern %f.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %f.var: ref %empty_tuple.type = var f
// CHECK:STDOUT: %.loc6_9.1: type = splice_block %.loc6_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc6_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc6_9.3: type = converted %.loc6_9.2, constants.%empty_tuple.type [template = constants.%empty_tuple.type]
// CHECK:STDOUT: }
// CHECK:STDOUT: %f: ref %empty_tuple.type = bind_name f, %f.var
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -115,7 +115,15 @@ extern library "basic" fn F();
// CHECK:STDOUT: .x = %x
// CHECK:STDOUT: }
// CHECK:STDOUT: %default.import = import <invalid>
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %x.patt: %empty_tuple.type = binding_pattern x
// CHECK:STDOUT: %.loc4_1: %empty_tuple.type = var_pattern %x.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %x.var: ref %empty_tuple.type = var x
// CHECK:STDOUT: %.loc4_9.1: type = splice_block %.loc4_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc4_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc4_9.3: type = converted %.loc4_9.2, constants.%empty_tuple.type [template = constants.%empty_tuple.type]
// CHECK:STDOUT: }
// CHECK:STDOUT: %x: ref %empty_tuple.type = bind_name x, %x.var
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -103,6 +103,7 @@ fn A {
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [template]
// CHECK:STDOUT: %x: %empty_tuple.type = bind_symbolic_name x [symbolic]
// CHECK:STDOUT: %x.patt: %empty_tuple.type = symbolic_binding_pattern x [symbolic]
// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [template]
// CHECK:STDOUT: %A.type: type = fn_type @A [template]
// CHECK:STDOUT: %A: %A.type = struct_value () [template]
@@ -113,8 +114,16 @@ fn A {
// CHECK:STDOUT: .x = %x
// CHECK:STDOUT: .A = %A.decl
// CHECK:STDOUT: }
// CHECK:STDOUT: %x.var: ref %empty_tuple.type = var x
// CHECK:STDOUT: %x: %empty_tuple.type = bind_symbolic_name x, %x.var [symbolic = constants.%x]
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %x.patt: %empty_tuple.type = symbolic_binding_pattern x [symbolic = constants.%x.patt]
// CHECK:STDOUT: %.loc8_1: %empty_tuple.type = var_pattern %x.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %.var: ref %empty_tuple.type = var <invalid>
// CHECK:STDOUT: %.loc8_10.1: type = splice_block %.loc8_10.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc8_10.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc8_10.3: type = converted %.loc8_10.2, constants.%empty_tuple.type [template = constants.%empty_tuple.type]
// CHECK:STDOUT: }
// CHECK:STDOUT: %x: %empty_tuple.type = bind_symbolic_name x, %.var [symbolic = constants.%x]
// CHECK:STDOUT: %A.decl: %A.type = fn_decl @A [template = constants.%A] {} {}
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -128,9 +137,9 @@ fn A {
// CHECK:STDOUT: fn @__global_init() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %.loc8_15.1: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc8_15.2: init %empty_tuple.type = tuple_init () to file.%x.var [template = constants.%empty_tuple]
// CHECK:STDOUT: %.loc8_16: init %empty_tuple.type = converted %.loc8_15.1, %.loc8_15.2 [template = constants.%empty_tuple]
// CHECK:STDOUT: assign file.%x.var, %.loc8_16
// CHECK:STDOUT: %.loc8_15.2: init %empty_tuple.type = tuple_init () to file.%.var [template = constants.%empty_tuple]
// CHECK:STDOUT: %.loc8_1: init %empty_tuple.type = converted %.loc8_15.1, %.loc8_15.2 [template = constants.%empty_tuple]
// CHECK:STDOUT: assign file.%.var, %.loc8_1
// CHECK:STDOUT: return
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -606,7 +606,11 @@ fn F() {
// CHECK:STDOUT: %x: %C1 = bind_name x, %x.param
// CHECK:STDOUT: }
// CHECK:STDOUT: %C2.decl: type = class_decl @C2 [template = constants.%C2] {} {}
// CHECK:STDOUT: %.loc18: %D.elem = field_decl C1, element0 [template]
// CHECK:STDOUT: %.loc18_9: %D.elem = field_decl C1, element0 [template]
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %.loc18_3: %D.elem = var_pattern %.loc18_9
// CHECK:STDOUT: }
// CHECK:STDOUT: %.var: ref %D.elem = var <invalid>
// CHECK:STDOUT: %complete_type: <witness> = complete_type_witness %struct_type.C1 [template = constants.%complete_type.ec1]
// CHECK:STDOUT: complete_type_witness = %complete_type
// CHECK:STDOUT: }
@@ -1170,7 +1174,11 @@ fn F() {
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: class @B {
// CHECK:STDOUT: %.loc9: %B.elem = field_decl v, element0 [template]
// CHECK:STDOUT: %.loc9_10: %B.elem = field_decl v, element0 [template]
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %.loc9_5: %B.elem = var_pattern %.loc9_10
// CHECK:STDOUT: }
// CHECK:STDOUT: %.var: ref %B.elem = var <invalid>
// CHECK:STDOUT: %.decl: type = class_decl @.1 [template = constants.%.96d] {} {}
// CHECK:STDOUT: %complete_type: <witness> = complete_type_witness %struct_type.v [template = constants.%complete_type.57e]
// CHECK:STDOUT: complete_type_witness = %complete_type