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
@@ -506,15 +506,56 @@ import library "extern_api";
// 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: name_binding_decl {
// CHECK:STDOUT: %d.patt: %empty_tuple.type = binding_pattern d
// CHECK:STDOUT: %.loc9_1: %empty_tuple.type = var_pattern %d.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %d.var: ref %empty_tuple.type = var d
// CHECK:STDOUT: %.loc9_9.1: type = splice_block %.loc9_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc9_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc9_9.3: type = converted %.loc9_9.2, constants.%empty_tuple.type [template = constants.%empty_tuple.type]
// CHECK:STDOUT: }
// CHECK:STDOUT: %d: ref %empty_tuple.type = bind_name d, %d.var
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %e.patt: %empty_tuple.type = binding_pattern e
// CHECK:STDOUT: %.loc10_1: %empty_tuple.type = var_pattern %e.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %e.var: ref %empty_tuple.type = var e
// 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: %e: ref %empty_tuple.type = bind_name e, %e.var
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -656,15 +697,56 @@ import library "extern_api";
// CHECK:STDOUT: }
// CHECK:STDOUT: %D.decl: %D.type = fn_decl @D [template = constants.%D] {} {}
// CHECK:STDOUT: %E.decl: %E.type = fn_decl @E [template = constants.%E] {} {}
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %a.patt: %empty_tuple.type = binding_pattern a
// CHECK:STDOUT: %.loc52_1: %empty_tuple.type = var_pattern %a.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %a.var: ref %empty_tuple.type = var a
// CHECK:STDOUT: %.loc52_9.1: type = splice_block %.loc52_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc52_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc52_9.3: type = converted %.loc52_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: %.loc53_1: %i32 = var_pattern %b.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %b.var: ref %i32 = var b
// CHECK:STDOUT: %.loc53_8: type = splice_block %i32.loc53 [template = constants.%i32] {
// CHECK:STDOUT: %int_32.loc53: Core.IntLiteral = int_value 32 [template = constants.%int_32]
// CHECK:STDOUT: %i32.loc53: 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: %.loc54_1: %struct_type.c = var_pattern %c.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %c.var: ref %struct_type.c = var c
// CHECK:STDOUT: %.loc54_16: type = splice_block %struct_type.c [template = constants.%struct_type.c] {
// CHECK:STDOUT: %int_32.loc54: Core.IntLiteral = int_value 32 [template = constants.%int_32]
// CHECK:STDOUT: %i32.loc54: 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: name_binding_decl {
// CHECK:STDOUT: %d.patt: %empty_tuple.type = binding_pattern d
// CHECK:STDOUT: %.loc55_1: %empty_tuple.type = var_pattern %d.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %d.var: ref %empty_tuple.type = var d
// CHECK:STDOUT: %.loc55_9.1: type = splice_block %.loc55_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc55_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc55_9.3: type = converted %.loc55_9.2, constants.%empty_tuple.type [template = constants.%empty_tuple.type]
// CHECK:STDOUT: }
// CHECK:STDOUT: %d: ref %empty_tuple.type = bind_name d, %d.var
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %e.patt: %empty_tuple.type = binding_pattern e
// CHECK:STDOUT: %.loc56_1: %empty_tuple.type = var_pattern %e.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %e.var: ref %empty_tuple.type = var e
// CHECK:STDOUT: %.loc56_9.1: type = splice_block %.loc56_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc56_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc56_9.3: type = converted %.loc56_9.2, constants.%empty_tuple.type [template = constants.%empty_tuple.type]
// CHECK:STDOUT: }
// CHECK:STDOUT: %e: ref %empty_tuple.type = bind_name e, %e.var
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -806,15 +888,56 @@ import library "extern_api";
// CHECK:STDOUT: }
// CHECK:STDOUT: %D.decl: %D.type = fn_decl @D [template = constants.%D] {} {}
// CHECK:STDOUT: %E.decl: %E.type = fn_decl @E [template = constants.%E] {} {}
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %a.patt: %empty_tuple.type = binding_pattern a
// CHECK:STDOUT: %.loc12_1: %empty_tuple.type = var_pattern %a.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %a.var: ref %empty_tuple.type = var a
// CHECK:STDOUT: %.loc12_9.1: type = splice_block %.loc12_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc12_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc12_9.3: type = converted %.loc12_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: %.loc13_1: %i32 = var_pattern %b.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %b.var: ref %i32 = var b
// CHECK:STDOUT: %.loc13_8: type = splice_block %i32.loc13 [template = constants.%i32] {
// CHECK:STDOUT: %int_32.loc13: Core.IntLiteral = int_value 32 [template = constants.%int_32]
// CHECK:STDOUT: %i32.loc13: 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: %.loc14_1: %struct_type.c = var_pattern %c.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %c.var: ref %struct_type.c = var c
// CHECK:STDOUT: %.loc14_16: type = splice_block %struct_type.c [template = constants.%struct_type.c] {
// CHECK:STDOUT: %int_32.loc14: Core.IntLiteral = int_value 32 [template = constants.%int_32]
// CHECK:STDOUT: %i32.loc14: 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: name_binding_decl {
// CHECK:STDOUT: %d.patt: %empty_tuple.type = binding_pattern d
// CHECK:STDOUT: %.loc15_1: %empty_tuple.type = var_pattern %d.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %d.var: ref %empty_tuple.type = var d
// CHECK:STDOUT: %.loc15_9.1: type = splice_block %.loc15_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc15_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc15_9.3: type = converted %.loc15_9.2, constants.%empty_tuple.type [template = constants.%empty_tuple.type]
// CHECK:STDOUT: }
// CHECK:STDOUT: %d: ref %empty_tuple.type = bind_name d, %d.var
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %e.patt: %empty_tuple.type = binding_pattern e
// CHECK:STDOUT: %.loc16_1: %empty_tuple.type = var_pattern %e.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %e.var: ref %empty_tuple.type = var e
// CHECK:STDOUT: %.loc16_9.1: type = splice_block %.loc16_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc16_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc16_9.3: type = converted %.loc16_9.2, constants.%empty_tuple.type [template = constants.%empty_tuple.type]
// CHECK:STDOUT: }
// CHECK:STDOUT: %e: ref %empty_tuple.type = bind_name e, %e.var
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -930,15 +1053,56 @@ import library "extern_api";
// 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: %.loc52_1: %empty_tuple.type = var_pattern %a.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %a.var: ref %empty_tuple.type = var a
// CHECK:STDOUT: %.loc52_9.1: type = splice_block %.loc52_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc52_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc52_9.3: type = converted %.loc52_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: %.loc53_1: %i32 = var_pattern %b.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %b.var: ref %i32 = var b
// CHECK:STDOUT: %.loc53_8: type = splice_block %i32.loc53 [template = constants.%i32] {
// CHECK:STDOUT: %int_32.loc53: Core.IntLiteral = int_value 32 [template = constants.%int_32]
// CHECK:STDOUT: %i32.loc53: 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: %.loc54_1: %struct_type.c = var_pattern %c.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %c.var: ref %struct_type.c = var c
// CHECK:STDOUT: %.loc54_16: type = splice_block %struct_type.c [template = constants.%struct_type.c] {
// CHECK:STDOUT: %int_32.loc54: Core.IntLiteral = int_value 32 [template = constants.%int_32]
// CHECK:STDOUT: %i32.loc54: 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: name_binding_decl {
// CHECK:STDOUT: %d.patt: %empty_tuple.type = binding_pattern d
// CHECK:STDOUT: %.loc55_1: %empty_tuple.type = var_pattern %d.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %d.var: ref %empty_tuple.type = var d
// CHECK:STDOUT: %.loc55_9.1: type = splice_block %.loc55_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc55_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc55_9.3: type = converted %.loc55_9.2, constants.%empty_tuple.type [template = constants.%empty_tuple.type]
// CHECK:STDOUT: }
// CHECK:STDOUT: %d: ref %empty_tuple.type = bind_name d, %d.var
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %e.patt: %empty_tuple.type = binding_pattern e
// CHECK:STDOUT: %.loc56_1: %empty_tuple.type = var_pattern %e.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %e.var: ref %empty_tuple.type = var e
// CHECK:STDOUT: %.loc56_9.1: type = splice_block %.loc56_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc56_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc56_9.3: type = converted %.loc56_9.2, constants.%empty_tuple.type [template = constants.%empty_tuple.type]
// CHECK:STDOUT: }
// CHECK:STDOUT: %e: ref %empty_tuple.type = bind_name e, %e.var
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -1054,15 +1218,56 @@ import library "extern_api";
// 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: %.loc52_1: %empty_tuple.type = var_pattern %a.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %a.var: ref %empty_tuple.type = var a
// CHECK:STDOUT: %.loc52_9.1: type = splice_block %.loc52_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc52_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc52_9.3: type = converted %.loc52_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: %.loc53_1: %i32 = var_pattern %b.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %b.var: ref %i32 = var b
// CHECK:STDOUT: %.loc53_8: type = splice_block %i32.loc53 [template = constants.%i32] {
// CHECK:STDOUT: %int_32.loc53: Core.IntLiteral = int_value 32 [template = constants.%int_32]
// CHECK:STDOUT: %i32.loc53: 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: %.loc54_1: %struct_type.c = var_pattern %c.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %c.var: ref %struct_type.c = var c
// CHECK:STDOUT: %.loc54_16: type = splice_block %struct_type.c [template = constants.%struct_type.c] {
// CHECK:STDOUT: %int_32.loc54: Core.IntLiteral = int_value 32 [template = constants.%int_32]
// CHECK:STDOUT: %i32.loc54: 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: name_binding_decl {
// CHECK:STDOUT: %d.patt: %empty_tuple.type = binding_pattern d
// CHECK:STDOUT: %.loc55_1: %empty_tuple.type = var_pattern %d.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %d.var: ref %empty_tuple.type = var d
// CHECK:STDOUT: %.loc55_9.1: type = splice_block %.loc55_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc55_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc55_9.3: type = converted %.loc55_9.2, constants.%empty_tuple.type [template = constants.%empty_tuple.type]
// CHECK:STDOUT: }
// CHECK:STDOUT: %d: ref %empty_tuple.type = bind_name d, %d.var
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %e.patt: %empty_tuple.type = binding_pattern e
// CHECK:STDOUT: %.loc56_1: %empty_tuple.type = var_pattern %e.patt
// CHECK:STDOUT: }
// CHECK:STDOUT: %e.var: ref %empty_tuple.type = var e
// CHECK:STDOUT: %.loc56_9.1: type = splice_block %.loc56_9.3 [template = constants.%empty_tuple.type] {
// CHECK:STDOUT: %.loc56_9.2: %empty_tuple.type = tuple_literal ()
// CHECK:STDOUT: %.loc56_9.3: type = converted %.loc56_9.2, constants.%empty_tuple.type [template = constants.%empty_tuple.type]
// CHECK:STDOUT: }
// CHECK:STDOUT: %e: ref %empty_tuple.type = bind_name e, %e.var
// CHECK:STDOUT: }
// CHECK:STDOUT: