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
@@ -288,11 +288,36 @@ fn D() {}
// CHECK:STDOUT: }
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: %default.import = import <invalid>
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %a.patt: %empty_tuple.type = binding_pattern a
// CHECK:STDOUT: %.loc6_1: %empty_tuple.type = var_pattern %a.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %a.var: ref %empty_tuple.type = var a
// 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: %a: ref %empty_tuple.type = bind_name a, %a.var
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %b.patt: %i32 = binding_pattern b
// CHECK:STDOUT: %.loc7_1: %i32 = var_pattern %b.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %b.var: ref %i32 = var b
// CHECK:STDOUT: %.loc7_8: type = splice_block %i32.loc7 [template = constants.%i32] {
// CHECK:STDOUT: %int_32.loc7: Core.IntLiteral = int_value 32 [template = constants.%int_32]
// CHECK:STDOUT: %i32.loc7: type = class_type @Int, @Int(constants.%int_32) [template = constants.%i32]
// CHECK:STDOUT: }
// CHECK:STDOUT: %b: ref %i32 = bind_name b, %b.var
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %c.patt: %struct_type.c = binding_pattern c
// CHECK:STDOUT: %.loc8_1: %struct_type.c = var_pattern %c.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %c.var: ref %struct_type.c = var c
// CHECK:STDOUT: %.loc8_16: type = splice_block %struct_type.c [template = constants.%struct_type.c] {
// CHECK:STDOUT: %int_32.loc8: Core.IntLiteral = int_value 32 [template = constants.%int_32]
// CHECK:STDOUT: %i32.loc8: type = class_type @Int, @Int(constants.%int_32) [template = constants.%i32]
// CHECK:STDOUT: %struct_type.c: type = struct_type {.c: %i32} [template = constants.%struct_type.c]
// CHECK:STDOUT: }
// CHECK:STDOUT: %c: ref %struct_type.c = bind_name c, %c.var
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -243,7 +243,15 @@ private fn Redecl() {}
// CHECK:STDOUT: %Test.import = import Test
// CHECK:STDOUT: %default.import = import <invalid>
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %f.patt: %empty_tuple.type = binding_pattern f
// CHECK:STDOUT: %.loc4_1: %empty_tuple.type = var_pattern %f.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %f.var: ref %empty_tuple.type = var f
// 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: %f: ref %empty_tuple.type = bind_name f, %f.var
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -277,7 +285,15 @@ private fn Redecl() {}
// CHECK:STDOUT: }
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: %default.import = import <invalid>
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %f.patt: %empty_tuple.type = binding_pattern f
// CHECK:STDOUT: %.loc10_1: %empty_tuple.type = var_pattern %f.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %f.var: ref %empty_tuple.type = var f
// CHECK:STDOUT: %.loc10_9.1: type = splice_block %.loc10_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc10_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc10_9.3: type = converted %.loc10_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:
@@ -312,7 +328,15 @@ private fn Redecl() {}
// CHECK:STDOUT: }
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: %Test.import = import Test
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %f.patt: %empty_tuple.type = binding_pattern f
// CHECK:STDOUT: %.loc10_1: %empty_tuple.type = var_pattern %f.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %f.var: ref %empty_tuple.type = var f
// CHECK:STDOUT: %.loc10_9.1: type = splice_block %.loc10_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc10_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc10_9.3: type = converted %.loc10_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:
@@ -349,7 +373,15 @@ private fn Redecl() {}
// CHECK:STDOUT: %Test.import = import Test
// CHECK:STDOUT: %default.import = import <invalid>
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %f.patt: %empty_tuple.type = binding_pattern f
// CHECK:STDOUT: %.loc4_1: %empty_tuple.type = var_pattern %f.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %f.var: ref %empty_tuple.type = var f
// 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: %f: ref %empty_tuple.type = bind_name f, %f.var
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -383,7 +415,15 @@ private fn Redecl() {}
// CHECK:STDOUT: }
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: %default.import = import <invalid>
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %f.patt: %empty_tuple.type = binding_pattern f
// CHECK:STDOUT: %.loc10_1: %empty_tuple.type = var_pattern %f.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %f.var: ref %empty_tuple.type = var f
// CHECK:STDOUT: %.loc10_9.1: type = splice_block %.loc10_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc10_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc10_9.3: type = converted %.loc10_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:
@@ -418,7 +458,15 @@ private fn Redecl() {}
// CHECK:STDOUT: }
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: %Test.import = import Test
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %f.patt: %empty_tuple.type = binding_pattern f
// CHECK:STDOUT: %.loc10_1: %empty_tuple.type = var_pattern %f.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %f.var: ref %empty_tuple.type = var f
// CHECK:STDOUT: %.loc10_9.1: type = splice_block %.loc10_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc10_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc10_9.3: type = converted %.loc10_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:
@@ -455,7 +503,15 @@ private fn Redecl() {}
// CHECK:STDOUT: %Test.import = import Test
// CHECK:STDOUT: %default.import = import <invalid>
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %f.patt: %empty_tuple.type = binding_pattern f
// CHECK:STDOUT: %.loc4_1: %empty_tuple.type = var_pattern %f.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %f.var: ref %empty_tuple.type = var f
// 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: %f: ref %empty_tuple.type = bind_name f, %f.var
// CHECK:STDOUT: %Forward.decl: %Forward.type = fn_decl @Forward [template = constants.%Forward] {} {}
// CHECK:STDOUT: }
@@ -493,7 +549,15 @@ private fn Redecl() {}
// CHECK:STDOUT: }
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: %default.import = import <invalid>
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %f.patt: %empty_tuple.type = binding_pattern f
// CHECK:STDOUT: %.loc10_1: %empty_tuple.type = var_pattern %f.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %f.var: ref %empty_tuple.type = var f
// CHECK:STDOUT: %.loc10_9.1: type = splice_block %.loc10_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc10_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc10_9.3: type = converted %.loc10_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:
@@ -528,7 +592,15 @@ private fn Redecl() {}
// CHECK:STDOUT: }
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: %Test.import = import Test
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %f.patt: %empty_tuple.type = binding_pattern f
// CHECK:STDOUT: %.loc10_1: %empty_tuple.type = var_pattern %f.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %f.var: ref %empty_tuple.type = var f
// CHECK:STDOUT: %.loc10_9.1: type = splice_block %.loc10_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc10_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc10_9.3: type = converted %.loc10_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:
@@ -98,9 +98,25 @@ fn F() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %v.patt: %empty_struct_type = binding_pattern v
// CHECK:STDOUT: %.loc9_11: %empty_struct_type = var_pattern %v.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %v.var: ref %empty_struct_type = var v
// CHECK:STDOUT: %.loc9_19.1: type = splice_block %.loc9_19.3 [template = constants.%empty_struct_type] {
// CHECK:STDOUT: %.loc9_19.2: %empty_struct_type = struct_literal ()
// CHECK:STDOUT: %.loc9_19.3: type = converted %.loc9_19.2, constants.%empty_struct_type [template = constants.%empty_struct_type]
// CHECK:STDOUT: }
// CHECK:STDOUT: %v: ref %empty_struct_type = bind_name v, %v.var
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %w.patt: %empty_struct_type = binding_pattern w
// CHECK:STDOUT: %.loc14_13: %empty_struct_type = var_pattern %w.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %w.var: ref %empty_struct_type = var w
// CHECK:STDOUT: %.loc14_21.1: type = splice_block %.loc14_21.3 [template = constants.%empty_struct_type] {
// CHECK:STDOUT: %.loc14_21.2: %empty_struct_type = struct_literal ()
// CHECK:STDOUT: %.loc14_21.3: type = converted %.loc14_21.2, constants.%empty_struct_type [template = constants.%empty_struct_type]
// CHECK:STDOUT: }
// CHECK:STDOUT: %w: ref %empty_struct_type = bind_name w, %w.var
// CHECK:STDOUT: return
// CHECK:STDOUT: }