Implement thunking in terms of constant evaluation (#7332)

The bulk of this change is changing most pattern insts to be `Always`
rather than `AlwaysUnique` constants, so that they can be wrapped in
`SpecificConstant`s to perform substitution. That then lets thunking
rely much more on `SpecificConstant` wrappers instead of deep-copying
the inst tree with modified types.

This approach to thunking should scale better, particularly as things
like form generics make function signatures more complex, because we can
leverage the existing support for constant evaluation and substitution.
Unfortunately, applying this approach to binding patterns will require
more work; see the TODO near the top of `thunk.cpp` for details.

---------

Co-authored-by: Richard Smith <richard@metafoo.co.uk>
This commit is contained in:
Geoff Romer
2026-06-13 00:22:00 +00:00
committed by GitHub
co-authored by Richard Smith
parent 40d2d8f68c
commit e023f75254
589 changed files with 22583 additions and 11517 deletions
+8 -4
View File
@@ -28,9 +28,13 @@ fn F() -> i32 {
// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete]
// CHECK:STDOUT: %.795: Core.Form = init_form %i32 [concrete]
// CHECK:STDOUT: %pattern_type.6b6: type = pattern_type %i32 [concrete]
// CHECK:STDOUT: %return.param_patt.a9a: %pattern_type.6b6 = out_param_pattern [concrete]
// CHECK:STDOUT: %return.patt.e1b: %pattern_type.6b6 = return_slot_pattern %return.param_patt.a9a, %i32 [concrete]
// CHECK:STDOUT: %F.type: type = fn_type @F [concrete]
// CHECK:STDOUT: %F: %F.type = struct_value () [concrete]
// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete]
// CHECK:STDOUT: %n.patt: %pattern_type.6b6 = ref_binding_pattern n [concrete]
// CHECK:STDOUT: %n.var_patt: %pattern_type.6b6 = var_pattern %n.patt [concrete]
// CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete]
// CHECK:STDOUT: %ImplicitAs.type.0ff: type = generic_interface_type @ImplicitAs [concrete]
// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.0ff = struct_value () [concrete]
@@ -90,8 +94,8 @@ fn F() -> i32 {
// CHECK:STDOUT: }
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {
// CHECK:STDOUT: %return.param_patt: %pattern_type.6b6 = out_param_pattern [concrete]
// CHECK:STDOUT: %return.patt: %pattern_type.6b6 = return_slot_pattern %return.param_patt, %i32.loc15 [concrete]
// CHECK:STDOUT: %return.param_patt: %pattern_type.6b6 = out_param_pattern [concrete = constants.%return.param_patt.a9a]
// CHECK:STDOUT: %return.patt: %pattern_type.6b6 = return_slot_pattern %return.param_patt, %i32.loc15 [concrete = constants.%return.patt.e1b]
// CHECK:STDOUT: } {
// CHECK:STDOUT: %i32.loc15: type = type_literal constants.%i32 [concrete = constants.%i32]
// CHECK:STDOUT: %.loc15: Core.Form = init_form %i32.loc15 [concrete = constants.%.795]
@@ -103,8 +107,8 @@ fn F() -> i32 {
// CHECK:STDOUT: fn @F() -> out %return.param: %i32 {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %n.patt: %pattern_type.6b6 = ref_binding_pattern n [concrete]
// CHECK:STDOUT: %n.var_patt: %pattern_type.6b6 = var_pattern %n.patt [concrete]
// CHECK:STDOUT: %n.patt: %pattern_type.6b6 = ref_binding_pattern n [concrete = constants.%n.patt]
// CHECK:STDOUT: %n.var_patt: %pattern_type.6b6 = var_pattern %n.patt [concrete = constants.%n.var_patt]
// CHECK:STDOUT: }
// CHECK:STDOUT: %n.var: ref %i32 = var %n.var_patt
// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6]
+28 -14
View File
@@ -38,6 +38,8 @@ fn F() {
// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete]
// CHECK:STDOUT: %ptr.939: type = ptr_type %struct_type.a.b.b4c [concrete]
// CHECK:STDOUT: %pattern_type.20e3: type = pattern_type %struct_type.a.b.b4c [concrete]
// CHECK:STDOUT: %s.patt: %pattern_type.20e3 = ref_binding_pattern s [concrete]
// CHECK:STDOUT: %s.var_patt: %pattern_type.20e3 = var_pattern %s.patt [concrete]
// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete]
// CHECK:STDOUT: %int_2.ecc: Core.IntLiteral = int_value 2 [concrete]
// CHECK:STDOUT: %struct_type.a.b.cfd: type = struct_type {.a: Core.IntLiteral, .b: Core.IntLiteral} [concrete]
@@ -63,6 +65,8 @@ fn F() {
// CHECK:STDOUT: %int_2.295: %i32 = int_value 2 [concrete]
// CHECK:STDOUT: %struct.631: %struct_type.a.b.b4c = struct_value (%int_1.0c6, %int_2.295) [concrete]
// CHECK:STDOUT: %pattern_type.88d: type = pattern_type %ptr.939 [concrete]
// CHECK:STDOUT: %p.patt: %pattern_type.88d = ref_binding_pattern p [concrete]
// CHECK:STDOUT: %p.var_patt: %pattern_type.88d = var_pattern %p.patt [concrete]
// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete]
// CHECK:STDOUT: %T.67d: type = symbolic_binding T, 0 [symbolic]
// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.ff5: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.67d) [symbolic]
@@ -76,6 +80,8 @@ fn F() {
// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn.867: <specific function> = specific_function %ptr.as.Copy.impl.Op.287, @ptr.as.Copy.impl.Op(%struct_type.a.b.b4c) [concrete]
// CHECK:STDOUT: %ptr.d08: type = ptr_type %i32 [concrete]
// CHECK:STDOUT: %pattern_type.f00: type = pattern_type %ptr.d08 [concrete]
// CHECK:STDOUT: %q.patt: %pattern_type.f00 = ref_binding_pattern q [concrete]
// CHECK:STDOUT: %q.var_patt: %pattern_type.f00 = var_pattern %q.patt [concrete]
// CHECK:STDOUT: %Copy.impl_witness.ce1: <witness> = impl_witness imports.%Copy.impl_witness_table.4f1, @ptr.as.Copy.impl(%i32) [concrete]
// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.c1c: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%i32) [concrete]
// CHECK:STDOUT: %ptr.as.Copy.impl.Op.d1c: %ptr.as.Copy.impl.Op.type.c1c = struct_value () [concrete]
@@ -83,14 +89,22 @@ fn F() {
// CHECK:STDOUT: %Copy.WithSelf.Op.type.f9d: type = fn_type @Copy.WithSelf.Op, @Copy.WithSelf(%Copy.facet.b49) [concrete]
// CHECK:STDOUT: %.ac9: type = fn_type_with_self_type %Copy.WithSelf.Op.type.f9d, %Copy.facet.b49 [concrete]
// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn.b3e: <specific function> = specific_function %ptr.as.Copy.impl.Op.d1c, @ptr.as.Copy.impl.Op(%i32) [concrete]
// CHECK:STDOUT: %r.patt: %pattern_type.f00 = ref_binding_pattern r [concrete]
// CHECK:STDOUT: %r.var_patt: %pattern_type.f00 = var_pattern %r.patt [concrete]
// CHECK:STDOUT: %tuple.type.24b: type = tuple_type (type, type) [concrete]
// CHECK:STDOUT: %tuple.b59: %tuple.type.24b = tuple_value (%i32, %i32) [concrete]
// CHECK:STDOUT: %tuple.type.e55: type = tuple_type (%i32, %i32) [concrete]
// CHECK:STDOUT: %pattern_type.394: type = pattern_type %tuple.type.e55 [concrete]
// CHECK:STDOUT: %t.patt: %pattern_type.394 = ref_binding_pattern t [concrete]
// CHECK:STDOUT: %t.var_patt: %pattern_type.394 = var_pattern %t.patt [concrete]
// CHECK:STDOUT: %tuple.type.f94: type = tuple_type (Core.IntLiteral, Core.IntLiteral) [concrete]
// CHECK:STDOUT: %tuple.ad8: %tuple.type.f94 = tuple_value (%int_1.5b8, %int_2.ecc) [concrete]
// CHECK:STDOUT: %tuple.102: %tuple.type.e55 = tuple_value (%int_1.0c6, %int_2.295) [concrete]
// CHECK:STDOUT: %t0.patt: %pattern_type.f00 = ref_binding_pattern t0 [concrete]
// CHECK:STDOUT: %t0.var_patt: %pattern_type.f00 = var_pattern %t0.patt [concrete]
// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete]
// CHECK:STDOUT: %t1.patt: %pattern_type.f00 = ref_binding_pattern t1 [concrete]
// CHECK:STDOUT: %t1.var_patt: %pattern_type.f00 = var_pattern %t1.patt [concrete]
// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete]
// CHECK:STDOUT: %Destroy.Op.type.1d8f74.1: type = fn_type @Destroy.Op.loc24 [concrete]
// CHECK:STDOUT: %Destroy.Op.1a2547.1: %Destroy.Op.type.1d8f74.1 = struct_value () [concrete]
@@ -133,8 +147,8 @@ fn F() {
// CHECK:STDOUT: fn @F() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %s.patt: %pattern_type.20e3 = ref_binding_pattern s [concrete]
// CHECK:STDOUT: %s.var_patt: %pattern_type.20e3 = var_pattern %s.patt [concrete]
// CHECK:STDOUT: %s.patt: %pattern_type.20e3 = ref_binding_pattern s [concrete = constants.%s.patt]
// CHECK:STDOUT: %s.var_patt: %pattern_type.20e3 = var_pattern %s.patt [concrete = constants.%s.var_patt]
// CHECK:STDOUT: }
// CHECK:STDOUT: %s.var: ref %struct_type.a.b.b4c = var %s.var_patt
// CHECK:STDOUT: %int_1.loc16: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8]
@@ -166,8 +180,8 @@ fn F() {
// CHECK:STDOUT: }
// CHECK:STDOUT: %s: ref %struct_type.a.b.b4c = ref_binding s, %s.var
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %p.patt: %pattern_type.88d = ref_binding_pattern p [concrete]
// CHECK:STDOUT: %p.var_patt: %pattern_type.88d = var_pattern %p.patt [concrete]
// CHECK:STDOUT: %p.patt: %pattern_type.88d = ref_binding_pattern p [concrete = constants.%p.patt]
// CHECK:STDOUT: %p.var_patt: %pattern_type.88d = var_pattern %p.patt [concrete = constants.%p.var_patt]
// CHECK:STDOUT: }
// CHECK:STDOUT: %p.var: ref %ptr.939 = var %p.var_patt
// CHECK:STDOUT: %s.ref.loc18: ref %struct_type.a.b.b4c = name_ref s, %s
@@ -186,8 +200,8 @@ fn F() {
// CHECK:STDOUT: }
// CHECK:STDOUT: %p: ref %ptr.939 = ref_binding p, %p.var
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %q.patt: %pattern_type.f00 = ref_binding_pattern q [concrete]
// CHECK:STDOUT: %q.var_patt: %pattern_type.f00 = var_pattern %q.patt [concrete]
// CHECK:STDOUT: %q.patt: %pattern_type.f00 = ref_binding_pattern q [concrete = constants.%q.patt]
// CHECK:STDOUT: %q.var_patt: %pattern_type.f00 = var_pattern %q.patt [concrete = constants.%q.var_patt]
// CHECK:STDOUT: }
// CHECK:STDOUT: %q.var: ref %ptr.d08 = var %q.var_patt
// CHECK:STDOUT: %s.ref.loc19: ref %struct_type.a.b.b4c = name_ref s, %s
@@ -205,8 +219,8 @@ fn F() {
// CHECK:STDOUT: }
// CHECK:STDOUT: %q: ref %ptr.d08 = ref_binding q, %q.var
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %r.patt: %pattern_type.f00 = ref_binding_pattern r [concrete]
// CHECK:STDOUT: %r.var_patt: %pattern_type.f00 = var_pattern %r.patt [concrete]
// CHECK:STDOUT: %r.patt: %pattern_type.f00 = ref_binding_pattern r [concrete = constants.%r.patt]
// CHECK:STDOUT: %r.var_patt: %pattern_type.f00 = var_pattern %r.patt [concrete = constants.%r.var_patt]
// CHECK:STDOUT: }
// CHECK:STDOUT: %r.var: ref %ptr.d08 = var %r.var_patt
// CHECK:STDOUT: %s.ref.loc20: ref %struct_type.a.b.b4c = name_ref s, %s
@@ -224,8 +238,8 @@ fn F() {
// CHECK:STDOUT: }
// CHECK:STDOUT: %r: ref %ptr.d08 = ref_binding r, %r.var
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %t.patt: %pattern_type.394 = ref_binding_pattern t [concrete]
// CHECK:STDOUT: %t.var_patt: %pattern_type.394 = var_pattern %t.patt [concrete]
// CHECK:STDOUT: %t.patt: %pattern_type.394 = ref_binding_pattern t [concrete = constants.%t.patt]
// CHECK:STDOUT: %t.var_patt: %pattern_type.394 = var_pattern %t.patt [concrete = constants.%t.var_patt]
// CHECK:STDOUT: }
// CHECK:STDOUT: %t.var: ref %tuple.type.e55 = var %t.var_patt
// CHECK:STDOUT: %int_1.loc22: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8]
@@ -258,8 +272,8 @@ fn F() {
// CHECK:STDOUT: }
// CHECK:STDOUT: %t: ref %tuple.type.e55 = ref_binding t, %t.var
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %t0.patt: %pattern_type.f00 = ref_binding_pattern t0 [concrete]
// CHECK:STDOUT: %t0.var_patt: %pattern_type.f00 = var_pattern %t0.patt [concrete]
// CHECK:STDOUT: %t0.patt: %pattern_type.f00 = ref_binding_pattern t0 [concrete = constants.%t0.patt]
// CHECK:STDOUT: %t0.var_patt: %pattern_type.f00 = var_pattern %t0.patt [concrete = constants.%t0.var_patt]
// CHECK:STDOUT: }
// CHECK:STDOUT: %t0.var: ref %ptr.d08 = var %t0.var_patt
// CHECK:STDOUT: %t.ref.loc23: ref %tuple.type.e55 = name_ref t, %t
@@ -278,8 +292,8 @@ fn F() {
// CHECK:STDOUT: }
// CHECK:STDOUT: %t0: ref %ptr.d08 = ref_binding t0, %t0.var
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %t1.patt: %pattern_type.f00 = ref_binding_pattern t1 [concrete]
// CHECK:STDOUT: %t1.var_patt: %pattern_type.f00 = var_pattern %t1.patt [concrete]
// CHECK:STDOUT: %t1.patt: %pattern_type.f00 = ref_binding_pattern t1 [concrete = constants.%t1.patt]
// CHECK:STDOUT: %t1.var_patt: %pattern_type.f00 = var_pattern %t1.patt [concrete = constants.%t1.var_patt]
// CHECK:STDOUT: }
// CHECK:STDOUT: %t1.var: ref %ptr.d08 = var %t1.var_patt
// CHECK:STDOUT: %t.ref.loc24: ref %tuple.type.e55 = name_ref t, %t
+8 -4
View File
@@ -32,6 +32,8 @@ fn Foo(ptr: C*) {
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %C: type = class_type @C [concrete]
// CHECK:STDOUT: %pattern_type.98b: type = pattern_type %C [concrete]
// CHECK:STDOUT: %self.param_patt: %pattern_type.98b = value_param_pattern [concrete]
// CHECK:STDOUT: %self.patt: %pattern_type.98b = at_binding_pattern self, %self.param_patt [concrete]
// CHECK:STDOUT: %C.Member.type: type = fn_type @C.Member [concrete]
// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete]
// CHECK:STDOUT: %C.Member: %C.Member.type = struct_value () [concrete]
@@ -40,6 +42,8 @@ fn Foo(ptr: C*) {
// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %ptr.6b6 [concrete]
// CHECK:STDOUT: %struct_type.field: type = struct_type {.field: %ptr.6b6} [concrete]
// CHECK:STDOUT: %complete_type: <witness> = complete_type_witness %struct_type.field [concrete]
// CHECK:STDOUT: %ptr.param_patt: %pattern_type.fcb = value_param_pattern [concrete]
// CHECK:STDOUT: %ptr.patt: %pattern_type.fcb = at_binding_pattern ptr, %ptr.param_patt [concrete]
// CHECK:STDOUT: %Foo.type: type = fn_type @Foo [concrete]
// CHECK:STDOUT: %Foo: %Foo.type = struct_value () [concrete]
// CHECK:STDOUT: }
@@ -60,8 +64,8 @@ fn Foo(ptr: C*) {
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
// CHECK:STDOUT: %Foo.decl: %Foo.type = fn_decl @Foo [concrete = constants.%Foo] {
// CHECK:STDOUT: %ptr.param_patt: %pattern_type.fcb = value_param_pattern [concrete]
// CHECK:STDOUT: %ptr.patt: %pattern_type.fcb = at_binding_pattern ptr, %ptr.param_patt [concrete]
// CHECK:STDOUT: %ptr.param_patt: %pattern_type.fcb = value_param_pattern [concrete = constants.%ptr.param_patt]
// CHECK:STDOUT: %ptr.patt: %pattern_type.fcb = at_binding_pattern ptr, %ptr.param_patt [concrete = constants.%ptr.patt]
// CHECK:STDOUT: } {
// CHECK:STDOUT: %ptr.param: %ptr.6b6 = value_param call_param0
// CHECK:STDOUT: %.loc20: type = splice_block %ptr.loc20_14 [concrete = constants.%ptr.6b6] {
@@ -74,8 +78,8 @@ fn Foo(ptr: C*) {
// CHECK:STDOUT:
// CHECK:STDOUT: class @C {
// CHECK:STDOUT: %C.Member.decl: %C.Member.type = fn_decl @C.Member [concrete = constants.%C.Member] {
// CHECK:STDOUT: %self.param_patt: %pattern_type.98b = value_param_pattern [concrete]
// CHECK:STDOUT: %self.patt: %pattern_type.98b = at_binding_pattern self, %self.param_patt [concrete]
// CHECK:STDOUT: %self.param_patt: %pattern_type.98b = value_param_pattern [concrete = constants.%self.param_patt]
// CHECK:STDOUT: %self.patt: %pattern_type.98b = at_binding_pattern self, %self.param_patt [concrete = constants.%self.patt]
// CHECK:STDOUT: } {
// CHECK:STDOUT: %self.param: %C = value_param call_param0
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C]
+12 -6
View File
@@ -30,9 +30,13 @@ fn F() -> i32 {
// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete]
// CHECK:STDOUT: %.795: Core.Form = init_form %i32 [concrete]
// CHECK:STDOUT: %pattern_type.6b6: type = pattern_type %i32 [concrete]
// CHECK:STDOUT: %return.param_patt.a9a: %pattern_type.6b6 = out_param_pattern [concrete]
// CHECK:STDOUT: %return.patt.e1b: %pattern_type.6b6 = return_slot_pattern %return.param_patt.a9a, %i32 [concrete]
// CHECK:STDOUT: %F.type: type = fn_type @F [concrete]
// CHECK:STDOUT: %F: %F.type = struct_value () [concrete]
// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete]
// CHECK:STDOUT: %n.patt: %pattern_type.6b6 = ref_binding_pattern n [concrete]
// CHECK:STDOUT: %n.var_patt: %pattern_type.6b6 = var_pattern %n.patt [concrete]
// CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete]
// CHECK:STDOUT: %ImplicitAs.type.0ff: type = generic_interface_type @ImplicitAs [concrete]
// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.0ff = struct_value () [concrete]
@@ -52,6 +56,8 @@ fn F() -> i32 {
// CHECK:STDOUT: %int_0.3c0: %i32 = int_value 0 [concrete]
// CHECK:STDOUT: %ptr.d08: type = ptr_type %i32 [concrete]
// CHECK:STDOUT: %pattern_type.f00: type = pattern_type %ptr.d08 [concrete]
// CHECK:STDOUT: %p.patt: %pattern_type.f00 = ref_binding_pattern p [concrete]
// CHECK:STDOUT: %p.var_patt: %pattern_type.f00 = var_pattern %p.patt [concrete]
// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete]
// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.ac8: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic]
// CHECK:STDOUT: %Int.as.Copy.impl.Op.5e0: %Int.as.Copy.impl.Op.type.ac8 = struct_value () [symbolic]
@@ -107,8 +113,8 @@ fn F() -> i32 {
// CHECK:STDOUT: }
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {
// CHECK:STDOUT: %return.param_patt: %pattern_type.6b6 = out_param_pattern [concrete]
// CHECK:STDOUT: %return.patt: %pattern_type.6b6 = return_slot_pattern %return.param_patt, %i32.loc15 [concrete]
// CHECK:STDOUT: %return.param_patt: %pattern_type.6b6 = out_param_pattern [concrete = constants.%return.param_patt.a9a]
// CHECK:STDOUT: %return.patt: %pattern_type.6b6 = return_slot_pattern %return.param_patt, %i32.loc15 [concrete = constants.%return.patt.e1b]
// CHECK:STDOUT: } {
// CHECK:STDOUT: %i32.loc15: type = type_literal constants.%i32 [concrete = constants.%i32]
// CHECK:STDOUT: %.loc15: Core.Form = init_form %i32.loc15 [concrete = constants.%.795]
@@ -120,8 +126,8 @@ fn F() -> i32 {
// CHECK:STDOUT: fn @F() -> out %return.param: %i32 {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %n.patt: %pattern_type.6b6 = ref_binding_pattern n [concrete]
// CHECK:STDOUT: %n.var_patt: %pattern_type.6b6 = var_pattern %n.patt [concrete]
// CHECK:STDOUT: %n.patt: %pattern_type.6b6 = ref_binding_pattern n [concrete = constants.%n.patt]
// CHECK:STDOUT: %n.var_patt: %pattern_type.6b6 = var_pattern %n.patt [concrete = constants.%n.var_patt]
// CHECK:STDOUT: }
// CHECK:STDOUT: %n.var: ref %i32 = var %n.var_patt
// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6]
@@ -135,8 +141,8 @@ fn F() -> i32 {
// CHECK:STDOUT: %i32.loc16: type = type_literal constants.%i32 [concrete = constants.%i32]
// CHECK:STDOUT: %n: ref %i32 = ref_binding n, %n.var
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %p.patt: %pattern_type.f00 = ref_binding_pattern p [concrete]
// CHECK:STDOUT: %p.var_patt: %pattern_type.f00 = var_pattern %p.patt [concrete]
// CHECK:STDOUT: %p.patt: %pattern_type.f00 = ref_binding_pattern p [concrete = constants.%p.patt]
// CHECK:STDOUT: %p.var_patt: %pattern_type.f00 = var_pattern %p.patt [concrete = constants.%p.var_patt]
// CHECK:STDOUT: }
// CHECK:STDOUT: %p.var: ref %ptr.d08 = var %p.var_patt
// CHECK:STDOUT: %n.ref: ref %i32 = name_ref n, %n
+4 -2
View File
@@ -31,6 +31,8 @@ let n2: i32 = undeclared->foo;
// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete]
// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete]
// CHECK:STDOUT: %pattern_type.6b6: type = pattern_type %i32 [concrete]
// CHECK:STDOUT: %n.patt: %pattern_type.6b6 = value_binding_pattern n [concrete]
// CHECK:STDOUT: %n2.patt: %pattern_type.6b6 = value_binding_pattern n2 [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: imports {
@@ -51,12 +53,12 @@ let n2: i32 = undeclared->foo;
// CHECK:STDOUT: }
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %n.patt: %pattern_type.6b6 = value_binding_pattern n [concrete]
// CHECK:STDOUT: %n.patt: %pattern_type.6b6 = value_binding_pattern n [concrete = constants.%n.patt]
// CHECK:STDOUT: }
// CHECK:STDOUT: %i32.loc19: type = type_literal constants.%i32 [concrete = constants.%i32]
// CHECK:STDOUT: %n: %i32 = value_binding n, <error> [concrete = <error>]
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %n2.patt: %pattern_type.6b6 = value_binding_pattern n2 [concrete]
// CHECK:STDOUT: %n2.patt: %pattern_type.6b6 = value_binding_pattern n2 [concrete = constants.%n2.patt]
// CHECK:STDOUT: }
// CHECK:STDOUT: %i32.loc24: type = type_literal constants.%i32 [concrete = constants.%i32]
// CHECK:STDOUT: %n2: %i32 = value_binding n2, <error> [concrete = <error>]
@@ -54,6 +54,8 @@ fn Deref(n: i32) {
// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete]
// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete]
// CHECK:STDOUT: %pattern_type.6b6: type = pattern_type %i32 [concrete]
// CHECK:STDOUT: %n.param_patt: %pattern_type.6b6 = value_param_pattern [concrete]
// CHECK:STDOUT: %n.patt: %pattern_type.6b6 = at_binding_pattern n, %n.param_patt [concrete]
// CHECK:STDOUT: %Deref.type: type = fn_type @Deref [concrete]
// CHECK:STDOUT: %Deref: %Deref.type = struct_value () [concrete]
// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete]
@@ -77,8 +79,8 @@ fn Deref(n: i32) {
// CHECK:STDOUT: }
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: %Deref.decl: %Deref.type = fn_decl @Deref [concrete = constants.%Deref] {
// CHECK:STDOUT: %n.param_patt: %pattern_type.6b6 = value_param_pattern [concrete]
// CHECK:STDOUT: %n.patt: %pattern_type.6b6 = at_binding_pattern n, %n.param_patt [concrete]
// CHECK:STDOUT: %n.param_patt: %pattern_type.6b6 = value_param_pattern [concrete = constants.%n.param_patt]
// CHECK:STDOUT: %n.patt: %pattern_type.6b6 = at_binding_pattern n, %n.param_patt [concrete = constants.%n.patt]
// CHECK:STDOUT: } {
// CHECK:STDOUT: %n.param: %i32 = value_param call_param0
// CHECK:STDOUT: %i32: type = type_literal constants.%i32 [concrete = constants.%i32]
+4 -4
View File
@@ -52,8 +52,8 @@ var p2: i32->foo;
// CHECK:STDOUT: }
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %p.patt: <error> = ref_binding_pattern p [concrete]
// CHECK:STDOUT: %p.var_patt: <error> = var_pattern %p.patt [concrete]
// CHECK:STDOUT: %p.patt: <error> = ref_binding_pattern p [concrete = <error>]
// CHECK:STDOUT: %p.var_patt: <error> = var_pattern %p.patt [concrete = <error>]
// CHECK:STDOUT: }
// CHECK:STDOUT: %p.var: ref <error> = var %p.var_patt [concrete = <error>]
// CHECK:STDOUT: %.1: <error> = splice_block <error> [concrete = <error>] {
@@ -62,8 +62,8 @@ var p2: i32->foo;
// CHECK:STDOUT: }
// CHECK:STDOUT: %p: ref <error> = ref_binding p, <error> [concrete = <error>]
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %p2.patt: <error> = ref_binding_pattern p2 [concrete]
// CHECK:STDOUT: %p2.var_patt: <error> = var_pattern %p2.patt [concrete]
// CHECK:STDOUT: %p2.patt: <error> = ref_binding_pattern p2 [concrete = <error>]
// CHECK:STDOUT: %p2.var_patt: <error> = var_pattern %p2.patt [concrete = <error>]
// CHECK:STDOUT: }
// CHECK:STDOUT: %p2.var: ref <error> = var %p2.var_patt [concrete = <error>]
// CHECK:STDOUT: %.2: <error> = splice_block <error> [concrete = <error>] {
+8 -4
View File
@@ -31,10 +31,14 @@ fn ConstMismatch(p: const {}*) -> const ({}*) {
// CHECK:STDOUT: %const.c48: type = const_type %empty_struct_type [concrete]
// CHECK:STDOUT: %ptr.bf9: type = ptr_type %const.c48 [concrete]
// CHECK:STDOUT: %pattern_type.db0: type = pattern_type %ptr.bf9 [concrete]
// CHECK:STDOUT: %p.param_patt: %pattern_type.db0 = value_param_pattern [concrete]
// CHECK:STDOUT: %p.patt: %pattern_type.db0 = at_binding_pattern p, %p.param_patt [concrete]
// CHECK:STDOUT: %ptr.c28: type = ptr_type %empty_struct_type [concrete]
// CHECK:STDOUT: %const.987: type = const_type %ptr.c28 [concrete]
// CHECK:STDOUT: %.45c: Core.Form = init_form %const.987 [concrete]
// CHECK:STDOUT: %pattern_type.3c6: type = pattern_type %const.987 [concrete]
// CHECK:STDOUT: %return.param_patt.b04: %pattern_type.3c6 = out_param_pattern [concrete]
// CHECK:STDOUT: %return.patt.f8c: %pattern_type.3c6 = return_slot_pattern %return.param_patt.b04, %const.987 [concrete]
// CHECK:STDOUT: %ConstMismatch.type: type = fn_type @ConstMismatch [concrete]
// CHECK:STDOUT: %ConstMismatch: %ConstMismatch.type = struct_value () [concrete]
// CHECK:STDOUT: %ImplicitAs.type.0ff: type = generic_interface_type @ImplicitAs [concrete]
@@ -57,10 +61,10 @@ fn ConstMismatch(p: const {}*) -> const ({}*) {
// CHECK:STDOUT: }
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: %ConstMismatch.decl: %ConstMismatch.type = fn_decl @ConstMismatch [concrete = constants.%ConstMismatch] {
// CHECK:STDOUT: %p.param_patt: %pattern_type.db0 = value_param_pattern [concrete]
// CHECK:STDOUT: %p.patt: %pattern_type.db0 = at_binding_pattern p, %p.param_patt [concrete]
// CHECK:STDOUT: %return.param_patt: %pattern_type.3c6 = out_param_pattern [concrete]
// CHECK:STDOUT: %return.patt: %pattern_type.3c6 = return_slot_pattern %return.param_patt, %const.loc15_35 [concrete]
// CHECK:STDOUT: %p.param_patt: %pattern_type.db0 = value_param_pattern [concrete = constants.%p.param_patt]
// CHECK:STDOUT: %p.patt: %pattern_type.db0 = at_binding_pattern p, %p.param_patt [concrete = constants.%p.patt]
// CHECK:STDOUT: %return.param_patt: %pattern_type.3c6 = out_param_pattern [concrete = constants.%return.param_patt.b04]
// CHECK:STDOUT: %return.patt: %pattern_type.3c6 = return_slot_pattern %return.param_patt, %const.loc15_35 [concrete = constants.%return.patt.f8c]
// CHECK:STDOUT: } {
// CHECK:STDOUT: %.loc15_43: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct]
// CHECK:STDOUT: %.loc15_44: type = converted %.loc15_43, constants.%empty_struct_type [concrete = constants.%empty_struct_type]
+15 -9
View File
@@ -33,6 +33,8 @@ var a: i32* = a_ref;
// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete]
// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete]
// CHECK:STDOUT: %pattern_type.6b6: type = pattern_type %i32 [concrete]
// CHECK:STDOUT: %a_orig.patt: %pattern_type.6b6 = ref_binding_pattern a_orig [concrete]
// CHECK:STDOUT: %a_orig.var_patt: %pattern_type.6b6 = var_pattern %a_orig.patt [concrete]
// CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete]
// CHECK:STDOUT: %ImplicitAs.type.0ff: type = generic_interface_type @ImplicitAs [concrete]
// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.0ff = struct_value () [concrete]
@@ -52,6 +54,8 @@ var a: i32* = a_ref;
// CHECK:STDOUT: %int_0.3c0: %i32 = int_value 0 [concrete]
// CHECK:STDOUT: %ptr.d08: type = ptr_type %i32 [concrete]
// CHECK:STDOUT: %pattern_type.f00: type = pattern_type %ptr.d08 [concrete]
// CHECK:STDOUT: %a_ref.patt: %pattern_type.f00 = ref_binding_pattern a_ref [concrete]
// CHECK:STDOUT: %a_ref.var_patt: %pattern_type.f00 = var_pattern %a_ref.patt [concrete]
// CHECK:STDOUT: %addr: %ptr.d08 = addr_of file.%a_orig.var [concrete]
// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete]
// CHECK:STDOUT: %T.67d: type = symbolic_binding T, 0 [symbolic]
@@ -93,15 +97,15 @@ var a: i32* = a_ref;
// CHECK:STDOUT: }
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %a_orig.patt: %pattern_type.6b6 = ref_binding_pattern a_orig [concrete]
// CHECK:STDOUT: %a_orig.var_patt: %pattern_type.6b6 = var_pattern %a_orig.patt [concrete]
// CHECK:STDOUT: %a_orig.patt: %pattern_type.6b6 = ref_binding_pattern a_orig [concrete = constants.%a_orig.patt]
// CHECK:STDOUT: %a_orig.var_patt: %pattern_type.6b6 = var_pattern %a_orig.patt [concrete = constants.%a_orig.var_patt]
// CHECK:STDOUT: }
// CHECK:STDOUT: %a_orig.var: ref %i32 = var %a_orig.var_patt [concrete]
// CHECK:STDOUT: %i32.loc4: type = type_literal constants.%i32 [concrete = constants.%i32]
// CHECK:STDOUT: %a_orig: ref %i32 = ref_binding a_orig, %a_orig.var [concrete = %a_orig.var]
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %a_ref.patt: %pattern_type.f00 = ref_binding_pattern a_ref [concrete]
// CHECK:STDOUT: %a_ref.var_patt: %pattern_type.f00 = var_pattern %a_ref.patt [concrete]
// CHECK:STDOUT: %a_ref.patt: %pattern_type.f00 = ref_binding_pattern a_ref [concrete = constants.%a_ref.patt]
// CHECK:STDOUT: %a_ref.var_patt: %pattern_type.f00 = var_pattern %a_ref.patt [concrete = constants.%a_ref.var_patt]
// CHECK:STDOUT: }
// CHECK:STDOUT: %a_ref.var: ref %ptr.d08 = var %a_ref.var_patt [concrete]
// CHECK:STDOUT: %.loc5: type = splice_block %ptr [concrete = constants.%ptr.d08] {
@@ -145,6 +149,10 @@ var a: i32* = a_ref;
// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete]
// CHECK:STDOUT: %ptr.d08: type = ptr_type %i32 [concrete]
// CHECK:STDOUT: %pattern_type.f00: type = pattern_type %ptr.d08 [concrete]
// CHECK:STDOUT: %a.patt: %pattern_type.f00 = ref_binding_pattern a [concrete]
// CHECK:STDOUT: %a.var_patt: %pattern_type.f00 = var_pattern %a.patt [concrete]
// CHECK:STDOUT: %a_ref.patt: %pattern_type.f00 = ref_binding_pattern a_ref [concrete]
// CHECK:STDOUT: %a_ref.var_patt: %pattern_type.f00 = var_pattern %a_ref.patt [concrete]
// CHECK:STDOUT: %Copy.impl_witness.101: <witness> = impl_witness imports.%Copy.impl_witness_table.90e, @ptr.as.Copy.impl(%i32) [concrete]
// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.c1c: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%i32) [concrete]
// CHECK:STDOUT: %ptr.as.Copy.impl.Op.d1c: %ptr.as.Copy.impl.Op.type.c1c = struct_value () [concrete]
@@ -166,9 +174,7 @@ var a: i32* = a_ref;
// CHECK:STDOUT: %Implicit.import_ref.499: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.ff5) = import_ref Implicit//default, inst{{[0-9A-F]+}} [indirect], loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.ce9)]
// CHECK:STDOUT: %Copy.impl_witness_table.90e = impl_witness_table (%Implicit.import_ref.499), @ptr.as.Copy.impl [concrete]
// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic]
// CHECK:STDOUT: %a_ref.patt: %pattern_type.f00 = ref_binding_pattern a_ref [concrete]
// CHECK:STDOUT: %a_ref.var_patt: %pattern_type.f00 = var_pattern %a_ref.patt [concrete]
// CHECK:STDOUT: %a_ref.var: ref %ptr.d08 = var %a_ref.var_patt [concrete]
// CHECK:STDOUT: %a_ref.var: ref %ptr.d08 = var constants.%a_ref.var_patt [concrete]
// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type]
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -183,8 +189,8 @@ var a: i32* = a_ref;
// CHECK:STDOUT: %default.import = import <none>
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %a.patt: %pattern_type.f00 = ref_binding_pattern a [concrete]
// CHECK:STDOUT: %a.var_patt: %pattern_type.f00 = var_pattern %a.patt [concrete]
// CHECK:STDOUT: %a.patt: %pattern_type.f00 = ref_binding_pattern a [concrete = constants.%a.patt]
// CHECK:STDOUT: %a.var_patt: %pattern_type.f00 = var_pattern %a.patt [concrete = constants.%a.var_patt]
// CHECK:STDOUT: }
// CHECK:STDOUT: %a.var: ref %ptr.d08 = var %a.var_patt [concrete]
// CHECK:STDOUT: %.loc4: type = splice_block %ptr [concrete = constants.%ptr.d08] {
+12 -6
View File
@@ -32,8 +32,12 @@ fn F(p: const (const (const i32*)*)) -> const i32 {
// CHECK:STDOUT: %ptr.f93: type = ptr_type %const.8df [concrete]
// CHECK:STDOUT: %const.99e: type = const_type %ptr.f93 [concrete]
// CHECK:STDOUT: %pattern_type.a04: type = pattern_type %const.99e [concrete]
// CHECK:STDOUT: %p.param_patt: %pattern_type.a04 = value_param_pattern [concrete]
// CHECK:STDOUT: %p.patt: %pattern_type.a04 = at_binding_pattern p, %p.param_patt [concrete]
// CHECK:STDOUT: %.242: Core.Form = init_form %const.6a8 [concrete]
// CHECK:STDOUT: %pattern_type.ed1: type = pattern_type %const.6a8 [concrete]
// CHECK:STDOUT: %return.param_patt.2ae: %pattern_type.ed1 = out_param_pattern [concrete]
// CHECK:STDOUT: %return.patt.524: %pattern_type.ed1 = return_slot_pattern %return.param_patt.2ae, %const.6a8 [concrete]
// CHECK:STDOUT: %F.type: type = fn_type @F [concrete]
// CHECK:STDOUT: %F: %F.type = struct_value () [concrete]
// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete]
@@ -75,10 +79,10 @@ fn F(p: const (const (const i32*)*)) -> const i32 {
// CHECK:STDOUT: }
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {
// CHECK:STDOUT: %p.param_patt: %pattern_type.a04 = value_param_pattern [concrete]
// CHECK:STDOUT: %p.patt: %pattern_type.a04 = at_binding_pattern p, %p.param_patt [concrete]
// CHECK:STDOUT: %return.param_patt: %pattern_type.ed1 = out_param_pattern [concrete]
// CHECK:STDOUT: %return.patt: %pattern_type.ed1 = return_slot_pattern %return.param_patt, %const.loc16_41 [concrete]
// CHECK:STDOUT: %p.param_patt: %pattern_type.a04 = value_param_pattern [concrete = constants.%p.param_patt]
// CHECK:STDOUT: %p.patt: %pattern_type.a04 = at_binding_pattern p, %p.param_patt [concrete = constants.%p.patt]
// CHECK:STDOUT: %return.param_patt: %pattern_type.ed1 = out_param_pattern [concrete = constants.%return.param_patt.2ae]
// CHECK:STDOUT: %return.patt: %pattern_type.ed1 = return_slot_pattern %return.param_patt, %const.loc16_41 [concrete = constants.%return.patt.524]
// CHECK:STDOUT: } {
// CHECK:STDOUT: %i32.loc16_47: type = type_literal constants.%i32 [concrete = constants.%i32]
// CHECK:STDOUT: %const.loc16_41: type = const_type %i32.loc16_47 [concrete = constants.%const.6a8]
@@ -107,8 +111,10 @@ fn F(p: const (const (const i32*)*)) -> const i32 {
// CHECK:STDOUT: %.loc17_10.2: %const.6a8 = acquire_value %.loc17_10.1
// CHECK:STDOUT: %impl.elem0: %.367 = impl_witness_access constants.%Copy.impl_witness.0b0, element0 [concrete = constants.%const.as.Copy.impl.Op.9cf]
// CHECK:STDOUT: %bound_method.loc17_10.1: <bound method> = bound_method %.loc17_10.2, %impl.elem0
// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value constants.%i32, (constants.%Copy.impl_witness.0e0) [concrete = constants.%Copy.facet.987]
// CHECK:STDOUT: %.loc17_10.3: %Copy.type = converted constants.%i32, %Copy.facet [concrete = constants.%Copy.facet.987]
// CHECK:STDOUT: %Copy.facet.loc17_10.1: %Copy.type = facet_value constants.%i32, (constants.%Copy.impl_witness.0e0) [concrete = constants.%Copy.facet.987]
// CHECK:STDOUT: %.loc17_10.3: %Copy.type = converted constants.%i32, %Copy.facet.loc17_10.1 [concrete = constants.%Copy.facet.987]
// CHECK:STDOUT: %Copy.facet.loc17_10.2: %Copy.type = facet_value constants.%i32, (constants.%Copy.impl_witness.0e0) [concrete = constants.%Copy.facet.987]
// CHECK:STDOUT: %.loc17_10.4: %Copy.type = converted constants.%i32, %Copy.facet.loc17_10.2 [concrete = constants.%Copy.facet.987]
// CHECK:STDOUT: %specific_fn: <specific function> = specific_function %impl.elem0, @const.as.Copy.impl.Op(constants.%Copy.facet.987) [concrete = constants.%const.as.Copy.impl.Op.specific_fn]
// CHECK:STDOUT: %bound_method.loc17_10.2: <bound method> = bound_method %.loc17_10.2, %specific_fn
// CHECK:STDOUT: %const.as.Copy.impl.Op.call: init %const.6a8 = call %bound_method.loc17_10.2(%.loc17_10.2)
+16 -8
View File
@@ -29,7 +29,11 @@ fn ConstPtr(p: const i32*) -> (const i32)* {
// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete]
// CHECK:STDOUT: %ptr.d08: type = ptr_type %i32 [concrete]
// CHECK:STDOUT: %pattern_type.f00: type = pattern_type %ptr.d08 [concrete]
// CHECK:STDOUT: %p.param_patt.b89: %pattern_type.f00 = value_param_pattern [concrete]
// CHECK:STDOUT: %p.patt.204: %pattern_type.f00 = at_binding_pattern p, %p.param_patt.b89 [concrete]
// CHECK:STDOUT: %.952: Core.Form = init_form %ptr.d08 [concrete]
// CHECK:STDOUT: %return.param_patt.7dd: %pattern_type.f00 = out_param_pattern [concrete]
// CHECK:STDOUT: %return.patt.dbe: %pattern_type.f00 = return_slot_pattern %return.param_patt.7dd, %ptr.d08 [concrete]
// CHECK:STDOUT: %Ptr.type: type = fn_type @Ptr [concrete]
// CHECK:STDOUT: %Ptr: %Ptr.type = struct_value () [concrete]
// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete]
@@ -46,7 +50,11 @@ fn ConstPtr(p: const i32*) -> (const i32)* {
// CHECK:STDOUT: %const.6a8: type = const_type %i32 [concrete]
// CHECK:STDOUT: %ptr.774: type = ptr_type %const.6a8 [concrete]
// CHECK:STDOUT: %pattern_type.8c1: type = pattern_type %ptr.774 [concrete]
// CHECK:STDOUT: %p.param_patt.5f6: %pattern_type.8c1 = value_param_pattern [concrete]
// CHECK:STDOUT: %p.patt.226: %pattern_type.8c1 = at_binding_pattern p, %p.param_patt.5f6 [concrete]
// CHECK:STDOUT: %.af2: Core.Form = init_form %ptr.774 [concrete]
// CHECK:STDOUT: %return.param_patt.0fc: %pattern_type.8c1 = out_param_pattern [concrete]
// CHECK:STDOUT: %return.patt.e15: %pattern_type.8c1 = return_slot_pattern %return.param_patt.0fc, %ptr.774 [concrete]
// CHECK:STDOUT: %ConstPtr.type: type = fn_type @ConstPtr [concrete]
// CHECK:STDOUT: %ConstPtr: %ConstPtr.type = struct_value () [concrete]
// CHECK:STDOUT: %Copy.impl_witness.1fe: <witness> = impl_witness imports.%Copy.impl_witness_table.4f1, @ptr.as.Copy.impl(%const.6a8) [concrete]
@@ -79,10 +87,10 @@ fn ConstPtr(p: const i32*) -> (const i32)* {
// CHECK:STDOUT: }
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: %Ptr.decl: %Ptr.type = fn_decl @Ptr [concrete = constants.%Ptr] {
// CHECK:STDOUT: %p.param_patt: %pattern_type.f00 = value_param_pattern [concrete]
// CHECK:STDOUT: %p.patt: %pattern_type.f00 = at_binding_pattern p, %p.param_patt [concrete]
// CHECK:STDOUT: %return.param_patt: %pattern_type.f00 = out_param_pattern [concrete]
// CHECK:STDOUT: %return.patt: %pattern_type.f00 = return_slot_pattern %return.param_patt, %ptr.loc15_23 [concrete]
// CHECK:STDOUT: %p.param_patt: %pattern_type.f00 = value_param_pattern [concrete = constants.%p.param_patt.b89]
// CHECK:STDOUT: %p.patt: %pattern_type.f00 = at_binding_pattern p, %p.param_patt [concrete = constants.%p.patt.204]
// CHECK:STDOUT: %return.param_patt: %pattern_type.f00 = out_param_pattern [concrete = constants.%return.param_patt.7dd]
// CHECK:STDOUT: %return.patt: %pattern_type.f00 = return_slot_pattern %return.param_patt, %ptr.loc15_23 [concrete = constants.%return.patt.dbe]
// CHECK:STDOUT: } {
// CHECK:STDOUT: %i32.loc15_20: type = type_literal constants.%i32 [concrete = constants.%i32]
// CHECK:STDOUT: %ptr.loc15_23: type = ptr_type %i32.loc15_20 [concrete = constants.%ptr.d08]
@@ -97,10 +105,10 @@ fn ConstPtr(p: const i32*) -> (const i32)* {
// CHECK:STDOUT: %return: ref %ptr.d08 = return_slot %return.param
// CHECK:STDOUT: }
// CHECK:STDOUT: %ConstPtr.decl: %ConstPtr.type = fn_decl @ConstPtr [concrete = constants.%ConstPtr] {
// CHECK:STDOUT: %p.param_patt: %pattern_type.8c1 = value_param_pattern [concrete]
// CHECK:STDOUT: %p.patt: %pattern_type.8c1 = at_binding_pattern p, %p.param_patt [concrete]
// CHECK:STDOUT: %return.param_patt: %pattern_type.8c1 = out_param_pattern [concrete]
// CHECK:STDOUT: %return.patt: %pattern_type.8c1 = return_slot_pattern %return.param_patt, %ptr.loc19_42 [concrete]
// CHECK:STDOUT: %p.param_patt: %pattern_type.8c1 = value_param_pattern [concrete = constants.%p.param_patt.5f6]
// CHECK:STDOUT: %p.patt: %pattern_type.8c1 = at_binding_pattern p, %p.param_patt [concrete = constants.%p.patt.226]
// CHECK:STDOUT: %return.param_patt: %pattern_type.8c1 = out_param_pattern [concrete = constants.%return.param_patt.0fc]
// CHECK:STDOUT: %return.patt: %pattern_type.8c1 = return_slot_pattern %return.param_patt, %ptr.loc19_42 [concrete = constants.%return.patt.e15]
// CHECK:STDOUT: } {
// CHECK:STDOUT: %i32.loc19_38: type = type_literal constants.%i32 [concrete = constants.%i32]
// CHECK:STDOUT: %const.loc19_32: type = const_type %i32.loc19_38 [concrete = constants.%const.6a8]