diff --git a/core/prelude/copy.carbon b/core/prelude/copy.carbon index bef8ac845fb8..30edee3a2fb1 100644 --- a/core/prelude/copy.carbon +++ b/core/prelude/copy.carbon @@ -15,6 +15,10 @@ private fn CharLiteral() -> type = "char_literal.make_type"; private fn FloatLiteral() -> type = "float_literal.make_type"; private fn IntLiteral() -> type = "int_literal.make_type"; +impl forall [T:! Copy] const T as Copy { + fn Op[self: Self]() -> Self { return (self as T).(Copy.Op)() as const T; } +} + impl Bool() as Copy { fn Op[self: Self]() -> Self = "primitive_copy"; } @@ -55,3 +59,9 @@ impl forall [T:! Copy, U:! Copy] (T, U) as Copy { return (self.0.Op(), self.1.Op()); } } + +impl forall [T:! Copy, U:! Copy, V:! Copy] (T, U, V) as Copy { + fn Op[self: Self]() -> Self { + return (self.0.Op(), self.1.Op(), self.2.Op()); + } +} diff --git a/core/prelude/operators/as.carbon b/core/prelude/operators/as.carbon index 86795df43ad0..7c7728632fc4 100644 --- a/core/prelude/operators/as.carbon +++ b/core/prelude/operators/as.carbon @@ -4,6 +4,8 @@ package Core library "prelude/operators/as"; +import library "prelude/copy"; + interface UnsafeAs(Dest:! type) { fn Convert[self: Self]() -> Dest; } @@ -18,7 +20,6 @@ interface ImplicitAs(Dest:! type) { fn Convert[self: Self]() -> Dest; } -// TODO: This should only apply to copyable types. -impl forall [T:! type] T as ImplicitAs(T) { - fn Convert[self: Self]() -> Self { return self; } +impl forall [T:! Copy] T as ImplicitAs(T) { + fn Convert[self: Self]() -> Self { return self.(Copy.Op)(); } } diff --git a/core/prelude/types/string.carbon b/core/prelude/types/string.carbon index 1bfd265c9a4e..984d0e34bd4a 100644 --- a/core/prelude/types/string.carbon +++ b/core/prelude/types/string.carbon @@ -4,6 +4,7 @@ package Core library "prelude/types/string"; +import library "prelude/copy"; import library "prelude/destroy"; import library "prelude/types/char"; import library "prelude/types/uint"; diff --git a/toolchain/check/return.cpp b/toolchain/check/return.cpp index ad43bd7a22ff..fd8abc7f1d06 100644 --- a/toolchain/check/return.cpp +++ b/toolchain/check/return.cpp @@ -157,13 +157,10 @@ auto BuildReturnWithExpr(Context& context, SemIR::LocId loc_id, // We already diagnosed that the return type is invalid. Don't try to // convert to it. expr_id = SemIR::ErrorInst::InstId; - } else if (return_info.has_return_slot()) { + } else { return_slot_id = GetCurrentReturnSlot(context); CARBON_CHECK(return_slot_id.has_value()); expr_id = Initialize(context, loc_id, return_slot_id, expr_id); - } else { - expr_id = - ConvertToValueOfType(context, loc_id, expr_id, return_info.type_id); } AddReturnCleanupBlockWithExpr( diff --git a/toolchain/check/testdata/alias/export_name.carbon b/toolchain/check/testdata/alias/export_name.carbon index e16ee86d9073..77dc156e80bf 100644 --- a/toolchain/check/testdata/alias/export_name.carbon +++ b/toolchain/check/testdata/alias/export_name.carbon @@ -341,7 +341,7 @@ var d: D* = &c; // CHECK:STDOUT: %Main.import_ref.8db: = import_ref Main//export_orig, inst24 [indirect], loaded [concrete = constants.%complete_type.357] // CHECK:STDOUT: %Main.import_ref.6a9 = import_ref Main//export_orig, inst25 [indirect], unloaded // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/array/import.carbon b/toolchain/check/testdata/array/import.carbon index 7ffefab50aa2..a6b875823aff 100644 --- a/toolchain/check/testdata/array/import.carbon +++ b/toolchain/check/testdata/array/import.carbon @@ -62,18 +62,31 @@ fn F() -> array(i32, 1) { // CHECK:STDOUT: constants { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %int_42: Core.IntLiteral = int_value 42 [concrete] // CHECK:STDOUT: %array_type: type = array_type %int_42, %i32 [concrete] // CHECK:STDOUT: %ptr.830: type = ptr_type %array_type [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.type.886: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%array_type) [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.923: %T.as.Destroy.impl.Op.type.886 = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.F: %F.type = import_ref Main//library, F, loaded [concrete = constants.%F] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G(%n.param: %i32) -> %i32 { @@ -87,12 +100,17 @@ fn F() -> array(i32, 1) { // CHECK:STDOUT: %i32.loc6: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %.loc6_15.1: ref %i32 = array_index %.loc6_12.2, %n.ref // CHECK:STDOUT: %.loc6_15.2: %i32 = bind_value %.loc6_15.1 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc6_15.1: = bound_method %.loc6_15.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc6_15.2: = bound_method %.loc6_15.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc6_15.2(%.loc6_15.2) // CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %.loc6_12.2, constants.%T.as.Destroy.impl.Op.923 // CHECK:STDOUT: -// CHECK:STDOUT: %bound_method: = bound_method %.loc6_12.2, %T.as.Destroy.impl.Op.specific_fn +// CHECK:STDOUT: %bound_method.loc6_12: = bound_method %.loc6_12.2, %T.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr: %ptr.830 = addr_of %.loc6_12.2 -// CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method(%addr) -// CHECK:STDOUT: return %.loc6_15.2 +// CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc6_12(%addr) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_import_symbolic_decl.carbon diff --git a/toolchain/check/testdata/array/index_not_literal.carbon b/toolchain/check/testdata/array/index_not_literal.carbon index 173f41de0a34..f96843ce3f60 100644 --- a/toolchain/check/testdata/array/index_not_literal.carbon +++ b/toolchain/check/testdata/array/index_not_literal.carbon @@ -51,15 +51,26 @@ fn F(a: array({}, 3)) -> {} { // CHECK:STDOUT: constants { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %int_3.1ba: Core.IntLiteral = int_value 3 [concrete] // CHECK:STDOUT: %array_type: type = array_type %int_3.1ba, %i32 [concrete] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %ptr.f01: type = ptr_type %array_type [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [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: %tuple.type: type = tuple_type (Core.IntLiteral, Core.IntLiteral, Core.IntLiteral) [concrete] +// CHECK:STDOUT: %tuple.type.37f: type = tuple_type (Core.IntLiteral, Core.IntLiteral, Core.IntLiteral) [concrete] // CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete] // CHECK:STDOUT: %ImplicitAs.type.e8c: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] // CHECK:STDOUT: %ImplicitAs.Convert.type.1b6: type = fn_type @ImplicitAs.Convert, @ImplicitAs(%i32) [concrete] @@ -87,6 +98,8 @@ fn F(a: array({}, 3)) -> {} { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: } @@ -100,7 +113,12 @@ fn F(a: array({}, 3)) -> {} { // CHECK:STDOUT: %.loc4_15.1: ref %array_type = value_as_ref %arr.ref // CHECK:STDOUT: %.loc4_15.2: ref %i32 = array_index %.loc4_15.1, %i.ref // CHECK:STDOUT: %.loc4_15.3: %i32 = bind_value %.loc4_15.2 -// CHECK:STDOUT: return %.loc4_15.3 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc4_15.1: = bound_method %.loc4_15.3, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc4_15.2: = bound_method %.loc4_15.3, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc4_15.2(%.loc4_15.3) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G() -> %i32 { @@ -109,7 +127,7 @@ fn F(a: array({}, 3)) -> {} { // CHECK:STDOUT: %int_1.loc10_13: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] // CHECK:STDOUT: %int_2.loc10_16: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc] // CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete = constants.%int_3.1ba] -// CHECK:STDOUT: %.loc10_20.1: %tuple.type = tuple_literal (%int_1.loc10_13, %int_2.loc10_16, %int_3) +// CHECK:STDOUT: %.loc10_20.1: %tuple.type.37f = tuple_literal (%int_1.loc10_13, %int_2.loc10_16, %int_3) // CHECK:STDOUT: %int_1.loc10_23: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] // CHECK:STDOUT: %impl.elem0.loc10_20.1: %.7ea = impl_witness_access constants.%ImplicitAs.impl_witness.acc, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.592] // CHECK:STDOUT: %bound_method.loc10_20.1: = bound_method %int_1.loc10_13, %impl.elem0.loc10_20.1 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound.a02] @@ -151,14 +169,12 @@ fn F(a: array({}, 3)) -> {} { // CHECK:STDOUT: %.loc10_23.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc10_23 [concrete = constants.%int_1.5d2] // CHECK:STDOUT: %.loc10_23.2: %i32 = converted %int_1.loc10_23, %.loc10_23.1 [concrete = constants.%int_1.5d2] // CHECK:STDOUT: %F.call: init %i32 = call %F.ref(%.loc10_20.15, %.loc10_23.2) -// CHECK:STDOUT: %.loc10_25.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc10_25.2: %i32 = converted %F.call, %.loc10_25.1 // CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %.loc10_20.14, constants.%T.as.Destroy.impl.Op.a44 // CHECK:STDOUT: // CHECK:STDOUT: %bound_method.loc10_20.7: = bound_method %.loc10_20.14, %T.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr: %ptr.f01 = addr_of %.loc10_20.14 // CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc10_20.7(%addr) -// CHECK:STDOUT: return %.loc10_25.2 +// CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- index_non_literal.carbon @@ -215,6 +231,8 @@ fn F(a: array({}, 3)) -> {} { // CHECK:STDOUT: %.loc6_30.2: ref %empty_struct_type = array_index %.loc6_30.1, %.loc6_24.3 // CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] // CHECK:STDOUT: %.loc6_30.3: %empty_struct_type = converted %.loc6_30.2, %empty_struct [concrete = constants.%empty_struct] -// CHECK:STDOUT: return %.loc6_30.3 +// CHECK:STDOUT: %.loc6_30.4: init %empty_struct_type = struct_init () to %return [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc6_31: init %empty_struct_type = converted %.loc6_30.3, %.loc6_30.4 [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc6_31 to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/basics/dump_sem_ir_ranges.carbon b/toolchain/check/testdata/basics/dump_sem_ir_ranges.carbon index 115292b3d397..c90489332cdd 100644 --- a/toolchain/check/testdata/basics/dump_sem_ir_ranges.carbon +++ b/toolchain/check/testdata/basics/dump_sem_ir_ranges.carbon @@ -156,14 +156,14 @@ library "[[@TEST_NAME]]"; // CHECK:STDOUT: %B.call: init %empty_tuple.type = call %B.ref() // CHECK:STDOUT: assign %c.ref.loc19, %B.call // CHECK:STDOUT: %c.ref.loc20: ref %empty_tuple.type = name_ref c, %c -// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc20: %empty_tuple.type = converted %c.ref.loc20, %tuple [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc20_10: init %empty_tuple.type = tuple_init () to %return [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc20_11: init %empty_tuple.type = converted %c.ref.loc20, %.loc20_10 [concrete = constants.%empty_tuple] // CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %c.var, constants.%T.as.Destroy.impl.Op.bae // CHECK:STDOUT: // CHECK:STDOUT: %bound_method: = bound_method %c.var, %T.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr: %ptr.843 = addr_of %c.var // CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method(%addr) -// CHECK:STDOUT: return %.loc20 +// CHECK:STDOUT: return %.loc20_11 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- class.carbon diff --git a/toolchain/check/testdata/basics/raw_identifier.carbon b/toolchain/check/testdata/basics/raw_identifier.carbon index 130d2e01e51c..528735523c49 100644 --- a/toolchain/check/testdata/basics/raw_identifier.carbon +++ b/toolchain/check/testdata/basics/raw_identifier.carbon @@ -30,6 +30,7 @@ fn C(r#if: ()) -> () { // CHECK:STDOUT: %pattern_type: type = pattern_type %empty_tuple.type [concrete] // CHECK:STDOUT: %A.type: type = fn_type @A [concrete] // CHECK:STDOUT: %A: %A.type = struct_value () [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] // CHECK:STDOUT: %B.type: type = fn_type @B [concrete] // CHECK:STDOUT: %B: %B.type = struct_value () [concrete] // CHECK:STDOUT: %C.type: type = fn_type @C [concrete] @@ -98,18 +99,24 @@ fn C(r#if: ()) -> () { // CHECK:STDOUT: fn @A(%n.param: %empty_tuple.type) -> %empty_tuple.type { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %n.ref: %empty_tuple.type = name_ref n, %n -// CHECK:STDOUT: return %n.ref +// CHECK:STDOUT: %.loc15_10: init %empty_tuple.type = tuple_init () to %return [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc15_13: init %empty_tuple.type = converted %n.ref, %.loc15_10 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc15_13 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B(%n.param: %empty_tuple.type) -> %empty_tuple.type { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %n.ref: %empty_tuple.type = name_ref n, %n -// CHECK:STDOUT: return %n.ref +// CHECK:STDOUT: %.loc19_10: init %empty_tuple.type = tuple_init () to %return [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc19_11: init %empty_tuple.type = converted %n.ref, %.loc19_10 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc19_11 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C(%if.param: %empty_tuple.type) -> %empty_tuple.type { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %if.ref: %empty_tuple.type = name_ref r#if, %if -// CHECK:STDOUT: return %if.ref +// CHECK:STDOUT: %.loc23_10: init %empty_tuple.type = tuple_init () to %return [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc23_14: init %empty_tuple.type = converted %if.ref, %.loc23_10 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc23_14 to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/basics/raw_sem_ir/one_file.carbon b/toolchain/check/testdata/basics/raw_sem_ir/one_file.carbon index df982f5bc0ef..3ef6c0644bdc 100644 --- a/toolchain/check/testdata/basics/raw_sem_ir/one_file.carbon +++ b/toolchain/check/testdata/basics/raw_sem_ir/one_file.carbon @@ -43,109 +43,199 @@ fn Foo[T:! type](p: T*) -> (T*, ()) { // CHECK:STDOUT: import_ir_inst12: {ir_id: ir4, inst_id: inst21} // CHECK:STDOUT: import_ir_inst13: {ir_id: ir4, inst_id: inst24} // CHECK:STDOUT: import_ir_inst14: {ir_id: ir4, inst_id: inst29} -// CHECK:STDOUT: import_ir_inst15: {ir_id: ir4, inst_id: inst83} -// CHECK:STDOUT: import_ir_inst16: {ir_id: ir4, inst_id: inst81} -// CHECK:STDOUT: import_ir_inst17: {ir_id: ir4, inst_id: inst79} +// CHECK:STDOUT: import_ir_inst15: {ir_id: ir4, inst_id: inst97} +// CHECK:STDOUT: import_ir_inst16: {ir_id: ir4, inst_id: inst95} +// CHECK:STDOUT: import_ir_inst17: {ir_id: ir4, inst_id: inst84} // CHECK:STDOUT: import_ir_inst18: {ir_id: ir4, inst_id: inst80} -// CHECK:STDOUT: import_ir_inst19: {ir_id: ir4, inst_id: inst107} -// CHECK:STDOUT: import_ir_inst20: {ir_id: ir4, inst_id: inst105} -// CHECK:STDOUT: import_ir_inst21: {ir_id: ir4, inst_id: inst103} -// CHECK:STDOUT: import_ir_inst22: {ir_id: ir4, inst_id: inst104} -// CHECK:STDOUT: import_ir_inst23: {ir_id: ir4, inst_id: inst131} -// CHECK:STDOUT: import_ir_inst24: {ir_id: ir4, inst_id: inst129} -// CHECK:STDOUT: import_ir_inst25: {ir_id: ir4, inst_id: inst127} -// CHECK:STDOUT: import_ir_inst26: {ir_id: ir4, inst_id: inst128} -// CHECK:STDOUT: import_ir_inst27: {ir_id: ir4, inst_id: inst155} -// CHECK:STDOUT: import_ir_inst28: {ir_id: ir4, inst_id: inst153} -// CHECK:STDOUT: import_ir_inst29: {ir_id: ir4, inst_id: inst151} -// CHECK:STDOUT: import_ir_inst30: {ir_id: ir4, inst_id: inst152} -// CHECK:STDOUT: import_ir_inst31: {ir_id: ir4, inst_id: inst186} -// CHECK:STDOUT: import_ir_inst32: {ir_id: ir4, inst_id: inst184} -// CHECK:STDOUT: import_ir_inst33: {ir_id: ir4, inst_id: inst178} -// CHECK:STDOUT: import_ir_inst34: {ir_id: ir4, inst_id: inst175} -// CHECK:STDOUT: import_ir_inst35: {ir_id: ir4, inst_id: inst180} -// CHECK:STDOUT: import_ir_inst36: {ir_id: ir4, inst_id: inst183} -// CHECK:STDOUT: import_ir_inst37: {ir_id: ir4, inst_id: inst203} -// CHECK:STDOUT: import_ir_inst38: {ir_id: ir4, inst_id: inst185} -// CHECK:STDOUT: import_ir_inst39: {ir_id: ir4, inst_id: inst177} -// CHECK:STDOUT: import_ir_inst40: {ir_id: ir4, inst_id: inst182} -// CHECK:STDOUT: import_ir_inst41: {ir_id: ir4, inst_id: inst188} -// CHECK:STDOUT: import_ir_inst42: {ir_id: ir4, inst_id: inst203} -// CHECK:STDOUT: import_ir_inst43: {ir_id: ir4, inst_id: inst198} -// CHECK:STDOUT: import_ir_inst44: {ir_id: ir4, inst_id: inst199} -// CHECK:STDOUT: import_ir_inst45: {ir_id: ir4, inst_id: inst194} -// CHECK:STDOUT: import_ir_inst46: {ir_id: ir4, inst_id: inst196} -// CHECK:STDOUT: import_ir_inst47: {ir_id: ir4, inst_id: inst175} -// CHECK:STDOUT: import_ir_inst48: {ir_id: ir4, inst_id: inst206} -// CHECK:STDOUT: import_ir_inst49: {ir_id: ir4, inst_id: inst207} -// CHECK:STDOUT: import_ir_inst50: {ir_id: ir4, inst_id: inst210} -// CHECK:STDOUT: import_ir_inst51: {ir_id: ir4, inst_id: inst190} +// CHECK:STDOUT: import_ir_inst19: {ir_id: ir4, inst_id: inst90} +// CHECK:STDOUT: import_ir_inst20: {ir_id: ir4, inst_id: inst93} +// CHECK:STDOUT: import_ir_inst21: {ir_id: ir4, inst_id: inst116} +// CHECK:STDOUT: import_ir_inst22: {ir_id: ir4, inst_id: inst96} +// CHECK:STDOUT: import_ir_inst23: {ir_id: ir4, inst_id: inst82} +// CHECK:STDOUT: import_ir_inst24: {ir_id: ir4, inst_id: inst88} +// CHECK:STDOUT: import_ir_inst25: {ir_id: ir4, inst_id: inst92} +// CHECK:STDOUT: import_ir_inst26: {ir_id: ir4, inst_id: inst99} +// CHECK:STDOUT: import_ir_inst27: {ir_id: ir4, inst_id: inst116} +// CHECK:STDOUT: import_ir_inst28: {ir_id: ir4, inst_id: inst111} +// CHECK:STDOUT: import_ir_inst29: {ir_id: ir4, inst_id: inst112} +// CHECK:STDOUT: import_ir_inst30: {ir_id: ir4, inst_id: inst107} +// CHECK:STDOUT: import_ir_inst31: {ir_id: ir4, inst_id: inst109} +// CHECK:STDOUT: import_ir_inst32: {ir_id: ir4, inst_id: inst80} +// CHECK:STDOUT: import_ir_inst33: {ir_id: ir4, inst_id: inst119} +// CHECK:STDOUT: import_ir_inst34: {ir_id: ir4, inst_id: inst120} +// CHECK:STDOUT: import_ir_inst35: {ir_id: ir4, inst_id: inst102} +// CHECK:STDOUT: import_ir_inst36: {ir_id: ir4, inst_id: inst103} +// CHECK:STDOUT: import_ir_inst37: {ir_id: ir4, inst_id: inst104} +// CHECK:STDOUT: import_ir_inst38: {ir_id: ir4, inst_id: inst108} +// CHECK:STDOUT: import_ir_inst39: {ir_id: ir4, inst_id: inst124} +// CHECK:STDOUT: import_ir_inst40: {ir_id: ir4, inst_id: inst132} +// CHECK:STDOUT: import_ir_inst41: {ir_id: ir4, inst_id: inst139} +// CHECK:STDOUT: import_ir_inst42: {ir_id: ir4, inst_id: inst144} +// CHECK:STDOUT: import_ir_inst43: {ir_id: ir4, inst_id: inst145} +// CHECK:STDOUT: import_ir_inst44: {ir_id: ir4, inst_id: inst146} +// CHECK:STDOUT: import_ir_inst45: {ir_id: ir4, inst_id: inst151} +// CHECK:STDOUT: import_ir_inst46: {ir_id: ir4, inst_id: inst171} +// CHECK:STDOUT: import_ir_inst47: {ir_id: ir4, inst_id: inst169} +// CHECK:STDOUT: import_ir_inst48: {ir_id: ir4, inst_id: inst167} +// CHECK:STDOUT: import_ir_inst49: {ir_id: ir4, inst_id: inst168} +// CHECK:STDOUT: import_ir_inst50: {ir_id: ir4, inst_id: inst195} +// CHECK:STDOUT: import_ir_inst51: {ir_id: ir4, inst_id: inst193} // CHECK:STDOUT: import_ir_inst52: {ir_id: ir4, inst_id: inst191} -// CHECK:STDOUT: import_ir_inst53: {ir_id: ir4, inst_id: inst195} -// CHECK:STDOUT: import_ir_inst54: {ir_id: ir4, inst_id: inst216} -// CHECK:STDOUT: import_ir_inst55: {ir_id: ir4, inst_id: inst214} -// CHECK:STDOUT: import_ir_inst56: {ir_id: ir4, inst_id: inst(TypeType)} -// CHECK:STDOUT: import_ir_inst57: {ir_id: ir4, inst_id: inst213} -// CHECK:STDOUT: import_ir_inst58: {ir_id: ir4, inst_id: inst237} -// CHECK:STDOUT: import_ir_inst59: {ir_id: ir4, inst_id: inst235} -// CHECK:STDOUT: import_ir_inst60: {ir_id: ir4, inst_id: inst233} -// CHECK:STDOUT: import_ir_inst61: {ir_id: ir4, inst_id: inst234} -// CHECK:STDOUT: import_ir_inst62: {ir_id: ir4, inst_id: inst288} -// CHECK:STDOUT: import_ir_inst63: {ir_id: ir4, inst_id: inst286} -// CHECK:STDOUT: import_ir_inst64: {ir_id: ir4, inst_id: inst266} -// CHECK:STDOUT: import_ir_inst65: {ir_id: ir4, inst_id: inst260} -// CHECK:STDOUT: import_ir_inst66: {ir_id: ir4, inst_id: inst256} -// CHECK:STDOUT: import_ir_inst67: {ir_id: ir4, inst_id: inst263} -// CHECK:STDOUT: import_ir_inst68: {ir_id: ir4, inst_id: inst281} -// CHECK:STDOUT: import_ir_inst69: {ir_id: ir4, inst_id: inst283} -// CHECK:STDOUT: import_ir_inst70: {ir_id: ir4, inst_id: inst310} -// CHECK:STDOUT: import_ir_inst71: {ir_id: ir4, inst_id: inst287} -// CHECK:STDOUT: import_ir_inst72: {ir_id: ir4, inst_id: inst258} -// CHECK:STDOUT: import_ir_inst73: {ir_id: ir4, inst_id: inst265} -// CHECK:STDOUT: import_ir_inst74: {ir_id: ir4, inst_id: inst274} -// CHECK:STDOUT: import_ir_inst75: {ir_id: ir4, inst_id: inst278} -// CHECK:STDOUT: import_ir_inst76: {ir_id: ir4, inst_id: inst282} -// CHECK:STDOUT: import_ir_inst77: {ir_id: ir4, inst_id: inst290} -// CHECK:STDOUT: import_ir_inst78: {ir_id: ir4, inst_id: inst310} -// CHECK:STDOUT: import_ir_inst79: {ir_id: ir4, inst_id: inst305} -// CHECK:STDOUT: import_ir_inst80: {ir_id: ir4, inst_id: inst306} -// CHECK:STDOUT: import_ir_inst81: {ir_id: ir4, inst_id: inst301} -// CHECK:STDOUT: import_ir_inst82: {ir_id: ir4, inst_id: inst303} -// CHECK:STDOUT: import_ir_inst83: {ir_id: ir4, inst_id: inst256} -// CHECK:STDOUT: import_ir_inst84: {ir_id: ir4, inst_id: inst263} -// CHECK:STDOUT: import_ir_inst85: {ir_id: ir4, inst_id: inst313} -// CHECK:STDOUT: import_ir_inst86: {ir_id: ir4, inst_id: inst314} -// CHECK:STDOUT: import_ir_inst87: {ir_id: ir4, inst_id: inst294} -// CHECK:STDOUT: import_ir_inst88: {ir_id: ir4, inst_id: inst295} -// CHECK:STDOUT: import_ir_inst89: {ir_id: ir4, inst_id: inst296} -// CHECK:STDOUT: import_ir_inst90: {ir_id: ir4, inst_id: inst297} -// CHECK:STDOUT: import_ir_inst91: {ir_id: ir4, inst_id: inst298} -// CHECK:STDOUT: import_ir_inst92: {ir_id: ir4, inst_id: inst302} -// CHECK:STDOUT: import_ir_inst93: {ir_id: ir4, inst_id: inst319} -// CHECK:STDOUT: import_ir_inst94: {ir_id: ir4, inst_id: inst328} -// CHECK:STDOUT: import_ir_inst95: {ir_id: ir4, inst_id: inst335} -// CHECK:STDOUT: import_ir_inst96: {ir_id: ir4, inst_id: inst340} -// CHECK:STDOUT: import_ir_inst97: {ir_id: ir4, inst_id: inst341} -// CHECK:STDOUT: import_ir_inst98: {ir_id: ir4, inst_id: inst342} -// CHECK:STDOUT: import_ir_inst99: {ir_id: ir4, inst_id: inst347} -// CHECK:STDOUT: import_ir_inst100: {ir_id: ir4, inst_id: inst358} -// CHECK:STDOUT: import_ir_inst101: {ir_id: ir4, inst_id: inst365} +// CHECK:STDOUT: import_ir_inst53: {ir_id: ir4, inst_id: inst192} +// CHECK:STDOUT: import_ir_inst54: {ir_id: ir4, inst_id: inst219} +// CHECK:STDOUT: import_ir_inst55: {ir_id: ir4, inst_id: inst217} +// CHECK:STDOUT: import_ir_inst56: {ir_id: ir4, inst_id: inst215} +// CHECK:STDOUT: import_ir_inst57: {ir_id: ir4, inst_id: inst216} +// CHECK:STDOUT: import_ir_inst58: {ir_id: ir4, inst_id: inst243} +// CHECK:STDOUT: import_ir_inst59: {ir_id: ir4, inst_id: inst241} +// CHECK:STDOUT: import_ir_inst60: {ir_id: ir4, inst_id: inst239} +// CHECK:STDOUT: import_ir_inst61: {ir_id: ir4, inst_id: inst240} +// CHECK:STDOUT: import_ir_inst62: {ir_id: ir4, inst_id: inst272} +// CHECK:STDOUT: import_ir_inst63: {ir_id: ir4, inst_id: inst270} +// CHECK:STDOUT: import_ir_inst64: {ir_id: ir4, inst_id: inst264} +// CHECK:STDOUT: import_ir_inst65: {ir_id: ir4, inst_id: inst261} +// CHECK:STDOUT: import_ir_inst66: {ir_id: ir4, inst_id: inst266} +// CHECK:STDOUT: import_ir_inst67: {ir_id: ir4, inst_id: inst269} +// CHECK:STDOUT: import_ir_inst68: {ir_id: ir4, inst_id: inst289} +// CHECK:STDOUT: import_ir_inst69: {ir_id: ir4, inst_id: inst271} +// CHECK:STDOUT: import_ir_inst70: {ir_id: ir4, inst_id: inst263} +// CHECK:STDOUT: import_ir_inst71: {ir_id: ir4, inst_id: inst268} +// CHECK:STDOUT: import_ir_inst72: {ir_id: ir4, inst_id: inst274} +// CHECK:STDOUT: import_ir_inst73: {ir_id: ir4, inst_id: inst289} +// CHECK:STDOUT: import_ir_inst74: {ir_id: ir4, inst_id: inst284} +// CHECK:STDOUT: import_ir_inst75: {ir_id: ir4, inst_id: inst285} +// CHECK:STDOUT: import_ir_inst76: {ir_id: ir4, inst_id: inst280} +// CHECK:STDOUT: import_ir_inst77: {ir_id: ir4, inst_id: inst282} +// CHECK:STDOUT: import_ir_inst78: {ir_id: ir4, inst_id: inst261} +// CHECK:STDOUT: import_ir_inst79: {ir_id: ir4, inst_id: inst292} +// CHECK:STDOUT: import_ir_inst80: {ir_id: ir4, inst_id: inst293} +// CHECK:STDOUT: import_ir_inst81: {ir_id: ir4, inst_id: inst296} +// CHECK:STDOUT: import_ir_inst82: {ir_id: ir4, inst_id: inst276} +// CHECK:STDOUT: import_ir_inst83: {ir_id: ir4, inst_id: inst277} +// CHECK:STDOUT: import_ir_inst84: {ir_id: ir4, inst_id: inst281} +// CHECK:STDOUT: import_ir_inst85: {ir_id: ir4, inst_id: inst302} +// CHECK:STDOUT: import_ir_inst86: {ir_id: ir4, inst_id: inst300} +// CHECK:STDOUT: import_ir_inst87: {ir_id: ir4, inst_id: inst(TypeType)} +// CHECK:STDOUT: import_ir_inst88: {ir_id: ir4, inst_id: inst299} +// CHECK:STDOUT: import_ir_inst89: {ir_id: ir4, inst_id: inst323} +// CHECK:STDOUT: import_ir_inst90: {ir_id: ir4, inst_id: inst321} +// CHECK:STDOUT: import_ir_inst91: {ir_id: ir4, inst_id: inst319} +// CHECK:STDOUT: import_ir_inst92: {ir_id: ir4, inst_id: inst320} +// CHECK:STDOUT: import_ir_inst93: {ir_id: ir4, inst_id: inst371} +// CHECK:STDOUT: import_ir_inst94: {ir_id: ir4, inst_id: inst369} +// CHECK:STDOUT: import_ir_inst95: {ir_id: ir4, inst_id: inst350} +// CHECK:STDOUT: import_ir_inst96: {ir_id: ir4, inst_id: inst344} +// CHECK:STDOUT: import_ir_inst97: {ir_id: ir4, inst_id: inst342} +// CHECK:STDOUT: import_ir_inst98: {ir_id: ir4, inst_id: inst347} +// CHECK:STDOUT: import_ir_inst99: {ir_id: ir4, inst_id: inst364} +// CHECK:STDOUT: import_ir_inst100: {ir_id: ir4, inst_id: inst366} +// CHECK:STDOUT: import_ir_inst101: {ir_id: ir4, inst_id: inst393} // CHECK:STDOUT: import_ir_inst102: {ir_id: ir4, inst_id: inst370} -// CHECK:STDOUT: import_ir_inst103: {ir_id: ir4, inst_id: inst371} -// CHECK:STDOUT: import_ir_inst104: {ir_id: ir4, inst_id: inst372} -// CHECK:STDOUT: import_ir_inst105: {ir_id: ir4, inst_id: inst377} +// CHECK:STDOUT: import_ir_inst103: {ir_id: ir4, inst_id: inst343} +// CHECK:STDOUT: import_ir_inst104: {ir_id: ir4, inst_id: inst349} +// CHECK:STDOUT: import_ir_inst105: {ir_id: ir4, inst_id: inst357} +// CHECK:STDOUT: import_ir_inst106: {ir_id: ir4, inst_id: inst361} +// CHECK:STDOUT: import_ir_inst107: {ir_id: ir4, inst_id: inst365} +// CHECK:STDOUT: import_ir_inst108: {ir_id: ir4, inst_id: inst373} +// CHECK:STDOUT: import_ir_inst109: {ir_id: ir4, inst_id: inst393} +// CHECK:STDOUT: import_ir_inst110: {ir_id: ir4, inst_id: inst388} +// CHECK:STDOUT: import_ir_inst111: {ir_id: ir4, inst_id: inst389} +// CHECK:STDOUT: import_ir_inst112: {ir_id: ir4, inst_id: inst384} +// CHECK:STDOUT: import_ir_inst113: {ir_id: ir4, inst_id: inst386} +// CHECK:STDOUT: import_ir_inst114: {ir_id: ir4, inst_id: inst342} +// CHECK:STDOUT: import_ir_inst115: {ir_id: ir4, inst_id: inst347} +// CHECK:STDOUT: import_ir_inst116: {ir_id: ir4, inst_id: inst396} +// CHECK:STDOUT: import_ir_inst117: {ir_id: ir4, inst_id: inst397} +// CHECK:STDOUT: import_ir_inst118: {ir_id: ir4, inst_id: inst377} +// CHECK:STDOUT: import_ir_inst119: {ir_id: ir4, inst_id: inst378} +// CHECK:STDOUT: import_ir_inst120: {ir_id: ir4, inst_id: inst379} +// CHECK:STDOUT: import_ir_inst121: {ir_id: ir4, inst_id: inst380} +// CHECK:STDOUT: import_ir_inst122: {ir_id: ir4, inst_id: inst381} +// CHECK:STDOUT: import_ir_inst123: {ir_id: ir4, inst_id: inst385} +// CHECK:STDOUT: import_ir_inst124: {ir_id: ir4, inst_id: inst402} +// CHECK:STDOUT: import_ir_inst125: {ir_id: ir4, inst_id: inst410} +// CHECK:STDOUT: import_ir_inst126: {ir_id: ir4, inst_id: inst416} +// CHECK:STDOUT: import_ir_inst127: {ir_id: ir4, inst_id: inst418} +// CHECK:STDOUT: import_ir_inst128: {ir_id: ir4, inst_id: inst419} +// CHECK:STDOUT: import_ir_inst129: {ir_id: ir4, inst_id: inst420} +// CHECK:STDOUT: import_ir_inst130: {ir_id: ir4, inst_id: inst423} +// CHECK:STDOUT: import_ir_inst131: {ir_id: ir4, inst_id: inst434} +// CHECK:STDOUT: import_ir_inst132: {ir_id: ir4, inst_id: inst441} +// CHECK:STDOUT: import_ir_inst133: {ir_id: ir4, inst_id: inst446} +// CHECK:STDOUT: import_ir_inst134: {ir_id: ir4, inst_id: inst447} +// CHECK:STDOUT: import_ir_inst135: {ir_id: ir4, inst_id: inst448} +// CHECK:STDOUT: import_ir_inst136: {ir_id: ir4, inst_id: inst453} +// CHECK:STDOUT: import_ir_inst137: {ir_id: ir4, inst_id: inst509} +// CHECK:STDOUT: import_ir_inst138: {ir_id: ir4, inst_id: inst507} +// CHECK:STDOUT: import_ir_inst139: {ir_id: ir4, inst_id: inst483} +// CHECK:STDOUT: import_ir_inst140: {ir_id: ir4, inst_id: inst477} +// CHECK:STDOUT: import_ir_inst141: {ir_id: ir4, inst_id: inst472} +// CHECK:STDOUT: import_ir_inst142: {ir_id: ir4, inst_id: inst470} +// CHECK:STDOUT: import_ir_inst143: {ir_id: ir4, inst_id: inst475} +// CHECK:STDOUT: import_ir_inst144: {ir_id: ir4, inst_id: inst480} +// CHECK:STDOUT: import_ir_inst145: {ir_id: ir4, inst_id: inst501} +// CHECK:STDOUT: import_ir_inst146: {ir_id: ir4, inst_id: inst503} +// CHECK:STDOUT: import_ir_inst147: {ir_id: ir4, inst_id: inst534} +// CHECK:STDOUT: import_ir_inst148: {ir_id: ir4, inst_id: inst508} +// CHECK:STDOUT: import_ir_inst149: {ir_id: ir4, inst_id: inst471} +// CHECK:STDOUT: import_ir_inst150: {ir_id: ir4, inst_id: inst476} +// CHECK:STDOUT: import_ir_inst151: {ir_id: ir4, inst_id: inst482} +// CHECK:STDOUT: import_ir_inst152: {ir_id: ir4, inst_id: inst491} +// CHECK:STDOUT: import_ir_inst153: {ir_id: ir4, inst_id: inst494} +// CHECK:STDOUT: import_ir_inst154: {ir_id: ir4, inst_id: inst498} +// CHECK:STDOUT: import_ir_inst155: {ir_id: ir4, inst_id: inst502} +// CHECK:STDOUT: import_ir_inst156: {ir_id: ir4, inst_id: inst511} +// CHECK:STDOUT: import_ir_inst157: {ir_id: ir4, inst_id: inst534} +// CHECK:STDOUT: import_ir_inst158: {ir_id: ir4, inst_id: inst529} +// CHECK:STDOUT: import_ir_inst159: {ir_id: ir4, inst_id: inst530} +// CHECK:STDOUT: import_ir_inst160: {ir_id: ir4, inst_id: inst525} +// CHECK:STDOUT: import_ir_inst161: {ir_id: ir4, inst_id: inst527} +// CHECK:STDOUT: import_ir_inst162: {ir_id: ir4, inst_id: inst470} +// CHECK:STDOUT: import_ir_inst163: {ir_id: ir4, inst_id: inst475} +// CHECK:STDOUT: import_ir_inst164: {ir_id: ir4, inst_id: inst480} +// CHECK:STDOUT: import_ir_inst165: {ir_id: ir4, inst_id: inst537} +// CHECK:STDOUT: import_ir_inst166: {ir_id: ir4, inst_id: inst538} +// CHECK:STDOUT: import_ir_inst167: {ir_id: ir4, inst_id: inst516} +// CHECK:STDOUT: import_ir_inst168: {ir_id: ir4, inst_id: inst517} +// CHECK:STDOUT: import_ir_inst169: {ir_id: ir4, inst_id: inst518} +// CHECK:STDOUT: import_ir_inst170: {ir_id: ir4, inst_id: inst519} +// CHECK:STDOUT: import_ir_inst171: {ir_id: ir4, inst_id: inst520} +// CHECK:STDOUT: import_ir_inst172: {ir_id: ir4, inst_id: inst521} +// CHECK:STDOUT: import_ir_inst173: {ir_id: ir4, inst_id: inst522} +// CHECK:STDOUT: import_ir_inst174: {ir_id: ir4, inst_id: inst526} +// CHECK:STDOUT: import_ir_inst175: {ir_id: ir4, inst_id: inst543} +// CHECK:STDOUT: import_ir_inst176: {ir_id: ir4, inst_id: inst550} +// CHECK:STDOUT: import_ir_inst177: {ir_id: ir4, inst_id: inst556} +// CHECK:STDOUT: import_ir_inst178: {ir_id: ir4, inst_id: inst558} +// CHECK:STDOUT: import_ir_inst179: {ir_id: ir4, inst_id: inst559} +// CHECK:STDOUT: import_ir_inst180: {ir_id: ir4, inst_id: inst560} +// CHECK:STDOUT: import_ir_inst181: {ir_id: ir4, inst_id: inst563} +// CHECK:STDOUT: import_ir_inst182: {ir_id: ir4, inst_id: inst572} +// CHECK:STDOUT: import_ir_inst183: {ir_id: ir4, inst_id: inst578} +// CHECK:STDOUT: import_ir_inst184: {ir_id: ir4, inst_id: inst580} +// CHECK:STDOUT: import_ir_inst185: {ir_id: ir4, inst_id: inst581} +// CHECK:STDOUT: import_ir_inst186: {ir_id: ir4, inst_id: inst582} +// CHECK:STDOUT: import_ir_inst187: {ir_id: ir4, inst_id: inst585} +// CHECK:STDOUT: import_ir_inst188: {ir_id: ir4, inst_id: inst596} +// CHECK:STDOUT: import_ir_inst189: {ir_id: ir4, inst_id: inst603} +// CHECK:STDOUT: import_ir_inst190: {ir_id: ir4, inst_id: inst608} +// CHECK:STDOUT: import_ir_inst191: {ir_id: ir4, inst_id: inst609} +// CHECK:STDOUT: import_ir_inst192: {ir_id: ir4, inst_id: inst610} +// CHECK:STDOUT: import_ir_inst193: {ir_id: ir4, inst_id: inst615} // CHECK:STDOUT: name_scopes: // CHECK:STDOUT: name_scope0: {inst: inst14, parent_scope: name_scope, has_error: false, extended_scopes: [], names: {name(Core): inst16, name0: inst53}} // CHECK:STDOUT: name_scope1: {inst: inst16, parent_scope: name_scope0, has_error: false, extended_scopes: [], names: {name3: inst69}} // CHECK:STDOUT: name_scope2: {inst: inst70, parent_scope: name_scope1, has_error: false, extended_scopes: [], names: {name(SelfType): inst73, name4: inst74}} // CHECK:STDOUT: name_scope3: {inst: inst94, parent_scope: name_scope1, has_error: false, extended_scopes: [], names: {}} -// CHECK:STDOUT: name_scope4: {inst: inst98, parent_scope: name_scope1, has_error: false, extended_scopes: [], names: {}} -// CHECK:STDOUT: name_scope5: {inst: inst102, parent_scope: name_scope1, has_error: false, extended_scopes: [], names: {}} -// CHECK:STDOUT: name_scope6: {inst: inst106, parent_scope: name_scope1, has_error: false, extended_scopes: [], names: {}} -// CHECK:STDOUT: name_scope7: {inst: inst110, parent_scope: name_scope1, has_error: false, extended_scopes: [], names: {}} -// CHECK:STDOUT: name_scope8: {inst: inst136, parent_scope: name_scope1, has_error: false, extended_scopes: [], names: {}} -// CHECK:STDOUT: name_scope9: {inst: inst140, parent_scope: name_scope1, has_error: false, extended_scopes: [], names: {}} -// CHECK:STDOUT: name_scope10: {inst: inst144, parent_scope: name_scope1, has_error: false, extended_scopes: [], names: {}} +// CHECK:STDOUT: name_scope4: {inst: inst141, parent_scope: name_scope1, has_error: false, extended_scopes: [], names: {}} +// CHECK:STDOUT: name_scope5: {inst: inst145, parent_scope: name_scope1, has_error: false, extended_scopes: [], names: {}} +// CHECK:STDOUT: name_scope6: {inst: inst149, parent_scope: name_scope1, has_error: false, extended_scopes: [], names: {}} +// CHECK:STDOUT: name_scope7: {inst: inst153, parent_scope: name_scope1, has_error: false, extended_scopes: [], names: {}} +// CHECK:STDOUT: name_scope8: {inst: inst157, parent_scope: name_scope1, has_error: false, extended_scopes: [], names: {}} +// CHECK:STDOUT: name_scope9: {inst: inst183, parent_scope: name_scope1, has_error: false, extended_scopes: [], names: {}} +// CHECK:STDOUT: name_scope10: {inst: inst187, parent_scope: name_scope1, has_error: false, extended_scopes: [], names: {}} +// CHECK:STDOUT: name_scope11: {inst: inst191, parent_scope: name_scope1, has_error: false, extended_scopes: [], names: {}} +// CHECK:STDOUT: name_scope12: {inst: inst250, parent_scope: name_scope1, has_error: false, extended_scopes: [], names: {}} // CHECK:STDOUT: entity_names: // CHECK:STDOUT: entity_name0: {name: name(PeriodSelf), parent_scope: name_scope, index: -1, is_template: 0, clang_decl_id: clang_decl_id} // CHECK:STDOUT: entity_name1: {name: name1, parent_scope: name_scope, index: 0, is_template: 0, clang_decl_id: clang_decl_id} @@ -162,45 +252,81 @@ fn Foo[T:! type](p: T*) -> (T*, ()) { // CHECK:STDOUT: entity_name12: {name: name1, parent_scope: name_scope, index: 0, is_template: 0, clang_decl_id: clang_decl_id} // CHECK:STDOUT: entity_name13: {name: name(SelfValue), parent_scope: name_scope, index: -1, is_template: 0, clang_decl_id: clang_decl_id} // CHECK:STDOUT: entity_name14: {name: name1, parent_scope: name_scope, index: 0, is_template: 0, clang_decl_id: clang_decl_id} -// CHECK:STDOUT: entity_name15: {name: name5, parent_scope: name_scope, index: 1, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name15: {name: name1, parent_scope: name_scope, index: 0, is_template: 0, clang_decl_id: clang_decl_id} // CHECK:STDOUT: entity_name16: {name: name1, parent_scope: name_scope, index: 0, is_template: 0, clang_decl_id: clang_decl_id} -// CHECK:STDOUT: entity_name17: {name: name5, parent_scope: name_scope, index: 1, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name17: {name: name1, parent_scope: name_scope, index: 0, is_template: 0, clang_decl_id: clang_decl_id} // CHECK:STDOUT: entity_name18: {name: name1, parent_scope: name_scope, index: 0, is_template: 0, clang_decl_id: clang_decl_id} -// CHECK:STDOUT: entity_name19: {name: name1, parent_scope: name_scope, index: 0, is_template: 0, clang_decl_id: clang_decl_id} -// CHECK:STDOUT: entity_name20: {name: name5, parent_scope: name_scope, index: 1, is_template: 0, clang_decl_id: clang_decl_id} -// CHECK:STDOUT: entity_name21: {name: name1, parent_scope: name_scope, index: 0, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name19: {name: name(SelfValue), parent_scope: name_scope, index: -1, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name20: {name: name1, parent_scope: name_scope, index: 0, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name21: {name: name5, parent_scope: name_scope, index: 1, is_template: 0, clang_decl_id: clang_decl_id} // CHECK:STDOUT: entity_name22: {name: name5, parent_scope: name_scope, index: 1, is_template: 0, clang_decl_id: clang_decl_id} -// CHECK:STDOUT: entity_name23: {name: name(SelfValue), parent_scope: name_scope, index: -1, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name23: {name: name1, parent_scope: name_scope, index: 0, is_template: 0, clang_decl_id: clang_decl_id} // CHECK:STDOUT: entity_name24: {name: name1, parent_scope: name_scope, index: 0, is_template: 0, clang_decl_id: clang_decl_id} // CHECK:STDOUT: entity_name25: {name: name5, parent_scope: name_scope, index: 1, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name26: {name: name1, parent_scope: name_scope, index: 0, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name27: {name: name5, parent_scope: name_scope, index: 1, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name28: {name: name(SelfValue), parent_scope: name_scope, index: -1, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name29: {name: name1, parent_scope: name_scope, index: 0, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name30: {name: name5, parent_scope: name_scope, index: 1, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name31: {name: name6, parent_scope: name_scope, index: 2, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name32: {name: name6, parent_scope: name_scope, index: 2, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name33: {name: name5, parent_scope: name_scope, index: 1, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name34: {name: name1, parent_scope: name_scope, index: 0, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name35: {name: name1, parent_scope: name_scope, index: 0, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name36: {name: name5, parent_scope: name_scope, index: 1, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name37: {name: name6, parent_scope: name_scope, index: 2, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name38: {name: name1, parent_scope: name_scope, index: 0, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name39: {name: name5, parent_scope: name_scope, index: 1, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name40: {name: name6, parent_scope: name_scope, index: 2, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name41: {name: name(SelfValue), parent_scope: name_scope, index: -1, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name42: {name: name1, parent_scope: name_scope, index: 0, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name43: {name: name5, parent_scope: name_scope, index: 1, is_template: 0, clang_decl_id: clang_decl_id} +// CHECK:STDOUT: entity_name44: {name: name6, parent_scope: name_scope, index: 2, is_template: 0, clang_decl_id: clang_decl_id} // CHECK:STDOUT: functions: // CHECK:STDOUT: function0: {name: name0, parent_scope: name_scope0, call_params_id: inst_block13, return_slot_pattern: inst48, body: [inst_block20]} // CHECK:STDOUT: function1: {name: name4, parent_scope: name_scope2, return_slot_pattern: inst85} -// CHECK:STDOUT: function2: {name: name4, parent_scope: name_scope7, return_slot_pattern: inst125} -// CHECK:STDOUT: function3: {name: name4, parent_scope: name_scope10, return_slot_pattern: inst171} +// CHECK:STDOUT: function2: {name: name4, parent_scope: name_scope3, return_slot_pattern: inst115} +// CHECK:STDOUT: function3: {name: name4, parent_scope: name_scope8, return_slot_pattern: inst172} +// CHECK:STDOUT: function4: {name: name4, parent_scope: name_scope11, return_slot_pattern: inst215} +// CHECK:STDOUT: function5: {name: name4, parent_scope: name_scope12, return_slot_pattern: inst278} // CHECK:STDOUT: classes: {} // CHECK:STDOUT: generics: // CHECK:STDOUT: generic0: {decl: inst53, bindings: inst_block16} // CHECK:STDOUT: generic1: {decl: inst79, bindings: inst_block24} -// CHECK:STDOUT: generic2: {decl: inst110, bindings: inst_block29} -// CHECK:STDOUT: generic3: {decl: inst121, bindings: inst_block35} -// CHECK:STDOUT: generic4: {decl: inst144, bindings: inst_block42} -// CHECK:STDOUT: generic5: {decl: inst166, bindings: inst_block50} +// CHECK:STDOUT: generic2: {decl: inst94, bindings: inst_block29} +// CHECK:STDOUT: generic3: {decl: inst110, bindings: inst_block36} +// CHECK:STDOUT: generic4: {decl: inst157, bindings: inst_block49} +// CHECK:STDOUT: generic5: {decl: inst168, bindings: inst_block55} +// CHECK:STDOUT: generic6: {decl: inst191, bindings: inst_block62} +// CHECK:STDOUT: generic7: {decl: inst210, bindings: inst_block70} +// CHECK:STDOUT: generic8: {decl: inst250, bindings: inst_block87} +// CHECK:STDOUT: generic9: {decl: inst273, bindings: inst_block95} // CHECK:STDOUT: specifics: // CHECK:STDOUT: specific0: {generic: generic0, args: inst_block17} // CHECK:STDOUT: specific1: {generic: generic1, args: inst_block26} -// CHECK:STDOUT: specific2: {generic: generic2, args: inst_block17} -// CHECK:STDOUT: specific3: {generic: generic2, args: inst_block31} -// CHECK:STDOUT: specific4: {generic: generic3, args: inst_block17} -// CHECK:STDOUT: specific5: {generic: generic4, args: inst_block44} -// CHECK:STDOUT: specific6: {generic: generic4, args: inst_block46} -// CHECK:STDOUT: specific7: {generic: generic5, args: inst_block44} -// CHECK:STDOUT: specific8: {generic: generic1, args: inst_block57} -// CHECK:STDOUT: specific9: {generic: generic1, args: inst_block59} -// CHECK:STDOUT: specific10: {generic: generic1, args: inst_block61} -// CHECK:STDOUT: specific11: {generic: generic1, args: inst_block63} -// CHECK:STDOUT: specific12: {generic: generic1, args: inst_block71} -// CHECK:STDOUT: specific13: {generic: generic1, args: inst_block73} +// CHECK:STDOUT: specific2: {generic: generic2, args: inst_block31} +// CHECK:STDOUT: specific3: {generic: generic2, args: inst_block32} +// CHECK:STDOUT: specific4: {generic: generic3, args: inst_block31} +// CHECK:STDOUT: specific5: {generic: generic1, args: inst_block42} +// CHECK:STDOUT: specific6: {generic: generic1, args: inst_block44} +// CHECK:STDOUT: specific7: {generic: generic4, args: inst_block17} +// CHECK:STDOUT: specific8: {generic: generic4, args: inst_block51} +// CHECK:STDOUT: specific9: {generic: generic5, args: inst_block17} +// CHECK:STDOUT: specific10: {generic: generic6, args: inst_block64} +// CHECK:STDOUT: specific11: {generic: generic6, args: inst_block66} +// CHECK:STDOUT: specific12: {generic: generic7, args: inst_block64} +// CHECK:STDOUT: specific13: {generic: generic1, args: inst_block77} +// CHECK:STDOUT: specific14: {generic: generic1, args: inst_block79} +// CHECK:STDOUT: specific15: {generic: generic1, args: inst_block81} +// CHECK:STDOUT: specific16: {generic: generic8, args: inst_block89} +// CHECK:STDOUT: specific17: {generic: generic8, args: inst_block91} +// CHECK:STDOUT: specific18: {generic: generic9, args: inst_block89} +// CHECK:STDOUT: specific19: {generic: generic1, args: inst_block102} +// CHECK:STDOUT: specific20: {generic: generic1, args: inst_block104} +// CHECK:STDOUT: specific21: {generic: generic1, args: inst_block106} +// CHECK:STDOUT: specific22: {generic: generic1, args: inst_block108} +// CHECK:STDOUT: specific23: {generic: generic1, args: inst_block115} +// CHECK:STDOUT: specific24: {generic: generic1, args: inst_block117} // CHECK:STDOUT: struct_type_fields: // CHECK:STDOUT: struct_type_fields0: {} // CHECK:STDOUT: types: @@ -234,9 +360,9 @@ fn Foo[T:! type](p: T*) -> (T*, ()) { // CHECK:STDOUT: value_repr: {kind: copy, type: type(inst71)} // CHECK:STDOUT: 'type(inst(SpecificFunctionType))': // CHECK:STDOUT: value_repr: {kind: copy, type: type(inst(SpecificFunctionType))} -// CHECK:STDOUT: 'type(symbolic_constant133)': +// CHECK:STDOUT: 'type(symbolic_constant268)': // CHECK:STDOUT: value_repr: {kind: none, type: type(inst36)} -// CHECK:STDOUT: 'type(symbolic_constant136)': +// CHECK:STDOUT: 'type(symbolic_constant271)': // CHECK:STDOUT: value_repr: {kind: none, type: type(inst36)} // CHECK:STDOUT: 'type(inst(BoundMethodType))': // CHECK:STDOUT: value_repr: {kind: copy, type: type(inst(BoundMethodType))} @@ -322,147 +448,256 @@ fn Foo[T:! type](p: T*) -> (T*, ()) { // CHECK:STDOUT: inst92: {kind: LookupImplWitness, arg0: inst27, arg1: specific_interface0, type: type(inst(WitnessType))} // CHECK:STDOUT: inst93: {kind: ImportRefUnloaded, arg0: import_ir_inst15, arg1: entity_name} // CHECK:STDOUT: inst94: {kind: ImplDecl, arg0: impl0, arg1: inst_block_empty} -// CHECK:STDOUT: inst95: {kind: ImportRefLoaded, arg0: import_ir_inst17, arg1: entity_name, type: type(TypeType)} -// CHECK:STDOUT: inst96: {kind: ImportRefLoaded, arg0: import_ir_inst18, arg1: entity_name, type: type(TypeType)} -// CHECK:STDOUT: inst97: {kind: ImportRefUnloaded, arg0: import_ir_inst19, arg1: entity_name} -// CHECK:STDOUT: inst98: {kind: ImplDecl, arg0: impl1, arg1: inst_block_empty} -// CHECK:STDOUT: inst99: {kind: ImportRefLoaded, arg0: import_ir_inst21, arg1: entity_name, type: type(TypeType)} -// CHECK:STDOUT: inst100: {kind: ImportRefLoaded, arg0: import_ir_inst22, arg1: entity_name, type: type(TypeType)} -// CHECK:STDOUT: inst101: {kind: ImportRefUnloaded, arg0: import_ir_inst23, arg1: entity_name} -// CHECK:STDOUT: inst102: {kind: ImplDecl, arg0: impl2, arg1: inst_block_empty} -// CHECK:STDOUT: inst103: {kind: ImportRefLoaded, arg0: import_ir_inst25, arg1: entity_name, type: type(TypeType)} -// CHECK:STDOUT: inst104: {kind: ImportRefLoaded, arg0: import_ir_inst26, arg1: entity_name, type: type(TypeType)} -// CHECK:STDOUT: inst105: {kind: ImportRefUnloaded, arg0: import_ir_inst27, arg1: entity_name} -// CHECK:STDOUT: inst106: {kind: ImplDecl, arg0: impl3, arg1: inst_block_empty} -// CHECK:STDOUT: inst107: {kind: ImportRefLoaded, arg0: import_ir_inst29, arg1: entity_name, type: type(TypeType)} -// CHECK:STDOUT: inst108: {kind: ImportRefLoaded, arg0: import_ir_inst30, arg1: entity_name, type: type(TypeType)} -// CHECK:STDOUT: inst109: {kind: ImportRefLoaded, arg0: import_ir_inst31, arg1: entity_name, type: type(inst(WitnessType))} -// CHECK:STDOUT: inst110: {kind: ImplDecl, arg0: impl4, arg1: inst_block_empty} -// CHECK:STDOUT: inst111: {kind: SymbolicBindingPattern, arg0: entity_name10, type: type(inst23)} -// CHECK:STDOUT: inst112: {kind: ImportRefLoaded, arg0: import_ir_inst34, arg1: entity_name, type: type(TypeType)} -// CHECK:STDOUT: inst113: {kind: ImportRefLoaded, arg0: import_ir_inst35, arg1: entity_name, type: type(TypeType)} -// CHECK:STDOUT: inst114: {kind: ImportRefLoaded, arg0: import_ir_inst36, arg1: entity_name, type: type(TypeType)} -// CHECK:STDOUT: inst115: {kind: ImportRefUnloaded, arg0: import_ir_inst37, arg1: entity_name} -// CHECK:STDOUT: inst116: {kind: ImplWitnessTable, arg0: inst_block30, arg1: impl4} -// CHECK:STDOUT: inst117: {kind: ImplWitness, arg0: inst116, arg1: specific2, type: type(inst(WitnessType))} -// CHECK:STDOUT: inst118: {kind: BindSymbolicName, arg0: entity_name1, arg1: inst, type: type(TypeType)} -// CHECK:STDOUT: inst119: {kind: PointerType, arg0: inst118, type: type(TypeType)} -// CHECK:STDOUT: inst120: {kind: ImplWitness, arg0: inst116, arg1: specific3, type: type(inst(WitnessType))} -// CHECK:STDOUT: inst121: {kind: FunctionDecl, arg0: function2, arg1: inst_block_empty, type: type(symbolic_constant33)} -// CHECK:STDOUT: inst122: {kind: FunctionType, arg0: function2, arg1: specific2, type: type(TypeType)} -// CHECK:STDOUT: inst123: {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant33)} -// CHECK:STDOUT: inst124: {kind: ReturnSlotPattern, arg0: inst, type: type(symbolic_constant37)} -// CHECK:STDOUT: inst125: {kind: OutParamPattern, arg0: inst124, arg1: call_param1, type: type(symbolic_constant37)} -// CHECK:STDOUT: inst126: {kind: BindingPattern, arg0: entity_name13, type: type(symbolic_constant37)} -// CHECK:STDOUT: inst127: {kind: ValueParamPattern, arg0: inst126, arg1: call_param0, type: type(symbolic_constant37)} -// CHECK:STDOUT: inst128: {kind: ImportRefLoaded, arg0: import_ir_inst47, arg1: entity_name, type: type(TypeType)} -// CHECK:STDOUT: inst129: {kind: FunctionType, arg0: function2, arg1: specific3, type: type(TypeType)} -// CHECK:STDOUT: inst130: {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant40)} -// CHECK:STDOUT: inst131: {kind: RequireCompleteType, arg0: inst119, type: type(inst(WitnessType))} -// CHECK:STDOUT: inst132: {kind: BindSymbolicName, arg0: entity_name1, arg1: inst, type: type(TypeType)} -// CHECK:STDOUT: inst133: {kind: PointerType, arg0: inst132, type: type(TypeType)} -// CHECK:STDOUT: inst134: {kind: PatternType, arg0: inst133, type: type(TypeType)} -// CHECK:STDOUT: inst135: {kind: ImportRefUnloaded, arg0: import_ir_inst54, arg1: entity_name} -// CHECK:STDOUT: inst136: {kind: ImplDecl, arg0: impl5, arg1: inst_block_empty} -// CHECK:STDOUT: inst137: {kind: ImportRefLoaded, arg0: import_ir_inst56, arg1: entity_name, type: type(TypeType)} -// CHECK:STDOUT: inst138: {kind: ImportRefLoaded, arg0: import_ir_inst57, arg1: entity_name, type: type(TypeType)} -// CHECK:STDOUT: inst139: {kind: ImportRefUnloaded, arg0: import_ir_inst58, arg1: entity_name} -// CHECK:STDOUT: inst140: {kind: ImplDecl, arg0: impl6, arg1: inst_block_empty} -// CHECK:STDOUT: inst141: {kind: ImportRefLoaded, arg0: import_ir_inst60, arg1: entity_name, type: type(TypeType)} -// CHECK:STDOUT: inst142: {kind: ImportRefLoaded, arg0: import_ir_inst61, arg1: entity_name, type: type(TypeType)} -// CHECK:STDOUT: inst143: {kind: ImportRefUnloaded, arg0: import_ir_inst62, arg1: entity_name} -// CHECK:STDOUT: inst144: {kind: ImplDecl, arg0: impl7, arg1: inst_block_empty} -// CHECK:STDOUT: inst145: {kind: BindSymbolicName, arg0: entity_name15, arg1: inst, type: type(inst71)} -// CHECK:STDOUT: inst146: {kind: FacetAccessType, arg0: inst145, type: type(TypeType)} -// CHECK:STDOUT: inst147: {kind: BindSymbolicName, arg0: entity_name1, arg1: inst, type: type(inst71)} -// CHECK:STDOUT: inst148: {kind: FacetAccessType, arg0: inst147, type: type(TypeType)} -// CHECK:STDOUT: inst149: {kind: TupleType, arg0: inst_block40, type: type(TypeType)} -// CHECK:STDOUT: inst150: {kind: PatternType, arg0: inst71, type: type(TypeType)} -// CHECK:STDOUT: inst151: {kind: SymbolicBindingPattern, arg0: entity_name17, type: type(inst150)} -// CHECK:STDOUT: inst152: {kind: SymbolicBindingPattern, arg0: entity_name18, type: type(inst150)} -// CHECK:STDOUT: inst153: {kind: ImportRefLoaded, arg0: import_ir_inst66, arg1: entity_name, type: type(inst71)} -// CHECK:STDOUT: inst154: {kind: ImportRefLoaded, arg0: import_ir_inst67, arg1: entity_name, type: type(inst71)} -// CHECK:STDOUT: inst155: {kind: ImportRefLoaded, arg0: import_ir_inst68, arg1: entity_name, type: type(TypeType)} -// CHECK:STDOUT: inst156: {kind: ImportRefLoaded, arg0: import_ir_inst69, arg1: entity_name, type: type(TypeType)} -// CHECK:STDOUT: inst157: {kind: ImportRefUnloaded, arg0: import_ir_inst70, arg1: entity_name} -// CHECK:STDOUT: inst158: {kind: ImplWitnessTable, arg0: inst_block43, arg1: impl7} -// CHECK:STDOUT: inst159: {kind: ImplWitness, arg0: inst158, arg1: specific5, type: type(inst(WitnessType))} -// CHECK:STDOUT: inst160: {kind: BindSymbolicName, arg0: entity_name1, arg1: inst, type: type(inst71)} -// CHECK:STDOUT: inst161: {kind: BindSymbolicName, arg0: entity_name15, arg1: inst, type: type(inst71)} -// CHECK:STDOUT: inst162: {kind: FacetAccessType, arg0: inst160, type: type(TypeType)} -// CHECK:STDOUT: inst163: {kind: FacetAccessType, arg0: inst161, type: type(TypeType)} -// CHECK:STDOUT: inst164: {kind: TupleType, arg0: inst_block45, type: type(TypeType)} -// CHECK:STDOUT: inst165: {kind: ImplWitness, arg0: inst158, arg1: specific6, type: type(inst(WitnessType))} -// CHECK:STDOUT: inst166: {kind: FunctionDecl, arg0: function3, arg1: inst_block_empty, type: type(symbolic_constant68)} -// CHECK:STDOUT: inst167: {kind: FunctionType, arg0: function3, arg1: specific5, type: type(TypeType)} -// CHECK:STDOUT: inst168: {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant68)} -// CHECK:STDOUT: inst169: {kind: PatternType, arg0: inst149, type: type(TypeType)} -// CHECK:STDOUT: inst170: {kind: ReturnSlotPattern, arg0: inst, type: type(symbolic_constant73)} -// CHECK:STDOUT: inst171: {kind: OutParamPattern, arg0: inst170, arg1: call_param1, type: type(symbolic_constant73)} -// CHECK:STDOUT: inst172: {kind: BindingPattern, arg0: entity_name23, type: type(symbolic_constant73)} -// CHECK:STDOUT: inst173: {kind: ValueParamPattern, arg0: inst172, arg1: call_param0, type: type(symbolic_constant73)} -// CHECK:STDOUT: inst174: {kind: ImportRefLoaded, arg0: import_ir_inst83, arg1: entity_name, type: type(inst71)} -// CHECK:STDOUT: inst175: {kind: ImportRefLoaded, arg0: import_ir_inst84, arg1: entity_name, type: type(inst71)} -// CHECK:STDOUT: inst176: {kind: FunctionType, arg0: function3, arg1: specific6, type: type(TypeType)} -// CHECK:STDOUT: inst177: {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant75)} -// CHECK:STDOUT: inst178: {kind: BindSymbolicName, arg0: entity_name1, arg1: inst, type: type(inst71)} -// CHECK:STDOUT: inst179: {kind: FacetAccessType, arg0: inst178, type: type(TypeType)} -// CHECK:STDOUT: inst180: {kind: BindSymbolicName, arg0: entity_name15, arg1: inst, type: type(inst71)} -// CHECK:STDOUT: inst181: {kind: FacetAccessType, arg0: inst180, type: type(TypeType)} -// CHECK:STDOUT: inst182: {kind: TupleType, arg0: inst_block53, type: type(TypeType)} -// CHECK:STDOUT: inst183: {kind: PatternType, arg0: inst182, type: type(TypeType)} -// CHECK:STDOUT: inst184: {kind: RequireCompleteType, arg0: inst149, type: type(inst(WitnessType))} -// CHECK:STDOUT: inst185: {kind: RequireCompleteType, arg0: inst148, type: type(inst(WitnessType))} -// CHECK:STDOUT: inst186: {kind: LookupImplWitness, arg0: inst147, arg1: specific_interface0, type: type(inst(WitnessType))} -// CHECK:STDOUT: inst187: {kind: FacetValue, arg0: inst148, arg1: inst_block56, type: type(inst71)} -// CHECK:STDOUT: inst188: {kind: FunctionTypeWithSelfType, arg0: inst80, arg1: inst187, type: type(TypeType)} -// CHECK:STDOUT: inst189: {kind: ImplWitnessAccess, arg0: inst186, arg1: element0, type: type(symbolic_constant96)} -// CHECK:STDOUT: inst190: {kind: SpecificImplFunction, arg0: inst189, arg1: specific8, type: type(inst(SpecificFunctionType))} -// CHECK:STDOUT: inst191: {kind: RequireCompleteType, arg0: inst146, type: type(inst(WitnessType))} -// CHECK:STDOUT: inst192: {kind: LookupImplWitness, arg0: inst145, arg1: specific_interface0, type: type(inst(WitnessType))} -// CHECK:STDOUT: inst193: {kind: FacetValue, arg0: inst146, arg1: inst_block58, type: type(inst71)} -// CHECK:STDOUT: inst194: {kind: FunctionTypeWithSelfType, arg0: inst80, arg1: inst193, type: type(TypeType)} -// CHECK:STDOUT: inst195: {kind: ImplWitnessAccess, arg0: inst192, arg1: element0, type: type(symbolic_constant108)} -// CHECK:STDOUT: inst196: {kind: SpecificImplFunction, arg0: inst195, arg1: specific9, type: type(inst(SpecificFunctionType))} -// CHECK:STDOUT: inst197: {kind: RequireCompleteType, arg0: inst182, type: type(inst(WitnessType))} -// CHECK:STDOUT: inst198: {kind: RequireCompleteType, arg0: inst179, type: type(inst(WitnessType))} -// CHECK:STDOUT: inst199: {kind: LookupImplWitness, arg0: inst178, arg1: specific_interface0, type: type(inst(WitnessType))} -// CHECK:STDOUT: inst200: {kind: FacetValue, arg0: inst179, arg1: inst_block60, type: type(inst71)} -// CHECK:STDOUT: inst201: {kind: FunctionTypeWithSelfType, arg0: inst80, arg1: inst200, type: type(TypeType)} -// CHECK:STDOUT: inst202: {kind: ImplWitnessAccess, arg0: inst199, arg1: element0, type: type(symbolic_constant118)} -// CHECK:STDOUT: inst203: {kind: SpecificImplFunction, arg0: inst202, arg1: specific10, type: type(inst(SpecificFunctionType))} -// CHECK:STDOUT: inst204: {kind: RequireCompleteType, arg0: inst181, type: type(inst(WitnessType))} -// CHECK:STDOUT: inst205: {kind: LookupImplWitness, arg0: inst180, arg1: specific_interface0, type: type(inst(WitnessType))} -// CHECK:STDOUT: inst206: {kind: FacetValue, arg0: inst181, arg1: inst_block62, type: type(inst71)} -// CHECK:STDOUT: inst207: {kind: FunctionTypeWithSelfType, arg0: inst80, arg1: inst206, type: type(TypeType)} -// CHECK:STDOUT: inst208: {kind: ImplWitnessAccess, arg0: inst205, arg1: element0, type: type(symbolic_constant124)} -// CHECK:STDOUT: inst209: {kind: SpecificImplFunction, arg0: inst208, arg1: specific11, type: type(inst(SpecificFunctionType))} -// CHECK:STDOUT: inst210: {kind: PatternType, arg0: inst146, type: type(TypeType)} -// CHECK:STDOUT: inst211: {kind: PatternType, arg0: inst148, type: type(TypeType)} -// CHECK:STDOUT: inst212: {kind: LookupImplWitness, arg0: inst27, arg1: specific_interface0, type: type(inst(WitnessType))} -// CHECK:STDOUT: inst213: {kind: LookupImplWitness, arg0: inst28, arg1: specific_interface0, type: type(inst(WitnessType))} -// CHECK:STDOUT: inst214: {kind: FacetValue, arg0: inst27, arg1: inst_block69, type: type(inst71)} -// CHECK:STDOUT: inst215: {kind: FunctionTypeWithSelfType, arg0: inst80, arg1: inst214, type: type(TypeType)} -// CHECK:STDOUT: inst216: {kind: ImplWitnessAccess, arg0: inst212, arg1: element0, type: type(symbolic_constant136)} -// CHECK:STDOUT: inst217: {kind: ImplWitnessAccess, arg0: inst212, arg1: element0, type: type(symbolic_constant133)} -// CHECK:STDOUT: inst218: {kind: FacetValue, arg0: inst28, arg1: inst_block70, type: type(inst71)} -// CHECK:STDOUT: inst219: {kind: FunctionTypeWithSelfType, arg0: inst80, arg1: inst218, type: type(TypeType)} -// CHECK:STDOUT: inst220: {kind: ImplWitnessAccess, arg0: inst213, arg1: element0, type: type(symbolic_constant136)} -// CHECK:STDOUT: inst221: {kind: BoundMethod, arg0: inst63, arg1: inst216, type: type(inst(BoundMethodType))} -// CHECK:STDOUT: inst222: {kind: SpecificImplFunction, arg0: inst216, arg1: specific12, type: type(inst(SpecificFunctionType))} -// CHECK:STDOUT: inst223: {kind: SpecificImplFunction, arg0: inst217, arg1: specific12, type: type(inst(SpecificFunctionType))} -// CHECK:STDOUT: inst224: {kind: SpecificImplFunction, arg0: inst220, arg1: specific13, type: type(inst(SpecificFunctionType))} -// CHECK:STDOUT: inst225: {kind: BoundMethod, arg0: inst63, arg1: inst222, type: type(inst(BoundMethodType))} -// CHECK:STDOUT: inst226: {kind: RequireCompleteType, arg0: inst27, type: type(inst(WitnessType))} -// CHECK:STDOUT: inst227: {kind: Call, arg0: inst225, arg1: inst_block74, type: type(symbolic_constant4)} -// CHECK:STDOUT: inst228: {kind: InitializeFrom, arg0: inst227, arg1: inst67, type: type(symbolic_constant4)} -// CHECK:STDOUT: inst229: {kind: TupleAccess, arg0: inst52, arg1: element1, type: type(inst36)} -// CHECK:STDOUT: inst230: {kind: TupleInit, arg0: inst_block_empty, arg1: inst229, type: type(inst36)} -// CHECK:STDOUT: inst231: {kind: TupleValue, arg0: inst_block_empty, type: type(inst36)} -// CHECK:STDOUT: inst232: {kind: Converted, arg0: inst64, arg1: inst230, type: type(inst36)} -// CHECK:STDOUT: inst233: {kind: TupleInit, arg0: inst_block75, arg1: inst52, type: type(symbolic_constant8)} -// CHECK:STDOUT: inst234: {kind: Converted, arg0: inst65, arg1: inst233, type: type(symbolic_constant8)} -// CHECK:STDOUT: inst235: {kind: ReturnExpr, arg0: inst234, arg1: inst52} +// CHECK:STDOUT: inst95: {kind: BindSymbolicName, arg0: entity_name1, arg1: inst, type: type(inst71)} +// CHECK:STDOUT: inst96: {kind: FacetAccessType, arg0: inst95, type: type(TypeType)} +// CHECK:STDOUT: inst97: {kind: ConstType, arg0: inst96, type: type(TypeType)} +// CHECK:STDOUT: inst98: {kind: PatternType, arg0: inst71, type: type(TypeType)} +// CHECK:STDOUT: inst99: {kind: SymbolicBindingPattern, arg0: entity_name10, type: type(inst98)} +// CHECK:STDOUT: inst100: {kind: ImportRefLoaded, arg0: import_ir_inst18, arg1: entity_name, type: type(inst71)} +// CHECK:STDOUT: inst101: {kind: ImportRefLoaded, arg0: import_ir_inst19, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst102: {kind: ImportRefLoaded, arg0: import_ir_inst20, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst103: {kind: ImportRefUnloaded, arg0: import_ir_inst21, arg1: entity_name} +// CHECK:STDOUT: inst104: {kind: ImplWitnessTable, arg0: inst_block30, arg1: impl0} +// CHECK:STDOUT: inst105: {kind: ImplWitness, arg0: inst104, arg1: specific2, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst106: {kind: BindSymbolicName, arg0: entity_name1, arg1: inst, type: type(inst71)} +// CHECK:STDOUT: inst107: {kind: FacetAccessType, arg0: inst106, type: type(TypeType)} +// CHECK:STDOUT: inst108: {kind: ConstType, arg0: inst107, type: type(TypeType)} +// CHECK:STDOUT: inst109: {kind: ImplWitness, arg0: inst104, arg1: specific3, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst110: {kind: FunctionDecl, arg0: function2, arg1: inst_block_empty, type: type(symbolic_constant38)} +// CHECK:STDOUT: inst111: {kind: FunctionType, arg0: function2, arg1: specific2, type: type(TypeType)} +// CHECK:STDOUT: inst112: {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant38)} +// CHECK:STDOUT: inst113: {kind: PatternType, arg0: inst97, type: type(TypeType)} +// CHECK:STDOUT: inst114: {kind: ReturnSlotPattern, arg0: inst, type: type(symbolic_constant43)} +// CHECK:STDOUT: inst115: {kind: OutParamPattern, arg0: inst114, arg1: call_param1, type: type(symbolic_constant43)} +// CHECK:STDOUT: inst116: {kind: BindingPattern, arg0: entity_name13, type: type(symbolic_constant43)} +// CHECK:STDOUT: inst117: {kind: ValueParamPattern, arg0: inst116, arg1: call_param0, type: type(symbolic_constant43)} +// CHECK:STDOUT: inst118: {kind: ImportRefLoaded, arg0: import_ir_inst32, arg1: entity_name, type: type(inst71)} +// CHECK:STDOUT: inst119: {kind: FunctionType, arg0: function2, arg1: specific3, type: type(TypeType)} +// CHECK:STDOUT: inst120: {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant45)} +// CHECK:STDOUT: inst121: {kind: BindSymbolicName, arg0: entity_name1, arg1: inst, type: type(inst71)} +// CHECK:STDOUT: inst122: {kind: FacetAccessType, arg0: inst121, type: type(TypeType)} +// CHECK:STDOUT: inst123: {kind: ConstType, arg0: inst122, type: type(TypeType)} +// CHECK:STDOUT: inst124: {kind: PatternType, arg0: inst123, type: type(TypeType)} +// CHECK:STDOUT: inst125: {kind: RequireCompleteType, arg0: inst97, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst126: {kind: RequireCompleteType, arg0: inst96, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst127: {kind: LookupImplWitness, arg0: inst95, arg1: specific_interface0, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst128: {kind: FacetValue, arg0: inst96, arg1: inst_block41, type: type(inst71)} +// CHECK:STDOUT: inst129: {kind: FunctionTypeWithSelfType, arg0: inst80, arg1: inst128, type: type(TypeType)} +// CHECK:STDOUT: inst130: {kind: ImplWitnessAccess, arg0: inst127, arg1: element0, type: type(symbolic_constant62)} +// CHECK:STDOUT: inst131: {kind: SpecificImplFunction, arg0: inst130, arg1: specific5, type: type(inst(SpecificFunctionType))} +// CHECK:STDOUT: inst132: {kind: RequireCompleteType, arg0: inst123, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst133: {kind: RequireCompleteType, arg0: inst122, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst134: {kind: LookupImplWitness, arg0: inst121, arg1: specific_interface0, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst135: {kind: FacetValue, arg0: inst122, arg1: inst_block43, type: type(inst71)} +// CHECK:STDOUT: inst136: {kind: FunctionTypeWithSelfType, arg0: inst80, arg1: inst135, type: type(TypeType)} +// CHECK:STDOUT: inst137: {kind: ImplWitnessAccess, arg0: inst134, arg1: element0, type: type(symbolic_constant72)} +// CHECK:STDOUT: inst138: {kind: SpecificImplFunction, arg0: inst137, arg1: specific6, type: type(inst(SpecificFunctionType))} +// CHECK:STDOUT: inst139: {kind: PatternType, arg0: inst96, type: type(TypeType)} +// CHECK:STDOUT: inst140: {kind: ImportRefUnloaded, arg0: import_ir_inst46, arg1: entity_name} +// CHECK:STDOUT: inst141: {kind: ImplDecl, arg0: impl1, arg1: inst_block_empty} +// CHECK:STDOUT: inst142: {kind: ImportRefLoaded, arg0: import_ir_inst48, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst143: {kind: ImportRefLoaded, arg0: import_ir_inst49, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst144: {kind: ImportRefUnloaded, arg0: import_ir_inst50, arg1: entity_name} +// CHECK:STDOUT: inst145: {kind: ImplDecl, arg0: impl2, arg1: inst_block_empty} +// CHECK:STDOUT: inst146: {kind: ImportRefLoaded, arg0: import_ir_inst52, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst147: {kind: ImportRefLoaded, arg0: import_ir_inst53, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst148: {kind: ImportRefUnloaded, arg0: import_ir_inst54, arg1: entity_name} +// CHECK:STDOUT: inst149: {kind: ImplDecl, arg0: impl3, arg1: inst_block_empty} +// CHECK:STDOUT: inst150: {kind: ImportRefLoaded, arg0: import_ir_inst56, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst151: {kind: ImportRefLoaded, arg0: import_ir_inst57, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst152: {kind: ImportRefUnloaded, arg0: import_ir_inst58, arg1: entity_name} +// CHECK:STDOUT: inst153: {kind: ImplDecl, arg0: impl4, arg1: inst_block_empty} +// CHECK:STDOUT: inst154: {kind: ImportRefLoaded, arg0: import_ir_inst60, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst155: {kind: ImportRefLoaded, arg0: import_ir_inst61, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst156: {kind: ImportRefLoaded, arg0: import_ir_inst62, arg1: entity_name, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst157: {kind: ImplDecl, arg0: impl5, arg1: inst_block_empty} +// CHECK:STDOUT: inst158: {kind: SymbolicBindingPattern, arg0: entity_name16, type: type(inst23)} +// CHECK:STDOUT: inst159: {kind: ImportRefLoaded, arg0: import_ir_inst65, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst160: {kind: ImportRefLoaded, arg0: import_ir_inst66, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst161: {kind: ImportRefLoaded, arg0: import_ir_inst67, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst162: {kind: ImportRefUnloaded, arg0: import_ir_inst68, arg1: entity_name} +// CHECK:STDOUT: inst163: {kind: ImplWitnessTable, arg0: inst_block50, arg1: impl5} +// CHECK:STDOUT: inst164: {kind: ImplWitness, arg0: inst163, arg1: specific7, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst165: {kind: BindSymbolicName, arg0: entity_name1, arg1: inst, type: type(TypeType)} +// CHECK:STDOUT: inst166: {kind: PointerType, arg0: inst165, type: type(TypeType)} +// CHECK:STDOUT: inst167: {kind: ImplWitness, arg0: inst163, arg1: specific8, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst168: {kind: FunctionDecl, arg0: function3, arg1: inst_block_empty, type: type(symbolic_constant84)} +// CHECK:STDOUT: inst169: {kind: FunctionType, arg0: function3, arg1: specific7, type: type(TypeType)} +// CHECK:STDOUT: inst170: {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant84)} +// CHECK:STDOUT: inst171: {kind: ReturnSlotPattern, arg0: inst, type: type(symbolic_constant88)} +// CHECK:STDOUT: inst172: {kind: OutParamPattern, arg0: inst171, arg1: call_param1, type: type(symbolic_constant88)} +// CHECK:STDOUT: inst173: {kind: BindingPattern, arg0: entity_name19, type: type(symbolic_constant88)} +// CHECK:STDOUT: inst174: {kind: ValueParamPattern, arg0: inst173, arg1: call_param0, type: type(symbolic_constant88)} +// CHECK:STDOUT: inst175: {kind: ImportRefLoaded, arg0: import_ir_inst78, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst176: {kind: FunctionType, arg0: function3, arg1: specific8, type: type(TypeType)} +// CHECK:STDOUT: inst177: {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant91)} +// CHECK:STDOUT: inst178: {kind: RequireCompleteType, arg0: inst166, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst179: {kind: BindSymbolicName, arg0: entity_name1, arg1: inst, type: type(TypeType)} +// CHECK:STDOUT: inst180: {kind: PointerType, arg0: inst179, type: type(TypeType)} +// CHECK:STDOUT: inst181: {kind: PatternType, arg0: inst180, type: type(TypeType)} +// CHECK:STDOUT: inst182: {kind: ImportRefUnloaded, arg0: import_ir_inst85, arg1: entity_name} +// CHECK:STDOUT: inst183: {kind: ImplDecl, arg0: impl6, arg1: inst_block_empty} +// CHECK:STDOUT: inst184: {kind: ImportRefLoaded, arg0: import_ir_inst87, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst185: {kind: ImportRefLoaded, arg0: import_ir_inst88, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst186: {kind: ImportRefUnloaded, arg0: import_ir_inst89, arg1: entity_name} +// CHECK:STDOUT: inst187: {kind: ImplDecl, arg0: impl7, arg1: inst_block_empty} +// CHECK:STDOUT: inst188: {kind: ImportRefLoaded, arg0: import_ir_inst91, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst189: {kind: ImportRefLoaded, arg0: import_ir_inst92, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst190: {kind: ImportRefUnloaded, arg0: import_ir_inst93, arg1: entity_name} +// CHECK:STDOUT: inst191: {kind: ImplDecl, arg0: impl8, arg1: inst_block_empty} +// CHECK:STDOUT: inst192: {kind: BindSymbolicName, arg0: entity_name21, arg1: inst, type: type(inst71)} +// CHECK:STDOUT: inst193: {kind: FacetAccessType, arg0: inst192, type: type(TypeType)} +// CHECK:STDOUT: inst194: {kind: TupleType, arg0: inst_block60, type: type(TypeType)} +// CHECK:STDOUT: inst195: {kind: SymbolicBindingPattern, arg0: entity_name22, type: type(inst98)} +// CHECK:STDOUT: inst196: {kind: SymbolicBindingPattern, arg0: entity_name23, type: type(inst98)} +// CHECK:STDOUT: inst197: {kind: ImportRefLoaded, arg0: import_ir_inst97, arg1: entity_name, type: type(inst71)} +// CHECK:STDOUT: inst198: {kind: ImportRefLoaded, arg0: import_ir_inst98, arg1: entity_name, type: type(inst71)} +// CHECK:STDOUT: inst199: {kind: ImportRefLoaded, arg0: import_ir_inst99, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst200: {kind: ImportRefLoaded, arg0: import_ir_inst100, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst201: {kind: ImportRefUnloaded, arg0: import_ir_inst101, arg1: entity_name} +// CHECK:STDOUT: inst202: {kind: ImplWitnessTable, arg0: inst_block63, arg1: impl8} +// CHECK:STDOUT: inst203: {kind: ImplWitness, arg0: inst202, arg1: specific10, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst204: {kind: BindSymbolicName, arg0: entity_name1, arg1: inst, type: type(inst71)} +// CHECK:STDOUT: inst205: {kind: BindSymbolicName, arg0: entity_name21, arg1: inst, type: type(inst71)} +// CHECK:STDOUT: inst206: {kind: FacetAccessType, arg0: inst204, type: type(TypeType)} +// CHECK:STDOUT: inst207: {kind: FacetAccessType, arg0: inst205, type: type(TypeType)} +// CHECK:STDOUT: inst208: {kind: TupleType, arg0: inst_block65, type: type(TypeType)} +// CHECK:STDOUT: inst209: {kind: ImplWitness, arg0: inst202, arg1: specific11, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst210: {kind: FunctionDecl, arg0: function4, arg1: inst_block_empty, type: type(symbolic_constant117)} +// CHECK:STDOUT: inst211: {kind: FunctionType, arg0: function4, arg1: specific10, type: type(TypeType)} +// CHECK:STDOUT: inst212: {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant117)} +// CHECK:STDOUT: inst213: {kind: PatternType, arg0: inst194, type: type(TypeType)} +// CHECK:STDOUT: inst214: {kind: ReturnSlotPattern, arg0: inst, type: type(symbolic_constant122)} +// CHECK:STDOUT: inst215: {kind: OutParamPattern, arg0: inst214, arg1: call_param1, type: type(symbolic_constant122)} +// CHECK:STDOUT: inst216: {kind: BindingPattern, arg0: entity_name28, type: type(symbolic_constant122)} +// CHECK:STDOUT: inst217: {kind: ValueParamPattern, arg0: inst216, arg1: call_param0, type: type(symbolic_constant122)} +// CHECK:STDOUT: inst218: {kind: ImportRefLoaded, arg0: import_ir_inst114, arg1: entity_name, type: type(inst71)} +// CHECK:STDOUT: inst219: {kind: ImportRefLoaded, arg0: import_ir_inst115, arg1: entity_name, type: type(inst71)} +// CHECK:STDOUT: inst220: {kind: FunctionType, arg0: function4, arg1: specific11, type: type(TypeType)} +// CHECK:STDOUT: inst221: {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant124)} +// CHECK:STDOUT: inst222: {kind: BindSymbolicName, arg0: entity_name1, arg1: inst, type: type(inst71)} +// CHECK:STDOUT: inst223: {kind: FacetAccessType, arg0: inst222, type: type(TypeType)} +// CHECK:STDOUT: inst224: {kind: BindSymbolicName, arg0: entity_name21, arg1: inst, type: type(inst71)} +// CHECK:STDOUT: inst225: {kind: FacetAccessType, arg0: inst224, type: type(TypeType)} +// CHECK:STDOUT: inst226: {kind: TupleType, arg0: inst_block73, type: type(TypeType)} +// CHECK:STDOUT: inst227: {kind: PatternType, arg0: inst226, type: type(TypeType)} +// CHECK:STDOUT: inst228: {kind: RequireCompleteType, arg0: inst194, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst229: {kind: RequireCompleteType, arg0: inst193, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst230: {kind: LookupImplWitness, arg0: inst192, arg1: specific_interface0, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst231: {kind: FacetValue, arg0: inst193, arg1: inst_block76, type: type(inst71)} +// CHECK:STDOUT: inst232: {kind: FunctionTypeWithSelfType, arg0: inst80, arg1: inst231, type: type(TypeType)} +// CHECK:STDOUT: inst233: {kind: ImplWitnessAccess, arg0: inst230, arg1: element0, type: type(symbolic_constant151)} +// CHECK:STDOUT: inst234: {kind: SpecificImplFunction, arg0: inst233, arg1: specific13, type: type(inst(SpecificFunctionType))} +// CHECK:STDOUT: inst235: {kind: RequireCompleteType, arg0: inst226, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst236: {kind: RequireCompleteType, arg0: inst223, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst237: {kind: LookupImplWitness, arg0: inst222, arg1: specific_interface0, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst238: {kind: FacetValue, arg0: inst223, arg1: inst_block78, type: type(inst71)} +// CHECK:STDOUT: inst239: {kind: FunctionTypeWithSelfType, arg0: inst80, arg1: inst238, type: type(TypeType)} +// CHECK:STDOUT: inst240: {kind: ImplWitnessAccess, arg0: inst237, arg1: element0, type: type(symbolic_constant161)} +// CHECK:STDOUT: inst241: {kind: SpecificImplFunction, arg0: inst240, arg1: specific14, type: type(inst(SpecificFunctionType))} +// CHECK:STDOUT: inst242: {kind: RequireCompleteType, arg0: inst225, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst243: {kind: LookupImplWitness, arg0: inst224, arg1: specific_interface0, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst244: {kind: FacetValue, arg0: inst225, arg1: inst_block80, type: type(inst71)} +// CHECK:STDOUT: inst245: {kind: FunctionTypeWithSelfType, arg0: inst80, arg1: inst244, type: type(TypeType)} +// CHECK:STDOUT: inst246: {kind: ImplWitnessAccess, arg0: inst243, arg1: element0, type: type(symbolic_constant167)} +// CHECK:STDOUT: inst247: {kind: SpecificImplFunction, arg0: inst246, arg1: specific15, type: type(inst(SpecificFunctionType))} +// CHECK:STDOUT: inst248: {kind: PatternType, arg0: inst193, type: type(TypeType)} +// CHECK:STDOUT: inst249: {kind: ImportRefUnloaded, arg0: import_ir_inst137, arg1: entity_name} +// CHECK:STDOUT: inst250: {kind: ImplDecl, arg0: impl9, arg1: inst_block_empty} +// CHECK:STDOUT: inst251: {kind: BindSymbolicName, arg0: entity_name31, arg1: inst, type: type(inst71)} +// CHECK:STDOUT: inst252: {kind: FacetAccessType, arg0: inst251, type: type(TypeType)} +// CHECK:STDOUT: inst253: {kind: TupleType, arg0: inst_block85, type: type(TypeType)} +// CHECK:STDOUT: inst254: {kind: SymbolicBindingPattern, arg0: entity_name32, type: type(inst98)} +// CHECK:STDOUT: inst255: {kind: SymbolicBindingPattern, arg0: entity_name33, type: type(inst98)} +// CHECK:STDOUT: inst256: {kind: SymbolicBindingPattern, arg0: entity_name34, type: type(inst98)} +// CHECK:STDOUT: inst257: {kind: ImportRefLoaded, arg0: import_ir_inst142, arg1: entity_name, type: type(inst71)} +// CHECK:STDOUT: inst258: {kind: ImportRefLoaded, arg0: import_ir_inst143, arg1: entity_name, type: type(inst71)} +// CHECK:STDOUT: inst259: {kind: ImportRefLoaded, arg0: import_ir_inst144, arg1: entity_name, type: type(inst71)} +// CHECK:STDOUT: inst260: {kind: ImportRefLoaded, arg0: import_ir_inst145, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst261: {kind: ImportRefLoaded, arg0: import_ir_inst146, arg1: entity_name, type: type(TypeType)} +// CHECK:STDOUT: inst262: {kind: ImportRefUnloaded, arg0: import_ir_inst147, arg1: entity_name} +// CHECK:STDOUT: inst263: {kind: ImplWitnessTable, arg0: inst_block88, arg1: impl9} +// CHECK:STDOUT: inst264: {kind: ImplWitness, arg0: inst263, arg1: specific16, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst265: {kind: BindSymbolicName, arg0: entity_name1, arg1: inst, type: type(inst71)} +// CHECK:STDOUT: inst266: {kind: BindSymbolicName, arg0: entity_name21, arg1: inst, type: type(inst71)} +// CHECK:STDOUT: inst267: {kind: BindSymbolicName, arg0: entity_name31, arg1: inst, type: type(inst71)} +// CHECK:STDOUT: inst268: {kind: FacetAccessType, arg0: inst265, type: type(TypeType)} +// CHECK:STDOUT: inst269: {kind: FacetAccessType, arg0: inst266, type: type(TypeType)} +// CHECK:STDOUT: inst270: {kind: FacetAccessType, arg0: inst267, type: type(TypeType)} +// CHECK:STDOUT: inst271: {kind: TupleType, arg0: inst_block90, type: type(TypeType)} +// CHECK:STDOUT: inst272: {kind: ImplWitness, arg0: inst263, arg1: specific17, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst273: {kind: FunctionDecl, arg0: function5, arg1: inst_block_empty, type: type(symbolic_constant194)} +// CHECK:STDOUT: inst274: {kind: FunctionType, arg0: function5, arg1: specific16, type: type(TypeType)} +// CHECK:STDOUT: inst275: {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant194)} +// CHECK:STDOUT: inst276: {kind: PatternType, arg0: inst253, type: type(TypeType)} +// CHECK:STDOUT: inst277: {kind: ReturnSlotPattern, arg0: inst, type: type(symbolic_constant199)} +// CHECK:STDOUT: inst278: {kind: OutParamPattern, arg0: inst277, arg1: call_param1, type: type(symbolic_constant199)} +// CHECK:STDOUT: inst279: {kind: BindingPattern, arg0: entity_name41, type: type(symbolic_constant199)} +// CHECK:STDOUT: inst280: {kind: ValueParamPattern, arg0: inst279, arg1: call_param0, type: type(symbolic_constant199)} +// CHECK:STDOUT: inst281: {kind: ImportRefLoaded, arg0: import_ir_inst162, arg1: entity_name, type: type(inst71)} +// CHECK:STDOUT: inst282: {kind: ImportRefLoaded, arg0: import_ir_inst163, arg1: entity_name, type: type(inst71)} +// CHECK:STDOUT: inst283: {kind: ImportRefLoaded, arg0: import_ir_inst164, arg1: entity_name, type: type(inst71)} +// CHECK:STDOUT: inst284: {kind: FunctionType, arg0: function5, arg1: specific17, type: type(TypeType)} +// CHECK:STDOUT: inst285: {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant201)} +// CHECK:STDOUT: inst286: {kind: BindSymbolicName, arg0: entity_name1, arg1: inst, type: type(inst71)} +// CHECK:STDOUT: inst287: {kind: FacetAccessType, arg0: inst286, type: type(TypeType)} +// CHECK:STDOUT: inst288: {kind: BindSymbolicName, arg0: entity_name21, arg1: inst, type: type(inst71)} +// CHECK:STDOUT: inst289: {kind: FacetAccessType, arg0: inst288, type: type(TypeType)} +// CHECK:STDOUT: inst290: {kind: BindSymbolicName, arg0: entity_name31, arg1: inst, type: type(inst71)} +// CHECK:STDOUT: inst291: {kind: FacetAccessType, arg0: inst290, type: type(TypeType)} +// CHECK:STDOUT: inst292: {kind: TupleType, arg0: inst_block98, type: type(TypeType)} +// CHECK:STDOUT: inst293: {kind: PatternType, arg0: inst292, type: type(TypeType)} +// CHECK:STDOUT: inst294: {kind: RequireCompleteType, arg0: inst253, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst295: {kind: RequireCompleteType, arg0: inst252, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst296: {kind: LookupImplWitness, arg0: inst251, arg1: specific_interface0, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst297: {kind: FacetValue, arg0: inst252, arg1: inst_block101, type: type(inst71)} +// CHECK:STDOUT: inst298: {kind: FunctionTypeWithSelfType, arg0: inst80, arg1: inst297, type: type(TypeType)} +// CHECK:STDOUT: inst299: {kind: ImplWitnessAccess, arg0: inst296, arg1: element0, type: type(symbolic_constant238)} +// CHECK:STDOUT: inst300: {kind: SpecificImplFunction, arg0: inst299, arg1: specific19, type: type(inst(SpecificFunctionType))} +// CHECK:STDOUT: inst301: {kind: RequireCompleteType, arg0: inst292, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst302: {kind: RequireCompleteType, arg0: inst287, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst303: {kind: LookupImplWitness, arg0: inst286, arg1: specific_interface0, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst304: {kind: FacetValue, arg0: inst287, arg1: inst_block103, type: type(inst71)} +// CHECK:STDOUT: inst305: {kind: FunctionTypeWithSelfType, arg0: inst80, arg1: inst304, type: type(TypeType)} +// CHECK:STDOUT: inst306: {kind: ImplWitnessAccess, arg0: inst303, arg1: element0, type: type(symbolic_constant248)} +// CHECK:STDOUT: inst307: {kind: SpecificImplFunction, arg0: inst306, arg1: specific20, type: type(inst(SpecificFunctionType))} +// CHECK:STDOUT: inst308: {kind: RequireCompleteType, arg0: inst289, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst309: {kind: LookupImplWitness, arg0: inst288, arg1: specific_interface0, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst310: {kind: FacetValue, arg0: inst289, arg1: inst_block105, type: type(inst71)} +// CHECK:STDOUT: inst311: {kind: FunctionTypeWithSelfType, arg0: inst80, arg1: inst310, type: type(TypeType)} +// CHECK:STDOUT: inst312: {kind: ImplWitnessAccess, arg0: inst309, arg1: element0, type: type(symbolic_constant254)} +// CHECK:STDOUT: inst313: {kind: SpecificImplFunction, arg0: inst312, arg1: specific21, type: type(inst(SpecificFunctionType))} +// CHECK:STDOUT: inst314: {kind: RequireCompleteType, arg0: inst291, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst315: {kind: LookupImplWitness, arg0: inst290, arg1: specific_interface0, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst316: {kind: FacetValue, arg0: inst291, arg1: inst_block107, type: type(inst71)} +// CHECK:STDOUT: inst317: {kind: FunctionTypeWithSelfType, arg0: inst80, arg1: inst316, type: type(TypeType)} +// CHECK:STDOUT: inst318: {kind: ImplWitnessAccess, arg0: inst315, arg1: element0, type: type(symbolic_constant260)} +// CHECK:STDOUT: inst319: {kind: SpecificImplFunction, arg0: inst318, arg1: specific22, type: type(inst(SpecificFunctionType))} +// CHECK:STDOUT: inst320: {kind: PatternType, arg0: inst252, type: type(TypeType)} +// CHECK:STDOUT: inst321: {kind: LookupImplWitness, arg0: inst27, arg1: specific_interface0, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst322: {kind: LookupImplWitness, arg0: inst28, arg1: specific_interface0, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst323: {kind: FacetValue, arg0: inst27, arg1: inst_block113, type: type(inst71)} +// CHECK:STDOUT: inst324: {kind: FunctionTypeWithSelfType, arg0: inst80, arg1: inst323, type: type(TypeType)} +// CHECK:STDOUT: inst325: {kind: ImplWitnessAccess, arg0: inst321, arg1: element0, type: type(symbolic_constant271)} +// CHECK:STDOUT: inst326: {kind: ImplWitnessAccess, arg0: inst321, arg1: element0, type: type(symbolic_constant268)} +// CHECK:STDOUT: inst327: {kind: FacetValue, arg0: inst28, arg1: inst_block114, type: type(inst71)} +// CHECK:STDOUT: inst328: {kind: FunctionTypeWithSelfType, arg0: inst80, arg1: inst327, type: type(TypeType)} +// CHECK:STDOUT: inst329: {kind: ImplWitnessAccess, arg0: inst322, arg1: element0, type: type(symbolic_constant271)} +// CHECK:STDOUT: inst330: {kind: BoundMethod, arg0: inst63, arg1: inst325, type: type(inst(BoundMethodType))} +// CHECK:STDOUT: inst331: {kind: SpecificImplFunction, arg0: inst325, arg1: specific23, type: type(inst(SpecificFunctionType))} +// CHECK:STDOUT: inst332: {kind: SpecificImplFunction, arg0: inst326, arg1: specific23, type: type(inst(SpecificFunctionType))} +// CHECK:STDOUT: inst333: {kind: SpecificImplFunction, arg0: inst329, arg1: specific24, type: type(inst(SpecificFunctionType))} +// CHECK:STDOUT: inst334: {kind: BoundMethod, arg0: inst63, arg1: inst331, type: type(inst(BoundMethodType))} +// CHECK:STDOUT: inst335: {kind: RequireCompleteType, arg0: inst27, type: type(inst(WitnessType))} +// CHECK:STDOUT: inst336: {kind: Call, arg0: inst334, arg1: inst_block118, type: type(symbolic_constant4)} +// CHECK:STDOUT: inst337: {kind: InitializeFrom, arg0: inst336, arg1: inst67, type: type(symbolic_constant4)} +// CHECK:STDOUT: inst338: {kind: TupleAccess, arg0: inst52, arg1: element1, type: type(inst36)} +// CHECK:STDOUT: inst339: {kind: TupleInit, arg0: inst_block_empty, arg1: inst338, type: type(inst36)} +// CHECK:STDOUT: inst340: {kind: TupleValue, arg0: inst_block_empty, type: type(inst36)} +// CHECK:STDOUT: inst341: {kind: Converted, arg0: inst64, arg1: inst339, type: type(inst36)} +// CHECK:STDOUT: inst342: {kind: TupleInit, arg0: inst_block119, arg1: inst52, type: type(symbolic_constant8)} +// CHECK:STDOUT: inst343: {kind: Converted, arg0: inst65, arg1: inst342, type: type(symbolic_constant8)} +// CHECK:STDOUT: inst344: {kind: ReturnExpr, arg0: inst343, arg1: inst52} // CHECK:STDOUT: constant_values: // CHECK:STDOUT: values: // CHECK:STDOUT: inst14: concrete_constant(inst14) @@ -532,142 +767,251 @@ fn Foo[T:! type](p: T*) -> (T*, ()) { // CHECK:STDOUT: inst89: symbolic_constant22 // CHECK:STDOUT: inst90: symbolic_constant23 // CHECK:STDOUT: inst91: symbolic_constant24 -// CHECK:STDOUT: inst92: symbolic_constant131 +// CHECK:STDOUT: inst92: symbolic_constant266 // CHECK:STDOUT: inst93: constant // CHECK:STDOUT: inst94: concrete_constant(inst94) -// CHECK:STDOUT: inst95: concrete_constant(inst(BoolType)) -// CHECK:STDOUT: inst96: concrete_constant(inst71) -// CHECK:STDOUT: inst97: constant +// CHECK:STDOUT: inst95: symbolic_constant25 +// CHECK:STDOUT: inst96: symbolic_constant26 +// CHECK:STDOUT: inst97: symbolic_constant27 // CHECK:STDOUT: inst98: concrete_constant(inst98) -// CHECK:STDOUT: inst99: concrete_constant(inst(CharLiteralType)) -// CHECK:STDOUT: inst100: concrete_constant(inst71) -// CHECK:STDOUT: inst101: constant -// CHECK:STDOUT: inst102: concrete_constant(inst102) -// CHECK:STDOUT: inst103: concrete_constant(inst(FloatLiteralType)) -// CHECK:STDOUT: inst104: concrete_constant(inst71) -// CHECK:STDOUT: inst105: constant -// CHECK:STDOUT: inst106: concrete_constant(inst106) -// CHECK:STDOUT: inst107: concrete_constant(inst(IntLiteralType)) -// CHECK:STDOUT: inst108: concrete_constant(inst71) -// CHECK:STDOUT: inst109: symbolic_constant129 -// CHECK:STDOUT: inst110: concrete_constant(inst110) -// CHECK:STDOUT: inst111: concrete_constant(inst111) -// CHECK:STDOUT: inst112: symbolic_constant26 -// CHECK:STDOUT: inst113: symbolic_constant25 -// CHECK:STDOUT: inst114: concrete_constant(inst71) -// CHECK:STDOUT: inst115: constant +// CHECK:STDOUT: inst99: concrete_constant(inst99) +// CHECK:STDOUT: inst100: symbolic_constant29 +// CHECK:STDOUT: inst101: symbolic_constant28 +// CHECK:STDOUT: inst102: concrete_constant(inst71) +// CHECK:STDOUT: inst103: constant +// CHECK:STDOUT: inst104: concrete_constant(inst104) +// CHECK:STDOUT: inst105: symbolic_constant32 +// CHECK:STDOUT: inst106: symbolic_constant34 +// CHECK:STDOUT: inst107: symbolic_constant35 +// CHECK:STDOUT: inst108: symbolic_constant36 +// CHECK:STDOUT: inst109: symbolic_constant37 +// CHECK:STDOUT: inst110: symbolic_constant40 +// CHECK:STDOUT: inst111: symbolic_constant38 +// CHECK:STDOUT: inst112: symbolic_constant39 +// CHECK:STDOUT: inst113: symbolic_constant42 +// CHECK:STDOUT: inst114: concrete_constant(inst114) +// CHECK:STDOUT: inst115: concrete_constant(inst115) // CHECK:STDOUT: inst116: concrete_constant(inst116) -// CHECK:STDOUT: inst117: symbolic_constant28 -// CHECK:STDOUT: inst118: symbolic_constant30 -// CHECK:STDOUT: inst119: symbolic_constant31 -// CHECK:STDOUT: inst120: symbolic_constant32 -// CHECK:STDOUT: inst121: symbolic_constant35 -// CHECK:STDOUT: inst122: symbolic_constant33 -// CHECK:STDOUT: inst123: symbolic_constant34 -// CHECK:STDOUT: inst124: concrete_constant(inst124) -// CHECK:STDOUT: inst125: concrete_constant(inst125) -// CHECK:STDOUT: inst126: concrete_constant(inst126) -// CHECK:STDOUT: inst127: concrete_constant(inst127) -// CHECK:STDOUT: inst128: symbolic_constant26 -// CHECK:STDOUT: inst129: symbolic_constant40 -// CHECK:STDOUT: inst130: symbolic_constant41 -// CHECK:STDOUT: inst131: symbolic_constant42 -// CHECK:STDOUT: inst132: symbolic_constant45 -// CHECK:STDOUT: inst133: symbolic_constant46 -// CHECK:STDOUT: inst134: symbolic_constant47 -// CHECK:STDOUT: inst135: constant -// CHECK:STDOUT: inst136: concrete_constant(inst136) -// CHECK:STDOUT: inst137: concrete_constant(inst(TypeType)) -// CHECK:STDOUT: inst138: concrete_constant(inst71) -// CHECK:STDOUT: inst139: constant -// CHECK:STDOUT: inst140: concrete_constant(inst140) -// CHECK:STDOUT: inst141: concrete_constant(inst36) -// CHECK:STDOUT: inst142: concrete_constant(inst71) -// CHECK:STDOUT: inst143: constant -// CHECK:STDOUT: inst144: concrete_constant(inst144) -// CHECK:STDOUT: inst145: symbolic_constant48 -// CHECK:STDOUT: inst146: symbolic_constant49 -// CHECK:STDOUT: inst147: symbolic_constant50 -// CHECK:STDOUT: inst148: symbolic_constant51 -// CHECK:STDOUT: inst149: symbolic_constant52 -// CHECK:STDOUT: inst150: concrete_constant(inst150) -// CHECK:STDOUT: inst151: concrete_constant(inst151) -// CHECK:STDOUT: inst152: concrete_constant(inst152) -// CHECK:STDOUT: inst153: symbolic_constant54 -// CHECK:STDOUT: inst154: symbolic_constant55 -// CHECK:STDOUT: inst155: symbolic_constant53 -// CHECK:STDOUT: inst156: concrete_constant(inst71) -// CHECK:STDOUT: inst157: constant +// CHECK:STDOUT: inst117: concrete_constant(inst117) +// CHECK:STDOUT: inst118: symbolic_constant29 +// CHECK:STDOUT: inst119: symbolic_constant45 +// CHECK:STDOUT: inst120: symbolic_constant46 +// CHECK:STDOUT: inst121: symbolic_constant50 +// CHECK:STDOUT: inst122: symbolic_constant51 +// CHECK:STDOUT: inst123: symbolic_constant52 +// CHECK:STDOUT: inst124: symbolic_constant53 +// CHECK:STDOUT: inst125: symbolic_constant54 +// CHECK:STDOUT: inst126: symbolic_constant56 +// CHECK:STDOUT: inst127: symbolic_constant58 +// CHECK:STDOUT: inst128: symbolic_constant60 +// CHECK:STDOUT: inst129: symbolic_constant62 +// CHECK:STDOUT: inst130: symbolic_constant64 +// CHECK:STDOUT: inst131: symbolic_constant66 +// CHECK:STDOUT: inst132: symbolic_constant68 +// CHECK:STDOUT: inst133: symbolic_constant69 +// CHECK:STDOUT: inst134: symbolic_constant70 +// CHECK:STDOUT: inst135: symbolic_constant71 +// CHECK:STDOUT: inst136: symbolic_constant72 +// CHECK:STDOUT: inst137: symbolic_constant73 +// CHECK:STDOUT: inst138: symbolic_constant74 +// CHECK:STDOUT: inst139: symbolic_constant75 +// CHECK:STDOUT: inst140: constant +// CHECK:STDOUT: inst141: concrete_constant(inst141) +// CHECK:STDOUT: inst142: concrete_constant(inst(BoolType)) +// CHECK:STDOUT: inst143: concrete_constant(inst71) +// CHECK:STDOUT: inst144: constant +// CHECK:STDOUT: inst145: concrete_constant(inst145) +// CHECK:STDOUT: inst146: concrete_constant(inst(CharLiteralType)) +// CHECK:STDOUT: inst147: concrete_constant(inst71) +// CHECK:STDOUT: inst148: constant +// CHECK:STDOUT: inst149: concrete_constant(inst149) +// CHECK:STDOUT: inst150: concrete_constant(inst(FloatLiteralType)) +// CHECK:STDOUT: inst151: concrete_constant(inst71) +// CHECK:STDOUT: inst152: constant +// CHECK:STDOUT: inst153: concrete_constant(inst153) +// CHECK:STDOUT: inst154: concrete_constant(inst(IntLiteralType)) +// CHECK:STDOUT: inst155: concrete_constant(inst71) +// CHECK:STDOUT: inst156: symbolic_constant264 +// CHECK:STDOUT: inst157: concrete_constant(inst157) // CHECK:STDOUT: inst158: concrete_constant(inst158) -// CHECK:STDOUT: inst159: symbolic_constant60 -// CHECK:STDOUT: inst160: symbolic_constant62 -// CHECK:STDOUT: inst161: symbolic_constant63 -// CHECK:STDOUT: inst162: symbolic_constant64 -// CHECK:STDOUT: inst163: symbolic_constant65 -// CHECK:STDOUT: inst164: symbolic_constant66 -// CHECK:STDOUT: inst165: symbolic_constant67 -// CHECK:STDOUT: inst166: symbolic_constant70 -// CHECK:STDOUT: inst167: symbolic_constant68 -// CHECK:STDOUT: inst168: symbolic_constant69 -// CHECK:STDOUT: inst169: symbolic_constant72 -// CHECK:STDOUT: inst170: concrete_constant(inst170) +// CHECK:STDOUT: inst159: symbolic_constant77 +// CHECK:STDOUT: inst160: symbolic_constant76 +// CHECK:STDOUT: inst161: concrete_constant(inst71) +// CHECK:STDOUT: inst162: constant +// CHECK:STDOUT: inst163: concrete_constant(inst163) +// CHECK:STDOUT: inst164: symbolic_constant79 +// CHECK:STDOUT: inst165: symbolic_constant81 +// CHECK:STDOUT: inst166: symbolic_constant82 +// CHECK:STDOUT: inst167: symbolic_constant83 +// CHECK:STDOUT: inst168: symbolic_constant86 +// CHECK:STDOUT: inst169: symbolic_constant84 +// CHECK:STDOUT: inst170: symbolic_constant85 // CHECK:STDOUT: inst171: concrete_constant(inst171) // CHECK:STDOUT: inst172: concrete_constant(inst172) // CHECK:STDOUT: inst173: concrete_constant(inst173) -// CHECK:STDOUT: inst174: symbolic_constant54 -// CHECK:STDOUT: inst175: symbolic_constant55 -// CHECK:STDOUT: inst176: symbolic_constant75 -// CHECK:STDOUT: inst177: symbolic_constant76 -// CHECK:STDOUT: inst178: symbolic_constant82 -// CHECK:STDOUT: inst179: symbolic_constant83 -// CHECK:STDOUT: inst180: symbolic_constant84 -// CHECK:STDOUT: inst181: symbolic_constant85 -// CHECK:STDOUT: inst182: symbolic_constant86 -// CHECK:STDOUT: inst183: symbolic_constant87 -// CHECK:STDOUT: inst184: symbolic_constant88 -// CHECK:STDOUT: inst185: symbolic_constant90 -// CHECK:STDOUT: inst186: symbolic_constant92 -// CHECK:STDOUT: inst187: symbolic_constant94 -// CHECK:STDOUT: inst188: symbolic_constant96 -// CHECK:STDOUT: inst189: symbolic_constant98 -// CHECK:STDOUT: inst190: symbolic_constant100 -// CHECK:STDOUT: inst191: symbolic_constant102 -// CHECK:STDOUT: inst192: symbolic_constant104 -// CHECK:STDOUT: inst193: symbolic_constant106 -// CHECK:STDOUT: inst194: symbolic_constant108 -// CHECK:STDOUT: inst195: symbolic_constant110 -// CHECK:STDOUT: inst196: symbolic_constant112 -// CHECK:STDOUT: inst197: symbolic_constant114 -// CHECK:STDOUT: inst198: symbolic_constant115 -// CHECK:STDOUT: inst199: symbolic_constant116 -// CHECK:STDOUT: inst200: symbolic_constant117 -// CHECK:STDOUT: inst201: symbolic_constant118 -// CHECK:STDOUT: inst202: symbolic_constant119 -// CHECK:STDOUT: inst203: symbolic_constant120 -// CHECK:STDOUT: inst204: symbolic_constant121 -// CHECK:STDOUT: inst205: symbolic_constant122 -// CHECK:STDOUT: inst206: symbolic_constant123 -// CHECK:STDOUT: inst207: symbolic_constant124 -// CHECK:STDOUT: inst208: symbolic_constant125 -// CHECK:STDOUT: inst209: symbolic_constant126 -// CHECK:STDOUT: inst210: symbolic_constant127 -// CHECK:STDOUT: inst211: symbolic_constant128 -// CHECK:STDOUT: inst212: symbolic_constant130 -// CHECK:STDOUT: inst213: symbolic_constant131 -// CHECK:STDOUT: inst214: symbolic_constant132 -// CHECK:STDOUT: inst215: symbolic_constant133 -// CHECK:STDOUT: inst216: symbolic_constant137 -// CHECK:STDOUT: inst217: symbolic_constant134 -// CHECK:STDOUT: inst218: symbolic_constant135 -// CHECK:STDOUT: inst219: symbolic_constant136 -// CHECK:STDOUT: inst220: symbolic_constant137 -// CHECK:STDOUT: inst222: symbolic_constant139 -// CHECK:STDOUT: inst223: symbolic_constant138 -// CHECK:STDOUT: inst224: symbolic_constant139 -// CHECK:STDOUT: inst226: symbolic_constant15 -// CHECK:STDOUT: inst230: concrete_constant(inst231) -// CHECK:STDOUT: inst231: concrete_constant(inst231) -// CHECK:STDOUT: inst232: concrete_constant(inst231) +// CHECK:STDOUT: inst174: concrete_constant(inst174) +// CHECK:STDOUT: inst175: symbolic_constant77 +// CHECK:STDOUT: inst176: symbolic_constant91 +// CHECK:STDOUT: inst177: symbolic_constant92 +// CHECK:STDOUT: inst178: symbolic_constant93 +// CHECK:STDOUT: inst179: symbolic_constant96 +// CHECK:STDOUT: inst180: symbolic_constant97 +// CHECK:STDOUT: inst181: symbolic_constant98 +// CHECK:STDOUT: inst182: constant +// CHECK:STDOUT: inst183: concrete_constant(inst183) +// CHECK:STDOUT: inst184: concrete_constant(inst(TypeType)) +// CHECK:STDOUT: inst185: concrete_constant(inst71) +// CHECK:STDOUT: inst186: constant +// CHECK:STDOUT: inst187: concrete_constant(inst187) +// CHECK:STDOUT: inst188: concrete_constant(inst36) +// CHECK:STDOUT: inst189: concrete_constant(inst71) +// CHECK:STDOUT: inst190: constant +// CHECK:STDOUT: inst191: concrete_constant(inst191) +// CHECK:STDOUT: inst192: symbolic_constant99 +// CHECK:STDOUT: inst193: symbolic_constant100 +// CHECK:STDOUT: inst194: symbolic_constant101 +// CHECK:STDOUT: inst195: concrete_constant(inst195) +// CHECK:STDOUT: inst196: concrete_constant(inst196) +// CHECK:STDOUT: inst197: symbolic_constant103 +// CHECK:STDOUT: inst198: symbolic_constant104 +// CHECK:STDOUT: inst199: symbolic_constant102 +// CHECK:STDOUT: inst200: concrete_constant(inst71) +// CHECK:STDOUT: inst201: constant +// CHECK:STDOUT: inst202: concrete_constant(inst202) +// CHECK:STDOUT: inst203: symbolic_constant109 +// CHECK:STDOUT: inst204: symbolic_constant111 +// CHECK:STDOUT: inst205: symbolic_constant112 +// CHECK:STDOUT: inst206: symbolic_constant113 +// CHECK:STDOUT: inst207: symbolic_constant114 +// CHECK:STDOUT: inst208: symbolic_constant115 +// CHECK:STDOUT: inst209: symbolic_constant116 +// CHECK:STDOUT: inst210: symbolic_constant119 +// CHECK:STDOUT: inst211: symbolic_constant117 +// CHECK:STDOUT: inst212: symbolic_constant118 +// CHECK:STDOUT: inst213: symbolic_constant121 +// CHECK:STDOUT: inst214: concrete_constant(inst214) +// CHECK:STDOUT: inst215: concrete_constant(inst215) +// CHECK:STDOUT: inst216: concrete_constant(inst216) +// CHECK:STDOUT: inst217: concrete_constant(inst217) +// CHECK:STDOUT: inst218: symbolic_constant103 +// CHECK:STDOUT: inst219: symbolic_constant104 +// CHECK:STDOUT: inst220: symbolic_constant124 +// CHECK:STDOUT: inst221: symbolic_constant125 +// CHECK:STDOUT: inst222: symbolic_constant131 +// CHECK:STDOUT: inst223: symbolic_constant132 +// CHECK:STDOUT: inst224: symbolic_constant133 +// CHECK:STDOUT: inst225: symbolic_constant134 +// CHECK:STDOUT: inst226: symbolic_constant135 +// CHECK:STDOUT: inst227: symbolic_constant136 +// CHECK:STDOUT: inst228: symbolic_constant137 +// CHECK:STDOUT: inst229: symbolic_constant145 +// CHECK:STDOUT: inst230: symbolic_constant147 +// CHECK:STDOUT: inst231: symbolic_constant149 +// CHECK:STDOUT: inst232: symbolic_constant151 +// CHECK:STDOUT: inst233: symbolic_constant153 +// CHECK:STDOUT: inst234: symbolic_constant155 +// CHECK:STDOUT: inst235: symbolic_constant157 +// CHECK:STDOUT: inst236: symbolic_constant158 +// CHECK:STDOUT: inst237: symbolic_constant159 +// CHECK:STDOUT: inst238: symbolic_constant160 +// CHECK:STDOUT: inst239: symbolic_constant161 +// CHECK:STDOUT: inst240: symbolic_constant162 +// CHECK:STDOUT: inst241: symbolic_constant163 +// CHECK:STDOUT: inst242: symbolic_constant164 +// CHECK:STDOUT: inst243: symbolic_constant165 +// CHECK:STDOUT: inst244: symbolic_constant166 +// CHECK:STDOUT: inst245: symbolic_constant167 +// CHECK:STDOUT: inst246: symbolic_constant168 +// CHECK:STDOUT: inst247: symbolic_constant169 +// CHECK:STDOUT: inst248: symbolic_constant170 +// CHECK:STDOUT: inst249: constant +// CHECK:STDOUT: inst250: concrete_constant(inst250) +// CHECK:STDOUT: inst251: symbolic_constant171 +// CHECK:STDOUT: inst252: symbolic_constant172 +// CHECK:STDOUT: inst253: symbolic_constant173 +// CHECK:STDOUT: inst254: concrete_constant(inst254) +// CHECK:STDOUT: inst255: concrete_constant(inst255) +// CHECK:STDOUT: inst256: concrete_constant(inst256) +// CHECK:STDOUT: inst257: symbolic_constant175 +// CHECK:STDOUT: inst258: symbolic_constant176 +// CHECK:STDOUT: inst259: symbolic_constant177 +// CHECK:STDOUT: inst260: symbolic_constant174 +// CHECK:STDOUT: inst261: concrete_constant(inst71) +// CHECK:STDOUT: inst262: constant +// CHECK:STDOUT: inst263: concrete_constant(inst263) +// CHECK:STDOUT: inst264: symbolic_constant184 +// CHECK:STDOUT: inst265: symbolic_constant186 +// CHECK:STDOUT: inst266: symbolic_constant187 +// CHECK:STDOUT: inst267: symbolic_constant188 +// CHECK:STDOUT: inst268: symbolic_constant189 +// CHECK:STDOUT: inst269: symbolic_constant190 +// CHECK:STDOUT: inst270: symbolic_constant191 +// CHECK:STDOUT: inst271: symbolic_constant192 +// CHECK:STDOUT: inst272: symbolic_constant193 +// CHECK:STDOUT: inst273: symbolic_constant196 +// CHECK:STDOUT: inst274: symbolic_constant194 +// CHECK:STDOUT: inst275: symbolic_constant195 +// CHECK:STDOUT: inst276: symbolic_constant198 +// CHECK:STDOUT: inst277: concrete_constant(inst277) +// CHECK:STDOUT: inst278: concrete_constant(inst278) +// CHECK:STDOUT: inst279: concrete_constant(inst279) +// CHECK:STDOUT: inst280: concrete_constant(inst280) +// CHECK:STDOUT: inst281: symbolic_constant175 +// CHECK:STDOUT: inst282: symbolic_constant176 +// CHECK:STDOUT: inst283: symbolic_constant177 +// CHECK:STDOUT: inst284: symbolic_constant201 +// CHECK:STDOUT: inst285: symbolic_constant202 +// CHECK:STDOUT: inst286: symbolic_constant210 +// CHECK:STDOUT: inst287: symbolic_constant211 +// CHECK:STDOUT: inst288: symbolic_constant212 +// CHECK:STDOUT: inst289: symbolic_constant213 +// CHECK:STDOUT: inst290: symbolic_constant214 +// CHECK:STDOUT: inst291: symbolic_constant215 +// CHECK:STDOUT: inst292: symbolic_constant216 +// CHECK:STDOUT: inst293: symbolic_constant217 +// CHECK:STDOUT: inst294: symbolic_constant218 +// CHECK:STDOUT: inst295: symbolic_constant232 +// CHECK:STDOUT: inst296: symbolic_constant234 +// CHECK:STDOUT: inst297: symbolic_constant236 +// CHECK:STDOUT: inst298: symbolic_constant238 +// CHECK:STDOUT: inst299: symbolic_constant240 +// CHECK:STDOUT: inst300: symbolic_constant242 +// CHECK:STDOUT: inst301: symbolic_constant244 +// CHECK:STDOUT: inst302: symbolic_constant245 +// CHECK:STDOUT: inst303: symbolic_constant246 +// CHECK:STDOUT: inst304: symbolic_constant247 +// CHECK:STDOUT: inst305: symbolic_constant248 +// CHECK:STDOUT: inst306: symbolic_constant249 +// CHECK:STDOUT: inst307: symbolic_constant250 +// CHECK:STDOUT: inst308: symbolic_constant251 +// CHECK:STDOUT: inst309: symbolic_constant252 +// CHECK:STDOUT: inst310: symbolic_constant253 +// CHECK:STDOUT: inst311: symbolic_constant254 +// CHECK:STDOUT: inst312: symbolic_constant255 +// CHECK:STDOUT: inst313: symbolic_constant256 +// CHECK:STDOUT: inst314: symbolic_constant257 +// CHECK:STDOUT: inst315: symbolic_constant258 +// CHECK:STDOUT: inst316: symbolic_constant259 +// CHECK:STDOUT: inst317: symbolic_constant260 +// CHECK:STDOUT: inst318: symbolic_constant261 +// CHECK:STDOUT: inst319: symbolic_constant262 +// CHECK:STDOUT: inst320: symbolic_constant263 +// CHECK:STDOUT: inst321: symbolic_constant265 +// CHECK:STDOUT: inst322: symbolic_constant266 +// CHECK:STDOUT: inst323: symbolic_constant267 +// CHECK:STDOUT: inst324: symbolic_constant268 +// CHECK:STDOUT: inst325: symbolic_constant272 +// CHECK:STDOUT: inst326: symbolic_constant269 +// CHECK:STDOUT: inst327: symbolic_constant270 +// CHECK:STDOUT: inst328: symbolic_constant271 +// CHECK:STDOUT: inst329: symbolic_constant272 +// CHECK:STDOUT: inst331: symbolic_constant274 +// CHECK:STDOUT: inst332: symbolic_constant273 +// CHECK:STDOUT: inst333: symbolic_constant274 +// CHECK:STDOUT: inst335: symbolic_constant15 +// CHECK:STDOUT: inst339: concrete_constant(inst340) +// CHECK:STDOUT: inst340: concrete_constant(inst340) +// CHECK:STDOUT: inst341: concrete_constant(inst340) // CHECK:STDOUT: symbolic_constants: // CHECK:STDOUT: symbolic_constant0: {inst: inst19, generic: generic, index: generic_inst, kind: self} // CHECK:STDOUT: symbolic_constant1: {inst: inst21, generic: generic, index: generic_inst, kind: checked} @@ -694,121 +1038,256 @@ fn Foo[T:! type](p: T*) -> (T*, ()) { // CHECK:STDOUT: symbolic_constant22: {inst: inst72, generic: generic1, index: generic_inst_in_decl0, kind: checked} // CHECK:STDOUT: symbolic_constant23: {inst: inst82, generic: generic1, index: generic_inst_in_decl1, kind: checked} // CHECK:STDOUT: symbolic_constant24: {inst: inst83, generic: generic1, index: generic_inst_in_decl2, kind: checked} -// CHECK:STDOUT: symbolic_constant25: {inst: inst27, generic: generic2, index: generic_inst_in_decl1, kind: checked} -// CHECK:STDOUT: symbolic_constant26: {inst: inst21, generic: generic2, index: generic_inst_in_decl0, kind: checked} -// CHECK:STDOUT: symbolic_constant27: {inst: inst21, generic: generic2, index: generic_inst_in_decl0, kind: checked} -// CHECK:STDOUT: symbolic_constant28: {inst: inst117, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant29: {inst: inst117, generic: generic2, index: generic_inst_in_decl2, kind: checked} -// CHECK:STDOUT: symbolic_constant30: {inst: inst21, generic: generic2, index: generic_inst_in_decl0, kind: checked} -// CHECK:STDOUT: symbolic_constant31: {inst: inst27, generic: generic2, index: generic_inst_in_decl1, kind: checked} -// CHECK:STDOUT: symbolic_constant32: {inst: inst117, generic: generic2, index: generic_inst_in_decl2, kind: checked} -// CHECK:STDOUT: symbolic_constant33: {inst: inst122, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant34: {inst: inst123, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant35: {inst: inst123, generic: generic2, index: generic_inst_in_def1, kind: checked} -// CHECK:STDOUT: symbolic_constant36: {inst: inst122, generic: generic2, index: generic_inst_in_def0, kind: checked} -// CHECK:STDOUT: symbolic_constant37: {inst: inst30, generic: generic3, index: generic_inst_in_decl2, kind: checked} -// CHECK:STDOUT: symbolic_constant38: {inst: inst123, generic: generic2, index: generic_inst_in_def1, kind: checked} -// CHECK:STDOUT: symbolic_constant39: {inst: inst61, generic: generic2, index: generic_inst_in_def2, kind: checked} -// CHECK:STDOUT: symbolic_constant40: {inst: inst122, generic: generic2, index: generic_inst_in_def0, kind: checked} -// CHECK:STDOUT: symbolic_constant41: {inst: inst123, generic: generic2, index: generic_inst_in_def1, kind: checked} -// CHECK:STDOUT: symbolic_constant42: {inst: inst61, generic: generic2, index: generic_inst_in_def2, kind: checked} -// CHECK:STDOUT: symbolic_constant43: {inst: inst21, generic: generic3, index: generic_inst_in_decl0, kind: checked} -// CHECK:STDOUT: symbolic_constant44: {inst: inst27, generic: generic3, index: generic_inst_in_decl1, kind: checked} -// CHECK:STDOUT: symbolic_constant45: {inst: inst21, generic: generic3, index: generic_inst_in_decl0, kind: checked} -// CHECK:STDOUT: symbolic_constant46: {inst: inst27, generic: generic3, index: generic_inst_in_decl1, kind: checked} -// CHECK:STDOUT: symbolic_constant47: {inst: inst30, generic: generic3, index: generic_inst_in_decl2, kind: checked} -// CHECK:STDOUT: symbolic_constant48: {inst: inst145, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant49: {inst: inst146, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant50: {inst: inst147, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant51: {inst: inst148, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant52: {inst: inst149, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant53: {inst: inst149, generic: generic4, index: generic_inst_in_decl4, kind: checked} -// CHECK:STDOUT: symbolic_constant54: {inst: inst147, generic: generic4, index: generic_inst_in_decl0, kind: checked} -// CHECK:STDOUT: symbolic_constant55: {inst: inst145, generic: generic4, index: generic_inst_in_decl1, kind: checked} -// CHECK:STDOUT: symbolic_constant56: {inst: inst147, generic: generic4, index: generic_inst_in_decl0, kind: checked} -// CHECK:STDOUT: symbolic_constant57: {inst: inst145, generic: generic4, index: generic_inst_in_decl1, kind: checked} -// CHECK:STDOUT: symbolic_constant58: {inst: inst148, generic: generic4, index: generic_inst_in_decl2, kind: checked} -// CHECK:STDOUT: symbolic_constant59: {inst: inst146, generic: generic4, index: generic_inst_in_decl3, kind: checked} -// CHECK:STDOUT: symbolic_constant60: {inst: inst159, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant61: {inst: inst159, generic: generic4, index: generic_inst_in_decl5, kind: checked} -// CHECK:STDOUT: symbolic_constant62: {inst: inst147, generic: generic4, index: generic_inst_in_decl0, kind: checked} -// CHECK:STDOUT: symbolic_constant63: {inst: inst145, generic: generic4, index: generic_inst_in_decl1, kind: checked} -// CHECK:STDOUT: symbolic_constant64: {inst: inst148, generic: generic4, index: generic_inst_in_decl2, kind: checked} -// CHECK:STDOUT: symbolic_constant65: {inst: inst146, generic: generic4, index: generic_inst_in_decl3, kind: checked} -// CHECK:STDOUT: symbolic_constant66: {inst: inst149, generic: generic4, index: generic_inst_in_decl4, kind: checked} -// CHECK:STDOUT: symbolic_constant67: {inst: inst159, generic: generic4, index: generic_inst_in_decl5, kind: checked} -// CHECK:STDOUT: symbolic_constant68: {inst: inst167, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant69: {inst: inst168, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant70: {inst: inst168, generic: generic4, index: generic_inst_in_def1, kind: checked} -// CHECK:STDOUT: symbolic_constant71: {inst: inst167, generic: generic4, index: generic_inst_in_def0, kind: checked} -// CHECK:STDOUT: symbolic_constant72: {inst: inst169, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant73: {inst: inst169, generic: generic5, index: generic_inst_in_decl5, kind: checked} -// CHECK:STDOUT: symbolic_constant74: {inst: inst168, generic: generic4, index: generic_inst_in_def1, kind: checked} -// CHECK:STDOUT: symbolic_constant75: {inst: inst167, generic: generic4, index: generic_inst_in_def0, kind: checked} -// CHECK:STDOUT: symbolic_constant76: {inst: inst168, generic: generic4, index: generic_inst_in_def1, kind: checked} -// CHECK:STDOUT: symbolic_constant77: {inst: inst147, generic: generic5, index: generic_inst_in_decl0, kind: checked} -// CHECK:STDOUT: symbolic_constant78: {inst: inst148, generic: generic5, index: generic_inst_in_decl1, kind: checked} -// CHECK:STDOUT: symbolic_constant79: {inst: inst145, generic: generic5, index: generic_inst_in_decl2, kind: checked} -// CHECK:STDOUT: symbolic_constant80: {inst: inst146, generic: generic5, index: generic_inst_in_decl3, kind: checked} -// CHECK:STDOUT: symbolic_constant81: {inst: inst149, generic: generic5, index: generic_inst_in_decl4, kind: checked} -// CHECK:STDOUT: symbolic_constant82: {inst: inst147, generic: generic5, index: generic_inst_in_decl0, kind: checked} -// CHECK:STDOUT: symbolic_constant83: {inst: inst148, generic: generic5, index: generic_inst_in_decl1, kind: checked} -// CHECK:STDOUT: symbolic_constant84: {inst: inst145, generic: generic5, index: generic_inst_in_decl2, kind: checked} -// CHECK:STDOUT: symbolic_constant85: {inst: inst146, generic: generic5, index: generic_inst_in_decl3, kind: checked} -// CHECK:STDOUT: symbolic_constant86: {inst: inst149, generic: generic5, index: generic_inst_in_decl4, kind: checked} -// CHECK:STDOUT: symbolic_constant87: {inst: inst169, generic: generic5, index: generic_inst_in_decl5, kind: checked} -// CHECK:STDOUT: symbolic_constant88: {inst: inst184, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant89: {inst: inst184, generic: generic5, index: generic_inst_in_def0, kind: checked} -// CHECK:STDOUT: symbolic_constant90: {inst: inst185, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant91: {inst: inst185, generic: generic5, index: generic_inst_in_def1, kind: checked} -// CHECK:STDOUT: symbolic_constant92: {inst: inst186, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant93: {inst: inst186, generic: generic5, index: generic_inst_in_def2, kind: checked} -// CHECK:STDOUT: symbolic_constant94: {inst: inst187, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant95: {inst: inst187, generic: generic5, index: generic_inst_in_def3, kind: checked} -// CHECK:STDOUT: symbolic_constant96: {inst: inst188, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant97: {inst: inst188, generic: generic5, index: generic_inst_in_def4, kind: checked} -// CHECK:STDOUT: symbolic_constant98: {inst: inst189, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant99: {inst: inst189, generic: generic5, index: generic_inst_in_def5, kind: checked} -// CHECK:STDOUT: symbolic_constant100: {inst: inst190, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant101: {inst: inst190, generic: generic5, index: generic_inst_in_def6, kind: checked} -// CHECK:STDOUT: symbolic_constant102: {inst: inst191, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant103: {inst: inst191, generic: generic5, index: generic_inst_in_def7, kind: checked} -// CHECK:STDOUT: symbolic_constant104: {inst: inst192, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant105: {inst: inst192, generic: generic5, index: generic_inst_in_def8, kind: checked} -// CHECK:STDOUT: symbolic_constant106: {inst: inst193, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant107: {inst: inst193, generic: generic5, index: generic_inst_in_def9, kind: checked} -// CHECK:STDOUT: symbolic_constant108: {inst: inst194, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant109: {inst: inst194, generic: generic5, index: generic_inst_in_def10, kind: checked} -// CHECK:STDOUT: symbolic_constant110: {inst: inst195, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant111: {inst: inst195, generic: generic5, index: generic_inst_in_def11, kind: checked} -// CHECK:STDOUT: symbolic_constant112: {inst: inst196, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant113: {inst: inst196, generic: generic5, index: generic_inst_in_def12, kind: checked} -// CHECK:STDOUT: symbolic_constant114: {inst: inst184, generic: generic5, index: generic_inst_in_def0, kind: checked} -// CHECK:STDOUT: symbolic_constant115: {inst: inst185, generic: generic5, index: generic_inst_in_def1, kind: checked} -// CHECK:STDOUT: symbolic_constant116: {inst: inst186, generic: generic5, index: generic_inst_in_def2, kind: checked} -// CHECK:STDOUT: symbolic_constant117: {inst: inst187, generic: generic5, index: generic_inst_in_def3, kind: checked} -// CHECK:STDOUT: symbolic_constant118: {inst: inst188, generic: generic5, index: generic_inst_in_def4, kind: checked} -// CHECK:STDOUT: symbolic_constant119: {inst: inst189, generic: generic5, index: generic_inst_in_def5, kind: checked} -// CHECK:STDOUT: symbolic_constant120: {inst: inst190, generic: generic5, index: generic_inst_in_def6, kind: checked} -// CHECK:STDOUT: symbolic_constant121: {inst: inst191, generic: generic5, index: generic_inst_in_def7, kind: checked} -// CHECK:STDOUT: symbolic_constant122: {inst: inst192, generic: generic5, index: generic_inst_in_def8, kind: checked} -// CHECK:STDOUT: symbolic_constant123: {inst: inst193, generic: generic5, index: generic_inst_in_def9, kind: checked} -// CHECK:STDOUT: symbolic_constant124: {inst: inst194, generic: generic5, index: generic_inst_in_def10, kind: checked} -// CHECK:STDOUT: symbolic_constant125: {inst: inst195, generic: generic5, index: generic_inst_in_def11, kind: checked} -// CHECK:STDOUT: symbolic_constant126: {inst: inst196, generic: generic5, index: generic_inst_in_def12, kind: checked} -// CHECK:STDOUT: symbolic_constant127: {inst: inst210, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant128: {inst: inst211, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant129: {inst: inst117, generic: generic2, index: generic_inst_in_decl2, kind: checked} -// CHECK:STDOUT: symbolic_constant130: {inst: inst212, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant131: {inst: inst212, generic: generic0, index: generic_inst_in_def2, kind: checked} -// CHECK:STDOUT: symbolic_constant132: {inst: inst214, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant133: {inst: inst215, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant134: {inst: inst217, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant135: {inst: inst214, generic: generic0, index: generic_inst_in_def3, kind: checked} -// CHECK:STDOUT: symbolic_constant136: {inst: inst215, generic: generic0, index: generic_inst_in_def4, kind: checked} -// CHECK:STDOUT: symbolic_constant137: {inst: inst217, generic: generic0, index: generic_inst_in_def5, kind: checked} -// CHECK:STDOUT: symbolic_constant138: {inst: inst223, generic: generic, index: generic_inst, kind: checked} -// CHECK:STDOUT: symbolic_constant139: {inst: inst223, generic: generic0, index: generic_inst_in_def6, kind: checked} +// CHECK:STDOUT: symbolic_constant25: {inst: inst95, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant26: {inst: inst96, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant27: {inst: inst97, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant28: {inst: inst97, generic: generic2, index: generic_inst_in_decl2, kind: checked} +// CHECK:STDOUT: symbolic_constant29: {inst: inst95, generic: generic2, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant30: {inst: inst95, generic: generic2, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant31: {inst: inst96, generic: generic2, index: generic_inst_in_decl1, kind: checked} +// CHECK:STDOUT: symbolic_constant32: {inst: inst105, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant33: {inst: inst105, generic: generic2, index: generic_inst_in_decl3, kind: checked} +// CHECK:STDOUT: symbolic_constant34: {inst: inst95, generic: generic2, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant35: {inst: inst96, generic: generic2, index: generic_inst_in_decl1, kind: checked} +// CHECK:STDOUT: symbolic_constant36: {inst: inst97, generic: generic2, index: generic_inst_in_decl2, kind: checked} +// CHECK:STDOUT: symbolic_constant37: {inst: inst105, generic: generic2, index: generic_inst_in_decl3, kind: checked} +// CHECK:STDOUT: symbolic_constant38: {inst: inst111, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant39: {inst: inst112, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant40: {inst: inst112, generic: generic2, index: generic_inst_in_def1, kind: checked} +// CHECK:STDOUT: symbolic_constant41: {inst: inst111, generic: generic2, index: generic_inst_in_def0, kind: checked} +// CHECK:STDOUT: symbolic_constant42: {inst: inst113, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant43: {inst: inst113, generic: generic3, index: generic_inst_in_decl3, kind: checked} +// CHECK:STDOUT: symbolic_constant44: {inst: inst112, generic: generic2, index: generic_inst_in_def1, kind: checked} +// CHECK:STDOUT: symbolic_constant45: {inst: inst111, generic: generic2, index: generic_inst_in_def0, kind: checked} +// CHECK:STDOUT: symbolic_constant46: {inst: inst112, generic: generic2, index: generic_inst_in_def1, kind: checked} +// CHECK:STDOUT: symbolic_constant47: {inst: inst95, generic: generic3, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant48: {inst: inst96, generic: generic3, index: generic_inst_in_decl1, kind: checked} +// CHECK:STDOUT: symbolic_constant49: {inst: inst97, generic: generic3, index: generic_inst_in_decl2, kind: checked} +// CHECK:STDOUT: symbolic_constant50: {inst: inst95, generic: generic3, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant51: {inst: inst96, generic: generic3, index: generic_inst_in_decl1, kind: checked} +// CHECK:STDOUT: symbolic_constant52: {inst: inst97, generic: generic3, index: generic_inst_in_decl2, kind: checked} +// CHECK:STDOUT: symbolic_constant53: {inst: inst113, generic: generic3, index: generic_inst_in_decl3, kind: checked} +// CHECK:STDOUT: symbolic_constant54: {inst: inst125, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant55: {inst: inst125, generic: generic3, index: generic_inst_in_def0, kind: checked} +// CHECK:STDOUT: symbolic_constant56: {inst: inst126, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant57: {inst: inst126, generic: generic3, index: generic_inst_in_def1, kind: checked} +// CHECK:STDOUT: symbolic_constant58: {inst: inst127, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant59: {inst: inst127, generic: generic3, index: generic_inst_in_def2, kind: checked} +// CHECK:STDOUT: symbolic_constant60: {inst: inst128, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant61: {inst: inst128, generic: generic3, index: generic_inst_in_def3, kind: checked} +// CHECK:STDOUT: symbolic_constant62: {inst: inst129, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant63: {inst: inst129, generic: generic3, index: generic_inst_in_def4, kind: checked} +// CHECK:STDOUT: symbolic_constant64: {inst: inst130, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant65: {inst: inst130, generic: generic3, index: generic_inst_in_def5, kind: checked} +// CHECK:STDOUT: symbolic_constant66: {inst: inst131, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant67: {inst: inst131, generic: generic3, index: generic_inst_in_def6, kind: checked} +// CHECK:STDOUT: symbolic_constant68: {inst: inst125, generic: generic3, index: generic_inst_in_def0, kind: checked} +// CHECK:STDOUT: symbolic_constant69: {inst: inst126, generic: generic3, index: generic_inst_in_def1, kind: checked} +// CHECK:STDOUT: symbolic_constant70: {inst: inst127, generic: generic3, index: generic_inst_in_def2, kind: checked} +// CHECK:STDOUT: symbolic_constant71: {inst: inst128, generic: generic3, index: generic_inst_in_def3, kind: checked} +// CHECK:STDOUT: symbolic_constant72: {inst: inst129, generic: generic3, index: generic_inst_in_def4, kind: checked} +// CHECK:STDOUT: symbolic_constant73: {inst: inst130, generic: generic3, index: generic_inst_in_def5, kind: checked} +// CHECK:STDOUT: symbolic_constant74: {inst: inst131, generic: generic3, index: generic_inst_in_def6, kind: checked} +// CHECK:STDOUT: symbolic_constant75: {inst: inst139, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant76: {inst: inst27, generic: generic4, index: generic_inst_in_decl1, kind: checked} +// CHECK:STDOUT: symbolic_constant77: {inst: inst21, generic: generic4, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant78: {inst: inst21, generic: generic4, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant79: {inst: inst164, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant80: {inst: inst164, generic: generic4, index: generic_inst_in_decl2, kind: checked} +// CHECK:STDOUT: symbolic_constant81: {inst: inst21, generic: generic4, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant82: {inst: inst27, generic: generic4, index: generic_inst_in_decl1, kind: checked} +// CHECK:STDOUT: symbolic_constant83: {inst: inst164, generic: generic4, index: generic_inst_in_decl2, kind: checked} +// CHECK:STDOUT: symbolic_constant84: {inst: inst169, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant85: {inst: inst170, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant86: {inst: inst170, generic: generic4, index: generic_inst_in_def1, kind: checked} +// CHECK:STDOUT: symbolic_constant87: {inst: inst169, generic: generic4, index: generic_inst_in_def0, kind: checked} +// CHECK:STDOUT: symbolic_constant88: {inst: inst30, generic: generic5, index: generic_inst_in_decl2, kind: checked} +// CHECK:STDOUT: symbolic_constant89: {inst: inst170, generic: generic4, index: generic_inst_in_def1, kind: checked} +// CHECK:STDOUT: symbolic_constant90: {inst: inst61, generic: generic4, index: generic_inst_in_def2, kind: checked} +// CHECK:STDOUT: symbolic_constant91: {inst: inst169, generic: generic4, index: generic_inst_in_def0, kind: checked} +// CHECK:STDOUT: symbolic_constant92: {inst: inst170, generic: generic4, index: generic_inst_in_def1, kind: checked} +// CHECK:STDOUT: symbolic_constant93: {inst: inst61, generic: generic4, index: generic_inst_in_def2, kind: checked} +// CHECK:STDOUT: symbolic_constant94: {inst: inst21, generic: generic5, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant95: {inst: inst27, generic: generic5, index: generic_inst_in_decl1, kind: checked} +// CHECK:STDOUT: symbolic_constant96: {inst: inst21, generic: generic5, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant97: {inst: inst27, generic: generic5, index: generic_inst_in_decl1, kind: checked} +// CHECK:STDOUT: symbolic_constant98: {inst: inst30, generic: generic5, index: generic_inst_in_decl2, kind: checked} +// CHECK:STDOUT: symbolic_constant99: {inst: inst192, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant100: {inst: inst193, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant101: {inst: inst194, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant102: {inst: inst194, generic: generic6, index: generic_inst_in_decl4, kind: checked} +// CHECK:STDOUT: symbolic_constant103: {inst: inst95, generic: generic6, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant104: {inst: inst192, generic: generic6, index: generic_inst_in_decl1, kind: checked} +// CHECK:STDOUT: symbolic_constant105: {inst: inst95, generic: generic6, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant106: {inst: inst192, generic: generic6, index: generic_inst_in_decl1, kind: checked} +// CHECK:STDOUT: symbolic_constant107: {inst: inst96, generic: generic6, index: generic_inst_in_decl2, kind: checked} +// CHECK:STDOUT: symbolic_constant108: {inst: inst193, generic: generic6, index: generic_inst_in_decl3, kind: checked} +// CHECK:STDOUT: symbolic_constant109: {inst: inst203, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant110: {inst: inst203, generic: generic6, index: generic_inst_in_decl5, kind: checked} +// CHECK:STDOUT: symbolic_constant111: {inst: inst95, generic: generic6, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant112: {inst: inst192, generic: generic6, index: generic_inst_in_decl1, kind: checked} +// CHECK:STDOUT: symbolic_constant113: {inst: inst96, generic: generic6, index: generic_inst_in_decl2, kind: checked} +// CHECK:STDOUT: symbolic_constant114: {inst: inst193, generic: generic6, index: generic_inst_in_decl3, kind: checked} +// CHECK:STDOUT: symbolic_constant115: {inst: inst194, generic: generic6, index: generic_inst_in_decl4, kind: checked} +// CHECK:STDOUT: symbolic_constant116: {inst: inst203, generic: generic6, index: generic_inst_in_decl5, kind: checked} +// CHECK:STDOUT: symbolic_constant117: {inst: inst211, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant118: {inst: inst212, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant119: {inst: inst212, generic: generic6, index: generic_inst_in_def1, kind: checked} +// CHECK:STDOUT: symbolic_constant120: {inst: inst211, generic: generic6, index: generic_inst_in_def0, kind: checked} +// CHECK:STDOUT: symbolic_constant121: {inst: inst213, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant122: {inst: inst213, generic: generic7, index: generic_inst_in_decl5, kind: checked} +// CHECK:STDOUT: symbolic_constant123: {inst: inst212, generic: generic6, index: generic_inst_in_def1, kind: checked} +// CHECK:STDOUT: symbolic_constant124: {inst: inst211, generic: generic6, index: generic_inst_in_def0, kind: checked} +// CHECK:STDOUT: symbolic_constant125: {inst: inst212, generic: generic6, index: generic_inst_in_def1, kind: checked} +// CHECK:STDOUT: symbolic_constant126: {inst: inst95, generic: generic7, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant127: {inst: inst96, generic: generic7, index: generic_inst_in_decl1, kind: checked} +// CHECK:STDOUT: symbolic_constant128: {inst: inst192, generic: generic7, index: generic_inst_in_decl2, kind: checked} +// CHECK:STDOUT: symbolic_constant129: {inst: inst193, generic: generic7, index: generic_inst_in_decl3, kind: checked} +// CHECK:STDOUT: symbolic_constant130: {inst: inst194, generic: generic7, index: generic_inst_in_decl4, kind: checked} +// CHECK:STDOUT: symbolic_constant131: {inst: inst95, generic: generic7, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant132: {inst: inst96, generic: generic7, index: generic_inst_in_decl1, kind: checked} +// CHECK:STDOUT: symbolic_constant133: {inst: inst192, generic: generic7, index: generic_inst_in_decl2, kind: checked} +// CHECK:STDOUT: symbolic_constant134: {inst: inst193, generic: generic7, index: generic_inst_in_decl3, kind: checked} +// CHECK:STDOUT: symbolic_constant135: {inst: inst194, generic: generic7, index: generic_inst_in_decl4, kind: checked} +// CHECK:STDOUT: symbolic_constant136: {inst: inst213, generic: generic7, index: generic_inst_in_decl5, kind: checked} +// CHECK:STDOUT: symbolic_constant137: {inst: inst228, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant138: {inst: inst228, generic: generic7, index: generic_inst_in_def0, kind: checked} +// CHECK:STDOUT: symbolic_constant139: {inst: inst126, generic: generic7, index: generic_inst_in_def1, kind: checked} +// CHECK:STDOUT: symbolic_constant140: {inst: inst127, generic: generic7, index: generic_inst_in_def2, kind: checked} +// CHECK:STDOUT: symbolic_constant141: {inst: inst128, generic: generic7, index: generic_inst_in_def3, kind: checked} +// CHECK:STDOUT: symbolic_constant142: {inst: inst129, generic: generic7, index: generic_inst_in_def4, kind: checked} +// CHECK:STDOUT: symbolic_constant143: {inst: inst130, generic: generic7, index: generic_inst_in_def5, kind: checked} +// CHECK:STDOUT: symbolic_constant144: {inst: inst131, generic: generic7, index: generic_inst_in_def6, kind: checked} +// CHECK:STDOUT: symbolic_constant145: {inst: inst229, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant146: {inst: inst229, generic: generic7, index: generic_inst_in_def7, kind: checked} +// CHECK:STDOUT: symbolic_constant147: {inst: inst230, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant148: {inst: inst230, generic: generic7, index: generic_inst_in_def8, kind: checked} +// CHECK:STDOUT: symbolic_constant149: {inst: inst231, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant150: {inst: inst231, generic: generic7, index: generic_inst_in_def9, kind: checked} +// CHECK:STDOUT: symbolic_constant151: {inst: inst232, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant152: {inst: inst232, generic: generic7, index: generic_inst_in_def10, kind: checked} +// CHECK:STDOUT: symbolic_constant153: {inst: inst233, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant154: {inst: inst233, generic: generic7, index: generic_inst_in_def11, kind: checked} +// CHECK:STDOUT: symbolic_constant155: {inst: inst234, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant156: {inst: inst234, generic: generic7, index: generic_inst_in_def12, kind: checked} +// CHECK:STDOUT: symbolic_constant157: {inst: inst228, generic: generic7, index: generic_inst_in_def0, kind: checked} +// CHECK:STDOUT: symbolic_constant158: {inst: inst126, generic: generic7, index: generic_inst_in_def1, kind: checked} +// CHECK:STDOUT: symbolic_constant159: {inst: inst127, generic: generic7, index: generic_inst_in_def2, kind: checked} +// CHECK:STDOUT: symbolic_constant160: {inst: inst128, generic: generic7, index: generic_inst_in_def3, kind: checked} +// CHECK:STDOUT: symbolic_constant161: {inst: inst129, generic: generic7, index: generic_inst_in_def4, kind: checked} +// CHECK:STDOUT: symbolic_constant162: {inst: inst130, generic: generic7, index: generic_inst_in_def5, kind: checked} +// CHECK:STDOUT: symbolic_constant163: {inst: inst131, generic: generic7, index: generic_inst_in_def6, kind: checked} +// CHECK:STDOUT: symbolic_constant164: {inst: inst229, generic: generic7, index: generic_inst_in_def7, kind: checked} +// CHECK:STDOUT: symbolic_constant165: {inst: inst230, generic: generic7, index: generic_inst_in_def8, kind: checked} +// CHECK:STDOUT: symbolic_constant166: {inst: inst231, generic: generic7, index: generic_inst_in_def9, kind: checked} +// CHECK:STDOUT: symbolic_constant167: {inst: inst232, generic: generic7, index: generic_inst_in_def10, kind: checked} +// CHECK:STDOUT: symbolic_constant168: {inst: inst233, generic: generic7, index: generic_inst_in_def11, kind: checked} +// CHECK:STDOUT: symbolic_constant169: {inst: inst234, generic: generic7, index: generic_inst_in_def12, kind: checked} +// CHECK:STDOUT: symbolic_constant170: {inst: inst248, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant171: {inst: inst251, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant172: {inst: inst252, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant173: {inst: inst253, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant174: {inst: inst253, generic: generic8, index: generic_inst_in_decl6, kind: checked} +// CHECK:STDOUT: symbolic_constant175: {inst: inst95, generic: generic8, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant176: {inst: inst192, generic: generic8, index: generic_inst_in_decl1, kind: checked} +// CHECK:STDOUT: symbolic_constant177: {inst: inst251, generic: generic8, index: generic_inst_in_decl2, kind: checked} +// CHECK:STDOUT: symbolic_constant178: {inst: inst95, generic: generic8, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant179: {inst: inst192, generic: generic8, index: generic_inst_in_decl1, kind: checked} +// CHECK:STDOUT: symbolic_constant180: {inst: inst251, generic: generic8, index: generic_inst_in_decl2, kind: checked} +// CHECK:STDOUT: symbolic_constant181: {inst: inst96, generic: generic8, index: generic_inst_in_decl3, kind: checked} +// CHECK:STDOUT: symbolic_constant182: {inst: inst193, generic: generic8, index: generic_inst_in_decl4, kind: checked} +// CHECK:STDOUT: symbolic_constant183: {inst: inst252, generic: generic8, index: generic_inst_in_decl5, kind: checked} +// CHECK:STDOUT: symbolic_constant184: {inst: inst264, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant185: {inst: inst264, generic: generic8, index: generic_inst_in_decl7, kind: checked} +// CHECK:STDOUT: symbolic_constant186: {inst: inst95, generic: generic8, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant187: {inst: inst192, generic: generic8, index: generic_inst_in_decl1, kind: checked} +// CHECK:STDOUT: symbolic_constant188: {inst: inst251, generic: generic8, index: generic_inst_in_decl2, kind: checked} +// CHECK:STDOUT: symbolic_constant189: {inst: inst96, generic: generic8, index: generic_inst_in_decl3, kind: checked} +// CHECK:STDOUT: symbolic_constant190: {inst: inst193, generic: generic8, index: generic_inst_in_decl4, kind: checked} +// CHECK:STDOUT: symbolic_constant191: {inst: inst252, generic: generic8, index: generic_inst_in_decl5, kind: checked} +// CHECK:STDOUT: symbolic_constant192: {inst: inst253, generic: generic8, index: generic_inst_in_decl6, kind: checked} +// CHECK:STDOUT: symbolic_constant193: {inst: inst264, generic: generic8, index: generic_inst_in_decl7, kind: checked} +// CHECK:STDOUT: symbolic_constant194: {inst: inst274, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant195: {inst: inst275, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant196: {inst: inst275, generic: generic8, index: generic_inst_in_def1, kind: checked} +// CHECK:STDOUT: symbolic_constant197: {inst: inst274, generic: generic8, index: generic_inst_in_def0, kind: checked} +// CHECK:STDOUT: symbolic_constant198: {inst: inst276, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant199: {inst: inst276, generic: generic9, index: generic_inst_in_decl7, kind: checked} +// CHECK:STDOUT: symbolic_constant200: {inst: inst275, generic: generic8, index: generic_inst_in_def1, kind: checked} +// CHECK:STDOUT: symbolic_constant201: {inst: inst274, generic: generic8, index: generic_inst_in_def0, kind: checked} +// CHECK:STDOUT: symbolic_constant202: {inst: inst275, generic: generic8, index: generic_inst_in_def1, kind: checked} +// CHECK:STDOUT: symbolic_constant203: {inst: inst95, generic: generic9, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant204: {inst: inst96, generic: generic9, index: generic_inst_in_decl1, kind: checked} +// CHECK:STDOUT: symbolic_constant205: {inst: inst192, generic: generic9, index: generic_inst_in_decl2, kind: checked} +// CHECK:STDOUT: symbolic_constant206: {inst: inst193, generic: generic9, index: generic_inst_in_decl3, kind: checked} +// CHECK:STDOUT: symbolic_constant207: {inst: inst251, generic: generic9, index: generic_inst_in_decl4, kind: checked} +// CHECK:STDOUT: symbolic_constant208: {inst: inst252, generic: generic9, index: generic_inst_in_decl5, kind: checked} +// CHECK:STDOUT: symbolic_constant209: {inst: inst253, generic: generic9, index: generic_inst_in_decl6, kind: checked} +// CHECK:STDOUT: symbolic_constant210: {inst: inst95, generic: generic9, index: generic_inst_in_decl0, kind: checked} +// CHECK:STDOUT: symbolic_constant211: {inst: inst96, generic: generic9, index: generic_inst_in_decl1, kind: checked} +// CHECK:STDOUT: symbolic_constant212: {inst: inst192, generic: generic9, index: generic_inst_in_decl2, kind: checked} +// CHECK:STDOUT: symbolic_constant213: {inst: inst193, generic: generic9, index: generic_inst_in_decl3, kind: checked} +// CHECK:STDOUT: symbolic_constant214: {inst: inst251, generic: generic9, index: generic_inst_in_decl4, kind: checked} +// CHECK:STDOUT: symbolic_constant215: {inst: inst252, generic: generic9, index: generic_inst_in_decl5, kind: checked} +// CHECK:STDOUT: symbolic_constant216: {inst: inst253, generic: generic9, index: generic_inst_in_decl6, kind: checked} +// CHECK:STDOUT: symbolic_constant217: {inst: inst276, generic: generic9, index: generic_inst_in_decl7, kind: checked} +// CHECK:STDOUT: symbolic_constant218: {inst: inst294, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant219: {inst: inst294, generic: generic9, index: generic_inst_in_def0, kind: checked} +// CHECK:STDOUT: symbolic_constant220: {inst: inst126, generic: generic9, index: generic_inst_in_def1, kind: checked} +// CHECK:STDOUT: symbolic_constant221: {inst: inst127, generic: generic9, index: generic_inst_in_def2, kind: checked} +// CHECK:STDOUT: symbolic_constant222: {inst: inst128, generic: generic9, index: generic_inst_in_def3, kind: checked} +// CHECK:STDOUT: symbolic_constant223: {inst: inst129, generic: generic9, index: generic_inst_in_def4, kind: checked} +// CHECK:STDOUT: symbolic_constant224: {inst: inst130, generic: generic9, index: generic_inst_in_def5, kind: checked} +// CHECK:STDOUT: symbolic_constant225: {inst: inst131, generic: generic9, index: generic_inst_in_def6, kind: checked} +// CHECK:STDOUT: symbolic_constant226: {inst: inst229, generic: generic9, index: generic_inst_in_def7, kind: checked} +// CHECK:STDOUT: symbolic_constant227: {inst: inst230, generic: generic9, index: generic_inst_in_def8, kind: checked} +// CHECK:STDOUT: symbolic_constant228: {inst: inst231, generic: generic9, index: generic_inst_in_def9, kind: checked} +// CHECK:STDOUT: symbolic_constant229: {inst: inst232, generic: generic9, index: generic_inst_in_def10, kind: checked} +// CHECK:STDOUT: symbolic_constant230: {inst: inst233, generic: generic9, index: generic_inst_in_def11, kind: checked} +// CHECK:STDOUT: symbolic_constant231: {inst: inst234, generic: generic9, index: generic_inst_in_def12, kind: checked} +// CHECK:STDOUT: symbolic_constant232: {inst: inst295, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant233: {inst: inst295, generic: generic9, index: generic_inst_in_def13, kind: checked} +// CHECK:STDOUT: symbolic_constant234: {inst: inst296, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant235: {inst: inst296, generic: generic9, index: generic_inst_in_def14, kind: checked} +// CHECK:STDOUT: symbolic_constant236: {inst: inst297, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant237: {inst: inst297, generic: generic9, index: generic_inst_in_def15, kind: checked} +// CHECK:STDOUT: symbolic_constant238: {inst: inst298, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant239: {inst: inst298, generic: generic9, index: generic_inst_in_def16, kind: checked} +// CHECK:STDOUT: symbolic_constant240: {inst: inst299, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant241: {inst: inst299, generic: generic9, index: generic_inst_in_def17, kind: checked} +// CHECK:STDOUT: symbolic_constant242: {inst: inst300, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant243: {inst: inst300, generic: generic9, index: generic_inst_in_def18, kind: checked} +// CHECK:STDOUT: symbolic_constant244: {inst: inst294, generic: generic9, index: generic_inst_in_def0, kind: checked} +// CHECK:STDOUT: symbolic_constant245: {inst: inst126, generic: generic9, index: generic_inst_in_def1, kind: checked} +// CHECK:STDOUT: symbolic_constant246: {inst: inst127, generic: generic9, index: generic_inst_in_def2, kind: checked} +// CHECK:STDOUT: symbolic_constant247: {inst: inst128, generic: generic9, index: generic_inst_in_def3, kind: checked} +// CHECK:STDOUT: symbolic_constant248: {inst: inst129, generic: generic9, index: generic_inst_in_def4, kind: checked} +// CHECK:STDOUT: symbolic_constant249: {inst: inst130, generic: generic9, index: generic_inst_in_def5, kind: checked} +// CHECK:STDOUT: symbolic_constant250: {inst: inst131, generic: generic9, index: generic_inst_in_def6, kind: checked} +// CHECK:STDOUT: symbolic_constant251: {inst: inst229, generic: generic9, index: generic_inst_in_def7, kind: checked} +// CHECK:STDOUT: symbolic_constant252: {inst: inst230, generic: generic9, index: generic_inst_in_def8, kind: checked} +// CHECK:STDOUT: symbolic_constant253: {inst: inst231, generic: generic9, index: generic_inst_in_def9, kind: checked} +// CHECK:STDOUT: symbolic_constant254: {inst: inst232, generic: generic9, index: generic_inst_in_def10, kind: checked} +// CHECK:STDOUT: symbolic_constant255: {inst: inst233, generic: generic9, index: generic_inst_in_def11, kind: checked} +// CHECK:STDOUT: symbolic_constant256: {inst: inst234, generic: generic9, index: generic_inst_in_def12, kind: checked} +// CHECK:STDOUT: symbolic_constant257: {inst: inst295, generic: generic9, index: generic_inst_in_def13, kind: checked} +// CHECK:STDOUT: symbolic_constant258: {inst: inst296, generic: generic9, index: generic_inst_in_def14, kind: checked} +// CHECK:STDOUT: symbolic_constant259: {inst: inst297, generic: generic9, index: generic_inst_in_def15, kind: checked} +// CHECK:STDOUT: symbolic_constant260: {inst: inst298, generic: generic9, index: generic_inst_in_def16, kind: checked} +// CHECK:STDOUT: symbolic_constant261: {inst: inst299, generic: generic9, index: generic_inst_in_def17, kind: checked} +// CHECK:STDOUT: symbolic_constant262: {inst: inst300, generic: generic9, index: generic_inst_in_def18, kind: checked} +// CHECK:STDOUT: symbolic_constant263: {inst: inst320, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant264: {inst: inst164, generic: generic4, index: generic_inst_in_decl2, kind: checked} +// CHECK:STDOUT: symbolic_constant265: {inst: inst321, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant266: {inst: inst321, generic: generic0, index: generic_inst_in_def2, kind: checked} +// CHECK:STDOUT: symbolic_constant267: {inst: inst323, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant268: {inst: inst324, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant269: {inst: inst326, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant270: {inst: inst323, generic: generic0, index: generic_inst_in_def3, kind: checked} +// CHECK:STDOUT: symbolic_constant271: {inst: inst324, generic: generic0, index: generic_inst_in_def4, kind: checked} +// CHECK:STDOUT: symbolic_constant272: {inst: inst326, generic: generic0, index: generic_inst_in_def5, kind: checked} +// CHECK:STDOUT: symbolic_constant273: {inst: inst332, generic: generic, index: generic_inst, kind: checked} +// CHECK:STDOUT: symbolic_constant274: {inst: inst332, generic: generic0, index: generic_inst_in_def6, kind: checked} // CHECK:STDOUT: inst_blocks: // CHECK:STDOUT: inst_block_empty: {} // CHECK:STDOUT: exports: @@ -829,59 +1308,93 @@ fn Foo[T:! type](p: T*) -> (T*, ()) { // CHECK:STDOUT: 12: inst88 // CHECK:STDOUT: 13: inst93 // CHECK:STDOUT: 14: inst94 -// CHECK:STDOUT: 15: inst95 -// CHECK:STDOUT: 16: inst96 -// CHECK:STDOUT: 17: inst97 -// CHECK:STDOUT: 18: inst98 -// CHECK:STDOUT: 19: inst99 -// CHECK:STDOUT: 20: inst100 -// CHECK:STDOUT: 21: inst101 -// CHECK:STDOUT: 22: inst102 -// CHECK:STDOUT: 23: inst103 -// CHECK:STDOUT: 24: inst104 -// CHECK:STDOUT: 25: inst105 -// CHECK:STDOUT: 26: inst106 -// CHECK:STDOUT: 27: inst107 -// CHECK:STDOUT: 28: inst108 -// CHECK:STDOUT: 29: inst109 -// CHECK:STDOUT: 30: inst110 -// CHECK:STDOUT: 31: inst111 -// CHECK:STDOUT: 32: inst112 -// CHECK:STDOUT: 33: inst113 -// CHECK:STDOUT: 34: inst114 -// CHECK:STDOUT: 35: inst115 -// CHECK:STDOUT: 36: inst116 -// CHECK:STDOUT: 37: inst121 -// CHECK:STDOUT: 38: inst124 -// CHECK:STDOUT: 39: inst125 -// CHECK:STDOUT: 40: inst126 -// CHECK:STDOUT: 41: inst127 -// CHECK:STDOUT: 42: inst128 -// CHECK:STDOUT: 43: inst135 -// CHECK:STDOUT: 44: inst136 -// CHECK:STDOUT: 45: inst137 -// CHECK:STDOUT: 46: inst138 -// CHECK:STDOUT: 47: inst139 -// CHECK:STDOUT: 48: inst140 -// CHECK:STDOUT: 49: inst141 -// CHECK:STDOUT: 50: inst142 -// CHECK:STDOUT: 51: inst143 -// CHECK:STDOUT: 52: inst144 -// CHECK:STDOUT: 53: inst151 -// CHECK:STDOUT: 54: inst152 -// CHECK:STDOUT: 55: inst153 -// CHECK:STDOUT: 56: inst154 -// CHECK:STDOUT: 57: inst155 -// CHECK:STDOUT: 58: inst156 -// CHECK:STDOUT: 59: inst157 -// CHECK:STDOUT: 60: inst158 -// CHECK:STDOUT: 61: inst166 -// CHECK:STDOUT: 62: inst170 -// CHECK:STDOUT: 63: inst171 -// CHECK:STDOUT: 64: inst172 -// CHECK:STDOUT: 65: inst173 -// CHECK:STDOUT: 66: inst174 -// CHECK:STDOUT: 67: inst175 +// CHECK:STDOUT: 15: inst99 +// CHECK:STDOUT: 16: inst100 +// CHECK:STDOUT: 17: inst101 +// CHECK:STDOUT: 18: inst102 +// CHECK:STDOUT: 19: inst103 +// CHECK:STDOUT: 20: inst104 +// CHECK:STDOUT: 21: inst110 +// CHECK:STDOUT: 22: inst114 +// CHECK:STDOUT: 23: inst115 +// CHECK:STDOUT: 24: inst116 +// CHECK:STDOUT: 25: inst117 +// CHECK:STDOUT: 26: inst118 +// CHECK:STDOUT: 27: inst140 +// CHECK:STDOUT: 28: inst141 +// CHECK:STDOUT: 29: inst142 +// CHECK:STDOUT: 30: inst143 +// CHECK:STDOUT: 31: inst144 +// CHECK:STDOUT: 32: inst145 +// CHECK:STDOUT: 33: inst146 +// CHECK:STDOUT: 34: inst147 +// CHECK:STDOUT: 35: inst148 +// CHECK:STDOUT: 36: inst149 +// CHECK:STDOUT: 37: inst150 +// CHECK:STDOUT: 38: inst151 +// CHECK:STDOUT: 39: inst152 +// CHECK:STDOUT: 40: inst153 +// CHECK:STDOUT: 41: inst154 +// CHECK:STDOUT: 42: inst155 +// CHECK:STDOUT: 43: inst156 +// CHECK:STDOUT: 44: inst157 +// CHECK:STDOUT: 45: inst158 +// CHECK:STDOUT: 46: inst159 +// CHECK:STDOUT: 47: inst160 +// CHECK:STDOUT: 48: inst161 +// CHECK:STDOUT: 49: inst162 +// CHECK:STDOUT: 50: inst163 +// CHECK:STDOUT: 51: inst168 +// CHECK:STDOUT: 52: inst171 +// CHECK:STDOUT: 53: inst172 +// CHECK:STDOUT: 54: inst173 +// CHECK:STDOUT: 55: inst174 +// CHECK:STDOUT: 56: inst175 +// CHECK:STDOUT: 57: inst182 +// CHECK:STDOUT: 58: inst183 +// CHECK:STDOUT: 59: inst184 +// CHECK:STDOUT: 60: inst185 +// CHECK:STDOUT: 61: inst186 +// CHECK:STDOUT: 62: inst187 +// CHECK:STDOUT: 63: inst188 +// CHECK:STDOUT: 64: inst189 +// CHECK:STDOUT: 65: inst190 +// CHECK:STDOUT: 66: inst191 +// CHECK:STDOUT: 67: inst195 +// CHECK:STDOUT: 68: inst196 +// CHECK:STDOUT: 69: inst197 +// CHECK:STDOUT: 70: inst198 +// CHECK:STDOUT: 71: inst199 +// CHECK:STDOUT: 72: inst200 +// CHECK:STDOUT: 73: inst201 +// CHECK:STDOUT: 74: inst202 +// CHECK:STDOUT: 75: inst210 +// CHECK:STDOUT: 76: inst214 +// CHECK:STDOUT: 77: inst215 +// CHECK:STDOUT: 78: inst216 +// CHECK:STDOUT: 79: inst217 +// CHECK:STDOUT: 80: inst218 +// CHECK:STDOUT: 81: inst219 +// CHECK:STDOUT: 82: inst249 +// CHECK:STDOUT: 83: inst250 +// CHECK:STDOUT: 84: inst254 +// CHECK:STDOUT: 85: inst255 +// CHECK:STDOUT: 86: inst256 +// CHECK:STDOUT: 87: inst257 +// CHECK:STDOUT: 88: inst258 +// CHECK:STDOUT: 89: inst259 +// CHECK:STDOUT: 90: inst260 +// CHECK:STDOUT: 91: inst261 +// CHECK:STDOUT: 92: inst262 +// CHECK:STDOUT: 93: inst263 +// CHECK:STDOUT: 94: inst273 +// CHECK:STDOUT: 95: inst277 +// CHECK:STDOUT: 96: inst278 +// CHECK:STDOUT: 97: inst279 +// CHECK:STDOUT: 98: inst280 +// CHECK:STDOUT: 99: inst281 +// CHECK:STDOUT: 100: inst282 +// CHECK:STDOUT: 101: inst283 // CHECK:STDOUT: global_init: {} // CHECK:STDOUT: inst_block4: // CHECK:STDOUT: 0: inst18 @@ -950,19 +1463,19 @@ fn Foo[T:! type](p: T*) -> (T*, ()) { // CHECK:STDOUT: 0: inst63 // CHECK:STDOUT: 1: inst64 // CHECK:STDOUT: 2: inst65 -// CHECK:STDOUT: 3: inst216 -// CHECK:STDOUT: 4: inst221 -// CHECK:STDOUT: 5: inst222 -// CHECK:STDOUT: 6: inst225 -// CHECK:STDOUT: 7: inst227 +// CHECK:STDOUT: 3: inst325 +// CHECK:STDOUT: 4: inst330 +// CHECK:STDOUT: 5: inst331 +// CHECK:STDOUT: 6: inst334 +// CHECK:STDOUT: 7: inst336 // CHECK:STDOUT: 8: inst67 -// CHECK:STDOUT: 9: inst228 -// CHECK:STDOUT: 10: inst229 -// CHECK:STDOUT: 11: inst230 -// CHECK:STDOUT: 12: inst232 -// CHECK:STDOUT: 13: inst233 -// CHECK:STDOUT: 14: inst234 -// CHECK:STDOUT: 15: inst235 +// CHECK:STDOUT: 9: inst337 +// CHECK:STDOUT: 10: inst338 +// CHECK:STDOUT: 11: inst339 +// CHECK:STDOUT: 12: inst341 +// CHECK:STDOUT: 13: inst342 +// CHECK:STDOUT: 14: inst343 +// CHECK:STDOUT: 15: inst344 // CHECK:STDOUT: inst_block21: // CHECK:STDOUT: 0: inst63 // CHECK:STDOUT: 1: inst64 @@ -983,172 +1496,348 @@ fn Foo[T:! type](p: T*) -> (T*, ()) { // CHECK:STDOUT: 1: inst82 // CHECK:STDOUT: 2: inst83 // CHECK:STDOUT: inst_block28: -// CHECK:STDOUT: 0: inst111 +// CHECK:STDOUT: 0: inst99 // CHECK:STDOUT: inst_block29: -// CHECK:STDOUT: 0: inst112 +// CHECK:STDOUT: 0: inst100 // CHECK:STDOUT: inst_block30: -// CHECK:STDOUT: 0: inst115 +// CHECK:STDOUT: 0: inst103 // CHECK:STDOUT: inst_block31: -// CHECK:STDOUT: 0: inst118 +// CHECK:STDOUT: 0: inst95 // CHECK:STDOUT: inst_block32: -// CHECK:STDOUT: 0: inst118 -// CHECK:STDOUT: 1: inst119 -// CHECK:STDOUT: 2: inst120 +// CHECK:STDOUT: 0: inst106 // CHECK:STDOUT: inst_block33: -// CHECK:STDOUT: 0: inst21 -// CHECK:STDOUT: 1: inst27 -// CHECK:STDOUT: 2: inst117 +// CHECK:STDOUT: 0: inst106 +// CHECK:STDOUT: 1: inst107 +// CHECK:STDOUT: 2: inst108 +// CHECK:STDOUT: 3: inst109 // CHECK:STDOUT: inst_block34: -// CHECK:STDOUT: 0: inst127 +// CHECK:STDOUT: 0: inst95 +// CHECK:STDOUT: 1: inst96 +// CHECK:STDOUT: 2: inst97 +// CHECK:STDOUT: 3: inst105 // CHECK:STDOUT: inst_block35: -// CHECK:STDOUT: 0: inst128 +// CHECK:STDOUT: 0: inst117 // CHECK:STDOUT: inst_block36: // CHECK:STDOUT: 0: inst118 // CHECK:STDOUT: inst_block37: -// CHECK:STDOUT: 0: inst129 -// CHECK:STDOUT: 1: inst130 -// CHECK:STDOUT: 2: inst131 +// CHECK:STDOUT: 0: inst106 // CHECK:STDOUT: inst_block38: +// CHECK:STDOUT: 0: inst119 +// CHECK:STDOUT: 1: inst120 +// CHECK:STDOUT: inst_block39: +// CHECK:STDOUT: 0: inst121 +// CHECK:STDOUT: 1: inst122 +// CHECK:STDOUT: 2: inst123 +// CHECK:STDOUT: 3: inst124 +// CHECK:STDOUT: inst_block40: +// CHECK:STDOUT: 0: inst95 +// CHECK:STDOUT: 1: inst96 +// CHECK:STDOUT: 2: inst97 +// CHECK:STDOUT: 3: inst113 +// CHECK:STDOUT: inst_block41: +// CHECK:STDOUT: 0: inst127 +// CHECK:STDOUT: inst_block42: +// CHECK:STDOUT: 0: inst128 +// CHECK:STDOUT: inst_block43: +// CHECK:STDOUT: 0: inst134 +// CHECK:STDOUT: inst_block44: +// CHECK:STDOUT: 0: inst135 +// CHECK:STDOUT: inst_block45: // CHECK:STDOUT: 0: inst132 // CHECK:STDOUT: 1: inst133 // CHECK:STDOUT: 2: inst134 -// CHECK:STDOUT: inst_block39: +// CHECK:STDOUT: 3: inst135 +// CHECK:STDOUT: 4: inst136 +// CHECK:STDOUT: 5: inst137 +// CHECK:STDOUT: 6: inst138 +// CHECK:STDOUT: inst_block46: +// CHECK:STDOUT: 0: inst128 +// CHECK:STDOUT: 1: inst96 +// CHECK:STDOUT: 2: inst139 +// CHECK:STDOUT: inst_block47: +// CHECK:STDOUT: 0: inst111 +// CHECK:STDOUT: 1: inst112 +// CHECK:STDOUT: inst_block48: +// CHECK:STDOUT: 0: inst158 +// CHECK:STDOUT: inst_block49: +// CHECK:STDOUT: 0: inst159 +// CHECK:STDOUT: inst_block50: +// CHECK:STDOUT: 0: inst162 +// CHECK:STDOUT: inst_block51: +// CHECK:STDOUT: 0: inst165 +// CHECK:STDOUT: inst_block52: +// CHECK:STDOUT: 0: inst165 +// CHECK:STDOUT: 1: inst166 +// CHECK:STDOUT: 2: inst167 +// CHECK:STDOUT: inst_block53: +// CHECK:STDOUT: 0: inst21 +// CHECK:STDOUT: 1: inst27 +// CHECK:STDOUT: 2: inst164 +// CHECK:STDOUT: inst_block54: +// CHECK:STDOUT: 0: inst174 +// CHECK:STDOUT: inst_block55: +// CHECK:STDOUT: 0: inst175 +// CHECK:STDOUT: inst_block56: +// CHECK:STDOUT: 0: inst165 +// CHECK:STDOUT: inst_block57: +// CHECK:STDOUT: 0: inst176 +// CHECK:STDOUT: 1: inst177 +// CHECK:STDOUT: 2: inst178 +// CHECK:STDOUT: inst_block58: +// CHECK:STDOUT: 0: inst179 +// CHECK:STDOUT: 1: inst180 +// CHECK:STDOUT: 2: inst181 +// CHECK:STDOUT: inst_block59: // CHECK:STDOUT: 0: inst21 // CHECK:STDOUT: 1: inst27 // CHECK:STDOUT: 2: inst30 -// CHECK:STDOUT: inst_block40: -// CHECK:STDOUT: 0: inst148 -// CHECK:STDOUT: 1: inst146 -// CHECK:STDOUT: inst_block41: -// CHECK:STDOUT: 0: inst152 -// CHECK:STDOUT: 1: inst151 -// CHECK:STDOUT: inst_block42: -// CHECK:STDOUT: 0: inst153 -// CHECK:STDOUT: 1: inst154 -// CHECK:STDOUT: inst_block43: -// CHECK:STDOUT: 0: inst157 -// CHECK:STDOUT: inst_block44: -// CHECK:STDOUT: 0: inst147 -// CHECK:STDOUT: 1: inst145 -// CHECK:STDOUT: inst_block45: -// CHECK:STDOUT: 0: inst162 -// CHECK:STDOUT: 1: inst163 -// CHECK:STDOUT: inst_block46: -// CHECK:STDOUT: 0: inst160 -// CHECK:STDOUT: 1: inst161 -// CHECK:STDOUT: inst_block47: -// CHECK:STDOUT: 0: inst160 -// CHECK:STDOUT: 1: inst161 -// CHECK:STDOUT: 2: inst162 -// CHECK:STDOUT: 3: inst163 -// CHECK:STDOUT: 4: inst164 -// CHECK:STDOUT: 5: inst165 -// CHECK:STDOUT: inst_block48: -// CHECK:STDOUT: 0: inst147 -// CHECK:STDOUT: 1: inst145 -// CHECK:STDOUT: 2: inst148 -// CHECK:STDOUT: 3: inst146 -// CHECK:STDOUT: 4: inst149 -// CHECK:STDOUT: 5: inst159 -// CHECK:STDOUT: inst_block49: -// CHECK:STDOUT: 0: inst173 -// CHECK:STDOUT: inst_block50: -// CHECK:STDOUT: 0: inst174 -// CHECK:STDOUT: 1: inst175 -// CHECK:STDOUT: inst_block51: -// CHECK:STDOUT: 0: inst160 -// CHECK:STDOUT: 1: inst161 -// CHECK:STDOUT: inst_block52: -// CHECK:STDOUT: 0: inst176 -// CHECK:STDOUT: 1: inst177 -// CHECK:STDOUT: inst_block53: -// CHECK:STDOUT: 0: inst179 -// CHECK:STDOUT: 1: inst181 -// CHECK:STDOUT: inst_block54: -// CHECK:STDOUT: 0: inst178 -// CHECK:STDOUT: 1: inst179 -// CHECK:STDOUT: 2: inst180 -// CHECK:STDOUT: 3: inst181 -// CHECK:STDOUT: 4: inst182 -// CHECK:STDOUT: 5: inst183 -// CHECK:STDOUT: inst_block55: -// CHECK:STDOUT: 0: inst147 -// CHECK:STDOUT: 1: inst148 -// CHECK:STDOUT: 2: inst145 -// CHECK:STDOUT: 3: inst146 -// CHECK:STDOUT: 4: inst149 -// CHECK:STDOUT: 5: inst169 -// CHECK:STDOUT: inst_block56: -// CHECK:STDOUT: 0: inst186 -// CHECK:STDOUT: inst_block57: -// CHECK:STDOUT: 0: inst187 -// CHECK:STDOUT: inst_block58: -// CHECK:STDOUT: 0: inst192 -// CHECK:STDOUT: inst_block59: -// CHECK:STDOUT: 0: inst193 // CHECK:STDOUT: inst_block60: -// CHECK:STDOUT: 0: inst199 +// CHECK:STDOUT: 0: inst96 +// CHECK:STDOUT: 1: inst193 // CHECK:STDOUT: inst_block61: -// CHECK:STDOUT: 0: inst200 +// CHECK:STDOUT: 0: inst196 +// CHECK:STDOUT: 1: inst195 // CHECK:STDOUT: inst_block62: -// CHECK:STDOUT: 0: inst205 -// CHECK:STDOUT: inst_block63: -// CHECK:STDOUT: 0: inst206 -// CHECK:STDOUT: inst_block64: // CHECK:STDOUT: 0: inst197 // CHECK:STDOUT: 1: inst198 -// CHECK:STDOUT: 2: inst199 -// CHECK:STDOUT: 3: inst200 -// CHECK:STDOUT: 4: inst201 -// CHECK:STDOUT: 5: inst202 -// CHECK:STDOUT: 6: inst203 -// CHECK:STDOUT: 7: inst204 -// CHECK:STDOUT: 8: inst205 -// CHECK:STDOUT: 9: inst206 -// CHECK:STDOUT: 10: inst207 -// CHECK:STDOUT: 11: inst208 -// CHECK:STDOUT: 12: inst209 +// CHECK:STDOUT: inst_block63: +// CHECK:STDOUT: 0: inst201 +// CHECK:STDOUT: inst_block64: +// CHECK:STDOUT: 0: inst95 +// CHECK:STDOUT: 1: inst192 // CHECK:STDOUT: inst_block65: -// CHECK:STDOUT: 0: inst193 -// CHECK:STDOUT: 1: inst146 -// CHECK:STDOUT: 2: inst210 +// CHECK:STDOUT: 0: inst206 +// CHECK:STDOUT: 1: inst207 // CHECK:STDOUT: inst_block66: -// CHECK:STDOUT: 0: inst187 -// CHECK:STDOUT: 1: inst148 -// CHECK:STDOUT: 2: inst211 +// CHECK:STDOUT: 0: inst204 +// CHECK:STDOUT: 1: inst205 // CHECK:STDOUT: inst_block67: -// CHECK:STDOUT: 0: inst167 -// CHECK:STDOUT: 1: inst168 +// CHECK:STDOUT: 0: inst204 +// CHECK:STDOUT: 1: inst205 +// CHECK:STDOUT: 2: inst206 +// CHECK:STDOUT: 3: inst207 +// CHECK:STDOUT: 4: inst208 +// CHECK:STDOUT: 5: inst209 // CHECK:STDOUT: inst_block68: -// CHECK:STDOUT: 0: inst122 -// CHECK:STDOUT: 1: inst123 -// CHECK:STDOUT: 2: inst61 +// CHECK:STDOUT: 0: inst95 +// CHECK:STDOUT: 1: inst192 +// CHECK:STDOUT: 2: inst96 +// CHECK:STDOUT: 3: inst193 +// CHECK:STDOUT: 4: inst194 +// CHECK:STDOUT: 5: inst203 // CHECK:STDOUT: inst_block69: -// CHECK:STDOUT: 0: inst212 +// CHECK:STDOUT: 0: inst217 // CHECK:STDOUT: inst_block70: -// CHECK:STDOUT: 0: inst213 +// CHECK:STDOUT: 0: inst218 +// CHECK:STDOUT: 1: inst219 // CHECK:STDOUT: inst_block71: -// CHECK:STDOUT: 0: inst214 +// CHECK:STDOUT: 0: inst204 +// CHECK:STDOUT: 1: inst205 // CHECK:STDOUT: inst_block72: -// CHECK:STDOUT: 0: inst214 +// CHECK:STDOUT: 0: inst220 +// CHECK:STDOUT: 1: inst221 +// CHECK:STDOUT: inst_block73: +// CHECK:STDOUT: 0: inst223 +// CHECK:STDOUT: 1: inst225 +// CHECK:STDOUT: inst_block74: +// CHECK:STDOUT: 0: inst222 +// CHECK:STDOUT: 1: inst223 +// CHECK:STDOUT: 2: inst224 +// CHECK:STDOUT: 3: inst225 +// CHECK:STDOUT: 4: inst226 +// CHECK:STDOUT: 5: inst227 +// CHECK:STDOUT: inst_block75: +// CHECK:STDOUT: 0: inst95 +// CHECK:STDOUT: 1: inst96 +// CHECK:STDOUT: 2: inst192 +// CHECK:STDOUT: 3: inst193 +// CHECK:STDOUT: 4: inst194 +// CHECK:STDOUT: 5: inst213 +// CHECK:STDOUT: inst_block76: +// CHECK:STDOUT: 0: inst230 +// CHECK:STDOUT: inst_block77: +// CHECK:STDOUT: 0: inst231 +// CHECK:STDOUT: inst_block78: +// CHECK:STDOUT: 0: inst237 +// CHECK:STDOUT: inst_block79: +// CHECK:STDOUT: 0: inst238 +// CHECK:STDOUT: inst_block80: +// CHECK:STDOUT: 0: inst243 +// CHECK:STDOUT: inst_block81: +// CHECK:STDOUT: 0: inst244 +// CHECK:STDOUT: inst_block82: +// CHECK:STDOUT: 0: inst235 +// CHECK:STDOUT: 1: inst236 +// CHECK:STDOUT: 2: inst237 +// CHECK:STDOUT: 3: inst238 +// CHECK:STDOUT: 4: inst239 +// CHECK:STDOUT: 5: inst240 +// CHECK:STDOUT: 6: inst241 +// CHECK:STDOUT: 7: inst242 +// CHECK:STDOUT: 8: inst243 +// CHECK:STDOUT: 9: inst244 +// CHECK:STDOUT: 10: inst245 +// CHECK:STDOUT: 11: inst246 +// CHECK:STDOUT: 12: inst247 +// CHECK:STDOUT: inst_block83: +// CHECK:STDOUT: 0: inst231 +// CHECK:STDOUT: 1: inst193 +// CHECK:STDOUT: 2: inst248 +// CHECK:STDOUT: inst_block84: +// CHECK:STDOUT: 0: inst211 +// CHECK:STDOUT: 1: inst212 +// CHECK:STDOUT: inst_block85: +// CHECK:STDOUT: 0: inst96 +// CHECK:STDOUT: 1: inst193 +// CHECK:STDOUT: 2: inst252 +// CHECK:STDOUT: inst_block86: +// CHECK:STDOUT: 0: inst256 +// CHECK:STDOUT: 1: inst255 +// CHECK:STDOUT: 2: inst254 +// CHECK:STDOUT: inst_block87: +// CHECK:STDOUT: 0: inst257 +// CHECK:STDOUT: 1: inst258 +// CHECK:STDOUT: 2: inst259 +// CHECK:STDOUT: inst_block88: +// CHECK:STDOUT: 0: inst262 +// CHECK:STDOUT: inst_block89: +// CHECK:STDOUT: 0: inst95 +// CHECK:STDOUT: 1: inst192 +// CHECK:STDOUT: 2: inst251 +// CHECK:STDOUT: inst_block90: +// CHECK:STDOUT: 0: inst268 +// CHECK:STDOUT: 1: inst269 +// CHECK:STDOUT: 2: inst270 +// CHECK:STDOUT: inst_block91: +// CHECK:STDOUT: 0: inst265 +// CHECK:STDOUT: 1: inst266 +// CHECK:STDOUT: 2: inst267 +// CHECK:STDOUT: inst_block92: +// CHECK:STDOUT: 0: inst265 +// CHECK:STDOUT: 1: inst266 +// CHECK:STDOUT: 2: inst267 +// CHECK:STDOUT: 3: inst268 +// CHECK:STDOUT: 4: inst269 +// CHECK:STDOUT: 5: inst270 +// CHECK:STDOUT: 6: inst271 +// CHECK:STDOUT: 7: inst272 +// CHECK:STDOUT: inst_block93: +// CHECK:STDOUT: 0: inst95 +// CHECK:STDOUT: 1: inst192 +// CHECK:STDOUT: 2: inst251 +// CHECK:STDOUT: 3: inst96 +// CHECK:STDOUT: 4: inst193 +// CHECK:STDOUT: 5: inst252 +// CHECK:STDOUT: 6: inst253 +// CHECK:STDOUT: 7: inst264 +// CHECK:STDOUT: inst_block94: +// CHECK:STDOUT: 0: inst280 +// CHECK:STDOUT: inst_block95: +// CHECK:STDOUT: 0: inst281 +// CHECK:STDOUT: 1: inst282 +// CHECK:STDOUT: 2: inst283 +// CHECK:STDOUT: inst_block96: +// CHECK:STDOUT: 0: inst265 +// CHECK:STDOUT: 1: inst266 +// CHECK:STDOUT: 2: inst267 +// CHECK:STDOUT: inst_block97: +// CHECK:STDOUT: 0: inst284 +// CHECK:STDOUT: 1: inst285 +// CHECK:STDOUT: inst_block98: +// CHECK:STDOUT: 0: inst287 +// CHECK:STDOUT: 1: inst289 +// CHECK:STDOUT: 2: inst291 +// CHECK:STDOUT: inst_block99: +// CHECK:STDOUT: 0: inst286 +// CHECK:STDOUT: 1: inst287 +// CHECK:STDOUT: 2: inst288 +// CHECK:STDOUT: 3: inst289 +// CHECK:STDOUT: 4: inst290 +// CHECK:STDOUT: 5: inst291 +// CHECK:STDOUT: 6: inst292 +// CHECK:STDOUT: 7: inst293 +// CHECK:STDOUT: inst_block100: +// CHECK:STDOUT: 0: inst95 +// CHECK:STDOUT: 1: inst96 +// CHECK:STDOUT: 2: inst192 +// CHECK:STDOUT: 3: inst193 +// CHECK:STDOUT: 4: inst251 +// CHECK:STDOUT: 5: inst252 +// CHECK:STDOUT: 6: inst253 +// CHECK:STDOUT: 7: inst276 +// CHECK:STDOUT: inst_block101: +// CHECK:STDOUT: 0: inst296 +// CHECK:STDOUT: inst_block102: +// CHECK:STDOUT: 0: inst297 +// CHECK:STDOUT: inst_block103: +// CHECK:STDOUT: 0: inst303 +// CHECK:STDOUT: inst_block104: +// CHECK:STDOUT: 0: inst304 +// CHECK:STDOUT: inst_block105: +// CHECK:STDOUT: 0: inst309 +// CHECK:STDOUT: inst_block106: +// CHECK:STDOUT: 0: inst310 +// CHECK:STDOUT: inst_block107: +// CHECK:STDOUT: 0: inst315 +// CHECK:STDOUT: inst_block108: +// CHECK:STDOUT: 0: inst316 +// CHECK:STDOUT: inst_block109: +// CHECK:STDOUT: 0: inst301 +// CHECK:STDOUT: 1: inst302 +// CHECK:STDOUT: 2: inst303 +// CHECK:STDOUT: 3: inst304 +// CHECK:STDOUT: 4: inst305 +// CHECK:STDOUT: 5: inst306 +// CHECK:STDOUT: 6: inst307 +// CHECK:STDOUT: 7: inst308 +// CHECK:STDOUT: 8: inst309 +// CHECK:STDOUT: 9: inst310 +// CHECK:STDOUT: 10: inst311 +// CHECK:STDOUT: 11: inst312 +// CHECK:STDOUT: 12: inst313 +// CHECK:STDOUT: 13: inst314 +// CHECK:STDOUT: 14: inst315 +// CHECK:STDOUT: 15: inst316 +// CHECK:STDOUT: 16: inst317 +// CHECK:STDOUT: 17: inst318 +// CHECK:STDOUT: 18: inst319 +// CHECK:STDOUT: inst_block110: +// CHECK:STDOUT: 0: inst297 +// CHECK:STDOUT: 1: inst252 +// CHECK:STDOUT: 2: inst320 +// CHECK:STDOUT: inst_block111: +// CHECK:STDOUT: 0: inst274 +// CHECK:STDOUT: 1: inst275 +// CHECK:STDOUT: inst_block112: +// CHECK:STDOUT: 0: inst169 +// CHECK:STDOUT: 1: inst170 +// CHECK:STDOUT: 2: inst61 +// CHECK:STDOUT: inst_block113: +// CHECK:STDOUT: 0: inst321 +// CHECK:STDOUT: inst_block114: +// CHECK:STDOUT: 0: inst322 +// CHECK:STDOUT: inst_block115: +// CHECK:STDOUT: 0: inst323 +// CHECK:STDOUT: inst_block116: +// CHECK:STDOUT: 0: inst323 // CHECK:STDOUT: 1: inst27 // CHECK:STDOUT: 2: inst30 -// CHECK:STDOUT: inst_block73: -// CHECK:STDOUT: 0: inst218 -// CHECK:STDOUT: inst_block74: +// CHECK:STDOUT: inst_block117: +// CHECK:STDOUT: 0: inst327 +// CHECK:STDOUT: inst_block118: // CHECK:STDOUT: 0: inst63 -// CHECK:STDOUT: inst_block75: -// CHECK:STDOUT: 0: inst228 -// CHECK:STDOUT: 1: inst232 -// CHECK:STDOUT: inst_block76: +// CHECK:STDOUT: inst_block119: +// CHECK:STDOUT: 0: inst337 +// CHECK:STDOUT: 1: inst341 +// CHECK:STDOUT: inst_block120: // CHECK:STDOUT: 0: inst59 // CHECK:STDOUT: 1: inst62 -// CHECK:STDOUT: 2: inst213 -// CHECK:STDOUT: 3: inst218 -// CHECK:STDOUT: 4: inst219 -// CHECK:STDOUT: 5: inst220 -// CHECK:STDOUT: 6: inst224 -// CHECK:STDOUT: inst_block77: +// CHECK:STDOUT: 2: inst322 +// CHECK:STDOUT: 3: inst327 +// CHECK:STDOUT: 4: inst328 +// CHECK:STDOUT: 5: inst329 +// CHECK:STDOUT: 6: inst333 +// CHECK:STDOUT: inst_block121: // CHECK:STDOUT: 0: inst14 // CHECK:STDOUT: 1: inst15 // CHECK:STDOUT: 2: inst53 diff --git a/toolchain/check/testdata/builtins/float/add.carbon b/toolchain/check/testdata/builtins/float/add.carbon index 4e02195b8180..2de6f0d316f3 100644 --- a/toolchain/check/testdata/builtins/float/add.carbon +++ b/toolchain/check/testdata/builtins/float/add.carbon @@ -86,9 +86,7 @@ fn AddLiteral(a: Literal(), b: Literal()) -> Literal() = "float.add"; // CHECK:STDOUT: %a.ref: %f64.d77 = name_ref a, %a // CHECK:STDOUT: %b.ref: %f64.d77 = name_ref b, %b // CHECK:STDOUT: %Add.call: init %f64.d77 = call %Add.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc8_19.1: %f64.d77 = value_of_initializer %Add.call -// CHECK:STDOUT: %.loc8_19.2: %f64.d77 = converted %Add.call, %.loc8_19.1 -// CHECK:STDOUT: return %.loc8_19.2 +// CHECK:STDOUT: return %Add.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/builtins/float/div.carbon b/toolchain/check/testdata/builtins/float/div.carbon index afcb7bc57314..23a49aca1bea 100644 --- a/toolchain/check/testdata/builtins/float/div.carbon +++ b/toolchain/check/testdata/builtins/float/div.carbon @@ -97,9 +97,7 @@ fn DivLiteral(a: Literal(), b: Literal()) -> Literal() = "float.div"; // CHECK:STDOUT: %a.ref: %f64.d77 = name_ref a, %a // CHECK:STDOUT: %b.ref: %f64.d77 = name_ref b, %b // CHECK:STDOUT: %Div.call: init %f64.d77 = call %Div.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc8_19.1: %f64.d77 = value_of_initializer %Div.call -// CHECK:STDOUT: %.loc8_19.2: %f64.d77 = converted %Div.call, %.loc8_19.1 -// CHECK:STDOUT: return %.loc8_19.2 +// CHECK:STDOUT: return %Div.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/builtins/float/eq.carbon b/toolchain/check/testdata/builtins/float/eq.carbon index 150478dde175..2b62401af654 100644 --- a/toolchain/check/testdata/builtins/float/eq.carbon +++ b/toolchain/check/testdata/builtins/float/eq.carbon @@ -66,8 +66,6 @@ fn Eq(a: Core.FloatLiteral(), b: Core.FloatLiteral()) -> bool = "float.eq"; // CHECK:STDOUT: %a.ref: %f64.d77 = name_ref a, %a // CHECK:STDOUT: %b.ref: %f64.d77 = name_ref b, %b // CHECK:STDOUT: %Eq.call: init bool = call %Eq.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc14_18.1: bool = value_of_initializer %Eq.call -// CHECK:STDOUT: %.loc14_18.2: bool = converted %Eq.call, %.loc14_18.1 -// CHECK:STDOUT: return %.loc14_18.2 +// CHECK:STDOUT: return %Eq.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/greater.carbon b/toolchain/check/testdata/builtins/float/greater.carbon index 51448f58919a..d8b97c52901c 100644 --- a/toolchain/check/testdata/builtins/float/greater.carbon +++ b/toolchain/check/testdata/builtins/float/greater.carbon @@ -50,8 +50,6 @@ fn RuntimeCallIsValid(a: f64, b: f64) -> bool { // CHECK:STDOUT: %a.ref: %f64.d77 = name_ref a, %a // CHECK:STDOUT: %b.ref: %f64.d77 = name_ref b, %b // CHECK:STDOUT: %Greater.call: init bool = call %Greater.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc18_23.1: bool = value_of_initializer %Greater.call -// CHECK:STDOUT: %.loc18_23.2: bool = converted %Greater.call, %.loc18_23.1 -// CHECK:STDOUT: return %.loc18_23.2 +// CHECK:STDOUT: return %Greater.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/greater_eq.carbon b/toolchain/check/testdata/builtins/float/greater_eq.carbon index d0f6b69a0d07..6898fe221d60 100644 --- a/toolchain/check/testdata/builtins/float/greater_eq.carbon +++ b/toolchain/check/testdata/builtins/float/greater_eq.carbon @@ -50,8 +50,6 @@ fn RuntimeCallIsValid(a: f64, b: f64) -> bool { // CHECK:STDOUT: %a.ref: %f64.d77 = name_ref a, %a // CHECK:STDOUT: %b.ref: %f64.d77 = name_ref b, %b // CHECK:STDOUT: %GreaterEq.call: init bool = call %GreaterEq.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc18_25.1: bool = value_of_initializer %GreaterEq.call -// CHECK:STDOUT: %.loc18_25.2: bool = converted %GreaterEq.call, %.loc18_25.1 -// CHECK:STDOUT: return %.loc18_25.2 +// CHECK:STDOUT: return %GreaterEq.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/less.carbon b/toolchain/check/testdata/builtins/float/less.carbon index db8de98535cf..684f48f5c532 100644 --- a/toolchain/check/testdata/builtins/float/less.carbon +++ b/toolchain/check/testdata/builtins/float/less.carbon @@ -50,8 +50,6 @@ fn RuntimeCallIsValid(a: f64, b: f64) -> bool { // CHECK:STDOUT: %a.ref: %f64.d77 = name_ref a, %a // CHECK:STDOUT: %b.ref: %f64.d77 = name_ref b, %b // CHECK:STDOUT: %Less.call: init bool = call %Less.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc18_20.1: bool = value_of_initializer %Less.call -// CHECK:STDOUT: %.loc18_20.2: bool = converted %Less.call, %.loc18_20.1 -// CHECK:STDOUT: return %.loc18_20.2 +// CHECK:STDOUT: return %Less.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/less_eq.carbon b/toolchain/check/testdata/builtins/float/less_eq.carbon index a42eedb6e6e1..1efd641c0bfc 100644 --- a/toolchain/check/testdata/builtins/float/less_eq.carbon +++ b/toolchain/check/testdata/builtins/float/less_eq.carbon @@ -60,8 +60,6 @@ fn LessEq(a: Core.FloatLiteral(), b: Core.FloatLiteral()) -> bool = "float.less_ // CHECK:STDOUT: %a.ref: %f64.d77 = name_ref a, %a // CHECK:STDOUT: %b.ref: %f64.d77 = name_ref b, %b // CHECK:STDOUT: %LessEq.call: init bool = call %LessEq.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc18_22.1: bool = value_of_initializer %LessEq.call -// CHECK:STDOUT: %.loc18_22.2: bool = converted %LessEq.call, %.loc18_22.1 -// CHECK:STDOUT: return %.loc18_22.2 +// CHECK:STDOUT: return %LessEq.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/make_type.carbon b/toolchain/check/testdata/builtins/float/make_type.carbon index 226f935cb24d..14fb85414818 100644 --- a/toolchain/check/testdata/builtins/float/make_type.carbon +++ b/toolchain/check/testdata/builtins/float/make_type.carbon @@ -76,8 +76,6 @@ var dyn: Float(dyn_size); // CHECK:STDOUT: %Float.ref: %Float.type = name_ref Float, imports.%Main.Float [concrete = constants.%Float] // CHECK:STDOUT: %dyn_size.ref: %i32 = name_ref dyn_size, %dyn_size // CHECK:STDOUT: %Float.call: init type = call %Float.ref(%dyn_size.ref) -// CHECK:STDOUT: %.loc13_25.1: type = value_of_initializer %Float.call -// CHECK:STDOUT: %.loc13_25.2: type = converted %Float.call, %.loc13_25.1 -// CHECK:STDOUT: return %.loc13_25.2 +// CHECK:STDOUT: return %Float.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/mul.carbon b/toolchain/check/testdata/builtins/float/mul.carbon index 981cb2e6ea4b..0705dc23c3ed 100644 --- a/toolchain/check/testdata/builtins/float/mul.carbon +++ b/toolchain/check/testdata/builtins/float/mul.carbon @@ -95,9 +95,7 @@ fn MulLiteral(a: Literal(), b: Literal()) -> Literal() = "float.mul"; // CHECK:STDOUT: %a.ref: %f64.d77 = name_ref a, %a // CHECK:STDOUT: %b.ref: %f64.d77 = name_ref b, %b // CHECK:STDOUT: %Mul.call: init %f64.d77 = call %Mul.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc8_19.1: %f64.d77 = value_of_initializer %Mul.call -// CHECK:STDOUT: %.loc8_19.2: %f64.d77 = converted %Mul.call, %.loc8_19.1 -// CHECK:STDOUT: return %.loc8_19.2 +// CHECK:STDOUT: return %Mul.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/builtins/float/negate.carbon b/toolchain/check/testdata/builtins/float/negate.carbon index b0d716807b56..396086afa889 100644 --- a/toolchain/check/testdata/builtins/float/negate.carbon +++ b/toolchain/check/testdata/builtins/float/negate.carbon @@ -83,9 +83,7 @@ fn RuntimeCallIsValidBadReturnType(a: f64) -> bool { // CHECK:STDOUT: %Negate.ref: %Negate.type = name_ref Negate, file.%Negate.decl [concrete = constants.%Negate] // CHECK:STDOUT: %a.ref: %f64.d77 = name_ref a, %a // CHECK:STDOUT: %Negate.call: init %f64.d77 = call %Negate.ref(%a.ref) -// CHECK:STDOUT: %.loc8_19.1: %f64.d77 = value_of_initializer %Negate.call -// CHECK:STDOUT: %.loc8_19.2: %f64.d77 = converted %Negate.call, %.loc8_19.1 -// CHECK:STDOUT: return %.loc8_19.2 +// CHECK:STDOUT: return %Negate.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/builtins/float/neq.carbon b/toolchain/check/testdata/builtins/float/neq.carbon index 23051e1d0703..4f80b00235c7 100644 --- a/toolchain/check/testdata/builtins/float/neq.carbon +++ b/toolchain/check/testdata/builtins/float/neq.carbon @@ -58,8 +58,6 @@ fn WrongResult(a: f64, b: f64) -> f64 = "float.neq"; // CHECK:STDOUT: %a.ref: %f64.d77 = name_ref a, %a // CHECK:STDOUT: %b.ref: %f64.d77 = name_ref b, %b // CHECK:STDOUT: %Neq.call: init bool = call %Neq.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc16_19.1: bool = value_of_initializer %Neq.call -// CHECK:STDOUT: %.loc16_19.2: bool = converted %Neq.call, %.loc16_19.1 -// CHECK:STDOUT: return %.loc16_19.2 +// CHECK:STDOUT: return %Neq.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/sub.carbon b/toolchain/check/testdata/builtins/float/sub.carbon index 81c46dea0102..5b8d16428204 100644 --- a/toolchain/check/testdata/builtins/float/sub.carbon +++ b/toolchain/check/testdata/builtins/float/sub.carbon @@ -95,9 +95,7 @@ fn SubLiteral(a: Literal(), b: Literal()) -> Literal() = "float.sub"; // CHECK:STDOUT: %a.ref: %f64.d77 = name_ref a, %a // CHECK:STDOUT: %b.ref: %f64.d77 = name_ref b, %b // CHECK:STDOUT: %Sub.call: init %f64.d77 = call %Sub.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc8_19.1: %f64.d77 = value_of_initializer %Sub.call -// CHECK:STDOUT: %.loc8_19.2: %f64.d77 = converted %Sub.call, %.loc8_19.1 -// CHECK:STDOUT: return %.loc8_19.2 +// CHECK:STDOUT: return %Sub.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/builtins/int/and.carbon b/toolchain/check/testdata/builtins/int/and.carbon index cf6317d52122..9e1a969dc214 100644 --- a/toolchain/check/testdata/builtins/int/and.carbon +++ b/toolchain/check/testdata/builtins/int/and.carbon @@ -141,9 +141,7 @@ fn Test(n: Core.IntLiteral()) { // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %And.call: init %i32 = call %And.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc11_19.1: %i32 = value_of_initializer %And.call -// CHECK:STDOUT: %.loc11_19.2: %i32 = converted %And.call, %.loc11_19.1 -// CHECK:STDOUT: return %.loc11_19.2 +// CHECK:STDOUT: return %And.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/builtins/int/complement.carbon b/toolchain/check/testdata/builtins/int/complement.carbon index 217b3895d575..a61a42ccb5e5 100644 --- a/toolchain/check/testdata/builtins/int/complement.carbon +++ b/toolchain/check/testdata/builtins/int/complement.carbon @@ -79,9 +79,7 @@ fn F(a: Core.IntLiteral()) -> Core.IntLiteral() { // CHECK:STDOUT: %Complement.ref: %Complement.type = name_ref Complement, file.%Complement.decl [concrete = constants.%Complement] // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %Complement.call: init %i32 = call %Complement.ref(%a.ref) -// CHECK:STDOUT: %.loc12_23.1: %i32 = value_of_initializer %Complement.call -// CHECK:STDOUT: %.loc12_23.2: %i32 = converted %Complement.call, %.loc12_23.1 -// CHECK:STDOUT: return %.loc12_23.2 +// CHECK:STDOUT: return %Complement.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/builtins/int/convert.carbon b/toolchain/check/testdata/builtins/int/convert.carbon index b8906be16959..64ae546a701d 100644 --- a/toolchain/check/testdata/builtins/int/convert.carbon +++ b/toolchain/check/testdata/builtins/int/convert.carbon @@ -278,9 +278,7 @@ let convert_not_constant: i16 = IntLiteralToInt16(not_constant); // CHECK:STDOUT: %Int32ToUint32.ref: %Int32ToUint32.type = name_ref Int32ToUint32, imports.%Main.Int32ToUint32 [concrete = constants.%Int32ToUint32] // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %Int32ToUint32.call: init %u32 = call %Int32ToUint32.ref(%a.ref) -// CHECK:STDOUT: %.loc7_26.1: %u32 = value_of_initializer %Int32ToUint32.call -// CHECK:STDOUT: %.loc7_26.2: %u32 = converted %Int32ToUint32.call, %.loc7_26.1 -// CHECK:STDOUT: return %.loc7_26.2 +// CHECK:STDOUT: return %Int32ToUint32.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Narrowing(%a.param: %i32) -> %i16 { @@ -288,9 +286,7 @@ let convert_not_constant: i16 = IntLiteralToInt16(not_constant); // CHECK:STDOUT: %Int32ToInt16.ref: %Int32ToInt16.type = name_ref Int32ToInt16, imports.%Main.Int32ToInt16 [concrete = constants.%Int32ToInt16] // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %Int32ToInt16.call: init %i16 = call %Int32ToInt16.ref(%a.ref) -// CHECK:STDOUT: %.loc13_25.1: %i16 = value_of_initializer %Int32ToInt16.call -// CHECK:STDOUT: %.loc13_25.2: %i16 = converted %Int32ToInt16.call, %.loc13_25.1 -// CHECK:STDOUT: return %.loc13_25.2 +// CHECK:STDOUT: return %Int32ToInt16.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Widening(%a.param: %i32) -> %i64 { @@ -298,8 +294,6 @@ let convert_not_constant: i16 = IntLiteralToInt16(not_constant); // CHECK:STDOUT: %Int32ToInt64.ref: %Int32ToInt64.type = name_ref Int32ToInt64, imports.%Main.Int32ToInt64 [concrete = constants.%Int32ToInt64] // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %Int32ToInt64.call: init %i64 = call %Int32ToInt64.ref(%a.ref) -// CHECK:STDOUT: %.loc19_25.1: %i64 = value_of_initializer %Int32ToInt64.call -// CHECK:STDOUT: %.loc19_25.2: %i64 = converted %Int32ToInt64.call, %.loc19_25.1 -// CHECK:STDOUT: return %.loc19_25.2 +// CHECK:STDOUT: return %Int32ToInt64.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/eq.carbon b/toolchain/check/testdata/builtins/int/eq.carbon index ece6ce85fbb0..1ee86c28d6eb 100644 --- a/toolchain/check/testdata/builtins/int/eq.carbon +++ b/toolchain/check/testdata/builtins/int/eq.carbon @@ -125,8 +125,6 @@ fn Test(n: Core.IntLiteral()) { // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Eq.call: init bool = call %Eq.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc16_18.1: bool = value_of_initializer %Eq.call -// CHECK:STDOUT: %.loc16_18.2: bool = converted %Eq.call, %.loc16_18.1 -// CHECK:STDOUT: return %.loc16_18.2 +// CHECK:STDOUT: return %Eq.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/greater.carbon b/toolchain/check/testdata/builtins/int/greater.carbon index 5bc50695b9be..5ac5333a9ec5 100644 --- a/toolchain/check/testdata/builtins/int/greater.carbon +++ b/toolchain/check/testdata/builtins/int/greater.carbon @@ -50,8 +50,6 @@ fn RuntimeCallIsValid(a: i32, b: i32) -> bool { // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Greater.call: init bool = call %Greater.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc18_23.1: bool = value_of_initializer %Greater.call -// CHECK:STDOUT: %.loc18_23.2: bool = converted %Greater.call, %.loc18_23.1 -// CHECK:STDOUT: return %.loc18_23.2 +// CHECK:STDOUT: return %Greater.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/greater_eq.carbon b/toolchain/check/testdata/builtins/int/greater_eq.carbon index 8c5808c6685b..596b0089da74 100644 --- a/toolchain/check/testdata/builtins/int/greater_eq.carbon +++ b/toolchain/check/testdata/builtins/int/greater_eq.carbon @@ -88,8 +88,6 @@ fn F() { // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %GreaterEq.call: init bool = call %GreaterEq.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc20_25.1: bool = value_of_initializer %GreaterEq.call -// CHECK:STDOUT: %.loc20_25.2: bool = converted %GreaterEq.call, %.loc20_25.1 -// CHECK:STDOUT: return %.loc20_25.2 +// CHECK:STDOUT: return %GreaterEq.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/left_shift.carbon b/toolchain/check/testdata/builtins/int/left_shift.carbon index 465fc322acaf..0003f1e70468 100644 --- a/toolchain/check/testdata/builtins/int/left_shift.carbon +++ b/toolchain/check/testdata/builtins/int/left_shift.carbon @@ -246,9 +246,7 @@ let bad4: Core.IntLiteral() = LeftShiftOfLit(12, an_i32); // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %LeftShift.call: init %i32 = call %LeftShift.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc22_25.1: %i32 = value_of_initializer %LeftShift.call -// CHECK:STDOUT: %.loc22_25.2: %i32 = converted %LeftShift.call, %.loc22_25.1 -// CHECK:STDOUT: return %.loc22_25.2 +// CHECK:STDOUT: return %LeftShift.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- u32.carbon @@ -270,8 +268,6 @@ let bad4: Core.IntLiteral() = LeftShiftOfLit(12, an_i32); // CHECK:STDOUT: %a.ref: %u32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %LeftShift.call: init %u32 = call %LeftShift.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc22_25.1: %u32 = value_of_initializer %LeftShift.call -// CHECK:STDOUT: %.loc22_25.2: %u32 = converted %LeftShift.call, %.loc22_25.1 -// CHECK:STDOUT: return %.loc22_25.2 +// CHECK:STDOUT: return %LeftShift.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/less.carbon b/toolchain/check/testdata/builtins/int/less.carbon index 8812f479a1a6..0eea3a79f2b0 100644 --- a/toolchain/check/testdata/builtins/int/less.carbon +++ b/toolchain/check/testdata/builtins/int/less.carbon @@ -50,8 +50,6 @@ fn RuntimeCallIsValid(a: i32, b: i32) -> bool { // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Less.call: init bool = call %Less.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc18_20.1: bool = value_of_initializer %Less.call -// CHECK:STDOUT: %.loc18_20.2: bool = converted %Less.call, %.loc18_20.1 -// CHECK:STDOUT: return %.loc18_20.2 +// CHECK:STDOUT: return %Less.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/less_eq.carbon b/toolchain/check/testdata/builtins/int/less_eq.carbon index f8d5761b1405..87ab63fca95f 100644 --- a/toolchain/check/testdata/builtins/int/less_eq.carbon +++ b/toolchain/check/testdata/builtins/int/less_eq.carbon @@ -123,8 +123,6 @@ fn Test(n: Core.IntLiteral()) { // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %LessEq.call: init bool = call %LessEq.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc20_22.1: bool = value_of_initializer %LessEq.call -// CHECK:STDOUT: %.loc20_22.2: bool = converted %LessEq.call, %.loc20_22.1 -// CHECK:STDOUT: return %.loc20_22.2 +// CHECK:STDOUT: return %LessEq.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/make_type_signed.carbon b/toolchain/check/testdata/builtins/int/make_type_signed.carbon index f2c825b121de..a97b71895ae8 100644 --- a/toolchain/check/testdata/builtins/int/make_type_signed.carbon +++ b/toolchain/check/testdata/builtins/int/make_type_signed.carbon @@ -23,12 +23,14 @@ library "[[@TEST_NAME]]"; import library "types"; +fn Copy[T:! type](x: T) -> T = "primitive_copy"; + fn F(n: Int(64)) -> //@dump-sem-ir-begin Int(64) //@dump-sem-ir-end { - return n; + return Copy(n); } fn G(n: Int(13)) -> @@ -36,11 +38,11 @@ fn G(n: Int(13)) -> Int(13) //@dump-sem-ir-end { - return n; + return Copy(n); } fn Symbolic(N:! IntLiteral(), x: Int(N)) -> Int(N) { - return x; + return Copy(x); } // --- import_types.carbon diff --git a/toolchain/check/testdata/builtins/int/make_type_unsigned.carbon b/toolchain/check/testdata/builtins/int/make_type_unsigned.carbon index 61e48eb5ac33..39ff94e83af0 100644 --- a/toolchain/check/testdata/builtins/int/make_type_unsigned.carbon +++ b/toolchain/check/testdata/builtins/int/make_type_unsigned.carbon @@ -23,12 +23,14 @@ library "[[@TEST_NAME]]"; import library "types"; +fn Copy[T:! type](x: T) -> T = "primitive_copy"; + fn F(n: UInt(64)) -> //@dump-sem-ir-begin UInt(64) //@dump-sem-ir-end { - return n; + return Copy(n); } fn G(n: UInt(13)) -> @@ -36,12 +38,12 @@ fn G(n: UInt(13)) -> UInt(13) //@dump-sem-ir-end { - return n; + return Copy(n); } fn Symbolic(N:! IntLiteral(), x: UInt(N)) -> UInt(N) { - return x; + return Copy(x); } // --- fail_zero_size.carbon diff --git a/toolchain/check/testdata/builtins/int/neq.carbon b/toolchain/check/testdata/builtins/int/neq.carbon index 3688f6a91ad5..2e3019f04df2 100644 --- a/toolchain/check/testdata/builtins/int/neq.carbon +++ b/toolchain/check/testdata/builtins/int/neq.carbon @@ -46,8 +46,6 @@ fn RuntimeCallIsValid(a: i32, b: i32) -> bool { // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Neq.call: init bool = call %Neq.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc14_19.1: bool = value_of_initializer %Neq.call -// CHECK:STDOUT: %.loc14_19.2: bool = converted %Neq.call, %.loc14_19.1 -// CHECK:STDOUT: return %.loc14_19.2 +// CHECK:STDOUT: return %Neq.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/or.carbon b/toolchain/check/testdata/builtins/int/or.carbon index b6d1c76369ab..2c1856edad53 100644 --- a/toolchain/check/testdata/builtins/int/or.carbon +++ b/toolchain/check/testdata/builtins/int/or.carbon @@ -41,9 +41,7 @@ fn RuntimeCallIsValid(a: i32, b: i32) -> i32 { // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Or.call: init %i32 = call %Or.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc9_18.1: %i32 = value_of_initializer %Or.call -// CHECK:STDOUT: %.loc9_18.2: %i32 = converted %Or.call, %.loc9_18.1 -// CHECK:STDOUT: return %.loc9_18.2 +// CHECK:STDOUT: return %Or.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/builtins/int/right_shift.carbon b/toolchain/check/testdata/builtins/int/right_shift.carbon index 0b54d0ae452d..4d014e3a800a 100644 --- a/toolchain/check/testdata/builtins/int/right_shift.carbon +++ b/toolchain/check/testdata/builtins/int/right_shift.carbon @@ -150,9 +150,7 @@ let negative_lit_zero: Core.IntLiteral() = RightShiftLit(0, -1); // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %RightShift.call: init %i32 = call %RightShift.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc22_26.1: %i32 = value_of_initializer %RightShift.call -// CHECK:STDOUT: %.loc22_26.2: %i32 = converted %RightShift.call, %.loc22_26.1 -// CHECK:STDOUT: return %.loc22_26.2 +// CHECK:STDOUT: return %RightShift.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- u32.carbon @@ -174,8 +172,6 @@ let negative_lit_zero: Core.IntLiteral() = RightShiftLit(0, -1); // CHECK:STDOUT: %a.ref: %u32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %RightShift.call: init %u32 = call %RightShift.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc21_26.1: %u32 = value_of_initializer %RightShift.call -// CHECK:STDOUT: %.loc21_26.2: %u32 = converted %RightShift.call, %.loc21_26.1 -// CHECK:STDOUT: return %.loc21_26.2 +// CHECK:STDOUT: return %RightShift.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/sadd.carbon b/toolchain/check/testdata/builtins/int/sadd.carbon index a598ae20a079..d3b99bc7fd63 100644 --- a/toolchain/check/testdata/builtins/int/sadd.carbon +++ b/toolchain/check/testdata/builtins/int/sadd.carbon @@ -179,8 +179,6 @@ let b: i32 = Add(0x7FFFFFFF, 1); // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Add.call: init %i32 = call %Add.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc17_19.1: %i32 = value_of_initializer %Add.call -// CHECK:STDOUT: %.loc17_19.2: %i32 = converted %Add.call, %.loc17_19.1 -// CHECK:STDOUT: return %.loc17_19.2 +// CHECK:STDOUT: return %Add.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/sdiv.carbon b/toolchain/check/testdata/builtins/int/sdiv.carbon index 07684869dea6..cb099913ede1 100644 --- a/toolchain/check/testdata/builtins/int/sdiv.carbon +++ b/toolchain/check/testdata/builtins/int/sdiv.carbon @@ -110,9 +110,7 @@ let d: Core.IntLiteral() = DivLit(0, 0); // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Div.call: init %i32 = call %Div.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc11_19.1: %i32 = value_of_initializer %Div.call -// CHECK:STDOUT: %.loc11_19.2: %i32 = converted %Div.call, %.loc11_19.1 -// CHECK:STDOUT: return %.loc11_19.2 +// CHECK:STDOUT: return %Div.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/builtins/int/smod.carbon b/toolchain/check/testdata/builtins/int/smod.carbon index 52174a29c528..778c692a241c 100644 --- a/toolchain/check/testdata/builtins/int/smod.carbon +++ b/toolchain/check/testdata/builtins/int/smod.carbon @@ -85,9 +85,7 @@ let b: i32 = Mod(0, 0); // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Mod.call: init %i32 = call %Mod.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc11_19.1: %i32 = value_of_initializer %Mod.call -// CHECK:STDOUT: %.loc11_19.2: %i32 = converted %Mod.call, %.loc11_19.1 -// CHECK:STDOUT: return %.loc11_19.2 +// CHECK:STDOUT: return %Mod.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/builtins/int/smul.carbon b/toolchain/check/testdata/builtins/int/smul.carbon index 98196fe5f950..bca1668e18f0 100644 --- a/toolchain/check/testdata/builtins/int/smul.carbon +++ b/toolchain/check/testdata/builtins/int/smul.carbon @@ -92,8 +92,6 @@ let b: i32 = Mul(0x8000, 0x10000); // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Mul.call: init %i32 = call %Mul.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc20_19.1: %i32 = value_of_initializer %Mul.call -// CHECK:STDOUT: %.loc20_19.2: %i32 = converted %Mul.call, %.loc20_19.1 -// CHECK:STDOUT: return %.loc20_19.2 +// CHECK:STDOUT: return %Mul.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/snegate.carbon b/toolchain/check/testdata/builtins/int/snegate.carbon index 49186523daf7..892ba0ede682 100644 --- a/toolchain/check/testdata/builtins/int/snegate.carbon +++ b/toolchain/check/testdata/builtins/int/snegate.carbon @@ -152,9 +152,7 @@ let b: i32 = Negate(-0x8000_0000); // CHECK:STDOUT: %Negate.ref: %Negate.type = name_ref Negate, file.%Negate.decl [concrete = constants.%Negate] // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %Negate.call: init %i32 = call %Negate.ref(%a.ref) -// CHECK:STDOUT: %.loc13_19.1: %i32 = value_of_initializer %Negate.call -// CHECK:STDOUT: %.loc13_19.2: %i32 = converted %Negate.call, %.loc13_19.1 -// CHECK:STDOUT: return %.loc13_19.2 +// CHECK:STDOUT: return %Negate.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/builtins/int/ssub.carbon b/toolchain/check/testdata/builtins/int/ssub.carbon index 8681c9e8fc27..1e2e63c5d51a 100644 --- a/toolchain/check/testdata/builtins/int/ssub.carbon +++ b/toolchain/check/testdata/builtins/int/ssub.carbon @@ -57,9 +57,7 @@ let c: i32 = Sub(Sub(0, 0x7FFFFFFF), 2); // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Sub.call: init %i32 = call %Sub.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc11_19.1: %i32 = value_of_initializer %Sub.call -// CHECK:STDOUT: %.loc11_19.2: %i32 = converted %Sub.call, %.loc11_19.1 -// CHECK:STDOUT: return %.loc11_19.2 +// CHECK:STDOUT: return %Sub.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/builtins/int/uadd.carbon b/toolchain/check/testdata/builtins/int/uadd.carbon index e7d5a86f9587..0b969d0c5a9c 100644 --- a/toolchain/check/testdata/builtins/int/uadd.carbon +++ b/toolchain/check/testdata/builtins/int/uadd.carbon @@ -128,9 +128,7 @@ let b: i32 = Add(0x7FFFFFFF, 1); // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Add.call: init %i32 = call %Add.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc11_19.1: %i32 = value_of_initializer %Add.call -// CHECK:STDOUT: %.loc11_19.2: %i32 = converted %Add.call, %.loc11_19.1 -// CHECK:STDOUT: return %.loc11_19.2 +// CHECK:STDOUT: return %Add.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/builtins/int/udiv.carbon b/toolchain/check/testdata/builtins/int/udiv.carbon index 659ee6dded0f..a68b2a59f955 100644 --- a/toolchain/check/testdata/builtins/int/udiv.carbon +++ b/toolchain/check/testdata/builtins/int/udiv.carbon @@ -78,9 +78,7 @@ let b: i32 = Div(0, 0); // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Div.call: init %i32 = call %Div.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc11_19.1: %i32 = value_of_initializer %Div.call -// CHECK:STDOUT: %.loc11_19.2: %i32 = converted %Div.call, %.loc11_19.1 -// CHECK:STDOUT: return %.loc11_19.2 +// CHECK:STDOUT: return %Div.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/builtins/int/umod.carbon b/toolchain/check/testdata/builtins/int/umod.carbon index e8ab4600f49c..15540d8623b5 100644 --- a/toolchain/check/testdata/builtins/int/umod.carbon +++ b/toolchain/check/testdata/builtins/int/umod.carbon @@ -80,9 +80,7 @@ let b: i32 = Mod(0, 0); // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Mod.call: init %i32 = call %Mod.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc11_19.1: %i32 = value_of_initializer %Mod.call -// CHECK:STDOUT: %.loc11_19.2: %i32 = converted %Mod.call, %.loc11_19.1 -// CHECK:STDOUT: return %.loc11_19.2 +// CHECK:STDOUT: return %Mod.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/builtins/int/umul.carbon b/toolchain/check/testdata/builtins/int/umul.carbon index 02b5e5c4518f..2085bda64686 100644 --- a/toolchain/check/testdata/builtins/int/umul.carbon +++ b/toolchain/check/testdata/builtins/int/umul.carbon @@ -52,9 +52,7 @@ let b: i32 = Mul(0x8000, 0x10000); // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Mul.call: init %i32 = call %Mul.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc11_19.1: %i32 = value_of_initializer %Mul.call -// CHECK:STDOUT: %.loc11_19.2: %i32 = converted %Mul.call, %.loc11_19.1 -// CHECK:STDOUT: return %.loc11_19.2 +// CHECK:STDOUT: return %Mul.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/builtins/int/unegate.carbon b/toolchain/check/testdata/builtins/int/unegate.carbon index a7fe080cb518..a97ce9c31043 100644 --- a/toolchain/check/testdata/builtins/int/unegate.carbon +++ b/toolchain/check/testdata/builtins/int/unegate.carbon @@ -137,9 +137,7 @@ fn F() { // CHECK:STDOUT: %Negate.ref: %Negate.type = name_ref Negate, file.%Negate.decl [concrete = constants.%Negate] // CHECK:STDOUT: %a.ref: %u32 = name_ref a, %a // CHECK:STDOUT: %Negate.call: init %u32 = call %Negate.ref(%a.ref) -// CHECK:STDOUT: %.loc13_19.1: %u32 = value_of_initializer %Negate.call -// CHECK:STDOUT: %.loc13_19.2: %u32 = converted %Negate.call, %.loc13_19.1 -// CHECK:STDOUT: return %.loc13_19.2 +// CHECK:STDOUT: return %Negate.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/builtins/int/usub.carbon b/toolchain/check/testdata/builtins/int/usub.carbon index 4cedfc7df162..77e6860eb9df 100644 --- a/toolchain/check/testdata/builtins/int/usub.carbon +++ b/toolchain/check/testdata/builtins/int/usub.carbon @@ -53,9 +53,7 @@ let c: i32 = Sub(Sub(0, 0x7FFFFFFF), 2); // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Sub.call: init %i32 = call %Sub.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc11_19.1: %i32 = value_of_initializer %Sub.call -// CHECK:STDOUT: %.loc11_19.2: %i32 = converted %Sub.call, %.loc11_19.1 -// CHECK:STDOUT: return %.loc11_19.2 +// CHECK:STDOUT: return %Sub.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/builtins/int/xor.carbon b/toolchain/check/testdata/builtins/int/xor.carbon index f96598324b45..0ffce563c609 100644 --- a/toolchain/check/testdata/builtins/int/xor.carbon +++ b/toolchain/check/testdata/builtins/int/xor.carbon @@ -41,9 +41,7 @@ fn RuntimeCallIsValid(a: i32, b: i32) -> i32 { // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Xor.call: init %i32 = call %Xor.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc9_19.1: %i32 = value_of_initializer %Xor.call -// CHECK:STDOUT: %.loc9_19.2: %i32 = converted %Xor.call, %.loc9_19.1 -// CHECK:STDOUT: return %.loc9_19.2 +// CHECK:STDOUT: return %Xor.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/class/access_modifers.carbon b/toolchain/check/testdata/class/access_modifers.carbon index fec72f039cd1..f60292005886 100644 --- a/toolchain/check/testdata/class/access_modifers.carbon +++ b/toolchain/check/testdata/class/access_modifers.carbon @@ -304,9 +304,8 @@ class A { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc9_13.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method.698] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc9_13.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc9_13.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc9_13.2: %i32 = converted %int_0, %.loc9_13.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: return %.loc9_13.2 +// CHECK:STDOUT: %.loc9: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] +// CHECK:STDOUT: return %.loc9 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Circle.Make() -> %return.param: %Circle { @@ -466,9 +465,10 @@ class A { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Circle.elem: type = unbound_element_type %Circle, %i32 [concrete] -// CHECK:STDOUT: %pattern_type.ce2: type = pattern_type %Circle [concrete] +// CHECK:STDOUT: %pattern_type.ce26: type = pattern_type %Circle [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %Circle.GetRadius.type: type = fn_type @Circle.GetRadius [concrete] // CHECK:STDOUT: %Circle.GetRadius: %Circle.GetRadius.type = struct_value () [concrete] @@ -485,6 +485,16 @@ class A { // CHECK:STDOUT: %Circle.as.Destroy.impl.Op: %Circle.as.Destroy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: %struct_type.radius: type = struct_type {.radius: %i32} [concrete] // CHECK:STDOUT: %complete_type.5a5: = complete_type_witness %struct_type.radius [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete] // CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] // CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] @@ -508,12 +518,16 @@ class A { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] @@ -549,8 +563,8 @@ class A { // CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %.loc5: %Circle.elem = field_decl radius, element0 [concrete] // CHECK:STDOUT: %Circle.GetRadius.decl: %Circle.GetRadius.type = fn_decl @Circle.GetRadius [concrete = constants.%Circle.GetRadius] { -// CHECK:STDOUT: %self.patt: %pattern_type.ce2 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.ce2 = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %self.patt: %pattern_type.ce26 = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: %pattern_type.ce26 = value_param_pattern %self.patt, call_param0 [concrete] // CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { @@ -572,8 +586,8 @@ class A { // CHECK:STDOUT: %return: ref %i32 = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: %Circle.Compute.decl: %Circle.Compute.type = fn_decl @Circle.Compute [concrete = constants.%Circle.Compute] { -// CHECK:STDOUT: %self.patt: %pattern_type.ce2 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.ce2 = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %self.patt: %pattern_type.ce26 = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: %pattern_type.ce26 = value_param_pattern %self.patt, call_param0 [concrete] // CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { @@ -606,7 +620,12 @@ class A { // CHECK:STDOUT: %radius.ref: %Circle.elem = name_ref radius, @Circle.%.loc5 [concrete = @Circle.%.loc5] // CHECK:STDOUT: %.loc8_16.1: ref %i32 = class_element_access %self.ref, element0 // CHECK:STDOUT: %.loc8_16.2: %i32 = bind_value %.loc8_16.1 -// CHECK:STDOUT: return %.loc8_16.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc8_16.1: = bound_method %.loc8_16.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc8_16.2: = bound_method %.loc8_16.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc8_16.2(%.loc8_16.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Circle.SomeInternalFunction() -> %i32 { @@ -617,9 +636,8 @@ class A { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc12_13.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc12_13.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc12_13.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc12_13.2: %i32 = converted %int_0, %.loc12_13.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: return %.loc12_13.2 +// CHECK:STDOUT: %.loc12: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] +// CHECK:STDOUT: return %.loc12 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Circle.Compute(%self.param: %Circle) -> %i32 { @@ -627,9 +645,7 @@ class A { // CHECK:STDOUT: %self.ref: %Circle = name_ref self, %self // CHECK:STDOUT: %SomeInternalFunction.ref: %Circle.SomeInternalFunction.type = name_ref SomeInternalFunction, @Circle.%Circle.SomeInternalFunction.decl [concrete = constants.%Circle.SomeInternalFunction] // CHECK:STDOUT: %Circle.SomeInternalFunction.call: init %i32 = call %SomeInternalFunction.ref() -// CHECK:STDOUT: %.loc16_39.1: %i32 = value_of_initializer %Circle.SomeInternalFunction.call -// CHECK:STDOUT: %.loc16_39.2: %i32 = converted %Circle.SomeInternalFunction.call, %.loc16_39.1 -// CHECK:STDOUT: return %.loc16_39.2 +// CHECK:STDOUT: return %Circle.SomeInternalFunction.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Circle.as.Destroy.impl.Op(%self.param: %ptr.54d) = "no_op"; diff --git a/toolchain/check/testdata/class/adapter/adapt_copy.carbon b/toolchain/check/testdata/class/adapter/adapt_copy.carbon index e9b92ea153c0..ef24b0ec24e0 100644 --- a/toolchain/check/testdata/class/adapter/adapt_copy.carbon +++ b/toolchain/check/testdata/class/adapter/adapt_copy.carbon @@ -32,6 +32,13 @@ fn F(c: AdaptCopyable) -> AdaptCopyable { // CHECK:STDERR: ^ // CHECK:STDERR: var d: AdaptCopyable = c; + // CHECK:STDERR: fail_adapt_copyable.carbon:[[@LINE+7]]:10: error: cannot copy value of type `AdaptCopyable` [CopyOfUncopyableType] + // CHECK:STDERR: return d; + // CHECK:STDERR: ^ + // CHECK:STDERR: fail_adapt_copyable.carbon:[[@LINE+4]]:10: note: type `AdaptCopyable` does not implement interface `Core.Copy` [MissingImplInMemberAccessNote] + // CHECK:STDERR: return d; + // CHECK:STDERR: ^ + // CHECK:STDERR: return d; } @@ -249,18 +256,18 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: %return.patt: %pattern_type.813 = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: %pattern_type.813 = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %AdaptCopyable.ref.loc20_41: type = name_ref AdaptCopyable, file.%AdaptCopyable.decl [concrete = constants.%AdaptCopyable] -// CHECK:STDOUT: %int_32.loc20_56: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %u32.loc20_56: type = class_type @UInt, @UInt(constants.%int_32) [concrete = constants.%u32] -// CHECK:STDOUT: %.loc20_59.1: %tuple.type.24b = tuple_literal (%AdaptCopyable.ref.loc20_41, %u32.loc20_56) -// CHECK:STDOUT: %.loc20_59.2: type = converted %.loc20_59.1, constants.%tuple.type.2a3 [concrete = constants.%tuple.type.2a3] +// CHECK:STDOUT: %AdaptCopyable.ref.loc27_41: type = name_ref AdaptCopyable, file.%AdaptCopyable.decl [concrete = constants.%AdaptCopyable] +// CHECK:STDOUT: %int_32.loc27_56: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %u32.loc27_56: type = class_type @UInt, @UInt(constants.%int_32) [concrete = constants.%u32] +// CHECK:STDOUT: %.loc27_59.1: %tuple.type.24b = tuple_literal (%AdaptCopyable.ref.loc27_41, %u32.loc27_56) +// CHECK:STDOUT: %.loc27_59.2: type = converted %.loc27_59.1, constants.%tuple.type.2a3 [concrete = constants.%tuple.type.2a3] // CHECK:STDOUT: %c.param: %tuple.type.2a3 = value_param call_param0 -// CHECK:STDOUT: %.loc20_34.1: type = splice_block %.loc20_34.3 [concrete = constants.%tuple.type.2a3] { -// CHECK:STDOUT: %AdaptCopyable.ref.loc20_16: type = name_ref AdaptCopyable, file.%AdaptCopyable.decl [concrete = constants.%AdaptCopyable] -// CHECK:STDOUT: %int_32.loc20_31: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %u32.loc20_31: type = class_type @UInt, @UInt(constants.%int_32) [concrete = constants.%u32] -// CHECK:STDOUT: %.loc20_34.2: %tuple.type.24b = tuple_literal (%AdaptCopyable.ref.loc20_16, %u32.loc20_31) -// CHECK:STDOUT: %.loc20_34.3: type = converted %.loc20_34.2, constants.%tuple.type.2a3 [concrete = constants.%tuple.type.2a3] +// CHECK:STDOUT: %.loc27_34.1: type = splice_block %.loc27_34.3 [concrete = constants.%tuple.type.2a3] { +// CHECK:STDOUT: %AdaptCopyable.ref.loc27_16: type = name_ref AdaptCopyable, file.%AdaptCopyable.decl [concrete = constants.%AdaptCopyable] +// CHECK:STDOUT: %int_32.loc27_31: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %u32.loc27_31: type = class_type @UInt, @UInt(constants.%int_32) [concrete = constants.%u32] +// CHECK:STDOUT: %.loc27_34.2: %tuple.type.24b = tuple_literal (%AdaptCopyable.ref.loc27_16, %u32.loc27_31) +// CHECK:STDOUT: %.loc27_34.3: type = converted %.loc27_34.2, constants.%tuple.type.2a3 [concrete = constants.%tuple.type.2a3] // CHECK:STDOUT: } // CHECK:STDOUT: %c: %tuple.type.2a3 = bind_name c, %c.param // CHECK:STDOUT: %return.param: ref %tuple.type.2a3 = out_param call_param1 @@ -313,11 +320,11 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: %AdaptCopyable.ref.loc16: type = name_ref AdaptCopyable, file.%AdaptCopyable.decl [concrete = constants.%AdaptCopyable] // CHECK:STDOUT: %d: ref %AdaptCopyable = bind_name d, %d.var // CHECK:STDOUT: %d.ref: ref %AdaptCopyable = name_ref d, %d -// CHECK:STDOUT: %.loc17: %AdaptCopyable = bind_value %d.ref +// CHECK:STDOUT: %.loc24: %AdaptCopyable = bind_value %d.ref // CHECK:STDOUT: %AdaptCopyable.as.Destroy.impl.Op.bound: = bound_method %d.var, constants.%AdaptCopyable.as.Destroy.impl.Op // CHECK:STDOUT: %addr: %ptr.4c1 = addr_of %d.var // CHECK:STDOUT: %AdaptCopyable.as.Destroy.impl.Op.call: init %empty_tuple.type = call %AdaptCopyable.as.Destroy.impl.Op.bound(%addr) -// CHECK:STDOUT: return %.loc17 +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @InTuple(%c.param: %tuple.type.2a3) -> %return.param: %tuple.type.2a3 { @@ -328,50 +335,50 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: } // CHECK:STDOUT: %d.var: ref %tuple.type.2a3 = var %d.var_patt // CHECK:STDOUT: %c.ref: %tuple.type.2a3 = name_ref c, %c -// CHECK:STDOUT: %tuple.elem0.loc28_33.1: %AdaptCopyable = tuple_access %c.ref, element0 -// CHECK:STDOUT: %tuple.elem0.loc28_33.2: ref %AdaptCopyable = tuple_access %d.var, element0 -// CHECK:STDOUT: %.loc28_33.1: init %AdaptCopyable = initialize_from to %tuple.elem0.loc28_33.2 [concrete = ] -// CHECK:STDOUT: %tuple.elem1.loc28_33.1: %u32 = tuple_access %c.ref, element1 -// CHECK:STDOUT: %impl.elem0.loc28: %.8fb = impl_witness_access constants.%Copy.impl_witness.bf5, element0 [concrete = constants.%UInt.as.Copy.impl.Op.019] -// CHECK:STDOUT: %bound_method.loc28_33.1: = bound_method %tuple.elem1.loc28_33.1, %impl.elem0.loc28 -// CHECK:STDOUT: %specific_fn.loc28: = specific_function %impl.elem0.loc28, @UInt.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%UInt.as.Copy.impl.Op.specific_fn] -// CHECK:STDOUT: %bound_method.loc28_33.2: = bound_method %tuple.elem1.loc28_33.1, %specific_fn.loc28 -// CHECK:STDOUT: %UInt.as.Copy.impl.Op.call.loc28: init %u32 = call %bound_method.loc28_33.2(%tuple.elem1.loc28_33.1) -// CHECK:STDOUT: %tuple.elem1.loc28_33.2: ref %u32 = tuple_access %d.var, element1 -// CHECK:STDOUT: %.loc28_33.2: init %u32 = initialize_from %UInt.as.Copy.impl.Op.call.loc28 to %tuple.elem1.loc28_33.2 -// CHECK:STDOUT: %.loc28_33.3: init %tuple.type.2a3 = tuple_init (%.loc28_33.1, %.loc28_33.2) to %d.var -// CHECK:STDOUT: %.loc28_3: init %tuple.type.2a3 = converted %c.ref, %.loc28_33.3 -// CHECK:STDOUT: assign %d.var, %.loc28_3 -// CHECK:STDOUT: %.loc28_29.1: type = splice_block %.loc28_29.3 [concrete = constants.%tuple.type.2a3] { -// CHECK:STDOUT: %AdaptCopyable.ref.loc28: type = name_ref AdaptCopyable, file.%AdaptCopyable.decl [concrete = constants.%AdaptCopyable] -// CHECK:STDOUT: %int_32.loc28: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %u32.loc28: type = class_type @UInt, @UInt(constants.%int_32) [concrete = constants.%u32] -// CHECK:STDOUT: %.loc28_29.2: %tuple.type.24b = tuple_literal (%AdaptCopyable.ref.loc28, %u32.loc28) -// CHECK:STDOUT: %.loc28_29.3: type = converted %.loc28_29.2, constants.%tuple.type.2a3 [concrete = constants.%tuple.type.2a3] +// CHECK:STDOUT: %tuple.elem0.loc35_33.1: %AdaptCopyable = tuple_access %c.ref, element0 +// CHECK:STDOUT: %tuple.elem0.loc35_33.2: ref %AdaptCopyable = tuple_access %d.var, element0 +// CHECK:STDOUT: %.loc35_33.1: init %AdaptCopyable = initialize_from to %tuple.elem0.loc35_33.2 [concrete = ] +// CHECK:STDOUT: %tuple.elem1.loc35_33.1: %u32 = tuple_access %c.ref, element1 +// CHECK:STDOUT: %impl.elem0.loc35: %.8fb = impl_witness_access constants.%Copy.impl_witness.bf5, element0 [concrete = constants.%UInt.as.Copy.impl.Op.019] +// CHECK:STDOUT: %bound_method.loc35_33.1: = bound_method %tuple.elem1.loc35_33.1, %impl.elem0.loc35 +// CHECK:STDOUT: %specific_fn.loc35: = specific_function %impl.elem0.loc35, @UInt.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%UInt.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc35_33.2: = bound_method %tuple.elem1.loc35_33.1, %specific_fn.loc35 +// CHECK:STDOUT: %UInt.as.Copy.impl.Op.call.loc35: init %u32 = call %bound_method.loc35_33.2(%tuple.elem1.loc35_33.1) +// CHECK:STDOUT: %tuple.elem1.loc35_33.2: ref %u32 = tuple_access %d.var, element1 +// CHECK:STDOUT: %.loc35_33.2: init %u32 = initialize_from %UInt.as.Copy.impl.Op.call.loc35 to %tuple.elem1.loc35_33.2 +// CHECK:STDOUT: %.loc35_33.3: init %tuple.type.2a3 = tuple_init (%.loc35_33.1, %.loc35_33.2) to %d.var +// CHECK:STDOUT: %.loc35_3: init %tuple.type.2a3 = converted %c.ref, %.loc35_33.3 +// CHECK:STDOUT: assign %d.var, %.loc35_3 +// CHECK:STDOUT: %.loc35_29.1: type = splice_block %.loc35_29.3 [concrete = constants.%tuple.type.2a3] { +// CHECK:STDOUT: %AdaptCopyable.ref.loc35: type = name_ref AdaptCopyable, file.%AdaptCopyable.decl [concrete = constants.%AdaptCopyable] +// CHECK:STDOUT: %int_32.loc35: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %u32.loc35: type = class_type @UInt, @UInt(constants.%int_32) [concrete = constants.%u32] +// CHECK:STDOUT: %.loc35_29.2: %tuple.type.24b = tuple_literal (%AdaptCopyable.ref.loc35, %u32.loc35) +// CHECK:STDOUT: %.loc35_29.3: type = converted %.loc35_29.2, constants.%tuple.type.2a3 [concrete = constants.%tuple.type.2a3] // CHECK:STDOUT: } // CHECK:STDOUT: %d: ref %tuple.type.2a3 = bind_name d, %d.var // CHECK:STDOUT: %d.ref: ref %tuple.type.2a3 = name_ref d, %d -// CHECK:STDOUT: %tuple.elem0.loc36_10.1: ref %AdaptCopyable = tuple_access %d.ref, element0 -// CHECK:STDOUT: %.loc36_10.1: %AdaptCopyable = bind_value %tuple.elem0.loc36_10.1 -// CHECK:STDOUT: %tuple.elem0.loc36_10.2: ref %AdaptCopyable = tuple_access %return, element0 -// CHECK:STDOUT: %.loc36_10.2: init %AdaptCopyable = initialize_from to %tuple.elem0.loc36_10.2 [concrete = ] -// CHECK:STDOUT: %tuple.elem1.loc36_10.1: ref %u32 = tuple_access %d.ref, element1 -// CHECK:STDOUT: %.loc36_10.3: %u32 = bind_value %tuple.elem1.loc36_10.1 -// CHECK:STDOUT: %impl.elem0.loc36: %.8fb = impl_witness_access constants.%Copy.impl_witness.bf5, element0 [concrete = constants.%UInt.as.Copy.impl.Op.019] -// CHECK:STDOUT: %bound_method.loc36_10.1: = bound_method %.loc36_10.3, %impl.elem0.loc36 -// CHECK:STDOUT: %specific_fn.loc36: = specific_function %impl.elem0.loc36, @UInt.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%UInt.as.Copy.impl.Op.specific_fn] -// CHECK:STDOUT: %bound_method.loc36_10.2: = bound_method %.loc36_10.3, %specific_fn.loc36 -// CHECK:STDOUT: %UInt.as.Copy.impl.Op.call.loc36: init %u32 = call %bound_method.loc36_10.2(%.loc36_10.3) -// CHECK:STDOUT: %tuple.elem1.loc36_10.2: ref %u32 = tuple_access %return, element1 -// CHECK:STDOUT: %.loc36_10.4: init %u32 = initialize_from %UInt.as.Copy.impl.Op.call.loc36 to %tuple.elem1.loc36_10.2 -// CHECK:STDOUT: %.loc36_10.5: init %tuple.type.2a3 = tuple_init (%.loc36_10.2, %.loc36_10.4) to %return -// CHECK:STDOUT: %.loc36_11: init %tuple.type.2a3 = converted %d.ref, %.loc36_10.5 +// CHECK:STDOUT: %tuple.elem0.loc43_10.1: ref %AdaptCopyable = tuple_access %d.ref, element0 +// CHECK:STDOUT: %.loc43_10.1: %AdaptCopyable = bind_value %tuple.elem0.loc43_10.1 +// CHECK:STDOUT: %tuple.elem0.loc43_10.2: ref %AdaptCopyable = tuple_access %return, element0 +// CHECK:STDOUT: %.loc43_10.2: init %AdaptCopyable = initialize_from to %tuple.elem0.loc43_10.2 [concrete = ] +// CHECK:STDOUT: %tuple.elem1.loc43_10.1: ref %u32 = tuple_access %d.ref, element1 +// CHECK:STDOUT: %.loc43_10.3: %u32 = bind_value %tuple.elem1.loc43_10.1 +// CHECK:STDOUT: %impl.elem0.loc43: %.8fb = impl_witness_access constants.%Copy.impl_witness.bf5, element0 [concrete = constants.%UInt.as.Copy.impl.Op.019] +// CHECK:STDOUT: %bound_method.loc43_10.1: = bound_method %.loc43_10.3, %impl.elem0.loc43 +// CHECK:STDOUT: %specific_fn.loc43: = specific_function %impl.elem0.loc43, @UInt.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%UInt.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc43_10.2: = bound_method %.loc43_10.3, %specific_fn.loc43 +// CHECK:STDOUT: %UInt.as.Copy.impl.Op.call.loc43: init %u32 = call %bound_method.loc43_10.2(%.loc43_10.3) +// CHECK:STDOUT: %tuple.elem1.loc43_10.2: ref %u32 = tuple_access %return, element1 +// CHECK:STDOUT: %.loc43_10.4: init %u32 = initialize_from %UInt.as.Copy.impl.Op.call.loc43 to %tuple.elem1.loc43_10.2 +// CHECK:STDOUT: %.loc43_10.5: init %tuple.type.2a3 = tuple_init (%.loc43_10.2, %.loc43_10.4) to %return +// CHECK:STDOUT: %.loc43_11: init %tuple.type.2a3 = converted %d.ref, %.loc43_10.5 // CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %d.var, constants.%T.as.Destroy.impl.Op.9b5 // CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function constants.%T.as.Destroy.impl.Op.9b5, @T.as.Destroy.impl.Op(constants.%tuple.type.2a3) [concrete = constants.%T.as.Destroy.impl.Op.specific_fn] -// CHECK:STDOUT: %bound_method.loc28_3: = bound_method %d.var, %T.as.Destroy.impl.Op.specific_fn +// CHECK:STDOUT: %bound_method.loc35_3: = bound_method %d.var, %T.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr: %ptr.c30 = addr_of %d.var -// CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc28_3(%addr) -// CHECK:STDOUT: return %.loc36_11 to %return +// CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc35_3(%addr) +// CHECK:STDOUT: return %.loc43_11 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- adapt_copyable_tuple.carbon diff --git a/toolchain/check/testdata/class/adapter/extend_adapt.carbon b/toolchain/check/testdata/class/adapter/extend_adapt.carbon index a15acae8c323..867dc8982be4 100644 --- a/toolchain/check/testdata/class/adapter/extend_adapt.carbon +++ b/toolchain/check/testdata/class/adapter/extend_adapt.carbon @@ -623,7 +623,7 @@ fn F(a: IntAdapter) -> i32 { // CHECK:STDOUT: %b.ref: %SomeClass.elem = name_ref b, @SomeClass.%.loc6 [concrete = @SomeClass.%.loc6] // CHECK:STDOUT: %.loc21_11.1: %SomeClass = converted %a.ref, [concrete = ] // CHECK:STDOUT: %.loc21_11.2: %i32 = class_element_access , element1 [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_adapt_struct.carbon @@ -726,7 +726,7 @@ fn F(a: IntAdapter) -> i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %StructAdapter = name_ref a, %a // CHECK:STDOUT: %b.ref: = name_ref b, [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_adapt_tuple.carbon @@ -831,7 +831,7 @@ fn F(a: IntAdapter) -> i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %TupleAdapter = name_ref a, %a // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_adapt_builtin.carbon @@ -964,6 +964,6 @@ fn F(a: IntAdapter) -> i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %IntAdapter = name_ref a, %a // CHECK:STDOUT: %foo.ref: = name_ref foo, [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/base_field.carbon b/toolchain/check/testdata/class/base_field.carbon index 6c0b1bf7b7a4..1eac5b4f922d 100644 --- a/toolchain/check/testdata/class/base_field.carbon +++ b/toolchain/check/testdata/class/base_field.carbon @@ -61,17 +61,32 @@ fn Access(p: Derived*) -> i32* { // CHECK:STDOUT: %pattern_type.fe8: type = pattern_type %ptr.235 [concrete] // CHECK:STDOUT: %Access.type: type = fn_type @Access [concrete] // CHECK:STDOUT: %Access: %Access.type = struct_value () [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf: %ptr.as.Copy.impl.Op.type.f23 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.19c: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%i32) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.3ea: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%i32) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.2f4: %ptr.as.Copy.impl.Op.type.3ea = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.bab: %Copy.type = facet_value %ptr.235, (%Copy.impl_witness.19c) [concrete] +// CHECK:STDOUT: %.284: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.bab [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn: = specific_function %ptr.as.Copy.impl.Op.2f4, @ptr.as.Copy.impl.Op(%i32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -199,6 +214,11 @@ fn Access(p: Derived*) -> i32* { // CHECK:STDOUT: %.loc29_15.2: ref %Base = converted %.loc29_12, %.loc29_15.1 // CHECK:STDOUT: %.loc29_15.3: ref %i32 = class_element_access %.loc29_15.2, element2 // CHECK:STDOUT: %addr: %ptr.235 = addr_of %.loc29_15.3 -// CHECK:STDOUT: return %addr +// CHECK:STDOUT: %impl.elem0: %.284 = impl_witness_access constants.%Copy.impl_witness.19c, element0 [concrete = constants.%ptr.as.Copy.impl.Op.2f4] +// CHECK:STDOUT: %bound_method.loc29_10.1: = bound_method %addr, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @ptr.as.Copy.impl.Op(constants.%i32) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc29_10.2: = bound_method %addr, %specific_fn +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.235 = call %bound_method.loc29_10.2(%addr) +// CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/base_method_qualified.carbon b/toolchain/check/testdata/class/base_method_qualified.carbon index 2ed2f28e72d2..22c8fa6d5dcd 100644 --- a/toolchain/check/testdata/class/base_method_qualified.carbon +++ b/toolchain/check/testdata/class/base_method_qualified.carbon @@ -310,9 +310,7 @@ fn PassDerivedToBaseIndirect(p: Derived*) -> i32 { // CHECK:STDOUT: %.loc30_10.2: ref %Base = converted %a.ref, %.loc30_10.1 // CHECK:STDOUT: %.loc30_10.3: %Base = bind_value %.loc30_10.2 // CHECK:STDOUT: %Base.F.call: init %i32 = call %Base.F.bound(%.loc30_10.3) -// CHECK:STDOUT: %.loc30_22.1: %i32 = value_of_initializer %Base.F.call -// CHECK:STDOUT: %.loc30_22.2: %i32 = converted %Base.F.call, %.loc30_22.1 -// CHECK:STDOUT: return %.loc30_22.2 +// CHECK:STDOUT: return %Base.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallIndirect(%p.param: %ptr.404) -> %i32 { @@ -326,9 +324,7 @@ fn PassDerivedToBaseIndirect(p: Derived*) -> i32 { // CHECK:STDOUT: %.loc34_11.3: ref %Base = converted %.loc34_11.1, %.loc34_11.2 // CHECK:STDOUT: %.loc34_11.4: %Base = bind_value %.loc34_11.3 // CHECK:STDOUT: %Base.F.call: init %i32 = call %Base.F.bound(%.loc34_11.4) -// CHECK:STDOUT: %.loc34_23.1: %i32 = value_of_initializer %Base.F.call -// CHECK:STDOUT: %.loc34_23.2: %i32 = converted %Base.F.call, %.loc34_23.1 -// CHECK:STDOUT: return %.loc34_23.2 +// CHECK:STDOUT: return %Base.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @PassDerivedToBase(%a.param: %Derived) -> %i32 { @@ -338,9 +334,7 @@ fn PassDerivedToBaseIndirect(p: Derived*) -> i32 { // CHECK:STDOUT: %G.ref: %Base.G.type = name_ref G, @Base.%Base.G.decl [concrete = constants.%Base.G] // CHECK:STDOUT: %Base.G.bound: = bound_method %a.ref, %G.ref // CHECK:STDOUT: %Base.G.call: init %i32 = call %Base.G.bound(%a.ref) -// CHECK:STDOUT: %.loc38_22.1: %i32 = value_of_initializer %Base.G.call -// CHECK:STDOUT: %.loc38_22.2: %i32 = converted %Base.G.call, %.loc38_22.1 -// CHECK:STDOUT: return %.loc38_22.2 +// CHECK:STDOUT: return %Base.G.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @PassDerivedToBaseIndirect(%p.param: %ptr.404) -> %i32 { @@ -352,8 +346,6 @@ fn PassDerivedToBaseIndirect(p: Derived*) -> i32 { // CHECK:STDOUT: %Base.G.bound: = bound_method %.loc42_11.1, %G.ref // CHECK:STDOUT: %.loc42_11.2: %Derived = bind_value %.loc42_11.1 // CHECK:STDOUT: %Base.G.call: init %i32 = call %Base.G.bound(%.loc42_11.2) -// CHECK:STDOUT: %.loc42_23.1: %i32 = value_of_initializer %Base.G.call -// CHECK:STDOUT: %.loc42_23.2: %i32 = converted %Base.G.call, %.loc42_23.1 -// CHECK:STDOUT: return %.loc42_23.2 +// CHECK:STDOUT: return %Base.G.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/basic.carbon b/toolchain/check/testdata/class/basic.carbon index 7cf48064004d..fbfd7f38f9ce 100644 --- a/toolchain/check/testdata/class/basic.carbon +++ b/toolchain/check/testdata/class/basic.carbon @@ -37,6 +37,7 @@ fn Run() -> i32 { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %Class.F.type: type = fn_type @Class.F [concrete] @@ -53,6 +54,16 @@ fn Run() -> i32 { // CHECK:STDOUT: %Class.as.Destroy.impl.Op: %Class.as.Destroy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: %struct_type.k: type = struct_type {.k: %i32} [concrete] // CHECK:STDOUT: %complete_type.954: = complete_type_witness %struct_type.k [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %Run.type: type = fn_type @Run [concrete] // CHECK:STDOUT: %Run: %Run.type = struct_value () [concrete] // CHECK:STDOUT: %int_4.0c1: Core.IntLiteral = int_value 4 [concrete] @@ -78,12 +89,16 @@ fn Run() -> i32 { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] @@ -198,13 +213,23 @@ fn Run() -> i32 { // CHECK:STDOUT: fn @Class.F(%n.param: %i32) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %n.ref: %i32 = name_ref n, %n -// CHECK:STDOUT: return %n.ref +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc17_12.1: = bound_method %n.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc17_12.2: = bound_method %n.ref, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc17_12.2(%n.ref) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.G(%n.param.loc25: %i32) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %n.ref: %i32 = name_ref n, %n.loc25 -// CHECK:STDOUT: return %n.ref +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc26_10.1: = bound_method %n.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc26_10.2: = bound_method %n.ref, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc26_10.2(%n.ref) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return.loc25 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.as.Destroy.impl.Op(%self.param: %ptr.e71) = "no_op"; @@ -222,8 +247,6 @@ fn Run() -> i32 { // CHECK:STDOUT: %.loc30_18.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_4.940] // CHECK:STDOUT: %.loc30_18.2: %i32 = converted %int_4, %.loc30_18.1 [concrete = constants.%int_4.940] // CHECK:STDOUT: %Class.F.call: init %i32 = call %F.ref(%.loc30_18.2) -// CHECK:STDOUT: %.loc30_20.1: %i32 = value_of_initializer %Class.F.call -// CHECK:STDOUT: %.loc30_20.2: %i32 = converted %Class.F.call, %.loc30_20.1 -// CHECK:STDOUT: return %.loc30_20.2 +// CHECK:STDOUT: return %Class.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/complete_in_member_fn.carbon b/toolchain/check/testdata/class/complete_in_member_fn.carbon index e2d8bbe2bf4a..475ef9b6d20c 100644 --- a/toolchain/check/testdata/class/complete_in_member_fn.carbon +++ b/toolchain/check/testdata/class/complete_in_member_fn.carbon @@ -26,6 +26,7 @@ class C { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %C.F.type: type = fn_type @C.F [concrete] @@ -40,17 +41,31 @@ class C { // CHECK:STDOUT: %C.as.Destroy.impl.Op: %C.as.Destroy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %i32} [concrete] // CHECK:STDOUT: %complete_type.fd7: = complete_type_witness %struct_type.a [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -116,7 +131,12 @@ class C { // CHECK:STDOUT: %a.ref: %C.elem = name_ref a, @C.%.loc18 [concrete = @C.%.loc18] // CHECK:STDOUT: %.loc16_31.1: ref %i32 = class_element_access %c.ref, element0 // CHECK:STDOUT: %.loc16_31.2: %i32 = bind_value %.loc16_31.1 -// CHECK:STDOUT: return %.loc16_31.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc16_31.1: = bound_method %.loc16_31.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc16_31.2: = bound_method %.loc16_31.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc16_31.2(%.loc16_31.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.Destroy.impl.Op(%self.param: %ptr.019) = "no_op"; diff --git a/toolchain/check/testdata/class/compound_field.carbon b/toolchain/check/testdata/class/compound_field.carbon index f9387cfbd731..5d12f2bda5a2 100644 --- a/toolchain/check/testdata/class/compound_field.carbon +++ b/toolchain/check/testdata/class/compound_field.carbon @@ -48,6 +48,7 @@ fn AccessBaseIndirect(p: Derived*) -> i32* { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %i32 [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] @@ -73,12 +74,31 @@ fn AccessBaseIndirect(p: Derived*) -> i32* { // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %AccessDerived.type: type = fn_type @AccessDerived [concrete] // CHECK:STDOUT: %AccessDerived: %AccessDerived.type = struct_value () [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf: %ptr.as.Copy.impl.Op.type.f23 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %AccessBase.type: type = fn_type @AccessBase [concrete] // CHECK:STDOUT: %AccessBase: %AccessBase.type = struct_value () [concrete] // CHECK:STDOUT: %ptr.235: type = ptr_type %i32 [concrete] // CHECK:STDOUT: %pattern_type.fe8: type = pattern_type %ptr.235 [concrete] // CHECK:STDOUT: %AccessDerivedIndirect.type: type = fn_type @AccessDerivedIndirect [concrete] // CHECK:STDOUT: %AccessDerivedIndirect: %AccessDerivedIndirect.type = struct_value () [concrete] +// CHECK:STDOUT: %Copy.impl_witness.19c: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%i32) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.3ea: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%i32) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.2f4: %ptr.as.Copy.impl.Op.type.3ea = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.bab: %Copy.type = facet_value %ptr.235, (%Copy.impl_witness.19c) [concrete] +// CHECK:STDOUT: %.284: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.bab [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn: = specific_function %ptr.as.Copy.impl.Op.2f4, @ptr.as.Copy.impl.Op(%i32) [concrete] // CHECK:STDOUT: %AccessBaseIndirect.type: type = fn_type @AccessBaseIndirect [concrete] // CHECK:STDOUT: %AccessBaseIndirect: %AccessBaseIndirect.type = struct_value () [concrete] // CHECK:STDOUT: } @@ -87,11 +107,17 @@ fn AccessBaseIndirect(p: Derived*) -> i32* { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -265,7 +291,12 @@ fn AccessBaseIndirect(p: Derived*) -> i32* { // CHECK:STDOUT: %d.ref.loc29_20: %Derived.elem.344 = name_ref d, @Derived.%.loc24 [concrete = @Derived.%.loc24] // CHECK:STDOUT: %.loc29_11.1: ref %i32 = class_element_access %d.ref.loc29_10, element1 // CHECK:STDOUT: %.loc29_11.2: %i32 = bind_value %.loc29_11.1 -// CHECK:STDOUT: return %.loc29_11.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc29_11.1: = bound_method %.loc29_11.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc29_11.2: = bound_method %.loc29_11.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc29_11.2(%.loc29_11.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @AccessBase(%d.param: %Derived) -> %i32 { @@ -277,7 +308,12 @@ fn AccessBaseIndirect(p: Derived*) -> i32* { // CHECK:STDOUT: %.loc33_11.2: ref %Base = converted %d.ref, %.loc33_11.1 // CHECK:STDOUT: %.loc33_11.3: ref %i32 = class_element_access %.loc33_11.2, element1 // CHECK:STDOUT: %.loc33_11.4: %i32 = bind_value %.loc33_11.3 -// CHECK:STDOUT: return %.loc33_11.4 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc33_11.1: = bound_method %.loc33_11.4, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc33_11.2: = bound_method %.loc33_11.4, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc33_11.2(%.loc33_11.4) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @AccessDerivedIndirect(%p.param: %ptr.404) -> %ptr.235 { @@ -288,7 +324,12 @@ fn AccessBaseIndirect(p: Derived*) -> i32* { // CHECK:STDOUT: %.loc37_12.1: ref %Derived = deref %p.ref // CHECK:STDOUT: %.loc37_12.2: ref %i32 = class_element_access %.loc37_12.1, element1 // CHECK:STDOUT: %addr: %ptr.235 = addr_of %.loc37_12.2 -// CHECK:STDOUT: return %addr +// CHECK:STDOUT: %impl.elem0: %.284 = impl_witness_access constants.%Copy.impl_witness.19c, element0 [concrete = constants.%ptr.as.Copy.impl.Op.2f4] +// CHECK:STDOUT: %bound_method.loc37_10.1: = bound_method %addr, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @ptr.as.Copy.impl.Op(constants.%i32) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc37_10.2: = bound_method %addr, %specific_fn +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.235 = call %bound_method.loc37_10.2(%addr) +// CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @AccessBaseIndirect(%p.param: %ptr.404) -> %ptr.235 { @@ -301,6 +342,11 @@ fn AccessBaseIndirect(p: Derived*) -> i32* { // CHECK:STDOUT: %.loc41_12.3: ref %Base = converted %.loc41_12.1, %.loc41_12.2 // CHECK:STDOUT: %.loc41_12.4: ref %i32 = class_element_access %.loc41_12.3, element1 // CHECK:STDOUT: %addr: %ptr.235 = addr_of %.loc41_12.4 -// CHECK:STDOUT: return %addr +// CHECK:STDOUT: %impl.elem0: %.284 = impl_witness_access constants.%Copy.impl_witness.19c, element0 [concrete = constants.%ptr.as.Copy.impl.Op.2f4] +// CHECK:STDOUT: %bound_method.loc41_10.1: = bound_method %addr, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @ptr.as.Copy.impl.Op(constants.%i32) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc41_10.2: = bound_method %addr, %specific_fn +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.235 = call %bound_method.loc41_10.2(%addr) +// CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/derived_to_base.carbon b/toolchain/check/testdata/class/derived_to_base.carbon index 1253df92b905..497ca28232b2 100644 --- a/toolchain/check/testdata/class/derived_to_base.carbon +++ b/toolchain/check/testdata/class/derived_to_base.carbon @@ -135,8 +135,25 @@ fn PassConstB(p: const B) { // CHECK:STDOUT: %C.as.Destroy.impl.Op: %C.as.Destroy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: %ConvertCToB.type: type = fn_type @ConvertCToB [concrete] // CHECK:STDOUT: %ConvertCToB: %ConvertCToB.type = struct_value () [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf: %ptr.as.Copy.impl.Op.type.f23 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.b52: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%B) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.3c5: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%B) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.aa5: %ptr.as.Copy.impl.Op.type.3c5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.a1c: %Copy.type = facet_value %ptr.e79, (%Copy.impl_witness.b52) [concrete] +// CHECK:STDOUT: %.711: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.a1c [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn.900: = specific_function %ptr.as.Copy.impl.Op.aa5, @ptr.as.Copy.impl.Op(%B) [concrete] // CHECK:STDOUT: %ConvertBToA.type: type = fn_type @ConvertBToA [concrete] // CHECK:STDOUT: %ConvertBToA: %ConvertBToA.type = struct_value () [concrete] +// CHECK:STDOUT: %Copy.impl_witness.e66: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%A) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.a1f: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%A) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.14c: %ptr.as.Copy.impl.Op.type.a1f = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.06b: %Copy.type = facet_value %ptr.6db, (%Copy.impl_witness.e66) [concrete] +// CHECK:STDOUT: %.9d9: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.06b [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn.4d5: = specific_function %ptr.as.Copy.impl.Op.14c, @ptr.as.Copy.impl.Op(%A) [concrete] // CHECK:STDOUT: %ConvertCToA.type: type = fn_type @ConvertCToA [concrete] // CHECK:STDOUT: %ConvertCToA: %ConvertCToA.type = struct_value () [concrete] // CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] @@ -179,6 +196,8 @@ fn PassConstB(p: const B) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: } @@ -270,7 +289,12 @@ fn PassConstB(p: const B) { // CHECK:STDOUT: %.loc19_39.2: ref %B = class_element_access %.loc19_39.1, element0 // CHECK:STDOUT: %addr: %ptr.e79 = addr_of %.loc19_39.2 // CHECK:STDOUT: %.loc19_39.3: %ptr.e79 = converted %p.ref, %addr -// CHECK:STDOUT: return %.loc19_39.3 +// CHECK:STDOUT: %impl.elem0: %.711 = impl_witness_access constants.%Copy.impl_witness.b52, element0 [concrete = constants.%ptr.as.Copy.impl.Op.aa5] +// CHECK:STDOUT: %bound_method.loc19_39.1: = bound_method %.loc19_39.3, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @ptr.as.Copy.impl.Op(constants.%B) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn.900] +// CHECK:STDOUT: %bound_method.loc19_39.2: = bound_method %.loc19_39.3, %specific_fn +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.e79 = call %bound_method.loc19_39.2(%.loc19_39.3) +// CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConvertBToA(%p.param: %ptr.e79) -> %ptr.6db { @@ -280,7 +304,12 @@ fn PassConstB(p: const B) { // CHECK:STDOUT: %.loc20_39.2: ref %A = class_element_access %.loc20_39.1, element0 // CHECK:STDOUT: %addr: %ptr.6db = addr_of %.loc20_39.2 // CHECK:STDOUT: %.loc20_39.3: %ptr.6db = converted %p.ref, %addr -// CHECK:STDOUT: return %.loc20_39.3 +// CHECK:STDOUT: %impl.elem0: %.9d9 = impl_witness_access constants.%Copy.impl_witness.e66, element0 [concrete = constants.%ptr.as.Copy.impl.Op.14c] +// CHECK:STDOUT: %bound_method.loc20_39.1: = bound_method %.loc20_39.3, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @ptr.as.Copy.impl.Op(constants.%A) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn.4d5] +// CHECK:STDOUT: %bound_method.loc20_39.2: = bound_method %.loc20_39.3, %specific_fn +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.6db = call %bound_method.loc20_39.2(%.loc20_39.3) +// CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConvertCToA(%p.param: %ptr.019) -> %ptr.6db { @@ -291,7 +320,12 @@ fn PassConstB(p: const B) { // CHECK:STDOUT: %.loc21_39.3: ref %A = class_element_access %.loc21_39.2, element0 // CHECK:STDOUT: %addr: %ptr.6db = addr_of %.loc21_39.3 // CHECK:STDOUT: %.loc21_39.4: %ptr.6db = converted %p.ref, %addr -// CHECK:STDOUT: return %.loc21_39.4 +// CHECK:STDOUT: %impl.elem0: %.9d9 = impl_witness_access constants.%Copy.impl_witness.e66, element0 [concrete = constants.%ptr.as.Copy.impl.Op.14c] +// CHECK:STDOUT: %bound_method.loc21_39.1: = bound_method %.loc21_39.4, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @ptr.as.Copy.impl.Op(constants.%A) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn.4d5] +// CHECK:STDOUT: %bound_method.loc21_39.2: = bound_method %.loc21_39.4, %specific_fn +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.6db = call %bound_method.loc21_39.2(%.loc21_39.4) +// CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConvertValue(%c.param: %C) { @@ -318,7 +352,12 @@ fn PassConstB(p: const B) { // CHECK:STDOUT: %.loc28_15.2: ref %A = class_element_access %.loc28_15.1, element0 // CHECK:STDOUT: %.loc28_15.3: ref %A = converted %.loc28_12, %.loc28_15.2 // CHECK:STDOUT: %addr: %ptr.6db = addr_of %.loc28_15.3 -// CHECK:STDOUT: return %addr +// CHECK:STDOUT: %impl.elem0: %.9d9 = impl_witness_access constants.%Copy.impl_witness.e66, element0 [concrete = constants.%ptr.as.Copy.impl.Op.14c] +// CHECK:STDOUT: %bound_method.loc28_10.1: = bound_method %addr, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @ptr.as.Copy.impl.Op(constants.%A) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn.4d5] +// CHECK:STDOUT: %bound_method.loc28_10.2: = bound_method %addr, %specific_fn +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.6db = call %bound_method.loc28_10.2(%addr) +// CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConvertInit() { diff --git a/toolchain/check/testdata/class/fail_abstract.carbon b/toolchain/check/testdata/class/fail_abstract.carbon index b4a5f7138a44..7dd590d7aac7 100644 --- a/toolchain/check/testdata/class/fail_abstract.carbon +++ b/toolchain/check/testdata/class/fail_abstract.carbon @@ -1081,7 +1081,7 @@ fn CallReturnAbstract() { // CHECK:STDOUT: %base.ref: %Derived.elem.513 = name_ref base, @Derived.%.loc9 [concrete = @Derived.%.loc9] // CHECK:STDOUT: %.loc15: ref %Abstract = class_element_access %d.ref, element0 // CHECK:STDOUT: %a.ref: = name_ref a, [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- abstract_let_temporary.carbon diff --git a/toolchain/check/testdata/class/forward_declared.carbon b/toolchain/check/testdata/class/forward_declared.carbon index ff4b52a32c8e..9d84498a1ded 100644 --- a/toolchain/check/testdata/class/forward_declared.carbon +++ b/toolchain/check/testdata/class/forward_declared.carbon @@ -20,17 +20,32 @@ fn F(p: Class*) -> Class* { return p; } // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %ptr: type = ptr_type %Class [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [concrete] +// CHECK:STDOUT: %ptr.e71: type = ptr_type %Class [concrete] +// CHECK:STDOUT: %pattern_type.796: type = pattern_type %ptr.e71 [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] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf: %ptr.as.Copy.impl.Op.type.f23 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.771: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%Class) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.eef: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%Class) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.cd0: %ptr.as.Copy.impl.Op.type.eef = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.054: %Copy.type = facet_value %ptr.e71, (%Copy.impl_witness.771) [concrete] +// CHECK:STDOUT: %.96e: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.054 [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn: = specific_function %ptr.as.Copy.impl.Op.cd0, @ptr.as.Copy.impl.Op(%Class) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -42,29 +57,34 @@ fn F(p: Class*) -> Class* { return p; } // CHECK:STDOUT: %Core.import = import Core // CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} // CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %p.patt: %pattern_type = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %p.patt: %pattern_type.796 = binding_pattern p [concrete] +// CHECK:STDOUT: %p.param_patt: %pattern_type.796 = value_param_pattern %p.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.796 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.796 = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %Class.ref.loc17_20: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr.loc17_25: type = ptr_type %Class.ref.loc17_20 [concrete = constants.%ptr] -// CHECK:STDOUT: %p.param: %ptr = value_param call_param0 -// CHECK:STDOUT: %.loc17: type = splice_block %ptr.loc17_14 [concrete = constants.%ptr] { +// CHECK:STDOUT: %ptr.loc17_25: type = ptr_type %Class.ref.loc17_20 [concrete = constants.%ptr.e71] +// CHECK:STDOUT: %p.param: %ptr.e71 = value_param call_param0 +// CHECK:STDOUT: %.loc17: type = splice_block %ptr.loc17_14 [concrete = constants.%ptr.e71] { // CHECK:STDOUT: %Class.ref.loc17_9: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr.loc17_14: type = ptr_type %Class.ref.loc17_9 [concrete = constants.%ptr] +// CHECK:STDOUT: %ptr.loc17_14: type = ptr_type %Class.ref.loc17_9 [concrete = constants.%ptr.e71] // CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %ptr = out_param call_param1 -// CHECK:STDOUT: %return: ref %ptr = return_slot %return.param +// CHECK:STDOUT: %p: %ptr.e71 = bind_name p, %p.param +// CHECK:STDOUT: %return.param: ref %ptr.e71 = out_param call_param1 +// CHECK:STDOUT: %return: ref %ptr.e71 = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @Class; // CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%p.param: %ptr) -> %ptr { +// CHECK:STDOUT: fn @F(%p.param: %ptr.e71) -> %ptr.e71 { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr = name_ref p, %p -// CHECK:STDOUT: return %p.ref +// CHECK:STDOUT: %p.ref: %ptr.e71 = name_ref p, %p +// CHECK:STDOUT: %impl.elem0: %.96e = impl_witness_access constants.%Copy.impl_witness.771, element0 [concrete = constants.%ptr.as.Copy.impl.Op.cd0] +// CHECK:STDOUT: %bound_method.loc17_36.1: = bound_method %p.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @ptr.as.Copy.impl.Op(constants.%Class) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc17_36.2: = bound_method %p.ref, %specific_fn +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.e71 = call %bound_method.loc17_36.2(%p.ref) +// CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/adapt.carbon b/toolchain/check/testdata/class/generic/adapt.carbon index ae14d6beea26..4ba3f4ee09f2 100644 --- a/toolchain/check/testdata/class/generic/adapt.carbon +++ b/toolchain/check/testdata/class/generic/adapt.carbon @@ -130,26 +130,27 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: constants { // CHECK:STDOUT: %type: type = facet_type [concrete] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %C.type: type = generic_class_type @C [concrete] // CHECK:STDOUT: %C.generic: %C.type = struct_value () [concrete] -// CHECK:STDOUT: %C.f2e: type = class_type @C, @C(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %C.elem.66c: type = unbound_element_type %C.f2e, %T [symbolic] +// CHECK:STDOUT: %C.f2e: type = class_type @C, @C(%T.8b3) [symbolic] +// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T.8b3 [symbolic] +// CHECK:STDOUT: %C.elem.66c: type = unbound_element_type %C.f2e, %T.8b3 [symbolic] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness.299: = impl_witness @C.%Destroy.impl_witness_table, @C.as.Destroy.impl(%T) [symbolic] +// CHECK:STDOUT: %Destroy.impl_witness.299: = impl_witness @C.%Destroy.impl_witness_table, @C.as.Destroy.impl(%T.8b3) [symbolic] // CHECK:STDOUT: %ptr.7d2: type = ptr_type %C.f2e [symbolic] // CHECK:STDOUT: %pattern_type.1d2: type = pattern_type %ptr.7d2 [symbolic] -// CHECK:STDOUT: %C.as.Destroy.impl.Op.type: type = fn_type @C.as.Destroy.impl.Op, @C.as.Destroy.impl(%T) [symbolic] +// CHECK:STDOUT: %C.as.Destroy.impl.Op.type: type = fn_type @C.as.Destroy.impl.Op, @C.as.Destroy.impl(%T.8b3) [symbolic] // CHECK:STDOUT: %C.as.Destroy.impl.Op: %C.as.Destroy.impl.Op.type = struct_value () [symbolic] -// CHECK:STDOUT: %struct_type.x.2ac: type = struct_type {.x: %T} [symbolic] +// CHECK:STDOUT: %struct_type.x.2ac: type = struct_type {.x: %T.8b3} [symbolic] // CHECK:STDOUT: %complete_type.433: = complete_type_witness %struct_type.x.2ac [symbolic] // CHECK:STDOUT: %Adapter: type = class_type @Adapter [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %C.98a: type = class_type @C, @C(%i32) [concrete] // CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] @@ -166,17 +167,31 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %Access.type: type = fn_type @Access [concrete] // CHECK:STDOUT: %Access: %Access.type = struct_value () [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -191,7 +206,7 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.1 (constants.%T)] +// CHECK:STDOUT: %T.loc4_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.1 (constants.%T.8b3)] // CHECK:STDOUT: } // CHECK:STDOUT: %Adapter.decl: type = class_decl @Adapter [concrete = constants.%Adapter] {} {} // CHECK:STDOUT: %Access.decl: %Access.type = fn_decl @Access [concrete = constants.%Access] { @@ -211,7 +226,7 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @C.as.Destroy.impl(@C.%T.loc4_9.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] // CHECK:STDOUT: %C: type = class_type @C, @C(%T) [symbolic = %C (constants.%C.f2e)] // CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @C.%Destroy.impl_witness_table, @C.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.299)] // CHECK:STDOUT: @@ -227,7 +242,7 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: } { // CHECK:STDOUT: %self.param: @C.as.Destroy.impl.Op.%ptr (%ptr.7d2) = value_param call_param0 // CHECK:STDOUT: %.loc4_19.2: type = splice_block %Self.ref [symbolic = %C (constants.%C.f2e)] { -// CHECK:STDOUT: %.loc4_19.3: type = specific_constant constants.%C.f2e, @C(constants.%T) [symbolic = %C (constants.%C.f2e)] +// CHECK:STDOUT: %.loc4_19.3: type = specific_constant constants.%C.f2e, @C(constants.%T.8b3) [symbolic = %C (constants.%C.f2e)] // CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc4_19.3 [symbolic = %C (constants.%C.f2e)] // CHECK:STDOUT: } // CHECK:STDOUT: %self: @C.as.Destroy.impl.Op.%ptr (%ptr.7d2) = bind_name self, %self.param @@ -256,22 +271,22 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic class @C(%T.loc4_9.2: type) { -// CHECK:STDOUT: %T.loc4_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.1 (constants.%T)] +// CHECK:STDOUT: %T.loc4_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.1 (constants.%T.8b3)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_9.1 [symbolic = %require_complete (constants.%require_complete.4ae)] // CHECK:STDOUT: %C: type = class_type @C, @C(%T.loc4_9.1) [symbolic = %C (constants.%C.f2e)] // CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %T.loc4_9.1 [symbolic = %C.elem (constants.%C.elem.66c)] -// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: @C.%T.loc4_9.1 (%T)} [symbolic = %struct_type.x (constants.%struct_type.x.2ac)] +// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: @C.%T.loc4_9.1 (%T.8b3)} [symbolic = %struct_type.x (constants.%struct_type.x.2ac)] // CHECK:STDOUT: %complete_type.loc6_1.2: = complete_type_witness %struct_type.x [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.433)] // CHECK:STDOUT: // CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_9.2 [symbolic = %T.loc4_9.1 (constants.%T)] +// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_9.2 [symbolic = %T.loc4_9.1 (constants.%T.8b3)] // CHECK:STDOUT: %.loc5: @C.%C.elem (%C.elem.66c) = field_decl x, element0 [concrete] // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C.f2e [symbolic = @C.as.Destroy.impl.%C (constants.%C.f2e)] // CHECK:STDOUT: impl_decl @C.as.Destroy.impl [concrete] {} {} // CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@C.as.Destroy.impl.%C.as.Destroy.impl.Op.decl), @C.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @C.as.Destroy.impl(constants.%T) [symbolic = @C.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness.299)] +// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @C.as.Destroy.impl(constants.%T.8b3) [symbolic = @C.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness.299)] // CHECK:STDOUT: %complete_type.loc6_1.1: = complete_type_witness constants.%struct_type.x.2ac [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.433)] // CHECK:STDOUT: complete_type_witness = %complete_type.loc6_1.1 // CHECK:STDOUT: @@ -301,7 +316,7 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @C.as.Destroy.impl.Op(@C.%T.loc4_9.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] // CHECK:STDOUT: %C: type = class_type @C, @C(%T) [symbolic = %C (constants.%C.f2e)] // CHECK:STDOUT: %ptr: type = ptr_type %C [symbolic = %ptr (constants.%ptr.7d2)] // CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.1d2)] @@ -325,21 +340,26 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %x.ref: %C.elem.476 = name_ref x, @C.%.loc5 [concrete = @C.%.loc5] // CHECK:STDOUT: %.loc13_23.1: ref %i32 = class_element_access %.loc13_13.2, element0 // CHECK:STDOUT: %.loc13_23.2: %i32 = bind_value %.loc13_23.1 -// CHECK:STDOUT: return %.loc13_23.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc13_23.1: = bound_method %.loc13_23.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc13_23.2: = bound_method %.loc13_23.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc13_23.2(%.loc13_23.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%T) { -// CHECK:STDOUT: %T.loc4_9.1 => constants.%T +// CHECK:STDOUT: specific @C(constants.%T.8b3) { +// CHECK:STDOUT: %T.loc4_9.1 => constants.%T.8b3 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @C.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @C.as.Destroy.impl(constants.%T.8b3) { +// CHECK:STDOUT: %T => constants.%T.8b3 // CHECK:STDOUT: %C => constants.%C.f2e // CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness.299 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @C.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @C.as.Destroy.impl.Op(constants.%T.8b3) { +// CHECK:STDOUT: %T => constants.%T.8b3 // CHECK:STDOUT: %C => constants.%C.f2e // CHECK:STDOUT: %ptr => constants.%ptr.7d2 // CHECK:STDOUT: %pattern_type => constants.%pattern_type.1d2 @@ -363,18 +383,19 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %C.type: type = generic_class_type @C [concrete] // CHECK:STDOUT: %C.generic: %C.type = struct_value () [concrete] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %struct_type.x.2ac: type = struct_type {.x: %T} [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %struct_type.x.2ac: type = struct_type {.x: %T.8b3} [symbolic] // CHECK:STDOUT: %complete_type.433: = complete_type_witness %struct_type.x.2ac [symbolic] -// CHECK:STDOUT: %C.f2e: type = class_type @C, @C(%T) [symbolic] +// CHECK:STDOUT: %C.f2e: type = class_type @C, @C(%T.8b3) [symbolic] // CHECK:STDOUT: %C.239: type = class_type @C, @C(%i32) [concrete] // CHECK:STDOUT: %struct_type.x.767: type = struct_type {.x: %i32} [concrete] // CHECK:STDOUT: %complete_type.c07: = complete_type_witness %struct_type.x.767 [concrete] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %C.elem.66c: type = unbound_element_type %C.f2e, %T [symbolic] +// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T.8b3 [symbolic] +// CHECK:STDOUT: %C.elem.66c: type = unbound_element_type %C.f2e, %T.8b3 [symbolic] // CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] // CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %C.elem.ed6: type = unbound_element_type %C.239, %i32 [concrete] @@ -382,6 +403,16 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %pattern_type.501: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %ImportedAccess.type: type = fn_type @ImportedAccess [concrete] // CHECK:STDOUT: %ImportedAccess: %ImportedAccess.type = struct_value () [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.f3d: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6d8: %Int.as.Copy.impl.Op.type.f3d = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.13a: = impl_witness imports.%Copy.impl_witness_table.fef, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.17b: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.83b: %Int.as.Copy.impl.Op.type.17b = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.acf: %Copy.type = facet_value %i32, (%Copy.impl_witness.13a) [concrete] +// CHECK:STDOUT: %.1a7: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.acf [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.83b, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -390,10 +421,11 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %Main.Access = import_ref Main//adapt_specific_type, Access, unloaded // CHECK:STDOUT: %Core.ece: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.5ab: type = import_ref Main//adapt_specific_type, loc4_9, loaded [symbolic = @C.%T (constants.%T)] +// CHECK:STDOUT: %Main.import_ref.5ab: type = import_ref Main//adapt_specific_type, loc4_9, loaded [symbolic = @C.%T (constants.%T.8b3)] // CHECK:STDOUT: %Main.import_ref.b5f: = import_ref Main//adapt_specific_type, loc6_1, loaded [symbolic = @C.%complete_type (constants.%complete_type.433)] // CHECK:STDOUT: %Main.import_ref.4c0 = import_ref Main//adapt_specific_type, inst29 [no loc], unloaded // CHECK:STDOUT: %Main.import_ref.262: @C.%C.elem (%C.elem.66c) = import_ref Main//adapt_specific_type, loc5_8, loaded [concrete = %.22b] @@ -401,6 +433,9 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %Main.import_ref.feb = import_ref Main//adapt_specific_type, inst94 [no loc], unloaded // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %.22b: @C.%C.elem (%C.elem.66c) = field_decl x, element0 [concrete] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.526: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.f3d) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6d8)] +// CHECK:STDOUT: %Copy.impl_witness_table.fef = impl_witness_table (%Core.import_ref.526), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -437,13 +472,13 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic class @C(imports.%Main.import_ref.5ab: type) [from "adapt_specific_type.carbon"] { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %T [symbolic = %require_complete (constants.%require_complete.4ae)] // CHECK:STDOUT: %C: type = class_type @C, @C(%T) [symbolic = %C (constants.%C.f2e)] // CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %T [symbolic = %C.elem (constants.%C.elem.66c)] -// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: @C.%T (%T)} [symbolic = %struct_type.x (constants.%struct_type.x.2ac)] +// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: @C.%T (%T.8b3)} [symbolic = %struct_type.x (constants.%struct_type.x.2ac)] // CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.x [symbolic = %complete_type (constants.%complete_type.433)] // CHECK:STDOUT: // CHECK:STDOUT: class { @@ -467,11 +502,16 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %x.ref: %C.elem.ed6 = name_ref x, imports.%Main.import_ref.262 [concrete = imports.%.22b] // CHECK:STDOUT: %.loc7_23.1: ref %i32 = class_element_access %.loc7_13.2, element0 // CHECK:STDOUT: %.loc7_23.2: %i32 = bind_value %.loc7_23.1 -// CHECK:STDOUT: return %.loc7_23.2 +// CHECK:STDOUT: %impl.elem0: %.1a7 = impl_witness_access constants.%Copy.impl_witness.13a, element0 [concrete = constants.%Int.as.Copy.impl.Op.83b] +// CHECK:STDOUT: %bound_method.loc7_23.1: = bound_method %.loc7_23.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc7_23.2: = bound_method %.loc7_23.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc7_23.2(%.loc7_23.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @C(constants.%T.8b3) { +// CHECK:STDOUT: %T => constants.%T.8b3 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%i32) { @@ -685,7 +725,7 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %x.ref: %C.elem.476 = name_ref x, @C.%.loc5 [concrete = @C.%.loc5] // CHECK:STDOUT: %.loc21_11.1: %C.98a = converted %a.ref, [concrete = ] // CHECK:STDOUT: %.loc21_11.2: %i32 = class_element_access , element0 [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%T) { @@ -1022,7 +1062,7 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %x.ref: %C.elem.ed6 = name_ref x, imports.%Main.import_ref.262 [concrete = imports.%.22b] // CHECK:STDOUT: %.loc15_11.1: %C.239 = converted %a.ref, [concrete = ] // CHECK:STDOUT: %.loc15_11.2: %i32 = class_element_access , element0 [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%T) { @@ -1045,23 +1085,24 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: constants { // CHECK:STDOUT: %type: type = facet_type [concrete] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %Adapter.type: type = generic_class_type @Adapter [concrete] // CHECK:STDOUT: %Adapter.generic: %Adapter.type = struct_value () [concrete] -// CHECK:STDOUT: %Adapter.0e3: type = class_type @Adapter, @Adapter(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] +// CHECK:STDOUT: %Adapter.0e3: type = class_type @Adapter, @Adapter(%T.8b3) [symbolic] +// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T.8b3 [symbolic] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Adapter.%Destroy.impl_witness_table, @Adapter.as.Destroy.impl(%T) [symbolic] +// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Adapter.%Destroy.impl_witness_table, @Adapter.as.Destroy.impl(%T.8b3) [symbolic] // CHECK:STDOUT: %ptr.36c: type = ptr_type %Adapter.0e3 [symbolic] // CHECK:STDOUT: %pattern_type.aa7: type = pattern_type %ptr.36c [symbolic] -// CHECK:STDOUT: %Adapter.as.Destroy.impl.Op.type: type = fn_type @Adapter.as.Destroy.impl.Op, @Adapter.as.Destroy.impl(%T) [symbolic] +// CHECK:STDOUT: %Adapter.as.Destroy.impl.Op.type: type = fn_type @Adapter.as.Destroy.impl.Op, @Adapter.as.Destroy.impl(%T.8b3) [symbolic] // CHECK:STDOUT: %Adapter.as.Destroy.impl.Op: %Adapter.as.Destroy.impl.Op.type = struct_value () [symbolic] -// CHECK:STDOUT: %complete_type.f87: = complete_type_witness %T [symbolic] +// CHECK:STDOUT: %complete_type.f87: = complete_type_witness %T.8b3 [symbolic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Adapter.e4c: type = class_type @Adapter, @Adapter(%i32) [concrete] // CHECK:STDOUT: %pattern_type.5a0: type = pattern_type %Adapter.e4c [concrete] @@ -1071,17 +1112,31 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] // CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %complete_type.1eb: = complete_type_witness %i32 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -1095,7 +1150,7 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.1 (constants.%T)] +// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.1 (constants.%T.8b3)] // CHECK:STDOUT: } // CHECK:STDOUT: %Convert.decl: %Convert.type = fn_decl @Convert [concrete = constants.%Convert] { // CHECK:STDOUT: %a.patt: %pattern_type.5a0 = binding_pattern a [concrete] @@ -1119,7 +1174,7 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @Adapter.as.Destroy.impl(@Adapter.%T.loc4_15.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] // CHECK:STDOUT: %Adapter: type = class_type @Adapter, @Adapter(%T) [symbolic = %Adapter (constants.%Adapter.0e3)] // CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Adapter.%Destroy.impl_witness_table, @Adapter.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness)] // CHECK:STDOUT: @@ -1135,7 +1190,7 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: } { // CHECK:STDOUT: %self.param: @Adapter.as.Destroy.impl.Op.%ptr (%ptr.36c) = value_param call_param0 // CHECK:STDOUT: %.loc4_25.2: type = splice_block %Self.ref [symbolic = %Adapter (constants.%Adapter.0e3)] { -// CHECK:STDOUT: %.loc4_25.3: type = specific_constant constants.%Adapter.0e3, @Adapter(constants.%T) [symbolic = %Adapter (constants.%Adapter.0e3)] +// CHECK:STDOUT: %.loc4_25.3: type = specific_constant constants.%Adapter.0e3, @Adapter(constants.%T.8b3) [symbolic = %Adapter (constants.%Adapter.0e3)] // CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc4_25.3 [symbolic = %Adapter (constants.%Adapter.0e3)] // CHECK:STDOUT: } // CHECK:STDOUT: %self: @Adapter.as.Destroy.impl.Op.%ptr (%ptr.36c) = bind_name self, %self.param @@ -1148,20 +1203,20 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic class @Adapter(%T.loc4_15.2: type) { -// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.1 (constants.%T)] +// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.1 (constants.%T.8b3)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_15.1 [symbolic = %require_complete (constants.%require_complete.4ae)] // CHECK:STDOUT: %complete_type.loc6_1.2: = complete_type_witness %T.loc4_15.1 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.f87)] // CHECK:STDOUT: // CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_15.2 [symbolic = %T.loc4_15.1 (constants.%T)] +// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_15.2 [symbolic = %T.loc4_15.1 (constants.%T.8b3)] // CHECK:STDOUT: adapt_decl %T.ref [concrete] // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Adapter.0e3 [symbolic = @Adapter.as.Destroy.impl.%Adapter (constants.%Adapter.0e3)] // CHECK:STDOUT: impl_decl @Adapter.as.Destroy.impl [concrete] {} {} // CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Adapter.as.Destroy.impl.%Adapter.as.Destroy.impl.Op.decl), @Adapter.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Adapter.as.Destroy.impl(constants.%T) [symbolic = @Adapter.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness)] -// CHECK:STDOUT: %complete_type.loc6_1.1: = complete_type_witness constants.%T [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.f87)] +// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Adapter.as.Destroy.impl(constants.%T.8b3) [symbolic = @Adapter.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness)] +// CHECK:STDOUT: %complete_type.loc6_1.1: = complete_type_witness constants.%T.8b3 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.f87)] // CHECK:STDOUT: complete_type_witness = %complete_type.loc6_1.1 // CHECK:STDOUT: // CHECK:STDOUT: !members: @@ -1171,7 +1226,7 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Adapter.as.Destroy.impl.Op(@Adapter.%T.loc4_15.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] // CHECK:STDOUT: %Adapter: type = class_type @Adapter, @Adapter(%T) [symbolic = %Adapter (constants.%Adapter.0e3)] // CHECK:STDOUT: %ptr: type = ptr_type %Adapter [symbolic = %ptr (constants.%ptr.36c)] // CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.aa7)] @@ -1188,21 +1243,26 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %i32.loc9: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %.loc9_12.1: %i32 = as_compatible %a.ref // CHECK:STDOUT: %.loc9_12.2: %i32 = converted %a.ref, %.loc9_12.1 -// CHECK:STDOUT: return %.loc9_12.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc9_12.1: = bound_method %.loc9_12.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc9_12.2: = bound_method %.loc9_12.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc9_12.2(%.loc9_12.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Adapter(constants.%T) { -// CHECK:STDOUT: %T.loc4_15.1 => constants.%T +// CHECK:STDOUT: specific @Adapter(constants.%T.8b3) { +// CHECK:STDOUT: %T.loc4_15.1 => constants.%T.8b3 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Adapter.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @Adapter.as.Destroy.impl(constants.%T.8b3) { +// CHECK:STDOUT: %T => constants.%T.8b3 // CHECK:STDOUT: %Adapter => constants.%Adapter.0e3 // CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Adapter.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @Adapter.as.Destroy.impl.Op(constants.%T.8b3) { +// CHECK:STDOUT: %T => constants.%T.8b3 // CHECK:STDOUT: %Adapter => constants.%Adapter.0e3 // CHECK:STDOUT: %ptr => constants.%ptr.36c // CHECK:STDOUT: %pattern_type => constants.%pattern_type.aa7 @@ -1221,12 +1281,13 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: constants { // CHECK:STDOUT: %Adapter.type: type = generic_class_type @Adapter [concrete] // CHECK:STDOUT: %Adapter.generic: %Adapter.type = struct_value () [concrete] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %complete_type.f87: = complete_type_witness %T [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %complete_type.f87: = complete_type_witness %T.8b3 [symbolic] +// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T.8b3 [symbolic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Adapter.e4c: type = class_type @Adapter, @Adapter(%i32) [concrete] // CHECK:STDOUT: %pattern_type.5a0: type = pattern_type %Adapter.e4c [concrete] @@ -1236,6 +1297,16 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] // CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %complete_type.1eb: = complete_type_witness %i32 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %C: type = class_type @C [concrete] // CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %i32 [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] @@ -1259,14 +1330,18 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %Main.Convert = import_ref Main//adapt_generic_type, Convert, unloaded // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.5ab: type = import_ref Main//adapt_generic_type, loc4_15, loaded [symbolic = @Adapter.%T (constants.%T)] +// CHECK:STDOUT: %Main.import_ref.5ab: type = import_ref Main//adapt_generic_type, loc4_15, loaded [symbolic = @Adapter.%T (constants.%T.8b3)] // CHECK:STDOUT: %Main.import_ref.fb3: = import_ref Main//adapt_generic_type, loc6_1, loaded [symbolic = @Adapter.%complete_type (constants.%complete_type.f87)] // CHECK:STDOUT: %Main.import_ref.9a3 = import_ref Main//adapt_generic_type, inst29 [no loc], unloaded // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1338,7 +1413,7 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic class @Adapter(imports.%Main.import_ref.5ab: type) [from "adapt_generic_type.carbon"] { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %T [symbolic = %require_complete (constants.%require_complete.4ae)] @@ -1375,7 +1450,12 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %i32.loc7: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %.loc7_12.1: %i32 = as_compatible %a.ref // CHECK:STDOUT: %.loc7_12.2: %i32 = converted %a.ref, %.loc7_12.1 -// CHECK:STDOUT: return %.loc7_12.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc7_12.1: = bound_method %.loc7_12.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc7_12.2: = bound_method %.loc7_12.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc7_12.2(%.loc7_12.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.Destroy.impl.Op(%self.param: %ptr.019) = "no_op"; @@ -1389,11 +1469,16 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %n.ref: %C.elem = name_ref n, @C.%.loc11 [concrete = @C.%.loc11] // CHECK:STDOUT: %.loc15_18.1: ref %i32 = class_element_access %.loc15_13.2, element0 // CHECK:STDOUT: %.loc15_18.2: %i32 = bind_value %.loc15_18.1 -// CHECK:STDOUT: return %.loc15_18.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc15_18.1: = bound_method %.loc15_18.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc15_18.2: = bound_method %.loc15_18.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc15_18.2(%.loc15_18.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Adapter(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @Adapter(constants.%T.8b3) { +// CHECK:STDOUT: %T => constants.%T.8b3 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Adapter(constants.%i32) { diff --git a/toolchain/check/testdata/class/generic/base_is_generic.carbon b/toolchain/check/testdata/class/generic/base_is_generic.carbon index 2d0b026337ff..b0508f9b7d26 100644 --- a/toolchain/check/testdata/class/generic/base_is_generic.carbon +++ b/toolchain/check/testdata/class/generic/base_is_generic.carbon @@ -94,26 +94,27 @@ fn H() { // CHECK:STDOUT: constants { // CHECK:STDOUT: %type: type = facet_type [concrete] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %Base.type: type = generic_class_type @Base [concrete] // CHECK:STDOUT: %Base.generic: %Base.type = struct_value () [concrete] -// CHECK:STDOUT: %Base.370: type = class_type @Base, @Base(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %Base.elem.9af: type = unbound_element_type %Base.370, %T [symbolic] +// CHECK:STDOUT: %Base.370: type = class_type @Base, @Base(%T.8b3) [symbolic] +// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T.8b3 [symbolic] +// CHECK:STDOUT: %Base.elem.9af: type = unbound_element_type %Base.370, %T.8b3 [symbolic] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness.ef5: = impl_witness @Base.%Destroy.impl_witness_table, @Base.as.Destroy.impl(%T) [symbolic] +// CHECK:STDOUT: %Destroy.impl_witness.ef5: = impl_witness @Base.%Destroy.impl_witness_table, @Base.as.Destroy.impl(%T.8b3) [symbolic] // CHECK:STDOUT: %ptr.b7c: type = ptr_type %Base.370 [symbolic] // CHECK:STDOUT: %pattern_type.8d4: type = pattern_type %ptr.b7c [symbolic] -// CHECK:STDOUT: %Base.as.Destroy.impl.Op.type: type = fn_type @Base.as.Destroy.impl.Op, @Base.as.Destroy.impl(%T) [symbolic] +// CHECK:STDOUT: %Base.as.Destroy.impl.Op.type: type = fn_type @Base.as.Destroy.impl.Op, @Base.as.Destroy.impl(%T.8b3) [symbolic] // CHECK:STDOUT: %Base.as.Destroy.impl.Op: %Base.as.Destroy.impl.Op.type = struct_value () [symbolic] -// CHECK:STDOUT: %struct_type.x.2ac: type = struct_type {.x: %T} [symbolic] +// CHECK:STDOUT: %struct_type.x.2ac: type = struct_type {.x: %T.8b3} [symbolic] // CHECK:STDOUT: %complete_type.433: = complete_type_witness %struct_type.x.2ac [symbolic] // CHECK:STDOUT: %Param: type = class_type @Param [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Param.elem: type = unbound_element_type %Param, %i32 [concrete] // CHECK:STDOUT: %Destroy.impl_witness.11e: = impl_witness @Param.%Destroy.impl_witness_table [concrete] @@ -140,17 +141,31 @@ fn H() { // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %DoubleFieldAccess.type: type = fn_type @DoubleFieldAccess [concrete] // CHECK:STDOUT: %DoubleFieldAccess: %DoubleFieldAccess.type = struct_value () [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -166,7 +181,7 @@ fn H() { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_17.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_17.1 (constants.%T)] +// CHECK:STDOUT: %T.loc4_17.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_17.1 (constants.%T.8b3)] // CHECK:STDOUT: } // CHECK:STDOUT: %Param.decl: type = class_decl @Param [concrete = constants.%Param] {} {} // CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} @@ -187,7 +202,7 @@ fn H() { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @Base.as.Destroy.impl(@Base.%T.loc4_17.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] // CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T) [symbolic = %Base (constants.%Base.370)] // CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Base.%Destroy.impl_witness_table, @Base.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.ef5)] // CHECK:STDOUT: @@ -203,7 +218,7 @@ fn H() { // CHECK:STDOUT: } { // CHECK:STDOUT: %self.param: @Base.as.Destroy.impl.Op.%ptr (%ptr.b7c) = value_param call_param0 // CHECK:STDOUT: %.loc4_27.2: type = splice_block %Self.ref [symbolic = %Base (constants.%Base.370)] { -// CHECK:STDOUT: %.loc4_27.3: type = specific_constant constants.%Base.370, @Base(constants.%T) [symbolic = %Base (constants.%Base.370)] +// CHECK:STDOUT: %.loc4_27.3: type = specific_constant constants.%Base.370, @Base(constants.%T.8b3) [symbolic = %Base (constants.%Base.370)] // CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc4_27.3 [symbolic = %Base (constants.%Base.370)] // CHECK:STDOUT: } // CHECK:STDOUT: %self: @Base.as.Destroy.impl.Op.%ptr (%ptr.b7c) = bind_name self, %self.param @@ -248,22 +263,22 @@ fn H() { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic class @Base(%T.loc4_17.2: type) { -// CHECK:STDOUT: %T.loc4_17.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_17.1 (constants.%T)] +// CHECK:STDOUT: %T.loc4_17.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_17.1 (constants.%T.8b3)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_17.1 [symbolic = %require_complete (constants.%require_complete.4ae)] // CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T.loc4_17.1) [symbolic = %Base (constants.%Base.370)] // CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %T.loc4_17.1 [symbolic = %Base.elem (constants.%Base.elem.9af)] -// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: @Base.%T.loc4_17.1 (%T)} [symbolic = %struct_type.x (constants.%struct_type.x.2ac)] +// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: @Base.%T.loc4_17.1 (%T.8b3)} [symbolic = %struct_type.x (constants.%struct_type.x.2ac)] // CHECK:STDOUT: %complete_type.loc6_1.2: = complete_type_witness %struct_type.x [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.433)] // CHECK:STDOUT: // CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_17.2 [symbolic = %T.loc4_17.1 (constants.%T)] +// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_17.2 [symbolic = %T.loc4_17.1 (constants.%T.8b3)] // CHECK:STDOUT: %.loc5: @Base.%Base.elem (%Base.elem.9af) = field_decl x, element0 [concrete] // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Base.370 [symbolic = @Base.as.Destroy.impl.%Base (constants.%Base.370)] // CHECK:STDOUT: impl_decl @Base.as.Destroy.impl [concrete] {} {} // CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Base.as.Destroy.impl.%Base.as.Destroy.impl.Op.decl), @Base.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Base.as.Destroy.impl(constants.%T) [symbolic = @Base.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness.ef5)] +// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Base.as.Destroy.impl(constants.%T.8b3) [symbolic = @Base.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness.ef5)] // CHECK:STDOUT: %complete_type.loc6_1.1: = complete_type_witness constants.%struct_type.x.2ac [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.433)] // CHECK:STDOUT: complete_type_witness = %complete_type.loc6_1.1 // CHECK:STDOUT: @@ -312,7 +327,7 @@ fn H() { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Base.as.Destroy.impl.Op(@Base.%T.loc4_17.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] // CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T) [symbolic = %Base (constants.%Base.370)] // CHECK:STDOUT: %ptr: type = ptr_type %Base [symbolic = %ptr (constants.%ptr.b7c)] // CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.8d4)] @@ -336,21 +351,26 @@ fn H() { // CHECK:STDOUT: %y.ref: %Param.elem = name_ref y, @Param.%.loc9 [concrete = @Param.%.loc9] // CHECK:STDOUT: %.loc17_13.1: ref %i32 = class_element_access %.loc17_11.3, element0 // CHECK:STDOUT: %.loc17_13.2: %i32 = bind_value %.loc17_13.1 -// CHECK:STDOUT: return %.loc17_13.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc17_13.1: = bound_method %.loc17_13.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc17_13.2: = bound_method %.loc17_13.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc17_13.2(%.loc17_13.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Base(constants.%T) { -// CHECK:STDOUT: %T.loc4_17.1 => constants.%T +// CHECK:STDOUT: specific @Base(constants.%T.8b3) { +// CHECK:STDOUT: %T.loc4_17.1 => constants.%T.8b3 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Base.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @Base.as.Destroy.impl(constants.%T.8b3) { +// CHECK:STDOUT: %T => constants.%T.8b3 // CHECK:STDOUT: %Base => constants.%Base.370 // CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness.ef5 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Base.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @Base.as.Destroy.impl.Op(constants.%T.8b3) { +// CHECK:STDOUT: %T => constants.%T.8b3 // CHECK:STDOUT: %Base => constants.%Base.370 // CHECK:STDOUT: %ptr => constants.%ptr.b7c // CHECK:STDOUT: %pattern_type => constants.%pattern_type.8d4 @@ -375,18 +395,19 @@ fn H() { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %struct_type.y: type = struct_type {.y: %i32} [concrete] // CHECK:STDOUT: %complete_type.09d: = complete_type_witness %struct_type.y [concrete] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %struct_type.x.2ac: type = struct_type {.x: %T} [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %struct_type.x.2ac: type = struct_type {.x: %T.8b3} [symbolic] // CHECK:STDOUT: %complete_type.433: = complete_type_witness %struct_type.x.2ac [symbolic] -// CHECK:STDOUT: %Base.370: type = class_type @Base, @Base(%T) [symbolic] +// CHECK:STDOUT: %Base.370: type = class_type @Base, @Base(%T.8b3) [symbolic] // CHECK:STDOUT: %Base.7a8: type = class_type @Base, @Base(%Param) [concrete] // CHECK:STDOUT: %struct_type.base.8bc: type = struct_type {.base: %Base.7a8} [concrete] // CHECK:STDOUT: %complete_type.b07: = complete_type_witness %struct_type.base.8bc [concrete] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %Base.elem.9af: type = unbound_element_type %Base.370, %T [symbolic] +// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T.8b3 [symbolic] +// CHECK:STDOUT: %Base.elem.9af: type = unbound_element_type %Base.370, %T.8b3 [symbolic] // CHECK:STDOUT: %Base.elem.d1f: type = unbound_element_type %Base.7a8, %Param [concrete] // CHECK:STDOUT: %struct_type.x.975: type = struct_type {.x: %Param} [concrete] // CHECK:STDOUT: %complete_type.db3: = complete_type_witness %struct_type.x.975 [concrete] @@ -395,6 +416,16 @@ fn H() { // CHECK:STDOUT: %ImportedDoubleFieldAccess.type: type = fn_type @ImportedDoubleFieldAccess [concrete] // CHECK:STDOUT: %ImportedDoubleFieldAccess: %ImportedDoubleFieldAccess.type = struct_value () [concrete] // CHECK:STDOUT: %Param.elem: type = unbound_element_type %Param, %i32 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.f3d: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6d8: %Int.as.Copy.impl.Op.type.f3d = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.13a: = impl_witness imports.%Copy.impl_witness_table.fef, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.17b: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.83b: %Int.as.Copy.impl.Op.type.17b = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.acf: %Copy.type = facet_value %i32, (%Copy.impl_witness.13a) [concrete] +// CHECK:STDOUT: %.1a7: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.acf [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.83b, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -404,13 +435,14 @@ fn H() { // CHECK:STDOUT: %Main.DoubleFieldAccess = import_ref Main//extend_generic_base, DoubleFieldAccess, unloaded // CHECK:STDOUT: %Core.ece: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Main.import_ref.e8d: = import_ref Main//extend_generic_base, loc10_1, loaded [concrete = constants.%complete_type.09d] // CHECK:STDOUT: %Main.import_ref.446 = import_ref Main//extend_generic_base, inst94 [no loc], unloaded // CHECK:STDOUT: %Main.import_ref.a92: %Param.elem = import_ref Main//extend_generic_base, loc9_8, loaded [concrete = %.be7] -// CHECK:STDOUT: %Main.import_ref.5ab: type = import_ref Main//extend_generic_base, loc4_17, loaded [symbolic = @Base.%T (constants.%T)] +// CHECK:STDOUT: %Main.import_ref.5ab: type = import_ref Main//extend_generic_base, loc4_17, loaded [symbolic = @Base.%T (constants.%T.8b3)] // CHECK:STDOUT: %Main.import_ref.b5f: = import_ref Main//extend_generic_base, loc6_1, loaded [symbolic = @Base.%complete_type (constants.%complete_type.433)] // CHECK:STDOUT: %Main.import_ref.8e0 = import_ref Main//extend_generic_base, inst29 [no loc], unloaded // CHECK:STDOUT: %Main.import_ref.7f7: @Base.%Base.elem (%Base.elem.9af) = import_ref Main//extend_generic_base, loc5_8, loaded [concrete = %.e66] @@ -421,6 +453,9 @@ fn H() { // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %.e66: @Base.%Base.elem (%Base.elem.9af) = field_decl x, element0 [concrete] // CHECK:STDOUT: %.be7: %Param.elem = field_decl y, element0 [concrete] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.526: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.f3d) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6d8)] +// CHECK:STDOUT: %Copy.impl_witness_table.fef = impl_witness_table (%Core.import_ref.526), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -469,13 +504,13 @@ fn H() { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic class @Base(imports.%Main.import_ref.5ab: type) [from "extend_generic_base.carbon"] { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %T [symbolic = %require_complete (constants.%require_complete.4ae)] // CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T) [symbolic = %Base (constants.%Base.370)] // CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %T [symbolic = %Base.elem (constants.%Base.elem.9af)] -// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: @Base.%T (%T)} [symbolic = %struct_type.x (constants.%struct_type.x.2ac)] +// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: @Base.%T (%T.8b3)} [symbolic = %struct_type.x (constants.%struct_type.x.2ac)] // CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.x [symbolic = %complete_type (constants.%complete_type.433)] // CHECK:STDOUT: // CHECK:STDOUT: class { @@ -497,11 +532,16 @@ fn H() { // CHECK:STDOUT: %y.ref: %Param.elem = name_ref y, imports.%Main.import_ref.a92 [concrete = imports.%.be7] // CHECK:STDOUT: %.loc7_13.1: ref %i32 = class_element_access %.loc7_11.3, element0 // CHECK:STDOUT: %.loc7_13.2: %i32 = bind_value %.loc7_13.1 -// CHECK:STDOUT: return %.loc7_13.2 +// CHECK:STDOUT: %impl.elem0: %.1a7 = impl_witness_access constants.%Copy.impl_witness.13a, element0 [concrete = constants.%Int.as.Copy.impl.Op.83b] +// CHECK:STDOUT: %bound_method.loc7_13.1: = bound_method %.loc7_13.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc7_13.2: = bound_method %.loc7_13.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc7_13.2(%.loc7_13.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Base(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @Base(constants.%T.8b3) { +// CHECK:STDOUT: %T => constants.%T.8b3 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Base(constants.%Param) { @@ -936,13 +976,11 @@ fn H() { // CHECK:STDOUT: // CHECK:STDOUT: fn() -> @X.G.%U (%U) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc5_24: @X.G.%X.G.type (%X.G.type.56f312.1) = specific_constant @X.%X.G.decl, @X(constants.%U) [symbolic = %X.G (constants.%X.G.b504c4.1)] -// CHECK:STDOUT: %G.ref: @X.G.%X.G.type (%X.G.type.56f312.1) = name_ref G, %.loc5_24 [symbolic = %X.G (constants.%X.G.b504c4.1)] +// CHECK:STDOUT: %.loc5: @X.G.%X.G.type (%X.G.type.56f312.1) = specific_constant @X.%X.G.decl, @X(constants.%U) [symbolic = %X.G (constants.%X.G.b504c4.1)] +// CHECK:STDOUT: %G.ref: @X.G.%X.G.type (%X.G.type.56f312.1) = name_ref G, %.loc5 [symbolic = %X.G (constants.%X.G.b504c4.1)] // CHECK:STDOUT: %X.G.specific_fn.loc5_24.1: = specific_function %G.ref, @X.G(constants.%U) [symbolic = %X.G.specific_fn.loc5_24.2 (constants.%X.G.specific_fn.169)] // CHECK:STDOUT: %X.G.call: init @X.G.%U (%U) = call %X.G.specific_fn.loc5_24.1() -// CHECK:STDOUT: %.loc5_27.1: @X.G.%U (%U) = value_of_initializer %X.G.call -// CHECK:STDOUT: %.loc5_27.2: @X.G.%U (%U) = converted %X.G.call, %.loc5_27.1 -// CHECK:STDOUT: return %.loc5_27.2 +// CHECK:STDOUT: return %X.G.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1136,7 +1174,7 @@ fn H() { // CHECK:STDOUT: %Main.import_ref.b8a: @X.%X.G.type (%X.G.type.56f312.1) = import_ref Main//extend_generic_symbolic_base, loc5_15, loaded [symbolic = @X.%X.G (constants.%X.G.b504c4.1)] // CHECK:STDOUT: %Main.import_ref.5ab3ec.2: type = import_ref Main//extend_generic_symbolic_base, loc8_9, loaded [symbolic = @C.%T (constants.%T)] // CHECK:STDOUT: %Main.import_ref.93f: = import_ref Main//extend_generic_symbolic_base, loc10_1, loaded [symbolic = @C.%complete_type (constants.%complete_type.768)] -// CHECK:STDOUT: %Main.import_ref.4c0 = import_ref Main//extend_generic_symbolic_base, inst119 [no loc], unloaded +// CHECK:STDOUT: %Main.import_ref.4c0 = import_ref Main//extend_generic_symbolic_base, inst117 [no loc], unloaded // CHECK:STDOUT: %Main.import_ref.65d = import_ref Main//extend_generic_symbolic_base, loc9_20, unloaded // CHECK:STDOUT: %Main.import_ref.561eb2.2: type = import_ref Main//extend_generic_symbolic_base, loc9_19, loaded [symbolic = @C.%X (constants.%X.75b6d8.2)] // CHECK:STDOUT: %Main.import_ref.5ab3ec.3: type = import_ref Main//extend_generic_symbolic_base, loc4_14, loaded [symbolic = @X.%U (constants.%U)] diff --git a/toolchain/check/testdata/class/generic/basic.carbon b/toolchain/check/testdata/class/generic/basic.carbon index 60b75226bec6..23ae44956496 100644 --- a/toolchain/check/testdata/class/generic/basic.carbon +++ b/toolchain/check/testdata/class/generic/basic.carbon @@ -3,8 +3,6 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // // INCLUDE-FILE: toolchain/testing/testdata/min_prelude/convert.carbon -// TODO: Add ranges and switch to "--dump-sem-ir-ranges=only". -// EXTRA-ARGS: --dump-sem-ir-ranges=if-present // // AUTOUPDATE // TIP: To test this file alone, run: @@ -12,12 +10,16 @@ // TIP: To dump output, run: // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/generic/basic.carbon -class Class(T:! type) { +// --- basic.carbon + +library "[[@TEST_NAME]]"; + +//@dump-sem-ir-begin +class Class(T:! Core.Copy) { fn GetAddr[addr self: Self*]() -> T* { return &self->k; } - // TODO: Should this work? T is not necessarily copyable. fn GetValue[self: Self]() -> T { return self.k; } @@ -26,75 +28,89 @@ class Class(T:! type) { } class Declaration(T:! type); +//@dump-sem-ir-end // CHECK:STDOUT: --- basic.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %T.578: %Copy.type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %pattern_type.ce2: type = pattern_type %Copy.type [concrete] // CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] // CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic] -// CHECK:STDOUT: %ptr.955: type = ptr_type %Class [symbolic] -// CHECK:STDOUT: %pattern_type.9e0: type = pattern_type %ptr.955 [symbolic] +// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.578) [symbolic] +// CHECK:STDOUT: %ptr.0b3: type = ptr_type %Class [symbolic] +// CHECK:STDOUT: %pattern_type.417: type = pattern_type %ptr.0b3 [symbolic] // CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %ptr.79f: type = ptr_type %T [symbolic] -// CHECK:STDOUT: %pattern_type.afe: type = pattern_type %ptr.79f [symbolic] -// CHECK:STDOUT: %Class.GetAddr.type: type = fn_type @Class.GetAddr, @Class(%T) [symbolic] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T.578 [symbolic] +// CHECK:STDOUT: %ptr.a75: type = ptr_type %T.as_type [symbolic] +// CHECK:STDOUT: %pattern_type.b45: type = pattern_type %ptr.a75 [symbolic] +// CHECK:STDOUT: %Class.GetAddr.type: type = fn_type @Class.GetAddr, @Class(%T.578) [symbolic] // CHECK:STDOUT: %Class.GetAddr: %Class.GetAddr.type = struct_value () [symbolic] -// CHECK:STDOUT: %pattern_type.3c1: type = pattern_type %Class [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %Class.GetValue.type: type = fn_type @Class.GetValue, @Class(%T) [symbolic] +// CHECK:STDOUT: %pattern_type.47a: type = pattern_type %Class [symbolic] +// CHECK:STDOUT: %pattern_type.f8cebc.1: type = pattern_type %T.as_type [symbolic] +// CHECK:STDOUT: %Class.GetValue.type: type = fn_type @Class.GetValue, @Class(%T.578) [symbolic] // CHECK:STDOUT: %Class.GetValue: %Class.GetValue.type = struct_value () [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic] +// CHECK:STDOUT: %require_complete.ecc: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.as_type [symbolic] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.type: type = fn_type @Class.as.Destroy.impl.Op, @Class.as.Destroy.impl(%T) [symbolic] +// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T.578) [symbolic] +// CHECK:STDOUT: %Class.as.Destroy.impl.Op.type: type = fn_type @Class.as.Destroy.impl.Op, @Class.as.Destroy.impl(%T.578) [symbolic] // CHECK:STDOUT: %Class.as.Destroy.impl.Op: %Class.as.Destroy.impl.Op.type = struct_value () [symbolic] -// CHECK:STDOUT: %struct_type.k: type = struct_type {.k: %T} [symbolic] +// CHECK:STDOUT: %struct_type.k: type = struct_type {.k: %T.as_type} [symbolic] // CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.k [symbolic] -// CHECK:STDOUT: %require_complete.6e5: = require_complete_type %ptr.79f [symbolic] -// CHECK:STDOUT: %require_complete.2ae: = require_complete_type %ptr.955 [symbolic] -// CHECK:STDOUT: %require_complete.4f8: = require_complete_type %Class [symbolic] +// CHECK:STDOUT: %require_complete.999: = require_complete_type %ptr.a75 [symbolic] +// CHECK:STDOUT: %require_complete.27d: = require_complete_type %ptr.0b3 [symbolic] +// CHECK:STDOUT: %require_complete.ef5: = require_complete_type %Class [symbolic] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.lookup_impl_witness.3ba: = lookup_impl_witness %T.578, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.72e: %Copy.type = facet_value %T.as_type, (%Copy.lookup_impl_witness.3ba) [symbolic] +// CHECK:STDOUT: %.671: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.72e [symbolic] +// CHECK:STDOUT: %impl.elem0.56e: %.671 = impl_witness_access %Copy.lookup_impl_witness.3ba, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.fb7: = specific_impl_function %impl.elem0.56e, @Copy.Op(%Copy.facet.72e) [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] +// CHECK:STDOUT: %Copy.lookup_impl_witness.23e: = lookup_impl_witness %ptr.a75, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.d7e: %Copy.type = facet_value %ptr.a75, (%Copy.lookup_impl_witness.23e) [symbolic] +// CHECK:STDOUT: %.30e: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.d7e [symbolic] +// CHECK:STDOUT: %impl.elem0.cb9: %.30e = impl_witness_access %Copy.lookup_impl_witness.23e, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.e97: = specific_impl_function %impl.elem0.cb9, @Copy.Op(%Copy.facet.d7e) [symbolic] // CHECK:STDOUT: %Declaration.type: type = generic_class_type @Declaration [concrete] // CHECK:STDOUT: %Declaration.generic: %Declaration.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .Declaration = %Declaration.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core // CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type.ce2 = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc15_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc15_13.1 (constants.%T)] +// CHECK:STDOUT: %.loc5: type = splice_block %Copy.ref [concrete = constants.%Copy.type] { +// CHECK:STDOUT: +// CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core [concrete = imports.%Core] +// CHECK:STDOUT: %Copy.ref: type = name_ref Copy, imports.%Core.Copy [concrete = constants.%Copy.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc5_13.2: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc5_13.1 (constants.%T.578)] // CHECK:STDOUT: } // CHECK:STDOUT: %Declaration.decl: %Declaration.type = class_decl @Declaration [concrete = constants.%Declaration.generic] { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc28_19.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc28_19.1 (constants.%T)] +// CHECK:STDOUT: +// CHECK:STDOUT: %T.loc17_19.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc17_19.1 (constants.%T.8b3)] // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic impl @Class.as.Destroy.impl(@Class.%T.loc15_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: generic impl @Class.as.Destroy.impl(@Class.%T.loc5_13.2: %Copy.type) { +// CHECK:STDOUT: %T: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.578)] // CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class)] // CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness)] // CHECK:STDOUT: @@ -104,16 +120,16 @@ class Declaration(T:! type); // CHECK:STDOUT: // CHECK:STDOUT: impl: @Class.%Self.ref as constants.%Destroy.type { // CHECK:STDOUT: %Class.as.Destroy.impl.Op.decl: @Class.as.Destroy.impl.%Class.as.Destroy.impl.Op.type (%Class.as.Destroy.impl.Op.type) = fn_decl @Class.as.Destroy.impl.Op [symbolic = @Class.as.Destroy.impl.%Class.as.Destroy.impl.Op (constants.%Class.as.Destroy.impl.Op)] { -// CHECK:STDOUT: %self.patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.9e0) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.9e0) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc15_23.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: %self.patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.417) = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.417) = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %.loc5_28.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.955) = value_param call_param0 -// CHECK:STDOUT: %.loc15_23.2: type = splice_block %Self.ref [symbolic = %Class (constants.%Class)] { -// CHECK:STDOUT: %.loc15_23.3: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc15_23.3 [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.0b3) = value_param call_param0 +// CHECK:STDOUT: %.loc5_28.2: type = splice_block %Self.ref [symbolic = %Class (constants.%Class)] { +// CHECK:STDOUT: %.loc5_28.3: type = specific_constant constants.%Class, @Class(constants.%T.578) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc5_28.3 [symbolic = %Class (constants.%Class)] // CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Class.as.Destroy.impl.Op.%ptr (%ptr.955) = bind_name self, %self.param +// CHECK:STDOUT: %self: @Class.as.Destroy.impl.Op.%ptr (%ptr.0b3) = bind_name self, %self.param // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !members: @@ -122,182 +138,214 @@ class Declaration(T:! type); // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc15_13.2: type) { -// CHECK:STDOUT: %T.loc15_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc15_13.1 (constants.%T)] +// CHECK:STDOUT: generic class @Class(%T.loc5_13.2: %Copy.type) { +// CHECK:STDOUT: %T.loc5_13.1: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc5_13.1 (constants.%T.578)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Class.GetAddr.type: type = fn_type @Class.GetAddr, @Class(%T.loc15_13.1) [symbolic = %Class.GetAddr.type (constants.%Class.GetAddr.type)] +// CHECK:STDOUT: %Class.GetAddr.type: type = fn_type @Class.GetAddr, @Class(%T.loc5_13.1) [symbolic = %Class.GetAddr.type (constants.%Class.GetAddr.type)] // CHECK:STDOUT: %Class.GetAddr: @Class.%Class.GetAddr.type (%Class.GetAddr.type) = struct_value () [symbolic = %Class.GetAddr (constants.%Class.GetAddr)] -// CHECK:STDOUT: %Class.GetValue.type: type = fn_type @Class.GetValue, @Class(%T.loc15_13.1) [symbolic = %Class.GetValue.type (constants.%Class.GetValue.type)] +// CHECK:STDOUT: %Class.GetValue.type: type = fn_type @Class.GetValue, @Class(%T.loc5_13.1) [symbolic = %Class.GetValue.type (constants.%Class.GetValue.type)] // CHECK:STDOUT: %Class.GetValue: @Class.%Class.GetValue.type (%Class.GetValue.type) = struct_value () [symbolic = %Class.GetValue (constants.%Class.GetValue)] -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc15_13.1 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc15_13.1) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.loc15_13.1 [symbolic = %Class.elem (constants.%Class.elem)] -// CHECK:STDOUT: %struct_type.k: type = struct_type {.k: @Class.%T.loc15_13.1 (%T)} [symbolic = %struct_type.k (constants.%struct_type.k)] -// CHECK:STDOUT: %complete_type.loc26_1.2: = complete_type_witness %struct_type.k [symbolic = %complete_type.loc26_1.2 (constants.%complete_type)] +// CHECK:STDOUT: %T.as_type.loc14_10.2: type = facet_access_type %T.loc5_13.1 [symbolic = %T.as_type.loc14_10.2 (constants.%T.as_type)] +// CHECK:STDOUT: %require_complete: = require_complete_type %T.as_type.loc14_10.2 [symbolic = %require_complete (constants.%require_complete.ecc)] +// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc5_13.1) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.as_type.loc14_10.2 [symbolic = %Class.elem (constants.%Class.elem)] +// CHECK:STDOUT: %struct_type.k: type = struct_type {.k: @Class.%T.as_type.loc14_10.2 (%T.as_type)} [symbolic = %struct_type.k (constants.%struct_type.k)] +// CHECK:STDOUT: %complete_type.loc15_1.2: = complete_type_witness %struct_type.k [symbolic = %complete_type.loc15_1.2 (constants.%complete_type)] // CHECK:STDOUT: // CHECK:STDOUT: class { // CHECK:STDOUT: %Class.GetAddr.decl: @Class.%Class.GetAddr.type (%Class.GetAddr.type) = fn_decl @Class.GetAddr [symbolic = @Class.%Class.GetAddr (constants.%Class.GetAddr)] { -// CHECK:STDOUT: %self.patt: @Class.GetAddr.%pattern_type.loc16_19 (%pattern_type.9e0) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Class.GetAddr.%pattern_type.loc16_19 (%pattern_type.9e0) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc16_14: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: %return.patt: @Class.GetAddr.%pattern_type.loc16_34 (%pattern_type.afe) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Class.GetAddr.%pattern_type.loc16_34 (%pattern_type.afe) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %self.patt: @Class.GetAddr.%pattern_type.loc6_19 (%pattern_type.417) = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: @Class.GetAddr.%pattern_type.loc6_19 (%pattern_type.417) = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %.loc6_14: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: %return.patt: @Class.GetAddr.%pattern_type.loc6_34 (%pattern_type.b45) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @Class.GetAddr.%pattern_type.loc6_34 (%pattern_type.b45) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref: type = name_ref T, @Class.%T.loc15_13.2 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %ptr.loc16_38.2: type = ptr_type %T.ref [symbolic = %ptr.loc16_38.1 (constants.%ptr.79f)] -// CHECK:STDOUT: %self.param: @Class.GetAddr.%ptr.loc16_29.1 (%ptr.955) = value_param call_param0 -// CHECK:STDOUT: %.loc16_29: type = splice_block %ptr.loc16_29.2 [symbolic = %ptr.loc16_29.1 (constants.%ptr.955)] { -// CHECK:STDOUT: %.loc16_25: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc16_25 [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %ptr.loc16_29.2: type = ptr_type %Self.ref [symbolic = %ptr.loc16_29.1 (constants.%ptr.955)] +// CHECK:STDOUT: %T.ref: %Copy.type = name_ref T, @Class.%T.loc5_13.2 [symbolic = %T (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc6_38.2: type = facet_access_type %T.ref [symbolic = %T.as_type.loc6_38.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc6_38: type = converted %T.ref, %T.as_type.loc6_38.2 [symbolic = %T.as_type.loc6_38.1 (constants.%T.as_type)] +// CHECK:STDOUT: %ptr.loc6_38.2: type = ptr_type %.loc6_38 [symbolic = %ptr.loc6_38.1 (constants.%ptr.a75)] +// CHECK:STDOUT: %self.param: @Class.GetAddr.%ptr.loc6_29.1 (%ptr.0b3) = value_param call_param0 +// CHECK:STDOUT: %.loc6_29: type = splice_block %ptr.loc6_29.2 [symbolic = %ptr.loc6_29.1 (constants.%ptr.0b3)] { +// CHECK:STDOUT: %.loc6_25: type = specific_constant constants.%Class, @Class(constants.%T.578) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc6_25 [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %ptr.loc6_29.2: type = ptr_type %Self.ref [symbolic = %ptr.loc6_29.1 (constants.%ptr.0b3)] // CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Class.GetAddr.%ptr.loc16_29.1 (%ptr.955) = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref @Class.GetAddr.%ptr.loc16_38.1 (%ptr.79f) = out_param call_param1 -// CHECK:STDOUT: %return: ref @Class.GetAddr.%ptr.loc16_38.1 (%ptr.79f) = return_slot %return.param +// CHECK:STDOUT: %self: @Class.GetAddr.%ptr.loc6_29.1 (%ptr.0b3) = bind_name self, %self.param +// CHECK:STDOUT: %return.param: ref @Class.GetAddr.%ptr.loc6_38.1 (%ptr.a75) = out_param call_param1 +// CHECK:STDOUT: %return: ref @Class.GetAddr.%ptr.loc6_38.1 (%ptr.a75) = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: %Class.GetValue.decl: @Class.%Class.GetValue.type (%Class.GetValue.type) = fn_decl @Class.GetValue [symbolic = @Class.%Class.GetValue (constants.%Class.GetValue)] { -// CHECK:STDOUT: %self.patt: @Class.GetValue.%pattern_type.loc21_15 (%pattern_type.3c1) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Class.GetValue.%pattern_type.loc21_15 (%pattern_type.3c1) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @Class.GetValue.%pattern_type.loc21_29 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Class.GetValue.%pattern_type.loc21_29 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %self.patt: @Class.GetValue.%pattern_type.loc10_15 (%pattern_type.47a) = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: @Class.GetValue.%pattern_type.loc10_15 (%pattern_type.47a) = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @Class.GetValue.%pattern_type.loc10_29 (%pattern_type.f8cebc.1) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @Class.GetValue.%pattern_type.loc10_29 (%pattern_type.f8cebc.1) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref: type = name_ref T, @Class.%T.loc15_13.2 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T.ref: %Copy.type = name_ref T, @Class.%T.loc5_13.2 [symbolic = %T (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc10_32.2: type = facet_access_type %T.ref [symbolic = %T.as_type.loc10_32.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc10_32: type = converted %T.ref, %T.as_type.loc10_32.2 [symbolic = %T.as_type.loc10_32.1 (constants.%T.as_type)] // CHECK:STDOUT: %self.param: @Class.GetValue.%Class (%Class) = value_param call_param0 -// CHECK:STDOUT: %.loc21_21.1: type = splice_block %Self.ref [symbolic = %Class (constants.%Class)] { -// CHECK:STDOUT: %.loc21_21.2: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc21_21.2 [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %.loc10_21.1: type = splice_block %Self.ref [symbolic = %Class (constants.%Class)] { +// CHECK:STDOUT: %.loc10_21.2: type = specific_constant constants.%Class, @Class(constants.%T.578) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc10_21.2 [symbolic = %Class (constants.%Class)] // CHECK:STDOUT: } // CHECK:STDOUT: %self: @Class.GetValue.%Class (%Class) = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref @Class.GetValue.%T (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @Class.GetValue.%T (%T) = return_slot %return.param +// CHECK:STDOUT: %return.param: ref @Class.GetValue.%T.as_type.loc10_32.1 (%T.as_type) = out_param call_param1 +// CHECK:STDOUT: %return: ref @Class.GetValue.%T.as_type.loc10_32.1 (%T.as_type) = return_slot %return.param // CHECK:STDOUT: } -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc15_13.2 [symbolic = %T.loc15_13.1 (constants.%T)] -// CHECK:STDOUT: %.loc25: @Class.%Class.elem (%Class.elem) = field_decl k, element0 [concrete] +// CHECK:STDOUT: %T.ref: %Copy.type = name_ref T, %T.loc5_13.2 [symbolic = %T.loc5_13.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc14_10.1: type = facet_access_type %T.ref [symbolic = %T.as_type.loc14_10.2 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc14_10: type = converted %T.ref, %T.as_type.loc14_10.1 [symbolic = %T.as_type.loc14_10.2 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc14_8: @Class.%Class.elem (%Class.elem) = field_decl k, element0 [concrete] // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Class [symbolic = @Class.as.Destroy.impl.%Class (constants.%Class)] // CHECK:STDOUT: impl_decl @Class.as.Destroy.impl [concrete] {} {} // CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Class.as.Destroy.impl.%Class.as.Destroy.impl.Op.decl), @Class.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Class.as.Destroy.impl(constants.%T) [symbolic = @Class.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness)] -// CHECK:STDOUT: %complete_type.loc26_1.1: = complete_type_witness constants.%struct_type.k [symbolic = %complete_type.loc26_1.2 (constants.%complete_type)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc26_1.1 +// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Class.as.Destroy.impl(constants.%T.578) [symbolic = @Class.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness)] +// CHECK:STDOUT: %complete_type.loc15_1.1: = complete_type_witness constants.%struct_type.k [symbolic = %complete_type.loc15_1.2 (constants.%complete_type)] +// CHECK:STDOUT: complete_type_witness = %complete_type.loc15_1.1 // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .Self = constants.%Class // CHECK:STDOUT: .T = // CHECK:STDOUT: .GetAddr = %Class.GetAddr.decl // CHECK:STDOUT: .GetValue = %Class.GetValue.decl -// CHECK:STDOUT: .k = %.loc25 +// CHECK:STDOUT: .k = %.loc14_8 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @Declaration(%T.loc28_19.2: type) { -// CHECK:STDOUT: %T.loc28_19.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc28_19.1 (constants.%T)] +// CHECK:STDOUT: generic class @Declaration(%T.loc17_19.2: type) { +// CHECK:STDOUT: %T.loc17_19.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc17_19.1 (constants.%T.8b3)] // CHECK:STDOUT: // CHECK:STDOUT: class; // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Class.GetAddr(@Class.%T.loc15_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: generic fn @Class.GetAddr(@Class.%T.loc5_13.2: %Copy.type) { +// CHECK:STDOUT: %T: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.578)] // CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %ptr.loc16_29.1: type = ptr_type %Class [symbolic = %ptr.loc16_29.1 (constants.%ptr.955)] -// CHECK:STDOUT: %pattern_type.loc16_19: type = pattern_type %ptr.loc16_29.1 [symbolic = %pattern_type.loc16_19 (constants.%pattern_type.9e0)] -// CHECK:STDOUT: %ptr.loc16_38.1: type = ptr_type %T [symbolic = %ptr.loc16_38.1 (constants.%ptr.79f)] -// CHECK:STDOUT: %pattern_type.loc16_34: type = pattern_type %ptr.loc16_38.1 [symbolic = %pattern_type.loc16_34 (constants.%pattern_type.afe)] +// CHECK:STDOUT: %ptr.loc6_29.1: type = ptr_type %Class [symbolic = %ptr.loc6_29.1 (constants.%ptr.0b3)] +// CHECK:STDOUT: %pattern_type.loc6_19: type = pattern_type %ptr.loc6_29.1 [symbolic = %pattern_type.loc6_19 (constants.%pattern_type.417)] +// CHECK:STDOUT: %T.as_type.loc6_38.1: type = facet_access_type %T [symbolic = %T.as_type.loc6_38.1 (constants.%T.as_type)] +// CHECK:STDOUT: %ptr.loc6_38.1: type = ptr_type %T.as_type.loc6_38.1 [symbolic = %ptr.loc6_38.1 (constants.%ptr.a75)] +// CHECK:STDOUT: %pattern_type.loc6_34: type = pattern_type %ptr.loc6_38.1 [symbolic = %pattern_type.loc6_34 (constants.%pattern_type.b45)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc16_34: = require_complete_type %ptr.loc16_38.1 [symbolic = %require_complete.loc16_34 (constants.%require_complete.6e5)] -// CHECK:STDOUT: %require_complete.loc16_23: = require_complete_type %ptr.loc16_29.1 [symbolic = %require_complete.loc16_23 (constants.%require_complete.2ae)] -// CHECK:STDOUT: %require_complete.loc17: = require_complete_type %Class [symbolic = %require_complete.loc17 (constants.%require_complete.4f8)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic = %Class.elem (constants.%Class.elem)] +// CHECK:STDOUT: %require_complete.loc6_34: = require_complete_type %ptr.loc6_38.1 [symbolic = %require_complete.loc6_34 (constants.%require_complete.999)] +// CHECK:STDOUT: %require_complete.loc6_23: = require_complete_type %ptr.loc6_29.1 [symbolic = %require_complete.loc6_23 (constants.%require_complete.27d)] +// CHECK:STDOUT: %require_complete.loc7: = require_complete_type %Class [symbolic = %require_complete.loc7 (constants.%require_complete.ef5)] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.as_type.loc6_38.1 [symbolic = %Class.elem (constants.%Class.elem)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %ptr.loc6_38.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.23e)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %ptr.loc6_38.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.d7e)] +// CHECK:STDOUT: %.loc7_12.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc7_12.2 (constants.%.30e)] +// CHECK:STDOUT: %impl.elem0.loc7_12.2: @Class.GetAddr.%.loc7_12.2 (%.30e) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc7_12.2 (constants.%impl.elem0.cb9)] +// CHECK:STDOUT: %specific_impl_fn.loc7_12.2: = specific_impl_function %impl.elem0.loc7_12.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc7_12.2 (constants.%specific_impl_fn.e97)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Class.GetAddr.%ptr.loc16_29.1 (%ptr.955)) -> @Class.GetAddr.%ptr.loc16_38.1 (%ptr.79f) { +// CHECK:STDOUT: fn(%self.param: @Class.GetAddr.%ptr.loc6_29.1 (%ptr.0b3)) -> @Class.GetAddr.%ptr.loc6_38.1 (%ptr.a75) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: @Class.GetAddr.%ptr.loc16_29.1 (%ptr.955) = name_ref self, %self -// CHECK:STDOUT: %.loc17_17.1: ref @Class.GetAddr.%Class (%Class) = deref %self.ref -// CHECK:STDOUT: %k.ref: @Class.GetAddr.%Class.elem (%Class.elem) = name_ref k, @Class.%.loc25 [concrete = @Class.%.loc25] -// CHECK:STDOUT: %.loc17_17.2: ref @Class.GetAddr.%T (%T) = class_element_access %.loc17_17.1, element0 -// CHECK:STDOUT: %addr: @Class.GetAddr.%ptr.loc16_38.1 (%ptr.79f) = addr_of %.loc17_17.2 -// CHECK:STDOUT: return %addr +// CHECK:STDOUT: %self.ref: @Class.GetAddr.%ptr.loc6_29.1 (%ptr.0b3) = name_ref self, %self +// CHECK:STDOUT: %.loc7_17.1: ref @Class.GetAddr.%Class (%Class) = deref %self.ref +// CHECK:STDOUT: %k.ref: @Class.GetAddr.%Class.elem (%Class.elem) = name_ref k, @Class.%.loc14_8 [concrete = @Class.%.loc14_8] +// CHECK:STDOUT: %.loc7_17.2: ref @Class.GetAddr.%T.as_type.loc6_38.1 (%T.as_type) = class_element_access %.loc7_17.1, element0 +// CHECK:STDOUT: %addr: @Class.GetAddr.%ptr.loc6_38.1 (%ptr.a75) = addr_of %.loc7_17.2 +// CHECK:STDOUT: %impl.elem0.loc7_12.1: @Class.GetAddr.%.loc7_12.2 (%.30e) = impl_witness_access constants.%Copy.lookup_impl_witness.23e, element0 [symbolic = %impl.elem0.loc7_12.2 (constants.%impl.elem0.cb9)] +// CHECK:STDOUT: %bound_method.loc7_12.1: = bound_method %addr, %impl.elem0.loc7_12.1 +// CHECK:STDOUT: %specific_impl_fn.loc7_12.1: = specific_impl_function %impl.elem0.loc7_12.1, @Copy.Op(constants.%Copy.facet.d7e) [symbolic = %specific_impl_fn.loc7_12.2 (constants.%specific_impl_fn.e97)] +// CHECK:STDOUT: %bound_method.loc7_12.2: = bound_method %addr, %specific_impl_fn.loc7_12.1 +// CHECK:STDOUT: %.loc7_12.1: init @Class.GetAddr.%ptr.loc6_38.1 (%ptr.a75) = call %bound_method.loc7_12.2(%addr) +// CHECK:STDOUT: return %.loc7_12.1 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Class.GetValue(@Class.%T.loc15_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: generic fn @Class.GetValue(@Class.%T.loc5_13.2: %Copy.type) { +// CHECK:STDOUT: %T: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.578)] // CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %pattern_type.loc21_15: type = pattern_type %Class [symbolic = %pattern_type.loc21_15 (constants.%pattern_type.3c1)] -// CHECK:STDOUT: %pattern_type.loc21_29: type = pattern_type %T [symbolic = %pattern_type.loc21_29 (constants.%pattern_type.7dc)] +// CHECK:STDOUT: %pattern_type.loc10_15: type = pattern_type %Class [symbolic = %pattern_type.loc10_15 (constants.%pattern_type.47a)] +// CHECK:STDOUT: %T.as_type.loc10_32.1: type = facet_access_type %T [symbolic = %T.as_type.loc10_32.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type.loc10_29: type = pattern_type %T.as_type.loc10_32.1 [symbolic = %pattern_type.loc10_29 (constants.%pattern_type.f8cebc.1)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc21: = require_complete_type %Class [symbolic = %require_complete.loc21 (constants.%require_complete.4f8)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic = %Class.elem (constants.%Class.elem)] -// CHECK:STDOUT: %require_complete.loc22: = require_complete_type %T [symbolic = %require_complete.loc22 (constants.%require_complete.4ae)] +// CHECK:STDOUT: %require_complete.loc10: = require_complete_type %Class [symbolic = %require_complete.loc10 (constants.%require_complete.ef5)] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.as_type.loc10_32.1 [symbolic = %Class.elem (constants.%Class.elem)] +// CHECK:STDOUT: %require_complete.loc11: = require_complete_type %T.as_type.loc10_32.1 [symbolic = %require_complete.loc11 (constants.%require_complete.ecc)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %T, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.3ba)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %T.as_type.loc10_32.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.72e)] +// CHECK:STDOUT: %.loc11_16.4: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc11_16.4 (constants.%.671)] +// CHECK:STDOUT: %impl.elem0.loc11_16.2: @Class.GetValue.%.loc11_16.4 (%.671) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc11_16.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %specific_impl_fn.loc11_16.2: = specific_impl_function %impl.elem0.loc11_16.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc11_16.2 (constants.%specific_impl_fn.fb7)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Class.GetValue.%Class (%Class)) -> @Class.GetValue.%T (%T) { +// CHECK:STDOUT: fn(%self.param: @Class.GetValue.%Class (%Class)) -> @Class.GetValue.%T.as_type.loc10_32.1 (%T.as_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %self.ref: @Class.GetValue.%Class (%Class) = name_ref self, %self -// CHECK:STDOUT: %k.ref: @Class.GetValue.%Class.elem (%Class.elem) = name_ref k, @Class.%.loc25 [concrete = @Class.%.loc25] -// CHECK:STDOUT: %.loc22_16.1: ref @Class.GetValue.%T (%T) = class_element_access %self.ref, element0 -// CHECK:STDOUT: %.loc22_16.2: @Class.GetValue.%T (%T) = bind_value %.loc22_16.1 -// CHECK:STDOUT: return %.loc22_16.2 +// CHECK:STDOUT: %k.ref: @Class.GetValue.%Class.elem (%Class.elem) = name_ref k, @Class.%.loc14_8 [concrete = @Class.%.loc14_8] +// CHECK:STDOUT: %.loc11_16.1: ref @Class.GetValue.%T.as_type.loc10_32.1 (%T.as_type) = class_element_access %self.ref, element0 +// CHECK:STDOUT: %.loc11_16.2: @Class.GetValue.%T.as_type.loc10_32.1 (%T.as_type) = bind_value %.loc11_16.1 +// CHECK:STDOUT: %impl.elem0.loc11_16.1: @Class.GetValue.%.loc11_16.4 (%.671) = impl_witness_access constants.%Copy.lookup_impl_witness.3ba, element0 [symbolic = %impl.elem0.loc11_16.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %bound_method.loc11_16.1: = bound_method %.loc11_16.2, %impl.elem0.loc11_16.1 +// CHECK:STDOUT: %specific_impl_fn.loc11_16.1: = specific_impl_function %impl.elem0.loc11_16.1, @Copy.Op(constants.%Copy.facet.72e) [symbolic = %specific_impl_fn.loc11_16.2 (constants.%specific_impl_fn.fb7)] +// CHECK:STDOUT: %bound_method.loc11_16.2: = bound_method %.loc11_16.2, %specific_impl_fn.loc11_16.1 +// CHECK:STDOUT: %.loc11_16.3: init @Class.GetValue.%T.as_type.loc10_32.1 (%T.as_type) = call %bound_method.loc11_16.2(%.loc11_16.2) +// CHECK:STDOUT: return %.loc11_16.3 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Class.as.Destroy.impl.Op(@Class.%T.loc15_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: generic fn @Class.as.Destroy.impl.Op(@Class.%T.loc5_13.2: %Copy.type) { +// CHECK:STDOUT: %T: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.578)] // CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %ptr: type = ptr_type %Class [symbolic = %ptr (constants.%ptr.955)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.9e0)] +// CHECK:STDOUT: %ptr: type = ptr_type %Class [symbolic = %ptr (constants.%ptr.0b3)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.417)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.955)) = "no_op"; +// CHECK:STDOUT: fn(%self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.0b3)) = "no_op"; // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T) { -// CHECK:STDOUT: %T.loc15_13.1 => constants.%T +// CHECK:STDOUT: specific @Class(constants.%T.578) { +// CHECK:STDOUT: %T.loc5_13.1 => constants.%T.578 // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %Class.GetAddr.type => constants.%Class.GetAddr.type // CHECK:STDOUT: %Class.GetAddr => constants.%Class.GetAddr // CHECK:STDOUT: %Class.GetValue.type => constants.%Class.GetValue.type // CHECK:STDOUT: %Class.GetValue => constants.%Class.GetValue -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae +// CHECK:STDOUT: %T.as_type.loc14_10.2 => constants.%T.as_type +// CHECK:STDOUT: %require_complete => constants.%require_complete.ecc // CHECK:STDOUT: %Class => constants.%Class // CHECK:STDOUT: %Class.elem => constants.%Class.elem // CHECK:STDOUT: %struct_type.k => constants.%struct_type.k -// CHECK:STDOUT: %complete_type.loc26_1.2 => constants.%complete_type +// CHECK:STDOUT: %complete_type.loc15_1.2 => constants.%complete_type // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.GetAddr(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @Class.GetAddr(constants.%T.578) { +// CHECK:STDOUT: %T => constants.%T.578 // CHECK:STDOUT: %Class => constants.%Class -// CHECK:STDOUT: %ptr.loc16_29.1 => constants.%ptr.955 -// CHECK:STDOUT: %pattern_type.loc16_19 => constants.%pattern_type.9e0 -// CHECK:STDOUT: %ptr.loc16_38.1 => constants.%ptr.79f -// CHECK:STDOUT: %pattern_type.loc16_34 => constants.%pattern_type.afe +// CHECK:STDOUT: %ptr.loc6_29.1 => constants.%ptr.0b3 +// CHECK:STDOUT: %pattern_type.loc6_19 => constants.%pattern_type.417 +// CHECK:STDOUT: %T.as_type.loc6_38.1 => constants.%T.as_type +// CHECK:STDOUT: %ptr.loc6_38.1 => constants.%ptr.a75 +// CHECK:STDOUT: %pattern_type.loc6_34 => constants.%pattern_type.b45 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.GetValue(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @Class.GetValue(constants.%T.578) { +// CHECK:STDOUT: %T => constants.%T.578 // CHECK:STDOUT: %Class => constants.%Class -// CHECK:STDOUT: %pattern_type.loc21_15 => constants.%pattern_type.3c1 -// CHECK:STDOUT: %pattern_type.loc21_29 => constants.%pattern_type.7dc +// CHECK:STDOUT: %pattern_type.loc10_15 => constants.%pattern_type.47a +// CHECK:STDOUT: %T.as_type.loc10_32.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type.loc10_29 => constants.%pattern_type.f8cebc.1 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @Class.as.Destroy.impl(constants.%T.578) { +// CHECK:STDOUT: %T => constants.%T.578 // CHECK:STDOUT: %Class => constants.%Class // CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @Class.as.Destroy.impl.Op(constants.%T.578) { +// CHECK:STDOUT: %T => constants.%T.578 // CHECK:STDOUT: %Class => constants.%Class -// CHECK:STDOUT: %ptr => constants.%ptr.955 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.9e0 +// CHECK:STDOUT: %ptr => constants.%ptr.0b3 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.417 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Declaration(constants.%T) { -// CHECK:STDOUT: %T.loc28_19.1 => constants.%T +// CHECK:STDOUT: specific @Declaration(constants.%T.8b3) { +// CHECK:STDOUT: %T.loc17_19.1 => constants.%T.8b3 // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/field.carbon b/toolchain/check/testdata/class/generic/field.carbon index 3d6ef90246dc..910ba29e6b7a 100644 --- a/toolchain/check/testdata/class/generic/field.carbon +++ b/toolchain/check/testdata/class/generic/field.carbon @@ -3,8 +3,6 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // // INCLUDE-FILE: toolchain/testing/testdata/min_prelude/int.carbon -// TODO: Add ranges and switch to "--dump-sem-ir-ranges=only". -// EXTRA-ARGS: --dump-sem-ir-ranges=if-present // // AUTOUPDATE // TIP: To test this file alone, run: @@ -12,6 +10,11 @@ // TIP: To dump output, run: // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/generic/field.carbon +// --- field.carbon + +library "[[@TEST_NAME]]"; + +//@dump-sem-ir-begin class Class(T:! type) { var x: T; } @@ -20,38 +23,38 @@ fn F(c: Class(i32)) -> i32 { return c.x; } -fn G(T:! type, c: Class(T)) -> T { +fn G(T:! Core.Copy, c: Class(T)) -> T { return c.x; } -fn H(U:! type, c: Class(U)) -> U { +fn H(U:! Core.Copy, c: Class(U)) -> U { return c.x; } +//@dump-sem-ir-end // CHECK:STDOUT: --- field.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] // CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] -// CHECK:STDOUT: %Class.fe1b2d.1: type = class_type @Class, @Class(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4aeca8.1: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %Class.elem.e262de.1: type = unbound_element_type %Class.fe1b2d.1, %T [symbolic] +// CHECK:STDOUT: %Class.fe1: type = class_type @Class, @Class(%T.8b3) [symbolic] +// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T.8b3 [symbolic] +// CHECK:STDOUT: %Class.elem.e26: type = unbound_element_type %Class.fe1, %T.8b3 [symbolic] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %ptr.955: type = ptr_type %Class.fe1b2d.1 [symbolic] +// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.955: type = ptr_type %Class.fe1 [symbolic] // CHECK:STDOUT: %pattern_type.9e0: type = pattern_type %ptr.955 [symbolic] -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.type: type = fn_type @Class.as.Destroy.impl.Op, @Class.as.Destroy.impl(%T) [symbolic] +// CHECK:STDOUT: %Class.as.Destroy.impl.Op.type: type = fn_type @Class.as.Destroy.impl.Op, @Class.as.Destroy.impl(%T.8b3) [symbolic] // CHECK:STDOUT: %Class.as.Destroy.impl.Op: %Class.as.Destroy.impl.Op.type = struct_value () [symbolic] -// CHECK:STDOUT: %struct_type.x.2ac3f0.1: type = struct_type {.x: %T} [symbolic] -// CHECK:STDOUT: %complete_type.4339b3.1: = complete_type_witness %struct_type.x.2ac3f0.1 [symbolic] +// CHECK:STDOUT: %struct_type.x.2ac: type = struct_type {.x: %T.8b3} [symbolic] +// CHECK:STDOUT: %complete_type.433: = complete_type_witness %struct_type.x.2ac [symbolic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Class.247: type = class_type @Class, @Class(%i32) [concrete] // CHECK:STDOUT: %pattern_type.0fa: type = pattern_type %Class.247 [concrete] @@ -63,49 +66,74 @@ fn H(U:! type, c: Class(U)) -> U { // CHECK:STDOUT: %Class.elem.2d8: type = unbound_element_type %Class.247, %i32 [concrete] // CHECK:STDOUT: %struct_type.x.ed6: type = struct_type {.x: %i32} [concrete] // CHECK:STDOUT: %complete_type.1ec: = complete_type_witness %struct_type.x.ed6 [concrete] -// CHECK:STDOUT: %pattern_type.3c18fb.1: type = pattern_type %Class.fe1b2d.1 [symbolic] -// CHECK:STDOUT: %pattern_type.7dcd0a.1: type = pattern_type %T [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %T.578: %Copy.type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T.578 [symbolic] +// CHECK:STDOUT: %pattern_type.ce2: type = pattern_type %Copy.type [concrete] +// CHECK:STDOUT: %require_complete.ecc136.1: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %Copy.lookup_impl_witness.3ba2b3.1: = lookup_impl_witness %T.578, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.72ea01.1: %Copy.type = facet_value %T.as_type, (%Copy.lookup_impl_witness.3ba2b3.1) [symbolic] +// CHECK:STDOUT: %.671c3a.1: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.72ea01.1 [symbolic] +// CHECK:STDOUT: %impl.elem0.56eb4a.1: %.671c3a.1 = impl_witness_access %Copy.lookup_impl_witness.3ba2b3.1, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.fb70c0.1: = specific_impl_function %impl.elem0.56eb4a.1, @Copy.Op(%Copy.facet.72ea01.1) [symbolic] +// CHECK:STDOUT: %pattern_type.f8cebc.2: type = pattern_type %T.as_type [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] +// CHECK:STDOUT: %Class.b1d614.1: type = class_type @Class, @Class(%T.as_type) [symbolic] +// CHECK:STDOUT: %pattern_type.a8fce4.1: type = pattern_type %Class.b1d614.1 [symbolic] // CHECK:STDOUT: %G.type: type = fn_type @G [concrete] // CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.4f8a42.1: = require_complete_type %Class.fe1b2d.1 [symbolic] -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 0 [symbolic] -// CHECK:STDOUT: %Class.fe1b2d.2: type = class_type @Class, @Class(%U) [symbolic] -// CHECK:STDOUT: %pattern_type.3c18fb.2: type = pattern_type %Class.fe1b2d.2 [symbolic] -// CHECK:STDOUT: %pattern_type.7dcd0a.2: type = pattern_type %U [symbolic] +// CHECK:STDOUT: %Class.elem.73af90.1: type = unbound_element_type %Class.b1d614.1, %T.as_type [symbolic] +// CHECK:STDOUT: %struct_type.x.7033a4.1: type = struct_type {.x: %T.as_type} [symbolic] +// CHECK:STDOUT: %complete_type.a8b764.1: = complete_type_witness %struct_type.x.7033a4.1 [symbolic] +// CHECK:STDOUT: %require_complete.57f28c.1: = require_complete_type %Class.b1d614.1 [symbolic] +// CHECK:STDOUT: %U.578: %Copy.type = bind_symbolic_name U, 0 [symbolic] +// CHECK:STDOUT: %U.as_type.565: type = facet_access_type %U.578 [symbolic] +// CHECK:STDOUT: %Class.b1d614.2: type = class_type @Class, @Class(%U.as_type.565) [symbolic] +// CHECK:STDOUT: %pattern_type.a8fce4.2: type = pattern_type %Class.b1d614.2 [symbolic] +// CHECK:STDOUT: %pattern_type.f8cebc.3: type = pattern_type %U.as_type.565 [symbolic] // CHECK:STDOUT: %H.type: type = fn_type @H [concrete] // CHECK:STDOUT: %H: %H.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.4aeca8.2: = require_complete_type %U [symbolic] -// CHECK:STDOUT: %Class.elem.e262de.2: type = unbound_element_type %Class.fe1b2d.2, %U [symbolic] -// CHECK:STDOUT: %struct_type.x.2ac3f0.2: type = struct_type {.x: %U} [symbolic] -// CHECK:STDOUT: %complete_type.4339b3.2: = complete_type_witness %struct_type.x.2ac3f0.2 [symbolic] -// CHECK:STDOUT: %require_complete.4f8a42.2: = require_complete_type %Class.fe1b2d.2 [symbolic] +// CHECK:STDOUT: %require_complete.ecc136.2: = require_complete_type %U.as_type.565 [symbolic] +// CHECK:STDOUT: %Class.elem.73af90.2: type = unbound_element_type %Class.b1d614.2, %U.as_type.565 [symbolic] +// CHECK:STDOUT: %struct_type.x.7033a4.2: type = struct_type {.x: %U.as_type.565} [symbolic] +// CHECK:STDOUT: %complete_type.a8b764.2: = complete_type_witness %struct_type.x.7033a4.2 [symbolic] +// CHECK:STDOUT: %require_complete.57f28c.2: = require_complete_type %Class.b1d614.2 [symbolic] +// CHECK:STDOUT: %Copy.lookup_impl_witness.3ba2b3.2: = lookup_impl_witness %U.578, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.72ea01.2: %Copy.type = facet_value %U.as_type.565, (%Copy.lookup_impl_witness.3ba2b3.2) [symbolic] +// CHECK:STDOUT: %.671c3a.2: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.72ea01.2 [symbolic] +// CHECK:STDOUT: %impl.elem0.56eb4a.2: %.671c3a.2 = impl_witness_access %Copy.lookup_impl_witness.3ba2b3.2, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.fb70c0.2: = specific_impl_function %impl.elem0.56eb4a.2, @Copy.Op(%Copy.facet.72ea01.2) [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .H = %H.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core // CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc15_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc15_13.1 (constants.%T)] +// CHECK:STDOUT: +// CHECK:STDOUT: %T.loc5_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc5_13.1 (constants.%T.8b3)] // CHECK:STDOUT: } // CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { // CHECK:STDOUT: %c.patt: %pattern_type.0fa = binding_pattern c [concrete] @@ -113,13 +141,13 @@ fn H(U:! type, c: Class(U)) -> U { // CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc19_24: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc19_24: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc9_24: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc9_24: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %c.param: %Class.247 = value_param call_param0 -// CHECK:STDOUT: %.loc19: type = splice_block %Class [concrete = constants.%Class.247] { +// CHECK:STDOUT: %.loc9: type = splice_block %Class [concrete = constants.%Class.247] { // CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %int_32.loc19_15: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc19_15: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc9_15: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc9_15: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %Class: type = class_type @Class, @Class(constants.%i32) [concrete = constants.%Class.247] // CHECK:STDOUT: } // CHECK:STDOUT: %c: %Class.247 = bind_name c, %c.param @@ -127,50 +155,66 @@ fn H(U:! type, c: Class(U)) -> U { // CHECK:STDOUT: %return: ref %i32 = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %c.patt: @G.%pattern_type.loc23_16 (%pattern_type.3c18fb.1) = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: @G.%pattern_type.loc23_16 (%pattern_type.3c18fb.1) = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @G.%pattern_type.loc23_29 (%pattern_type.7dcd0a.1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @G.%pattern_type.loc23_29 (%pattern_type.7dcd0a.1) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type.ce2 = symbolic_binding_pattern T, 0 [concrete] +// CHECK:STDOUT: %c.patt: @G.%pattern_type.loc13_21 (%pattern_type.a8fce4.1) = binding_pattern c [concrete] +// CHECK:STDOUT: %c.param_patt: @G.%pattern_type.loc13_21 (%pattern_type.a8fce4.1) = value_param_pattern %c.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @G.%pattern_type.loc13_34 (%pattern_type.f8cebc.2) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @G.%pattern_type.loc13_34 (%pattern_type.f8cebc.2) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc23_32: type = name_ref T, %T.loc23_6.2 [symbolic = %T.loc23_6.1 (constants.%T)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc23_6.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc23_6.1 (constants.%T)] -// CHECK:STDOUT: %c.param: @G.%Class.loc23_26.1 (%Class.fe1b2d.1) = value_param call_param0 -// CHECK:STDOUT: %.loc23: type = splice_block %Class.loc23_26.2 [symbolic = %Class.loc23_26.1 (constants.%Class.fe1b2d.1)] { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %T.ref.loc23_25: type = name_ref T, %T.loc23_6.2 [symbolic = %T.loc23_6.1 (constants.%T)] -// CHECK:STDOUT: %Class.loc23_26.2: type = class_type @Class, @Class(constants.%T) [symbolic = %Class.loc23_26.1 (constants.%Class.fe1b2d.1)] +// CHECK:STDOUT: %T.ref.loc13_37: %Copy.type = name_ref T, %T.loc13_6.2 [symbolic = %T.loc13_6.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc13_37: type = facet_access_type %T.ref.loc13_37 [symbolic = %T.as_type.loc13_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc13_37: type = converted %T.ref.loc13_37, %T.as_type.loc13_37 [symbolic = %T.as_type.loc13_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc13_14: type = splice_block %Copy.ref [concrete = constants.%Copy.type] { +// CHECK:STDOUT: +// CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core [concrete = imports.%Core] +// CHECK:STDOUT: %Copy.ref: type = name_ref Copy, imports.%Core.Copy [concrete = constants.%Copy.type] // CHECK:STDOUT: } -// CHECK:STDOUT: %c: @G.%Class.loc23_26.1 (%Class.fe1b2d.1) = bind_name c, %c.param -// CHECK:STDOUT: %return.param: ref @G.%T.loc23_6.1 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @G.%T.loc23_6.1 (%T) = return_slot %return.param +// CHECK:STDOUT: %T.loc13_6.2: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc13_6.1 (constants.%T.578)] +// CHECK:STDOUT: %c.param: @G.%Class.loc13_31.1 (%Class.b1d614.1) = value_param call_param0 +// CHECK:STDOUT: %.loc13_31.1: type = splice_block %Class.loc13_31.2 [symbolic = %Class.loc13_31.1 (constants.%Class.b1d614.1)] { +// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] +// CHECK:STDOUT: %T.ref.loc13_30: %Copy.type = name_ref T, %T.loc13_6.2 [symbolic = %T.loc13_6.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc13_31.2: type = facet_access_type %T.ref.loc13_30 [symbolic = %T.as_type.loc13_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc13_31.2: type = converted %T.ref.loc13_30, %T.as_type.loc13_31.2 [symbolic = %T.as_type.loc13_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %Class.loc13_31.2: type = class_type @Class, @Class(constants.%T.as_type) [symbolic = %Class.loc13_31.1 (constants.%Class.b1d614.1)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %c: @G.%Class.loc13_31.1 (%Class.b1d614.1) = bind_name c, %c.param +// CHECK:STDOUT: %return.param: ref @G.%T.as_type.loc13_31.1 (%T.as_type) = out_param call_param1 +// CHECK:STDOUT: %return: ref @G.%T.as_type.loc13_31.1 (%T.as_type) = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: %H.decl: %H.type = fn_decl @H [concrete = constants.%H] { -// CHECK:STDOUT: %U.patt: %pattern_type.98f = symbolic_binding_pattern U, 0 [concrete] -// CHECK:STDOUT: %c.patt: @H.%pattern_type.loc27_16 (%pattern_type.3c18fb.2) = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: @H.%pattern_type.loc27_16 (%pattern_type.3c18fb.2) = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @H.%pattern_type.loc27_29 (%pattern_type.7dcd0a.2) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @H.%pattern_type.loc27_29 (%pattern_type.7dcd0a.2) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %U.patt: %pattern_type.ce2 = symbolic_binding_pattern U, 0 [concrete] +// CHECK:STDOUT: %c.patt: @H.%pattern_type.loc17_21 (%pattern_type.a8fce4.2) = binding_pattern c [concrete] +// CHECK:STDOUT: %c.param_patt: @H.%pattern_type.loc17_21 (%pattern_type.a8fce4.2) = value_param_pattern %c.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @H.%pattern_type.loc17_34 (%pattern_type.f8cebc.3) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @H.%pattern_type.loc17_34 (%pattern_type.f8cebc.3) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %U.ref.loc27_32: type = name_ref U, %U.loc27_6.2 [symbolic = %U.loc27_6.1 (constants.%U)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %U.loc27_6.2: type = bind_symbolic_name U, 0 [symbolic = %U.loc27_6.1 (constants.%U)] -// CHECK:STDOUT: %c.param: @H.%Class.loc27_26.1 (%Class.fe1b2d.2) = value_param call_param0 -// CHECK:STDOUT: %.loc27: type = splice_block %Class.loc27_26.2 [symbolic = %Class.loc27_26.1 (constants.%Class.fe1b2d.2)] { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %U.ref.loc27_25: type = name_ref U, %U.loc27_6.2 [symbolic = %U.loc27_6.1 (constants.%U)] -// CHECK:STDOUT: %Class.loc27_26.2: type = class_type @Class, @Class(constants.%U) [symbolic = %Class.loc27_26.1 (constants.%Class.fe1b2d.2)] +// CHECK:STDOUT: %U.ref.loc17_37: %Copy.type = name_ref U, %U.loc17_6.2 [symbolic = %U.loc17_6.1 (constants.%U.578)] +// CHECK:STDOUT: %U.as_type.loc17_37: type = facet_access_type %U.ref.loc17_37 [symbolic = %U.as_type.loc17_31.1 (constants.%U.as_type.565)] +// CHECK:STDOUT: %.loc17_37: type = converted %U.ref.loc17_37, %U.as_type.loc17_37 [symbolic = %U.as_type.loc17_31.1 (constants.%U.as_type.565)] +// CHECK:STDOUT: %.loc17_14: type = splice_block %Copy.ref [concrete = constants.%Copy.type] { +// CHECK:STDOUT: +// CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core [concrete = imports.%Core] +// CHECK:STDOUT: %Copy.ref: type = name_ref Copy, imports.%Core.Copy [concrete = constants.%Copy.type] // CHECK:STDOUT: } -// CHECK:STDOUT: %c: @H.%Class.loc27_26.1 (%Class.fe1b2d.2) = bind_name c, %c.param -// CHECK:STDOUT: %return.param: ref @H.%U.loc27_6.1 (%U) = out_param call_param1 -// CHECK:STDOUT: %return: ref @H.%U.loc27_6.1 (%U) = return_slot %return.param +// CHECK:STDOUT: %U.loc17_6.2: %Copy.type = bind_symbolic_name U, 0 [symbolic = %U.loc17_6.1 (constants.%U.578)] +// CHECK:STDOUT: %c.param: @H.%Class.loc17_31.1 (%Class.b1d614.2) = value_param call_param0 +// CHECK:STDOUT: %.loc17_31.1: type = splice_block %Class.loc17_31.2 [symbolic = %Class.loc17_31.1 (constants.%Class.b1d614.2)] { +// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] +// CHECK:STDOUT: %U.ref.loc17_30: %Copy.type = name_ref U, %U.loc17_6.2 [symbolic = %U.loc17_6.1 (constants.%U.578)] +// CHECK:STDOUT: %U.as_type.loc17_31.2: type = facet_access_type %U.ref.loc17_30 [symbolic = %U.as_type.loc17_31.1 (constants.%U.as_type.565)] +// CHECK:STDOUT: %.loc17_31.2: type = converted %U.ref.loc17_30, %U.as_type.loc17_31.2 [symbolic = %U.as_type.loc17_31.1 (constants.%U.as_type.565)] +// CHECK:STDOUT: %Class.loc17_31.2: type = class_type @Class, @Class(constants.%U.as_type.565) [symbolic = %Class.loc17_31.1 (constants.%Class.b1d614.2)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %c: @H.%Class.loc17_31.1 (%Class.b1d614.2) = bind_name c, %c.param +// CHECK:STDOUT: %return.param: ref @H.%U.as_type.loc17_31.1 (%U.as_type.565) = out_param call_param1 +// CHECK:STDOUT: %return: ref @H.%U.as_type.loc17_31.1 (%U.as_type.565) = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic impl @Class.as.Destroy.impl(@Class.%T.loc15_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class.fe1b2d.1)] +// CHECK:STDOUT: generic impl @Class.as.Destroy.impl(@Class.%T.loc5_13.2: type) { +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] +// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class.fe1)] // CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: @@ -181,12 +225,12 @@ fn H(U:! type, c: Class(U)) -> U { // CHECK:STDOUT: %Class.as.Destroy.impl.Op.decl: @Class.as.Destroy.impl.%Class.as.Destroy.impl.Op.type (%Class.as.Destroy.impl.Op.type) = fn_decl @Class.as.Destroy.impl.Op [symbolic = @Class.as.Destroy.impl.%Class.as.Destroy.impl.Op (constants.%Class.as.Destroy.impl.Op)] { // CHECK:STDOUT: %self.patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.9e0) = binding_pattern self [concrete] // CHECK:STDOUT: %self.param_patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.9e0) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc15_23.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: %.loc5_23.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.955) = value_param call_param0 -// CHECK:STDOUT: %.loc15_23.2: type = splice_block %Self.ref [symbolic = %Class (constants.%Class.fe1b2d.1)] { -// CHECK:STDOUT: %.loc15_23.3: type = specific_constant constants.%Class.fe1b2d.1, @Class(constants.%T) [symbolic = %Class (constants.%Class.fe1b2d.1)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc15_23.3 [symbolic = %Class (constants.%Class.fe1b2d.1)] +// CHECK:STDOUT: %.loc5_23.2: type = splice_block %Self.ref [symbolic = %Class (constants.%Class.fe1)] { +// CHECK:STDOUT: %.loc5_23.3: type = specific_constant constants.%Class.fe1, @Class(constants.%T.8b3) [symbolic = %Class (constants.%Class.fe1)] +// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc5_23.3 [symbolic = %Class (constants.%Class.fe1)] // CHECK:STDOUT: } // CHECK:STDOUT: %self: @Class.as.Destroy.impl.Op.%ptr (%ptr.955) = bind_name self, %self.param // CHECK:STDOUT: } @@ -197,36 +241,36 @@ fn H(U:! type, c: Class(U)) -> U { // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc15_13.2: type) { -// CHECK:STDOUT: %T.loc15_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc15_13.1 (constants.%T)] +// CHECK:STDOUT: generic class @Class(%T.loc5_13.2: type) { +// CHECK:STDOUT: %T.loc5_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc5_13.1 (constants.%T.8b3)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc15_13.1 [symbolic = %require_complete (constants.%require_complete.4aeca8.1)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc15_13.1) [symbolic = %Class (constants.%Class.fe1b2d.1)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.loc15_13.1 [symbolic = %Class.elem (constants.%Class.elem.e262de.1)] -// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: @Class.%T.loc15_13.1 (%T)} [symbolic = %struct_type.x (constants.%struct_type.x.2ac3f0.1)] -// CHECK:STDOUT: %complete_type.loc17_1.2: = complete_type_witness %struct_type.x [symbolic = %complete_type.loc17_1.2 (constants.%complete_type.4339b3.1)] +// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc5_13.1 [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc5_13.1) [symbolic = %Class (constants.%Class.fe1)] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.loc5_13.1 [symbolic = %Class.elem (constants.%Class.elem.e26)] +// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: @Class.%T.loc5_13.1 (%T.8b3)} [symbolic = %struct_type.x (constants.%struct_type.x.2ac)] +// CHECK:STDOUT: %complete_type.loc7_1.2: = complete_type_witness %struct_type.x [symbolic = %complete_type.loc7_1.2 (constants.%complete_type.433)] // CHECK:STDOUT: // CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc15_13.2 [symbolic = %T.loc15_13.1 (constants.%T)] -// CHECK:STDOUT: %.loc16: @Class.%Class.elem (%Class.elem.e262de.1) = field_decl x, element0 [concrete] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Class.fe1b2d.1 [symbolic = @Class.as.Destroy.impl.%Class (constants.%Class.fe1b2d.1)] +// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc5_13.2 [symbolic = %T.loc5_13.1 (constants.%T.8b3)] +// CHECK:STDOUT: %.loc6: @Class.%Class.elem (%Class.elem.e26) = field_decl x, element0 [concrete] +// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Class.fe1 [symbolic = @Class.as.Destroy.impl.%Class (constants.%Class.fe1)] // CHECK:STDOUT: impl_decl @Class.as.Destroy.impl [concrete] {} {} // CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Class.as.Destroy.impl.%Class.as.Destroy.impl.Op.decl), @Class.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Class.as.Destroy.impl(constants.%T) [symbolic = @Class.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness)] -// CHECK:STDOUT: %complete_type.loc17_1.1: = complete_type_witness constants.%struct_type.x.2ac3f0.1 [symbolic = %complete_type.loc17_1.2 (constants.%complete_type.4339b3.1)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc17_1.1 +// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Class.as.Destroy.impl(constants.%T.8b3) [symbolic = @Class.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness)] +// CHECK:STDOUT: %complete_type.loc7_1.1: = complete_type_witness constants.%struct_type.x.2ac [symbolic = %complete_type.loc7_1.2 (constants.%complete_type.433)] +// CHECK:STDOUT: complete_type_witness = %complete_type.loc7_1.1 // CHECK:STDOUT: // CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class.fe1b2d.1 +// CHECK:STDOUT: .Self = constants.%Class.fe1 // CHECK:STDOUT: .T = -// CHECK:STDOUT: .x = %.loc16 +// CHECK:STDOUT: .x = %.loc6 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Class.as.Destroy.impl.Op(@Class.%T.loc15_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class.fe1b2d.1)] +// CHECK:STDOUT: generic fn @Class.as.Destroy.impl.Op(@Class.%T.loc5_13.2: type) { +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] +// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class.fe1)] // CHECK:STDOUT: %ptr: type = ptr_type %Class [symbolic = %ptr (constants.%ptr.955)] // CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.9e0)] // CHECK:STDOUT: @@ -238,111 +282,144 @@ fn H(U:! type, c: Class(U)) -> U { // CHECK:STDOUT: fn @F(%c.param: %Class.247) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %c.ref: %Class.247 = name_ref c, %c -// CHECK:STDOUT: %x.ref: %Class.elem.2d8 = name_ref x, @Class.%.loc16 [concrete = @Class.%.loc16] -// CHECK:STDOUT: %.loc20_11.1: ref %i32 = class_element_access %c.ref, element0 -// CHECK:STDOUT: %.loc20_11.2: %i32 = bind_value %.loc20_11.1 -// CHECK:STDOUT: return %.loc20_11.2 +// CHECK:STDOUT: %x.ref: %Class.elem.2d8 = name_ref x, @Class.%.loc6 [concrete = @Class.%.loc6] +// CHECK:STDOUT: %.loc10_11.1: ref %i32 = class_element_access %c.ref, element0 +// CHECK:STDOUT: %.loc10_11.2: %i32 = bind_value %.loc10_11.1 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc10_11.1: = bound_method %.loc10_11.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc10_11.2: = bound_method %.loc10_11.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc10_11.2(%.loc10_11.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @G(%T.loc23_6.2: type) { -// CHECK:STDOUT: %T.loc23_6.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc23_6.1 (constants.%T)] -// CHECK:STDOUT: %Class.loc23_26.1: type = class_type @Class, @Class(%T.loc23_6.1) [symbolic = %Class.loc23_26.1 (constants.%Class.fe1b2d.1)] -// CHECK:STDOUT: %pattern_type.loc23_16: type = pattern_type %Class.loc23_26.1 [symbolic = %pattern_type.loc23_16 (constants.%pattern_type.3c18fb.1)] -// CHECK:STDOUT: %pattern_type.loc23_29: type = pattern_type %T.loc23_6.1 [symbolic = %pattern_type.loc23_29 (constants.%pattern_type.7dcd0a.1)] +// CHECK:STDOUT: generic fn @G(%T.loc13_6.2: %Copy.type) { +// CHECK:STDOUT: %T.loc13_6.1: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc13_6.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc13_31.1: type = facet_access_type %T.loc13_6.1 [symbolic = %T.as_type.loc13_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %Class.loc13_31.1: type = class_type @Class, @Class(%T.as_type.loc13_31.1) [symbolic = %Class.loc13_31.1 (constants.%Class.b1d614.1)] +// CHECK:STDOUT: %pattern_type.loc13_21: type = pattern_type %Class.loc13_31.1 [symbolic = %pattern_type.loc13_21 (constants.%pattern_type.a8fce4.1)] +// CHECK:STDOUT: %pattern_type.loc13_34: type = pattern_type %T.as_type.loc13_31.1 [symbolic = %pattern_type.loc13_34 (constants.%pattern_type.f8cebc.2)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc23: = require_complete_type %Class.loc23_26.1 [symbolic = %require_complete.loc23 (constants.%require_complete.4f8a42.1)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class.loc23_26.1, %T.loc23_6.1 [symbolic = %Class.elem (constants.%Class.elem.e262de.1)] -// CHECK:STDOUT: %require_complete.loc24: = require_complete_type %T.loc23_6.1 [symbolic = %require_complete.loc24 (constants.%require_complete.4aeca8.1)] +// CHECK:STDOUT: %require_complete.loc13_34: = require_complete_type %T.as_type.loc13_31.1 [symbolic = %require_complete.loc13_34 (constants.%require_complete.ecc136.1)] +// CHECK:STDOUT: %require_complete.loc13_22: = require_complete_type %Class.loc13_31.1 [symbolic = %require_complete.loc13_22 (constants.%require_complete.57f28c.1)] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class.loc13_31.1, %T.as_type.loc13_31.1 [symbolic = %Class.elem (constants.%Class.elem.73af90.1)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %T.loc13_6.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.3ba2b3.1)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %T.as_type.loc13_31.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.72ea01.1)] +// CHECK:STDOUT: %.loc14_11.4: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc14_11.4 (constants.%.671c3a.1)] +// CHECK:STDOUT: %impl.elem0.loc14_11.2: @G.%.loc14_11.4 (%.671c3a.1) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc14_11.2 (constants.%impl.elem0.56eb4a.1)] +// CHECK:STDOUT: %specific_impl_fn.loc14_11.2: = specific_impl_function %impl.elem0.loc14_11.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc14_11.2 (constants.%specific_impl_fn.fb70c0.1)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%c.param: @G.%Class.loc23_26.1 (%Class.fe1b2d.1)) -> @G.%T.loc23_6.1 (%T) { +// CHECK:STDOUT: fn(%c.param: @G.%Class.loc13_31.1 (%Class.b1d614.1)) -> @G.%T.as_type.loc13_31.1 (%T.as_type) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %c.ref: @G.%Class.loc23_26.1 (%Class.fe1b2d.1) = name_ref c, %c -// CHECK:STDOUT: %x.ref: @G.%Class.elem (%Class.elem.e262de.1) = name_ref x, @Class.%.loc16 [concrete = @Class.%.loc16] -// CHECK:STDOUT: %.loc24_11.1: ref @G.%T.loc23_6.1 (%T) = class_element_access %c.ref, element0 -// CHECK:STDOUT: %.loc24_11.2: @G.%T.loc23_6.1 (%T) = bind_value %.loc24_11.1 -// CHECK:STDOUT: return %.loc24_11.2 +// CHECK:STDOUT: %c.ref: @G.%Class.loc13_31.1 (%Class.b1d614.1) = name_ref c, %c +// CHECK:STDOUT: %x.ref: @G.%Class.elem (%Class.elem.73af90.1) = name_ref x, @Class.%.loc6 [concrete = @Class.%.loc6] +// CHECK:STDOUT: %.loc14_11.1: ref @G.%T.as_type.loc13_31.1 (%T.as_type) = class_element_access %c.ref, element0 +// CHECK:STDOUT: %.loc14_11.2: @G.%T.as_type.loc13_31.1 (%T.as_type) = bind_value %.loc14_11.1 +// CHECK:STDOUT: %impl.elem0.loc14_11.1: @G.%.loc14_11.4 (%.671c3a.1) = impl_witness_access constants.%Copy.lookup_impl_witness.3ba2b3.1, element0 [symbolic = %impl.elem0.loc14_11.2 (constants.%impl.elem0.56eb4a.1)] +// CHECK:STDOUT: %bound_method.loc14_11.1: = bound_method %.loc14_11.2, %impl.elem0.loc14_11.1 +// CHECK:STDOUT: %specific_impl_fn.loc14_11.1: = specific_impl_function %impl.elem0.loc14_11.1, @Copy.Op(constants.%Copy.facet.72ea01.1) [symbolic = %specific_impl_fn.loc14_11.2 (constants.%specific_impl_fn.fb70c0.1)] +// CHECK:STDOUT: %bound_method.loc14_11.2: = bound_method %.loc14_11.2, %specific_impl_fn.loc14_11.1 +// CHECK:STDOUT: %.loc14_11.3: init @G.%T.as_type.loc13_31.1 (%T.as_type) = call %bound_method.loc14_11.2(%.loc14_11.2) +// CHECK:STDOUT: return %.loc14_11.3 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @H(%U.loc27_6.2: type) { -// CHECK:STDOUT: %U.loc27_6.1: type = bind_symbolic_name U, 0 [symbolic = %U.loc27_6.1 (constants.%U)] -// CHECK:STDOUT: %Class.loc27_26.1: type = class_type @Class, @Class(%U.loc27_6.1) [symbolic = %Class.loc27_26.1 (constants.%Class.fe1b2d.2)] -// CHECK:STDOUT: %pattern_type.loc27_16: type = pattern_type %Class.loc27_26.1 [symbolic = %pattern_type.loc27_16 (constants.%pattern_type.3c18fb.2)] -// CHECK:STDOUT: %pattern_type.loc27_29: type = pattern_type %U.loc27_6.1 [symbolic = %pattern_type.loc27_29 (constants.%pattern_type.7dcd0a.2)] +// CHECK:STDOUT: generic fn @H(%U.loc17_6.2: %Copy.type) { +// CHECK:STDOUT: %U.loc17_6.1: %Copy.type = bind_symbolic_name U, 0 [symbolic = %U.loc17_6.1 (constants.%U.578)] +// CHECK:STDOUT: %U.as_type.loc17_31.1: type = facet_access_type %U.loc17_6.1 [symbolic = %U.as_type.loc17_31.1 (constants.%U.as_type.565)] +// CHECK:STDOUT: %Class.loc17_31.1: type = class_type @Class, @Class(%U.as_type.loc17_31.1) [symbolic = %Class.loc17_31.1 (constants.%Class.b1d614.2)] +// CHECK:STDOUT: %pattern_type.loc17_21: type = pattern_type %Class.loc17_31.1 [symbolic = %pattern_type.loc17_21 (constants.%pattern_type.a8fce4.2)] +// CHECK:STDOUT: %pattern_type.loc17_34: type = pattern_type %U.as_type.loc17_31.1 [symbolic = %pattern_type.loc17_34 (constants.%pattern_type.f8cebc.3)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc27_29: = require_complete_type %U.loc27_6.1 [symbolic = %require_complete.loc27_29 (constants.%require_complete.4aeca8.2)] -// CHECK:STDOUT: %require_complete.loc27_17: = require_complete_type %Class.loc27_26.1 [symbolic = %require_complete.loc27_17 (constants.%require_complete.4f8a42.2)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class.loc27_26.1, %U.loc27_6.1 [symbolic = %Class.elem (constants.%Class.elem.e262de.2)] +// CHECK:STDOUT: %require_complete.loc17_34: = require_complete_type %U.as_type.loc17_31.1 [symbolic = %require_complete.loc17_34 (constants.%require_complete.ecc136.2)] +// CHECK:STDOUT: %require_complete.loc17_22: = require_complete_type %Class.loc17_31.1 [symbolic = %require_complete.loc17_22 (constants.%require_complete.57f28c.2)] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class.loc17_31.1, %U.as_type.loc17_31.1 [symbolic = %Class.elem (constants.%Class.elem.73af90.2)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %U.loc17_6.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.3ba2b3.2)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %U.as_type.loc17_31.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.72ea01.2)] +// CHECK:STDOUT: %.loc18_11.4: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc18_11.4 (constants.%.671c3a.2)] +// CHECK:STDOUT: %impl.elem0.loc18_11.2: @H.%.loc18_11.4 (%.671c3a.2) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc18_11.2 (constants.%impl.elem0.56eb4a.2)] +// CHECK:STDOUT: %specific_impl_fn.loc18_11.2: = specific_impl_function %impl.elem0.loc18_11.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc18_11.2 (constants.%specific_impl_fn.fb70c0.2)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%c.param: @H.%Class.loc27_26.1 (%Class.fe1b2d.2)) -> @H.%U.loc27_6.1 (%U) { +// CHECK:STDOUT: fn(%c.param: @H.%Class.loc17_31.1 (%Class.b1d614.2)) -> @H.%U.as_type.loc17_31.1 (%U.as_type.565) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %c.ref: @H.%Class.loc27_26.1 (%Class.fe1b2d.2) = name_ref c, %c -// CHECK:STDOUT: %x.ref: @H.%Class.elem (%Class.elem.e262de.2) = name_ref x, @Class.%.loc16 [concrete = @Class.%.loc16] -// CHECK:STDOUT: %.loc28_11.1: ref @H.%U.loc27_6.1 (%U) = class_element_access %c.ref, element0 -// CHECK:STDOUT: %.loc28_11.2: @H.%U.loc27_6.1 (%U) = bind_value %.loc28_11.1 -// CHECK:STDOUT: return %.loc28_11.2 +// CHECK:STDOUT: %c.ref: @H.%Class.loc17_31.1 (%Class.b1d614.2) = name_ref c, %c +// CHECK:STDOUT: %x.ref: @H.%Class.elem (%Class.elem.73af90.2) = name_ref x, @Class.%.loc6 [concrete = @Class.%.loc6] +// CHECK:STDOUT: %.loc18_11.1: ref @H.%U.as_type.loc17_31.1 (%U.as_type.565) = class_element_access %c.ref, element0 +// CHECK:STDOUT: %.loc18_11.2: @H.%U.as_type.loc17_31.1 (%U.as_type.565) = bind_value %.loc18_11.1 +// CHECK:STDOUT: %impl.elem0.loc18_11.1: @H.%.loc18_11.4 (%.671c3a.2) = impl_witness_access constants.%Copy.lookup_impl_witness.3ba2b3.2, element0 [symbolic = %impl.elem0.loc18_11.2 (constants.%impl.elem0.56eb4a.2)] +// CHECK:STDOUT: %bound_method.loc18_11.1: = bound_method %.loc18_11.2, %impl.elem0.loc18_11.1 +// CHECK:STDOUT: %specific_impl_fn.loc18_11.1: = specific_impl_function %impl.elem0.loc18_11.1, @Copy.Op(constants.%Copy.facet.72ea01.2) [symbolic = %specific_impl_fn.loc18_11.2 (constants.%specific_impl_fn.fb70c0.2)] +// CHECK:STDOUT: %bound_method.loc18_11.2: = bound_method %.loc18_11.2, %specific_impl_fn.loc18_11.1 +// CHECK:STDOUT: %.loc18_11.3: init @H.%U.as_type.loc17_31.1 (%U.as_type.565) = call %bound_method.loc18_11.2(%.loc18_11.2) +// CHECK:STDOUT: return %.loc18_11.3 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T) { -// CHECK:STDOUT: %T.loc15_13.1 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4aeca8.1 -// CHECK:STDOUT: %Class => constants.%Class.fe1b2d.1 -// CHECK:STDOUT: %Class.elem => constants.%Class.elem.e262de.1 -// CHECK:STDOUT: %struct_type.x => constants.%struct_type.x.2ac3f0.1 -// CHECK:STDOUT: %complete_type.loc17_1.2 => constants.%complete_type.4339b3.1 +// CHECK:STDOUT: specific @Class(constants.%T.8b3) { +// CHECK:STDOUT: %T.loc5_13.1 => constants.%T.8b3 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Class => constants.%Class.fe1b2d.1 +// CHECK:STDOUT: specific @Class.as.Destroy.impl(constants.%T.8b3) { +// CHECK:STDOUT: %T => constants.%T.8b3 +// CHECK:STDOUT: %Class => constants.%Class.fe1 // CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Class => constants.%Class.fe1b2d.1 +// CHECK:STDOUT: specific @Class.as.Destroy.impl.Op(constants.%T.8b3) { +// CHECK:STDOUT: %T => constants.%T.8b3 +// CHECK:STDOUT: %Class => constants.%Class.fe1 // CHECK:STDOUT: %ptr => constants.%ptr.955 // CHECK:STDOUT: %pattern_type => constants.%pattern_type.9e0 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Class(constants.%i32) { -// CHECK:STDOUT: %T.loc15_13.1 => constants.%i32 +// CHECK:STDOUT: %T.loc5_13.1 => constants.%i32 // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.f8a // CHECK:STDOUT: %Class => constants.%Class.247 // CHECK:STDOUT: %Class.elem => constants.%Class.elem.2d8 // CHECK:STDOUT: %struct_type.x => constants.%struct_type.x.ed6 -// CHECK:STDOUT: %complete_type.loc17_1.2 => constants.%complete_type.1ec +// CHECK:STDOUT: %complete_type.loc7_1.2 => constants.%complete_type.1ec // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @G(constants.%T) { -// CHECK:STDOUT: %T.loc23_6.1 => constants.%T -// CHECK:STDOUT: %Class.loc23_26.1 => constants.%Class.fe1b2d.1 -// CHECK:STDOUT: %pattern_type.loc23_16 => constants.%pattern_type.3c18fb.1 -// CHECK:STDOUT: %pattern_type.loc23_29 => constants.%pattern_type.7dcd0a.1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%U) { -// CHECK:STDOUT: %T.loc15_13.1 => constants.%U +// CHECK:STDOUT: specific @Class(constants.%T.as_type) { +// CHECK:STDOUT: %T.loc5_13.1 => constants.%T.as_type // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4aeca8.2 -// CHECK:STDOUT: %Class => constants.%Class.fe1b2d.2 -// CHECK:STDOUT: %Class.elem => constants.%Class.elem.e262de.2 -// CHECK:STDOUT: %struct_type.x => constants.%struct_type.x.2ac3f0.2 -// CHECK:STDOUT: %complete_type.loc17_1.2 => constants.%complete_type.4339b3.2 +// CHECK:STDOUT: %require_complete => constants.%require_complete.ecc136.1 +// CHECK:STDOUT: %Class => constants.%Class.b1d614.1 +// CHECK:STDOUT: %Class.elem => constants.%Class.elem.73af90.1 +// CHECK:STDOUT: %struct_type.x => constants.%struct_type.x.7033a4.1 +// CHECK:STDOUT: %complete_type.loc7_1.2 => constants.%complete_type.a8b764.1 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @H(constants.%U) { -// CHECK:STDOUT: %U.loc27_6.1 => constants.%U -// CHECK:STDOUT: %Class.loc27_26.1 => constants.%Class.fe1b2d.2 -// CHECK:STDOUT: %pattern_type.loc27_16 => constants.%pattern_type.3c18fb.2 -// CHECK:STDOUT: %pattern_type.loc27_29 => constants.%pattern_type.7dcd0a.2 +// CHECK:STDOUT: specific @G(constants.%T.578) { +// CHECK:STDOUT: %T.loc13_6.1 => constants.%T.578 +// CHECK:STDOUT: %T.as_type.loc13_31.1 => constants.%T.as_type +// CHECK:STDOUT: %Class.loc13_31.1 => constants.%Class.b1d614.1 +// CHECK:STDOUT: %pattern_type.loc13_21 => constants.%pattern_type.a8fce4.1 +// CHECK:STDOUT: %pattern_type.loc13_34 => constants.%pattern_type.f8cebc.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Class(constants.%U.as_type.565) { +// CHECK:STDOUT: %T.loc5_13.1 => constants.%U.as_type.565 +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete => constants.%require_complete.ecc136.2 +// CHECK:STDOUT: %Class => constants.%Class.b1d614.2 +// CHECK:STDOUT: %Class.elem => constants.%Class.elem.73af90.2 +// CHECK:STDOUT: %struct_type.x => constants.%struct_type.x.7033a4.2 +// CHECK:STDOUT: %complete_type.loc7_1.2 => constants.%complete_type.a8b764.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @H(constants.%U.578) { +// CHECK:STDOUT: %U.loc17_6.1 => constants.%U.578 +// CHECK:STDOUT: %U.as_type.loc17_31.1 => constants.%U.as_type.565 +// CHECK:STDOUT: %Class.loc17_31.1 => constants.%Class.b1d614.2 +// CHECK:STDOUT: %pattern_type.loc17_21 => constants.%pattern_type.a8fce4.2 +// CHECK:STDOUT: %pattern_type.loc17_34 => constants.%pattern_type.f8cebc.3 // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/import.carbon b/toolchain/check/testdata/class/generic/import.carbon index c371b43fc336..7f1ac826e18a 100644 --- a/toolchain/check/testdata/class/generic/import.carbon +++ b/toolchain/check/testdata/class/generic/import.carbon @@ -271,9 +271,8 @@ class Class(U:! type) { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc8_27.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc8_27.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc8_27.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc8_27.2: %i32 = converted %int_0, %.loc8_27.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: return %.loc8_27.2 +// CHECK:STDOUT: %.loc8: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] +// CHECK:STDOUT: return %.loc8 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -644,6 +643,7 @@ class Class(U:! type) { // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %UseMethod.type: type = fn_type @UseMethod [concrete] @@ -652,10 +652,10 @@ class Class(U:! type) { // CHECK:STDOUT: %CompleteClass.generic: %CompleteClass.type = struct_value () [concrete] // CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %i32} [concrete] // CHECK:STDOUT: %complete_type.54b: = complete_type_witness %struct_type.n [concrete] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %CompleteClass.f97: type = class_type @CompleteClass, @CompleteClass(%T) [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %CompleteClass.f97: type = class_type @CompleteClass, @CompleteClass(%T.8b3) [symbolic] // CHECK:STDOUT: %CompleteClass.elem.28a: type = unbound_element_type %CompleteClass.f97, %i32 [symbolic] -// CHECK:STDOUT: %CompleteClass.F.type.14f: type = fn_type @CompleteClass.F, @CompleteClass(%T) [symbolic] +// CHECK:STDOUT: %CompleteClass.F.type.14f: type = fn_type @CompleteClass.F, @CompleteClass(%T.8b3) [symbolic] // CHECK:STDOUT: %CompleteClass.F.874: %CompleteClass.F.type.14f = struct_value () [symbolic] // CHECK:STDOUT: %CompleteClass.e9e: type = class_type @CompleteClass, @CompleteClass(%i32) [concrete] // CHECK:STDOUT: %CompleteClass.elem.7fc: type = unbound_element_type %CompleteClass.e9e, %i32 [concrete] @@ -666,8 +666,8 @@ class Class(U:! type) { // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %CompleteClass.F.specific_fn: = specific_function %CompleteClass.F.f7c, @CompleteClass.F(%i32) [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] -// CHECK:STDOUT: %Destroy.impl_witness.d93: = impl_witness imports.%Destroy.impl_witness_table.727, @CompleteClass.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %CompleteClass.as.Destroy.impl.Op.type.1a6: type = fn_type @CompleteClass.as.Destroy.impl.Op, @CompleteClass.as.Destroy.impl(%T) [symbolic] +// CHECK:STDOUT: %Destroy.impl_witness.d93: = impl_witness imports.%Destroy.impl_witness_table.727, @CompleteClass.as.Destroy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %CompleteClass.as.Destroy.impl.Op.type.1a6: type = fn_type @CompleteClass.as.Destroy.impl.Op, @CompleteClass.as.Destroy.impl(%T.8b3) [symbolic] // CHECK:STDOUT: %CompleteClass.as.Destroy.impl.Op.acd: %CompleteClass.as.Destroy.impl.Op.type.1a6 = struct_value () [symbolic] // CHECK:STDOUT: %ptr.5b4: type = ptr_type %CompleteClass.f97 [symbolic] // CHECK:STDOUT: %pattern_type.1fe: type = pattern_type %ptr.5b4 [symbolic] @@ -679,6 +679,16 @@ class Class(U:! type) { // CHECK:STDOUT: %CompleteClass.as.Destroy.impl.Op.specific_fn: = specific_function %CompleteClass.as.Destroy.impl.Op.5fe, @CompleteClass.as.Destroy.impl.Op(%i32) [concrete] // CHECK:STDOUT: %UseField.type: type = fn_type @UseField [concrete] // CHECK:STDOUT: %UseField: %UseField.type = struct_value () [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -688,25 +698,29 @@ class Class(U:! type) { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Main.import_ref.5ab3ec.1: type = import_ref Main//foo, loc6_21, loaded [symbolic = @CompleteClass.%T (constants.%T)] +// CHECK:STDOUT: %Main.import_ref.5ab3ec.1: type = import_ref Main//foo, loc6_21, loaded [symbolic = @CompleteClass.%T (constants.%T.8b3)] // CHECK:STDOUT: %Main.import_ref.eb1: = import_ref Main//foo, loc9_1, loaded [concrete = constants.%complete_type.54b] // CHECK:STDOUT: %Main.import_ref.3c0 = import_ref Main//foo, inst37 [no loc], unloaded // CHECK:STDOUT: %Main.import_ref.e76: @CompleteClass.%CompleteClass.elem (%CompleteClass.elem.28a) = import_ref Main//foo, loc7_8, loaded [concrete = %.364] // CHECK:STDOUT: %Main.import_ref.a52: @CompleteClass.%CompleteClass.F.type (%CompleteClass.F.type.14f) = import_ref Main//foo, loc8_17, loaded [symbolic = @CompleteClass.%CompleteClass.F (constants.%CompleteClass.F.874)] -// CHECK:STDOUT: %Main.import_ref.5ab3ec.2: type = import_ref Main//foo, loc6_21, loaded [symbolic = @CompleteClass.%T (constants.%T)] +// CHECK:STDOUT: %Main.import_ref.5ab3ec.2: type = import_ref Main//foo, loc6_21, loaded [symbolic = @CompleteClass.%T (constants.%T.8b3)] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: %Main.import_ref.a31: = import_ref Main//foo, loc6_31, loaded [symbolic = @CompleteClass.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness.d93)] -// CHECK:STDOUT: %Main.import_ref.5ab3ec.3: type = import_ref Main//foo, loc6_21, loaded [symbolic = @CompleteClass.%T (constants.%T)] +// CHECK:STDOUT: %Main.import_ref.5ab3ec.3: type = import_ref Main//foo, loc6_21, loaded [symbolic = @CompleteClass.%T (constants.%T.8b3)] // CHECK:STDOUT: %Main.import_ref.e27: type = import_ref Main//foo, loc6_31, loaded [symbolic = @CompleteClass.as.Destroy.impl.%CompleteClass (constants.%CompleteClass.f97)] // CHECK:STDOUT: %Main.import_ref.063: type = import_ref Main//foo, inst82 [no loc], loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: %Main.import_ref.b2b: @CompleteClass.as.Destroy.impl.%CompleteClass.as.Destroy.impl.Op.type (%CompleteClass.as.Destroy.impl.Op.type.1a6) = import_ref Main//foo, loc6_31, loaded [symbolic = @CompleteClass.as.Destroy.impl.%CompleteClass.as.Destroy.impl.Op (constants.%CompleteClass.as.Destroy.impl.Op.acd)] // CHECK:STDOUT: %Destroy.impl_witness_table.727 = impl_witness_table (%Main.import_ref.b2b), @CompleteClass.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Main.import_ref.5ab3ec.4: type = import_ref Main//foo, loc6_21, loaded [symbolic = @CompleteClass.%T (constants.%T)] +// CHECK:STDOUT: %Main.import_ref.5ab3ec.4: type = import_ref Main//foo, loc6_21, loaded [symbolic = @CompleteClass.%T (constants.%T.8b3)] // CHECK:STDOUT: %.364: @CompleteClass.%CompleteClass.elem (%CompleteClass.elem.28a) = field_decl n, element0 [concrete] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -741,7 +755,7 @@ class Class(U:! type) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @CompleteClass.as.Destroy.impl(imports.%Main.import_ref.5ab3ec.3: type) [from "foo.carbon"] { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] // CHECK:STDOUT: %CompleteClass: type = class_type @CompleteClass, @CompleteClass(%T) [symbolic = %CompleteClass (constants.%CompleteClass.f97)] // CHECK:STDOUT: %Destroy.impl_witness: = impl_witness imports.%Destroy.impl_witness_table.727, @CompleteClass.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.d93)] // CHECK:STDOUT: @@ -756,7 +770,7 @@ class Class(U:! type) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic class @CompleteClass(imports.%Main.import_ref.5ab3ec.1: type) [from "foo.carbon"] { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %CompleteClass: type = class_type @CompleteClass, @CompleteClass(%T) [symbolic = %CompleteClass (constants.%CompleteClass.f97)] @@ -793,18 +807,16 @@ class Class(U:! type) { // CHECK:STDOUT: } // CHECK:STDOUT: %v: ref %CompleteClass.e9e = bind_name v, %v.var // CHECK:STDOUT: %v.ref: ref %CompleteClass.e9e = name_ref v, %v -// CHECK:STDOUT: %.loc7_11: %CompleteClass.F.type.1bc = specific_constant imports.%Main.import_ref.a52, @CompleteClass(constants.%i32) [concrete = constants.%CompleteClass.F.f7c] -// CHECK:STDOUT: %F.ref.loc7: %CompleteClass.F.type.1bc = name_ref F, %.loc7_11 [concrete = constants.%CompleteClass.F.f7c] +// CHECK:STDOUT: %.loc7: %CompleteClass.F.type.1bc = specific_constant imports.%Main.import_ref.a52, @CompleteClass(constants.%i32) [concrete = constants.%CompleteClass.F.f7c] +// CHECK:STDOUT: %F.ref.loc7: %CompleteClass.F.type.1bc = name_ref F, %.loc7 [concrete = constants.%CompleteClass.F.f7c] // CHECK:STDOUT: %CompleteClass.F.specific_fn: = specific_function %F.ref.loc7, @CompleteClass.F(constants.%i32) [concrete = constants.%CompleteClass.F.specific_fn] // CHECK:STDOUT: %CompleteClass.F.call: init %i32 = call %CompleteClass.F.specific_fn() -// CHECK:STDOUT: %.loc7_15.1: %i32 = value_of_initializer %CompleteClass.F.call -// CHECK:STDOUT: %.loc7_15.2: %i32 = converted %CompleteClass.F.call, %.loc7_15.1 // CHECK:STDOUT: %CompleteClass.as.Destroy.impl.Op.bound: = bound_method %v.var, constants.%CompleteClass.as.Destroy.impl.Op.5fe // CHECK:STDOUT: %CompleteClass.as.Destroy.impl.Op.specific_fn: = specific_function constants.%CompleteClass.as.Destroy.impl.Op.5fe, @CompleteClass.as.Destroy.impl.Op(constants.%i32) [concrete = constants.%CompleteClass.as.Destroy.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method: = bound_method %v.var, %CompleteClass.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr: %ptr.a97 = addr_of %v.var // CHECK:STDOUT: %CompleteClass.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method(%addr) -// CHECK:STDOUT: return %.loc7_15.2 +// CHECK:STDOUT: return %CompleteClass.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @CompleteClass.F(imports.%Main.import_ref.5ab3ec.2: type) [from "foo.carbon"] { @@ -816,7 +828,7 @@ class Class(U:! type) { // CHECK:STDOUT: fn @F [from "foo.carbon"]; // CHECK:STDOUT: // CHECK:STDOUT: generic fn @CompleteClass.as.Destroy.impl.Op(imports.%Main.import_ref.5ab3ec.4: type) [from "foo.carbon"] { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] // CHECK:STDOUT: %CompleteClass: type = class_type @CompleteClass, @CompleteClass(%T) [symbolic = %CompleteClass (constants.%CompleteClass.f97)] // CHECK:STDOUT: %ptr: type = ptr_type %CompleteClass [symbolic = %ptr (constants.%ptr.5b4)] // CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.1fe)] @@ -848,16 +860,21 @@ class Class(U:! type) { // CHECK:STDOUT: %n.ref: %CompleteClass.elem.7fc = name_ref n, imports.%Main.import_ref.e76 [concrete = imports.%.364] // CHECK:STDOUT: %.loc12_11.1: ref %i32 = class_element_access %v.ref, element0 // CHECK:STDOUT: %.loc12_11.2: %i32 = bind_value %.loc12_11.1 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc12_11.1: = bound_method %.loc12_11.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc12_11.2: = bound_method %.loc12_11.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc12_11.2(%.loc12_11.2) // CHECK:STDOUT: %CompleteClass.as.Destroy.impl.Op.bound: = bound_method %v.var, constants.%CompleteClass.as.Destroy.impl.Op.5fe // CHECK:STDOUT: %CompleteClass.as.Destroy.impl.Op.specific_fn: = specific_function constants.%CompleteClass.as.Destroy.impl.Op.5fe, @CompleteClass.as.Destroy.impl.Op(constants.%i32) [concrete = constants.%CompleteClass.as.Destroy.impl.Op.specific_fn] -// CHECK:STDOUT: %bound_method: = bound_method %v.var, %CompleteClass.as.Destroy.impl.Op.specific_fn +// CHECK:STDOUT: %bound_method.loc11: = bound_method %v.var, %CompleteClass.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr: %ptr.a97 = addr_of %v.var -// CHECK:STDOUT: %CompleteClass.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method(%addr) -// CHECK:STDOUT: return %.loc12_11.2 +// CHECK:STDOUT: %CompleteClass.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc11(%addr) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @CompleteClass(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @CompleteClass(constants.%T.8b3) { +// CHECK:STDOUT: %T => constants.%T.8b3 // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %CompleteClass => constants.%CompleteClass.f97 @@ -866,7 +883,7 @@ class Class(U:! type) { // CHECK:STDOUT: %CompleteClass.F => constants.%CompleteClass.F.874 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @CompleteClass.F(constants.%T) {} +// CHECK:STDOUT: specific @CompleteClass.F(constants.%T.8b3) {} // CHECK:STDOUT: // CHECK:STDOUT: specific @CompleteClass(constants.%i32) { // CHECK:STDOUT: %T => constants.%i32 @@ -882,14 +899,14 @@ class Class(U:! type) { // CHECK:STDOUT: !definition: // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @CompleteClass.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @CompleteClass.as.Destroy.impl(constants.%T.8b3) { +// CHECK:STDOUT: %T => constants.%T.8b3 // CHECK:STDOUT: %CompleteClass => constants.%CompleteClass.f97 // CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness.d93 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @CompleteClass.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @CompleteClass.as.Destroy.impl.Op(constants.%T.8b3) { +// CHECK:STDOUT: %T => constants.%T.8b3 // CHECK:STDOUT: %CompleteClass => constants.%CompleteClass.f97 // CHECK:STDOUT: %ptr => constants.%ptr.5b4 // CHECK:STDOUT: %pattern_type => constants.%pattern_type.1fe diff --git a/toolchain/check/testdata/class/generic/init.carbon b/toolchain/check/testdata/class/generic/init.carbon index 91b7e88630e0..cc3f6ed7737b 100644 --- a/toolchain/check/testdata/class/generic/init.carbon +++ b/toolchain/check/testdata/class/generic/init.carbon @@ -3,8 +3,6 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // // INCLUDE-FILE: toolchain/testing/testdata/min_prelude/int.carbon -// TODO: Add ranges and switch to "--dump-sem-ir-ranges=only". -// EXTRA-ARGS: --dump-sem-ir-ranges=if-present // // AUTOUPDATE // TIP: To test this file alone, run: @@ -20,6 +18,7 @@ class Class(T:! type) { var k: T; } +//@dump-sem-ir-begin fn InitFromStructGeneric(T:! Core.Copy, x: T) -> T { var v: Class(T) = {.k = x}; return v.k; @@ -29,6 +28,7 @@ fn InitFromStructSpecific(x: i32) -> i32 { var v: Class(i32) = {.k = x}; return v.k; } +//@dump-sem-ir-end // --- adapt.carbon @@ -38,37 +38,24 @@ class Adapt(T:! type) { adapt T; } -fn InitFromAdaptedGeneric(T:! type, x: T) -> T { +//@dump-sem-ir-begin +fn InitFromAdaptedGeneric(T:! Core.Copy, x: T) -> T { return (x as Adapt(T)) as T; } fn InitFromAdaptedSpecific(x: i32) -> i32 { return (x as Adapt(i32)) as i32; } +//@dump-sem-ir-end // CHECK:STDOUT: --- from_struct.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] -// CHECK:STDOUT: %Class.fe1: type = class_type @Class, @Class(%T.8b3) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T.8b3 [symbolic] -// CHECK:STDOUT: %Class.elem.e26: type = unbound_element_type %Class.fe1, %T.8b3 [symbolic] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %Destroy.Op.type: type = fn_type @Destroy.Op [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness.d1e: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T.8b3) [symbolic] -// CHECK:STDOUT: %ptr.955: type = ptr_type %Class.fe1 [symbolic] -// CHECK:STDOUT: %pattern_type.9e0: type = pattern_type %ptr.955 [symbolic] -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.type.412: type = fn_type @Class.as.Destroy.impl.Op, @Class.as.Destroy.impl(%T.8b3) [symbolic] -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.9bc: %Class.as.Destroy.impl.Op.type.412 = struct_value () [symbolic] -// CHECK:STDOUT: %struct_type.k.b21: type = struct_type {.k: %T.8b3} [symbolic] -// CHECK:STDOUT: %complete_type.b9e: = complete_type_witness %struct_type.k.b21 [symbolic] // CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] // CHECK:STDOUT: %T.578: %Copy.type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %pattern_type.ce2: type = pattern_type %Copy.type [concrete] @@ -80,7 +67,6 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: %Class.b1d: type = class_type @Class, @Class(%T.as_type) [symbolic] // CHECK:STDOUT: %Class.elem.73a: type = unbound_element_type %Class.b1d, %T.as_type [symbolic] // CHECK:STDOUT: %struct_type.k.c03: type = struct_type {.k: %T.as_type} [symbolic] -// CHECK:STDOUT: %complete_type.cdd: = complete_type_witness %struct_type.k.c03 [symbolic] // CHECK:STDOUT: %require_complete.57f: = require_complete_type %Class.b1d [symbolic] // CHECK:STDOUT: %pattern_type.a8f: type = pattern_type %Class.b1d [symbolic] // CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] @@ -95,7 +81,6 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: %Destroy.facet.744: %Destroy.type = facet_value %Class.b1d, (%Destroy.impl_witness.492) [symbolic] // CHECK:STDOUT: %.c08: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.744 [symbolic] // CHECK:STDOUT: %ptr.458: type = ptr_type %Class.b1d [symbolic] -// CHECK:STDOUT: %pattern_type.20e: type = pattern_type %ptr.458 [symbolic] // CHECK:STDOUT: %Class.as.Destroy.impl.Op.specific_fn.df2: = specific_function %Class.as.Destroy.impl.Op.598, @Class.as.Destroy.impl.Op(%T.as_type) [symbolic] // CHECK:STDOUT: %require_complete.ec5: = require_complete_type %ptr.458 [symbolic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] @@ -106,12 +91,9 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %InitFromStructSpecific.type: type = fn_type @InitFromStructSpecific [concrete] // CHECK:STDOUT: %InitFromStructSpecific: %InitFromStructSpecific.type = struct_value () [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %Class.247: type = class_type @Class, @Class(%i32) [concrete] // CHECK:STDOUT: %Class.elem.2d8: type = unbound_element_type %Class.247, %i32 [concrete] // CHECK:STDOUT: %struct_type.k.0bf: type = struct_type {.k: %i32} [concrete] -// CHECK:STDOUT: %complete_type.954: = complete_type_witness %struct_type.k.0bf [concrete] // CHECK:STDOUT: %pattern_type.0fa: type = pattern_type %Class.247 [concrete] // CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] // CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] @@ -121,12 +103,9 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] // CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] // CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] -// CHECK:STDOUT: %Destroy.impl_witness.ea6: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%i32) [concrete] // CHECK:STDOUT: %Class.as.Destroy.impl.Op.type.ce6: type = fn_type @Class.as.Destroy.impl.Op, @Class.as.Destroy.impl(%i32) [concrete] // CHECK:STDOUT: %Class.as.Destroy.impl.Op.831: %Class.as.Destroy.impl.Op.type.ce6 = struct_value () [concrete] // CHECK:STDOUT: %ptr.f7c: type = ptr_type %Class.247 [concrete] -// CHECK:STDOUT: %pattern_type.14a: type = pattern_type %ptr.f7c [concrete] -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.specific_fn.213: = specific_function %Class.as.Destroy.impl.Op.831, @Class.as.Destroy.impl.Op(%i32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -145,44 +124,31 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .InitFromStructGeneric = %InitFromStructGeneric.decl -// CHECK:STDOUT: .InitFromStructSpecific = %InitFromStructSpecific.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.1 (constants.%T.8b3)] -// CHECK:STDOUT: } // CHECK:STDOUT: %InitFromStructGeneric.decl: %InitFromStructGeneric.type = fn_decl @InitFromStructGeneric [concrete = constants.%InitFromStructGeneric] { // CHECK:STDOUT: %T.patt: %pattern_type.ce2 = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @InitFromStructGeneric.%pattern_type.loc8 (%pattern_type.f8cebc.1) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @InitFromStructGeneric.%pattern_type.loc8 (%pattern_type.f8cebc.1) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @InitFromStructGeneric.%pattern_type.loc8 (%pattern_type.f8cebc.1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @InitFromStructGeneric.%pattern_type.loc8 (%pattern_type.f8cebc.1) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %x.patt: @InitFromStructGeneric.%pattern_type.loc9 (%pattern_type.f8cebc.1) = binding_pattern x [concrete] +// CHECK:STDOUT: %x.param_patt: @InitFromStructGeneric.%pattern_type.loc9 (%pattern_type.f8cebc.1) = value_param_pattern %x.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @InitFromStructGeneric.%pattern_type.loc9 (%pattern_type.f8cebc.1) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @InitFromStructGeneric.%pattern_type.loc9 (%pattern_type.f8cebc.1) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc8_50: %Copy.type = name_ref T, %T.loc8_26.2 [symbolic = %T.loc8_26.1 (constants.%T.578)] -// CHECK:STDOUT: %T.as_type.loc8_50: type = facet_access_type %T.ref.loc8_50 [symbolic = %T.as_type.loc8_44.1 (constants.%T.as_type)] -// CHECK:STDOUT: %.loc8_50: type = converted %T.ref.loc8_50, %T.as_type.loc8_50 [symbolic = %T.as_type.loc8_44.1 (constants.%T.as_type)] -// CHECK:STDOUT: %.loc8_34: type = splice_block %Copy.ref [concrete = constants.%Copy.type] { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %T.ref.loc9_50: %Copy.type = name_ref T, %T.loc9_26.2 [symbolic = %T.loc9_26.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc9_50: type = facet_access_type %T.ref.loc9_50 [symbolic = %T.as_type.loc9_44.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc9_50: type = converted %T.ref.loc9_50, %T.as_type.loc9_50 [symbolic = %T.as_type.loc9_44.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc9_34: type = splice_block %Copy.ref [concrete = constants.%Copy.type] { +// CHECK:STDOUT: // CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core [concrete = imports.%Core] // CHECK:STDOUT: %Copy.ref: type = name_ref Copy, imports.%Core.Copy [concrete = constants.%Copy.type] // CHECK:STDOUT: } -// CHECK:STDOUT: %T.loc8_26.2: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc8_26.1 (constants.%T.578)] -// CHECK:STDOUT: %x.param: @InitFromStructGeneric.%T.as_type.loc8_44.1 (%T.as_type) = value_param call_param0 -// CHECK:STDOUT: %.loc8_44.1: type = splice_block %.loc8_44.2 [symbolic = %T.as_type.loc8_44.1 (constants.%T.as_type)] { -// CHECK:STDOUT: %T.ref.loc8_44: %Copy.type = name_ref T, %T.loc8_26.2 [symbolic = %T.loc8_26.1 (constants.%T.578)] -// CHECK:STDOUT: %T.as_type.loc8_44.2: type = facet_access_type %T.ref.loc8_44 [symbolic = %T.as_type.loc8_44.1 (constants.%T.as_type)] -// CHECK:STDOUT: %.loc8_44.2: type = converted %T.ref.loc8_44, %T.as_type.loc8_44.2 [symbolic = %T.as_type.loc8_44.1 (constants.%T.as_type)] +// CHECK:STDOUT: %T.loc9_26.2: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc9_26.1 (constants.%T.578)] +// CHECK:STDOUT: %x.param: @InitFromStructGeneric.%T.as_type.loc9_44.1 (%T.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc9_44.1: type = splice_block %.loc9_44.2 [symbolic = %T.as_type.loc9_44.1 (constants.%T.as_type)] { +// CHECK:STDOUT: %T.ref.loc9_44: %Copy.type = name_ref T, %T.loc9_26.2 [symbolic = %T.loc9_26.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc9_44.2: type = facet_access_type %T.ref.loc9_44 [symbolic = %T.as_type.loc9_44.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc9_44.2: type = converted %T.ref.loc9_44, %T.as_type.loc9_44.2 [symbolic = %T.as_type.loc9_44.1 (constants.%T.as_type)] // CHECK:STDOUT: } -// CHECK:STDOUT: %x: @InitFromStructGeneric.%T.as_type.loc8_44.1 (%T.as_type) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @InitFromStructGeneric.%T.as_type.loc8_44.1 (%T.as_type) = out_param call_param1 -// CHECK:STDOUT: %return: ref @InitFromStructGeneric.%T.as_type.loc8_44.1 (%T.as_type) = return_slot %return.param +// CHECK:STDOUT: %x: @InitFromStructGeneric.%T.as_type.loc9_44.1 (%T.as_type) = bind_name x, %x.param +// CHECK:STDOUT: %return.param: ref @InitFromStructGeneric.%T.as_type.loc9_44.1 (%T.as_type) = out_param call_param1 +// CHECK:STDOUT: %return: ref @InitFromStructGeneric.%T.as_type.loc9_44.1 (%T.as_type) = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: %InitFromStructSpecific.decl: %InitFromStructSpecific.type = fn_decl @InitFromStructSpecific [concrete = constants.%InitFromStructSpecific] { // CHECK:STDOUT: %x.patt: %pattern_type.7ce = binding_pattern x [concrete] @@ -190,12 +156,12 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc13_38: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13_38: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc14_38: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc14_38: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %x.param: %i32 = value_param call_param0 -// CHECK:STDOUT: %.loc13: type = splice_block %i32.loc13_30 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc13_30: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13_30: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %.loc14: type = splice_block %i32.loc14_30 [concrete = constants.%i32] { +// CHECK:STDOUT: %int_32.loc14_30: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc14_30: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: } // CHECK:STDOUT: %x: %i32 = bind_name x, %x.param // CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 @@ -203,137 +169,75 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic impl @Class.as.Destroy.impl(@Class.%T.loc4_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.d1e)] +// CHECK:STDOUT: generic fn @InitFromStructGeneric(%T.loc9_26.2: %Copy.type) { +// CHECK:STDOUT: %T.loc9_26.1: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc9_26.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc9_44.1: type = facet_access_type %T.loc9_26.1 [symbolic = %T.as_type.loc9_44.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type.loc9: type = pattern_type %T.as_type.loc9_44.1 [symbolic = %pattern_type.loc9 (constants.%pattern_type.f8cebc.1)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.type: type = fn_type @Class.as.Destroy.impl.Op, @Class.as.Destroy.impl(%T) [symbolic = %Class.as.Destroy.impl.Op.type (constants.%Class.as.Destroy.impl.Op.type.412)] -// CHECK:STDOUT: %Class.as.Destroy.impl.Op: @Class.as.Destroy.impl.%Class.as.Destroy.impl.Op.type (%Class.as.Destroy.impl.Op.type.412) = struct_value () [symbolic = %Class.as.Destroy.impl.Op (constants.%Class.as.Destroy.impl.Op.9bc)] -// CHECK:STDOUT: -// CHECK:STDOUT: impl: @Class.%Self.ref as constants.%Destroy.type { -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.decl: @Class.as.Destroy.impl.%Class.as.Destroy.impl.Op.type (%Class.as.Destroy.impl.Op.type.412) = fn_decl @Class.as.Destroy.impl.Op [symbolic = @Class.as.Destroy.impl.%Class.as.Destroy.impl.Op (constants.%Class.as.Destroy.impl.Op.9bc)] { -// CHECK:STDOUT: %self.patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.9e0) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.9e0) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc4_23.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.955) = value_param call_param0 -// CHECK:STDOUT: %.loc4_23.2: type = splice_block %Self.ref [symbolic = %Class (constants.%Class.fe1)] { -// CHECK:STDOUT: %.loc4_23.3: type = specific_constant constants.%Class.fe1, @Class(constants.%T.8b3) [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc4_23.3 [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Class.as.Destroy.impl.Op.%ptr (%ptr.955) = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Op = %Class.as.Destroy.impl.Op.decl -// CHECK:STDOUT: witness = @Class.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc4_13.2: type) { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.1 (constants.%T.8b3)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_13.1 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc4_13.1) [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.loc4_13.1 [symbolic = %Class.elem (constants.%Class.elem.e26)] -// CHECK:STDOUT: %struct_type.k: type = struct_type {.k: @Class.%T.loc4_13.1 (%T.8b3)} [symbolic = %struct_type.k (constants.%struct_type.k.b21)] -// CHECK:STDOUT: %complete_type.loc6_1.2: = complete_type_witness %struct_type.k [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.b9e)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_13.2 [symbolic = %T.loc4_13.1 (constants.%T.8b3)] -// CHECK:STDOUT: %.loc5: @Class.%Class.elem (%Class.elem.e26) = field_decl k, element0 [concrete] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Class.fe1 [symbolic = @Class.as.Destroy.impl.%Class (constants.%Class.fe1)] -// CHECK:STDOUT: impl_decl @Class.as.Destroy.impl [concrete] {} {} -// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Class.as.Destroy.impl.%Class.as.Destroy.impl.Op.decl), @Class.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Class.as.Destroy.impl(constants.%T.8b3) [symbolic = @Class.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness.d1e)] -// CHECK:STDOUT: %complete_type.loc6_1.1: = complete_type_witness constants.%struct_type.k.b21 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.b9e)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc6_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class.fe1 -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .k = %.loc5 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Class.as.Destroy.impl.Op(@Class.%T.loc4_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %ptr: type = ptr_type %Class [symbolic = %ptr (constants.%ptr.955)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.9e0)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.955)) = "no_op"; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @InitFromStructGeneric(%T.loc8_26.2: %Copy.type) { -// CHECK:STDOUT: %T.loc8_26.1: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc8_26.1 (constants.%T.578)] -// CHECK:STDOUT: %T.as_type.loc8_44.1: type = facet_access_type %T.loc8_26.1 [symbolic = %T.as_type.loc8_44.1 (constants.%T.as_type)] -// CHECK:STDOUT: %pattern_type.loc8: type = pattern_type %T.as_type.loc8_44.1 [symbolic = %pattern_type.loc8 (constants.%pattern_type.f8cebc.1)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc8: = require_complete_type %T.as_type.loc8_44.1 [symbolic = %require_complete.loc8 (constants.%require_complete.ecc)] -// CHECK:STDOUT: %Class.loc9_17.2: type = class_type @Class, @Class(%T.as_type.loc8_44.1) [symbolic = %Class.loc9_17.2 (constants.%Class.b1d)] -// CHECK:STDOUT: %require_complete.loc9_17: = require_complete_type %Class.loc9_17.2 [symbolic = %require_complete.loc9_17 (constants.%require_complete.57f)] -// CHECK:STDOUT: %pattern_type.loc9: type = pattern_type %Class.loc9_17.2 [symbolic = %pattern_type.loc9 (constants.%pattern_type.a8f)] -// CHECK:STDOUT: %struct_type.k: type = struct_type {.k: @InitFromStructGeneric.%T.as_type.loc8_44.1 (%T.as_type)} [symbolic = %struct_type.k (constants.%struct_type.k.c03)] -// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %T.loc8_26.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.3ba)] -// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %T.as_type.loc8_44.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.72e)] -// CHECK:STDOUT: %.loc9_27.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc9_27.2 (constants.%.671)] -// CHECK:STDOUT: %impl.elem0.loc9_27.2: @InitFromStructGeneric.%.loc9_27.2 (%.671) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc9_27.2 (constants.%impl.elem0.56e)] -// CHECK:STDOUT: %specific_impl_fn.loc9_27.2: = specific_impl_function %impl.elem0.loc9_27.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc9_27.2 (constants.%specific_impl_fn.fb7)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class.loc9_17.2, %T.as_type.loc8_44.1 [symbolic = %Class.elem (constants.%Class.elem.73a)] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T.as_type.loc8_44.1) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.492)] -// CHECK:STDOUT: %Destroy.facet: %Destroy.type = facet_value %Class.loc9_17.2, (%Destroy.impl_witness) [symbolic = %Destroy.facet (constants.%Destroy.facet.744)] -// CHECK:STDOUT: %.loc9_3.2: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc9_3.2 (constants.%.c08)] -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.type: type = fn_type @Class.as.Destroy.impl.Op, @Class.as.Destroy.impl(%T.as_type.loc8_44.1) [symbolic = %Class.as.Destroy.impl.Op.type (constants.%Class.as.Destroy.impl.Op.type.637)] +// CHECK:STDOUT: %require_complete.loc9: = require_complete_type %T.as_type.loc9_44.1 [symbolic = %require_complete.loc9 (constants.%require_complete.ecc)] +// CHECK:STDOUT: %Class.loc10_17.2: type = class_type @Class, @Class(%T.as_type.loc9_44.1) [symbolic = %Class.loc10_17.2 (constants.%Class.b1d)] +// CHECK:STDOUT: %require_complete.loc10_17: = require_complete_type %Class.loc10_17.2 [symbolic = %require_complete.loc10_17 (constants.%require_complete.57f)] +// CHECK:STDOUT: %pattern_type.loc10: type = pattern_type %Class.loc10_17.2 [symbolic = %pattern_type.loc10 (constants.%pattern_type.a8f)] +// CHECK:STDOUT: %struct_type.k: type = struct_type {.k: @InitFromStructGeneric.%T.as_type.loc9_44.1 (%T.as_type)} [symbolic = %struct_type.k (constants.%struct_type.k.c03)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %T.loc9_26.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.3ba)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %T.as_type.loc9_44.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.72e)] +// CHECK:STDOUT: %.loc10_27.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc10_27.2 (constants.%.671)] +// CHECK:STDOUT: %impl.elem0.loc10_27.2: @InitFromStructGeneric.%.loc10_27.2 (%.671) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc10_27.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %specific_impl_fn.loc10_27.2: = specific_impl_function %impl.elem0.loc10_27.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc10_27.2 (constants.%specific_impl_fn.fb7)] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class.loc10_17.2, %T.as_type.loc9_44.1 [symbolic = %Class.elem (constants.%Class.elem.73a)] +// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T.as_type.loc9_44.1) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.492)] +// CHECK:STDOUT: %Destroy.facet: %Destroy.type = facet_value %Class.loc10_17.2, (%Destroy.impl_witness) [symbolic = %Destroy.facet (constants.%Destroy.facet.744)] +// CHECK:STDOUT: %.loc10_3.2: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc10_3.2 (constants.%.c08)] +// CHECK:STDOUT: %Class.as.Destroy.impl.Op.type: type = fn_type @Class.as.Destroy.impl.Op, @Class.as.Destroy.impl(%T.as_type.loc9_44.1) [symbolic = %Class.as.Destroy.impl.Op.type (constants.%Class.as.Destroy.impl.Op.type.637)] // CHECK:STDOUT: %Class.as.Destroy.impl.Op: @InitFromStructGeneric.%Class.as.Destroy.impl.Op.type (%Class.as.Destroy.impl.Op.type.637) = struct_value () [symbolic = %Class.as.Destroy.impl.Op (constants.%Class.as.Destroy.impl.Op.598)] -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.specific_fn: = specific_function %Class.as.Destroy.impl.Op, @Class.as.Destroy.impl.Op(%T.as_type.loc8_44.1) [symbolic = %Class.as.Destroy.impl.Op.specific_fn (constants.%Class.as.Destroy.impl.Op.specific_fn.df2)] -// CHECK:STDOUT: %ptr: type = ptr_type %Class.loc9_17.2 [symbolic = %ptr (constants.%ptr.458)] -// CHECK:STDOUT: %require_complete.loc9_3: = require_complete_type %ptr [symbolic = %require_complete.loc9_3 (constants.%require_complete.ec5)] +// CHECK:STDOUT: %Class.as.Destroy.impl.Op.specific_fn: = specific_function %Class.as.Destroy.impl.Op, @Class.as.Destroy.impl.Op(%T.as_type.loc9_44.1) [symbolic = %Class.as.Destroy.impl.Op.specific_fn (constants.%Class.as.Destroy.impl.Op.specific_fn.df2)] +// CHECK:STDOUT: %ptr: type = ptr_type %Class.loc10_17.2 [symbolic = %ptr (constants.%ptr.458)] +// CHECK:STDOUT: %require_complete.loc10_3: = require_complete_type %ptr [symbolic = %require_complete.loc10_3 (constants.%require_complete.ec5)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @InitFromStructGeneric.%T.as_type.loc8_44.1 (%T.as_type)) -> @InitFromStructGeneric.%T.as_type.loc8_44.1 (%T.as_type) { +// CHECK:STDOUT: fn(%x.param: @InitFromStructGeneric.%T.as_type.loc9_44.1 (%T.as_type)) -> @InitFromStructGeneric.%T.as_type.loc9_44.1 (%T.as_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v.patt: @InitFromStructGeneric.%pattern_type.loc9 (%pattern_type.a8f) = binding_pattern v [concrete] -// CHECK:STDOUT: %v.var_patt: @InitFromStructGeneric.%pattern_type.loc9 (%pattern_type.a8f) = var_pattern %v.patt [concrete] +// CHECK:STDOUT: %v.patt: @InitFromStructGeneric.%pattern_type.loc10 (%pattern_type.a8f) = binding_pattern v [concrete] +// CHECK:STDOUT: %v.var_patt: @InitFromStructGeneric.%pattern_type.loc10 (%pattern_type.a8f) = var_pattern %v.patt [concrete] // CHECK:STDOUT: } -// CHECK:STDOUT: %v.var: ref @InitFromStructGeneric.%Class.loc9_17.2 (%Class.b1d) = var %v.var_patt -// CHECK:STDOUT: %x.ref: @InitFromStructGeneric.%T.as_type.loc8_44.1 (%T.as_type) = name_ref x, %x -// CHECK:STDOUT: %.loc9_28.1: @InitFromStructGeneric.%struct_type.k (%struct_type.k.c03) = struct_literal (%x.ref) -// CHECK:STDOUT: %impl.elem0.loc9_27.1: @InitFromStructGeneric.%.loc9_27.2 (%.671) = impl_witness_access constants.%Copy.lookup_impl_witness.3ba, element0 [symbolic = %impl.elem0.loc9_27.2 (constants.%impl.elem0.56e)] -// CHECK:STDOUT: %bound_method.loc9_27.1: = bound_method %x.ref, %impl.elem0.loc9_27.1 -// CHECK:STDOUT: %specific_impl_fn.loc9_27.1: = specific_impl_function %impl.elem0.loc9_27.1, @Copy.Op(constants.%Copy.facet.72e) [symbolic = %specific_impl_fn.loc9_27.2 (constants.%specific_impl_fn.fb7)] -// CHECK:STDOUT: %bound_method.loc9_27.2: = bound_method %x.ref, %specific_impl_fn.loc9_27.1 -// CHECK:STDOUT: %.loc9_27.1: init @InitFromStructGeneric.%T.as_type.loc8_44.1 (%T.as_type) = call %bound_method.loc9_27.2(%x.ref) -// CHECK:STDOUT: %.loc9_28.2: ref @InitFromStructGeneric.%T.as_type.loc8_44.1 (%T.as_type) = class_element_access %v.var, element0 -// CHECK:STDOUT: %.loc9_28.3: init @InitFromStructGeneric.%T.as_type.loc8_44.1 (%T.as_type) = initialize_from %.loc9_27.1 to %.loc9_28.2 -// CHECK:STDOUT: %.loc9_28.4: init @InitFromStructGeneric.%Class.loc9_17.2 (%Class.b1d) = class_init (%.loc9_28.3), %v.var -// CHECK:STDOUT: %.loc9_3.1: init @InitFromStructGeneric.%Class.loc9_17.2 (%Class.b1d) = converted %.loc9_28.1, %.loc9_28.4 -// CHECK:STDOUT: assign %v.var, %.loc9_3.1 -// CHECK:STDOUT: %.loc9_17.1: type = splice_block %Class.loc9_17.1 [symbolic = %Class.loc9_17.2 (constants.%Class.b1d)] { +// CHECK:STDOUT: %v.var: ref @InitFromStructGeneric.%Class.loc10_17.2 (%Class.b1d) = var %v.var_patt +// CHECK:STDOUT: %x.ref: @InitFromStructGeneric.%T.as_type.loc9_44.1 (%T.as_type) = name_ref x, %x +// CHECK:STDOUT: %.loc10_28.1: @InitFromStructGeneric.%struct_type.k (%struct_type.k.c03) = struct_literal (%x.ref) +// CHECK:STDOUT: %impl.elem0.loc10_27.1: @InitFromStructGeneric.%.loc10_27.2 (%.671) = impl_witness_access constants.%Copy.lookup_impl_witness.3ba, element0 [symbolic = %impl.elem0.loc10_27.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %bound_method.loc10_27.1: = bound_method %x.ref, %impl.elem0.loc10_27.1 +// CHECK:STDOUT: %specific_impl_fn.loc10_27.1: = specific_impl_function %impl.elem0.loc10_27.1, @Copy.Op(constants.%Copy.facet.72e) [symbolic = %specific_impl_fn.loc10_27.2 (constants.%specific_impl_fn.fb7)] +// CHECK:STDOUT: %bound_method.loc10_27.2: = bound_method %x.ref, %specific_impl_fn.loc10_27.1 +// CHECK:STDOUT: %.loc10_27.1: init @InitFromStructGeneric.%T.as_type.loc9_44.1 (%T.as_type) = call %bound_method.loc10_27.2(%x.ref) +// CHECK:STDOUT: %.loc10_28.2: ref @InitFromStructGeneric.%T.as_type.loc9_44.1 (%T.as_type) = class_element_access %v.var, element0 +// CHECK:STDOUT: %.loc10_28.3: init @InitFromStructGeneric.%T.as_type.loc9_44.1 (%T.as_type) = initialize_from %.loc10_27.1 to %.loc10_28.2 +// CHECK:STDOUT: %.loc10_28.4: init @InitFromStructGeneric.%Class.loc10_17.2 (%Class.b1d) = class_init (%.loc10_28.3), %v.var +// CHECK:STDOUT: %.loc10_3.1: init @InitFromStructGeneric.%Class.loc10_17.2 (%Class.b1d) = converted %.loc10_28.1, %.loc10_28.4 +// CHECK:STDOUT: assign %v.var, %.loc10_3.1 +// CHECK:STDOUT: %.loc10_17.1: type = splice_block %Class.loc10_17.1 [symbolic = %Class.loc10_17.2 (constants.%Class.b1d)] { // CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %T.ref.loc9: %Copy.type = name_ref T, %T.loc8_26.2 [symbolic = %T.loc8_26.1 (constants.%T.578)] -// CHECK:STDOUT: %T.as_type.loc9: type = facet_access_type %T.ref.loc9 [symbolic = %T.as_type.loc8_44.1 (constants.%T.as_type)] -// CHECK:STDOUT: %.loc9_17.2: type = converted %T.ref.loc9, %T.as_type.loc9 [symbolic = %T.as_type.loc8_44.1 (constants.%T.as_type)] -// CHECK:STDOUT: %Class.loc9_17.1: type = class_type @Class, @Class(constants.%T.as_type) [symbolic = %Class.loc9_17.2 (constants.%Class.b1d)] +// CHECK:STDOUT: %T.ref.loc10: %Copy.type = name_ref T, %T.loc9_26.2 [symbolic = %T.loc9_26.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc10: type = facet_access_type %T.ref.loc10 [symbolic = %T.as_type.loc9_44.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc10_17.2: type = converted %T.ref.loc10, %T.as_type.loc10 [symbolic = %T.as_type.loc9_44.1 (constants.%T.as_type)] +// CHECK:STDOUT: %Class.loc10_17.1: type = class_type @Class, @Class(constants.%T.as_type) [symbolic = %Class.loc10_17.2 (constants.%Class.b1d)] // CHECK:STDOUT: } -// CHECK:STDOUT: %v: ref @InitFromStructGeneric.%Class.loc9_17.2 (%Class.b1d) = bind_name v, %v.var -// CHECK:STDOUT: %v.ref: ref @InitFromStructGeneric.%Class.loc9_17.2 (%Class.b1d) = name_ref v, %v +// CHECK:STDOUT: %v: ref @InitFromStructGeneric.%Class.loc10_17.2 (%Class.b1d) = bind_name v, %v.var +// CHECK:STDOUT: %v.ref: ref @InitFromStructGeneric.%Class.loc10_17.2 (%Class.b1d) = name_ref v, %v // CHECK:STDOUT: %k.ref: @InitFromStructGeneric.%Class.elem (%Class.elem.73a) = name_ref k, @Class.%.loc5 [concrete = @Class.%.loc5] -// CHECK:STDOUT: %.loc10_11.1: ref @InitFromStructGeneric.%T.as_type.loc8_44.1 (%T.as_type) = class_element_access %v.ref, element0 -// CHECK:STDOUT: %.loc10_11.2: @InitFromStructGeneric.%T.as_type.loc8_44.1 (%T.as_type) = bind_value %.loc10_11.1 -// CHECK:STDOUT: %impl.elem0.loc9_3: @InitFromStructGeneric.%.loc9_3.2 (%.c08) = impl_witness_access constants.%Destroy.impl_witness.492, element0 [symbolic = %Class.as.Destroy.impl.Op (constants.%Class.as.Destroy.impl.Op.598)] -// CHECK:STDOUT: %bound_method.loc9_3.1: = bound_method %v.var, %impl.elem0.loc9_3 -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0.loc9_3, @Class.as.Destroy.impl.Op(constants.%T.as_type) [symbolic = %Class.as.Destroy.impl.Op.specific_fn (constants.%Class.as.Destroy.impl.Op.specific_fn.df2)] -// CHECK:STDOUT: %bound_method.loc9_3.2: = bound_method %v.var, %specific_fn +// CHECK:STDOUT: %.loc11_11.1: ref @InitFromStructGeneric.%T.as_type.loc9_44.1 (%T.as_type) = class_element_access %v.ref, element0 +// CHECK:STDOUT: %.loc11_11.2: @InitFromStructGeneric.%T.as_type.loc9_44.1 (%T.as_type) = bind_value %.loc11_11.1 +// CHECK:STDOUT: %impl.elem0.loc11: @InitFromStructGeneric.%.loc10_27.2 (%.671) = impl_witness_access constants.%Copy.lookup_impl_witness.3ba, element0 [symbolic = %impl.elem0.loc10_27.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %bound_method.loc11_11.1: = bound_method %.loc11_11.2, %impl.elem0.loc11 +// CHECK:STDOUT: %specific_impl_fn.loc11: = specific_impl_function %impl.elem0.loc11, @Copy.Op(constants.%Copy.facet.72e) [symbolic = %specific_impl_fn.loc10_27.2 (constants.%specific_impl_fn.fb7)] +// CHECK:STDOUT: %bound_method.loc11_11.2: = bound_method %.loc11_11.2, %specific_impl_fn.loc11 +// CHECK:STDOUT: %.loc11_11.3: init @InitFromStructGeneric.%T.as_type.loc9_44.1 (%T.as_type) = call %bound_method.loc11_11.2(%.loc11_11.2) +// CHECK:STDOUT: %impl.elem0.loc10_3: @InitFromStructGeneric.%.loc10_3.2 (%.c08) = impl_witness_access constants.%Destroy.impl_witness.492, element0 [symbolic = %Class.as.Destroy.impl.Op (constants.%Class.as.Destroy.impl.Op.598)] +// CHECK:STDOUT: %bound_method.loc10_3.1: = bound_method %v.var, %impl.elem0.loc10_3 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0.loc10_3, @Class.as.Destroy.impl.Op(constants.%T.as_type) [symbolic = %Class.as.Destroy.impl.Op.specific_fn (constants.%Class.as.Destroy.impl.Op.specific_fn.df2)] +// CHECK:STDOUT: %bound_method.loc10_3.2: = bound_method %v.var, %specific_fn // CHECK:STDOUT: %addr: @InitFromStructGeneric.%ptr (%ptr.458) = addr_of %v.var -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc9_3.2(%addr) -// CHECK:STDOUT: return %.loc10_11.2 +// CHECK:STDOUT: %Class.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc10_3.2(%addr) +// CHECK:STDOUT: return %.loc11_11.3 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -345,191 +249,129 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: %v.var: ref %Class.247 = var %v.var_patt // CHECK:STDOUT: %x.ref: %i32 = name_ref x, %x -// CHECK:STDOUT: %.loc14_30.1: %struct_type.k.0bf = struct_literal (%x.ref) -// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] -// CHECK:STDOUT: %bound_method.loc14_29.1: = bound_method %x.ref, %impl.elem0 -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] -// CHECK:STDOUT: %bound_method.loc14_29.2: = bound_method %x.ref, %specific_fn -// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc14_29.2(%x.ref) -// CHECK:STDOUT: %.loc14_30.2: ref %i32 = class_element_access %v.var, element0 -// CHECK:STDOUT: %.loc14_30.3: init %i32 = initialize_from %Int.as.Copy.impl.Op.call to %.loc14_30.2 -// CHECK:STDOUT: %.loc14_30.4: init %Class.247 = class_init (%.loc14_30.3), %v.var -// CHECK:STDOUT: %.loc14_3: init %Class.247 = converted %.loc14_30.1, %.loc14_30.4 -// CHECK:STDOUT: assign %v.var, %.loc14_3 -// CHECK:STDOUT: %.loc14_19: type = splice_block %Class [concrete = constants.%Class.247] { +// CHECK:STDOUT: %.loc15_30.1: %struct_type.k.0bf = struct_literal (%x.ref) +// CHECK:STDOUT: %impl.elem0.loc15: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc15_29.1: = bound_method %x.ref, %impl.elem0.loc15 +// CHECK:STDOUT: %specific_fn.loc15: = specific_function %impl.elem0.loc15, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc15_29.2: = bound_method %x.ref, %specific_fn.loc15 +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call.loc15: init %i32 = call %bound_method.loc15_29.2(%x.ref) +// CHECK:STDOUT: %.loc15_30.2: ref %i32 = class_element_access %v.var, element0 +// CHECK:STDOUT: %.loc15_30.3: init %i32 = initialize_from %Int.as.Copy.impl.Op.call.loc15 to %.loc15_30.2 +// CHECK:STDOUT: %.loc15_30.4: init %Class.247 = class_init (%.loc15_30.3), %v.var +// CHECK:STDOUT: %.loc15_3: init %Class.247 = converted %.loc15_30.1, %.loc15_30.4 +// CHECK:STDOUT: assign %v.var, %.loc15_3 +// CHECK:STDOUT: %.loc15_19: type = splice_block %Class [concrete = constants.%Class.247] { // CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %int_32.loc14: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc14: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc15: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc15: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %Class: type = class_type @Class, @Class(constants.%i32) [concrete = constants.%Class.247] // CHECK:STDOUT: } // CHECK:STDOUT: %v: ref %Class.247 = bind_name v, %v.var // CHECK:STDOUT: %v.ref: ref %Class.247 = name_ref v, %v // CHECK:STDOUT: %k.ref: %Class.elem.2d8 = name_ref k, @Class.%.loc5 [concrete = @Class.%.loc5] -// CHECK:STDOUT: %.loc15_11.1: ref %i32 = class_element_access %v.ref, element0 -// CHECK:STDOUT: %.loc15_11.2: %i32 = bind_value %.loc15_11.1 +// CHECK:STDOUT: %.loc16_11.1: ref %i32 = class_element_access %v.ref, element0 +// CHECK:STDOUT: %.loc16_11.2: %i32 = bind_value %.loc16_11.1 +// CHECK:STDOUT: %impl.elem0.loc16: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc16_11.1: = bound_method %.loc16_11.2, %impl.elem0.loc16 +// CHECK:STDOUT: %specific_fn.loc16: = specific_function %impl.elem0.loc16, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc16_11.2: = bound_method %.loc16_11.2, %specific_fn.loc16 +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call.loc16: init %i32 = call %bound_method.loc16_11.2(%.loc16_11.2) // CHECK:STDOUT: %Class.as.Destroy.impl.Op.bound: = bound_method %v.var, constants.%Class.as.Destroy.impl.Op.831 -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.specific_fn: = specific_function constants.%Class.as.Destroy.impl.Op.831, @Class.as.Destroy.impl.Op(constants.%i32) [concrete = constants.%Class.as.Destroy.impl.Op.specific_fn.213] -// CHECK:STDOUT: %bound_method.loc14_3: = bound_method %v.var, %Class.as.Destroy.impl.Op.specific_fn +// CHECK:STDOUT: +// CHECK:STDOUT: %bound_method.loc15_3: = bound_method %v.var, %Class.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr: %ptr.f7c = addr_of %v.var -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc14_3(%addr) -// CHECK:STDOUT: return %.loc15_11.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T.8b3) { -// CHECK:STDOUT: %T.loc4_13.1 => constants.%T.8b3 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.as.Destroy.impl(constants.%T.8b3) { -// CHECK:STDOUT: %T => constants.%T.8b3 -// CHECK:STDOUT: %Class => constants.%Class.fe1 -// CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness.d1e -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.as.Destroy.impl.Op(constants.%T.8b3) { -// CHECK:STDOUT: %T => constants.%T.8b3 -// CHECK:STDOUT: %Class => constants.%Class.fe1 -// CHECK:STDOUT: %ptr => constants.%ptr.955 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.9e0 +// CHECK:STDOUT: %Class.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc15_3(%addr) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call.loc16 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @InitFromStructGeneric(constants.%T.578) { -// CHECK:STDOUT: %T.loc8_26.1 => constants.%T.578 -// CHECK:STDOUT: %T.as_type.loc8_44.1 => constants.%T.as_type -// CHECK:STDOUT: %pattern_type.loc8 => constants.%pattern_type.f8cebc.1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T.as_type) { -// CHECK:STDOUT: %T.loc4_13.1 => constants.%T.as_type -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.ecc -// CHECK:STDOUT: %Class => constants.%Class.b1d -// CHECK:STDOUT: %Class.elem => constants.%Class.elem.73a -// CHECK:STDOUT: %struct_type.k => constants.%struct_type.k.c03 -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.cdd -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.as.Destroy.impl(constants.%T.as_type) { -// CHECK:STDOUT: %T => constants.%T.as_type -// CHECK:STDOUT: %Class => constants.%Class.b1d -// CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness.492 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.type => constants.%Class.as.Destroy.impl.Op.type.637 -// CHECK:STDOUT: %Class.as.Destroy.impl.Op => constants.%Class.as.Destroy.impl.Op.598 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.as.Destroy.impl.Op(constants.%T.as_type) { -// CHECK:STDOUT: %T => constants.%T.as_type -// CHECK:STDOUT: %Class => constants.%Class.b1d -// CHECK:STDOUT: %ptr => constants.%ptr.458 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.20e -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%i32) { -// CHECK:STDOUT: %T.loc4_13.1 => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %Class => constants.%Class.247 -// CHECK:STDOUT: %Class.elem => constants.%Class.elem.2d8 -// CHECK:STDOUT: %struct_type.k => constants.%struct_type.k.0bf -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.954 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.as.Destroy.impl(constants.%i32) { -// CHECK:STDOUT: %T => constants.%i32 -// CHECK:STDOUT: %Class => constants.%Class.247 -// CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness.ea6 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.type => constants.%Class.as.Destroy.impl.Op.type.ce6 -// CHECK:STDOUT: %Class.as.Destroy.impl.Op => constants.%Class.as.Destroy.impl.Op.831 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.as.Destroy.impl.Op(constants.%i32) { -// CHECK:STDOUT: %T => constants.%i32 -// CHECK:STDOUT: %Class => constants.%Class.247 -// CHECK:STDOUT: %ptr => constants.%ptr.f7c -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.14a +// CHECK:STDOUT: %T.loc9_26.1 => constants.%T.578 +// CHECK:STDOUT: %T.as_type.loc9_44.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type.loc9 => constants.%pattern_type.f8cebc.1 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- adapt.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %Adapt.type: type = generic_class_type @Adapt [concrete] // CHECK:STDOUT: %Adapt.generic: %Adapt.type = struct_value () [concrete] -// CHECK:STDOUT: %Adapt.2e4: type = class_type @Adapt, @Adapt(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Adapt.%Destroy.impl_witness_table, @Adapt.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %ptr.42a: type = ptr_type %Adapt.2e4 [symbolic] -// CHECK:STDOUT: %pattern_type.97d: type = pattern_type %ptr.42a [symbolic] -// CHECK:STDOUT: %Adapt.as.Destroy.impl.Op.type: type = fn_type @Adapt.as.Destroy.impl.Op, @Adapt.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %Adapt.as.Destroy.impl.Op: %Adapt.as.Destroy.impl.Op.type = struct_value () [symbolic] -// CHECK:STDOUT: %complete_type.f87: = complete_type_witness %T [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %T.578: %Copy.type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %pattern_type.ce2: type = pattern_type %Copy.type [concrete] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T.578 [symbolic] +// CHECK:STDOUT: %pattern_type.f8cebc.1: type = pattern_type %T.as_type [symbolic] // CHECK:STDOUT: %InitFromAdaptedGeneric.type: type = fn_type @InitFromAdaptedGeneric [concrete] // CHECK:STDOUT: %InitFromAdaptedGeneric: %InitFromAdaptedGeneric.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.26c: = require_complete_type %Adapt.2e4 [symbolic] +// CHECK:STDOUT: %require_complete.ecc: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %Adapt.9d1: type = class_type @Adapt, @Adapt(%T.as_type) [symbolic] +// CHECK:STDOUT: %require_complete.17e: = require_complete_type %Adapt.9d1 [symbolic] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.lookup_impl_witness.3ba: = lookup_impl_witness %T.578, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.72e: %Copy.type = facet_value %T.as_type, (%Copy.lookup_impl_witness.3ba) [symbolic] +// CHECK:STDOUT: %.671: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.72e [symbolic] +// CHECK:STDOUT: %impl.elem0.56e: %.671 = impl_witness_access %Copy.lookup_impl_witness.3ba, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.fb7: = specific_impl_function %impl.elem0.56e, @Copy.Op(%Copy.facet.72e) [symbolic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %InitFromAdaptedSpecific.type: type = fn_type @InitFromAdaptedSpecific [concrete] // CHECK:STDOUT: %InitFromAdaptedSpecific: %InitFromAdaptedSpecific.type = struct_value () [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %Adapt.526: type = class_type @Adapt, @Adapt(%i32) [concrete] -// CHECK:STDOUT: %complete_type.1eb: = complete_type_witness %i32 [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Adapt = %Adapt.decl -// CHECK:STDOUT: .InitFromAdaptedGeneric = %InitFromAdaptedGeneric.decl -// CHECK:STDOUT: .InitFromAdaptedSpecific = %InitFromAdaptedSpecific.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Adapt.decl: %Adapt.type = class_decl @Adapt [concrete = constants.%Adapt.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.1 (constants.%T)] -// CHECK:STDOUT: } // CHECK:STDOUT: %InitFromAdaptedGeneric.decl: %InitFromAdaptedGeneric.type = fn_decl @InitFromAdaptedGeneric [concrete = constants.%InitFromAdaptedGeneric] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @InitFromAdaptedGeneric.%pattern_type (%pattern_type.7dc) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @InitFromAdaptedGeneric.%pattern_type (%pattern_type.7dc) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @InitFromAdaptedGeneric.%pattern_type (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @InitFromAdaptedGeneric.%pattern_type (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type.ce2 = symbolic_binding_pattern T, 0 [concrete] +// CHECK:STDOUT: %x.patt: @InitFromAdaptedGeneric.%pattern_type (%pattern_type.f8cebc.1) = binding_pattern x [concrete] +// CHECK:STDOUT: %x.param_patt: @InitFromAdaptedGeneric.%pattern_type (%pattern_type.f8cebc.1) = value_param_pattern %x.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @InitFromAdaptedGeneric.%pattern_type (%pattern_type.f8cebc.1) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @InitFromAdaptedGeneric.%pattern_type (%pattern_type.f8cebc.1) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc8_46: type = name_ref T, %T.loc8_27.2 [symbolic = %T.loc8_27.1 (constants.%T)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc8_27.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_27.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @InitFromAdaptedGeneric.%T.loc8_27.1 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc8_40: type = name_ref T, %T.loc8_27.2 [symbolic = %T.loc8_27.1 (constants.%T)] -// CHECK:STDOUT: %x: @InitFromAdaptedGeneric.%T.loc8_27.1 (%T) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @InitFromAdaptedGeneric.%T.loc8_27.1 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @InitFromAdaptedGeneric.%T.loc8_27.1 (%T) = return_slot %return.param +// CHECK:STDOUT: %T.ref.loc9_51: %Copy.type = name_ref T, %T.loc9_27.2 [symbolic = %T.loc9_27.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc9_51: type = facet_access_type %T.ref.loc9_51 [symbolic = %T.as_type.loc9_45.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc9_51: type = converted %T.ref.loc9_51, %T.as_type.loc9_51 [symbolic = %T.as_type.loc9_45.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc9_35: type = splice_block %Copy.ref [concrete = constants.%Copy.type] { +// CHECK:STDOUT: +// CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core [concrete = imports.%Core] +// CHECK:STDOUT: %Copy.ref: type = name_ref Copy, imports.%Core.Copy [concrete = constants.%Copy.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc9_27.2: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc9_27.1 (constants.%T.578)] +// CHECK:STDOUT: %x.param: @InitFromAdaptedGeneric.%T.as_type.loc9_45.1 (%T.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc9_45.1: type = splice_block %.loc9_45.2 [symbolic = %T.as_type.loc9_45.1 (constants.%T.as_type)] { +// CHECK:STDOUT: %T.ref.loc9_45: %Copy.type = name_ref T, %T.loc9_27.2 [symbolic = %T.loc9_27.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc9_45.2: type = facet_access_type %T.ref.loc9_45 [symbolic = %T.as_type.loc9_45.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc9_45.2: type = converted %T.ref.loc9_45, %T.as_type.loc9_45.2 [symbolic = %T.as_type.loc9_45.1 (constants.%T.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @InitFromAdaptedGeneric.%T.as_type.loc9_45.1 (%T.as_type) = bind_name x, %x.param +// CHECK:STDOUT: %return.param: ref @InitFromAdaptedGeneric.%T.as_type.loc9_45.1 (%T.as_type) = out_param call_param1 +// CHECK:STDOUT: %return: ref @InitFromAdaptedGeneric.%T.as_type.loc9_45.1 (%T.as_type) = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: %InitFromAdaptedSpecific.decl: %InitFromAdaptedSpecific.type = fn_decl @InitFromAdaptedSpecific [concrete = constants.%InitFromAdaptedSpecific] { // CHECK:STDOUT: %x.patt: %pattern_type.7ce = binding_pattern x [concrete] @@ -537,12 +379,12 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc12_39: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12_39: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc13_39: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc13_39: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %x.param: %i32 = value_param call_param0 -// CHECK:STDOUT: %.loc12: type = splice_block %i32.loc12_31 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc12_31: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12_31: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %.loc13: type = splice_block %i32.loc13_31 [concrete = constants.%i32] { +// CHECK:STDOUT: %int_32.loc13_31: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc13_31: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: } // CHECK:STDOUT: %x: %i32 = bind_name x, %x.param // CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 @@ -550,90 +392,42 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic impl @Adapt.as.Destroy.impl(@Adapt.%T.loc4_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Adapt: type = class_type @Adapt, @Adapt(%T) [symbolic = %Adapt (constants.%Adapt.2e4)] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Adapt.%Destroy.impl_witness_table, @Adapt.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness)] +// CHECK:STDOUT: generic fn @InitFromAdaptedGeneric(%T.loc9_27.2: %Copy.type) { +// CHECK:STDOUT: %T.loc9_27.1: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc9_27.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc9_45.1: type = facet_access_type %T.loc9_27.1 [symbolic = %T.as_type.loc9_45.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %T.as_type.loc9_45.1 [symbolic = %pattern_type (constants.%pattern_type.f8cebc.1)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Adapt.as.Destroy.impl.Op.type: type = fn_type @Adapt.as.Destroy.impl.Op, @Adapt.as.Destroy.impl(%T) [symbolic = %Adapt.as.Destroy.impl.Op.type (constants.%Adapt.as.Destroy.impl.Op.type)] -// CHECK:STDOUT: %Adapt.as.Destroy.impl.Op: @Adapt.as.Destroy.impl.%Adapt.as.Destroy.impl.Op.type (%Adapt.as.Destroy.impl.Op.type) = struct_value () [symbolic = %Adapt.as.Destroy.impl.Op (constants.%Adapt.as.Destroy.impl.Op)] +// CHECK:STDOUT: %require_complete.loc9: = require_complete_type %T.as_type.loc9_45.1 [symbolic = %require_complete.loc9 (constants.%require_complete.ecc)] +// CHECK:STDOUT: %Adapt.loc10_23.2: type = class_type @Adapt, @Adapt(%T.as_type.loc9_45.1) [symbolic = %Adapt.loc10_23.2 (constants.%Adapt.9d1)] +// CHECK:STDOUT: %require_complete.loc10: = require_complete_type %Adapt.loc10_23.2 [symbolic = %require_complete.loc10 (constants.%require_complete.17e)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %T.loc9_27.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.3ba)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %T.as_type.loc9_45.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.72e)] +// CHECK:STDOUT: %.loc10_26.4: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc10_26.4 (constants.%.671)] +// CHECK:STDOUT: %impl.elem0.loc10_26.2: @InitFromAdaptedGeneric.%.loc10_26.4 (%.671) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc10_26.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %specific_impl_fn.loc10_26.2: = specific_impl_function %impl.elem0.loc10_26.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc10_26.2 (constants.%specific_impl_fn.fb7)] // CHECK:STDOUT: -// CHECK:STDOUT: impl: @Adapt.%Self.ref as constants.%Destroy.type { -// CHECK:STDOUT: %Adapt.as.Destroy.impl.Op.decl: @Adapt.as.Destroy.impl.%Adapt.as.Destroy.impl.Op.type (%Adapt.as.Destroy.impl.Op.type) = fn_decl @Adapt.as.Destroy.impl.Op [symbolic = @Adapt.as.Destroy.impl.%Adapt.as.Destroy.impl.Op (constants.%Adapt.as.Destroy.impl.Op)] { -// CHECK:STDOUT: %self.patt: @Adapt.as.Destroy.impl.Op.%pattern_type (%pattern_type.97d) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Adapt.as.Destroy.impl.Op.%pattern_type (%pattern_type.97d) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc4_23.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @Adapt.as.Destroy.impl.Op.%ptr (%ptr.42a) = value_param call_param0 -// CHECK:STDOUT: %.loc4_23.2: type = splice_block %Self.ref [symbolic = %Adapt (constants.%Adapt.2e4)] { -// CHECK:STDOUT: %.loc4_23.3: type = specific_constant constants.%Adapt.2e4, @Adapt(constants.%T) [symbolic = %Adapt (constants.%Adapt.2e4)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc4_23.3 [symbolic = %Adapt (constants.%Adapt.2e4)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Adapt.as.Destroy.impl.Op.%ptr (%ptr.42a) = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Op = %Adapt.as.Destroy.impl.Op.decl -// CHECK:STDOUT: witness = @Adapt.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Adapt(%T.loc4_13.2: type) { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.1 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_13.1 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %complete_type.loc6_1.2: = complete_type_witness %T.loc4_13.1 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.f87)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_13.2 [symbolic = %T.loc4_13.1 (constants.%T)] -// CHECK:STDOUT: adapt_decl %T.ref [concrete] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Adapt.2e4 [symbolic = @Adapt.as.Destroy.impl.%Adapt (constants.%Adapt.2e4)] -// CHECK:STDOUT: impl_decl @Adapt.as.Destroy.impl [concrete] {} {} -// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Adapt.as.Destroy.impl.%Adapt.as.Destroy.impl.Op.decl), @Adapt.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Adapt.as.Destroy.impl(constants.%T) [symbolic = @Adapt.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness)] -// CHECK:STDOUT: %complete_type.loc6_1.1: = complete_type_witness constants.%T [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.f87)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc6_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Adapt.2e4 -// CHECK:STDOUT: .T = -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Adapt.as.Destroy.impl.Op(@Adapt.%T.loc4_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Adapt: type = class_type @Adapt, @Adapt(%T) [symbolic = %Adapt (constants.%Adapt.2e4)] -// CHECK:STDOUT: %ptr: type = ptr_type %Adapt [symbolic = %ptr (constants.%ptr.42a)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.97d)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Adapt.as.Destroy.impl.Op.%ptr (%ptr.42a)) = "no_op"; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @InitFromAdaptedGeneric(%T.loc8_27.2: type) { -// CHECK:STDOUT: %T.loc8_27.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_27.1 (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc8_27.1 [symbolic = %pattern_type (constants.%pattern_type.7dc)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc8: = require_complete_type %T.loc8_27.1 [symbolic = %require_complete.loc8 (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Adapt.loc9_23.2: type = class_type @Adapt, @Adapt(%T.loc8_27.1) [symbolic = %Adapt.loc9_23.2 (constants.%Adapt.2e4)] -// CHECK:STDOUT: %require_complete.loc9: = require_complete_type %Adapt.loc9_23.2 [symbolic = %require_complete.loc9 (constants.%require_complete.26c)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @InitFromAdaptedGeneric.%T.loc8_27.1 (%T)) -> @InitFromAdaptedGeneric.%T.loc8_27.1 (%T) { +// CHECK:STDOUT: fn(%x.param: @InitFromAdaptedGeneric.%T.as_type.loc9_45.1 (%T.as_type)) -> @InitFromAdaptedGeneric.%T.as_type.loc9_45.1 (%T.as_type) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @InitFromAdaptedGeneric.%T.loc8_27.1 (%T) = name_ref x, %x +// CHECK:STDOUT: %x.ref: @InitFromAdaptedGeneric.%T.as_type.loc9_45.1 (%T.as_type) = name_ref x, %x // CHECK:STDOUT: %Adapt.ref: %Adapt.type = name_ref Adapt, file.%Adapt.decl [concrete = constants.%Adapt.generic] -// CHECK:STDOUT: %T.ref.loc9_22: type = name_ref T, %T.loc8_27.2 [symbolic = %T.loc8_27.1 (constants.%T)] -// CHECK:STDOUT: %Adapt.loc9_23.1: type = class_type @Adapt, @Adapt(constants.%T) [symbolic = %Adapt.loc9_23.2 (constants.%Adapt.2e4)] -// CHECK:STDOUT: %.loc9_13.1: @InitFromAdaptedGeneric.%Adapt.loc9_23.2 (%Adapt.2e4) = as_compatible %x.ref -// CHECK:STDOUT: %.loc9_13.2: @InitFromAdaptedGeneric.%Adapt.loc9_23.2 (%Adapt.2e4) = converted %x.ref, %.loc9_13.1 -// CHECK:STDOUT: %T.ref.loc9_29: type = name_ref T, %T.loc8_27.2 [symbolic = %T.loc8_27.1 (constants.%T)] -// CHECK:STDOUT: %.loc9_26.1: @InitFromAdaptedGeneric.%T.loc8_27.1 (%T) = as_compatible %.loc9_13.2 -// CHECK:STDOUT: %.loc9_26.2: @InitFromAdaptedGeneric.%T.loc8_27.1 (%T) = converted %.loc9_13.2, %.loc9_26.1 -// CHECK:STDOUT: return %.loc9_26.2 +// CHECK:STDOUT: %T.ref.loc10_22: %Copy.type = name_ref T, %T.loc9_27.2 [symbolic = %T.loc9_27.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc10_23: type = facet_access_type %T.ref.loc10_22 [symbolic = %T.as_type.loc9_45.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc10_23: type = converted %T.ref.loc10_22, %T.as_type.loc10_23 [symbolic = %T.as_type.loc9_45.1 (constants.%T.as_type)] +// CHECK:STDOUT: %Adapt.loc10_23.1: type = class_type @Adapt, @Adapt(constants.%T.as_type) [symbolic = %Adapt.loc10_23.2 (constants.%Adapt.9d1)] +// CHECK:STDOUT: %.loc10_13.1: @InitFromAdaptedGeneric.%Adapt.loc10_23.2 (%Adapt.9d1) = as_compatible %x.ref +// CHECK:STDOUT: %.loc10_13.2: @InitFromAdaptedGeneric.%Adapt.loc10_23.2 (%Adapt.9d1) = converted %x.ref, %.loc10_13.1 +// CHECK:STDOUT: %T.ref.loc10_29: %Copy.type = name_ref T, %T.loc9_27.2 [symbolic = %T.loc9_27.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc10_29: type = facet_access_type %T.ref.loc10_29 [symbolic = %T.as_type.loc9_45.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc10_29: type = converted %T.ref.loc10_29, %T.as_type.loc10_29 [symbolic = %T.as_type.loc9_45.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc10_26.1: @InitFromAdaptedGeneric.%T.as_type.loc9_45.1 (%T.as_type) = as_compatible %.loc10_13.2 +// CHECK:STDOUT: %.loc10_26.2: @InitFromAdaptedGeneric.%T.as_type.loc9_45.1 (%T.as_type) = converted %.loc10_13.2, %.loc10_26.1 +// CHECK:STDOUT: %impl.elem0.loc10_26.1: @InitFromAdaptedGeneric.%.loc10_26.4 (%.671) = impl_witness_access constants.%Copy.lookup_impl_witness.3ba, element0 [symbolic = %impl.elem0.loc10_26.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %bound_method.loc10_26.1: = bound_method %.loc10_26.2, %impl.elem0.loc10_26.1 +// CHECK:STDOUT: %specific_impl_fn.loc10_26.1: = specific_impl_function %impl.elem0.loc10_26.1, @Copy.Op(constants.%Copy.facet.72e) [symbolic = %specific_impl_fn.loc10_26.2 (constants.%specific_impl_fn.fb7)] +// CHECK:STDOUT: %bound_method.loc10_26.2: = bound_method %.loc10_26.2, %specific_impl_fn.loc10_26.1 +// CHECK:STDOUT: %.loc10_26.3: init @InitFromAdaptedGeneric.%T.as_type.loc9_45.1 (%T.as_type) = call %bound_method.loc10_26.2(%.loc10_26.2) +// CHECK:STDOUT: return %.loc10_26.3 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -641,49 +435,26 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %x.ref: %i32 = name_ref x, %x // CHECK:STDOUT: %Adapt.ref: %Adapt.type = name_ref Adapt, file.%Adapt.decl [concrete = constants.%Adapt.generic] -// CHECK:STDOUT: %int_32.loc13_22: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13_22: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc14_22: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc14_22: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %Adapt: type = class_type @Adapt, @Adapt(constants.%i32) [concrete = constants.%Adapt.526] -// CHECK:STDOUT: %.loc13_13.1: %Adapt.526 = as_compatible %x.ref -// CHECK:STDOUT: %.loc13_13.2: %Adapt.526 = converted %x.ref, %.loc13_13.1 -// CHECK:STDOUT: %int_32.loc13_31: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13_31: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc13_28.1: %i32 = as_compatible %.loc13_13.2 -// CHECK:STDOUT: %.loc13_28.2: %i32 = converted %.loc13_13.2, %.loc13_28.1 -// CHECK:STDOUT: return %.loc13_28.2 +// CHECK:STDOUT: %.loc14_13.1: %Adapt.526 = as_compatible %x.ref +// CHECK:STDOUT: %.loc14_13.2: %Adapt.526 = converted %x.ref, %.loc14_13.1 +// CHECK:STDOUT: %int_32.loc14_31: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc14_31: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %.loc14_28.1: %i32 = as_compatible %.loc14_13.2 +// CHECK:STDOUT: %.loc14_28.2: %i32 = converted %.loc14_13.2, %.loc14_28.1 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc14_28.1: = bound_method %.loc14_28.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc14_28.2: = bound_method %.loc14_28.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc14_28.2(%.loc14_28.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Adapt(constants.%T) { -// CHECK:STDOUT: %T.loc4_13.1 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.f87 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Adapt.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Adapt => constants.%Adapt.2e4 -// CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Adapt.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Adapt => constants.%Adapt.2e4 -// CHECK:STDOUT: %ptr => constants.%ptr.42a -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.97d -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @InitFromAdaptedGeneric(constants.%T) { -// CHECK:STDOUT: %T.loc8_27.1 => constants.%T -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Adapt(constants.%i32) { -// CHECK:STDOUT: %T.loc4_13.1 => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.1eb +// CHECK:STDOUT: specific @InitFromAdaptedGeneric(constants.%T.578) { +// CHECK:STDOUT: %T.loc9_27.1 => constants.%T.578 +// CHECK:STDOUT: %T.as_type.loc9_45.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.f8cebc.1 // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/member_access.carbon b/toolchain/check/testdata/class/generic/member_access.carbon index ac0a2b964107..55d61766a305 100644 --- a/toolchain/check/testdata/class/generic/member_access.carbon +++ b/toolchain/check/testdata/class/generic/member_access.carbon @@ -3,8 +3,6 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // // INCLUDE-FILE: toolchain/testing/testdata/min_prelude/int.carbon -// TODO: Add ranges and switch to "--dump-sem-ir-ranges=only". -// EXTRA-ARGS: --dump-sem-ir-ranges=if-present // // AUTOUPDATE // TIP: To test this file alone, run: @@ -14,24 +12,40 @@ // --- member_access.carbon -class Class(T:! type) { +library "[[@TEST_NAME]]"; + +class Class(T:! Core.Copy) { var x: T; - fn Get[self: Self]() -> T { return self.x; } + fn Get[self: Self]() -> T { + //@dump-sem-ir-begin + return self.x; + //@dump-sem-ir-end + } - fn GetAddr[addr self: Self*]() -> T* { return &self->x; } + fn GetAddr[addr self: Self*]() -> T* { + //@dump-sem-ir-begin + return &self->x; + //@dump-sem-ir-end + } } fn DirectFieldAccess(x: Class(i32)) -> i32 { + //@dump-sem-ir-begin return x.x; + //@dump-sem-ir-end } fn MethodCall(x: Class(i32)) -> i32 { + //@dump-sem-ir-begin return x.Get(); + //@dump-sem-ir-end } fn AddrMethodCall(p: Class(i32)*) -> i32 { + //@dump-sem-ir-begin return *p->GetAddr(); + //@dump-sem-ir-end } // --- static_member_fn_call.carbon @@ -43,181 +57,103 @@ class Class(T:! type) { } fn StaticMemberFunctionCall(T:! type) -> Class(T) { + //@dump-sem-ir-begin return Class(T).Make(); + //@dump-sem-ir-end } // CHECK:STDOUT: --- member_access.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] -// CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] -// CHECK:STDOUT: %Class.fe1: type = class_type @Class, @Class(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %Class.elem.e26: type = unbound_element_type %Class.fe1, %T [symbolic] -// CHECK:STDOUT: %pattern_type.3c1: type = pattern_type %Class.fe1 [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %Class.Get.type.fd9: type = fn_type @Class.Get, @Class(%T) [symbolic] -// CHECK:STDOUT: %Class.Get.cf9: %Class.Get.type.fd9 = struct_value () [symbolic] -// CHECK:STDOUT: %ptr.955: type = ptr_type %Class.fe1 [symbolic] -// CHECK:STDOUT: %pattern_type.9e0: type = pattern_type %ptr.955 [symbolic] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %ptr.79f: type = ptr_type %T [symbolic] -// CHECK:STDOUT: %pattern_type.afe: type = pattern_type %ptr.79f [symbolic] -// CHECK:STDOUT: %Class.GetAddr.type.402: type = fn_type @Class.GetAddr, @Class(%T) [symbolic] -// CHECK:STDOUT: %Class.GetAddr.102: %Class.GetAddr.type.402 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %T.578: %Copy.type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %Class.799: type = class_type @Class, @Class(%T.578) [symbolic] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T.578 [symbolic] +// CHECK:STDOUT: %require_complete.ecc: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %Class.elem.da5: type = unbound_element_type %Class.799, %T.as_type [symbolic] +// CHECK:STDOUT: %pattern_type.47a: type = pattern_type %Class.799 [symbolic] +// CHECK:STDOUT: %pattern_type.f8cebc.1: type = pattern_type %T.as_type [symbolic] +// CHECK:STDOUT: %Class.Get.type.c3c: type = fn_type @Class.Get, @Class(%T.578) [symbolic] +// CHECK:STDOUT: %Class.Get.c5f: %Class.Get.type.c3c = struct_value () [symbolic] +// CHECK:STDOUT: %ptr.0b3: type = ptr_type %Class.799 [symbolic] +// CHECK:STDOUT: %pattern_type.417: type = pattern_type %ptr.0b3 [symbolic] +// CHECK:STDOUT: %ptr.a75: type = ptr_type %T.as_type [symbolic] +// CHECK:STDOUT: %pattern_type.b45: type = pattern_type %ptr.a75 [symbolic] +// CHECK:STDOUT: %Class.GetAddr.type.d76: type = fn_type @Class.GetAddr, @Class(%T.578) [symbolic] +// CHECK:STDOUT: %Class.GetAddr.e5c: %Class.GetAddr.type.d76 = struct_value () [symbolic] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.type: type = fn_type @Class.as.Destroy.impl.Op, @Class.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %Class.as.Destroy.impl.Op: %Class.as.Destroy.impl.Op.type = struct_value () [symbolic] -// CHECK:STDOUT: %struct_type.x.2ac: type = struct_type {.x: %T} [symbolic] -// CHECK:STDOUT: %complete_type.433: = complete_type_witness %struct_type.x.2ac [symbolic] -// CHECK:STDOUT: %require_complete.4f8: = require_complete_type %Class.fe1 [symbolic] -// CHECK:STDOUT: %require_complete.6e5: = require_complete_type %ptr.79f [symbolic] -// CHECK:STDOUT: %require_complete.2ae: = require_complete_type %ptr.955 [symbolic] +// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T.578) [symbolic] +// CHECK:STDOUT: %struct_type.x.703: type = struct_type {.x: %T.as_type} [symbolic] +// CHECK:STDOUT: %complete_type.a8b: = complete_type_witness %struct_type.x.703 [symbolic] +// CHECK:STDOUT: %require_complete.ef5: = require_complete_type %Class.799 [symbolic] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.lookup_impl_witness.3ba: = lookup_impl_witness %T.578, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.72e: %Copy.type = facet_value %T.as_type, (%Copy.lookup_impl_witness.3ba) [symbolic] +// CHECK:STDOUT: %.671: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.72e [symbolic] +// CHECK:STDOUT: %impl.elem0.56e: %.671 = impl_witness_access %Copy.lookup_impl_witness.3ba, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.fb7: = specific_impl_function %impl.elem0.56e, @Copy.Op(%Copy.facet.72e) [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf: %ptr.as.Copy.impl.Op.type.f23 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.lookup_impl_witness.23e: = lookup_impl_witness %ptr.a75, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.d7e: %Copy.type = facet_value %ptr.a75, (%Copy.lookup_impl_witness.23e) [symbolic] +// CHECK:STDOUT: %.30e: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.d7e [symbolic] +// CHECK:STDOUT: %impl.elem0.cb9: %.30e = impl_witness_access %Copy.lookup_impl_witness.23e, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.e97: = specific_impl_function %impl.elem0.cb9, @Copy.Op(%Copy.facet.d7e) [symbolic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Class.247: type = class_type @Class, @Class(%i32) [concrete] -// CHECK:STDOUT: %pattern_type.0fa: type = pattern_type %Class.247 [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %DirectFieldAccess.type: type = fn_type @DirectFieldAccess [concrete] -// CHECK:STDOUT: %DirectFieldAccess: %DirectFieldAccess.type = struct_value () [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] // CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] // CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] -// CHECK:STDOUT: %Class.elem.2d8: type = unbound_element_type %Class.247, %i32 [concrete] -// CHECK:STDOUT: %Class.Get.type.59d: type = fn_type @Class.Get, @Class(%i32) [concrete] -// CHECK:STDOUT: %Class.Get.a40: %Class.Get.type.59d = struct_value () [concrete] -// CHECK:STDOUT: %Class.GetAddr.type.be7: type = fn_type @Class.GetAddr, @Class(%i32) [concrete] -// CHECK:STDOUT: %Class.GetAddr.909: %Class.GetAddr.type.be7 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %Class.38d: type = class_type @Class, @Class(%Copy.facet.26d) [concrete] +// CHECK:STDOUT: %pattern_type.13b: type = pattern_type %Class.38d [concrete] +// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] +// CHECK:STDOUT: %Class.elem.df5: type = unbound_element_type %Class.38d, %i32 [concrete] +// CHECK:STDOUT: %Class.Get.type.d81: type = fn_type @Class.Get, @Class(%Copy.facet.26d) [concrete] +// CHECK:STDOUT: %Class.Get.4ee: %Class.Get.type.d81 = struct_value () [concrete] +// CHECK:STDOUT: %Class.GetAddr.type.b82: type = fn_type @Class.GetAddr, @Class(%Copy.facet.26d) [concrete] +// CHECK:STDOUT: %Class.GetAddr.831: %Class.GetAddr.type.b82 = struct_value () [concrete] // CHECK:STDOUT: %struct_type.x.ed6: type = struct_type {.x: %i32} [concrete] // CHECK:STDOUT: %complete_type.1ec: = complete_type_witness %struct_type.x.ed6 [concrete] -// CHECK:STDOUT: %MethodCall.type: type = fn_type @MethodCall [concrete] -// CHECK:STDOUT: %MethodCall: %MethodCall.type = struct_value () [concrete] -// CHECK:STDOUT: %Class.Get.specific_fn: = specific_function %Class.Get.a40, @Class.Get(%i32) [concrete] -// CHECK:STDOUT: %ptr.f7c: type = ptr_type %Class.247 [concrete] -// CHECK:STDOUT: %pattern_type.14a: type = pattern_type %ptr.f7c [concrete] -// CHECK:STDOUT: %AddrMethodCall.type: type = fn_type @AddrMethodCall [concrete] -// CHECK:STDOUT: %AddrMethodCall: %AddrMethodCall.type = struct_value () [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] +// CHECK:STDOUT: %Class.Get.specific_fn: = specific_function %Class.Get.4ee, @Class.Get(%Copy.facet.26d) [concrete] +// CHECK:STDOUT: %ptr.5c5: type = ptr_type %Class.38d [concrete] +// CHECK:STDOUT: %pattern_type.030: type = pattern_type %ptr.5c5 [concrete] // CHECK:STDOUT: %ptr.235: type = ptr_type %i32 [concrete] // CHECK:STDOUT: %pattern_type.fe8: type = pattern_type %ptr.235 [concrete] -// CHECK:STDOUT: %Class.GetAddr.specific_fn: = specific_function %Class.GetAddr.909, @Class.GetAddr(%i32) [concrete] +// CHECK:STDOUT: %Class.GetAddr.specific_fn: = specific_function %Class.GetAddr.831, @Class.GetAddr(%Copy.facet.26d) [concrete] // CHECK:STDOUT: %complete_type.3d0: = complete_type_witness %ptr.235 [concrete] -// CHECK:STDOUT: %complete_type.6ee: = complete_type_witness %ptr.f7c [concrete] +// CHECK:STDOUT: %complete_type.07d: = complete_type_witness %ptr.5c5 [concrete] +// CHECK:STDOUT: %Copy.impl_witness.19c: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%i32) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.3ea: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%i32) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.2f4: %ptr.as.Copy.impl.Op.type.3ea = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.bab: %Copy.type = facet_value %ptr.235, (%Copy.impl_witness.19c) [concrete] +// CHECK:STDOUT: %.284: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.bab [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn: = specific_function %ptr.as.Copy.impl.Op.2f4, @ptr.as.Copy.impl.Op(%i32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Destroy = %Core.Destroy -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .DirectFieldAccess = %DirectFieldAccess.decl -// CHECK:STDOUT: .MethodCall = %MethodCall.decl -// CHECK:STDOUT: .AddrMethodCall = %AddrMethodCall.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc2_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc2_13.1 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %DirectFieldAccess.decl: %DirectFieldAccess.type = fn_decl @DirectFieldAccess [concrete = constants.%DirectFieldAccess] { -// CHECK:STDOUT: %x.patt: %pattern_type.0fa = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: %pattern_type.0fa = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc10_40: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc10_40: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %x.param: %Class.247 = value_param call_param0 -// CHECK:STDOUT: %.loc10: type = splice_block %Class [concrete = constants.%Class.247] { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %int_32.loc10_31: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc10_31: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(constants.%i32) [concrete = constants.%Class.247] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: %Class.247 = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %MethodCall.decl: %MethodCall.type = fn_decl @MethodCall [concrete = constants.%MethodCall] { -// CHECK:STDOUT: %x.patt: %pattern_type.0fa = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: %pattern_type.0fa = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc14_33: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc14_33: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %x.param: %Class.247 = value_param call_param0 -// CHECK:STDOUT: %.loc14: type = splice_block %Class [concrete = constants.%Class.247] { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %int_32.loc14_24: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc14_24: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(constants.%i32) [concrete = constants.%Class.247] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: %Class.247 = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %AddrMethodCall.decl: %AddrMethodCall.type = fn_decl @AddrMethodCall [concrete = constants.%AddrMethodCall] { -// CHECK:STDOUT: %p.patt: %pattern_type.14a = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.14a = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc18_38: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc18_38: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %p.param: %ptr.f7c = value_param call_param0 -// CHECK:STDOUT: %.loc18: type = splice_block %ptr [concrete = constants.%ptr.f7c] { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %int_32.loc18_28: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc18_28: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(constants.%i32) [concrete = constants.%Class.247] -// CHECK:STDOUT: %ptr: type = ptr_type %Class [concrete = constants.%ptr.f7c] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.f7c = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic impl @Class.as.Destroy.impl(@Class.%T.loc2_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness)] +// CHECK:STDOUT: generic impl @Class.as.Destroy.impl(@Class.%T.loc4_13.2: %Copy.type) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.type: type = fn_type @Class.as.Destroy.impl.Op, @Class.as.Destroy.impl(%T) [symbolic = %Class.as.Destroy.impl.Op.type (constants.%Class.as.Destroy.impl.Op.type)] -// CHECK:STDOUT: %Class.as.Destroy.impl.Op: @Class.as.Destroy.impl.%Class.as.Destroy.impl.Op.type (%Class.as.Destroy.impl.Op.type) = struct_value () [symbolic = %Class.as.Destroy.impl.Op (constants.%Class.as.Destroy.impl.Op)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: impl: @Class.%Self.ref as constants.%Destroy.type { -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.decl: @Class.as.Destroy.impl.%Class.as.Destroy.impl.Op.type (%Class.as.Destroy.impl.Op.type) = fn_decl @Class.as.Destroy.impl.Op [symbolic = @Class.as.Destroy.impl.%Class.as.Destroy.impl.Op (constants.%Class.as.Destroy.impl.Op)] { -// CHECK:STDOUT: %self.patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.9e0) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.9e0) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc2_23.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.955) = value_param call_param0 -// CHECK:STDOUT: %.loc2_23.2: type = splice_block %Self.ref [symbolic = %Class (constants.%Class.fe1)] { -// CHECK:STDOUT: %.loc2_23.3: type = specific_constant constants.%Class.fe1, @Class(constants.%T) [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc2_23.3 [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Class.as.Destroy.impl.Op.%ptr (%ptr.955) = bind_name self, %self.param -// CHECK:STDOUT: } +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .Op = %Class.as.Destroy.impl.Op.decl @@ -225,471 +161,281 @@ fn StaticMemberFunctionCall(T:! type) -> Class(T) { // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc2_13.2: type) { -// CHECK:STDOUT: %T.loc2_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc2_13.1 (constants.%T)] +// CHECK:STDOUT: generic class @Class(%T.loc4_13.2: %Copy.type) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc2_13.1 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc2_13.1) [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.loc2_13.1 [symbolic = %Class.elem (constants.%Class.elem.e26)] -// CHECK:STDOUT: %Class.Get.type: type = fn_type @Class.Get, @Class(%T.loc2_13.1) [symbolic = %Class.Get.type (constants.%Class.Get.type.fd9)] -// CHECK:STDOUT: %Class.Get: @Class.%Class.Get.type (%Class.Get.type.fd9) = struct_value () [symbolic = %Class.Get (constants.%Class.Get.cf9)] -// CHECK:STDOUT: %Class.GetAddr.type: type = fn_type @Class.GetAddr, @Class(%T.loc2_13.1) [symbolic = %Class.GetAddr.type (constants.%Class.GetAddr.type.402)] -// CHECK:STDOUT: %Class.GetAddr: @Class.%Class.GetAddr.type (%Class.GetAddr.type.402) = struct_value () [symbolic = %Class.GetAddr (constants.%Class.GetAddr.102)] -// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: @Class.%T.loc2_13.1 (%T)} [symbolic = %struct_type.x (constants.%struct_type.x.2ac)] -// CHECK:STDOUT: %complete_type.loc8_1.2: = complete_type_witness %struct_type.x [symbolic = %complete_type.loc8_1.2 (constants.%complete_type.433)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc2_13.2 [symbolic = %T.loc2_13.1 (constants.%T)] -// CHECK:STDOUT: %.loc3: @Class.%Class.elem (%Class.elem.e26) = field_decl x, element0 [concrete] -// CHECK:STDOUT: %Class.Get.decl: @Class.%Class.Get.type (%Class.Get.type.fd9) = fn_decl @Class.Get [symbolic = @Class.%Class.Get (constants.%Class.Get.cf9)] { -// CHECK:STDOUT: %self.patt: @Class.Get.%pattern_type.loc5_10 (%pattern_type.3c1) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Class.Get.%pattern_type.loc5_10 (%pattern_type.3c1) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @Class.Get.%pattern_type.loc5_24 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Class.Get.%pattern_type.loc5_24 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref: type = name_ref T, @Class.%T.loc2_13.2 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %self.param: @Class.Get.%Class (%Class.fe1) = value_param call_param0 -// CHECK:STDOUT: %.loc5_16.1: type = splice_block %Self.ref [symbolic = %Class (constants.%Class.fe1)] { -// CHECK:STDOUT: %.loc5_16.2: type = specific_constant constants.%Class.fe1, @Class(constants.%T) [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc5_16.2 [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Class.Get.%Class (%Class.fe1) = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref @Class.Get.%T (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @Class.Get.%T (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Class.GetAddr.decl: @Class.%Class.GetAddr.type (%Class.GetAddr.type.402) = fn_decl @Class.GetAddr [symbolic = @Class.%Class.GetAddr (constants.%Class.GetAddr.102)] { -// CHECK:STDOUT: %self.patt: @Class.GetAddr.%pattern_type.loc7_19 (%pattern_type.9e0) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Class.GetAddr.%pattern_type.loc7_19 (%pattern_type.9e0) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc7_14: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: %return.patt: @Class.GetAddr.%pattern_type.loc7_34 (%pattern_type.afe) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Class.GetAddr.%pattern_type.loc7_34 (%pattern_type.afe) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref: type = name_ref T, @Class.%T.loc2_13.2 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %ptr.loc7_38.2: type = ptr_type %T.ref [symbolic = %ptr.loc7_38.1 (constants.%ptr.79f)] -// CHECK:STDOUT: %self.param: @Class.GetAddr.%ptr.loc7_29.1 (%ptr.955) = value_param call_param0 -// CHECK:STDOUT: %.loc7_29: type = splice_block %ptr.loc7_29.2 [symbolic = %ptr.loc7_29.1 (constants.%ptr.955)] { -// CHECK:STDOUT: %.loc7_25: type = specific_constant constants.%Class.fe1, @Class(constants.%T) [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc7_25 [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %ptr.loc7_29.2: type = ptr_type %Self.ref [symbolic = %ptr.loc7_29.1 (constants.%ptr.955)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Class.GetAddr.%ptr.loc7_29.1 (%ptr.955) = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref @Class.GetAddr.%ptr.loc7_38.1 (%ptr.79f) = out_param call_param1 -// CHECK:STDOUT: %return: ref @Class.GetAddr.%ptr.loc7_38.1 (%ptr.79f) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Class.fe1 [symbolic = @Class.as.Destroy.impl.%Class (constants.%Class.fe1)] -// CHECK:STDOUT: impl_decl @Class.as.Destroy.impl [concrete] {} {} -// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Class.as.Destroy.impl.%Class.as.Destroy.impl.Op.decl), @Class.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Class.as.Destroy.impl(constants.%T) [symbolic = @Class.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness)] -// CHECK:STDOUT: %complete_type.loc8_1.1: = complete_type_witness constants.%struct_type.x.2ac [symbolic = %complete_type.loc8_1.2 (constants.%complete_type.433)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc8_1.1 +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type.loc18_1.1 // CHECK:STDOUT: // CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class.fe1 +// CHECK:STDOUT: .Self = constants.%Class.799 // CHECK:STDOUT: .T = -// CHECK:STDOUT: .x = %.loc3 +// CHECK:STDOUT: .x = %.loc5_8 // CHECK:STDOUT: .Get = %Class.Get.decl // CHECK:STDOUT: .GetAddr = %Class.GetAddr.decl // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Class.Get(@Class.%T.loc2_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %pattern_type.loc5_10: type = pattern_type %Class [symbolic = %pattern_type.loc5_10 (constants.%pattern_type.3c1)] -// CHECK:STDOUT: %pattern_type.loc5_24: type = pattern_type %T [symbolic = %pattern_type.loc5_24 (constants.%pattern_type.7dc)] +// CHECK:STDOUT: generic fn @Class.Get(@Class.%T.loc4_13.2: %Copy.type) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc5_14: = require_complete_type %Class [symbolic = %require_complete.loc5_14 (constants.%require_complete.4f8)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic = %Class.elem (constants.%Class.elem.e26)] -// CHECK:STDOUT: %require_complete.loc5_42: = require_complete_type %T [symbolic = %require_complete.loc5_42 (constants.%require_complete.4ae)] +// CHECK:STDOUT: +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.as_type.loc7_27.1 [symbolic = %Class.elem (constants.%Class.elem.da5)] +// CHECK:STDOUT: %require_complete.loc9: = require_complete_type %T.as_type.loc7_27.1 [symbolic = %require_complete.loc9 (constants.%require_complete.ecc)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %T, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.3ba)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %T.as_type.loc7_27.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.72e)] +// CHECK:STDOUT: %.loc9_16.4: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc9_16.4 (constants.%.671)] +// CHECK:STDOUT: %impl.elem0.loc9_16.2: @Class.Get.%.loc9_16.4 (%.671) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc9_16.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %specific_impl_fn.loc9_16.2: = specific_impl_function %impl.elem0.loc9_16.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc9_16.2 (constants.%specific_impl_fn.fb7)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Class.Get.%Class (%Class.fe1)) -> @Class.Get.%T (%T) { +// CHECK:STDOUT: fn(%self.param: @Class.Get.%Class (%Class.799)) -> @Class.Get.%T.as_type.loc7_27.1 (%T.as_type) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: @Class.Get.%Class (%Class.fe1) = name_ref self, %self -// CHECK:STDOUT: %x.ref: @Class.Get.%Class.elem (%Class.elem.e26) = name_ref x, @Class.%.loc3 [concrete = @Class.%.loc3] -// CHECK:STDOUT: %.loc5_42.1: ref @Class.Get.%T (%T) = class_element_access %self.ref, element0 -// CHECK:STDOUT: %.loc5_42.2: @Class.Get.%T (%T) = bind_value %.loc5_42.1 -// CHECK:STDOUT: return %.loc5_42.2 +// CHECK:STDOUT: %self.ref: @Class.Get.%Class (%Class.799) = name_ref self, %self +// CHECK:STDOUT: %x.ref: @Class.Get.%Class.elem (%Class.elem.da5) = name_ref x, @Class.%.loc5_8 [concrete = @Class.%.loc5_8] +// CHECK:STDOUT: %.loc9_16.1: ref @Class.Get.%T.as_type.loc7_27.1 (%T.as_type) = class_element_access %self.ref, element0 +// CHECK:STDOUT: %.loc9_16.2: @Class.Get.%T.as_type.loc7_27.1 (%T.as_type) = bind_value %.loc9_16.1 +// CHECK:STDOUT: %impl.elem0.loc9_16.1: @Class.Get.%.loc9_16.4 (%.671) = impl_witness_access constants.%Copy.lookup_impl_witness.3ba, element0 [symbolic = %impl.elem0.loc9_16.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %bound_method.loc9_16.1: = bound_method %.loc9_16.2, %impl.elem0.loc9_16.1 +// CHECK:STDOUT: %specific_impl_fn.loc9_16.1: = specific_impl_function %impl.elem0.loc9_16.1, @Copy.Op(constants.%Copy.facet.72e) [symbolic = %specific_impl_fn.loc9_16.2 (constants.%specific_impl_fn.fb7)] +// CHECK:STDOUT: %bound_method.loc9_16.2: = bound_method %.loc9_16.2, %specific_impl_fn.loc9_16.1 +// CHECK:STDOUT: %.loc9_16.3: init @Class.Get.%T.as_type.loc7_27.1 (%T.as_type) = call %bound_method.loc9_16.2(%.loc9_16.2) +// CHECK:STDOUT: return %.loc9_16.3 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Class.GetAddr(@Class.%T.loc2_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %ptr.loc7_29.1: type = ptr_type %Class [symbolic = %ptr.loc7_29.1 (constants.%ptr.955)] -// CHECK:STDOUT: %pattern_type.loc7_19: type = pattern_type %ptr.loc7_29.1 [symbolic = %pattern_type.loc7_19 (constants.%pattern_type.9e0)] -// CHECK:STDOUT: %ptr.loc7_38.1: type = ptr_type %T [symbolic = %ptr.loc7_38.1 (constants.%ptr.79f)] -// CHECK:STDOUT: %pattern_type.loc7_34: type = pattern_type %ptr.loc7_38.1 [symbolic = %pattern_type.loc7_34 (constants.%pattern_type.afe)] +// CHECK:STDOUT: generic fn @Class.GetAddr(@Class.%T.loc4_13.2: %Copy.type) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc7_34: = require_complete_type %ptr.loc7_38.1 [symbolic = %require_complete.loc7_34 (constants.%require_complete.6e5)] -// CHECK:STDOUT: %require_complete.loc7_23: = require_complete_type %ptr.loc7_29.1 [symbolic = %require_complete.loc7_23 (constants.%require_complete.2ae)] -// CHECK:STDOUT: %require_complete.loc7_54: = require_complete_type %Class [symbolic = %require_complete.loc7_54 (constants.%require_complete.4f8)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic = %Class.elem (constants.%Class.elem.e26)] +// CHECK:STDOUT: +// CHECK:STDOUT: %require_complete.loc15: = require_complete_type %Class [symbolic = %require_complete.loc15 (constants.%require_complete.ef5)] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.as_type.loc13_38.1 [symbolic = %Class.elem (constants.%Class.elem.da5)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %ptr.loc13_38.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.23e)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %ptr.loc13_38.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.d7e)] +// CHECK:STDOUT: %.loc15_12.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc15_12.2 (constants.%.30e)] +// CHECK:STDOUT: %impl.elem0.loc15_12.2: @Class.GetAddr.%.loc15_12.2 (%.30e) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc15_12.2 (constants.%impl.elem0.cb9)] +// CHECK:STDOUT: %specific_impl_fn.loc15_12.2: = specific_impl_function %impl.elem0.loc15_12.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc15_12.2 (constants.%specific_impl_fn.e97)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Class.GetAddr.%ptr.loc7_29.1 (%ptr.955)) -> @Class.GetAddr.%ptr.loc7_38.1 (%ptr.79f) { +// CHECK:STDOUT: fn(%self.param: @Class.GetAddr.%ptr.loc13_29.1 (%ptr.0b3)) -> @Class.GetAddr.%ptr.loc13_38.1 (%ptr.a75) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: @Class.GetAddr.%ptr.loc7_29.1 (%ptr.955) = name_ref self, %self -// CHECK:STDOUT: %.loc7_54.1: ref @Class.GetAddr.%Class (%Class.fe1) = deref %self.ref -// CHECK:STDOUT: %x.ref: @Class.GetAddr.%Class.elem (%Class.elem.e26) = name_ref x, @Class.%.loc3 [concrete = @Class.%.loc3] -// CHECK:STDOUT: %.loc7_54.2: ref @Class.GetAddr.%T (%T) = class_element_access %.loc7_54.1, element0 -// CHECK:STDOUT: %addr: @Class.GetAddr.%ptr.loc7_38.1 (%ptr.79f) = addr_of %.loc7_54.2 -// CHECK:STDOUT: return %addr +// CHECK:STDOUT: %self.ref: @Class.GetAddr.%ptr.loc13_29.1 (%ptr.0b3) = name_ref self, %self +// CHECK:STDOUT: %.loc15_17.1: ref @Class.GetAddr.%Class (%Class.799) = deref %self.ref +// CHECK:STDOUT: %x.ref: @Class.GetAddr.%Class.elem (%Class.elem.da5) = name_ref x, @Class.%.loc5_8 [concrete = @Class.%.loc5_8] +// CHECK:STDOUT: %.loc15_17.2: ref @Class.GetAddr.%T.as_type.loc13_38.1 (%T.as_type) = class_element_access %.loc15_17.1, element0 +// CHECK:STDOUT: %addr: @Class.GetAddr.%ptr.loc13_38.1 (%ptr.a75) = addr_of %.loc15_17.2 +// CHECK:STDOUT: %impl.elem0.loc15_12.1: @Class.GetAddr.%.loc15_12.2 (%.30e) = impl_witness_access constants.%Copy.lookup_impl_witness.23e, element0 [symbolic = %impl.elem0.loc15_12.2 (constants.%impl.elem0.cb9)] +// CHECK:STDOUT: %bound_method.loc15_12.1: = bound_method %addr, %impl.elem0.loc15_12.1 +// CHECK:STDOUT: %specific_impl_fn.loc15_12.1: = specific_impl_function %impl.elem0.loc15_12.1, @Copy.Op(constants.%Copy.facet.d7e) [symbolic = %specific_impl_fn.loc15_12.2 (constants.%specific_impl_fn.e97)] +// CHECK:STDOUT: %bound_method.loc15_12.2: = bound_method %addr, %specific_impl_fn.loc15_12.1 +// CHECK:STDOUT: %.loc15_12.1: init @Class.GetAddr.%ptr.loc13_38.1 (%ptr.a75) = call %bound_method.loc15_12.2(%addr) +// CHECK:STDOUT: return %.loc15_12.1 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Class.as.Destroy.impl.Op(@Class.%T.loc2_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %ptr: type = ptr_type %Class [symbolic = %ptr (constants.%ptr.955)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.9e0)] +// CHECK:STDOUT: generic fn @Class.as.Destroy.impl.Op(@Class.%T.loc4_13.2: %Copy.type) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.955)) = "no_op"; +// CHECK:STDOUT: fn(%self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.0b3)) = "no_op"; // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: fn @DirectFieldAccess(%x.param: %Class.247) -> %i32 { +// CHECK:STDOUT: fn @DirectFieldAccess(%x.param: %Class.38d) -> %i32 { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref.loc11_10: %Class.247 = name_ref x, %x -// CHECK:STDOUT: %x.ref.loc11_11: %Class.elem.2d8 = name_ref x, @Class.%.loc3 [concrete = @Class.%.loc3] -// CHECK:STDOUT: %.loc11_11.1: ref %i32 = class_element_access %x.ref.loc11_10, element0 -// CHECK:STDOUT: %.loc11_11.2: %i32 = bind_value %.loc11_11.1 -// CHECK:STDOUT: return %.loc11_11.2 +// CHECK:STDOUT: %x.ref.loc22_10: %Class.38d = name_ref x, %x +// CHECK:STDOUT: %x.ref.loc22_11: %Class.elem.df5 = name_ref x, @Class.%.loc5_8 [concrete = @Class.%.loc5_8] +// CHECK:STDOUT: %.loc22_11.1: ref %i32 = class_element_access %x.ref.loc22_10, element0 +// CHECK:STDOUT: %.loc22_11.2: %i32 = bind_value %.loc22_11.1 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc22_11.1: = bound_method %.loc22_11.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc22_11.2: = bound_method %.loc22_11.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc22_11.2(%.loc22_11.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: fn @MethodCall(%x.param: %Class.247) -> %i32 { +// CHECK:STDOUT: fn @MethodCall(%x.param: %Class.38d) -> %i32 { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: %Class.247 = name_ref x, %x -// CHECK:STDOUT: %.loc15_11: %Class.Get.type.59d = specific_constant @Class.%Class.Get.decl, @Class(constants.%i32) [concrete = constants.%Class.Get.a40] -// CHECK:STDOUT: %Get.ref: %Class.Get.type.59d = name_ref Get, %.loc15_11 [concrete = constants.%Class.Get.a40] +// CHECK:STDOUT: %x.ref: %Class.38d = name_ref x, %x +// CHECK:STDOUT: %.loc28: %Class.Get.type.d81 = specific_constant @Class.%Class.Get.decl, @Class(constants.%Copy.facet.26d) [concrete = constants.%Class.Get.4ee] +// CHECK:STDOUT: %Get.ref: %Class.Get.type.d81 = name_ref Get, %.loc28 [concrete = constants.%Class.Get.4ee] // CHECK:STDOUT: %Class.Get.bound: = bound_method %x.ref, %Get.ref -// CHECK:STDOUT: %Class.Get.specific_fn: = specific_function %Get.ref, @Class.Get(constants.%i32) [concrete = constants.%Class.Get.specific_fn] +// CHECK:STDOUT: %Class.Get.specific_fn: = specific_function %Get.ref, @Class.Get(constants.%Copy.facet.26d) [concrete = constants.%Class.Get.specific_fn] // CHECK:STDOUT: %bound_method: = bound_method %x.ref, %Class.Get.specific_fn // CHECK:STDOUT: %Class.Get.call: init %i32 = call %bound_method(%x.ref) -// CHECK:STDOUT: %.loc15_17.1: %i32 = value_of_initializer %Class.Get.call -// CHECK:STDOUT: %.loc15_17.2: %i32 = converted %Class.Get.call, %.loc15_17.1 -// CHECK:STDOUT: return %.loc15_17.2 +// CHECK:STDOUT: return %Class.Get.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: fn @AddrMethodCall(%p.param: %ptr.f7c) -> %i32 { +// CHECK:STDOUT: fn @AddrMethodCall(%p.param: %ptr.5c5) -> %i32 { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.f7c = name_ref p, %p -// CHECK:STDOUT: %.loc19_12.1: ref %Class.247 = deref %p.ref -// CHECK:STDOUT: %.loc19_12.2: %Class.GetAddr.type.be7 = specific_constant @Class.%Class.GetAddr.decl, @Class(constants.%i32) [concrete = constants.%Class.GetAddr.909] -// CHECK:STDOUT: %GetAddr.ref: %Class.GetAddr.type.be7 = name_ref GetAddr, %.loc19_12.2 [concrete = constants.%Class.GetAddr.909] -// CHECK:STDOUT: %Class.GetAddr.bound: = bound_method %.loc19_12.1, %GetAddr.ref -// CHECK:STDOUT: %Class.GetAddr.specific_fn: = specific_function %GetAddr.ref, @Class.GetAddr(constants.%i32) [concrete = constants.%Class.GetAddr.specific_fn] -// CHECK:STDOUT: %bound_method: = bound_method %.loc19_12.1, %Class.GetAddr.specific_fn -// CHECK:STDOUT: %addr: %ptr.f7c = addr_of %.loc19_12.1 -// CHECK:STDOUT: %Class.GetAddr.call: init %ptr.235 = call %bound_method(%addr) -// CHECK:STDOUT: %.loc19_22.1: %ptr.235 = value_of_initializer %Class.GetAddr.call -// CHECK:STDOUT: %.loc19_22.2: %ptr.235 = converted %Class.GetAddr.call, %.loc19_22.1 -// CHECK:STDOUT: %.loc19_10.1: ref %i32 = deref %.loc19_22.2 -// CHECK:STDOUT: %.loc19_10.2: %i32 = bind_value %.loc19_10.1 -// CHECK:STDOUT: return %.loc19_10.2 +// CHECK:STDOUT: %p.ref: %ptr.5c5 = name_ref p, %p +// CHECK:STDOUT: %.loc34_12.1: ref %Class.38d = deref %p.ref +// CHECK:STDOUT: %.loc34_12.2: %Class.GetAddr.type.b82 = specific_constant @Class.%Class.GetAddr.decl, @Class(constants.%Copy.facet.26d) [concrete = constants.%Class.GetAddr.831] +// CHECK:STDOUT: %GetAddr.ref: %Class.GetAddr.type.b82 = name_ref GetAddr, %.loc34_12.2 [concrete = constants.%Class.GetAddr.831] +// CHECK:STDOUT: %Class.GetAddr.bound: = bound_method %.loc34_12.1, %GetAddr.ref +// CHECK:STDOUT: %Class.GetAddr.specific_fn: = specific_function %GetAddr.ref, @Class.GetAddr(constants.%Copy.facet.26d) [concrete = constants.%Class.GetAddr.specific_fn] +// CHECK:STDOUT: %bound_method.loc34_22: = bound_method %.loc34_12.1, %Class.GetAddr.specific_fn +// CHECK:STDOUT: %addr: %ptr.5c5 = addr_of %.loc34_12.1 +// CHECK:STDOUT: %Class.GetAddr.call: init %ptr.235 = call %bound_method.loc34_22(%addr) +// CHECK:STDOUT: %.loc34_22.1: %ptr.235 = value_of_initializer %Class.GetAddr.call +// CHECK:STDOUT: %.loc34_22.2: %ptr.235 = converted %Class.GetAddr.call, %.loc34_22.1 +// CHECK:STDOUT: %.loc34_10.1: ref %i32 = deref %.loc34_22.2 +// CHECK:STDOUT: %.loc34_10.2: %i32 = bind_value %.loc34_10.1 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc34_10.1: = bound_method %.loc34_10.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc34_10.2: = bound_method %.loc34_10.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc34_10.2(%.loc34_10.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T) { -// CHECK:STDOUT: %T.loc2_13.1 => constants.%T +// CHECK:STDOUT: specific @Class(constants.%T.578) { +// CHECK:STDOUT: %T.loc4_13.1 => constants.%T.578 // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae -// CHECK:STDOUT: %Class => constants.%Class.fe1 -// CHECK:STDOUT: %Class.elem => constants.%Class.elem.e26 -// CHECK:STDOUT: %Class.Get.type => constants.%Class.Get.type.fd9 -// CHECK:STDOUT: %Class.Get => constants.%Class.Get.cf9 -// CHECK:STDOUT: %Class.GetAddr.type => constants.%Class.GetAddr.type.402 -// CHECK:STDOUT: %Class.GetAddr => constants.%Class.GetAddr.102 -// CHECK:STDOUT: %struct_type.x => constants.%struct_type.x.2ac -// CHECK:STDOUT: %complete_type.loc8_1.2 => constants.%complete_type.433 +// CHECK:STDOUT: %T.as_type.loc5_10.2 => constants.%T.as_type +// CHECK:STDOUT: %require_complete => constants.%require_complete.ecc +// CHECK:STDOUT: %Class => constants.%Class.799 +// CHECK:STDOUT: %Class.elem => constants.%Class.elem.da5 +// CHECK:STDOUT: %Class.Get.type => constants.%Class.Get.type.c3c +// CHECK:STDOUT: %Class.Get => constants.%Class.Get.c5f +// CHECK:STDOUT: %Class.GetAddr.type => constants.%Class.GetAddr.type.d76 +// CHECK:STDOUT: %Class.GetAddr => constants.%Class.GetAddr.e5c +// CHECK:STDOUT: %struct_type.x => constants.%struct_type.x.703 +// CHECK:STDOUT: %complete_type.loc18_1.2 => constants.%complete_type.a8b // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.Get(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Class => constants.%Class.fe1 -// CHECK:STDOUT: %pattern_type.loc5_10 => constants.%pattern_type.3c1 -// CHECK:STDOUT: %pattern_type.loc5_24 => constants.%pattern_type.7dc +// CHECK:STDOUT: specific @Class.Get(constants.%T.578) { +// CHECK:STDOUT: %T => constants.%T.578 +// CHECK:STDOUT: %Class => constants.%Class.799 +// CHECK:STDOUT: %pattern_type.loc7_10 => constants.%pattern_type.47a +// CHECK:STDOUT: %T.as_type.loc7_27.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type.loc7_24 => constants.%pattern_type.f8cebc.1 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.GetAddr(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Class => constants.%Class.fe1 -// CHECK:STDOUT: %ptr.loc7_29.1 => constants.%ptr.955 -// CHECK:STDOUT: %pattern_type.loc7_19 => constants.%pattern_type.9e0 -// CHECK:STDOUT: %ptr.loc7_38.1 => constants.%ptr.79f -// CHECK:STDOUT: %pattern_type.loc7_34 => constants.%pattern_type.afe +// CHECK:STDOUT: specific @Class.GetAddr(constants.%T.578) { +// CHECK:STDOUT: %T => constants.%T.578 +// CHECK:STDOUT: %Class => constants.%Class.799 +// CHECK:STDOUT: %ptr.loc13_29.1 => constants.%ptr.0b3 +// CHECK:STDOUT: %pattern_type.loc13_19 => constants.%pattern_type.417 +// CHECK:STDOUT: %T.as_type.loc13_38.1 => constants.%T.as_type +// CHECK:STDOUT: %ptr.loc13_38.1 => constants.%ptr.a75 +// CHECK:STDOUT: %pattern_type.loc13_34 => constants.%pattern_type.b45 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Class => constants.%Class.fe1 +// CHECK:STDOUT: specific @Class.as.Destroy.impl(constants.%T.578) { +// CHECK:STDOUT: %T => constants.%T.578 +// CHECK:STDOUT: %Class => constants.%Class.799 // CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Class => constants.%Class.fe1 -// CHECK:STDOUT: %ptr => constants.%ptr.955 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.9e0 +// CHECK:STDOUT: specific @Class.as.Destroy.impl.Op(constants.%T.578) { +// CHECK:STDOUT: %T => constants.%T.578 +// CHECK:STDOUT: %Class => constants.%Class.799 +// CHECK:STDOUT: %ptr => constants.%ptr.0b3 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.417 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%i32) { -// CHECK:STDOUT: %T.loc2_13.1 => constants.%i32 +// CHECK:STDOUT: specific @Class(constants.%Copy.facet.26d) { +// CHECK:STDOUT: %T.loc4_13.1 => constants.%Copy.facet.26d // CHECK:STDOUT: // CHECK:STDOUT: !definition: +// CHECK:STDOUT: %T.as_type.loc5_10.2 => constants.%i32 // CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %Class => constants.%Class.247 -// CHECK:STDOUT: %Class.elem => constants.%Class.elem.2d8 -// CHECK:STDOUT: %Class.Get.type => constants.%Class.Get.type.59d -// CHECK:STDOUT: %Class.Get => constants.%Class.Get.a40 -// CHECK:STDOUT: %Class.GetAddr.type => constants.%Class.GetAddr.type.be7 -// CHECK:STDOUT: %Class.GetAddr => constants.%Class.GetAddr.909 +// CHECK:STDOUT: %Class => constants.%Class.38d +// CHECK:STDOUT: %Class.elem => constants.%Class.elem.df5 +// CHECK:STDOUT: %Class.Get.type => constants.%Class.Get.type.d81 +// CHECK:STDOUT: %Class.Get => constants.%Class.Get.4ee +// CHECK:STDOUT: %Class.GetAddr.type => constants.%Class.GetAddr.type.b82 +// CHECK:STDOUT: %Class.GetAddr => constants.%Class.GetAddr.831 // CHECK:STDOUT: %struct_type.x => constants.%struct_type.x.ed6 -// CHECK:STDOUT: %complete_type.loc8_1.2 => constants.%complete_type.1ec +// CHECK:STDOUT: %complete_type.loc18_1.2 => constants.%complete_type.1ec // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.Get(constants.%i32) { -// CHECK:STDOUT: %T => constants.%i32 -// CHECK:STDOUT: %Class => constants.%Class.247 -// CHECK:STDOUT: %pattern_type.loc5_10 => constants.%pattern_type.0fa -// CHECK:STDOUT: %pattern_type.loc5_24 => constants.%pattern_type.7ce +// CHECK:STDOUT: specific @Class.Get(constants.%Copy.facet.26d) { +// CHECK:STDOUT: %T => constants.%Copy.facet.26d +// CHECK:STDOUT: %Class => constants.%Class.38d +// CHECK:STDOUT: %pattern_type.loc7_10 => constants.%pattern_type.13b +// CHECK:STDOUT: %T.as_type.loc7_27.1 => constants.%i32 +// CHECK:STDOUT: %pattern_type.loc7_24 => constants.%pattern_type.7ce // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc5_14 => constants.%complete_type.1ec -// CHECK:STDOUT: %Class.elem => constants.%Class.elem.2d8 -// CHECK:STDOUT: %require_complete.loc5_42 => constants.%complete_type.f8a +// CHECK:STDOUT: %require_complete.loc7 => constants.%complete_type.1ec +// CHECK:STDOUT: %Class.elem => constants.%Class.elem.df5 +// CHECK:STDOUT: %require_complete.loc9 => constants.%complete_type.f8a +// CHECK:STDOUT: %Copy.lookup_impl_witness => constants.%Copy.impl_witness.f0b +// CHECK:STDOUT: %Copy.facet => constants.%Copy.facet.26d +// CHECK:STDOUT: %.loc9_16.4 => constants.%.3c4 +// CHECK:STDOUT: %impl.elem0.loc9_16.2 => constants.%Int.as.Copy.impl.Op.87e +// CHECK:STDOUT: %specific_impl_fn.loc9_16.2 => constants.%Int.as.Copy.impl.Op.specific_fn // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.GetAddr(constants.%i32) { -// CHECK:STDOUT: %T => constants.%i32 -// CHECK:STDOUT: %Class => constants.%Class.247 -// CHECK:STDOUT: %ptr.loc7_29.1 => constants.%ptr.f7c -// CHECK:STDOUT: %pattern_type.loc7_19 => constants.%pattern_type.14a -// CHECK:STDOUT: %ptr.loc7_38.1 => constants.%ptr.235 -// CHECK:STDOUT: %pattern_type.loc7_34 => constants.%pattern_type.fe8 +// CHECK:STDOUT: specific @Class.GetAddr(constants.%Copy.facet.26d) { +// CHECK:STDOUT: %T => constants.%Copy.facet.26d +// CHECK:STDOUT: %Class => constants.%Class.38d +// CHECK:STDOUT: %ptr.loc13_29.1 => constants.%ptr.5c5 +// CHECK:STDOUT: %pattern_type.loc13_19 => constants.%pattern_type.030 +// CHECK:STDOUT: %T.as_type.loc13_38.1 => constants.%i32 +// CHECK:STDOUT: %ptr.loc13_38.1 => constants.%ptr.235 +// CHECK:STDOUT: %pattern_type.loc13_34 => constants.%pattern_type.fe8 // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc7_34 => constants.%complete_type.3d0 -// CHECK:STDOUT: %require_complete.loc7_23 => constants.%complete_type.6ee -// CHECK:STDOUT: %require_complete.loc7_54 => constants.%complete_type.1ec -// CHECK:STDOUT: %Class.elem => constants.%Class.elem.2d8 +// CHECK:STDOUT: %require_complete.loc13_34 => constants.%complete_type.3d0 +// CHECK:STDOUT: %require_complete.loc13_23 => constants.%complete_type.07d +// CHECK:STDOUT: %require_complete.loc15 => constants.%complete_type.1ec +// CHECK:STDOUT: %Class.elem => constants.%Class.elem.df5 +// CHECK:STDOUT: %Copy.lookup_impl_witness => constants.%Copy.impl_witness.19c +// CHECK:STDOUT: %Copy.facet => constants.%Copy.facet.bab +// CHECK:STDOUT: %.loc15_12.2 => constants.%.284 +// CHECK:STDOUT: %impl.elem0.loc15_12.2 => constants.%ptr.as.Copy.impl.Op.2f4 +// CHECK:STDOUT: %specific_impl_fn.loc15_12.2 => constants.%ptr.as.Copy.impl.Op.specific_fn // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- static_member_fn_call.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] // CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] // CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic] // CHECK:STDOUT: %pattern_type.3c1: type = pattern_type %Class [symbolic] // CHECK:STDOUT: %Class.Make.type: type = fn_type @Class.Make, @Class(%T) [symbolic] // CHECK:STDOUT: %Class.Make: %Class.Make.type = struct_value () [symbolic] -// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %ptr.955: type = ptr_type %Class [symbolic] -// CHECK:STDOUT: %pattern_type.9e0: type = pattern_type %ptr.955 [symbolic] -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.type: type = fn_type @Class.as.Destroy.impl.Op, @Class.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %Class.as.Destroy.impl.Op: %Class.as.Destroy.impl.Op.type = struct_value () [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %require_complete: = require_complete_type %Class [symbolic] -// CHECK:STDOUT: %Class.val: %Class = struct_value () [symbolic] -// CHECK:STDOUT: %StaticMemberFunctionCall.type: type = fn_type @StaticMemberFunctionCall [concrete] -// CHECK:STDOUT: %StaticMemberFunctionCall: %StaticMemberFunctionCall.type = struct_value () [concrete] // CHECK:STDOUT: %Class.Make.specific_fn: = specific_function %Class.Make, @Class.Make(%T) [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Destroy = %Core.Destroy -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .StaticMemberFunctionCall = %StaticMemberFunctionCall.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.1 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %StaticMemberFunctionCall.decl: %StaticMemberFunctionCall.type = fn_decl @StaticMemberFunctionCall [concrete = constants.%StaticMemberFunctionCall] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %return.patt: @StaticMemberFunctionCall.%pattern_type (%pattern_type.3c1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @StaticMemberFunctionCall.%pattern_type (%pattern_type.3c1) = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Class.ref.loc8: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %T.ref.loc8: type = name_ref T, %T.loc8_29.2 [symbolic = %T.loc8_29.1 (constants.%T)] -// CHECK:STDOUT: %Class.loc8_49.2: type = class_type @Class, @Class(constants.%T) [symbolic = %Class.loc8_49.1 (constants.%Class)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc8_29.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_29.1 (constants.%T)] -// CHECK:STDOUT: %return.param: ref @StaticMemberFunctionCall.%Class.loc8_49.1 (%Class) = out_param call_param0 -// CHECK:STDOUT: %return: ref @StaticMemberFunctionCall.%Class.loc8_49.1 (%Class) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic impl @Class.as.Destroy.impl(@Class.%T.loc4_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.type: type = fn_type @Class.as.Destroy.impl.Op, @Class.as.Destroy.impl(%T) [symbolic = %Class.as.Destroy.impl.Op.type (constants.%Class.as.Destroy.impl.Op.type)] -// CHECK:STDOUT: %Class.as.Destroy.impl.Op: @Class.as.Destroy.impl.%Class.as.Destroy.impl.Op.type (%Class.as.Destroy.impl.Op.type) = struct_value () [symbolic = %Class.as.Destroy.impl.Op (constants.%Class.as.Destroy.impl.Op)] -// CHECK:STDOUT: -// CHECK:STDOUT: impl: @Class.%Self.ref as constants.%Destroy.type { -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.decl: @Class.as.Destroy.impl.%Class.as.Destroy.impl.Op.type (%Class.as.Destroy.impl.Op.type) = fn_decl @Class.as.Destroy.impl.Op [symbolic = @Class.as.Destroy.impl.%Class.as.Destroy.impl.Op (constants.%Class.as.Destroy.impl.Op)] { -// CHECK:STDOUT: %self.patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.9e0) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.9e0) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc4_23.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.955) = value_param call_param0 -// CHECK:STDOUT: %.loc4_23.2: type = splice_block %Self.ref [symbolic = %Class (constants.%Class)] { -// CHECK:STDOUT: %.loc4_23.3: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc4_23.3 [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Class.as.Destroy.impl.Op.%ptr (%ptr.955) = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Op = %Class.as.Destroy.impl.Op.decl -// CHECK:STDOUT: witness = @Class.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc4_13.2: type) { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.1 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Class.Make.type: type = fn_type @Class.Make, @Class(%T.loc4_13.1) [symbolic = %Class.Make.type (constants.%Class.Make.type)] -// CHECK:STDOUT: %Class.Make: @Class.%Class.Make.type (%Class.Make.type) = struct_value () [symbolic = %Class.Make (constants.%Class.Make)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %Class.Make.decl: @Class.%Class.Make.type (%Class.Make.type) = fn_decl @Class.Make [symbolic = @Class.%Class.Make (constants.%Class.Make)] { -// CHECK:STDOUT: %return.patt: @Class.Make.%pattern_type (%pattern_type.3c1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Class.Make.%pattern_type (%pattern_type.3c1) = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %T.ref: type = name_ref T, @Class.%T.loc4_13.2 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class.loc5_23.2: type = class_type @Class, @Class(constants.%T) [symbolic = %Class.loc5_23.1 (constants.%Class)] -// CHECK:STDOUT: %return.param: ref @Class.Make.%Class.loc5_23.1 (%Class) = out_param call_param0 -// CHECK:STDOUT: %return: ref @Class.Make.%Class.loc5_23.1 (%Class) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Class [symbolic = @Class.as.Destroy.impl.%Class (constants.%Class)] -// CHECK:STDOUT: impl_decl @Class.as.Destroy.impl [concrete] {} {} -// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Class.as.Destroy.impl.%Class.as.Destroy.impl.Op.decl), @Class.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Class.as.Destroy.impl(constants.%T) [symbolic = @Class.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness)] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .Class = -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .Make = %Class.Make.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Class.Make(@Class.%T.loc4_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class.loc5_23.1: type = class_type @Class, @Class(%T) [symbolic = %Class.loc5_23.1 (constants.%Class)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Class.loc5_23.1 [symbolic = %pattern_type (constants.%pattern_type.3c1)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %Class.loc5_23.1 [symbolic = %require_complete (constants.%require_complete)] -// CHECK:STDOUT: %Class.val: @Class.Make.%Class.loc5_23.1 (%Class) = struct_value () [symbolic = %Class.val (constants.%Class.val)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn() -> %return.param: @Class.Make.%Class.loc5_23.1 (%Class) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc5_35.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc5_35.2: init @Class.Make.%Class.loc5_23.1 (%Class) = class_init (), %return [symbolic = %Class.val (constants.%Class.val)] -// CHECK:STDOUT: %.loc5_36: init @Class.Make.%Class.loc5_23.1 (%Class) = converted %.loc5_35.1, %.loc5_35.2 [symbolic = %Class.val (constants.%Class.val)] -// CHECK:STDOUT: return %.loc5_36 to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Class.as.Destroy.impl.Op(@Class.%T.loc4_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %ptr: type = ptr_type %Class [symbolic = %ptr (constants.%ptr.955)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.9e0)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.955)) = "no_op"; // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @StaticMemberFunctionCall(%T.loc8_29.2: type) { -// CHECK:STDOUT: %T.loc8_29.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_29.1 (constants.%T)] -// CHECK:STDOUT: %Class.loc8_49.1: type = class_type @Class, @Class(%T.loc8_29.1) [symbolic = %Class.loc8_49.1 (constants.%Class)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Class.loc8_49.1 [symbolic = %pattern_type (constants.%pattern_type.3c1)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %Class.loc8_49.1 [symbolic = %require_complete (constants.%require_complete)] // CHECK:STDOUT: %Class.Make.type: type = fn_type @Class.Make, @Class(%T.loc8_29.1) [symbolic = %Class.Make.type (constants.%Class.Make.type)] // CHECK:STDOUT: %Class.Make: @StaticMemberFunctionCall.%Class.Make.type (%Class.Make.type) = struct_value () [symbolic = %Class.Make (constants.%Class.Make)] -// CHECK:STDOUT: %Class.Make.specific_fn.loc9_18.2: = specific_function %Class.Make, @Class.Make(%T.loc8_29.1) [symbolic = %Class.Make.specific_fn.loc9_18.2 (constants.%Class.Make.specific_fn)] +// CHECK:STDOUT: %Class.Make.specific_fn.loc10_18.2: = specific_function %Class.Make, @Class.Make(%T.loc8_29.1) [symbolic = %Class.Make.specific_fn.loc10_18.2 (constants.%Class.Make.specific_fn)] // CHECK:STDOUT: // CHECK:STDOUT: fn() -> %return.param: @StaticMemberFunctionCall.%Class.loc8_49.1 (%Class) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Class.ref.loc9: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %T.ref.loc9: type = name_ref T, %T.loc8_29.2 [symbolic = %T.loc8_29.1 (constants.%T)] -// CHECK:STDOUT: %Class.loc9: type = class_type @Class, @Class(constants.%T) [symbolic = %Class.loc8_49.1 (constants.%Class)] -// CHECK:STDOUT: %.loc9: @StaticMemberFunctionCall.%Class.Make.type (%Class.Make.type) = specific_constant @Class.%Class.Make.decl, @Class(constants.%T) [symbolic = %Class.Make (constants.%Class.Make)] -// CHECK:STDOUT: %Make.ref: @StaticMemberFunctionCall.%Class.Make.type (%Class.Make.type) = name_ref Make, %.loc9 [symbolic = %Class.Make (constants.%Class.Make)] -// CHECK:STDOUT: %Class.Make.specific_fn.loc9_18.1: = specific_function %Make.ref, @Class.Make(constants.%T) [symbolic = %Class.Make.specific_fn.loc9_18.2 (constants.%Class.Make.specific_fn)] -// CHECK:STDOUT: %.loc8: ref @StaticMemberFunctionCall.%Class.loc8_49.1 (%Class) = splice_block %return {} -// CHECK:STDOUT: %Class.Make.call: init @StaticMemberFunctionCall.%Class.loc8_49.1 (%Class) = call %Class.Make.specific_fn.loc9_18.1() to %.loc8 +// CHECK:STDOUT: %Class.ref.loc10: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] +// CHECK:STDOUT: %T.ref.loc10: type = name_ref T, %T.loc8_29.2 [symbolic = %T.loc8_29.1 (constants.%T)] +// CHECK:STDOUT: %Class.loc10: type = class_type @Class, @Class(constants.%T) [symbolic = %Class.loc8_49.1 (constants.%Class)] +// CHECK:STDOUT: %.loc10: @StaticMemberFunctionCall.%Class.Make.type (%Class.Make.type) = specific_constant @Class.%Class.Make.decl, @Class(constants.%T) [symbolic = %Class.Make (constants.%Class.Make)] +// CHECK:STDOUT: %Make.ref: @StaticMemberFunctionCall.%Class.Make.type (%Class.Make.type) = name_ref Make, %.loc10 [symbolic = %Class.Make (constants.%Class.Make)] +// CHECK:STDOUT: %Class.Make.specific_fn.loc10_18.1: = specific_function %Make.ref, @Class.Make(constants.%T) [symbolic = %Class.Make.specific_fn.loc10_18.2 (constants.%Class.Make.specific_fn)] +// CHECK:STDOUT: +// CHECK:STDOUT: %Class.Make.call: init @StaticMemberFunctionCall.%Class.loc8_49.1 (%Class) = call %Class.Make.specific_fn.loc10_18.1() to %.loc8 // CHECK:STDOUT: return %Class.Make.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T) { -// CHECK:STDOUT: %T.loc4_13.1 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Class.Make.type => constants.%Class.Make.type -// CHECK:STDOUT: %Class.Make => constants.%Class.Make -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.Make(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Class.loc5_23.1 => constants.%Class -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.3c1 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete -// CHECK:STDOUT: %Class.val => constants.%Class.val -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Class => constants.%Class -// CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Class => constants.%Class -// CHECK:STDOUT: %ptr => constants.%ptr.955 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.9e0 -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: specific @StaticMemberFunctionCall(constants.%T) { // CHECK:STDOUT: %T.loc8_29.1 => constants.%T // CHECK:STDOUT: %Class.loc8_49.1 => constants.%Class diff --git a/toolchain/check/testdata/class/generic/member_inline.carbon b/toolchain/check/testdata/class/generic/member_inline.carbon index dce4109152bd..9a67e4e43e82 100644 --- a/toolchain/check/testdata/class/generic/member_inline.carbon +++ b/toolchain/check/testdata/class/generic/member_inline.carbon @@ -3,8 +3,6 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // // INCLUDE-FILE: toolchain/testing/testdata/min_prelude/convert.carbon -// TODO: Add ranges and switch to "--dump-sem-ir-ranges=only". -// EXTRA-ARGS: --dump-sem-ir-ranges=if-present // // AUTOUPDATE // TIP: To test this file alone, run: @@ -14,9 +12,10 @@ // --- member_inline.carbon -library "member_inline.carbon"; +library "[[@TEST_NAME]]"; -class Class(T:! type) { +//@dump-sem-ir-begin +class Class(T:! Core.Copy) { fn F(n: T) -> T { return n; } @@ -27,14 +26,16 @@ class Class(T:! type) { var n: T; } +//@dump-sem-ir-end -// --- fail_member_inline.carbon +// --- fail_member_inline_missing_self_dot.carbon -library "fail_member_inline.carbon"; +library "[[@TEST_NAME]]"; -class C(T:! type) { +//@dump-sem-ir-begin +class C(T:! Core.Copy) { fn F() { - // CHECK:STDERR: fail_member_inline.carbon:[[@LINE+4]]:5: error: expression cannot be used as a value [UseOfNonExprAsValue] + // CHECK:STDERR: fail_member_inline_missing_self_dot.carbon:[[@LINE+4]]:5: error: expression cannot be used as a value [UseOfNonExprAsValue] // CHECK:STDERR: data; // CHECK:STDERR: ^~~~ // CHECK:STDERR: @@ -42,62 +43,70 @@ class C(T:! type) { } var data: {}; } +//@dump-sem-ir-end // CHECK:STDOUT: --- member_inline.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %T.578: %Copy.type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %pattern_type.ce2: type = pattern_type %Copy.type [concrete] // CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] // CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %Class.F.type: type = fn_type @Class.F, @Class(%T) [symbolic] +// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.578) [symbolic] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T.578 [symbolic] +// CHECK:STDOUT: %pattern_type.f8cebc.1: type = pattern_type %T.as_type [symbolic] +// CHECK:STDOUT: %Class.F.type: type = fn_type @Class.F, @Class(%T.578) [symbolic] // CHECK:STDOUT: %Class.F: %Class.F.type = struct_value () [symbolic] -// CHECK:STDOUT: %pattern_type.3c1: type = pattern_type %Class [symbolic] -// CHECK:STDOUT: %Class.G.type: type = fn_type @Class.G, @Class(%T) [symbolic] +// CHECK:STDOUT: %pattern_type.47a: type = pattern_type %Class [symbolic] +// CHECK:STDOUT: %Class.G.type: type = fn_type @Class.G, @Class(%T.578) [symbolic] // CHECK:STDOUT: %Class.G: %Class.G.type = struct_value () [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic] +// CHECK:STDOUT: %require_complete.ecc: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.as_type [symbolic] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %ptr.955: type = ptr_type %Class [symbolic] -// CHECK:STDOUT: %pattern_type.9e0: type = pattern_type %ptr.955 [symbolic] -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.type: type = fn_type @Class.as.Destroy.impl.Op, @Class.as.Destroy.impl(%T) [symbolic] +// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T.578) [symbolic] +// CHECK:STDOUT: %ptr.0b3: type = ptr_type %Class [symbolic] +// CHECK:STDOUT: %pattern_type.417: type = pattern_type %ptr.0b3 [symbolic] +// CHECK:STDOUT: %Class.as.Destroy.impl.Op.type: type = fn_type @Class.as.Destroy.impl.Op, @Class.as.Destroy.impl(%T.578) [symbolic] // CHECK:STDOUT: %Class.as.Destroy.impl.Op: %Class.as.Destroy.impl.Op.type = struct_value () [symbolic] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %T} [symbolic] +// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %T.as_type} [symbolic] // CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.n [symbolic] -// CHECK:STDOUT: %require_complete.4f8: = require_complete_type %Class [symbolic] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.lookup_impl_witness.3ba: = lookup_impl_witness %T.578, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.72e: %Copy.type = facet_value %T.as_type, (%Copy.lookup_impl_witness.3ba) [symbolic] +// CHECK:STDOUT: %.671: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.72e [symbolic] +// CHECK:STDOUT: %impl.elem0.56e: %.671 = impl_witness_access %Copy.lookup_impl_witness.3ba, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.fb7: = specific_impl_function %impl.elem0.56e, @Copy.Op(%Copy.facet.72e) [symbolic] +// CHECK:STDOUT: %require_complete.ef5: = require_complete_type %Class [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core // CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type.ce2 = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.1 (constants.%T)] +// CHECK:STDOUT: %.loc5: type = splice_block %Copy.ref [concrete = constants.%Copy.type] { +// CHECK:STDOUT: +// CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core [concrete = imports.%Core] +// CHECK:STDOUT: %Copy.ref: type = name_ref Copy, imports.%Core.Copy [concrete = constants.%Copy.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc5_13.2: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc5_13.1 (constants.%T.578)] // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic impl @Class.as.Destroy.impl(@Class.%T.loc4_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: generic impl @Class.as.Destroy.impl(@Class.%T.loc5_13.2: %Copy.type) { +// CHECK:STDOUT: %T: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.578)] // CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class)] // CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness)] // CHECK:STDOUT: @@ -107,16 +116,16 @@ class C(T:! type) { // CHECK:STDOUT: // CHECK:STDOUT: impl: @Class.%Self.ref as constants.%Destroy.type { // CHECK:STDOUT: %Class.as.Destroy.impl.Op.decl: @Class.as.Destroy.impl.%Class.as.Destroy.impl.Op.type (%Class.as.Destroy.impl.Op.type) = fn_decl @Class.as.Destroy.impl.Op [symbolic = @Class.as.Destroy.impl.%Class.as.Destroy.impl.Op (constants.%Class.as.Destroy.impl.Op)] { -// CHECK:STDOUT: %self.patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.9e0) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.9e0) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc4_23.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: %self.patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.417) = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.417) = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %.loc5_28.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.955) = value_param call_param0 -// CHECK:STDOUT: %.loc4_23.2: type = splice_block %Self.ref [symbolic = %Class (constants.%Class)] { -// CHECK:STDOUT: %.loc4_23.3: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc4_23.3 [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.0b3) = value_param call_param0 +// CHECK:STDOUT: %.loc5_28.2: type = splice_block %Self.ref [symbolic = %Class (constants.%Class)] { +// CHECK:STDOUT: %.loc5_28.3: type = specific_constant constants.%Class, @Class(constants.%T.578) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc5_28.3 [symbolic = %Class (constants.%Class)] // CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Class.as.Destroy.impl.Op.%ptr (%ptr.955) = bind_name self, %self.param +// CHECK:STDOUT: %self: @Class.as.Destroy.impl.Op.%ptr (%ptr.0b3) = bind_name self, %self.param // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !members: @@ -125,161 +134,196 @@ class C(T:! type) { // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc4_13.2: type) { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.1 (constants.%T)] +// CHECK:STDOUT: generic class @Class(%T.loc5_13.2: %Copy.type) { +// CHECK:STDOUT: %T.loc5_13.1: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc5_13.1 (constants.%T.578)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Class.F.type: type = fn_type @Class.F, @Class(%T.loc4_13.1) [symbolic = %Class.F.type (constants.%Class.F.type)] +// CHECK:STDOUT: %Class.F.type: type = fn_type @Class.F, @Class(%T.loc5_13.1) [symbolic = %Class.F.type (constants.%Class.F.type)] // CHECK:STDOUT: %Class.F: @Class.%Class.F.type (%Class.F.type) = struct_value () [symbolic = %Class.F (constants.%Class.F)] -// CHECK:STDOUT: %Class.G.type: type = fn_type @Class.G, @Class(%T.loc4_13.1) [symbolic = %Class.G.type (constants.%Class.G.type)] +// CHECK:STDOUT: %Class.G.type: type = fn_type @Class.G, @Class(%T.loc5_13.1) [symbolic = %Class.G.type (constants.%Class.G.type)] // CHECK:STDOUT: %Class.G: @Class.%Class.G.type (%Class.G.type) = struct_value () [symbolic = %Class.G (constants.%Class.G)] -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_13.1 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc4_13.1) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.loc4_13.1 [symbolic = %Class.elem (constants.%Class.elem)] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: @Class.%T.loc4_13.1 (%T)} [symbolic = %struct_type.n (constants.%struct_type.n)] -// CHECK:STDOUT: %complete_type.loc14_1.2: = complete_type_witness %struct_type.n [symbolic = %complete_type.loc14_1.2 (constants.%complete_type)] +// CHECK:STDOUT: %T.as_type.loc14_10.2: type = facet_access_type %T.loc5_13.1 [symbolic = %T.as_type.loc14_10.2 (constants.%T.as_type)] +// CHECK:STDOUT: %require_complete: = require_complete_type %T.as_type.loc14_10.2 [symbolic = %require_complete (constants.%require_complete.ecc)] +// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc5_13.1) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.as_type.loc14_10.2 [symbolic = %Class.elem (constants.%Class.elem)] +// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: @Class.%T.as_type.loc14_10.2 (%T.as_type)} [symbolic = %struct_type.n (constants.%struct_type.n)] +// CHECK:STDOUT: %complete_type.loc15_1.2: = complete_type_witness %struct_type.n [symbolic = %complete_type.loc15_1.2 (constants.%complete_type)] // CHECK:STDOUT: // CHECK:STDOUT: class { // CHECK:STDOUT: %Class.F.decl: @Class.%Class.F.type (%Class.F.type) = fn_decl @Class.F [symbolic = @Class.%Class.F (constants.%Class.F)] { -// CHECK:STDOUT: %n.patt: @Class.F.%pattern_type (%pattern_type.7dc) = binding_pattern n [concrete] -// CHECK:STDOUT: %n.param_patt: @Class.F.%pattern_type (%pattern_type.7dc) = value_param_pattern %n.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @Class.F.%pattern_type (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Class.F.%pattern_type (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %n.patt: @Class.F.%pattern_type (%pattern_type.f8cebc.1) = binding_pattern n [concrete] +// CHECK:STDOUT: %n.param_patt: @Class.F.%pattern_type (%pattern_type.f8cebc.1) = value_param_pattern %n.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @Class.F.%pattern_type (%pattern_type.f8cebc.1) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @Class.F.%pattern_type (%pattern_type.f8cebc.1) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc5_17: type = name_ref T, @Class.%T.loc4_13.2 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %n.param: @Class.F.%T (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc5_11: type = name_ref T, @Class.%T.loc4_13.2 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %n: @Class.F.%T (%T) = bind_name n, %n.param -// CHECK:STDOUT: %return.param: ref @Class.F.%T (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @Class.F.%T (%T) = return_slot %return.param +// CHECK:STDOUT: %T.ref.loc6_17: %Copy.type = name_ref T, @Class.%T.loc5_13.2 [symbolic = %T (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc6_17: type = facet_access_type %T.ref.loc6_17 [symbolic = %T.as_type.loc6_11.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc6_17: type = converted %T.ref.loc6_17, %T.as_type.loc6_17 [symbolic = %T.as_type.loc6_11.1 (constants.%T.as_type)] +// CHECK:STDOUT: %n.param: @Class.F.%T.as_type.loc6_11.1 (%T.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc6_11.1: type = splice_block %.loc6_11.2 [symbolic = %T.as_type.loc6_11.1 (constants.%T.as_type)] { +// CHECK:STDOUT: %T.ref.loc6_11: %Copy.type = name_ref T, @Class.%T.loc5_13.2 [symbolic = %T (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc6_11.2: type = facet_access_type %T.ref.loc6_11 [symbolic = %T.as_type.loc6_11.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc6_11.2: type = converted %T.ref.loc6_11, %T.as_type.loc6_11.2 [symbolic = %T.as_type.loc6_11.1 (constants.%T.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %n: @Class.F.%T.as_type.loc6_11.1 (%T.as_type) = bind_name n, %n.param +// CHECK:STDOUT: %return.param: ref @Class.F.%T.as_type.loc6_11.1 (%T.as_type) = out_param call_param1 +// CHECK:STDOUT: %return: ref @Class.F.%T.as_type.loc6_11.1 (%T.as_type) = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: %Class.G.decl: @Class.%Class.G.type (%Class.G.type) = fn_decl @Class.G [symbolic = @Class.%Class.G (constants.%Class.G)] { -// CHECK:STDOUT: %self.patt: @Class.G.%pattern_type.loc9_8 (%pattern_type.3c1) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Class.G.%pattern_type.loc9_8 (%pattern_type.3c1) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @Class.G.%pattern_type.loc9_22 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Class.G.%pattern_type.loc9_22 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %self.patt: @Class.G.%pattern_type.loc10_8 (%pattern_type.47a) = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: @Class.G.%pattern_type.loc10_8 (%pattern_type.47a) = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @Class.G.%pattern_type.loc10_22 (%pattern_type.f8cebc.1) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @Class.G.%pattern_type.loc10_22 (%pattern_type.f8cebc.1) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref: type = name_ref T, @Class.%T.loc4_13.2 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T.ref: %Copy.type = name_ref T, @Class.%T.loc5_13.2 [symbolic = %T (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc10_25.2: type = facet_access_type %T.ref [symbolic = %T.as_type.loc10_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc10_25: type = converted %T.ref, %T.as_type.loc10_25.2 [symbolic = %T.as_type.loc10_25.1 (constants.%T.as_type)] // CHECK:STDOUT: %self.param: @Class.G.%Class (%Class) = value_param call_param0 -// CHECK:STDOUT: %.loc9_14.1: type = splice_block %Self.ref [symbolic = %Class (constants.%Class)] { -// CHECK:STDOUT: %.loc9_14.2: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc9_14.2 [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %.loc10_14.1: type = splice_block %Self.ref [symbolic = %Class (constants.%Class)] { +// CHECK:STDOUT: %.loc10_14.2: type = specific_constant constants.%Class, @Class(constants.%T.578) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc10_14.2 [symbolic = %Class (constants.%Class)] // CHECK:STDOUT: } // CHECK:STDOUT: %self: @Class.G.%Class (%Class) = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref @Class.G.%T (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @Class.G.%T (%T) = return_slot %return.param +// CHECK:STDOUT: %return.param: ref @Class.G.%T.as_type.loc10_25.1 (%T.as_type) = out_param call_param1 +// CHECK:STDOUT: %return: ref @Class.G.%T.as_type.loc10_25.1 (%T.as_type) = return_slot %return.param // CHECK:STDOUT: } -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_13.2 [symbolic = %T.loc4_13.1 (constants.%T)] -// CHECK:STDOUT: %.loc13: @Class.%Class.elem (%Class.elem) = field_decl n, element0 [concrete] +// CHECK:STDOUT: %T.ref: %Copy.type = name_ref T, %T.loc5_13.2 [symbolic = %T.loc5_13.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc14_10.1: type = facet_access_type %T.ref [symbolic = %T.as_type.loc14_10.2 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc14_10: type = converted %T.ref, %T.as_type.loc14_10.1 [symbolic = %T.as_type.loc14_10.2 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc14_8: @Class.%Class.elem (%Class.elem) = field_decl n, element0 [concrete] // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Class [symbolic = @Class.as.Destroy.impl.%Class (constants.%Class)] // CHECK:STDOUT: impl_decl @Class.as.Destroy.impl [concrete] {} {} // CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Class.as.Destroy.impl.%Class.as.Destroy.impl.Op.decl), @Class.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Class.as.Destroy.impl(constants.%T) [symbolic = @Class.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness)] -// CHECK:STDOUT: %complete_type.loc14_1.1: = complete_type_witness constants.%struct_type.n [symbolic = %complete_type.loc14_1.2 (constants.%complete_type)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc14_1.1 +// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Class.as.Destroy.impl(constants.%T.578) [symbolic = @Class.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness)] +// CHECK:STDOUT: %complete_type.loc15_1.1: = complete_type_witness constants.%struct_type.n [symbolic = %complete_type.loc15_1.2 (constants.%complete_type)] +// CHECK:STDOUT: complete_type_witness = %complete_type.loc15_1.1 // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .Self = constants.%Class // CHECK:STDOUT: .T = // CHECK:STDOUT: .F = %Class.F.decl // CHECK:STDOUT: .G = %Class.G.decl -// CHECK:STDOUT: .n = %.loc13 +// CHECK:STDOUT: .n = %.loc14_8 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Class.F(@Class.%T.loc4_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T [symbolic = %pattern_type (constants.%pattern_type.7dc)] +// CHECK:STDOUT: generic fn @Class.F(@Class.%T.loc5_13.2: %Copy.type) { +// CHECK:STDOUT: %T: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc6_11.1: type = facet_access_type %T [symbolic = %T.as_type.loc6_11.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %T.as_type.loc6_11.1 [symbolic = %pattern_type (constants.%pattern_type.f8cebc.1)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: %require_complete: = require_complete_type %T.as_type.loc6_11.1 [symbolic = %require_complete (constants.%require_complete.ecc)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %T, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.3ba)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %T.as_type.loc6_11.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.72e)] +// CHECK:STDOUT: %.loc7_12.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc7_12.2 (constants.%.671)] +// CHECK:STDOUT: %impl.elem0.loc7_12.2: @Class.F.%.loc7_12.2 (%.671) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc7_12.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %specific_impl_fn.loc7_12.2: = specific_impl_function %impl.elem0.loc7_12.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc7_12.2 (constants.%specific_impl_fn.fb7)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%n.param: @Class.F.%T (%T)) -> @Class.F.%T (%T) { +// CHECK:STDOUT: fn(%n.param: @Class.F.%T.as_type.loc6_11.1 (%T.as_type)) -> @Class.F.%T.as_type.loc6_11.1 (%T.as_type) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %n.ref: @Class.F.%T (%T) = name_ref n, %n -// CHECK:STDOUT: return %n.ref +// CHECK:STDOUT: %n.ref: @Class.F.%T.as_type.loc6_11.1 (%T.as_type) = name_ref n, %n +// CHECK:STDOUT: %impl.elem0.loc7_12.1: @Class.F.%.loc7_12.2 (%.671) = impl_witness_access constants.%Copy.lookup_impl_witness.3ba, element0 [symbolic = %impl.elem0.loc7_12.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %bound_method.loc7_12.1: = bound_method %n.ref, %impl.elem0.loc7_12.1 +// CHECK:STDOUT: %specific_impl_fn.loc7_12.1: = specific_impl_function %impl.elem0.loc7_12.1, @Copy.Op(constants.%Copy.facet.72e) [symbolic = %specific_impl_fn.loc7_12.2 (constants.%specific_impl_fn.fb7)] +// CHECK:STDOUT: %bound_method.loc7_12.2: = bound_method %n.ref, %specific_impl_fn.loc7_12.1 +// CHECK:STDOUT: %.loc7_12.1: init @Class.F.%T.as_type.loc6_11.1 (%T.as_type) = call %bound_method.loc7_12.2(%n.ref) +// CHECK:STDOUT: return %.loc7_12.1 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Class.G(@Class.%T.loc4_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: generic fn @Class.G(@Class.%T.loc5_13.2: %Copy.type) { +// CHECK:STDOUT: %T: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.578)] // CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %pattern_type.loc9_8: type = pattern_type %Class [symbolic = %pattern_type.loc9_8 (constants.%pattern_type.3c1)] -// CHECK:STDOUT: %pattern_type.loc9_22: type = pattern_type %T [symbolic = %pattern_type.loc9_22 (constants.%pattern_type.7dc)] +// CHECK:STDOUT: %pattern_type.loc10_8: type = pattern_type %Class [symbolic = %pattern_type.loc10_8 (constants.%pattern_type.47a)] +// CHECK:STDOUT: %T.as_type.loc10_25.1: type = facet_access_type %T [symbolic = %T.as_type.loc10_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type.loc10_22: type = pattern_type %T.as_type.loc10_25.1 [symbolic = %pattern_type.loc10_22 (constants.%pattern_type.f8cebc.1)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc9: = require_complete_type %Class [symbolic = %require_complete.loc9 (constants.%require_complete.4f8)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic = %Class.elem (constants.%Class.elem)] -// CHECK:STDOUT: %require_complete.loc10: = require_complete_type %T [symbolic = %require_complete.loc10 (constants.%require_complete.4ae)] +// CHECK:STDOUT: %require_complete.loc10: = require_complete_type %Class [symbolic = %require_complete.loc10 (constants.%require_complete.ef5)] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.as_type.loc10_25.1 [symbolic = %Class.elem (constants.%Class.elem)] +// CHECK:STDOUT: %require_complete.loc11: = require_complete_type %T.as_type.loc10_25.1 [symbolic = %require_complete.loc11 (constants.%require_complete.ecc)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %T, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.3ba)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %T.as_type.loc10_25.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.72e)] +// CHECK:STDOUT: %.loc11_16.4: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc11_16.4 (constants.%.671)] +// CHECK:STDOUT: %impl.elem0.loc11_16.2: @Class.G.%.loc11_16.4 (%.671) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc11_16.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %specific_impl_fn.loc11_16.2: = specific_impl_function %impl.elem0.loc11_16.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc11_16.2 (constants.%specific_impl_fn.fb7)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Class.G.%Class (%Class)) -> @Class.G.%T (%T) { +// CHECK:STDOUT: fn(%self.param: @Class.G.%Class (%Class)) -> @Class.G.%T.as_type.loc10_25.1 (%T.as_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %self.ref: @Class.G.%Class (%Class) = name_ref self, %self -// CHECK:STDOUT: %n.ref: @Class.G.%Class.elem (%Class.elem) = name_ref n, @Class.%.loc13 [concrete = @Class.%.loc13] -// CHECK:STDOUT: %.loc10_16.1: ref @Class.G.%T (%T) = class_element_access %self.ref, element0 -// CHECK:STDOUT: %.loc10_16.2: @Class.G.%T (%T) = bind_value %.loc10_16.1 -// CHECK:STDOUT: return %.loc10_16.2 +// CHECK:STDOUT: %n.ref: @Class.G.%Class.elem (%Class.elem) = name_ref n, @Class.%.loc14_8 [concrete = @Class.%.loc14_8] +// CHECK:STDOUT: %.loc11_16.1: ref @Class.G.%T.as_type.loc10_25.1 (%T.as_type) = class_element_access %self.ref, element0 +// CHECK:STDOUT: %.loc11_16.2: @Class.G.%T.as_type.loc10_25.1 (%T.as_type) = bind_value %.loc11_16.1 +// CHECK:STDOUT: %impl.elem0.loc11_16.1: @Class.G.%.loc11_16.4 (%.671) = impl_witness_access constants.%Copy.lookup_impl_witness.3ba, element0 [symbolic = %impl.elem0.loc11_16.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %bound_method.loc11_16.1: = bound_method %.loc11_16.2, %impl.elem0.loc11_16.1 +// CHECK:STDOUT: %specific_impl_fn.loc11_16.1: = specific_impl_function %impl.elem0.loc11_16.1, @Copy.Op(constants.%Copy.facet.72e) [symbolic = %specific_impl_fn.loc11_16.2 (constants.%specific_impl_fn.fb7)] +// CHECK:STDOUT: %bound_method.loc11_16.2: = bound_method %.loc11_16.2, %specific_impl_fn.loc11_16.1 +// CHECK:STDOUT: %.loc11_16.3: init @Class.G.%T.as_type.loc10_25.1 (%T.as_type) = call %bound_method.loc11_16.2(%.loc11_16.2) +// CHECK:STDOUT: return %.loc11_16.3 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Class.as.Destroy.impl.Op(@Class.%T.loc4_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: generic fn @Class.as.Destroy.impl.Op(@Class.%T.loc5_13.2: %Copy.type) { +// CHECK:STDOUT: %T: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.578)] // CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %ptr: type = ptr_type %Class [symbolic = %ptr (constants.%ptr.955)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.9e0)] +// CHECK:STDOUT: %ptr: type = ptr_type %Class [symbolic = %ptr (constants.%ptr.0b3)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.417)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.955)) = "no_op"; +// CHECK:STDOUT: fn(%self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.0b3)) = "no_op"; // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T) { -// CHECK:STDOUT: %T.loc4_13.1 => constants.%T +// CHECK:STDOUT: specific @Class(constants.%T.578) { +// CHECK:STDOUT: %T.loc5_13.1 => constants.%T.578 // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %Class.F.type => constants.%Class.F.type // CHECK:STDOUT: %Class.F => constants.%Class.F // CHECK:STDOUT: %Class.G.type => constants.%Class.G.type // CHECK:STDOUT: %Class.G => constants.%Class.G -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae +// CHECK:STDOUT: %T.as_type.loc14_10.2 => constants.%T.as_type +// CHECK:STDOUT: %require_complete => constants.%require_complete.ecc // CHECK:STDOUT: %Class => constants.%Class // CHECK:STDOUT: %Class.elem => constants.%Class.elem // CHECK:STDOUT: %struct_type.n => constants.%struct_type.n -// CHECK:STDOUT: %complete_type.loc14_1.2 => constants.%complete_type +// CHECK:STDOUT: %complete_type.loc15_1.2 => constants.%complete_type // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.F(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc +// CHECK:STDOUT: specific @Class.F(constants.%T.578) { +// CHECK:STDOUT: %T => constants.%T.578 +// CHECK:STDOUT: %T.as_type.loc6_11.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.f8cebc.1 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.G(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @Class.G(constants.%T.578) { +// CHECK:STDOUT: %T => constants.%T.578 // CHECK:STDOUT: %Class => constants.%Class -// CHECK:STDOUT: %pattern_type.loc9_8 => constants.%pattern_type.3c1 -// CHECK:STDOUT: %pattern_type.loc9_22 => constants.%pattern_type.7dc +// CHECK:STDOUT: %pattern_type.loc10_8 => constants.%pattern_type.47a +// CHECK:STDOUT: %T.as_type.loc10_25.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type.loc10_22 => constants.%pattern_type.f8cebc.1 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @Class.as.Destroy.impl(constants.%T.578) { +// CHECK:STDOUT: %T => constants.%T.578 // CHECK:STDOUT: %Class => constants.%Class // CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @Class.as.Destroy.impl.Op(constants.%T.578) { +// CHECK:STDOUT: %T => constants.%T.578 // CHECK:STDOUT: %Class => constants.%Class -// CHECK:STDOUT: %ptr => constants.%ptr.955 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.9e0 +// CHECK:STDOUT: %ptr => constants.%ptr.0b3 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.417 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: --- fail_member_inline.carbon +// CHECK:STDOUT: --- fail_member_inline_missing_self_dot.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %T: %Copy.type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %pattern_type.ce2: type = pattern_type %Copy.type [concrete] // CHECK:STDOUT: %C.type: type = generic_class_type @C [concrete] // CHECK:STDOUT: %C.generic: %C.type = struct_value () [concrete] // CHECK:STDOUT: %C: type = class_type @C, @C(%T) [symbolic] @@ -290,8 +334,8 @@ class C(T:! type) { // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] // CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @C.%Destroy.impl_witness_table, @C.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %ptr.7d2: type = ptr_type %C [symbolic] -// CHECK:STDOUT: %pattern_type.1d2: type = pattern_type %ptr.7d2 [symbolic] +// CHECK:STDOUT: %ptr.f20: type = ptr_type %C [symbolic] +// CHECK:STDOUT: %pattern_type.f45: type = pattern_type %ptr.f20 [symbolic] // CHECK:STDOUT: %C.as.Destroy.impl.Op.type: type = fn_type @C.as.Destroy.impl.Op, @C.as.Destroy.impl(%T) [symbolic] // CHECK:STDOUT: %C.as.Destroy.impl.Op: %C.as.Destroy.impl.Op.type = struct_value () [symbolic] // CHECK:STDOUT: %struct_type.data: type = struct_type {.data: %empty_struct_type} [concrete] @@ -300,29 +344,30 @@ class C(T:! type) { // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core // CHECK:STDOUT: %C.decl: %C.type = class_decl @C [concrete = constants.%C.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type.ce2 = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.1 (constants.%T)] +// CHECK:STDOUT: %.loc5: type = splice_block %Copy.ref [concrete = constants.%Copy.type] { +// CHECK:STDOUT: +// CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core [concrete = imports.%Core] +// CHECK:STDOUT: %Copy.ref: type = name_ref Copy, imports.%Core.Copy [concrete = constants.%Copy.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc5_9.2: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc5_9.1 (constants.%T)] // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic impl @C.as.Destroy.impl(@C.%T.loc4_9.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: generic impl @C.as.Destroy.impl(@C.%T.loc5_9.2: %Copy.type) { +// CHECK:STDOUT: %T: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] // CHECK:STDOUT: %C: type = class_type @C, @C(%T) [symbolic = %C (constants.%C)] // CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @C.%Destroy.impl_witness_table, @C.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness)] // CHECK:STDOUT: @@ -332,16 +377,16 @@ class C(T:! type) { // CHECK:STDOUT: // CHECK:STDOUT: impl: @C.%Self.ref as constants.%Destroy.type { // CHECK:STDOUT: %C.as.Destroy.impl.Op.decl: @C.as.Destroy.impl.%C.as.Destroy.impl.Op.type (%C.as.Destroy.impl.Op.type) = fn_decl @C.as.Destroy.impl.Op [symbolic = @C.as.Destroy.impl.%C.as.Destroy.impl.Op (constants.%C.as.Destroy.impl.Op)] { -// CHECK:STDOUT: %self.patt: @C.as.Destroy.impl.Op.%pattern_type (%pattern_type.1d2) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @C.as.Destroy.impl.Op.%pattern_type (%pattern_type.1d2) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc4_19.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: %self.patt: @C.as.Destroy.impl.Op.%pattern_type (%pattern_type.f45) = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: @C.as.Destroy.impl.Op.%pattern_type (%pattern_type.f45) = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %.loc5_24.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @C.as.Destroy.impl.Op.%ptr (%ptr.7d2) = value_param call_param0 -// CHECK:STDOUT: %.loc4_19.2: type = splice_block %Self.ref [symbolic = %C (constants.%C)] { -// CHECK:STDOUT: %.loc4_19.3: type = specific_constant constants.%C, @C(constants.%T) [symbolic = %C (constants.%C)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc4_19.3 [symbolic = %C (constants.%C)] +// CHECK:STDOUT: %self.param: @C.as.Destroy.impl.Op.%ptr (%ptr.f20) = value_param call_param0 +// CHECK:STDOUT: %.loc5_24.2: type = splice_block %Self.ref [symbolic = %C (constants.%C)] { +// CHECK:STDOUT: %.loc5_24.3: type = specific_constant constants.%C, @C(constants.%T) [symbolic = %C (constants.%C)] +// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc5_24.3 [symbolic = %C (constants.%C)] // CHECK:STDOUT: } -// CHECK:STDOUT: %self: @C.as.Destroy.impl.Op.%ptr (%ptr.7d2) = bind_name self, %self.param +// CHECK:STDOUT: %self: @C.as.Destroy.impl.Op.%ptr (%ptr.f20) = bind_name self, %self.param // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !members: @@ -350,20 +395,20 @@ class C(T:! type) { // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @C(%T.loc4_9.2: type) { -// CHECK:STDOUT: %T.loc4_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.1 (constants.%T)] +// CHECK:STDOUT: generic class @C(%T.loc5_9.2: %Copy.type) { +// CHECK:STDOUT: %T.loc5_9.1: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc5_9.1 (constants.%T)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %C.F.type: type = fn_type @C.F, @C(%T.loc4_9.1) [symbolic = %C.F.type (constants.%C.F.type)] +// CHECK:STDOUT: %C.F.type: type = fn_type @C.F, @C(%T.loc5_9.1) [symbolic = %C.F.type (constants.%C.F.type)] // CHECK:STDOUT: %C.F: @C.%C.F.type (%C.F.type) = struct_value () [symbolic = %C.F (constants.%C.F)] -// CHECK:STDOUT: %C: type = class_type @C, @C(%T.loc4_9.1) [symbolic = %C (constants.%C)] +// CHECK:STDOUT: %C: type = class_type @C, @C(%T.loc5_9.1) [symbolic = %C (constants.%C)] // CHECK:STDOUT: %C.elem: type = unbound_element_type %C, constants.%empty_struct_type [symbolic = %C.elem (constants.%C.elem)] // CHECK:STDOUT: // CHECK:STDOUT: class { // CHECK:STDOUT: %C.F.decl: @C.%C.F.type (%C.F.type) = fn_decl @C.F [symbolic = @C.%C.F (constants.%C.F)] {} {} -// CHECK:STDOUT: %.loc12_14.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc12_14.2: type = converted %.loc12_14.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %.loc12_11: @C.%C.elem (%C.elem) = field_decl data, element0 [concrete] +// CHECK:STDOUT: %.loc13_14.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc13_14.2: type = converted %.loc13_14.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %.loc13_11: @C.%C.elem (%C.elem) = field_decl data, element0 [concrete] // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [symbolic = @C.as.Destroy.impl.%C (constants.%C)] // CHECK:STDOUT: impl_decl @C.as.Destroy.impl [concrete] {} {} // CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@C.as.Destroy.impl.%C.as.Destroy.impl.Op.decl), @C.as.Destroy.impl [concrete] @@ -374,36 +419,36 @@ class C(T:! type) { // CHECK:STDOUT: !members: // CHECK:STDOUT: .Self = constants.%C // CHECK:STDOUT: .F = %C.F.decl -// CHECK:STDOUT: .data = %.loc12_11 +// CHECK:STDOUT: .data = %.loc13_11 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @C.F(@C.%T.loc4_9.2: type) { +// CHECK:STDOUT: generic fn @C.F(@C.%T.loc5_9.2: %Copy.type) { // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] // CHECK:STDOUT: %C: type = class_type @C, @C(%T) [symbolic = %C (constants.%C)] // CHECK:STDOUT: %C.elem: type = unbound_element_type %C, constants.%empty_struct_type [symbolic = %C.elem (constants.%C.elem)] // CHECK:STDOUT: // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %data.ref: @C.F.%C.elem (%C.elem) = name_ref data, @C.%.loc12_11 [concrete = @C.%.loc12_11] +// CHECK:STDOUT: %data.ref: @C.F.%C.elem (%C.elem) = name_ref data, @C.%.loc13_11 [concrete = @C.%.loc13_11] // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @C.as.Destroy.impl.Op(@C.%T.loc4_9.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: generic fn @C.as.Destroy.impl.Op(@C.%T.loc5_9.2: %Copy.type) { +// CHECK:STDOUT: %T: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] // CHECK:STDOUT: %C: type = class_type @C, @C(%T) [symbolic = %C (constants.%C)] -// CHECK:STDOUT: %ptr: type = ptr_type %C [symbolic = %ptr (constants.%ptr.7d2)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.1d2)] +// CHECK:STDOUT: %ptr: type = ptr_type %C [symbolic = %ptr (constants.%ptr.f20)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.f45)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @C.as.Destroy.impl.Op.%ptr (%ptr.7d2)) = "no_op"; +// CHECK:STDOUT: fn(%self.param: @C.as.Destroy.impl.Op.%ptr (%ptr.f20)) = "no_op"; // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%T) { -// CHECK:STDOUT: %T.loc4_9.1 => constants.%T +// CHECK:STDOUT: %T.loc5_9.1 => constants.%T // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %C.F.type => constants.%C.F.type @@ -423,7 +468,7 @@ class C(T:! type) { // CHECK:STDOUT: specific @C.as.Destroy.impl.Op(constants.%T) { // CHECK:STDOUT: %T => constants.%T // CHECK:STDOUT: %C => constants.%C -// CHECK:STDOUT: %ptr => constants.%ptr.7d2 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.1d2 +// CHECK:STDOUT: %ptr => constants.%ptr.f20 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.f45 // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/member_lookup.carbon b/toolchain/check/testdata/class/generic/member_lookup.carbon index 4c9eaccce1e3..a0b5f4aa12a8 100644 --- a/toolchain/check/testdata/class/generic/member_lookup.carbon +++ b/toolchain/check/testdata/class/generic/member_lookup.carbon @@ -3,8 +3,6 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // // INCLUDE-FILE: toolchain/testing/testdata/min_prelude/int.carbon -// TODO: Add ranges and switch to "--dump-sem-ir-ranges=only". -// EXTRA-ARGS: --dump-sem-ir-ranges=if-present // // AUTOUPDATE // TIP: To test this file alone, run: @@ -25,12 +23,16 @@ class Derived(T:! type) { var d: T; } -fn AccessDerived[T:! type](x: Derived(T)) -> T { +fn AccessDerived[T:! Core.Copy](x: Derived(T)) -> T { + //@dump-sem-ir-begin return x.d; + //@dump-sem-ir-end } -fn AccessBase[T:! type](x: Derived(T)) -> T { +fn AccessBase[T:! Core.Copy](x: Derived(T)) -> T { + //@dump-sem-ir-begin return x.b; + //@dump-sem-ir-end } fn AccessConcrete(x: Derived(i32)) -> i32 { @@ -77,884 +79,100 @@ fn AccessMissingConcrete(x: Derived(i32)) -> i32 { // CHECK:STDOUT: --- member_access.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Base.type: type = generic_class_type @Base [concrete] -// CHECK:STDOUT: %Base.generic: %Base.type = struct_value () [concrete] -// CHECK:STDOUT: %Base.370: type = class_type @Base, @Base(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %Base.elem.9af: type = unbound_element_type %Base.370, %T [symbolic] -// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness.ef5: = impl_witness @Base.%Destroy.impl_witness_table, @Base.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %ptr.b7c: type = ptr_type %Base.370 [symbolic] -// CHECK:STDOUT: %pattern_type.8d4: type = pattern_type %ptr.b7c [symbolic] -// CHECK:STDOUT: %Base.as.Destroy.impl.Op.type: type = fn_type @Base.as.Destroy.impl.Op, @Base.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %Base.as.Destroy.impl.Op: %Base.as.Destroy.impl.Op.type = struct_value () [symbolic] -// CHECK:STDOUT: %struct_type.b.f69: type = struct_type {.b: %T} [symbolic] -// CHECK:STDOUT: %complete_type.eaf: = complete_type_witness %struct_type.b.f69 [symbolic] -// CHECK:STDOUT: %Derived.type: type = generic_class_type @Derived [concrete] -// CHECK:STDOUT: %Derived.generic: %Derived.type = struct_value () [concrete] -// CHECK:STDOUT: %Derived.85c: type = class_type @Derived, @Derived(%T) [symbolic] -// CHECK:STDOUT: %require_complete.97d: = require_complete_type %Base.370 [symbolic] -// CHECK:STDOUT: %Derived.elem.8b3: type = unbound_element_type %Derived.85c, %Base.370 [symbolic] -// CHECK:STDOUT: %Derived.elem.6d2: type = unbound_element_type %Derived.85c, %T [symbolic] -// CHECK:STDOUT: %Destroy.impl_witness.4a0: = impl_witness @Derived.%Destroy.impl_witness_table, @Derived.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %ptr.178: type = ptr_type %Derived.85c [symbolic] -// CHECK:STDOUT: %pattern_type.520: type = pattern_type %ptr.178 [symbolic] -// CHECK:STDOUT: %Derived.as.Destroy.impl.Op.type: type = fn_type @Derived.as.Destroy.impl.Op, @Derived.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %Derived.as.Destroy.impl.Op: %Derived.as.Destroy.impl.Op.type = struct_value () [symbolic] -// CHECK:STDOUT: %struct_type.base.d.37c: type = struct_type {.base: %Base.370, .d: %T} [symbolic] -// CHECK:STDOUT: %complete_type.8ad: = complete_type_witness %struct_type.base.d.37c [symbolic] -// CHECK:STDOUT: %pattern_type.423: type = pattern_type %Derived.85c [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %AccessDerived.type: type = fn_type @AccessDerived [concrete] -// CHECK:STDOUT: %AccessDerived: %AccessDerived.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.5f4: = require_complete_type %Derived.85c [symbolic] -// CHECK:STDOUT: %AccessBase.type: type = fn_type @AccessBase [concrete] -// CHECK:STDOUT: %AccessBase: %AccessBase.type = struct_value () [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Derived.115: type = class_type @Derived, @Derived(%i32) [concrete] -// CHECK:STDOUT: %pattern_type.9c5: type = pattern_type %Derived.115 [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %AccessConcrete.type: type = fn_type @AccessConcrete [concrete] -// CHECK:STDOUT: %AccessConcrete: %AccessConcrete.type = struct_value () [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] -// CHECK:STDOUT: %Base.10a: type = class_type @Base, @Base(%i32) [concrete] -// CHECK:STDOUT: %Base.elem.a98: type = unbound_element_type %Base.10a, %i32 [concrete] -// CHECK:STDOUT: %struct_type.b.0a3: type = struct_type {.b: %i32} [concrete] -// CHECK:STDOUT: %complete_type.ba8: = complete_type_witness %struct_type.b.0a3 [concrete] -// CHECK:STDOUT: %Derived.elem.0c4: type = unbound_element_type %Derived.115, %Base.10a [concrete] -// CHECK:STDOUT: %Derived.elem.b58: type = unbound_element_type %Derived.115, %i32 [concrete] -// CHECK:STDOUT: %struct_type.base.d.ffa: type = struct_type {.base: %Base.10a, .d: %i32} [concrete] -// CHECK:STDOUT: %complete_type.544: = complete_type_witness %struct_type.base.d.ffa [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %T.578: %Copy.type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T.578 [symbolic] +// CHECK:STDOUT: %Derived.480: type = class_type @Derived, @Derived(%T.as_type) [symbolic] +// CHECK:STDOUT: %pattern_type.5a9: type = pattern_type %Derived.480 [symbolic] +// CHECK:STDOUT: %pattern_type.f8cebc.1: type = pattern_type %T.as_type [symbolic] +// CHECK:STDOUT: %require_complete.ecc: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %Base.051: type = class_type @Base, @Base(%T.as_type) [symbolic] +// CHECK:STDOUT: %require_complete.8c2: = require_complete_type %Base.051 [symbolic] +// CHECK:STDOUT: %Derived.elem.2e2: type = unbound_element_type %Derived.480, %T.as_type [symbolic] +// CHECK:STDOUT: %Base.elem.3dd: type = unbound_element_type %Base.051, %T.as_type [symbolic] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.lookup_impl_witness.3ba: = lookup_impl_witness %T.578, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.72e: %Copy.type = facet_value %T.as_type, (%Copy.lookup_impl_witness.3ba) [symbolic] +// CHECK:STDOUT: %.671: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.72e [symbolic] +// CHECK:STDOUT: %impl.elem0.56e: %.671 = impl_witness_access %Copy.lookup_impl_witness.3ba, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.fb7: = specific_impl_function %impl.elem0.56e, @Copy.Op(%Copy.facet.72e) [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Destroy = %Core.Destroy -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: .AccessDerived = %AccessDerived.decl -// CHECK:STDOUT: .AccessBase = %AccessBase.decl -// CHECK:STDOUT: .AccessConcrete = %AccessConcrete.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: %Base.type = class_decl @Base [concrete = constants.%Base.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_17.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_17.1 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Derived.decl: %Derived.type = class_decl @Derived [concrete = constants.%Derived.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc8_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_15.1 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessDerived.decl: %AccessDerived.type = fn_decl @AccessDerived [concrete = constants.%AccessDerived] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @AccessDerived.%pattern_type.loc13_28 (%pattern_type.423) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @AccessDerived.%pattern_type.loc13_28 (%pattern_type.423) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @AccessDerived.%pattern_type.loc13_43 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @AccessDerived.%pattern_type.loc13_43 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc13_46: type = name_ref T, %T.loc13_18.2 [symbolic = %T.loc13_18.1 (constants.%T)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc13_18.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc13_18.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @AccessDerived.%Derived.loc13_40.1 (%Derived.85c) = value_param call_param0 -// CHECK:STDOUT: %.loc13: type = splice_block %Derived.loc13_40.2 [symbolic = %Derived.loc13_40.1 (constants.%Derived.85c)] { -// CHECK:STDOUT: %Derived.ref: %Derived.type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived.generic] -// CHECK:STDOUT: %T.ref.loc13_39: type = name_ref T, %T.loc13_18.2 [symbolic = %T.loc13_18.1 (constants.%T)] -// CHECK:STDOUT: %Derived.loc13_40.2: type = class_type @Derived, @Derived(constants.%T) [symbolic = %Derived.loc13_40.1 (constants.%Derived.85c)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: @AccessDerived.%Derived.loc13_40.1 (%Derived.85c) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @AccessDerived.%T.loc13_18.1 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @AccessDerived.%T.loc13_18.1 (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessBase.decl: %AccessBase.type = fn_decl @AccessBase [concrete = constants.%AccessBase] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @AccessBase.%pattern_type.loc17_25 (%pattern_type.423) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @AccessBase.%pattern_type.loc17_25 (%pattern_type.423) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @AccessBase.%pattern_type.loc17_40 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @AccessBase.%pattern_type.loc17_40 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc17_43: type = name_ref T, %T.loc17_15.2 [symbolic = %T.loc17_15.1 (constants.%T)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc17_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc17_15.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @AccessBase.%Derived.loc17_37.1 (%Derived.85c) = value_param call_param0 -// CHECK:STDOUT: %.loc17: type = splice_block %Derived.loc17_37.2 [symbolic = %Derived.loc17_37.1 (constants.%Derived.85c)] { -// CHECK:STDOUT: %Derived.ref: %Derived.type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived.generic] -// CHECK:STDOUT: %T.ref.loc17_36: type = name_ref T, %T.loc17_15.2 [symbolic = %T.loc17_15.1 (constants.%T)] -// CHECK:STDOUT: %Derived.loc17_37.2: type = class_type @Derived, @Derived(constants.%T) [symbolic = %Derived.loc17_37.1 (constants.%Derived.85c)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: @AccessBase.%Derived.loc17_37.1 (%Derived.85c) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @AccessBase.%T.loc17_15.1 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @AccessBase.%T.loc17_15.1 (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessConcrete.decl: %AccessConcrete.type = fn_decl @AccessConcrete [concrete = constants.%AccessConcrete] { -// CHECK:STDOUT: %x.patt: %pattern_type.9c5 = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: %pattern_type.9c5 = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc21_39: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc21_39: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %x.param: %Derived.115 = value_param call_param0 -// CHECK:STDOUT: %.loc21: type = splice_block %Derived [concrete = constants.%Derived.115] { -// CHECK:STDOUT: %Derived.ref: %Derived.type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived.generic] -// CHECK:STDOUT: %int_32.loc21_30: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc21_30: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %Derived: type = class_type @Derived, @Derived(constants.%i32) [concrete = constants.%Derived.115] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: %Derived.115 = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic impl @Base.as.Destroy.impl(@Base.%T.loc4_17.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T) [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Base.%Destroy.impl_witness_table, @Base.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.ef5)] +// CHECK:STDOUT: generic fn @AccessDerived(%T.loc13_18.2: %Copy.type) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Base.as.Destroy.impl.Op.type: type = fn_type @Base.as.Destroy.impl.Op, @Base.as.Destroy.impl(%T) [symbolic = %Base.as.Destroy.impl.Op.type (constants.%Base.as.Destroy.impl.Op.type)] -// CHECK:STDOUT: %Base.as.Destroy.impl.Op: @Base.as.Destroy.impl.%Base.as.Destroy.impl.Op.type (%Base.as.Destroy.impl.Op.type) = struct_value () [symbolic = %Base.as.Destroy.impl.Op (constants.%Base.as.Destroy.impl.Op)] +// CHECK:STDOUT: +// CHECK:STDOUT: %Derived.elem: type = unbound_element_type %Derived.loc13_45.1, %T.as_type.loc13_45.1 [symbolic = %Derived.elem (constants.%Derived.elem.2e2)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %T.loc13_18.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.3ba)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %T.as_type.loc13_45.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.72e)] +// CHECK:STDOUT: %.loc15_11.4: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc15_11.4 (constants.%.671)] +// CHECK:STDOUT: %impl.elem0.loc15_11.2: @AccessDerived.%.loc15_11.4 (%.671) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc15_11.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %specific_impl_fn.loc15_11.2: = specific_impl_function %impl.elem0.loc15_11.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc15_11.2 (constants.%specific_impl_fn.fb7)] // CHECK:STDOUT: -// CHECK:STDOUT: impl: @Base.%Self.ref as constants.%Destroy.type { -// CHECK:STDOUT: %Base.as.Destroy.impl.Op.decl: @Base.as.Destroy.impl.%Base.as.Destroy.impl.Op.type (%Base.as.Destroy.impl.Op.type) = fn_decl @Base.as.Destroy.impl.Op [symbolic = @Base.as.Destroy.impl.%Base.as.Destroy.impl.Op (constants.%Base.as.Destroy.impl.Op)] { -// CHECK:STDOUT: %self.patt: @Base.as.Destroy.impl.Op.%pattern_type (%pattern_type.8d4) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Base.as.Destroy.impl.Op.%pattern_type (%pattern_type.8d4) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc4_27.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @Base.as.Destroy.impl.Op.%ptr (%ptr.b7c) = value_param call_param0 -// CHECK:STDOUT: %.loc4_27.2: type = splice_block %Self.ref [symbolic = %Base (constants.%Base.370)] { -// CHECK:STDOUT: %.loc4_27.3: type = specific_constant constants.%Base.370, @Base(constants.%T) [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc4_27.3 [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Base.as.Destroy.impl.Op.%ptr (%ptr.b7c) = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Op = %Base.as.Destroy.impl.Op.decl -// CHECK:STDOUT: witness = @Base.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic impl @Derived.as.Destroy.impl(@Derived.%T.loc8_15.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Derived: type = class_type @Derived, @Derived(%T) [symbolic = %Derived (constants.%Derived.85c)] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Derived.%Destroy.impl_witness_table, @Derived.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.4a0)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Derived.as.Destroy.impl.Op.type: type = fn_type @Derived.as.Destroy.impl.Op, @Derived.as.Destroy.impl(%T) [symbolic = %Derived.as.Destroy.impl.Op.type (constants.%Derived.as.Destroy.impl.Op.type)] -// CHECK:STDOUT: %Derived.as.Destroy.impl.Op: @Derived.as.Destroy.impl.%Derived.as.Destroy.impl.Op.type (%Derived.as.Destroy.impl.Op.type) = struct_value () [symbolic = %Derived.as.Destroy.impl.Op (constants.%Derived.as.Destroy.impl.Op)] -// CHECK:STDOUT: -// CHECK:STDOUT: impl: @Derived.%Self.ref as constants.%Destroy.type { -// CHECK:STDOUT: %Derived.as.Destroy.impl.Op.decl: @Derived.as.Destroy.impl.%Derived.as.Destroy.impl.Op.type (%Derived.as.Destroy.impl.Op.type) = fn_decl @Derived.as.Destroy.impl.Op [symbolic = @Derived.as.Destroy.impl.%Derived.as.Destroy.impl.Op (constants.%Derived.as.Destroy.impl.Op)] { -// CHECK:STDOUT: %self.patt: @Derived.as.Destroy.impl.Op.%pattern_type (%pattern_type.520) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Derived.as.Destroy.impl.Op.%pattern_type (%pattern_type.520) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc8_25.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @Derived.as.Destroy.impl.Op.%ptr (%ptr.178) = value_param call_param0 -// CHECK:STDOUT: %.loc8_25.2: type = splice_block %Self.ref [symbolic = %Derived (constants.%Derived.85c)] { -// CHECK:STDOUT: %.loc8_25.3: type = specific_constant constants.%Derived.85c, @Derived(constants.%T) [symbolic = %Derived (constants.%Derived.85c)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc8_25.3 [symbolic = %Derived (constants.%Derived.85c)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Derived.as.Destroy.impl.Op.%ptr (%ptr.178) = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Op = %Derived.as.Destroy.impl.Op.decl -// CHECK:STDOUT: witness = @Derived.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Base(%T.loc4_17.2: type) { -// CHECK:STDOUT: %T.loc4_17.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_17.1 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_17.1 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T.loc4_17.1) [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %T.loc4_17.1 [symbolic = %Base.elem (constants.%Base.elem.9af)] -// CHECK:STDOUT: %struct_type.b: type = struct_type {.b: @Base.%T.loc4_17.1 (%T)} [symbolic = %struct_type.b (constants.%struct_type.b.f69)] -// CHECK:STDOUT: %complete_type.loc6_1.2: = complete_type_witness %struct_type.b [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.eaf)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_17.2 [symbolic = %T.loc4_17.1 (constants.%T)] -// CHECK:STDOUT: %.loc5: @Base.%Base.elem (%Base.elem.9af) = field_decl b, element0 [concrete] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Base.370 [symbolic = @Base.as.Destroy.impl.%Base (constants.%Base.370)] -// CHECK:STDOUT: impl_decl @Base.as.Destroy.impl [concrete] {} {} -// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Base.as.Destroy.impl.%Base.as.Destroy.impl.Op.decl), @Base.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Base.as.Destroy.impl(constants.%T) [symbolic = @Base.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness.ef5)] -// CHECK:STDOUT: %complete_type.loc6_1.1: = complete_type_witness constants.%struct_type.b.f69 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.eaf)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc6_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base.370 -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .b = %.loc5 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Derived(%T.loc8_15.2: type) { -// CHECK:STDOUT: %T.loc8_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_15.1 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Base.loc9_22.2: type = class_type @Base, @Base(%T.loc8_15.1) [symbolic = %Base.loc9_22.2 (constants.%Base.370)] -// CHECK:STDOUT: %require_complete.loc9: = require_complete_type %Base.loc9_22.2 [symbolic = %require_complete.loc9 (constants.%require_complete.97d)] -// CHECK:STDOUT: %Derived: type = class_type @Derived, @Derived(%T.loc8_15.1) [symbolic = %Derived (constants.%Derived.85c)] -// CHECK:STDOUT: %Derived.elem.loc9: type = unbound_element_type %Derived, %Base.loc9_22.2 [symbolic = %Derived.elem.loc9 (constants.%Derived.elem.8b3)] -// CHECK:STDOUT: %require_complete.loc10: = require_complete_type %T.loc8_15.1 [symbolic = %require_complete.loc10 (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Derived.elem.loc10: type = unbound_element_type %Derived, %T.loc8_15.1 [symbolic = %Derived.elem.loc10 (constants.%Derived.elem.6d2)] -// CHECK:STDOUT: %struct_type.base.d: type = struct_type {.base: @Derived.%Base.loc9_22.2 (%Base.370), .d: @Derived.%T.loc8_15.1 (%T)} [symbolic = %struct_type.base.d (constants.%struct_type.base.d.37c)] -// CHECK:STDOUT: %complete_type.loc11_1.2: = complete_type_witness %struct_type.base.d [symbolic = %complete_type.loc11_1.2 (constants.%complete_type.8ad)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %Base.ref: %Base.type = name_ref Base, file.%Base.decl [concrete = constants.%Base.generic] -// CHECK:STDOUT: %T.ref.loc9: type = name_ref T, %T.loc8_15.2 [symbolic = %T.loc8_15.1 (constants.%T)] -// CHECK:STDOUT: %Base.loc9_22.1: type = class_type @Base, @Base(constants.%T) [symbolic = %Base.loc9_22.2 (constants.%Base.370)] -// CHECK:STDOUT: %.loc9: @Derived.%Derived.elem.loc9 (%Derived.elem.8b3) = base_decl %Base.loc9_22.1, element0 [concrete] -// CHECK:STDOUT: %T.ref.loc10: type = name_ref T, %T.loc8_15.2 [symbolic = %T.loc8_15.1 (constants.%T)] -// CHECK:STDOUT: %.loc10: @Derived.%Derived.elem.loc10 (%Derived.elem.6d2) = field_decl d, element1 [concrete] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Derived.85c [symbolic = @Derived.as.Destroy.impl.%Derived (constants.%Derived.85c)] -// CHECK:STDOUT: impl_decl @Derived.as.Destroy.impl [concrete] {} {} -// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Derived.as.Destroy.impl.%Derived.as.Destroy.impl.Op.decl), @Derived.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Derived.as.Destroy.impl(constants.%T) [symbolic = @Derived.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness.4a0)] -// CHECK:STDOUT: %complete_type.loc11_1.1: = complete_type_witness constants.%struct_type.base.d.37c [symbolic = %complete_type.loc11_1.2 (constants.%complete_type.8ad)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc11_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived.85c -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: .d = %.loc10 -// CHECK:STDOUT: .b = -// CHECK:STDOUT: extend %Base.loc9_22.1 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Base.as.Destroy.impl.Op(@Base.%T.loc4_17.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T) [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: %ptr: type = ptr_type %Base [symbolic = %ptr (constants.%ptr.b7c)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.8d4)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Base.as.Destroy.impl.Op.%ptr (%ptr.b7c)) = "no_op"; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Derived.as.Destroy.impl.Op(@Derived.%T.loc8_15.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Derived: type = class_type @Derived, @Derived(%T) [symbolic = %Derived (constants.%Derived.85c)] -// CHECK:STDOUT: %ptr: type = ptr_type %Derived [symbolic = %ptr (constants.%ptr.178)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.520)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Derived.as.Destroy.impl.Op.%ptr (%ptr.178)) = "no_op"; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @AccessDerived(%T.loc13_18.2: type) { -// CHECK:STDOUT: %T.loc13_18.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc13_18.1 (constants.%T)] -// CHECK:STDOUT: %Derived.loc13_40.1: type = class_type @Derived, @Derived(%T.loc13_18.1) [symbolic = %Derived.loc13_40.1 (constants.%Derived.85c)] -// CHECK:STDOUT: %pattern_type.loc13_28: type = pattern_type %Derived.loc13_40.1 [symbolic = %pattern_type.loc13_28 (constants.%pattern_type.423)] -// CHECK:STDOUT: %pattern_type.loc13_43: type = pattern_type %T.loc13_18.1 [symbolic = %pattern_type.loc13_43 (constants.%pattern_type.7dc)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc13: = require_complete_type %Derived.loc13_40.1 [symbolic = %require_complete.loc13 (constants.%require_complete.5f4)] -// CHECK:STDOUT: %Derived.elem: type = unbound_element_type %Derived.loc13_40.1, %T.loc13_18.1 [symbolic = %Derived.elem (constants.%Derived.elem.6d2)] -// CHECK:STDOUT: %require_complete.loc14: = require_complete_type %T.loc13_18.1 [symbolic = %require_complete.loc14 (constants.%require_complete.4ae)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @AccessDerived.%Derived.loc13_40.1 (%Derived.85c)) -> @AccessDerived.%T.loc13_18.1 (%T) { +// CHECK:STDOUT: fn(%x.param: @AccessDerived.%Derived.loc13_45.1 (%Derived.480)) -> @AccessDerived.%T.as_type.loc13_45.1 (%T.as_type) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @AccessDerived.%Derived.loc13_40.1 (%Derived.85c) = name_ref x, %x -// CHECK:STDOUT: %d.ref: @AccessDerived.%Derived.elem (%Derived.elem.6d2) = name_ref d, @Derived.%.loc10 [concrete = @Derived.%.loc10] -// CHECK:STDOUT: %.loc14_11.1: ref @AccessDerived.%T.loc13_18.1 (%T) = class_element_access %x.ref, element1 -// CHECK:STDOUT: %.loc14_11.2: @AccessDerived.%T.loc13_18.1 (%T) = bind_value %.loc14_11.1 -// CHECK:STDOUT: return %.loc14_11.2 +// CHECK:STDOUT: %x.ref: @AccessDerived.%Derived.loc13_45.1 (%Derived.480) = name_ref x, %x +// CHECK:STDOUT: %d.ref: @AccessDerived.%Derived.elem (%Derived.elem.2e2) = name_ref d, @Derived.%.loc10 [concrete = @Derived.%.loc10] +// CHECK:STDOUT: %.loc15_11.1: ref @AccessDerived.%T.as_type.loc13_45.1 (%T.as_type) = class_element_access %x.ref, element1 +// CHECK:STDOUT: %.loc15_11.2: @AccessDerived.%T.as_type.loc13_45.1 (%T.as_type) = bind_value %.loc15_11.1 +// CHECK:STDOUT: %impl.elem0.loc15_11.1: @AccessDerived.%.loc15_11.4 (%.671) = impl_witness_access constants.%Copy.lookup_impl_witness.3ba, element0 [symbolic = %impl.elem0.loc15_11.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %bound_method.loc15_11.1: = bound_method %.loc15_11.2, %impl.elem0.loc15_11.1 +// CHECK:STDOUT: %specific_impl_fn.loc15_11.1: = specific_impl_function %impl.elem0.loc15_11.1, @Copy.Op(constants.%Copy.facet.72e) [symbolic = %specific_impl_fn.loc15_11.2 (constants.%specific_impl_fn.fb7)] +// CHECK:STDOUT: %bound_method.loc15_11.2: = bound_method %.loc15_11.2, %specific_impl_fn.loc15_11.1 +// CHECK:STDOUT: %.loc15_11.3: init @AccessDerived.%T.as_type.loc13_45.1 (%T.as_type) = call %bound_method.loc15_11.2(%.loc15_11.2) +// CHECK:STDOUT: return %.loc15_11.3 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @AccessBase(%T.loc17_15.2: type) { -// CHECK:STDOUT: %T.loc17_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc17_15.1 (constants.%T)] -// CHECK:STDOUT: %Derived.loc17_37.1: type = class_type @Derived, @Derived(%T.loc17_15.1) [symbolic = %Derived.loc17_37.1 (constants.%Derived.85c)] -// CHECK:STDOUT: %pattern_type.loc17_25: type = pattern_type %Derived.loc17_37.1 [symbolic = %pattern_type.loc17_25 (constants.%pattern_type.423)] -// CHECK:STDOUT: %pattern_type.loc17_40: type = pattern_type %T.loc17_15.1 [symbolic = %pattern_type.loc17_40 (constants.%pattern_type.7dc)] +// CHECK:STDOUT: generic fn @AccessBase(%T.loc19_15.2: %Copy.type) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc17: = require_complete_type %Derived.loc17_37.1 [symbolic = %require_complete.loc17 (constants.%require_complete.5f4)] -// CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T.loc17_15.1) [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: %require_complete.loc18_11: = require_complete_type %Base [symbolic = %require_complete.loc18_11 (constants.%require_complete.97d)] -// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %T.loc17_15.1 [symbolic = %Base.elem (constants.%Base.elem.9af)] -// CHECK:STDOUT: %require_complete.loc18_13: = require_complete_type %T.loc17_15.1 [symbolic = %require_complete.loc18_13 (constants.%require_complete.4ae)] +// CHECK:STDOUT: +// CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T.as_type.loc19_42.1) [symbolic = %Base (constants.%Base.051)] +// CHECK:STDOUT: %require_complete.loc21_11: = require_complete_type %Base [symbolic = %require_complete.loc21_11 (constants.%require_complete.8c2)] +// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %T.as_type.loc19_42.1 [symbolic = %Base.elem (constants.%Base.elem.3dd)] +// CHECK:STDOUT: %require_complete.loc21_13: = require_complete_type %T.as_type.loc19_42.1 [symbolic = %require_complete.loc21_13 (constants.%require_complete.ecc)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %T.loc19_15.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.3ba)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %T.as_type.loc19_42.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.72e)] +// CHECK:STDOUT: %.loc21_11.6: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc21_11.6 (constants.%.671)] +// CHECK:STDOUT: %impl.elem0.loc21_11.2: @AccessBase.%.loc21_11.6 (%.671) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc21_11.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %specific_impl_fn.loc21_11.2: = specific_impl_function %impl.elem0.loc21_11.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc21_11.2 (constants.%specific_impl_fn.fb7)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @AccessBase.%Derived.loc17_37.1 (%Derived.85c)) -> @AccessBase.%T.loc17_15.1 (%T) { +// CHECK:STDOUT: fn(%x.param: @AccessBase.%Derived.loc19_42.1 (%Derived.480)) -> @AccessBase.%T.as_type.loc19_42.1 (%T.as_type) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @AccessBase.%Derived.loc17_37.1 (%Derived.85c) = name_ref x, %x -// CHECK:STDOUT: %b.ref: @AccessBase.%Base.elem (%Base.elem.9af) = name_ref b, @Base.%.loc5 [concrete = @Base.%.loc5] -// CHECK:STDOUT: %.loc18_11.1: ref @AccessBase.%Base (%Base.370) = class_element_access %x.ref, element0 -// CHECK:STDOUT: %.loc18_11.2: ref @AccessBase.%Base (%Base.370) = converted %x.ref, %.loc18_11.1 -// CHECK:STDOUT: %.loc18_11.3: ref @AccessBase.%T.loc17_15.1 (%T) = class_element_access %.loc18_11.2, element0 -// CHECK:STDOUT: %.loc18_11.4: @AccessBase.%T.loc17_15.1 (%T) = bind_value %.loc18_11.3 -// CHECK:STDOUT: return %.loc18_11.4 +// CHECK:STDOUT: %x.ref: @AccessBase.%Derived.loc19_42.1 (%Derived.480) = name_ref x, %x +// CHECK:STDOUT: %b.ref: @AccessBase.%Base.elem (%Base.elem.3dd) = name_ref b, @Base.%.loc5 [concrete = @Base.%.loc5] +// CHECK:STDOUT: %.loc21_11.1: ref @AccessBase.%Base (%Base.051) = class_element_access %x.ref, element0 +// CHECK:STDOUT: %.loc21_11.2: ref @AccessBase.%Base (%Base.051) = converted %x.ref, %.loc21_11.1 +// CHECK:STDOUT: %.loc21_11.3: ref @AccessBase.%T.as_type.loc19_42.1 (%T.as_type) = class_element_access %.loc21_11.2, element0 +// CHECK:STDOUT: %.loc21_11.4: @AccessBase.%T.as_type.loc19_42.1 (%T.as_type) = bind_value %.loc21_11.3 +// CHECK:STDOUT: %impl.elem0.loc21_11.1: @AccessBase.%.loc21_11.6 (%.671) = impl_witness_access constants.%Copy.lookup_impl_witness.3ba, element0 [symbolic = %impl.elem0.loc21_11.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %bound_method.loc21_11.1: = bound_method %.loc21_11.4, %impl.elem0.loc21_11.1 +// CHECK:STDOUT: %specific_impl_fn.loc21_11.1: = specific_impl_function %impl.elem0.loc21_11.1, @Copy.Op(constants.%Copy.facet.72e) [symbolic = %specific_impl_fn.loc21_11.2 (constants.%specific_impl_fn.fb7)] +// CHECK:STDOUT: %bound_method.loc21_11.2: = bound_method %.loc21_11.4, %specific_impl_fn.loc21_11.1 +// CHECK:STDOUT: %.loc21_11.5: init @AccessBase.%T.as_type.loc19_42.1 (%T.as_type) = call %bound_method.loc21_11.2(%.loc21_11.4) +// CHECK:STDOUT: return %.loc21_11.5 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: fn @AccessConcrete(%x.param: %Derived.115) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: %Derived.115 = name_ref x, %x -// CHECK:STDOUT: %b.ref: %Base.elem.a98 = name_ref b, @Base.%.loc5 [concrete = @Base.%.loc5] -// CHECK:STDOUT: %.loc22_11.1: ref %Base.10a = class_element_access %x.ref, element0 -// CHECK:STDOUT: %.loc22_11.2: ref %Base.10a = converted %x.ref, %.loc22_11.1 -// CHECK:STDOUT: %.loc22_11.3: ref %i32 = class_element_access %.loc22_11.2, element0 -// CHECK:STDOUT: %.loc22_11.4: %i32 = bind_value %.loc22_11.3 -// CHECK:STDOUT: return %.loc22_11.4 +// CHECK:STDOUT: specific @AccessDerived(constants.%T.578) { +// CHECK:STDOUT: %T.loc13_18.1 => constants.%T.578 +// CHECK:STDOUT: %T.as_type.loc13_45.1 => constants.%T.as_type +// CHECK:STDOUT: %Derived.loc13_45.1 => constants.%Derived.480 +// CHECK:STDOUT: %pattern_type.loc13_33 => constants.%pattern_type.5a9 +// CHECK:STDOUT: %pattern_type.loc13_48 => constants.%pattern_type.f8cebc.1 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Base(constants.%T) { -// CHECK:STDOUT: %T.loc4_17.1 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae -// CHECK:STDOUT: %Base => constants.%Base.370 -// CHECK:STDOUT: %Base.elem => constants.%Base.elem.9af -// CHECK:STDOUT: %struct_type.b => constants.%struct_type.b.f69 -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.eaf -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Base.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Base => constants.%Base.370 -// CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness.ef5 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Base.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Base => constants.%Base.370 -// CHECK:STDOUT: %ptr => constants.%ptr.b7c -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.8d4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Derived(constants.%T) { -// CHECK:STDOUT: %T.loc8_15.1 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Base.loc9_22.2 => constants.%Base.370 -// CHECK:STDOUT: %require_complete.loc9 => constants.%require_complete.97d -// CHECK:STDOUT: %Derived => constants.%Derived.85c -// CHECK:STDOUT: %Derived.elem.loc9 => constants.%Derived.elem.8b3 -// CHECK:STDOUT: %require_complete.loc10 => constants.%require_complete.4ae -// CHECK:STDOUT: %Derived.elem.loc10 => constants.%Derived.elem.6d2 -// CHECK:STDOUT: %struct_type.base.d => constants.%struct_type.base.d.37c -// CHECK:STDOUT: %complete_type.loc11_1.2 => constants.%complete_type.8ad -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Derived.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Derived => constants.%Derived.85c -// CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness.4a0 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Derived.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Derived => constants.%Derived.85c -// CHECK:STDOUT: %ptr => constants.%ptr.178 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.520 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @AccessDerived(constants.%T) { -// CHECK:STDOUT: %T.loc13_18.1 => constants.%T -// CHECK:STDOUT: %Derived.loc13_40.1 => constants.%Derived.85c -// CHECK:STDOUT: %pattern_type.loc13_28 => constants.%pattern_type.423 -// CHECK:STDOUT: %pattern_type.loc13_43 => constants.%pattern_type.7dc -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @AccessBase(constants.%T) { -// CHECK:STDOUT: %T.loc17_15.1 => constants.%T -// CHECK:STDOUT: %Derived.loc17_37.1 => constants.%Derived.85c -// CHECK:STDOUT: %pattern_type.loc17_25 => constants.%pattern_type.423 -// CHECK:STDOUT: %pattern_type.loc17_40 => constants.%pattern_type.7dc -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Derived(constants.%i32) { -// CHECK:STDOUT: %T.loc8_15.1 => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Base.loc9_22.2 => constants.%Base.10a -// CHECK:STDOUT: %require_complete.loc9 => constants.%complete_type.ba8 -// CHECK:STDOUT: %Derived => constants.%Derived.115 -// CHECK:STDOUT: %Derived.elem.loc9 => constants.%Derived.elem.0c4 -// CHECK:STDOUT: %require_complete.loc10 => constants.%complete_type.f8a -// CHECK:STDOUT: %Derived.elem.loc10 => constants.%Derived.elem.b58 -// CHECK:STDOUT: %struct_type.base.d => constants.%struct_type.base.d.ffa -// CHECK:STDOUT: %complete_type.loc11_1.2 => constants.%complete_type.544 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Base(constants.%i32) { -// CHECK:STDOUT: %T.loc4_17.1 => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %Base => constants.%Base.10a -// CHECK:STDOUT: %Base.elem => constants.%Base.elem.a98 -// CHECK:STDOUT: %struct_type.b => constants.%struct_type.b.0a3 -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.ba8 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_no_member.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Base.type: type = generic_class_type @Base [concrete] -// CHECK:STDOUT: %Base.generic: %Base.type = struct_value () [concrete] -// CHECK:STDOUT: %Base.370: type = class_type @Base, @Base(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %Base.elem.9af: type = unbound_element_type %Base.370, %T [symbolic] -// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness.ef5: = impl_witness @Base.%Destroy.impl_witness_table, @Base.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %ptr.b7c: type = ptr_type %Base.370 [symbolic] -// CHECK:STDOUT: %pattern_type.8d4: type = pattern_type %ptr.b7c [symbolic] -// CHECK:STDOUT: %Base.as.Destroy.impl.Op.type: type = fn_type @Base.as.Destroy.impl.Op, @Base.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %Base.as.Destroy.impl.Op: %Base.as.Destroy.impl.Op.type = struct_value () [symbolic] -// CHECK:STDOUT: %struct_type.b.f69: type = struct_type {.b: %T} [symbolic] -// CHECK:STDOUT: %complete_type.eaf: = complete_type_witness %struct_type.b.f69 [symbolic] -// CHECK:STDOUT: %Derived.type: type = generic_class_type @Derived [concrete] -// CHECK:STDOUT: %Derived.generic: %Derived.type = struct_value () [concrete] -// CHECK:STDOUT: %Derived.85c: type = class_type @Derived, @Derived(%T) [symbolic] -// CHECK:STDOUT: %require_complete.97d: = require_complete_type %Base.370 [symbolic] -// CHECK:STDOUT: %Derived.elem.8b3: type = unbound_element_type %Derived.85c, %Base.370 [symbolic] -// CHECK:STDOUT: %Derived.elem.6d2: type = unbound_element_type %Derived.85c, %T [symbolic] -// CHECK:STDOUT: %Destroy.impl_witness.4a0: = impl_witness @Derived.%Destroy.impl_witness_table, @Derived.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %ptr.178: type = ptr_type %Derived.85c [symbolic] -// CHECK:STDOUT: %pattern_type.520: type = pattern_type %ptr.178 [symbolic] -// CHECK:STDOUT: %Derived.as.Destroy.impl.Op.type: type = fn_type @Derived.as.Destroy.impl.Op, @Derived.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %Derived.as.Destroy.impl.Op: %Derived.as.Destroy.impl.Op.type = struct_value () [symbolic] -// CHECK:STDOUT: %struct_type.base.d.37c: type = struct_type {.base: %Base.370, .d: %T} [symbolic] -// CHECK:STDOUT: %complete_type.8ad: = complete_type_witness %struct_type.base.d.37c [symbolic] -// CHECK:STDOUT: %pattern_type.9f7: type = pattern_type %Base.370 [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %AccessMissingBase.type: type = fn_type @AccessMissingBase [concrete] -// CHECK:STDOUT: %AccessMissingBase: %AccessMissingBase.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.423: type = pattern_type %Derived.85c [symbolic] -// CHECK:STDOUT: %AccessMissingDerived.type: type = fn_type @AccessMissingDerived [concrete] -// CHECK:STDOUT: %AccessMissingDerived: %AccessMissingDerived.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.5f4: = require_complete_type %Derived.85c [symbolic] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Derived.115: type = class_type @Derived, @Derived(%i32) [concrete] -// CHECK:STDOUT: %pattern_type.9c5: type = pattern_type %Derived.115 [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %AccessMissingConcrete.type: type = fn_type @AccessMissingConcrete [concrete] -// CHECK:STDOUT: %AccessMissingConcrete: %AccessMissingConcrete.type = struct_value () [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] -// CHECK:STDOUT: %Base.10a: type = class_type @Base, @Base(%i32) [concrete] -// CHECK:STDOUT: %Base.elem.a98: type = unbound_element_type %Base.10a, %i32 [concrete] -// CHECK:STDOUT: %struct_type.b.0a3: type = struct_type {.b: %i32} [concrete] -// CHECK:STDOUT: %complete_type.ba8: = complete_type_witness %struct_type.b.0a3 [concrete] -// CHECK:STDOUT: %Derived.elem.0c4: type = unbound_element_type %Derived.115, %Base.10a [concrete] -// CHECK:STDOUT: %Derived.elem.b58: type = unbound_element_type %Derived.115, %i32 [concrete] -// CHECK:STDOUT: %struct_type.base.d.ffa: type = struct_type {.base: %Base.10a, .d: %i32} [concrete] -// CHECK:STDOUT: %complete_type.544: = complete_type_witness %struct_type.base.d.ffa [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Destroy = %Core.Destroy -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: .AccessMissingBase = %AccessMissingBase.decl -// CHECK:STDOUT: .AccessMissingDerived = %AccessMissingDerived.decl -// CHECK:STDOUT: .AccessMissingConcrete = %AccessMissingConcrete.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: %Base.type = class_decl @Base [concrete = constants.%Base.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_17.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_17.1 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Derived.decl: %Derived.type = class_decl @Derived [concrete = constants.%Derived.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc8_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_15.1 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessMissingBase.decl: %AccessMissingBase.type = fn_decl @AccessMissingBase [concrete = constants.%AccessMissingBase] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @AccessMissingBase.%pattern_type.loc13_32 (%pattern_type.9f7) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @AccessMissingBase.%pattern_type.loc13_32 (%pattern_type.9f7) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @AccessMissingBase.%pattern_type.loc13_44 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @AccessMissingBase.%pattern_type.loc13_44 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc13_47: type = name_ref T, %T.loc13_22.2 [symbolic = %T.loc13_22.1 (constants.%T)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc13_22.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc13_22.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @AccessMissingBase.%Base.loc13_41.1 (%Base.370) = value_param call_param0 -// CHECK:STDOUT: %.loc13: type = splice_block %Base.loc13_41.2 [symbolic = %Base.loc13_41.1 (constants.%Base.370)] { -// CHECK:STDOUT: %Base.ref: %Base.type = name_ref Base, file.%Base.decl [concrete = constants.%Base.generic] -// CHECK:STDOUT: %T.ref.loc13_40: type = name_ref T, %T.loc13_22.2 [symbolic = %T.loc13_22.1 (constants.%T)] -// CHECK:STDOUT: %Base.loc13_41.2: type = class_type @Base, @Base(constants.%T) [symbolic = %Base.loc13_41.1 (constants.%Base.370)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: @AccessMissingBase.%Base.loc13_41.1 (%Base.370) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @AccessMissingBase.%T.loc13_22.1 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @AccessMissingBase.%T.loc13_22.1 (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessMissingDerived.decl: %AccessMissingDerived.type = fn_decl @AccessMissingDerived [concrete = constants.%AccessMissingDerived] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @AccessMissingDerived.%pattern_type.loc21_35 (%pattern_type.423) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @AccessMissingDerived.%pattern_type.loc21_35 (%pattern_type.423) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @AccessMissingDerived.%pattern_type.loc21_50 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @AccessMissingDerived.%pattern_type.loc21_50 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc21_53: type = name_ref T, %T.loc21_25.2 [symbolic = %T.loc21_25.1 (constants.%T)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc21_25.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc21_25.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @AccessMissingDerived.%Derived.loc21_47.1 (%Derived.85c) = value_param call_param0 -// CHECK:STDOUT: %.loc21: type = splice_block %Derived.loc21_47.2 [symbolic = %Derived.loc21_47.1 (constants.%Derived.85c)] { -// CHECK:STDOUT: %Derived.ref: %Derived.type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived.generic] -// CHECK:STDOUT: %T.ref.loc21_46: type = name_ref T, %T.loc21_25.2 [symbolic = %T.loc21_25.1 (constants.%T)] -// CHECK:STDOUT: %Derived.loc21_47.2: type = class_type @Derived, @Derived(constants.%T) [symbolic = %Derived.loc21_47.1 (constants.%Derived.85c)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: @AccessMissingDerived.%Derived.loc21_47.1 (%Derived.85c) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @AccessMissingDerived.%T.loc21_25.1 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @AccessMissingDerived.%T.loc21_25.1 (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessMissingConcrete.decl: %AccessMissingConcrete.type = fn_decl @AccessMissingConcrete [concrete = constants.%AccessMissingConcrete] { -// CHECK:STDOUT: %x.patt: %pattern_type.9c5 = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: %pattern_type.9c5 = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc29_46: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc29_46: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %x.param: %Derived.115 = value_param call_param0 -// CHECK:STDOUT: %.loc29: type = splice_block %Derived [concrete = constants.%Derived.115] { -// CHECK:STDOUT: %Derived.ref: %Derived.type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived.generic] -// CHECK:STDOUT: %int_32.loc29_37: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc29_37: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %Derived: type = class_type @Derived, @Derived(constants.%i32) [concrete = constants.%Derived.115] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: %Derived.115 = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic impl @Base.as.Destroy.impl(@Base.%T.loc4_17.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T) [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Base.%Destroy.impl_witness_table, @Base.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.ef5)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Base.as.Destroy.impl.Op.type: type = fn_type @Base.as.Destroy.impl.Op, @Base.as.Destroy.impl(%T) [symbolic = %Base.as.Destroy.impl.Op.type (constants.%Base.as.Destroy.impl.Op.type)] -// CHECK:STDOUT: %Base.as.Destroy.impl.Op: @Base.as.Destroy.impl.%Base.as.Destroy.impl.Op.type (%Base.as.Destroy.impl.Op.type) = struct_value () [symbolic = %Base.as.Destroy.impl.Op (constants.%Base.as.Destroy.impl.Op)] -// CHECK:STDOUT: -// CHECK:STDOUT: impl: @Base.%Self.ref as constants.%Destroy.type { -// CHECK:STDOUT: %Base.as.Destroy.impl.Op.decl: @Base.as.Destroy.impl.%Base.as.Destroy.impl.Op.type (%Base.as.Destroy.impl.Op.type) = fn_decl @Base.as.Destroy.impl.Op [symbolic = @Base.as.Destroy.impl.%Base.as.Destroy.impl.Op (constants.%Base.as.Destroy.impl.Op)] { -// CHECK:STDOUT: %self.patt: @Base.as.Destroy.impl.Op.%pattern_type (%pattern_type.8d4) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Base.as.Destroy.impl.Op.%pattern_type (%pattern_type.8d4) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc4_27.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @Base.as.Destroy.impl.Op.%ptr (%ptr.b7c) = value_param call_param0 -// CHECK:STDOUT: %.loc4_27.2: type = splice_block %Self.ref [symbolic = %Base (constants.%Base.370)] { -// CHECK:STDOUT: %.loc4_27.3: type = specific_constant constants.%Base.370, @Base(constants.%T) [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc4_27.3 [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Base.as.Destroy.impl.Op.%ptr (%ptr.b7c) = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Op = %Base.as.Destroy.impl.Op.decl -// CHECK:STDOUT: witness = @Base.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic impl @Derived.as.Destroy.impl(@Derived.%T.loc8_15.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Derived: type = class_type @Derived, @Derived(%T) [symbolic = %Derived (constants.%Derived.85c)] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Derived.%Destroy.impl_witness_table, @Derived.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.4a0)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Derived.as.Destroy.impl.Op.type: type = fn_type @Derived.as.Destroy.impl.Op, @Derived.as.Destroy.impl(%T) [symbolic = %Derived.as.Destroy.impl.Op.type (constants.%Derived.as.Destroy.impl.Op.type)] -// CHECK:STDOUT: %Derived.as.Destroy.impl.Op: @Derived.as.Destroy.impl.%Derived.as.Destroy.impl.Op.type (%Derived.as.Destroy.impl.Op.type) = struct_value () [symbolic = %Derived.as.Destroy.impl.Op (constants.%Derived.as.Destroy.impl.Op)] -// CHECK:STDOUT: -// CHECK:STDOUT: impl: @Derived.%Self.ref as constants.%Destroy.type { -// CHECK:STDOUT: %Derived.as.Destroy.impl.Op.decl: @Derived.as.Destroy.impl.%Derived.as.Destroy.impl.Op.type (%Derived.as.Destroy.impl.Op.type) = fn_decl @Derived.as.Destroy.impl.Op [symbolic = @Derived.as.Destroy.impl.%Derived.as.Destroy.impl.Op (constants.%Derived.as.Destroy.impl.Op)] { -// CHECK:STDOUT: %self.patt: @Derived.as.Destroy.impl.Op.%pattern_type (%pattern_type.520) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Derived.as.Destroy.impl.Op.%pattern_type (%pattern_type.520) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc8_25.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @Derived.as.Destroy.impl.Op.%ptr (%ptr.178) = value_param call_param0 -// CHECK:STDOUT: %.loc8_25.2: type = splice_block %Self.ref [symbolic = %Derived (constants.%Derived.85c)] { -// CHECK:STDOUT: %.loc8_25.3: type = specific_constant constants.%Derived.85c, @Derived(constants.%T) [symbolic = %Derived (constants.%Derived.85c)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc8_25.3 [symbolic = %Derived (constants.%Derived.85c)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Derived.as.Destroy.impl.Op.%ptr (%ptr.178) = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Op = %Derived.as.Destroy.impl.Op.decl -// CHECK:STDOUT: witness = @Derived.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Base(%T.loc4_17.2: type) { -// CHECK:STDOUT: %T.loc4_17.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_17.1 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_17.1 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T.loc4_17.1) [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %T.loc4_17.1 [symbolic = %Base.elem (constants.%Base.elem.9af)] -// CHECK:STDOUT: %struct_type.b: type = struct_type {.b: @Base.%T.loc4_17.1 (%T)} [symbolic = %struct_type.b (constants.%struct_type.b.f69)] -// CHECK:STDOUT: %complete_type.loc6_1.2: = complete_type_witness %struct_type.b [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.eaf)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_17.2 [symbolic = %T.loc4_17.1 (constants.%T)] -// CHECK:STDOUT: %.loc5: @Base.%Base.elem (%Base.elem.9af) = field_decl b, element0 [concrete] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Base.370 [symbolic = @Base.as.Destroy.impl.%Base (constants.%Base.370)] -// CHECK:STDOUT: impl_decl @Base.as.Destroy.impl [concrete] {} {} -// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Base.as.Destroy.impl.%Base.as.Destroy.impl.Op.decl), @Base.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Base.as.Destroy.impl(constants.%T) [symbolic = @Base.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness.ef5)] -// CHECK:STDOUT: %complete_type.loc6_1.1: = complete_type_witness constants.%struct_type.b.f69 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.eaf)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc6_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base.370 -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .b = %.loc5 -// CHECK:STDOUT: .nonesuch = -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Derived(%T.loc8_15.2: type) { -// CHECK:STDOUT: %T.loc8_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_15.1 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Base.loc9_22.2: type = class_type @Base, @Base(%T.loc8_15.1) [symbolic = %Base.loc9_22.2 (constants.%Base.370)] -// CHECK:STDOUT: %require_complete.loc9: = require_complete_type %Base.loc9_22.2 [symbolic = %require_complete.loc9 (constants.%require_complete.97d)] -// CHECK:STDOUT: %Derived: type = class_type @Derived, @Derived(%T.loc8_15.1) [symbolic = %Derived (constants.%Derived.85c)] -// CHECK:STDOUT: %Derived.elem.loc9: type = unbound_element_type %Derived, %Base.loc9_22.2 [symbolic = %Derived.elem.loc9 (constants.%Derived.elem.8b3)] -// CHECK:STDOUT: %require_complete.loc10: = require_complete_type %T.loc8_15.1 [symbolic = %require_complete.loc10 (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Derived.elem.loc10: type = unbound_element_type %Derived, %T.loc8_15.1 [symbolic = %Derived.elem.loc10 (constants.%Derived.elem.6d2)] -// CHECK:STDOUT: %struct_type.base.d: type = struct_type {.base: @Derived.%Base.loc9_22.2 (%Base.370), .d: @Derived.%T.loc8_15.1 (%T)} [symbolic = %struct_type.base.d (constants.%struct_type.base.d.37c)] -// CHECK:STDOUT: %complete_type.loc11_1.2: = complete_type_witness %struct_type.base.d [symbolic = %complete_type.loc11_1.2 (constants.%complete_type.8ad)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %Base.ref: %Base.type = name_ref Base, file.%Base.decl [concrete = constants.%Base.generic] -// CHECK:STDOUT: %T.ref.loc9: type = name_ref T, %T.loc8_15.2 [symbolic = %T.loc8_15.1 (constants.%T)] -// CHECK:STDOUT: %Base.loc9_22.1: type = class_type @Base, @Base(constants.%T) [symbolic = %Base.loc9_22.2 (constants.%Base.370)] -// CHECK:STDOUT: %.loc9: @Derived.%Derived.elem.loc9 (%Derived.elem.8b3) = base_decl %Base.loc9_22.1, element0 [concrete] -// CHECK:STDOUT: %T.ref.loc10: type = name_ref T, %T.loc8_15.2 [symbolic = %T.loc8_15.1 (constants.%T)] -// CHECK:STDOUT: %.loc10: @Derived.%Derived.elem.loc10 (%Derived.elem.6d2) = field_decl d, element1 [concrete] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Derived.85c [symbolic = @Derived.as.Destroy.impl.%Derived (constants.%Derived.85c)] -// CHECK:STDOUT: impl_decl @Derived.as.Destroy.impl [concrete] {} {} -// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Derived.as.Destroy.impl.%Derived.as.Destroy.impl.Op.decl), @Derived.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Derived.as.Destroy.impl(constants.%T) [symbolic = @Derived.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness.4a0)] -// CHECK:STDOUT: %complete_type.loc11_1.1: = complete_type_witness constants.%struct_type.base.d.37c [symbolic = %complete_type.loc11_1.2 (constants.%complete_type.8ad)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc11_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived.85c -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: .d = %.loc10 -// CHECK:STDOUT: .nonesuch = -// CHECK:STDOUT: extend %Base.loc9_22.1 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Base.as.Destroy.impl.Op(@Base.%T.loc4_17.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T) [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: %ptr: type = ptr_type %Base [symbolic = %ptr (constants.%ptr.b7c)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.8d4)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Base.as.Destroy.impl.Op.%ptr (%ptr.b7c)) = "no_op"; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Derived.as.Destroy.impl.Op(@Derived.%T.loc8_15.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Derived: type = class_type @Derived, @Derived(%T) [symbolic = %Derived (constants.%Derived.85c)] -// CHECK:STDOUT: %ptr: type = ptr_type %Derived [symbolic = %ptr (constants.%ptr.178)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.520)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Derived.as.Destroy.impl.Op.%ptr (%ptr.178)) = "no_op"; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @AccessMissingBase(%T.loc13_22.2: type) { -// CHECK:STDOUT: %T.loc13_22.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc13_22.1 (constants.%T)] -// CHECK:STDOUT: %Base.loc13_41.1: type = class_type @Base, @Base(%T.loc13_22.1) [symbolic = %Base.loc13_41.1 (constants.%Base.370)] -// CHECK:STDOUT: %pattern_type.loc13_32: type = pattern_type %Base.loc13_41.1 [symbolic = %pattern_type.loc13_32 (constants.%pattern_type.9f7)] -// CHECK:STDOUT: %pattern_type.loc13_44: type = pattern_type %T.loc13_22.1 [symbolic = %pattern_type.loc13_44 (constants.%pattern_type.7dc)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %Base.loc13_41.1 [symbolic = %require_complete (constants.%require_complete.97d)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @AccessMissingBase.%Base.loc13_41.1 (%Base.370)) -> @AccessMissingBase.%T.loc13_22.1 (%T) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @AccessMissingBase.%Base.loc13_41.1 (%Base.370) = name_ref x, %x -// CHECK:STDOUT: %nonesuch.ref: = name_ref nonesuch, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @AccessMissingDerived(%T.loc21_25.2: type) { -// CHECK:STDOUT: %T.loc21_25.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc21_25.1 (constants.%T)] -// CHECK:STDOUT: %Derived.loc21_47.1: type = class_type @Derived, @Derived(%T.loc21_25.1) [symbolic = %Derived.loc21_47.1 (constants.%Derived.85c)] -// CHECK:STDOUT: %pattern_type.loc21_35: type = pattern_type %Derived.loc21_47.1 [symbolic = %pattern_type.loc21_35 (constants.%pattern_type.423)] -// CHECK:STDOUT: %pattern_type.loc21_50: type = pattern_type %T.loc21_25.1 [symbolic = %pattern_type.loc21_50 (constants.%pattern_type.7dc)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc21: = require_complete_type %Derived.loc21_47.1 [symbolic = %require_complete.loc21 (constants.%require_complete.5f4)] -// CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T.loc21_25.1) [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: %require_complete.loc26: = require_complete_type %Base [symbolic = %require_complete.loc26 (constants.%require_complete.97d)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @AccessMissingDerived.%Derived.loc21_47.1 (%Derived.85c)) -> @AccessMissingDerived.%T.loc21_25.1 (%T) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @AccessMissingDerived.%Derived.loc21_47.1 (%Derived.85c) = name_ref x, %x -// CHECK:STDOUT: %nonesuch.ref: = name_ref nonesuch, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @AccessMissingConcrete(%x.param: %Derived.115) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: %Derived.115 = name_ref x, %x -// CHECK:STDOUT: %nonesuch.ref: = name_ref nonesuch, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Base(constants.%T) { -// CHECK:STDOUT: %T.loc4_17.1 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae -// CHECK:STDOUT: %Base => constants.%Base.370 -// CHECK:STDOUT: %Base.elem => constants.%Base.elem.9af -// CHECK:STDOUT: %struct_type.b => constants.%struct_type.b.f69 -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.eaf -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Base.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Base => constants.%Base.370 -// CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness.ef5 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Base.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Base => constants.%Base.370 -// CHECK:STDOUT: %ptr => constants.%ptr.b7c -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.8d4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Derived(constants.%T) { -// CHECK:STDOUT: %T.loc8_15.1 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Base.loc9_22.2 => constants.%Base.370 -// CHECK:STDOUT: %require_complete.loc9 => constants.%require_complete.97d -// CHECK:STDOUT: %Derived => constants.%Derived.85c -// CHECK:STDOUT: %Derived.elem.loc9 => constants.%Derived.elem.8b3 -// CHECK:STDOUT: %require_complete.loc10 => constants.%require_complete.4ae -// CHECK:STDOUT: %Derived.elem.loc10 => constants.%Derived.elem.6d2 -// CHECK:STDOUT: %struct_type.base.d => constants.%struct_type.base.d.37c -// CHECK:STDOUT: %complete_type.loc11_1.2 => constants.%complete_type.8ad -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Derived.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Derived => constants.%Derived.85c -// CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness.4a0 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Derived.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Derived => constants.%Derived.85c -// CHECK:STDOUT: %ptr => constants.%ptr.178 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.520 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @AccessMissingBase(constants.%T) { -// CHECK:STDOUT: %T.loc13_22.1 => constants.%T -// CHECK:STDOUT: %Base.loc13_41.1 => constants.%Base.370 -// CHECK:STDOUT: %pattern_type.loc13_32 => constants.%pattern_type.9f7 -// CHECK:STDOUT: %pattern_type.loc13_44 => constants.%pattern_type.7dc -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @AccessMissingDerived(constants.%T) { -// CHECK:STDOUT: %T.loc21_25.1 => constants.%T -// CHECK:STDOUT: %Derived.loc21_47.1 => constants.%Derived.85c -// CHECK:STDOUT: %pattern_type.loc21_35 => constants.%pattern_type.423 -// CHECK:STDOUT: %pattern_type.loc21_50 => constants.%pattern_type.7dc -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Derived(constants.%i32) { -// CHECK:STDOUT: %T.loc8_15.1 => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Base.loc9_22.2 => constants.%Base.10a -// CHECK:STDOUT: %require_complete.loc9 => constants.%complete_type.ba8 -// CHECK:STDOUT: %Derived => constants.%Derived.115 -// CHECK:STDOUT: %Derived.elem.loc9 => constants.%Derived.elem.0c4 -// CHECK:STDOUT: %require_complete.loc10 => constants.%complete_type.f8a -// CHECK:STDOUT: %Derived.elem.loc10 => constants.%Derived.elem.b58 -// CHECK:STDOUT: %struct_type.base.d => constants.%struct_type.base.d.ffa -// CHECK:STDOUT: %complete_type.loc11_1.2 => constants.%complete_type.544 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Base(constants.%i32) { -// CHECK:STDOUT: %T.loc4_17.1 => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %Base => constants.%Base.10a -// CHECK:STDOUT: %Base.elem => constants.%Base.elem.a98 -// CHECK:STDOUT: %struct_type.b => constants.%struct_type.b.0a3 -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.ba8 +// CHECK:STDOUT: specific @AccessBase(constants.%T.578) { +// CHECK:STDOUT: %T.loc19_15.1 => constants.%T.578 +// CHECK:STDOUT: %T.as_type.loc19_42.1 => constants.%T.as_type +// CHECK:STDOUT: %Derived.loc19_42.1 => constants.%Derived.480 +// CHECK:STDOUT: %pattern_type.loc19_30 => constants.%pattern_type.5a9 +// CHECK:STDOUT: %pattern_type.loc19_45 => constants.%pattern_type.f8cebc.1 // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/member_out_of_line.carbon b/toolchain/check/testdata/class/generic/member_out_of_line.carbon index 6917d7f9df4a..5f8eb85aaffd 100644 --- a/toolchain/check/testdata/class/generic/member_out_of_line.carbon +++ b/toolchain/check/testdata/class/generic/member_out_of_line.carbon @@ -3,8 +3,6 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // // INCLUDE-FILE: toolchain/testing/testdata/min_prelude/convert.carbon -// TODO: Add ranges and switch to "--dump-sem-ir-ranges=only". -// EXTRA-ARGS: --dump-sem-ir-ranges=if-present // // AUTOUPDATE // TIP: To test this file alone, run: @@ -16,24 +14,27 @@ library "[[@TEST_NAME]]"; -class Class(T:! type) { +//@dump-sem-ir-begin +class Class(T:! Core.Copy) { fn F(n: T) -> T; fn G[self: Self]() -> T; var n: T; } -fn Class(T:! type).F(n: T) -> T { +fn Class(T:! Core.Copy).F(n: T) -> T { return n; } -fn Class(T:! type).G[self: Self]() -> T { +fn Class(T:! Core.Copy).G[self: Self]() -> T { return self.n; } +//@dump-sem-ir-end // --- nested.carbon library "[[@TEST_NAME]]"; +//@dump-sem-ir-begin class A(T:! type) { class B(N:! T) { fn F[self: Self](a: T); @@ -41,6 +42,7 @@ class A(T:! type) { } fn A(T:! type).B(N:! T).F[self: Self](a: T) {} +//@dump-sem-ir-end // --- fail_mismatched_not_generic_vs_generic.carbon @@ -113,91 +115,114 @@ fn Generic(T:! ()).WrongType() {} // CHECK:STDOUT: --- basic.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %T.578: %Copy.type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %pattern_type.ce2: type = pattern_type %Copy.type [concrete] // CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] // CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %Class.F.type: type = fn_type @Class.F, @Class(%T) [symbolic] +// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.578) [symbolic] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T.578 [symbolic] +// CHECK:STDOUT: %pattern_type.f8cebc.1: type = pattern_type %T.as_type [symbolic] +// CHECK:STDOUT: %Class.F.type: type = fn_type @Class.F, @Class(%T.578) [symbolic] // CHECK:STDOUT: %Class.F: %Class.F.type = struct_value () [symbolic] -// CHECK:STDOUT: %pattern_type.3c1: type = pattern_type %Class [symbolic] -// CHECK:STDOUT: %Class.G.type: type = fn_type @Class.G, @Class(%T) [symbolic] +// CHECK:STDOUT: %pattern_type.47a: type = pattern_type %Class [symbolic] +// CHECK:STDOUT: %Class.G.type: type = fn_type @Class.G, @Class(%T.578) [symbolic] // CHECK:STDOUT: %Class.G: %Class.G.type = struct_value () [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic] +// CHECK:STDOUT: %require_complete.ecc: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.as_type [symbolic] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %ptr.955: type = ptr_type %Class [symbolic] -// CHECK:STDOUT: %pattern_type.9e0: type = pattern_type %ptr.955 [symbolic] -// CHECK:STDOUT: %Class.as.Destroy.impl.Op.type: type = fn_type @Class.as.Destroy.impl.Op, @Class.as.Destroy.impl(%T) [symbolic] +// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T.578) [symbolic] +// CHECK:STDOUT: %ptr.0b3: type = ptr_type %Class [symbolic] +// CHECK:STDOUT: %pattern_type.417: type = pattern_type %ptr.0b3 [symbolic] +// CHECK:STDOUT: %Class.as.Destroy.impl.Op.type: type = fn_type @Class.as.Destroy.impl.Op, @Class.as.Destroy.impl(%T.578) [symbolic] // CHECK:STDOUT: %Class.as.Destroy.impl.Op: %Class.as.Destroy.impl.Op.type = struct_value () [symbolic] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %T} [symbolic] +// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %T.as_type} [symbolic] // CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.n [symbolic] -// CHECK:STDOUT: %require_complete.4f8: = require_complete_type %Class [symbolic] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.lookup_impl_witness.3ba: = lookup_impl_witness %T.578, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.72e: %Copy.type = facet_value %T.as_type, (%Copy.lookup_impl_witness.3ba) [symbolic] +// CHECK:STDOUT: %.671: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.72e [symbolic] +// CHECK:STDOUT: %impl.elem0.56e: %.671 = impl_witness_access %Copy.lookup_impl_witness.3ba, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.fb7: = specific_impl_function %impl.elem0.56e, @Copy.Op(%Copy.facet.72e) [symbolic] +// CHECK:STDOUT: %require_complete.ef5: = require_complete_type %Class [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core // CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type.ce2 = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.1 (constants.%T)] +// CHECK:STDOUT: %.loc5: type = splice_block %Copy.ref [concrete = constants.%Copy.type] { +// CHECK:STDOUT: +// CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core [concrete = imports.%Core] +// CHECK:STDOUT: %Copy.ref: type = name_ref Copy, imports.%Core.Copy [concrete = constants.%Copy.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc5_13.2: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc5_13.1 (constants.%T.578)] // CHECK:STDOUT: } // CHECK:STDOUT: %Class.F.decl: %Class.F.type = fn_decl @Class.F [symbolic = constants.%Class.F] { -// CHECK:STDOUT: %n.patt: @Class.F.%pattern_type (%pattern_type.7dc) = binding_pattern n [concrete] -// CHECK:STDOUT: %n.param_patt: @Class.F.%pattern_type (%pattern_type.7dc) = value_param_pattern %n.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @Class.F.%pattern_type (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Class.F.%pattern_type (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %n.patt: @Class.F.%pattern_type (%pattern_type.f8cebc.1) = binding_pattern n [concrete] +// CHECK:STDOUT: %n.param_patt: @Class.F.%pattern_type (%pattern_type.f8cebc.1) = value_param_pattern %n.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @Class.F.%pattern_type (%pattern_type.f8cebc.1) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @Class.F.%pattern_type (%pattern_type.f8cebc.1) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc10: type = bind_symbolic_name T, 0 [symbolic = @Class.%T.loc4_13.1 (constants.%T)] -// CHECK:STDOUT: %T.ref.loc10_31: type = name_ref T, %T.loc10 [symbolic = %T.loc5 (constants.%T)] -// CHECK:STDOUT: %n.param.loc10: @Class.F.%T.loc5 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc10_25: type = name_ref T, %T.loc10 [symbolic = %T.loc5 (constants.%T)] -// CHECK:STDOUT: %n.loc10: @Class.F.%T.loc5 (%T) = bind_name n, %n.param.loc10 -// CHECK:STDOUT: %return.param.loc10: ref @Class.F.%T.loc5 (%T) = out_param call_param1 -// CHECK:STDOUT: %return.loc10: ref @Class.F.%T.loc5 (%T) = return_slot %return.param.loc10 +// CHECK:STDOUT: %.loc11_18: type = splice_block %Copy.ref [concrete = constants.%Copy.type] { +// CHECK:STDOUT: +// CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core [concrete = imports.%Core] +// CHECK:STDOUT: %Copy.ref: type = name_ref Copy, imports.%Core.Copy [concrete = constants.%Copy.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc11: %Copy.type = bind_symbolic_name T, 0 [symbolic = @Class.%T.loc5_13.1 (constants.%T.578)] +// CHECK:STDOUT: %T.ref.loc11_36: %Copy.type = name_ref T, %T.loc11 [symbolic = %T.loc6 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc11_36: type = facet_access_type %T.ref.loc11_36 [symbolic = %T.as_type.loc6_11.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc11_36: type = converted %T.ref.loc11_36, %T.as_type.loc11_36 [symbolic = %T.as_type.loc6_11.1 (constants.%T.as_type)] +// CHECK:STDOUT: %n.param.loc11: @Class.F.%T.as_type.loc6_11.1 (%T.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc11_30.1: type = splice_block %.loc11_30.2 [symbolic = %T.as_type.loc6_11.1 (constants.%T.as_type)] { +// CHECK:STDOUT: %T.ref.loc11_30: %Copy.type = name_ref T, %T.loc11 [symbolic = %T.loc6 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc11_30: type = facet_access_type %T.ref.loc11_30 [symbolic = %T.as_type.loc6_11.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc11_30.2: type = converted %T.ref.loc11_30, %T.as_type.loc11_30 [symbolic = %T.as_type.loc6_11.1 (constants.%T.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %n.loc11: @Class.F.%T.as_type.loc6_11.1 (%T.as_type) = bind_name n, %n.param.loc11 +// CHECK:STDOUT: %return.param.loc11: ref @Class.F.%T.as_type.loc6_11.1 (%T.as_type) = out_param call_param1 +// CHECK:STDOUT: %return.loc11: ref @Class.F.%T.as_type.loc6_11.1 (%T.as_type) = return_slot %return.param.loc11 // CHECK:STDOUT: } // CHECK:STDOUT: %Class.G.decl: %Class.G.type = fn_decl @Class.G [symbolic = constants.%Class.G] { -// CHECK:STDOUT: %self.patt: @Class.G.%pattern_type.loc6_8 (%pattern_type.3c1) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Class.G.%pattern_type.loc6_8 (%pattern_type.3c1) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @Class.G.%pattern_type.loc6_22 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Class.G.%pattern_type.loc6_22 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %self.patt: @Class.G.%pattern_type.loc7_8 (%pattern_type.47a) = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: @Class.G.%pattern_type.loc7_8 (%pattern_type.47a) = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @Class.G.%pattern_type.loc7_22 (%pattern_type.f8cebc.1) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @Class.G.%pattern_type.loc7_22 (%pattern_type.f8cebc.1) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc14: type = bind_symbolic_name T, 0 [symbolic = @Class.%T.loc4_13.1 (constants.%T)] -// CHECK:STDOUT: %T.ref.loc14: type = name_ref T, %T.loc14 [symbolic = %T.loc6 (constants.%T)] -// CHECK:STDOUT: %self.param.loc14: @Class.G.%Class (%Class) = value_param call_param0 -// CHECK:STDOUT: %.loc14_28.1: type = splice_block %Self.ref.loc14 [symbolic = %Class (constants.%Class)] { -// CHECK:STDOUT: %.loc14_28.2: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Self.ref.loc14: type = name_ref Self, %.loc14_28.2 [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %.loc15_18: type = splice_block %Copy.ref [concrete = constants.%Copy.type] { +// CHECK:STDOUT: +// CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core [concrete = imports.%Core] +// CHECK:STDOUT: %Copy.ref: type = name_ref Copy, imports.%Core.Copy [concrete = constants.%Copy.type] // CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc14: @Class.G.%Class (%Class) = bind_name self, %self.param.loc14 -// CHECK:STDOUT: %return.param.loc14: ref @Class.G.%T.loc6 (%T) = out_param call_param1 -// CHECK:STDOUT: %return.loc14: ref @Class.G.%T.loc6 (%T) = return_slot %return.param.loc14 +// CHECK:STDOUT: %T.loc15: %Copy.type = bind_symbolic_name T, 0 [symbolic = @Class.%T.loc5_13.1 (constants.%T.578)] +// CHECK:STDOUT: %T.ref.loc15: %Copy.type = name_ref T, %T.loc15 [symbolic = %T.loc7 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc15: type = facet_access_type %T.ref.loc15 [symbolic = %T.as_type.loc7_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc15_44: type = converted %T.ref.loc15, %T.as_type.loc15 [symbolic = %T.as_type.loc7_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %self.param.loc15: @Class.G.%Class (%Class) = value_param call_param0 +// CHECK:STDOUT: %.loc15_33.1: type = splice_block %Self.ref.loc15 [symbolic = %Class (constants.%Class)] { +// CHECK:STDOUT: %.loc15_33.2: type = specific_constant constants.%Class, @Class(constants.%T.578) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %Self.ref.loc15: type = name_ref Self, %.loc15_33.2 [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %self.loc15: @Class.G.%Class (%Class) = bind_name self, %self.param.loc15 +// CHECK:STDOUT: %return.param.loc15: ref @Class.G.%T.as_type.loc7_25.1 (%T.as_type) = out_param call_param1 +// CHECK:STDOUT: %return.loc15: ref @Class.G.%T.as_type.loc7_25.1 (%T.as_type) = return_slot %return.param.loc15 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic impl @Class.as.Destroy.impl(@Class.%T.loc4_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: generic impl @Class.as.Destroy.impl(@Class.%T.loc5_13.2: %Copy.type) { +// CHECK:STDOUT: %T: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.578)] // CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class)] // CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Class.%Destroy.impl_witness_table, @Class.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness)] // CHECK:STDOUT: @@ -207,16 +232,16 @@ fn Generic(T:! ()).WrongType() {} // CHECK:STDOUT: // CHECK:STDOUT: impl: @Class.%Self.ref as constants.%Destroy.type { // CHECK:STDOUT: %Class.as.Destroy.impl.Op.decl: @Class.as.Destroy.impl.%Class.as.Destroy.impl.Op.type (%Class.as.Destroy.impl.Op.type) = fn_decl @Class.as.Destroy.impl.Op [symbolic = @Class.as.Destroy.impl.%Class.as.Destroy.impl.Op (constants.%Class.as.Destroy.impl.Op)] { -// CHECK:STDOUT: %self.patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.9e0) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.9e0) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc4_23.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: %self.patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.417) = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: @Class.as.Destroy.impl.Op.%pattern_type (%pattern_type.417) = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %.loc5_28.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.955) = value_param call_param0 -// CHECK:STDOUT: %.loc4_23.2: type = splice_block %Self.ref [symbolic = %Class (constants.%Class)] { -// CHECK:STDOUT: %.loc4_23.3: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc4_23.3 [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.0b3) = value_param call_param0 +// CHECK:STDOUT: %.loc5_28.2: type = splice_block %Self.ref [symbolic = %Class (constants.%Class)] { +// CHECK:STDOUT: %.loc5_28.3: type = specific_constant constants.%Class, @Class(constants.%T.578) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc5_28.3 [symbolic = %Class (constants.%Class)] // CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Class.as.Destroy.impl.Op.%ptr (%ptr.955) = bind_name self, %self.param +// CHECK:STDOUT: %self: @Class.as.Destroy.impl.Op.%ptr (%ptr.0b3) = bind_name self, %self.param // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !members: @@ -225,159 +250,193 @@ fn Generic(T:! ()).WrongType() {} // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc4_13.2: type) { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.1 (constants.%T)] +// CHECK:STDOUT: generic class @Class(%T.loc5_13.2: %Copy.type) { +// CHECK:STDOUT: %T.loc5_13.1: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc5_13.1 (constants.%T.578)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Class.F.type: type = fn_type @Class.F, @Class(%T.loc4_13.1) [symbolic = %Class.F.type (constants.%Class.F.type)] +// CHECK:STDOUT: %Class.F.type: type = fn_type @Class.F, @Class(%T.loc5_13.1) [symbolic = %Class.F.type (constants.%Class.F.type)] // CHECK:STDOUT: %Class.F: @Class.%Class.F.type (%Class.F.type) = struct_value () [symbolic = %Class.F (constants.%Class.F)] -// CHECK:STDOUT: %Class.G.type: type = fn_type @Class.G, @Class(%T.loc4_13.1) [symbolic = %Class.G.type (constants.%Class.G.type)] +// CHECK:STDOUT: %Class.G.type: type = fn_type @Class.G, @Class(%T.loc5_13.1) [symbolic = %Class.G.type (constants.%Class.G.type)] // CHECK:STDOUT: %Class.G: @Class.%Class.G.type (%Class.G.type) = struct_value () [symbolic = %Class.G (constants.%Class.G)] -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_13.1 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc4_13.1) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.loc4_13.1 [symbolic = %Class.elem (constants.%Class.elem)] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: @Class.%T.loc4_13.1 (%T)} [symbolic = %struct_type.n (constants.%struct_type.n)] -// CHECK:STDOUT: %complete_type.loc8_1.2: = complete_type_witness %struct_type.n [symbolic = %complete_type.loc8_1.2 (constants.%complete_type)] +// CHECK:STDOUT: %T.as_type.loc8_10.2: type = facet_access_type %T.loc5_13.1 [symbolic = %T.as_type.loc8_10.2 (constants.%T.as_type)] +// CHECK:STDOUT: %require_complete: = require_complete_type %T.as_type.loc8_10.2 [symbolic = %require_complete (constants.%require_complete.ecc)] +// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc5_13.1) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.as_type.loc8_10.2 [symbolic = %Class.elem (constants.%Class.elem)] +// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: @Class.%T.as_type.loc8_10.2 (%T.as_type)} [symbolic = %struct_type.n (constants.%struct_type.n)] +// CHECK:STDOUT: %complete_type.loc9_1.2: = complete_type_witness %struct_type.n [symbolic = %complete_type.loc9_1.2 (constants.%complete_type)] // CHECK:STDOUT: // CHECK:STDOUT: class { // CHECK:STDOUT: %Class.F.decl: @Class.%Class.F.type (%Class.F.type) = fn_decl @Class.F [symbolic = @Class.%Class.F (constants.%Class.F)] { -// CHECK:STDOUT: %n.patt: @Class.F.%pattern_type (%pattern_type.7dc) = binding_pattern n [concrete] -// CHECK:STDOUT: %n.param_patt: @Class.F.%pattern_type (%pattern_type.7dc) = value_param_pattern %n.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @Class.F.%pattern_type (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Class.F.%pattern_type (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %n.patt: @Class.F.%pattern_type (%pattern_type.f8cebc.1) = binding_pattern n [concrete] +// CHECK:STDOUT: %n.param_patt: @Class.F.%pattern_type (%pattern_type.f8cebc.1) = value_param_pattern %n.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @Class.F.%pattern_type (%pattern_type.f8cebc.1) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @Class.F.%pattern_type (%pattern_type.f8cebc.1) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc5_17: type = name_ref T, @Class.%T.loc4_13.2 [symbolic = %T.loc5 (constants.%T)] -// CHECK:STDOUT: %n.param.loc5: @Class.F.%T.loc5 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc5_11: type = name_ref T, @Class.%T.loc4_13.2 [symbolic = %T.loc5 (constants.%T)] -// CHECK:STDOUT: %n.loc5: @Class.F.%T.loc5 (%T) = bind_name n, %n.param.loc5 -// CHECK:STDOUT: %return.param.loc5: ref @Class.F.%T.loc5 (%T) = out_param call_param1 -// CHECK:STDOUT: %return.loc5: ref @Class.F.%T.loc5 (%T) = return_slot %return.param.loc5 +// CHECK:STDOUT: %T.ref.loc6_17: %Copy.type = name_ref T, @Class.%T.loc5_13.2 [symbolic = %T.loc6 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc6_17: type = facet_access_type %T.ref.loc6_17 [symbolic = %T.as_type.loc6_11.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc6_17: type = converted %T.ref.loc6_17, %T.as_type.loc6_17 [symbolic = %T.as_type.loc6_11.1 (constants.%T.as_type)] +// CHECK:STDOUT: %n.param.loc6: @Class.F.%T.as_type.loc6_11.1 (%T.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc6_11.1: type = splice_block %.loc6_11.2 [symbolic = %T.as_type.loc6_11.1 (constants.%T.as_type)] { +// CHECK:STDOUT: %T.ref.loc6_11: %Copy.type = name_ref T, @Class.%T.loc5_13.2 [symbolic = %T.loc6 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc6_11.2: type = facet_access_type %T.ref.loc6_11 [symbolic = %T.as_type.loc6_11.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc6_11.2: type = converted %T.ref.loc6_11, %T.as_type.loc6_11.2 [symbolic = %T.as_type.loc6_11.1 (constants.%T.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %n.loc6: @Class.F.%T.as_type.loc6_11.1 (%T.as_type) = bind_name n, %n.param.loc6 +// CHECK:STDOUT: %return.param.loc6: ref @Class.F.%T.as_type.loc6_11.1 (%T.as_type) = out_param call_param1 +// CHECK:STDOUT: %return.loc6: ref @Class.F.%T.as_type.loc6_11.1 (%T.as_type) = return_slot %return.param.loc6 // CHECK:STDOUT: } // CHECK:STDOUT: %Class.G.decl: @Class.%Class.G.type (%Class.G.type) = fn_decl @Class.G [symbolic = @Class.%Class.G (constants.%Class.G)] { -// CHECK:STDOUT: %self.patt: @Class.G.%pattern_type.loc6_8 (%pattern_type.3c1) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Class.G.%pattern_type.loc6_8 (%pattern_type.3c1) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @Class.G.%pattern_type.loc6_22 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Class.G.%pattern_type.loc6_22 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %self.patt: @Class.G.%pattern_type.loc7_8 (%pattern_type.47a) = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: @Class.G.%pattern_type.loc7_8 (%pattern_type.47a) = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @Class.G.%pattern_type.loc7_22 (%pattern_type.f8cebc.1) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @Class.G.%pattern_type.loc7_22 (%pattern_type.f8cebc.1) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc6: type = name_ref T, @Class.%T.loc4_13.2 [symbolic = %T.loc6 (constants.%T)] -// CHECK:STDOUT: %self.param.loc6: @Class.G.%Class (%Class) = value_param call_param0 -// CHECK:STDOUT: %.loc6_14.1: type = splice_block %Self.ref.loc6 [symbolic = %Class (constants.%Class)] { -// CHECK:STDOUT: %.loc6_14.2: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Self.ref.loc6: type = name_ref Self, %.loc6_14.2 [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %T.ref.loc7: %Copy.type = name_ref T, @Class.%T.loc5_13.2 [symbolic = %T.loc7 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc7_25.2: type = facet_access_type %T.ref.loc7 [symbolic = %T.as_type.loc7_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc7_25: type = converted %T.ref.loc7, %T.as_type.loc7_25.2 [symbolic = %T.as_type.loc7_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %self.param.loc7: @Class.G.%Class (%Class) = value_param call_param0 +// CHECK:STDOUT: %.loc7_14.1: type = splice_block %Self.ref.loc7 [symbolic = %Class (constants.%Class)] { +// CHECK:STDOUT: %.loc7_14.2: type = specific_constant constants.%Class, @Class(constants.%T.578) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %Self.ref.loc7: type = name_ref Self, %.loc7_14.2 [symbolic = %Class (constants.%Class)] // CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc6: @Class.G.%Class (%Class) = bind_name self, %self.param.loc6 -// CHECK:STDOUT: %return.param.loc6: ref @Class.G.%T.loc6 (%T) = out_param call_param1 -// CHECK:STDOUT: %return.loc6: ref @Class.G.%T.loc6 (%T) = return_slot %return.param.loc6 +// CHECK:STDOUT: %self.loc7: @Class.G.%Class (%Class) = bind_name self, %self.param.loc7 +// CHECK:STDOUT: %return.param.loc7: ref @Class.G.%T.as_type.loc7_25.1 (%T.as_type) = out_param call_param1 +// CHECK:STDOUT: %return.loc7: ref @Class.G.%T.as_type.loc7_25.1 (%T.as_type) = return_slot %return.param.loc7 // CHECK:STDOUT: } -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_13.2 [symbolic = %T.loc4_13.1 (constants.%T)] -// CHECK:STDOUT: %.loc7: @Class.%Class.elem (%Class.elem) = field_decl n, element0 [concrete] +// CHECK:STDOUT: %T.ref: %Copy.type = name_ref T, %T.loc5_13.2 [symbolic = %T.loc5_13.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc8_10.1: type = facet_access_type %T.ref [symbolic = %T.as_type.loc8_10.2 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc8_10: type = converted %T.ref, %T.as_type.loc8_10.1 [symbolic = %T.as_type.loc8_10.2 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc8_8: @Class.%Class.elem (%Class.elem) = field_decl n, element0 [concrete] // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Class [symbolic = @Class.as.Destroy.impl.%Class (constants.%Class)] // CHECK:STDOUT: impl_decl @Class.as.Destroy.impl [concrete] {} {} // CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Class.as.Destroy.impl.%Class.as.Destroy.impl.Op.decl), @Class.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Class.as.Destroy.impl(constants.%T) [symbolic = @Class.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness)] -// CHECK:STDOUT: %complete_type.loc8_1.1: = complete_type_witness constants.%struct_type.n [symbolic = %complete_type.loc8_1.2 (constants.%complete_type)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc8_1.1 +// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Class.as.Destroy.impl(constants.%T.578) [symbolic = @Class.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness)] +// CHECK:STDOUT: %complete_type.loc9_1.1: = complete_type_witness constants.%struct_type.n [symbolic = %complete_type.loc9_1.2 (constants.%complete_type)] +// CHECK:STDOUT: complete_type_witness = %complete_type.loc9_1.1 // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .Self = constants.%Class // CHECK:STDOUT: .T = // CHECK:STDOUT: .F = %Class.F.decl // CHECK:STDOUT: .G = %Class.G.decl -// CHECK:STDOUT: .n = %.loc7 +// CHECK:STDOUT: .n = %.loc8_8 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Class.F(@Class.%T.loc4_13.2: type) { -// CHECK:STDOUT: %T.loc5: type = bind_symbolic_name T, 0 [symbolic = %T.loc5 (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc5 [symbolic = %pattern_type (constants.%pattern_type.7dc)] +// CHECK:STDOUT: generic fn @Class.F(@Class.%T.loc5_13.2: %Copy.type) { +// CHECK:STDOUT: %T.loc6: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc6 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc6_11.1: type = facet_access_type %T.loc6 [symbolic = %T.as_type.loc6_11.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %T.as_type.loc6_11.1 [symbolic = %pattern_type (constants.%pattern_type.f8cebc.1)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc5 [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: %require_complete: = require_complete_type %T.as_type.loc6_11.1 [symbolic = %require_complete (constants.%require_complete.ecc)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %T.loc6, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.3ba)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %T.as_type.loc6_11.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.72e)] +// CHECK:STDOUT: %.loc12_10.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc12_10.2 (constants.%.671)] +// CHECK:STDOUT: %impl.elem0.loc12_10.2: @Class.F.%.loc12_10.2 (%.671) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc12_10.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %specific_impl_fn.loc12_10.2: = specific_impl_function %impl.elem0.loc12_10.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc12_10.2 (constants.%specific_impl_fn.fb7)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%n.param.loc10: @Class.F.%T.loc5 (%T)) -> @Class.F.%T.loc5 (%T) { +// CHECK:STDOUT: fn(%n.param.loc11: @Class.F.%T.as_type.loc6_11.1 (%T.as_type)) -> @Class.F.%T.as_type.loc6_11.1 (%T.as_type) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %n.ref: @Class.F.%T.loc5 (%T) = name_ref n, %n.loc10 -// CHECK:STDOUT: return %n.ref +// CHECK:STDOUT: %n.ref: @Class.F.%T.as_type.loc6_11.1 (%T.as_type) = name_ref n, %n.loc11 +// CHECK:STDOUT: %impl.elem0.loc12_10.1: @Class.F.%.loc12_10.2 (%.671) = impl_witness_access constants.%Copy.lookup_impl_witness.3ba, element0 [symbolic = %impl.elem0.loc12_10.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %bound_method.loc12_10.1: = bound_method %n.ref, %impl.elem0.loc12_10.1 +// CHECK:STDOUT: %specific_impl_fn.loc12_10.1: = specific_impl_function %impl.elem0.loc12_10.1, @Copy.Op(constants.%Copy.facet.72e) [symbolic = %specific_impl_fn.loc12_10.2 (constants.%specific_impl_fn.fb7)] +// CHECK:STDOUT: %bound_method.loc12_10.2: = bound_method %n.ref, %specific_impl_fn.loc12_10.1 +// CHECK:STDOUT: %.loc12_10.1: init @Class.F.%T.as_type.loc6_11.1 (%T.as_type) = call %bound_method.loc12_10.2(%n.ref) +// CHECK:STDOUT: return %.loc12_10.1 to %return.loc11 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Class.G(@Class.%T.loc4_13.2: type) { -// CHECK:STDOUT: %T.loc6: type = bind_symbolic_name T, 0 [symbolic = %T.loc6 (constants.%T)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc6) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %pattern_type.loc6_8: type = pattern_type %Class [symbolic = %pattern_type.loc6_8 (constants.%pattern_type.3c1)] -// CHECK:STDOUT: %pattern_type.loc6_22: type = pattern_type %T.loc6 [symbolic = %pattern_type.loc6_22 (constants.%pattern_type.7dc)] +// CHECK:STDOUT: generic fn @Class.G(@Class.%T.loc5_13.2: %Copy.type) { +// CHECK:STDOUT: %T.loc7: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc7 (constants.%T.578)] +// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc7) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %pattern_type.loc7_8: type = pattern_type %Class [symbolic = %pattern_type.loc7_8 (constants.%pattern_type.47a)] +// CHECK:STDOUT: %T.as_type.loc7_25.1: type = facet_access_type %T.loc7 [symbolic = %T.as_type.loc7_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type.loc7_22: type = pattern_type %T.as_type.loc7_25.1 [symbolic = %pattern_type.loc7_22 (constants.%pattern_type.f8cebc.1)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc14: = require_complete_type %Class [symbolic = %require_complete.loc14 (constants.%require_complete.4f8)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.loc6 [symbolic = %Class.elem (constants.%Class.elem)] -// CHECK:STDOUT: %require_complete.loc15: = require_complete_type %T.loc6 [symbolic = %require_complete.loc15 (constants.%require_complete.4ae)] +// CHECK:STDOUT: %require_complete.loc15: = require_complete_type %Class [symbolic = %require_complete.loc15 (constants.%require_complete.ef5)] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.as_type.loc7_25.1 [symbolic = %Class.elem (constants.%Class.elem)] +// CHECK:STDOUT: %require_complete.loc16: = require_complete_type %T.as_type.loc7_25.1 [symbolic = %require_complete.loc16 (constants.%require_complete.ecc)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %T.loc7, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.3ba)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %T.as_type.loc7_25.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.72e)] +// CHECK:STDOUT: %.loc16_14.4: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc16_14.4 (constants.%.671)] +// CHECK:STDOUT: %impl.elem0.loc16_14.2: @Class.G.%.loc16_14.4 (%.671) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc16_14.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %specific_impl_fn.loc16_14.2: = specific_impl_function %impl.elem0.loc16_14.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc16_14.2 (constants.%specific_impl_fn.fb7)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param.loc14: @Class.G.%Class (%Class)) -> @Class.G.%T.loc6 (%T) { +// CHECK:STDOUT: fn(%self.param.loc15: @Class.G.%Class (%Class)) -> @Class.G.%T.as_type.loc7_25.1 (%T.as_type) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: @Class.G.%Class (%Class) = name_ref self, %self.loc14 -// CHECK:STDOUT: %n.ref: @Class.G.%Class.elem (%Class.elem) = name_ref n, @Class.%.loc7 [concrete = @Class.%.loc7] -// CHECK:STDOUT: %.loc15_14.1: ref @Class.G.%T.loc6 (%T) = class_element_access %self.ref, element0 -// CHECK:STDOUT: %.loc15_14.2: @Class.G.%T.loc6 (%T) = bind_value %.loc15_14.1 -// CHECK:STDOUT: return %.loc15_14.2 +// CHECK:STDOUT: %self.ref: @Class.G.%Class (%Class) = name_ref self, %self.loc15 +// CHECK:STDOUT: %n.ref: @Class.G.%Class.elem (%Class.elem) = name_ref n, @Class.%.loc8_8 [concrete = @Class.%.loc8_8] +// CHECK:STDOUT: %.loc16_14.1: ref @Class.G.%T.as_type.loc7_25.1 (%T.as_type) = class_element_access %self.ref, element0 +// CHECK:STDOUT: %.loc16_14.2: @Class.G.%T.as_type.loc7_25.1 (%T.as_type) = bind_value %.loc16_14.1 +// CHECK:STDOUT: %impl.elem0.loc16_14.1: @Class.G.%.loc16_14.4 (%.671) = impl_witness_access constants.%Copy.lookup_impl_witness.3ba, element0 [symbolic = %impl.elem0.loc16_14.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %bound_method.loc16_14.1: = bound_method %.loc16_14.2, %impl.elem0.loc16_14.1 +// CHECK:STDOUT: %specific_impl_fn.loc16_14.1: = specific_impl_function %impl.elem0.loc16_14.1, @Copy.Op(constants.%Copy.facet.72e) [symbolic = %specific_impl_fn.loc16_14.2 (constants.%specific_impl_fn.fb7)] +// CHECK:STDOUT: %bound_method.loc16_14.2: = bound_method %.loc16_14.2, %specific_impl_fn.loc16_14.1 +// CHECK:STDOUT: %.loc16_14.3: init @Class.G.%T.as_type.loc7_25.1 (%T.as_type) = call %bound_method.loc16_14.2(%.loc16_14.2) +// CHECK:STDOUT: return %.loc16_14.3 to %return.loc15 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Class.as.Destroy.impl.Op(@Class.%T.loc4_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: generic fn @Class.as.Destroy.impl.Op(@Class.%T.loc5_13.2: %Copy.type) { +// CHECK:STDOUT: %T: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.578)] // CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %ptr: type = ptr_type %Class [symbolic = %ptr (constants.%ptr.955)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.9e0)] +// CHECK:STDOUT: %ptr: type = ptr_type %Class [symbolic = %ptr (constants.%ptr.0b3)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.417)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.955)) = "no_op"; +// CHECK:STDOUT: fn(%self.param: @Class.as.Destroy.impl.Op.%ptr (%ptr.0b3)) = "no_op"; // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T) { -// CHECK:STDOUT: %T.loc4_13.1 => constants.%T +// CHECK:STDOUT: specific @Class(constants.%T.578) { +// CHECK:STDOUT: %T.loc5_13.1 => constants.%T.578 // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %Class.F.type => constants.%Class.F.type // CHECK:STDOUT: %Class.F => constants.%Class.F // CHECK:STDOUT: %Class.G.type => constants.%Class.G.type // CHECK:STDOUT: %Class.G => constants.%Class.G -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae +// CHECK:STDOUT: %T.as_type.loc8_10.2 => constants.%T.as_type +// CHECK:STDOUT: %require_complete => constants.%require_complete.ecc // CHECK:STDOUT: %Class => constants.%Class // CHECK:STDOUT: %Class.elem => constants.%Class.elem // CHECK:STDOUT: %struct_type.n => constants.%struct_type.n -// CHECK:STDOUT: %complete_type.loc8_1.2 => constants.%complete_type +// CHECK:STDOUT: %complete_type.loc9_1.2 => constants.%complete_type // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.F(constants.%T) { -// CHECK:STDOUT: %T.loc5 => constants.%T -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc +// CHECK:STDOUT: specific @Class.F(constants.%T.578) { +// CHECK:STDOUT: %T.loc6 => constants.%T.578 +// CHECK:STDOUT: %T.as_type.loc6_11.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.f8cebc.1 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.G(constants.%T) { -// CHECK:STDOUT: %T.loc6 => constants.%T +// CHECK:STDOUT: specific @Class.G(constants.%T.578) { +// CHECK:STDOUT: %T.loc7 => constants.%T.578 // CHECK:STDOUT: %Class => constants.%Class -// CHECK:STDOUT: %pattern_type.loc6_8 => constants.%pattern_type.3c1 -// CHECK:STDOUT: %pattern_type.loc6_22 => constants.%pattern_type.7dc +// CHECK:STDOUT: %pattern_type.loc7_8 => constants.%pattern_type.47a +// CHECK:STDOUT: %T.as_type.loc7_25.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type.loc7_22 => constants.%pattern_type.f8cebc.1 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @Class.as.Destroy.impl(constants.%T.578) { +// CHECK:STDOUT: %T => constants.%T.578 // CHECK:STDOUT: %Class => constants.%Class // CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @Class.as.Destroy.impl.Op(constants.%T.578) { +// CHECK:STDOUT: %T => constants.%T.578 // CHECK:STDOUT: %Class => constants.%Class -// CHECK:STDOUT: %ptr => constants.%ptr.955 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.9e0 +// CHECK:STDOUT: %ptr => constants.%ptr.0b3 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.417 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- nested.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %A.type: type = generic_class_type @A [concrete] @@ -410,52 +469,41 @@ fn Generic(T:! ()).WrongType() {} // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Destroy = %Core.Destroy -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core // CHECK:STDOUT: %A.decl: %A.type = class_decl @A [concrete = constants.%A.generic] { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.1 (constants.%T)] +// CHECK:STDOUT: +// CHECK:STDOUT: %T.loc5_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc5_9.1 (constants.%T)] // CHECK:STDOUT: } // CHECK:STDOUT: %B.F.decl: %B.F.type = fn_decl @B.F [symbolic = constants.%B.F] { -// CHECK:STDOUT: %self.patt: @B.F.%pattern_type.loc6_10 (%pattern_type.13e) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @B.F.%pattern_type.loc6_10 (%pattern_type.13e) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %a.patt: @B.F.%pattern_type.loc6_22 (%pattern_type.7dc) = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: @B.F.%pattern_type.loc6_22 (%pattern_type.7dc) = value_param_pattern %a.patt, call_param1 [concrete] +// CHECK:STDOUT: %self.patt: @B.F.%pattern_type.loc7_10 (%pattern_type.13e) = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: @B.F.%pattern_type.loc7_10 (%pattern_type.13e) = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %a.patt: @B.F.%pattern_type.loc7_22 (%pattern_type.7dc) = binding_pattern a [concrete] +// CHECK:STDOUT: %a.param_patt: @B.F.%pattern_type.loc7_22 (%pattern_type.7dc) = value_param_pattern %a.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self.1: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc10: type = bind_symbolic_name T, 0 [symbolic = @A.%T.loc4_9.1 (constants.%T)] -// CHECK:STDOUT: %.loc10_22: type = splice_block %T.ref.loc10_22 [symbolic = @B.%T (constants.%T)] { -// CHECK:STDOUT: %.Self.2: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.ref.loc10_22: type = name_ref T, %T.loc10 [symbolic = @B.%T (constants.%T)] +// CHECK:STDOUT: +// CHECK:STDOUT: %T.loc11: type = bind_symbolic_name T, 0 [symbolic = @A.%T.loc5_9.1 (constants.%T)] +// CHECK:STDOUT: %.loc11_22: type = splice_block %T.ref.loc11_22 [symbolic = @B.%T (constants.%T)] { +// CHECK:STDOUT: +// CHECK:STDOUT: %T.ref.loc11_22: type = name_ref T, %T.loc11 [symbolic = @B.%T (constants.%T)] // CHECK:STDOUT: } -// CHECK:STDOUT: %N.loc10: @B.%T (%T) = bind_symbolic_name N, 1 [symbolic = @B.%N.loc5_11.1 (constants.%N)] -// CHECK:STDOUT: %self.param.loc10: @B.F.%B (%B) = value_param call_param0 -// CHECK:STDOUT: %.loc10_33.1: type = splice_block %Self.ref.loc10 [symbolic = %B (constants.%B)] { -// CHECK:STDOUT: %.loc10_33.2: type = specific_constant constants.%B, @B(constants.%T, constants.%N) [symbolic = %B (constants.%B)] -// CHECK:STDOUT: %Self.ref.loc10: type = name_ref Self, %.loc10_33.2 [symbolic = %B (constants.%B)] +// CHECK:STDOUT: %N.loc11: @B.%T (%T) = bind_symbolic_name N, 1 [symbolic = @B.%N.loc6_11.1 (constants.%N)] +// CHECK:STDOUT: %self.param.loc11: @B.F.%B (%B) = value_param call_param0 +// CHECK:STDOUT: %.loc11_33.1: type = splice_block %Self.ref.loc11 [symbolic = %B (constants.%B)] { +// CHECK:STDOUT: %.loc11_33.2: type = specific_constant constants.%B, @B(constants.%T, constants.%N) [symbolic = %B (constants.%B)] +// CHECK:STDOUT: %Self.ref.loc11: type = name_ref Self, %.loc11_33.2 [symbolic = %B (constants.%B)] // CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc10: @B.F.%B (%B) = bind_name self, %self.param.loc10 -// CHECK:STDOUT: %a.param.loc10: @B.F.%T.loc6 (%T) = value_param call_param1 -// CHECK:STDOUT: %T.ref.loc10_42: type = name_ref T, %T.loc10 [symbolic = %T.loc6 (constants.%T)] -// CHECK:STDOUT: %a.loc10: @B.F.%T.loc6 (%T) = bind_name a, %a.param.loc10 +// CHECK:STDOUT: %self.loc11: @B.F.%B (%B) = bind_name self, %self.param.loc11 +// CHECK:STDOUT: %a.param.loc11: @B.F.%T.loc7 (%T) = value_param call_param1 +// CHECK:STDOUT: %T.ref.loc11_42: type = name_ref T, %T.loc11 [symbolic = %T.loc7 (constants.%T)] +// CHECK:STDOUT: %a.loc11: @B.F.%T.loc7 (%T) = bind_name a, %a.param.loc11 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic impl @B.as.Destroy.impl(@A.%T.loc4_9.2: type, @B.%N.loc5_11.2: @B.%T (%T)) { +// CHECK:STDOUT: generic impl @B.as.Destroy.impl(@A.%T.loc5_9.2: type, @B.%N.loc6_11.2: @B.%T (%T)) { // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] // CHECK:STDOUT: %N: @B.as.Destroy.impl.%T (%T) = bind_symbolic_name N, 1 [symbolic = %N (constants.%N)] // CHECK:STDOUT: %B: type = class_type @B, @B(%T, %N) [symbolic = %B (constants.%B)] @@ -469,12 +517,12 @@ fn Generic(T:! ()).WrongType() {} // CHECK:STDOUT: %B.as.Destroy.impl.Op.decl: @B.as.Destroy.impl.%B.as.Destroy.impl.Op.type (%B.as.Destroy.impl.Op.type) = fn_decl @B.as.Destroy.impl.Op [symbolic = @B.as.Destroy.impl.%B.as.Destroy.impl.Op (constants.%B.as.Destroy.impl.Op)] { // CHECK:STDOUT: %self.patt: @B.as.Destroy.impl.Op.%pattern_type (%pattern_type.fe8) = binding_pattern self [concrete] // CHECK:STDOUT: %self.param_patt: @B.as.Destroy.impl.Op.%pattern_type (%pattern_type.fe8) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc5_18.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: %.loc6_18.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %self.param: @B.as.Destroy.impl.Op.%ptr (%ptr.762) = value_param call_param0 -// CHECK:STDOUT: %.loc5_18.2: type = splice_block %Self.ref [symbolic = %B (constants.%B)] { -// CHECK:STDOUT: %.loc5_18.3: type = specific_constant constants.%B, @B(constants.%T, constants.%N) [symbolic = %B (constants.%B)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc5_18.3 [symbolic = %B (constants.%B)] +// CHECK:STDOUT: %.loc6_18.2: type = splice_block %Self.ref [symbolic = %B (constants.%B)] { +// CHECK:STDOUT: %.loc6_18.3: type = specific_constant constants.%B, @B(constants.%T, constants.%N) [symbolic = %B (constants.%B)] +// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc6_18.3 [symbolic = %B (constants.%B)] // CHECK:STDOUT: } // CHECK:STDOUT: %self: @B.as.Destroy.impl.Op.%ptr (%ptr.762) = bind_name self, %self.param // CHECK:STDOUT: } @@ -485,7 +533,7 @@ fn Generic(T:! ()).WrongType() {} // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic impl @A.as.Destroy.impl(@A.%T.loc4_9.2: type) { +// CHECK:STDOUT: generic impl @A.as.Destroy.impl(@A.%T.loc5_9.2: type) { // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] // CHECK:STDOUT: %A: type = class_type @A, @A(%T) [symbolic = %A (constants.%A)] // CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @A.%Destroy.impl_witness_table, @A.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.7e1)] @@ -498,12 +546,12 @@ fn Generic(T:! ()).WrongType() {} // CHECK:STDOUT: %A.as.Destroy.impl.Op.decl: @A.as.Destroy.impl.%A.as.Destroy.impl.Op.type (%A.as.Destroy.impl.Op.type) = fn_decl @A.as.Destroy.impl.Op [symbolic = @A.as.Destroy.impl.%A.as.Destroy.impl.Op (constants.%A.as.Destroy.impl.Op)] { // CHECK:STDOUT: %self.patt: @A.as.Destroy.impl.Op.%pattern_type (%pattern_type.09b) = binding_pattern self [concrete] // CHECK:STDOUT: %self.param_patt: @A.as.Destroy.impl.Op.%pattern_type (%pattern_type.09b) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc4_19.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: %.loc5_19.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %self.param: @A.as.Destroy.impl.Op.%ptr (%ptr.ca9) = value_param call_param0 -// CHECK:STDOUT: %.loc4_19.2: type = splice_block %Self.ref [symbolic = %A (constants.%A)] { -// CHECK:STDOUT: %.loc4_19.3: type = specific_constant constants.%A, @A(constants.%T) [symbolic = %A (constants.%A)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc4_19.3 [symbolic = %A (constants.%A)] +// CHECK:STDOUT: %.loc5_19.2: type = splice_block %Self.ref [symbolic = %A (constants.%A)] { +// CHECK:STDOUT: %.loc5_19.3: type = specific_constant constants.%A, @A(constants.%T) [symbolic = %A (constants.%A)] +// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc5_19.3 [symbolic = %A (constants.%A)] // CHECK:STDOUT: } // CHECK:STDOUT: %self: @A.as.Destroy.impl.Op.%ptr (%ptr.ca9) = bind_name self, %self.param // CHECK:STDOUT: } @@ -514,22 +562,22 @@ fn Generic(T:! ()).WrongType() {} // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @A(%T.loc4_9.2: type) { -// CHECK:STDOUT: %T.loc4_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.1 (constants.%T)] +// CHECK:STDOUT: generic class @A(%T.loc5_9.2: type) { +// CHECK:STDOUT: %T.loc5_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc5_9.1 (constants.%T)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %B.type: type = generic_class_type @B, @A(%T.loc4_9.1) [symbolic = %B.type (constants.%B.type)] +// CHECK:STDOUT: %B.type: type = generic_class_type @B, @A(%T.loc5_9.1) [symbolic = %B.type (constants.%B.type)] // CHECK:STDOUT: %B.generic: @A.%B.type (%B.type) = struct_value () [symbolic = %B.generic (constants.%B.generic)] // CHECK:STDOUT: // CHECK:STDOUT: class { // CHECK:STDOUT: %B.decl: @A.%B.type (%B.type) = class_decl @B [symbolic = @A.%B.generic (constants.%B.generic)] { // CHECK:STDOUT: %N.patt: @B.%pattern_type (%pattern_type.7dc) = symbolic_binding_pattern N, 1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc5: type = splice_block %T.ref [symbolic = %T (constants.%T)] { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.ref: type = name_ref T, @A.%T.loc4_9.2 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %.loc6: type = splice_block %T.ref [symbolic = %T (constants.%T)] { +// CHECK:STDOUT: +// CHECK:STDOUT: %T.ref: type = name_ref T, @A.%T.loc5_9.2 [symbolic = %T (constants.%T)] // CHECK:STDOUT: } -// CHECK:STDOUT: %N.loc5_11.2: @B.%T (%T) = bind_symbolic_name N, 1 [symbolic = %N.loc5_11.1 (constants.%N)] +// CHECK:STDOUT: %N.loc6_11.2: @B.%T (%T) = bind_symbolic_name N, 1 [symbolic = %N.loc6_11.1 (constants.%N)] // CHECK:STDOUT: } // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%A [symbolic = @A.as.Destroy.impl.%A (constants.%A)] // CHECK:STDOUT: impl_decl @A.as.Destroy.impl [concrete] {} {} @@ -545,32 +593,32 @@ fn Generic(T:! ()).WrongType() {} // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @B(@A.%T.loc4_9.2: type, %N.loc5_11.2: @B.%T (%T)) { +// CHECK:STDOUT: generic class @B(@A.%T.loc5_9.2: type, %N.loc6_11.2: @B.%T (%T)) { // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %N.loc5_11.1: @B.%T (%T) = bind_symbolic_name N, 1 [symbolic = %N.loc5_11.1 (constants.%N)] +// CHECK:STDOUT: %N.loc6_11.1: @B.%T (%T) = bind_symbolic_name N, 1 [symbolic = %N.loc6_11.1 (constants.%N)] // CHECK:STDOUT: %pattern_type: type = pattern_type %T [symbolic = %pattern_type (constants.%pattern_type.7dc)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %B.F.type: type = fn_type @B.F, @B(%T, %N.loc5_11.1) [symbolic = %B.F.type (constants.%B.F.type)] +// CHECK:STDOUT: %B.F.type: type = fn_type @B.F, @B(%T, %N.loc6_11.1) [symbolic = %B.F.type (constants.%B.F.type)] // CHECK:STDOUT: %B.F: @B.%B.F.type (%B.F.type) = struct_value () [symbolic = %B.F (constants.%B.F)] // CHECK:STDOUT: %require_complete: = require_complete_type %T [symbolic = %require_complete (constants.%require_complete.4ae)] // CHECK:STDOUT: // CHECK:STDOUT: class { // CHECK:STDOUT: %B.F.decl: @B.%B.F.type (%B.F.type) = fn_decl @B.F [symbolic = @B.%B.F (constants.%B.F)] { -// CHECK:STDOUT: %self.patt: @B.F.%pattern_type.loc6_10 (%pattern_type.13e) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @B.F.%pattern_type.loc6_10 (%pattern_type.13e) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %a.patt: @B.F.%pattern_type.loc6_22 (%pattern_type.7dc) = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: @B.F.%pattern_type.loc6_22 (%pattern_type.7dc) = value_param_pattern %a.patt, call_param1 [concrete] +// CHECK:STDOUT: %self.patt: @B.F.%pattern_type.loc7_10 (%pattern_type.13e) = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: @B.F.%pattern_type.loc7_10 (%pattern_type.13e) = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %a.patt: @B.F.%pattern_type.loc7_22 (%pattern_type.7dc) = binding_pattern a [concrete] +// CHECK:STDOUT: %a.param_patt: @B.F.%pattern_type.loc7_22 (%pattern_type.7dc) = value_param_pattern %a.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param.loc6: @B.F.%B (%B) = value_param call_param0 -// CHECK:STDOUT: %.loc6_16.1: type = splice_block %Self.ref.loc6 [symbolic = %B (constants.%B)] { -// CHECK:STDOUT: %.loc6_16.2: type = specific_constant constants.%B, @B(constants.%T, constants.%N) [symbolic = %B (constants.%B)] -// CHECK:STDOUT: %Self.ref.loc6: type = name_ref Self, %.loc6_16.2 [symbolic = %B (constants.%B)] +// CHECK:STDOUT: %self.param.loc7: @B.F.%B (%B) = value_param call_param0 +// CHECK:STDOUT: %.loc7_16.1: type = splice_block %Self.ref.loc7 [symbolic = %B (constants.%B)] { +// CHECK:STDOUT: %.loc7_16.2: type = specific_constant constants.%B, @B(constants.%T, constants.%N) [symbolic = %B (constants.%B)] +// CHECK:STDOUT: %Self.ref.loc7: type = name_ref Self, %.loc7_16.2 [symbolic = %B (constants.%B)] // CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc6: @B.F.%B (%B) = bind_name self, %self.param.loc6 -// CHECK:STDOUT: %a.param.loc6: @B.F.%T.loc6 (%T) = value_param call_param1 -// CHECK:STDOUT: %T.ref.loc6: type = name_ref T, @A.%T.loc4_9.2 [symbolic = %T.loc6 (constants.%T)] -// CHECK:STDOUT: %a.loc6: @B.F.%T.loc6 (%T) = bind_name a, %a.param.loc6 +// CHECK:STDOUT: %self.loc7: @B.F.%B (%B) = bind_name self, %self.param.loc7 +// CHECK:STDOUT: %a.param.loc7: @B.F.%T.loc7 (%T) = value_param call_param1 +// CHECK:STDOUT: %T.ref.loc7: type = name_ref T, @A.%T.loc5_9.2 [symbolic = %T.loc7 (constants.%T)] +// CHECK:STDOUT: %a.loc7: @B.F.%T.loc7 (%T) = bind_name a, %a.param.loc7 // CHECK:STDOUT: } // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%B [symbolic = @B.as.Destroy.impl.%B (constants.%B)] // CHECK:STDOUT: impl_decl @B.as.Destroy.impl [concrete] {} {} @@ -586,24 +634,24 @@ fn Generic(T:! ()).WrongType() {} // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @B.F(@A.%T.loc4_9.2: type, @B.%N.loc5_11.2: @B.%T (%T)) { -// CHECK:STDOUT: %T.loc6: type = bind_symbolic_name T, 0 [symbolic = %T.loc6 (constants.%T)] -// CHECK:STDOUT: %N.loc6: @B.F.%T.loc6 (%T) = bind_symbolic_name N, 1 [symbolic = %N.loc6 (constants.%N)] -// CHECK:STDOUT: %B: type = class_type @B, @B(%T.loc6, %N.loc6) [symbolic = %B (constants.%B)] -// CHECK:STDOUT: %pattern_type.loc6_10: type = pattern_type %B [symbolic = %pattern_type.loc6_10 (constants.%pattern_type.13e)] -// CHECK:STDOUT: %pattern_type.loc6_22: type = pattern_type %T.loc6 [symbolic = %pattern_type.loc6_22 (constants.%pattern_type.7dc)] +// CHECK:STDOUT: generic fn @B.F(@A.%T.loc5_9.2: type, @B.%N.loc6_11.2: @B.%T (%T)) { +// CHECK:STDOUT: %T.loc7: type = bind_symbolic_name T, 0 [symbolic = %T.loc7 (constants.%T)] +// CHECK:STDOUT: %N.loc7: @B.F.%T.loc7 (%T) = bind_symbolic_name N, 1 [symbolic = %N.loc7 (constants.%N)] +// CHECK:STDOUT: %B: type = class_type @B, @B(%T.loc7, %N.loc7) [symbolic = %B (constants.%B)] +// CHECK:STDOUT: %pattern_type.loc7_10: type = pattern_type %B [symbolic = %pattern_type.loc7_10 (constants.%pattern_type.13e)] +// CHECK:STDOUT: %pattern_type.loc7_22: type = pattern_type %T.loc7 [symbolic = %pattern_type.loc7_22 (constants.%pattern_type.7dc)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc10_31: = require_complete_type %B [symbolic = %require_complete.loc10_31 (constants.%require_complete.fca)] -// CHECK:STDOUT: %require_complete.loc10_40: = require_complete_type %T.loc6 [symbolic = %require_complete.loc10_40 (constants.%require_complete.4ae)] +// CHECK:STDOUT: %require_complete.loc11_31: = require_complete_type %B [symbolic = %require_complete.loc11_31 (constants.%require_complete.fca)] +// CHECK:STDOUT: %require_complete.loc11_40: = require_complete_type %T.loc7 [symbolic = %require_complete.loc11_40 (constants.%require_complete.4ae)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param.loc10: @B.F.%B (%B), %a.param.loc10: @B.F.%T.loc6 (%T)) { +// CHECK:STDOUT: fn(%self.param.loc11: @B.F.%B (%B), %a.param.loc11: @B.F.%T.loc7 (%T)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @B.as.Destroy.impl.Op(@A.%T.loc4_9.2: type, @B.%N.loc5_11.2: @B.%T (%T)) { +// CHECK:STDOUT: generic fn @B.as.Destroy.impl.Op(@A.%T.loc5_9.2: type, @B.%N.loc6_11.2: @B.%T (%T)) { // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] // CHECK:STDOUT: %N: @B.as.Destroy.impl.Op.%T (%T) = bind_symbolic_name N, 1 [symbolic = %N (constants.%N)] // CHECK:STDOUT: %B: type = class_type @B, @B(%T, %N) [symbolic = %B (constants.%B)] @@ -615,7 +663,7 @@ fn Generic(T:! ()).WrongType() {} // CHECK:STDOUT: fn(%self.param: @B.as.Destroy.impl.Op.%ptr (%ptr.762)) = "no_op"; // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @A.as.Destroy.impl.Op(@A.%T.loc4_9.2: type) { +// CHECK:STDOUT: generic fn @A.as.Destroy.impl.Op(@A.%T.loc5_9.2: type) { // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] // CHECK:STDOUT: %A: type = class_type @A, @A(%T) [symbolic = %A (constants.%A)] // CHECK:STDOUT: %ptr: type = ptr_type %A [symbolic = %ptr (constants.%ptr.ca9)] @@ -627,7 +675,7 @@ fn Generic(T:! ()).WrongType() {} // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @A(constants.%T) { -// CHECK:STDOUT: %T.loc4_9.1 => constants.%T +// CHECK:STDOUT: %T.loc5_9.1 => constants.%T // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %B.type => constants.%B.type @@ -636,7 +684,7 @@ fn Generic(T:! ()).WrongType() {} // CHECK:STDOUT: // CHECK:STDOUT: specific @B(constants.%T, constants.%N) { // CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %N.loc5_11.1 => constants.%N +// CHECK:STDOUT: %N.loc6_11.1 => constants.%N // CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc // CHECK:STDOUT: // CHECK:STDOUT: !definition: @@ -646,11 +694,11 @@ fn Generic(T:! ()).WrongType() {} // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @B.F(constants.%T, constants.%N) { -// CHECK:STDOUT: %T.loc6 => constants.%T -// CHECK:STDOUT: %N.loc6 => constants.%N +// CHECK:STDOUT: %T.loc7 => constants.%T +// CHECK:STDOUT: %N.loc7 => constants.%N // CHECK:STDOUT: %B => constants.%B -// CHECK:STDOUT: %pattern_type.loc6_10 => constants.%pattern_type.13e -// CHECK:STDOUT: %pattern_type.loc6_22 => constants.%pattern_type.7dc +// CHECK:STDOUT: %pattern_type.loc7_10 => constants.%pattern_type.13e +// CHECK:STDOUT: %pattern_type.loc7_22 => constants.%pattern_type.7dc // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @B.as.Destroy.impl(constants.%T, constants.%N) { @@ -681,550 +729,3 @@ fn Generic(T:! ()).WrongType() {} // CHECK:STDOUT: %pattern_type => constants.%pattern_type.09b // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: --- fail_mismatched_not_generic_vs_generic.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %NotGeneric: type = class_type @NotGeneric [concrete] -// CHECK:STDOUT: %NotGeneric.F.type: type = fn_type @NotGeneric.F [concrete] -// CHECK:STDOUT: %NotGeneric.F: %NotGeneric.F.type = struct_value () [concrete] -// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @NotGeneric.%Destroy.impl_witness_table [concrete] -// CHECK:STDOUT: %ptr.982: type = ptr_type %NotGeneric [concrete] -// CHECK:STDOUT: %pattern_type.486: type = pattern_type %ptr.982 [concrete] -// CHECK:STDOUT: %NotGeneric.as.Destroy.impl.Op.type: type = fn_type @NotGeneric.as.Destroy.impl.Op [concrete] -// CHECK:STDOUT: %NotGeneric.as.Destroy.impl.Op: %NotGeneric.as.Destroy.impl.Op.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Destroy = %Core.Destroy -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .NotGeneric = %NotGeneric.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %NotGeneric.decl: type = class_decl @NotGeneric [concrete = constants.%NotGeneric] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc15_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc15_15.1 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: impl @NotGeneric.as.Destroy.impl: @NotGeneric.%Self.ref as constants.%Destroy.type { -// CHECK:STDOUT: %NotGeneric.as.Destroy.impl.Op.decl: %NotGeneric.as.Destroy.impl.Op.type = fn_decl @NotGeneric.as.Destroy.impl.Op [concrete = constants.%NotGeneric.as.Destroy.impl.Op] { -// CHECK:STDOUT: %self.patt: %pattern_type.486 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.486 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc4: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %ptr.982 = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%NotGeneric [concrete = constants.%NotGeneric] -// CHECK:STDOUT: %self: %ptr.982 = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Op = %NotGeneric.as.Destroy.impl.Op.decl -// CHECK:STDOUT: witness = @NotGeneric.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @NotGeneric { -// CHECK:STDOUT: %NotGeneric.F.decl: %NotGeneric.F.type = fn_decl @NotGeneric.F [concrete = constants.%NotGeneric.F] {} {} -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%NotGeneric [concrete = constants.%NotGeneric] -// CHECK:STDOUT: impl_decl @NotGeneric.as.Destroy.impl [concrete] {} {} -// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@NotGeneric.as.Destroy.impl.%NotGeneric.as.Destroy.impl.Op.decl), @NotGeneric.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table [concrete = constants.%Destroy.impl_witness] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%NotGeneric -// CHECK:STDOUT: .F = %NotGeneric.F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @NotGeneric.F(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @NotGeneric.as.Destroy.impl.Op(%self.param: %ptr.982) = "no_op"; -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F(%T.loc15_15.2: type) { -// CHECK:STDOUT: %T.loc15_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc15_15.1 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T.loc15_15.1 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_mismatched_too_few_args.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Generic.type: type = generic_class_type @Generic [concrete] -// CHECK:STDOUT: %Generic.generic: %Generic.type = struct_value () [concrete] -// CHECK:STDOUT: %Generic: type = class_type @Generic, @Generic(%T) [symbolic] -// CHECK:STDOUT: %Generic.TooFew.type: type = fn_type @Generic.TooFew, @Generic(%T) [symbolic] -// CHECK:STDOUT: %Generic.TooFew: %Generic.TooFew.type = struct_value () [symbolic] -// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Generic.%Destroy.impl_witness_table, @Generic.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %ptr.881: type = ptr_type %Generic [symbolic] -// CHECK:STDOUT: %pattern_type.b64: type = pattern_type %ptr.881 [symbolic] -// CHECK:STDOUT: %Generic.as.Destroy.impl.Op.type: type = fn_type @Generic.as.Destroy.impl.Op, @Generic.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %Generic.as.Destroy.impl.Op: %Generic.as.Destroy.impl.Op.type = struct_value () [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %TooFew.type: type = fn_type @TooFew [concrete] -// CHECK:STDOUT: %TooFew: %TooFew.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Destroy = %Core.Destroy -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Generic = %Generic.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Generic.decl: %Generic.type = class_decl @Generic [concrete = constants.%Generic.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %TooFew.decl: %TooFew.type = fn_decl @TooFew [concrete = constants.%TooFew] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic impl @Generic.as.Destroy.impl(@Generic.%T.loc4_15.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Generic: type = class_type @Generic, @Generic(%T) [symbolic = %Generic (constants.%Generic)] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Generic.%Destroy.impl_witness_table, @Generic.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Generic.as.Destroy.impl.Op.type: type = fn_type @Generic.as.Destroy.impl.Op, @Generic.as.Destroy.impl(%T) [symbolic = %Generic.as.Destroy.impl.Op.type (constants.%Generic.as.Destroy.impl.Op.type)] -// CHECK:STDOUT: %Generic.as.Destroy.impl.Op: @Generic.as.Destroy.impl.%Generic.as.Destroy.impl.Op.type (%Generic.as.Destroy.impl.Op.type) = struct_value () [symbolic = %Generic.as.Destroy.impl.Op (constants.%Generic.as.Destroy.impl.Op)] -// CHECK:STDOUT: -// CHECK:STDOUT: impl: @Generic.%Self.ref as constants.%Destroy.type { -// CHECK:STDOUT: %Generic.as.Destroy.impl.Op.decl: @Generic.as.Destroy.impl.%Generic.as.Destroy.impl.Op.type (%Generic.as.Destroy.impl.Op.type) = fn_decl @Generic.as.Destroy.impl.Op [symbolic = @Generic.as.Destroy.impl.%Generic.as.Destroy.impl.Op (constants.%Generic.as.Destroy.impl.Op)] { -// CHECK:STDOUT: %self.patt: @Generic.as.Destroy.impl.Op.%pattern_type (%pattern_type.b64) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Generic.as.Destroy.impl.Op.%pattern_type (%pattern_type.b64) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc4_25.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @Generic.as.Destroy.impl.Op.%ptr (%ptr.881) = value_param call_param0 -// CHECK:STDOUT: %.loc4_25.2: type = splice_block %Self.ref [symbolic = %Generic (constants.%Generic)] { -// CHECK:STDOUT: %.loc4_25.3: type = specific_constant constants.%Generic, @Generic(constants.%T) [symbolic = %Generic (constants.%Generic)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc4_25.3 [symbolic = %Generic (constants.%Generic)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Generic.as.Destroy.impl.Op.%ptr (%ptr.881) = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Op = %Generic.as.Destroy.impl.Op.decl -// CHECK:STDOUT: witness = @Generic.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Generic(%T.loc4_15.2: type) { -// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Generic.TooFew.type: type = fn_type @Generic.TooFew, @Generic(%T.loc4_15.1) [symbolic = %Generic.TooFew.type (constants.%Generic.TooFew.type)] -// CHECK:STDOUT: %Generic.TooFew: @Generic.%Generic.TooFew.type (%Generic.TooFew.type) = struct_value () [symbolic = %Generic.TooFew (constants.%Generic.TooFew)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %Generic.TooFew.decl: @Generic.%Generic.TooFew.type (%Generic.TooFew.type) = fn_decl @Generic.TooFew [symbolic = @Generic.%Generic.TooFew (constants.%Generic.TooFew)] {} {} -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Generic [symbolic = @Generic.as.Destroy.impl.%Generic (constants.%Generic)] -// CHECK:STDOUT: impl_decl @Generic.as.Destroy.impl [concrete] {} {} -// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Generic.as.Destroy.impl.%Generic.as.Destroy.impl.Op.decl), @Generic.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Generic.as.Destroy.impl(constants.%T) [symbolic = @Generic.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness)] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Generic -// CHECK:STDOUT: .TooFew = %Generic.TooFew.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Generic.TooFew(@Generic.%T.loc4_15.2: type) { -// CHECK:STDOUT: fn(); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Generic.as.Destroy.impl.Op(@Generic.%T.loc4_15.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Generic: type = class_type @Generic, @Generic(%T) [symbolic = %Generic (constants.%Generic)] -// CHECK:STDOUT: %ptr: type = ptr_type %Generic [symbolic = %ptr (constants.%ptr.881)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.b64)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Generic.as.Destroy.impl.Op.%ptr (%ptr.881)) = "no_op"; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @TooFew() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Generic(constants.%T) { -// CHECK:STDOUT: %T.loc4_15.1 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Generic.TooFew(constants.%T) {} -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Generic.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Generic => constants.%Generic -// CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Generic.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Generic => constants.%Generic -// CHECK:STDOUT: %ptr => constants.%ptr.881 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.b64 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_mismatched_too_many_args.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Generic.type: type = generic_class_type @Generic [concrete] -// CHECK:STDOUT: %Generic.generic: %Generic.type = struct_value () [concrete] -// CHECK:STDOUT: %Generic: type = class_type @Generic, @Generic(%T) [symbolic] -// CHECK:STDOUT: %Generic.TooMany.type: type = fn_type @Generic.TooMany, @Generic(%T) [symbolic] -// CHECK:STDOUT: %Generic.TooMany: %Generic.TooMany.type = struct_value () [symbolic] -// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Generic.%Destroy.impl_witness_table, @Generic.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %ptr.881: type = ptr_type %Generic [symbolic] -// CHECK:STDOUT: %pattern_type.b64: type = pattern_type %ptr.881 [symbolic] -// CHECK:STDOUT: %Generic.as.Destroy.impl.Op.type: type = fn_type @Generic.as.Destroy.impl.Op, @Generic.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %Generic.as.Destroy.impl.Op: %Generic.as.Destroy.impl.Op.type = struct_value () [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 1 [symbolic] -// CHECK:STDOUT: %TooMany.type: type = fn_type @TooMany [concrete] -// CHECK:STDOUT: %TooMany: %TooMany.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Destroy = %Core.Destroy -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Generic = %Generic.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Generic.decl: %Generic.type = class_decl @Generic [concrete = constants.%Generic.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %TooMany.decl: %TooMany.type = fn_decl @TooMany [concrete = constants.%TooMany] {} { -// CHECK:STDOUT: %.Self.1: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc15_12.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc15_12.1 (constants.%T)] -// CHECK:STDOUT: %.Self.2: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %U.loc15_22.2: type = bind_symbolic_name U, 1 [symbolic = %U.loc15_22.1 (constants.%U)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic impl @Generic.as.Destroy.impl(@Generic.%T.loc4_15.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Generic: type = class_type @Generic, @Generic(%T) [symbolic = %Generic (constants.%Generic)] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Generic.%Destroy.impl_witness_table, @Generic.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Generic.as.Destroy.impl.Op.type: type = fn_type @Generic.as.Destroy.impl.Op, @Generic.as.Destroy.impl(%T) [symbolic = %Generic.as.Destroy.impl.Op.type (constants.%Generic.as.Destroy.impl.Op.type)] -// CHECK:STDOUT: %Generic.as.Destroy.impl.Op: @Generic.as.Destroy.impl.%Generic.as.Destroy.impl.Op.type (%Generic.as.Destroy.impl.Op.type) = struct_value () [symbolic = %Generic.as.Destroy.impl.Op (constants.%Generic.as.Destroy.impl.Op)] -// CHECK:STDOUT: -// CHECK:STDOUT: impl: @Generic.%Self.ref as constants.%Destroy.type { -// CHECK:STDOUT: %Generic.as.Destroy.impl.Op.decl: @Generic.as.Destroy.impl.%Generic.as.Destroy.impl.Op.type (%Generic.as.Destroy.impl.Op.type) = fn_decl @Generic.as.Destroy.impl.Op [symbolic = @Generic.as.Destroy.impl.%Generic.as.Destroy.impl.Op (constants.%Generic.as.Destroy.impl.Op)] { -// CHECK:STDOUT: %self.patt: @Generic.as.Destroy.impl.Op.%pattern_type (%pattern_type.b64) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Generic.as.Destroy.impl.Op.%pattern_type (%pattern_type.b64) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc4_25.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @Generic.as.Destroy.impl.Op.%ptr (%ptr.881) = value_param call_param0 -// CHECK:STDOUT: %.loc4_25.2: type = splice_block %Self.ref [symbolic = %Generic (constants.%Generic)] { -// CHECK:STDOUT: %.loc4_25.3: type = specific_constant constants.%Generic, @Generic(constants.%T) [symbolic = %Generic (constants.%Generic)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc4_25.3 [symbolic = %Generic (constants.%Generic)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Generic.as.Destroy.impl.Op.%ptr (%ptr.881) = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Op = %Generic.as.Destroy.impl.Op.decl -// CHECK:STDOUT: witness = @Generic.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Generic(%T.loc4_15.2: type) { -// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Generic.TooMany.type: type = fn_type @Generic.TooMany, @Generic(%T.loc4_15.1) [symbolic = %Generic.TooMany.type (constants.%Generic.TooMany.type)] -// CHECK:STDOUT: %Generic.TooMany: @Generic.%Generic.TooMany.type (%Generic.TooMany.type) = struct_value () [symbolic = %Generic.TooMany (constants.%Generic.TooMany)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %Generic.TooMany.decl: @Generic.%Generic.TooMany.type (%Generic.TooMany.type) = fn_decl @Generic.TooMany [symbolic = @Generic.%Generic.TooMany (constants.%Generic.TooMany)] {} {} -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Generic [symbolic = @Generic.as.Destroy.impl.%Generic (constants.%Generic)] -// CHECK:STDOUT: impl_decl @Generic.as.Destroy.impl [concrete] {} {} -// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Generic.as.Destroy.impl.%Generic.as.Destroy.impl.Op.decl), @Generic.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Generic.as.Destroy.impl(constants.%T) [symbolic = @Generic.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness)] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Generic -// CHECK:STDOUT: .TooMany = %Generic.TooMany.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Generic.TooMany(@Generic.%T.loc4_15.2: type) { -// CHECK:STDOUT: fn(); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Generic.as.Destroy.impl.Op(@Generic.%T.loc4_15.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Generic: type = class_type @Generic, @Generic(%T) [symbolic = %Generic (constants.%Generic)] -// CHECK:STDOUT: %ptr: type = ptr_type %Generic [symbolic = %ptr (constants.%ptr.881)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.b64)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Generic.as.Destroy.impl.Op.%ptr (%ptr.881)) = "no_op"; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @TooMany(%T.loc15_12.2: type, %U.loc15_22.2: type) { -// CHECK:STDOUT: %T.loc15_12.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc15_12.1 (constants.%T)] -// CHECK:STDOUT: %U.loc15_22.1: type = bind_symbolic_name U, 1 [symbolic = %U.loc15_22.1 (constants.%U)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Generic(constants.%T) { -// CHECK:STDOUT: %T.loc4_15.1 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Generic.TooMany(constants.%T) {} -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Generic.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Generic => constants.%Generic -// CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Generic.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Generic => constants.%Generic -// CHECK:STDOUT: %ptr => constants.%ptr.881 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.b64 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @TooMany(constants.%T, constants.%U) { -// CHECK:STDOUT: %T.loc15_12.1 => constants.%T -// CHECK:STDOUT: %U.loc15_22.1 => constants.%U -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_mismatched_wrong_arg_type.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Generic.type: type = generic_class_type @Generic [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %Generic.generic: %Generic.type = struct_value () [concrete] -// CHECK:STDOUT: %Generic: type = class_type @Generic, @Generic(%T.8b3) [symbolic] -// CHECK:STDOUT: %Generic.WrongType.type: type = fn_type @Generic.WrongType, @Generic(%T.8b3) [symbolic] -// CHECK:STDOUT: %Generic.WrongType: %Generic.WrongType.type = struct_value () [symbolic] -// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Generic.%Destroy.impl_witness_table, @Generic.as.Destroy.impl(%T.8b3) [symbolic] -// CHECK:STDOUT: %ptr.881: type = ptr_type %Generic [symbolic] -// CHECK:STDOUT: %pattern_type.b64: type = pattern_type %ptr.881 [symbolic] -// CHECK:STDOUT: %Generic.as.Destroy.impl.Op.type: type = fn_type @Generic.as.Destroy.impl.Op, @Generic.as.Destroy.impl(%T.8b3) [symbolic] -// CHECK:STDOUT: %Generic.as.Destroy.impl.Op: %Generic.as.Destroy.impl.Op.type = struct_value () [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %T.7a6: %empty_tuple.type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %WrongType.type: type = fn_type @WrongType [concrete] -// CHECK:STDOUT: %WrongType: %WrongType.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Destroy = %Core.Destroy -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Generic = %Generic.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Generic.decl: %Generic.type = class_decl @Generic [concrete = constants.%Generic.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.1 (constants.%T.8b3)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %WrongType.decl: %WrongType.type = fn_decl @WrongType [concrete = constants.%WrongType] {} { -// CHECK:STDOUT: %.loc15_17.1: type = splice_block %.loc15_17.3 [concrete = constants.%empty_tuple.type] { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %.loc15_17.2: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc15_17.3: type = converted %.loc15_17.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: %T.loc15_12.2: %empty_tuple.type = bind_symbolic_name T, 0 [symbolic = %T.loc15_12.1 (constants.%T.7a6)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic impl @Generic.as.Destroy.impl(@Generic.%T.loc4_15.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] -// CHECK:STDOUT: %Generic: type = class_type @Generic, @Generic(%T) [symbolic = %Generic (constants.%Generic)] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Generic.%Destroy.impl_witness_table, @Generic.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Generic.as.Destroy.impl.Op.type: type = fn_type @Generic.as.Destroy.impl.Op, @Generic.as.Destroy.impl(%T) [symbolic = %Generic.as.Destroy.impl.Op.type (constants.%Generic.as.Destroy.impl.Op.type)] -// CHECK:STDOUT: %Generic.as.Destroy.impl.Op: @Generic.as.Destroy.impl.%Generic.as.Destroy.impl.Op.type (%Generic.as.Destroy.impl.Op.type) = struct_value () [symbolic = %Generic.as.Destroy.impl.Op (constants.%Generic.as.Destroy.impl.Op)] -// CHECK:STDOUT: -// CHECK:STDOUT: impl: @Generic.%Self.ref as constants.%Destroy.type { -// CHECK:STDOUT: %Generic.as.Destroy.impl.Op.decl: @Generic.as.Destroy.impl.%Generic.as.Destroy.impl.Op.type (%Generic.as.Destroy.impl.Op.type) = fn_decl @Generic.as.Destroy.impl.Op [symbolic = @Generic.as.Destroy.impl.%Generic.as.Destroy.impl.Op (constants.%Generic.as.Destroy.impl.Op)] { -// CHECK:STDOUT: %self.patt: @Generic.as.Destroy.impl.Op.%pattern_type (%pattern_type.b64) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Generic.as.Destroy.impl.Op.%pattern_type (%pattern_type.b64) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc4_25.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @Generic.as.Destroy.impl.Op.%ptr (%ptr.881) = value_param call_param0 -// CHECK:STDOUT: %.loc4_25.2: type = splice_block %Self.ref [symbolic = %Generic (constants.%Generic)] { -// CHECK:STDOUT: %.loc4_25.3: type = specific_constant constants.%Generic, @Generic(constants.%T.8b3) [symbolic = %Generic (constants.%Generic)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc4_25.3 [symbolic = %Generic (constants.%Generic)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Generic.as.Destroy.impl.Op.%ptr (%ptr.881) = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Op = %Generic.as.Destroy.impl.Op.decl -// CHECK:STDOUT: witness = @Generic.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Generic(%T.loc4_15.2: type) { -// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.1 (constants.%T.8b3)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Generic.WrongType.type: type = fn_type @Generic.WrongType, @Generic(%T.loc4_15.1) [symbolic = %Generic.WrongType.type (constants.%Generic.WrongType.type)] -// CHECK:STDOUT: %Generic.WrongType: @Generic.%Generic.WrongType.type (%Generic.WrongType.type) = struct_value () [symbolic = %Generic.WrongType (constants.%Generic.WrongType)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %Generic.WrongType.decl: @Generic.%Generic.WrongType.type (%Generic.WrongType.type) = fn_decl @Generic.WrongType [symbolic = @Generic.%Generic.WrongType (constants.%Generic.WrongType)] {} {} -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Generic [symbolic = @Generic.as.Destroy.impl.%Generic (constants.%Generic)] -// CHECK:STDOUT: impl_decl @Generic.as.Destroy.impl [concrete] {} {} -// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Generic.as.Destroy.impl.%Generic.as.Destroy.impl.Op.decl), @Generic.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Generic.as.Destroy.impl(constants.%T.8b3) [symbolic = @Generic.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness)] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Generic -// CHECK:STDOUT: .WrongType = %Generic.WrongType.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Generic.WrongType(@Generic.%T.loc4_15.2: type) { -// CHECK:STDOUT: fn(); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Generic.as.Destroy.impl.Op(@Generic.%T.loc4_15.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] -// CHECK:STDOUT: %Generic: type = class_type @Generic, @Generic(%T) [symbolic = %Generic (constants.%Generic)] -// CHECK:STDOUT: %ptr: type = ptr_type %Generic [symbolic = %ptr (constants.%ptr.881)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.b64)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Generic.as.Destroy.impl.Op.%ptr (%ptr.881)) = "no_op"; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @WrongType(%T.loc15_12.2: %empty_tuple.type) { -// CHECK:STDOUT: %T.loc15_12.1: %empty_tuple.type = bind_symbolic_name T, 0 [symbolic = %T.loc15_12.1 (constants.%T.7a6)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Generic(constants.%T.8b3) { -// CHECK:STDOUT: %T.loc4_15.1 => constants.%T.8b3 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Generic.WrongType(constants.%T.8b3) {} -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Generic.as.Destroy.impl(constants.%T.8b3) { -// CHECK:STDOUT: %T => constants.%T.8b3 -// CHECK:STDOUT: %Generic => constants.%Generic -// CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Generic.as.Destroy.impl.Op(constants.%T.8b3) { -// CHECK:STDOUT: %T => constants.%T.8b3 -// CHECK:STDOUT: %Generic => constants.%Generic -// CHECK:STDOUT: %ptr => constants.%ptr.881 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.b64 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @WrongType(constants.%T.7a6) { -// CHECK:STDOUT: %T.loc15_12.1 => constants.%T.7a6 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/member_type.carbon b/toolchain/check/testdata/class/generic/member_type.carbon index 2cf8b645524f..c787492b2ad4 100644 --- a/toolchain/check/testdata/class/generic/member_type.carbon +++ b/toolchain/check/testdata/class/generic/member_type.carbon @@ -143,14 +143,14 @@ fn Test() -> i32 { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.592, @Core.IntLiteral.as.ImplicitAs.impl.Convert(%int_32) [concrete] // CHECK:STDOUT: %bound_method: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %Destroy.impl_witness.490: = impl_witness @Inner.%Destroy.impl_witness_table, @Inner.as.Destroy.impl(%Copy.facet.26d) [concrete] // CHECK:STDOUT: %Inner.as.Destroy.impl.Op.type.90b: type = fn_type @Inner.as.Destroy.impl.Op, @Inner.as.Destroy.impl(%Copy.facet.26d) [concrete] // CHECK:STDOUT: %Inner.as.Destroy.impl.Op.698: %Inner.as.Destroy.impl.Op.type.90b = struct_value () [concrete] // CHECK:STDOUT: %ptr.efa: type = ptr_type %Inner.3fc [concrete] // CHECK:STDOUT: %pattern_type.239: type = pattern_type %ptr.efa [concrete] // CHECK:STDOUT: %Inner.as.Destroy.impl.Op.specific_fn: = specific_function %Inner.as.Destroy.impl.Op.698, @Inner.as.Destroy.impl.Op(%Copy.facet.26d) [concrete] -// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] -// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -167,7 +167,7 @@ fn Test() -> i32 { // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] // CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] -// CHECK:STDOUT: %Core.import_ref.c4d = import_ref Core//prelude/parts/copy, loc28_31, unloaded +// CHECK:STDOUT: %Core.import_ref.c4d = import_ref Core//prelude/parts/copy, loc32_31, unloaded // CHECK:STDOUT: %Copy.impl_witness_table.462 = impl_witness_table (%Core.import_ref.c4d), @Core.IntLiteral.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] @@ -410,10 +410,10 @@ fn Test() -> i32 { // CHECK:STDOUT: %.loc13_43.2: %Copy.type = converted Core.IntLiteral, %Copy.facet.loc13_43.2 [concrete = constants.%Copy.facet.66a] // CHECK:STDOUT: %Outer.F.specific_fn: = specific_function %F.ref, @Outer.F(constants.%Copy.facet.26d) [concrete = constants.%Outer.F.specific_fn] // CHECK:STDOUT: %.loc13_3: ref %Inner.3fc = splice_block %c.var {} -// CHECK:STDOUT: %impl.elem0: %.7ea = impl_witness_access constants.%ImplicitAs.impl_witness.acc, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.592] -// CHECK:STDOUT: %bound_method.loc13_42.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc13_42.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] +// CHECK:STDOUT: %impl.elem0.loc13: %.7ea = impl_witness_access constants.%ImplicitAs.impl_witness.acc, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.592] +// CHECK:STDOUT: %bound_method.loc13_42.1: = bound_method %int_1, %impl.elem0.loc13 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] +// CHECK:STDOUT: %specific_fn.loc13: = specific_function %impl.elem0.loc13, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] +// CHECK:STDOUT: %bound_method.loc13_42.2: = bound_method %int_1, %specific_fn.loc13 [concrete = constants.%bound_method] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc13_42.2(%int_1) [concrete = constants.%int_1.5d2] // CHECK:STDOUT: %.loc13_42.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5d2] // CHECK:STDOUT: %.loc13_42.2: %i32 = converted %int_1, %.loc13_42.1 [concrete = constants.%int_1.5d2] @@ -434,12 +434,17 @@ fn Test() -> i32 { // CHECK:STDOUT: %n.ref: %Inner.elem.45c = name_ref n, @Inner.%.loc6_10 [concrete = @Inner.%.loc6_10] // CHECK:STDOUT: %.loc14_11.1: ref %i32 = class_element_access %c.ref, element0 // CHECK:STDOUT: %.loc14_11.2: %i32 = bind_value %.loc14_11.1 +// CHECK:STDOUT: %impl.elem0.loc14: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc14_11.1: = bound_method %.loc14_11.2, %impl.elem0.loc14 +// CHECK:STDOUT: %specific_fn.loc14: = specific_function %impl.elem0.loc14, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc14_11.2: = bound_method %.loc14_11.2, %specific_fn.loc14 +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc14_11.2(%.loc14_11.2) // CHECK:STDOUT: %Inner.as.Destroy.impl.Op.bound: = bound_method %c.var, constants.%Inner.as.Destroy.impl.Op.698 // CHECK:STDOUT: %Inner.as.Destroy.impl.Op.specific_fn: = specific_function constants.%Inner.as.Destroy.impl.Op.698, @Inner.as.Destroy.impl.Op(constants.%Copy.facet.26d) [concrete = constants.%Inner.as.Destroy.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc13_3: = bound_method %c.var, %Inner.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr: %ptr.efa = addr_of %c.var // CHECK:STDOUT: %Inner.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc13_3(%addr) -// CHECK:STDOUT: return %.loc14_11.2 +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Outer(constants.%T.578) { @@ -974,9 +979,7 @@ fn Test() -> i32 { // CHECK:STDOUT: %specific_impl_fn.loc11_41.1: = specific_impl_function %impl.elem0.loc11_41.1, @Inner.F(constants.%T, constants.%Inner.facet.03c) [symbolic = %specific_impl_fn.loc11_41.2 (constants.%specific_impl_fn)] // CHECK:STDOUT: %bound_method.loc11_52: = bound_method %self.ref, %specific_impl_fn.loc11_41.1 // CHECK:STDOUT: %.loc11_52: init @C.as.Inner.impl.F.%T (%T) = call %bound_method.loc11_52(%self.ref) -// CHECK:STDOUT: %.loc11_53.1: @C.as.Inner.impl.F.%T (%T) = value_of_initializer %.loc11_52 -// CHECK:STDOUT: %.loc11_53.2: @C.as.Inner.impl.F.%T (%T) = converted %.loc11_52, %.loc11_53.1 -// CHECK:STDOUT: return %.loc11_53.2 +// CHECK:STDOUT: return %.loc11_52 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1041,14 +1044,12 @@ fn Test() -> i32 { // CHECK:STDOUT: %bound_method.loc24_33: = bound_method %c.ref, %specific_fn // CHECK:STDOUT: %.loc24_10: %C.70f = bind_value %c.ref // CHECK:STDOUT: %C.as.Inner.impl.F.call: init %i32 = call %bound_method.loc24_33(%.loc24_10) -// CHECK:STDOUT: %.loc24_34.1: %i32 = value_of_initializer %C.as.Inner.impl.F.call -// CHECK:STDOUT: %.loc24_34.2: %i32 = converted %C.as.Inner.impl.F.call, %.loc24_34.1 // CHECK:STDOUT: %C.as.Destroy.impl.Op.bound: = bound_method %c.var, constants.%C.as.Destroy.impl.Op.11c // CHECK:STDOUT: %C.as.Destroy.impl.Op.specific_fn: = specific_function constants.%C.as.Destroy.impl.Op.11c, @C.as.Destroy.impl.Op(constants.%i32) [concrete = constants.%C.as.Destroy.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc23: = bound_method %c.var, %C.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr: %ptr.18f = addr_of %c.var // CHECK:STDOUT: %C.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc23(%addr) -// CHECK:STDOUT: return %.loc24_34.2 +// CHECK:STDOUT: return %C.as.Inner.impl.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Outer(constants.%T) { diff --git a/toolchain/check/testdata/class/import.carbon b/toolchain/check/testdata/class/import.carbon index 87f7329c578b..99d43db53487 100644 --- a/toolchain/check/testdata/class/import.carbon +++ b/toolchain/check/testdata/class/import.carbon @@ -358,7 +358,7 @@ fn Run() { // CHECK:STDOUT: %Main.import_ref.42a = import_ref Main//a, loc14_21, unloaded // CHECK:STDOUT: %Main.import_ref.67a = import_ref Main//a, loc15_27, unloaded // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: %Main.import_ref.0dc: = import_ref Main//a, loc4_13, loaded [concrete = constants.%Destroy.impl_witness.3b2] diff --git a/toolchain/check/testdata/class/import_indirect.carbon b/toolchain/check/testdata/class/import_indirect.carbon index 2bca41373162..81bb1402d2e0 100644 --- a/toolchain/check/testdata/class/import_indirect.carbon +++ b/toolchain/check/testdata/class/import_indirect.carbon @@ -203,7 +203,7 @@ var ptr: E* = &val; // CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//a, loc4_10, loaded [concrete = constants.%complete_type.357] // CHECK:STDOUT: %Main.import_ref.2c4 = import_ref Main//a, inst18 [no loc], unloaded // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -298,7 +298,7 @@ var ptr: E* = &val; // CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//a, loc4_10, loaded [concrete = constants.%complete_type.357] // CHECK:STDOUT: %Main.import_ref.2c4 = import_ref Main//a, inst18 [no loc], unloaded // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -396,7 +396,7 @@ var ptr: E* = &val; // CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//a, loc4_10, loaded [concrete = constants.%complete_type.357] // CHECK:STDOUT: %Main.import_ref.2c4 = import_ref Main//a, inst18 [no loc], unloaded // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -494,7 +494,7 @@ var ptr: E* = &val; // CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//a, loc4_10, loaded [concrete = constants.%complete_type.357] // CHECK:STDOUT: %Main.import_ref.2c4 = import_ref Main//a, inst18 [no loc], unloaded // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -594,7 +594,7 @@ var ptr: E* = &val; // CHECK:STDOUT: %Main.import_ref.8db: = import_ref Main//b, inst23 [indirect], loaded [concrete = constants.%complete_type.357] // CHECK:STDOUT: %Main.import_ref.6a9 = import_ref Main//b, inst24 [indirect], unloaded // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -696,7 +696,7 @@ var ptr: E* = &val; // CHECK:STDOUT: %Main.import_ref.8db: = import_ref Main//b, inst23 [indirect], loaded [concrete = constants.%complete_type.357] // CHECK:STDOUT: %Main.import_ref.6a9 = import_ref Main//b, inst24 [indirect], unloaded // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/import_struct_cyle.carbon b/toolchain/check/testdata/class/import_struct_cyle.carbon index 4279ed57f3d4..e03eaf8168c5 100644 --- a/toolchain/check/testdata/class/import_struct_cyle.carbon +++ b/toolchain/check/testdata/class/import_struct_cyle.carbon @@ -162,7 +162,7 @@ fn Run() { // CHECK:STDOUT: %a.var: ref %struct_type.b = var %a.var_patt [concrete] // CHECK:STDOUT: %.354: %Cycle.elem = field_decl c, element0 [concrete] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/inheritance_access.carbon b/toolchain/check/testdata/class/inheritance_access.carbon index 5201240bfe90..ea91deeb9309 100644 --- a/toolchain/check/testdata/class/inheritance_access.carbon +++ b/toolchain/check/testdata/class/inheritance_access.carbon @@ -476,11 +476,6 @@ class B { // CHECK:STDOUT: %C.as.Destroy.impl.Op: %C.as.Destroy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: %struct_type.base.0ff: type = struct_type {.base: %B} [concrete] // CHECK:STDOUT: %complete_type.98e: = complete_type_witness %struct_type.base.0ff [concrete] -// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.type.abd: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%empty_tuple.type) [concrete] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.bae: %T.as.Destroy.impl.Op.type.abd = struct_value () [concrete] -// CHECK:STDOUT: %ptr.843: type = ptr_type %empty_tuple.type [concrete] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function %T.as.Destroy.impl.Op.bae, @T.as.Destroy.impl.Op(%empty_tuple.type) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -642,16 +637,7 @@ class B { // CHECK:STDOUT: %self.ref: %C = name_ref self, %self // CHECK:STDOUT: %F.ref: %A.F.type = name_ref F, @A.%A.F.decl [concrete = constants.%A.F] // CHECK:STDOUT: %A.F.call: init %empty_tuple.type = call %F.ref() -// CHECK:STDOUT: %.loc15_44.1: ref %empty_tuple.type = temporary_storage -// CHECK:STDOUT: %.loc15_44.2: ref %empty_tuple.type = temporary %.loc15_44.1, %A.F.call -// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc15_45: %empty_tuple.type = converted %A.F.call, %tuple [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %.loc15_44.2, constants.%T.as.Destroy.impl.Op.bae -// CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function constants.%T.as.Destroy.impl.Op.bae, @T.as.Destroy.impl.Op(constants.%empty_tuple.type) [concrete = constants.%T.as.Destroy.impl.Op.specific_fn] -// CHECK:STDOUT: %bound_method: = bound_method %.loc15_44.2, %T.as.Destroy.impl.Op.specific_fn -// CHECK:STDOUT: %addr: %ptr.843 = addr_of %.loc15_44.2 -// CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method(%addr) -// CHECK:STDOUT: return %.loc15_45 +// CHECK:STDOUT: return %A.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.Destroy.impl.Op(%self.param: %ptr.019) = "no_op"; @@ -663,6 +649,7 @@ class B { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %int_5.64b: Core.IntLiteral = int_value 5 [concrete] @@ -706,6 +693,16 @@ class B { // CHECK:STDOUT: %B.as.Destroy.impl.Op: %B.as.Destroy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %A} [concrete] // CHECK:STDOUT: %complete_type.020: = complete_type_witness %struct_type.base [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -713,6 +710,7 @@ class B { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs // CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } @@ -721,6 +719,9 @@ class B { // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -851,9 +852,8 @@ class B { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc7_13.2: = bound_method %int_5, %specific_fn [concrete = constants.%bound_method] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc7_13.2(%int_5) [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc7_13.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc7_13.2: %i32 = converted %int_5, %.loc7_13.1 [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: return %.loc7_13.2 +// CHECK:STDOUT: %.loc7: init %i32 = converted %int_5, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_5.0f6] +// CHECK:STDOUT: return %.loc7 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @A.as.Destroy.impl.Op(%self.param: %ptr.6db) = "no_op"; @@ -862,7 +862,12 @@ class B { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] // CHECK:STDOUT: %SOME_CONSTANT.ref: %i32 = name_ref SOME_CONSTANT, @A.%SOME_CONSTANT -// CHECK:STDOUT: return %SOME_CONSTANT.ref +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc15_13.1: = bound_method %SOME_CONSTANT.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc15_13.2: = bound_method %SOME_CONSTANT.ref, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc15_13.2(%SOME_CONSTANT.ref) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B.H() -> %i32 { @@ -870,9 +875,7 @@ class B { // CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] // CHECK:STDOUT: %SomeProtectedFunction.ref: %A.SomeProtectedFunction.type = name_ref SomeProtectedFunction, @A.%A.SomeProtectedFunction.decl [concrete = constants.%A.SomeProtectedFunction] // CHECK:STDOUT: %A.SomeProtectedFunction.call: init %i32 = call %SomeProtectedFunction.ref() -// CHECK:STDOUT: %.loc19_37.1: %i32 = value_of_initializer %A.SomeProtectedFunction.call -// CHECK:STDOUT: %.loc19_37.2: %i32 = converted %A.SomeProtectedFunction.call, %.loc19_37.1 -// CHECK:STDOUT: return %.loc19_37.2 +// CHECK:STDOUT: return %A.SomeProtectedFunction.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B.as.Destroy.impl.Op(%self.param: %ptr.e79) = "no_op"; @@ -1019,7 +1022,7 @@ class B { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %self.ref: %Square = name_ref self, %self // CHECK:STDOUT: %y.ref: = name_ref y, [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Square.as.Destroy.impl.Op(%self.param: %ptr.671) = "no_op"; @@ -1716,7 +1719,7 @@ class B { // CHECK:STDOUT: %SOME_PRIVATE_CONSTANT.ref: = name_ref SOME_PRIVATE_CONSTANT, [concrete = ] // CHECK:STDOUT: %A.ref.loc33: type = name_ref A, file.%A.decl [concrete = constants.%A] // CHECK:STDOUT: %SOME_PROTECTED_CONSTANT.ref: = name_ref SOME_PROTECTED_CONSTANT, [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B.SomeFunc(%self.param: %B) -> %i32 { @@ -1726,7 +1729,7 @@ class B { // CHECK:STDOUT: %.loc44_16.1: ref %Internal = class_element_access %self.ref, element0 // CHECK:STDOUT: %.loc44_16.2: %Internal = bind_value %.loc44_16.1 // CHECK:STDOUT: %INTERNAL_CONSTANT.ref: = name_ref INTERNAL_CONSTANT, [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B.as.Destroy.impl.Op(%self.param: %ptr.e79) = "no_op"; diff --git a/toolchain/check/testdata/class/init.carbon b/toolchain/check/testdata/class/init.carbon index beddb18cf6b6..aafe159028f1 100644 --- a/toolchain/check/testdata/class/init.carbon +++ b/toolchain/check/testdata/class/init.carbon @@ -86,7 +86,7 @@ fn MakeReorder(n: i32, next: Class*) -> Class { // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] // CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] // CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/init_as.carbon b/toolchain/check/testdata/class/init_as.carbon index 866db9466ee2..5b6ebf6e4d8a 100644 --- a/toolchain/check/testdata/class/init_as.carbon +++ b/toolchain/check/testdata/class/init_as.carbon @@ -29,6 +29,7 @@ fn F() -> i32 { // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %i32 [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] @@ -66,6 +67,16 @@ fn F() -> i32 { // CHECK:STDOUT: %bound_method.f6f: = bound_method %int_2.ecc, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %int_2.ef8: %i32 = int_value 2 [concrete] // CHECK:STDOUT: %Class.val: %Class = struct_value (%int_1.5d2, %int_2.ef8) [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -73,6 +84,7 @@ fn F() -> i32 { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } @@ -81,6 +93,9 @@ fn F() -> i32 { // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -169,9 +184,14 @@ fn F() -> i32 { // CHECK:STDOUT: %a.ref: %Class.elem = name_ref a, @Class.%.loc16 [concrete = @Class.%.loc16] // CHECK:STDOUT: %.loc21_37.1: ref %i32 = class_element_access %.loc21_28, element0 // CHECK:STDOUT: %.loc21_37.2: %i32 = bind_value %.loc21_37.1 +// CHECK:STDOUT: %impl.elem0.loc21_37: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc21_37.1: = bound_method %.loc21_37.2, %impl.elem0.loc21_37 +// CHECK:STDOUT: %specific_fn.loc21_37: = specific_function %impl.elem0.loc21_37, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc21_37.2: = bound_method %.loc21_37.2, %specific_fn.loc21_37 +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc21_37.2(%.loc21_37.2) // CHECK:STDOUT: %Class.as.Destroy.impl.Op.bound: = bound_method %.loc21_26.10, constants.%Class.as.Destroy.impl.Op // CHECK:STDOUT: %addr: %ptr.e71 = addr_of %.loc21_26.10 // CHECK:STDOUT: %Class.as.Destroy.impl.Op.call: init %empty_tuple.type = call %Class.as.Destroy.impl.Op.bound(%addr) -// CHECK:STDOUT: return %.loc21_37.2 +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/local.carbon b/toolchain/check/testdata/class/local.carbon index 606c75ed1789..4507cb2a33dd 100644 --- a/toolchain/check/testdata/class/local.carbon +++ b/toolchain/check/testdata/class/local.carbon @@ -35,6 +35,7 @@ class A { // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %A.F.type: type = fn_type @A.F [concrete] @@ -79,6 +80,16 @@ class A { // CHECK:STDOUT: %bound_method: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] // CHECK:STDOUT: %B.val: %B = struct_value (%int_1.5d2) [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -86,6 +97,7 @@ class A { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } @@ -94,6 +106,9 @@ class A { // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -195,10 +210,15 @@ class A { // CHECK:STDOUT: %n.ref: %B.elem = name_ref n, @B.%.loc23 [concrete = @B.%.loc23] // CHECK:STDOUT: %.loc26_20.1: ref %i32 = class_element_access %.loc26_19.2, element0 // CHECK:STDOUT: %.loc26_20.2: %i32 = bind_value %.loc26_20.1 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc26_20.1: = bound_method %.loc26_20.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc26_20.2: = bound_method %.loc26_20.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc26_20.2(%.loc26_20.2) // CHECK:STDOUT: %B.as.Destroy.impl.Op.bound: = bound_method %.loc26_19.2, constants.%B.as.Destroy.impl.Op // CHECK:STDOUT: %addr: %ptr.bac = addr_of %.loc26_19.2 // CHECK:STDOUT: %B.as.Destroy.impl.Op.call: init %empty_tuple.type = call %B.as.Destroy.impl.Op.bound(%addr) -// CHECK:STDOUT: return %.loc26_20.2 +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @A.as.Destroy.impl.Op(%self.param: %ptr.6db) = "no_op"; diff --git a/toolchain/check/testdata/class/method.carbon b/toolchain/check/testdata/class/method.carbon index 30a590076441..09cbec812595 100644 --- a/toolchain/check/testdata/class/method.carbon +++ b/toolchain/check/testdata/class/method.carbon @@ -71,6 +71,7 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %Class.F.type: type = fn_type @Class.F [concrete] @@ -87,6 +88,16 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %Class.as.Destroy.impl.Op: %Class.as.Destroy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: %struct_type.k.0bf: type = struct_type {.k: %i32} [concrete] // CHECK:STDOUT: %complete_type.954: = complete_type_witness %struct_type.k.0bf [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %Call.type: type = fn_type @Call [concrete] // CHECK:STDOUT: %Call: %Call.type = struct_value () [concrete] // CHECK:STDOUT: %CallAlias.type: type = fn_type @CallAlias [concrete] @@ -130,12 +141,16 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] @@ -354,7 +369,12 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %k.ref: %Class.elem = name_ref k, @Class.%.loc21 [concrete = @Class.%.loc21] // CHECK:STDOUT: %.loc25_14.1: ref %i32 = class_element_access %self.ref, element0 // CHECK:STDOUT: %.loc25_14.2: %i32 = bind_value %.loc25_14.1 -// CHECK:STDOUT: return %.loc25_14.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc25_14.1: = bound_method %.loc25_14.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc25_14.2: = bound_method %.loc25_14.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc25_14.2(%.loc25_14.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return.loc24 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.G(%self.param: %ptr.e71) -> %i32; @@ -367,9 +387,7 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %F.ref: %Class.F.type = name_ref F, @Class.%Class.F.decl [concrete = constants.%Class.F] // CHECK:STDOUT: %Class.F.bound: = bound_method %c.ref, %F.ref // CHECK:STDOUT: %Class.F.call: init %i32 = call %Class.F.bound(%c.ref) -// CHECK:STDOUT: %.loc31_15.1: %i32 = value_of_initializer %Class.F.call -// CHECK:STDOUT: %.loc31_15.2: %i32 = converted %Class.F.call, %.loc31_15.1 -// CHECK:STDOUT: return %.loc31_15.2 +// CHECK:STDOUT: return %Class.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallAlias(%c.param: %Class) -> %i32 { @@ -378,9 +396,7 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %A.ref: %Class.F.type = name_ref A, @Class.%A [concrete = constants.%Class.F] // CHECK:STDOUT: %Class.F.bound: = bound_method %c.ref, %A.ref // CHECK:STDOUT: %Class.F.call: init %i32 = call %Class.F.bound(%c.ref) -// CHECK:STDOUT: %.loc35_15.1: %i32 = value_of_initializer %Class.F.call -// CHECK:STDOUT: %.loc35_15.2: %i32 = converted %Class.F.call, %.loc35_15.1 -// CHECK:STDOUT: return %.loc35_15.2 +// CHECK:STDOUT: return %Class.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallOnConstBoundMethod() -> %i32 { @@ -404,12 +420,10 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %Class.F.bound: = bound_method %.loc39_20.1, %F.ref // CHECK:STDOUT: %.loc39_20.2: %Class = bind_value %.loc39_20.1 // CHECK:STDOUT: %Class.F.call: init %i32 = call %Class.F.bound(%.loc39_20.2) -// CHECK:STDOUT: %.loc39_33.1: %i32 = value_of_initializer %Class.F.call -// CHECK:STDOUT: %.loc39_33.2: %i32 = converted %Class.F.call, %.loc39_33.1 // CHECK:STDOUT: %Class.as.Destroy.impl.Op.bound: = bound_method %.loc39_18.7, constants.%Class.as.Destroy.impl.Op // CHECK:STDOUT: %addr: %ptr.e71 = addr_of %.loc39_18.7 // CHECK:STDOUT: %Class.as.Destroy.impl.Op.call: init %empty_tuple.type = call %Class.as.Destroy.impl.Op.bound(%addr) -// CHECK:STDOUT: return %.loc39_33.2 +// CHECK:STDOUT: return %Class.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallWithAddr() -> %i32 { @@ -426,12 +440,10 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %Class.G.bound: = bound_method %c.ref, %G.ref // CHECK:STDOUT: %addr.loc44: %ptr.e71 = addr_of %c.ref // CHECK:STDOUT: %Class.G.call: init %i32 = call %Class.G.bound(%addr.loc44) -// CHECK:STDOUT: %.loc44_15.1: %i32 = value_of_initializer %Class.G.call -// CHECK:STDOUT: %.loc44_15.2: %i32 = converted %Class.G.call, %.loc44_15.1 // CHECK:STDOUT: %Class.as.Destroy.impl.Op.bound: = bound_method %c.var, constants.%Class.as.Destroy.impl.Op // CHECK:STDOUT: %addr.loc43: %ptr.e71 = addr_of %c.var // CHECK:STDOUT: %Class.as.Destroy.impl.Op.call: init %empty_tuple.type = call %Class.as.Destroy.impl.Op.bound(%addr.loc43) -// CHECK:STDOUT: return %.loc44_15.2 +// CHECK:STDOUT: return %Class.G.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallFThroughPointer(%p.param: %ptr.e71) -> %i32 { @@ -442,22 +454,18 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %Class.F.bound: = bound_method %.loc48_11.1, %F.ref // CHECK:STDOUT: %.loc48_11.2: %Class = bind_value %.loc48_11.1 // CHECK:STDOUT: %Class.F.call: init %i32 = call %Class.F.bound(%.loc48_11.2) -// CHECK:STDOUT: %.loc48_18.1: %i32 = value_of_initializer %Class.F.call -// CHECK:STDOUT: %.loc48_18.2: %i32 = converted %Class.F.call, %.loc48_18.1 -// CHECK:STDOUT: return %.loc48_18.2 +// CHECK:STDOUT: return %Class.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallGThroughPointer(%p.param: %ptr.e71) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %p.ref: %ptr.e71 = name_ref p, %p -// CHECK:STDOUT: %.loc52_11: ref %Class = deref %p.ref +// CHECK:STDOUT: %.loc52: ref %Class = deref %p.ref // CHECK:STDOUT: %G.ref: %Class.G.type = name_ref G, @Class.%Class.G.decl [concrete = constants.%Class.G] -// CHECK:STDOUT: %Class.G.bound: = bound_method %.loc52_11, %G.ref -// CHECK:STDOUT: %addr: %ptr.e71 = addr_of %.loc52_11 +// CHECK:STDOUT: %Class.G.bound: = bound_method %.loc52, %G.ref +// CHECK:STDOUT: %addr: %ptr.e71 = addr_of %.loc52 // CHECK:STDOUT: %Class.G.call: init %i32 = call %Class.G.bound(%addr) -// CHECK:STDOUT: %.loc52_18.1: %i32 = value_of_initializer %Class.G.call -// CHECK:STDOUT: %.loc52_18.2: %i32 = converted %Class.G.call, %.loc52_18.1 -// CHECK:STDOUT: return %.loc52_18.2 +// CHECK:STDOUT: return %Class.G.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Make() -> %return.param: %Class; @@ -472,12 +480,10 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %Class.F.bound: = bound_method %.loc58_15.2, %F.ref // CHECK:STDOUT: %.loc58_15.3: %Class = bind_value %.loc58_15.2 // CHECK:STDOUT: %Class.F.call: init %i32 = call %Class.F.bound(%.loc58_15.3) -// CHECK:STDOUT: %.loc58_20.1: %i32 = value_of_initializer %Class.F.call -// CHECK:STDOUT: %.loc58_20.2: %i32 = converted %Class.F.call, %.loc58_20.1 // CHECK:STDOUT: %Class.as.Destroy.impl.Op.bound: = bound_method %.loc58_15.2, constants.%Class.as.Destroy.impl.Op // CHECK:STDOUT: %addr: %ptr.e71 = addr_of %.loc58_15.2 // CHECK:STDOUT: %Class.as.Destroy.impl.Op.call: init %empty_tuple.type = call %Class.as.Destroy.impl.Op.bound(%addr) -// CHECK:STDOUT: return %.loc58_20.2 +// CHECK:STDOUT: return %Class.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallGOnInitializingExpr() -> %i32 { @@ -490,11 +496,9 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %Class.G.bound: = bound_method %.loc62_15.2, %G.ref // CHECK:STDOUT: %addr.loc62_15.1: %ptr.e71 = addr_of %.loc62_15.2 // CHECK:STDOUT: %Class.G.call: init %i32 = call %Class.G.bound(%addr.loc62_15.1) -// CHECK:STDOUT: %.loc62_20.1: %i32 = value_of_initializer %Class.G.call -// CHECK:STDOUT: %.loc62_20.2: %i32 = converted %Class.G.call, %.loc62_20.1 // CHECK:STDOUT: %Class.as.Destroy.impl.Op.bound: = bound_method %.loc62_15.2, constants.%Class.as.Destroy.impl.Op // CHECK:STDOUT: %addr.loc62_15.2: %ptr.e71 = addr_of %.loc62_15.2 // CHECK:STDOUT: %Class.as.Destroy.impl.Op.call: init %empty_tuple.type = call %Class.as.Destroy.impl.Op.bound(%addr.loc62_15.2) -// CHECK:STDOUT: return %.loc62_20.2 +// CHECK:STDOUT: return %Class.G.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/nested.carbon b/toolchain/check/testdata/class/nested.carbon index fd13f4a2ac35..12022f7f8346 100644 --- a/toolchain/check/testdata/class/nested.carbon +++ b/toolchain/check/testdata/class/nested.carbon @@ -117,7 +117,7 @@ fn F(a: Outer*) { // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/nested_name.carbon b/toolchain/check/testdata/class/nested_name.carbon index a3c0998345d3..980360671204 100644 --- a/toolchain/check/testdata/class/nested_name.carbon +++ b/toolchain/check/testdata/class/nested_name.carbon @@ -35,6 +35,7 @@ fn G(o: Outer) { // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Inner.elem: type = unbound_element_type %Inner, %i32 [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] @@ -57,6 +58,16 @@ fn G(o: Outer) { // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [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] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.e74: type = pattern_type %Outer [concrete] // CHECK:STDOUT: %G.type: type = fn_type @G [concrete] // CHECK:STDOUT: %G: %G.type = struct_value () [concrete] @@ -66,11 +77,15 @@ fn G(o: Outer) { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -181,7 +196,12 @@ fn G(o: Outer) { // CHECK:STDOUT: %n.ref: %Inner.elem = name_ref n, @Inner.%.loc17 [concrete = @Inner.%.loc17] // CHECK:STDOUT: %.loc22_12.1: ref %i32 = class_element_access %oi.ref, element0 // CHECK:STDOUT: %.loc22_12.2: %i32 = bind_value %.loc22_12.1 -// CHECK:STDOUT: return %.loc22_12.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc22_12.1: = bound_method %.loc22_12.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc22_12.2: = bound_method %.loc22_12.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc22_12.2(%.loc22_12.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G(%o.param: %Outer) { diff --git a/toolchain/check/testdata/class/raw_self_type.carbon b/toolchain/check/testdata/class/raw_self_type.carbon index 937b226b73d6..7db9608e1eee 100644 --- a/toolchain/check/testdata/class/raw_self_type.carbon +++ b/toolchain/check/testdata/class/raw_self_type.carbon @@ -85,7 +85,7 @@ fn MemberNamedSelf.F(x: Self, y: r#Self) {} // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/reenter_scope.carbon b/toolchain/check/testdata/class/reenter_scope.carbon index 794740d7c669..ccb60715a7db 100644 --- a/toolchain/check/testdata/class/reenter_scope.carbon +++ b/toolchain/check/testdata/class/reenter_scope.carbon @@ -130,9 +130,7 @@ fn Class.F() -> i32 { // CHECK:STDOUT: %Class.G.call.loc21: init %i32 = call %G.ref.loc21() // CHECK:STDOUT: %G.ref.loc22: %Class.G.type = name_ref G, @Class.%Class.G.decl [concrete = constants.%Class.G] // CHECK:STDOUT: %Class.G.call.loc22: init %i32 = call %G.ref.loc22() -// CHECK:STDOUT: %.loc22_13.1: %i32 = value_of_initializer %Class.G.call.loc22 -// CHECK:STDOUT: %.loc22_13.2: %i32 = converted %Class.G.call.loc22, %.loc22_13.1 -// CHECK:STDOUT: return %.loc22_13.2 +// CHECK:STDOUT: return %Class.G.call.loc22 to %return.loc20 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.G() -> %i32; diff --git a/toolchain/check/testdata/class/reorder.carbon b/toolchain/check/testdata/class/reorder.carbon index ffdfb82b2f21..d8cef064c284 100644 --- a/toolchain/check/testdata/class/reorder.carbon +++ b/toolchain/check/testdata/class/reorder.carbon @@ -141,9 +141,7 @@ class Class { // CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] // CHECK:STDOUT: %F.ref: %Class.F.type = name_ref F, @Class.%Class.F.decl [concrete = constants.%Class.F] // CHECK:STDOUT: %Class.F.call: init %i32 = call %F.ref() -// CHECK:STDOUT: %.loc17_21.1: %i32 = value_of_initializer %Class.F.call -// CHECK:STDOUT: %.loc17_21.2: %i32 = converted %Class.F.call, %.loc17_21.1 -// CHECK:STDOUT: return %.loc17_21.2 +// CHECK:STDOUT: return %Class.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.F() -> %i32 { @@ -154,9 +152,8 @@ class Class { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc21_13.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc21_13.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc21_13.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc21_13.2: %i32 = converted %int_1, %.loc21_13.1 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: return %.loc21_13.2 +// CHECK:STDOUT: %.loc21: init %i32 = converted %int_1, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: return %.loc21 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.as.Destroy.impl.Op(%self.param: %ptr.e71) = "no_op"; diff --git a/toolchain/check/testdata/class/scope.carbon b/toolchain/check/testdata/class/scope.carbon index 7d158f4f42e1..0a862c72275d 100644 --- a/toolchain/check/testdata/class/scope.carbon +++ b/toolchain/check/testdata/class/scope.carbon @@ -177,18 +177,15 @@ fn Run() { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc17_13.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method.b59] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc17_13.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc17_13.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc17_13.2: %i32 = converted %int_1, %.loc17_13.1 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: return %.loc17_13.2 +// CHECK:STDOUT: %.loc17: init %i32 = converted %int_1, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: return %.loc17 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.G() -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %F.ref: %Class.F.type = name_ref F, @Class.%Class.F.decl [concrete = constants.%Class.F] // CHECK:STDOUT: %Class.F.call: init %i32 = call %F.ref() -// CHECK:STDOUT: %.loc21_15.1: %i32 = value_of_initializer %Class.F.call -// CHECK:STDOUT: %.loc21_15.2: %i32 = converted %Class.F.call, %.loc21_15.1 -// CHECK:STDOUT: return %.loc21_15.2 +// CHECK:STDOUT: return %Class.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.as.Destroy.impl.Op(%self.param: %ptr.e71) = "no_op"; @@ -201,9 +198,8 @@ fn Run() { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc26_11.2: = bound_method %int_2, %specific_fn [concrete = constants.%bound_method.f6f] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc26_11.2(%int_2) [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc26_11.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc26_11.2: %i32 = converted %int_2, %.loc26_11.1 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: return %.loc26_11.2 +// CHECK:STDOUT: %.loc26: init %i32 = converted %int_2, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_2.ef8] +// CHECK:STDOUT: return %.loc26 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Run() { diff --git a/toolchain/check/testdata/class/self.carbon b/toolchain/check/testdata/class/self.carbon index ee1791089c64..f03f474c5d6f 100644 --- a/toolchain/check/testdata/class/self.carbon +++ b/toolchain/check/testdata/class/self.carbon @@ -54,6 +54,7 @@ class Class { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %Class.F.type: type = fn_type @Class.F [concrete] @@ -70,17 +71,31 @@ class Class { // CHECK:STDOUT: %Class.as.Destroy.impl.Op: %Class.as.Destroy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %i32} [concrete] // CHECK:STDOUT: %complete_type.54b: = complete_type_witness %struct_type.n [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -196,7 +211,12 @@ class Class { // CHECK:STDOUT: %n.ref: %Class.elem = name_ref n, @Class.%.loc8 [concrete = @Class.%.loc8] // CHECK:STDOUT: %.loc12_14.1: ref %i32 = class_element_access %self.ref, element0 // CHECK:STDOUT: %.loc12_14.2: %i32 = bind_value %.loc12_14.1 -// CHECK:STDOUT: return %.loc12_14.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc12_14.1: = bound_method %.loc12_14.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc12_14.2: = bound_method %.loc12_14.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc12_14.2(%.loc12_14.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return.loc11 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.G(%self.param.loc15: %ptr.e71) -> %i32 { @@ -206,7 +226,12 @@ class Class { // CHECK:STDOUT: %n.ref: %Class.elem = name_ref n, @Class.%.loc8 [concrete = @Class.%.loc8] // CHECK:STDOUT: %.loc16_17.1: ref %i32 = class_element_access %.loc16_11, element0 // CHECK:STDOUT: %.loc16_17.2: %i32 = bind_value %.loc16_17.1 -// CHECK:STDOUT: return %.loc16_17.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc16_17.1: = bound_method %.loc16_17.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc16_17.2: = bound_method %.loc16_17.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc16_17.2(%.loc16_17.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return.loc15 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.as.Destroy.impl.Op(%self.param: %ptr.e71) = "no_op"; diff --git a/toolchain/check/testdata/class/self_conversion.carbon b/toolchain/check/testdata/class/self_conversion.carbon index 6280b4d14c97..04a850a6b676 100644 --- a/toolchain/check/testdata/class/self_conversion.carbon +++ b/toolchain/check/testdata/class/self_conversion.carbon @@ -44,6 +44,7 @@ fn Call(p: Derived*) -> i32 { // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %i32 [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] @@ -70,6 +71,16 @@ fn Call(p: Derived*) -> i32 { // CHECK:STDOUT: %Derived.as.Destroy.impl.Op: %Derived.as.Destroy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: %struct_type.base.b1e: type = struct_type {.base: %Base} [concrete] // CHECK:STDOUT: %complete_type.15c: = complete_type_witness %struct_type.base.b1e [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] // CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] // CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] @@ -95,12 +106,16 @@ fn Call(p: Derived*) -> i32 { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] @@ -263,7 +278,12 @@ fn Call(p: Derived*) -> i32 { // CHECK:STDOUT: %a.ref: %Base.elem = name_ref a, @Base.%.loc16 [concrete = @Base.%.loc16] // CHECK:STDOUT: %.loc27_14.1: ref %i32 = class_element_access %self.ref, element0 // CHECK:STDOUT: %.loc27_14.2: %i32 = bind_value %.loc27_14.1 -// CHECK:STDOUT: return %.loc27_14.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc27_14.1: = bound_method %.loc27_14.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc27_14.2: = bound_method %.loc27_14.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc27_14.2(%.loc27_14.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return.loc26 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Derived.AddrSelfBase(%self.param.loc30: %ptr.11f) { @@ -305,8 +325,6 @@ fn Call(p: Derived*) -> i32 { // CHECK:STDOUT: %.loc36_11.3: ref %Base = converted %.loc36_11.1, %.loc36_11.2 // CHECK:STDOUT: %.loc36_11.4: %Base = bind_value %.loc36_11.3 // CHECK:STDOUT: %Derived.SelfBase.call: init %i32 = call %Derived.SelfBase.bound(%.loc36_11.4) -// CHECK:STDOUT: %.loc36_25.1: %i32 = value_of_initializer %Derived.SelfBase.call -// CHECK:STDOUT: %.loc36_25.2: %i32 = converted %Derived.SelfBase.call, %.loc36_25.1 -// CHECK:STDOUT: return %.loc36_25.2 +// CHECK:STDOUT: return %Derived.SelfBase.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/self_type.carbon b/toolchain/check/testdata/class/self_type.carbon index 14feadbae7e9..10cbef1a030f 100644 --- a/toolchain/check/testdata/class/self_type.carbon +++ b/toolchain/check/testdata/class/self_type.carbon @@ -74,7 +74,7 @@ fn Class.F[self: Self]() -> i32 { // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -168,9 +168,7 @@ fn Class.F[self: Self]() -> i32 { // CHECK:STDOUT: %Class.F.bound: = bound_method %.loc26_11.1, %F.ref // CHECK:STDOUT: %.loc26_11.2: %Class = bind_value %.loc26_11.1 // CHECK:STDOUT: %Class.F.call: init %i32 = call %Class.F.bound(%.loc26_11.2) -// CHECK:STDOUT: %.loc26_23.1: %i32 = value_of_initializer %Class.F.call -// CHECK:STDOUT: %.loc26_23.2: %i32 = converted %Class.F.call, %.loc26_23.1 -// CHECK:STDOUT: return %.loc26_23.2 +// CHECK:STDOUT: return %Class.F.call to %return.loc25 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.Make() -> %return.param: %Class { diff --git a/toolchain/check/testdata/class/static_method.carbon b/toolchain/check/testdata/class/static_method.carbon index fde2a14c5da0..733ac9d7131a 100644 --- a/toolchain/check/testdata/class/static_method.carbon +++ b/toolchain/check/testdata/class/static_method.carbon @@ -133,11 +133,9 @@ fn Run() -> i32 { // CHECK:STDOUT: %c.ref: ref %Class = name_ref c, %c // CHECK:STDOUT: %F.ref: %Class.F.type = name_ref F, @Class.%Class.F.decl [concrete = constants.%Class.F] // CHECK:STDOUT: %Class.F.call: init %i32 = call %F.ref() -// CHECK:STDOUT: %.loc21_15.1: %i32 = value_of_initializer %Class.F.call -// CHECK:STDOUT: %.loc21_15.2: %i32 = converted %Class.F.call, %.loc21_15.1 // CHECK:STDOUT: %Class.as.Destroy.impl.Op.bound: = bound_method %c.var, constants.%Class.as.Destroy.impl.Op // CHECK:STDOUT: %addr: %ptr.e71 = addr_of %c.var // CHECK:STDOUT: %Class.as.Destroy.impl.Op.call: init %empty_tuple.type = call %Class.as.Destroy.impl.Op.bound(%addr) -// CHECK:STDOUT: return %.loc21_15.2 +// CHECK:STDOUT: return %Class.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/const/basics.carbon b/toolchain/check/testdata/const/basics.carbon index 61e005b6f8bd..0c08a7c0b94c 100644 --- a/toolchain/check/testdata/const/basics.carbon +++ b/toolchain/check/testdata/const/basics.carbon @@ -71,14 +71,40 @@ fn G(p: const (const C)**) -> C** { // CHECK:STDOUT: %pattern_type.28c: type = pattern_type %ptr.564 [concrete] // CHECK:STDOUT: %A.type: type = fn_type @A [concrete] // CHECK:STDOUT: %A: %A.type = struct_value () [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %T.578: %Copy.type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %const.as.Copy.impl.Op.type.906: type = fn_type @const.as.Copy.impl.Op, @const.as.Copy.impl(%T.578) [symbolic] +// CHECK:STDOUT: %const.as.Copy.impl.Op.62b: %const.as.Copy.impl.Op.type.906 = struct_value () [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf: %ptr.as.Copy.impl.Op.type.f23 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.2e1: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%ptr.801) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.032: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%ptr.801) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.7ce: %ptr.as.Copy.impl.Op.type.032 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.c61: %Copy.type = facet_value %ptr.564, (%Copy.impl_witness.2e1) [concrete] +// CHECK:STDOUT: %.14c: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.c61 [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn.780: = specific_function %ptr.as.Copy.impl.Op.7ce, @ptr.as.Copy.impl.Op(%ptr.801) [concrete] // CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] // CHECK:STDOUT: %const.2b1: type = const_type %ptr.019 [concrete] // CHECK:STDOUT: %pattern_type.3a2: type = pattern_type %const.2b1 [concrete] // CHECK:STDOUT: %B.type: type = fn_type @B [concrete] // CHECK:STDOUT: %B: %B.type = struct_value () [concrete] +// CHECK:STDOUT: %Copy.impl_witness.a94: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%C) [concrete] +// CHECK:STDOUT: %Copy.facet.9a6: %Copy.type = facet_value %ptr.019, (%Copy.impl_witness.a94) [concrete] +// CHECK:STDOUT: %Copy.impl_witness.7fd: = impl_witness imports.%Copy.impl_witness_table.91e, @const.as.Copy.impl(%Copy.facet.9a6) [concrete] +// CHECK:STDOUT: %const.as.Copy.impl.Op.type.fbd: type = fn_type @const.as.Copy.impl.Op, @const.as.Copy.impl(%Copy.facet.9a6) [concrete] +// CHECK:STDOUT: %const.as.Copy.impl.Op.9a4: %const.as.Copy.impl.Op.type.fbd = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.b86: %Copy.type = facet_value %const.2b1, (%Copy.impl_witness.7fd) [concrete] +// CHECK:STDOUT: %.e4f: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.b86 [concrete] +// CHECK:STDOUT: %const.as.Copy.impl.Op.specific_fn: = specific_function %const.as.Copy.impl.Op.9a4, @const.as.Copy.impl.Op(%Copy.facet.9a6) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core.import_ref.7d6: @const.as.Copy.impl.%const.as.Copy.impl.Op.type (%const.as.Copy.impl.Op.type.906) = import_ref Core//prelude/parts/copy, loc16_31, loaded [symbolic = @const.as.Copy.impl.%const.as.Copy.impl.Op (constants.%const.as.Copy.impl.Op.62b)] +// CHECK:STDOUT: %Copy.impl_witness_table.91e = impl_witness_table (%Core.import_ref.7d6), @const.as.Copy.impl [concrete] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -127,46 +153,71 @@ fn G(p: const (const C)**) -> C** { // CHECK:STDOUT: fn @A(%p.param: %ptr.564) -> %ptr.564 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %p.ref: %ptr.564 = name_ref p, %p -// CHECK:STDOUT: return %p.ref +// CHECK:STDOUT: %impl.elem0: %.14c = impl_witness_access constants.%Copy.impl_witness.2e1, element0 [concrete = constants.%ptr.as.Copy.impl.Op.7ce] +// CHECK:STDOUT: %bound_method.loc7_10.1: = bound_method %p.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @ptr.as.Copy.impl.Op(constants.%ptr.801) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn.780] +// CHECK:STDOUT: %bound_method.loc7_10.2: = bound_method %p.ref, %specific_fn +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.564 = call %bound_method.loc7_10.2(%p.ref) +// CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B(%p.param: %const.2b1) -> %const.2b1 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %p.ref: %const.2b1 = name_ref p, %p -// CHECK:STDOUT: return %p.ref +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value constants.%ptr.019, (constants.%Copy.impl_witness.a94) [concrete = constants.%Copy.facet.9a6] +// CHECK:STDOUT: %.loc11: %Copy.type = converted constants.%ptr.019, %Copy.facet [concrete = constants.%Copy.facet.9a6] +// CHECK:STDOUT: %impl.elem0: %.e4f = impl_witness_access constants.%Copy.impl_witness.7fd, element0 [concrete = constants.%const.as.Copy.impl.Op.9a4] +// CHECK:STDOUT: %bound_method.loc11_10.1: = bound_method %p.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @const.as.Copy.impl.Op(constants.%Copy.facet.9a6) [concrete = constants.%const.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc11_10.2: = bound_method %p.ref, %specific_fn +// CHECK:STDOUT: %const.as.Copy.impl.Op.call: init %const.2b1 = call %bound_method.loc11_10.2(%p.ref) +// CHECK:STDOUT: return %const.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- collapse.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %const: type = const_type %C [concrete] -// CHECK:STDOUT: %ptr.801: type = ptr_type %const [concrete] +// CHECK:STDOUT: %const.668: type = const_type %C [concrete] +// CHECK:STDOUT: %ptr.801: type = ptr_type %const.668 [concrete] // CHECK:STDOUT: %ptr.564: type = ptr_type %ptr.801 [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr.564 [concrete] +// CHECK:STDOUT: %pattern_type.28c: type = pattern_type %ptr.564 [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] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf: %ptr.as.Copy.impl.Op.type.f23 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.2e1: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%ptr.801) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.032: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%ptr.801) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.7ce: %ptr.as.Copy.impl.Op.type.032 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.c61: %Copy.type = facet_value %ptr.564, (%Copy.impl_witness.2e1) [concrete] +// CHECK:STDOUT: %.14c: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.c61 [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn: = specific_function %ptr.as.Copy.impl.Op.7ce, @ptr.as.Copy.impl.Op(%ptr.801) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { // CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %p.patt: %pattern_type = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %p.patt: %pattern_type.28c = binding_pattern p [concrete] +// CHECK:STDOUT: %p.param_patt: %pattern_type.28c = value_param_pattern %p.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.28c = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.28c = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %C.ref.loc11_36: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %const.loc11_30: type = const_type %C.ref.loc11_36 [concrete = constants.%const] -// CHECK:STDOUT: %const.loc11_23: type = const_type %const.loc11_30 [concrete = constants.%const] +// CHECK:STDOUT: %const.loc11_30: type = const_type %C.ref.loc11_36 [concrete = constants.%const.668] +// CHECK:STDOUT: %const.loc11_23: type = const_type %const.loc11_30 [concrete = constants.%const.668] // CHECK:STDOUT: %ptr.loc11_38: type = ptr_type %const.loc11_23 [concrete = constants.%ptr.801] // CHECK:STDOUT: %ptr.loc11_39: type = ptr_type %ptr.loc11_38 [concrete = constants.%ptr.564] // CHECK:STDOUT: %p.param: %ptr.564 = value_param call_param0 // CHECK:STDOUT: %.loc11: type = splice_block %ptr.loc11_17 [concrete = constants.%ptr.564] { // CHECK:STDOUT: %C.ref.loc11_15: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %const.loc11_9: type = const_type %C.ref.loc11_15 [concrete = constants.%const] +// CHECK:STDOUT: %const.loc11_9: type = const_type %C.ref.loc11_15 [concrete = constants.%const.668] // CHECK:STDOUT: %ptr.loc11_16: type = ptr_type %const.loc11_9 [concrete = constants.%ptr.801] // CHECK:STDOUT: %ptr.loc11_17: type = ptr_type %ptr.loc11_16 [concrete = constants.%ptr.564] // CHECK:STDOUT: } @@ -179,6 +230,11 @@ fn G(p: const (const C)**) -> C** { // CHECK:STDOUT: fn @F(%p.param: %ptr.564) -> %ptr.564 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %p.ref: %ptr.564 = name_ref p, %p -// CHECK:STDOUT: return %p.ref +// CHECK:STDOUT: %impl.elem0: %.14c = impl_witness_access constants.%Copy.impl_witness.2e1, element0 [concrete = constants.%ptr.as.Copy.impl.Op.7ce] +// CHECK:STDOUT: %bound_method.loc12_10.1: = bound_method %p.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @ptr.as.Copy.impl.Op(constants.%ptr.801) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc12_10.2: = bound_method %p.ref, %specific_fn +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.564 = call %bound_method.loc12_10.2(%p.ref) +// CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/const/import.carbon b/toolchain/check/testdata/const/import.carbon index 8daf72e878d2..d7d09714a932 100644 --- a/toolchain/check/testdata/const/import.carbon +++ b/toolchain/check/testdata/const/import.carbon @@ -35,34 +35,34 @@ var a_ptr: const C* = a_ptr_ref; // CHECK:STDOUT: constants { // CHECK:STDOUT: %C: type = class_type @C [concrete] // CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] // CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.782: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] // CHECK:STDOUT: %ptr.as.Copy.impl.Op.58c: %ptr.as.Copy.impl.Op.type.782 = struct_value () [symbolic] -// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] -// CHECK:STDOUT: %const: type = const_type %C [concrete] -// CHECK:STDOUT: %ptr.801: type = ptr_type %const [concrete] +// CHECK:STDOUT: %const.668: type = const_type %C [concrete] +// CHECK:STDOUT: %ptr.801: type = ptr_type %const.668 [concrete] // CHECK:STDOUT: %pattern_type.c0d: type = pattern_type %ptr.801 [concrete] -// CHECK:STDOUT: %pattern_type.6af: type = pattern_type %const [concrete] +// CHECK:STDOUT: %pattern_type.6af: type = pattern_type %const.668 [concrete] // CHECK:STDOUT: %addr: %ptr.801 = addr_of imports.%a_ref.var [concrete] -// CHECK:STDOUT: %Copy.impl_witness.141: = impl_witness imports.%Copy.impl_witness_table.3e8, @ptr.as.Copy.impl(%const) [concrete] -// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.e40: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%const) [concrete] +// CHECK:STDOUT: %Copy.impl_witness.141: = impl_witness imports.%Copy.impl_witness_table.3e8, @ptr.as.Copy.impl(%const.668) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.e40: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%const.668) [concrete] // CHECK:STDOUT: %ptr.as.Copy.impl.Op.b8d: %ptr.as.Copy.impl.Op.type.e40 = struct_value () [concrete] // CHECK:STDOUT: %Copy.facet.141: %Copy.type = facet_value %ptr.801, (%Copy.impl_witness.141) [concrete] // CHECK:STDOUT: %.3c7: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.141 [concrete] // CHECK:STDOUT: %ptr.as.Copy.impl.Op.bound: = bound_method %addr, %ptr.as.Copy.impl.Op.b8d [concrete] -// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn: = specific_function %ptr.as.Copy.impl.Op.b8d, @ptr.as.Copy.impl.Op(%const) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn: = specific_function %ptr.as.Copy.impl.Op.b8d, @ptr.as.Copy.impl.Op(%const.668) [concrete] // CHECK:STDOUT: %bound_method: = bound_method %addr, %ptr.as.Copy.impl.Op.specific_fn [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.C: type = import_ref Main//implicit, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.a_ref: ref %const = import_ref Main//implicit, a_ref, loaded [concrete = %a_ref.var] +// CHECK:STDOUT: %Main.a_ref: ref %const.668 = import_ref Main//implicit, a_ref, loaded [concrete = %a_ref.var] // CHECK:STDOUT: %Main.a_ptr_ref: ref %ptr.801 = import_ref Main//implicit, a_ptr_ref, loaded [concrete = %a_ptr_ref.var] -// CHECK:STDOUT: %Main.import_ref.e04: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.782) = import_ref Main//implicit, inst148 [indirect], loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.58c)] +// CHECK:STDOUT: %Main.import_ref.e04: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.782) = import_ref Main//implicit, inst195 [indirect], loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.58c)] // CHECK:STDOUT: %Copy.impl_witness_table.3e8 = impl_witness_table (%Main.import_ref.e04), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: %a_ref.patt: %pattern_type.6af = binding_pattern a_ref [concrete] // CHECK:STDOUT: %a_ref.var_patt: %pattern_type.6af = var_pattern %a_ref.patt [concrete] -// CHECK:STDOUT: %a_ref.var: ref %const = var %a_ref.var_patt [concrete] +// CHECK:STDOUT: %a_ref.var: ref %const.668 = var %a_ref.var_patt [concrete] // CHECK:STDOUT: %a_ptr_ref.patt: %pattern_type.c0d = binding_pattern a_ptr_ref [concrete] // CHECK:STDOUT: %a_ptr_ref.var_patt: %pattern_type.c0d = var_pattern %a_ptr_ref.patt [concrete] // CHECK:STDOUT: %a_ptr_ref.var: ref %ptr.801 = var %a_ptr_ref.var_patt [concrete] @@ -76,7 +76,7 @@ var a_ptr: const C* = a_ptr_ref; // CHECK:STDOUT: %a.var: ref %ptr.801 = var %a.var_patt [concrete] // CHECK:STDOUT: %.loc6: type = splice_block %ptr.loc6 [concrete = constants.%ptr.801] { // CHECK:STDOUT: %C.ref.loc6: type = name_ref C, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: %const.loc6: type = const_type %C.ref.loc6 [concrete = constants.%const] +// CHECK:STDOUT: %const.loc6: type = const_type %C.ref.loc6 [concrete = constants.%const.668] // CHECK:STDOUT: %ptr.loc6: type = ptr_type %const.loc6 [concrete = constants.%ptr.801] // CHECK:STDOUT: } // CHECK:STDOUT: %a: ref %ptr.801 = bind_name a, %a.var [concrete = %a.var] @@ -87,7 +87,7 @@ var a_ptr: const C* = a_ptr_ref; // CHECK:STDOUT: %a_ptr.var: ref %ptr.801 = var %a_ptr.var_patt [concrete] // CHECK:STDOUT: %.loc7: type = splice_block %ptr.loc7 [concrete = constants.%ptr.801] { // CHECK:STDOUT: %C.ref.loc7: type = name_ref C, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: %const.loc7: type = const_type %C.ref.loc7 [concrete = constants.%const] +// CHECK:STDOUT: %const.loc7: type = const_type %C.ref.loc7 [concrete = constants.%const.668] // CHECK:STDOUT: %ptr.loc7: type = ptr_type %const.loc7 [concrete = constants.%ptr.801] // CHECK:STDOUT: } // CHECK:STDOUT: %a_ptr: ref %ptr.801 = bind_name a_ptr, %a_ptr.var [concrete = %a_ptr.var] @@ -95,11 +95,11 @@ var a_ptr: const C* = a_ptr_ref; // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a_ref.ref: ref %const = name_ref a_ref, imports.%Main.a_ref [concrete = imports.%a_ref.var] +// CHECK:STDOUT: %a_ref.ref: ref %const.668 = name_ref a_ref, imports.%Main.a_ref [concrete = imports.%a_ref.var] // CHECK:STDOUT: %addr: %ptr.801 = addr_of %a_ref.ref [concrete = constants.%addr] // CHECK:STDOUT: %impl.elem0.loc6: %.3c7 = impl_witness_access constants.%Copy.impl_witness.141, element0 [concrete = constants.%ptr.as.Copy.impl.Op.b8d] // CHECK:STDOUT: %bound_method.loc6_19.1: = bound_method %addr, %impl.elem0.loc6 [concrete = constants.%ptr.as.Copy.impl.Op.bound] -// CHECK:STDOUT: %specific_fn.loc6: = specific_function %impl.elem0.loc6, @ptr.as.Copy.impl.Op(constants.%const) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %specific_fn.loc6: = specific_function %impl.elem0.loc6, @ptr.as.Copy.impl.Op(constants.%const.668) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc6_19.2: = bound_method %addr, %specific_fn.loc6 [concrete = constants.%bound_method] // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call.loc6: init %ptr.801 = call %bound_method.loc6_19.2(%addr) [concrete = constants.%addr] // CHECK:STDOUT: assign file.%a.var, %ptr.as.Copy.impl.Op.call.loc6 @@ -107,7 +107,7 @@ var a_ptr: const C* = a_ptr_ref; // CHECK:STDOUT: %.loc7: %ptr.801 = bind_value %a_ptr_ref.ref // CHECK:STDOUT: %impl.elem0.loc7: %.3c7 = impl_witness_access constants.%Copy.impl_witness.141, element0 [concrete = constants.%ptr.as.Copy.impl.Op.b8d] // CHECK:STDOUT: %bound_method.loc7_23.1: = bound_method %.loc7, %impl.elem0.loc7 -// CHECK:STDOUT: %specific_fn.loc7: = specific_function %impl.elem0.loc7, @ptr.as.Copy.impl.Op(constants.%const) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %specific_fn.loc7: = specific_function %impl.elem0.loc7, @ptr.as.Copy.impl.Op(constants.%const.668) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc7_23.2: = bound_method %.loc7, %specific_fn.loc7 // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call.loc7: init %ptr.801 = call %bound_method.loc7_23.2(%.loc7) // CHECK:STDOUT: assign file.%a_ptr.var, %ptr.as.Copy.impl.Op.call.loc7 diff --git a/toolchain/check/testdata/deduce/array.carbon b/toolchain/check/testdata/deduce/array.carbon index 64ee1ca40103..31aed506c6a8 100644 --- a/toolchain/check/testdata/deduce/array.carbon +++ b/toolchain/check/testdata/deduce/array.carbon @@ -18,7 +18,7 @@ library "[[@TEST_NAME]]"; class C {} -fn F[T:! type](a: array(T, 3)) -> T { return a[0]; } +fn F[T:! type](a: array(T, 3)) -> T { return F(a); } fn G() -> C { var a: array(C, 3) = ({}, {}, {}); @@ -57,7 +57,7 @@ library "[[@TEST_NAME]]"; class C {} -fn F[T:! type](a: array(T, 2)) -> T { return a[0]; } +fn F[T:! type](a: array(T, 2)) -> T { return F(a); } fn G() -> C { // TODO: We succeed at deducing T here but fail to convert. Is this the right behavior? @@ -69,7 +69,7 @@ fn G() -> C { // CHECK:STDERR: return F(a); // CHECK:STDERR: ^ // CHECK:STDERR: fail_bound_mismatch.carbon:[[@LINE-11]]:16: note: initializing function parameter [InCallToFunctionParam] - // CHECK:STDERR: fn F[T:! type](a: array(T, 2)) -> T { return a[0]; } + // CHECK:STDERR: fn F[T:! type](a: array(T, 2)) -> T { return F(a); } // CHECK:STDERR: ^~~~~~~~~~~~~~ // CHECK:STDERR: return F(a); @@ -146,32 +146,12 @@ fn G() -> i32 { // CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete] // CHECK:STDOUT: %array_type.743: type = array_type %int_3, %T [symbolic] // CHECK:STDOUT: %pattern_type.58b: type = pattern_type %array_type.743 [symbolic] -// CHECK:STDOUT: %pattern_type.7dcd0a.1: type = pattern_type %T [symbolic] +// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] // CHECK:STDOUT: %require_complete.06f: = require_complete_type %array_type.743 [symbolic] -// CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.e8c: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %ImplicitAs.Convert.type.1b6: type = fn_type @ImplicitAs.Convert, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%To) [symbolic] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.f01: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.acc: = impl_witness imports.%ImplicitAs.impl_witness_table.b6b, @Core.IntLiteral.as.ImplicitAs.impl(%int_32) [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.9ec: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%int_32) [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.592: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.9ec = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.e8c = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.acc) [concrete] -// CHECK:STDOUT: %.7ea: type = fn_type_with_self_type %ImplicitAs.Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.bound: = bound_method %int_0.5c6, %Core.IntLiteral.as.ImplicitAs.impl.Convert.592 [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.592, @Core.IntLiteral.as.ImplicitAs.impl.Convert(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_0.5c6, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_0.6a9: %i32 = int_value 0 [concrete] +// CHECK:STDOUT: %F.specific_fn.ef1: = specific_function %F, @F(%T) [symbolic] // CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] // CHECK:STDOUT: %G.type: type = fn_type @G [concrete] // CHECK:STDOUT: %G: %G.type = struct_value () [concrete] @@ -179,11 +159,12 @@ fn G() -> i32 { // CHECK:STDOUT: %ptr.301: type = ptr_type %array_type.002 [concrete] // CHECK:STDOUT: %pattern_type.a63: type = pattern_type %array_type.002 [concrete] // CHECK:STDOUT: %tuple.type.8d4: type = tuple_type (%empty_struct_type, %empty_struct_type, %empty_struct_type) [concrete] +// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete] // CHECK:STDOUT: %C.val: %C = struct_value () [concrete] // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete] // CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete] // CHECK:STDOUT: %array: %array_type.002 = tuple_value (%C.val, %C.val, %C.val) [concrete] -// CHECK:STDOUT: %F.specific_fn: = specific_function %F, @F(%C) [concrete] +// CHECK:STDOUT: %F.specific_fn.04a: = specific_function %F, @F(%C) [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.type.050: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%array_type.002) [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.7db: %T.as.Destroy.impl.Op.type.050 = struct_value () [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function %T.as.Destroy.impl.Op.7db, @T.as.Destroy.impl.Op(%array_type.002) [concrete] @@ -193,16 +174,10 @@ fn G() -> i32 { // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Destroy = %Core.Destroy -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -218,14 +193,14 @@ fn G() -> i32 { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: %a.patt: @F.%pattern_type.loc6_16 (%pattern_type.58b) = binding_pattern a [concrete] // CHECK:STDOUT: %a.param_patt: @F.%pattern_type.loc6_16 (%pattern_type.58b) = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @F.%pattern_type.loc6_32 (%pattern_type.7dcd0a.1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @F.%pattern_type.loc6_32 (%pattern_type.7dcd0a.1) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %return.patt: @F.%pattern_type.loc6_32 (%pattern_type.7dc) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @F.%pattern_type.loc6_32 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %T.ref.loc6_35: type = name_ref T, %T.loc6_6.2 [symbolic = %T.loc6_6.1 (constants.%T)] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] // CHECK:STDOUT: %T.loc6_6.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc6_6.1 (constants.%T)] // CHECK:STDOUT: %a.param: @F.%array_type.loc6_29.1 (%array_type.743) = value_param call_param0 -// CHECK:STDOUT: %.loc6_29: type = splice_block %array_type.loc6_29.2 [symbolic = %array_type.loc6_29.1 (constants.%array_type.743)] { +// CHECK:STDOUT: %.loc6: type = splice_block %array_type.loc6_29.2 [symbolic = %array_type.loc6_29.1 (constants.%array_type.743)] { // CHECK:STDOUT: %T.ref.loc6_25: type = name_ref T, %T.loc6_6.2 [symbolic = %T.loc6_6.1 (constants.%T)] // CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete = constants.%int_3] // CHECK:STDOUT: %array_type.loc6_29.2: type = array_type %int_3, %T.ref.loc6_25 [symbolic = %array_type.loc6_29.1 (constants.%array_type.743)] @@ -278,29 +253,20 @@ fn G() -> i32 { // CHECK:STDOUT: %T.loc6_6.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc6_6.1 (constants.%T)] // CHECK:STDOUT: %array_type.loc6_29.1: type = array_type constants.%int_3, %T.loc6_6.1 [symbolic = %array_type.loc6_29.1 (constants.%array_type.743)] // CHECK:STDOUT: %pattern_type.loc6_16: type = pattern_type %array_type.loc6_29.1 [symbolic = %pattern_type.loc6_16 (constants.%pattern_type.58b)] -// CHECK:STDOUT: %pattern_type.loc6_32: type = pattern_type %T.loc6_6.1 [symbolic = %pattern_type.loc6_32 (constants.%pattern_type.7dcd0a.1)] +// CHECK:STDOUT: %pattern_type.loc6_32: type = pattern_type %T.loc6_6.1 [symbolic = %pattern_type.loc6_32 (constants.%pattern_type.7dc)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete.loc6_32: = require_complete_type %T.loc6_6.1 [symbolic = %require_complete.loc6_32 (constants.%require_complete.4ae)] // CHECK:STDOUT: %require_complete.loc6_17: = require_complete_type %array_type.loc6_29.1 [symbolic = %require_complete.loc6_17 (constants.%require_complete.06f)] +// CHECK:STDOUT: %F.specific_fn.loc6_46.2: = specific_function constants.%F, @F(%T.loc6_6.1) [symbolic = %F.specific_fn.loc6_46.2 (constants.%F.specific_fn.ef1)] // CHECK:STDOUT: // CHECK:STDOUT: fn(%a.param: @F.%array_type.loc6_29.1 (%array_type.743)) -> @F.%T.loc6_6.1 (%T) { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F] // CHECK:STDOUT: %a.ref: @F.%array_type.loc6_29.1 (%array_type.743) = name_ref a, %a -// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %impl.elem0: %.7ea = impl_witness_access constants.%ImplicitAs.impl_witness.acc, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.592] -// CHECK:STDOUT: %bound_method.loc6_48.1: = bound_method %int_0, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc6_48.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc6_48.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc6_48.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc6_48.2: %i32 = converted %int_0, %.loc6_48.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc6_49.1: ref @F.%array_type.loc6_29.1 (%array_type.743) = value_as_ref %a.ref -// CHECK:STDOUT: %.loc6_49.2: ref @F.%T.loc6_6.1 (%T) = array_index %.loc6_49.1, %.loc6_48.2 -// CHECK:STDOUT: %.loc6_49.3: @F.%T.loc6_6.1 (%T) = bind_value %.loc6_49.2 -// CHECK:STDOUT: return %.loc6_49.3 +// CHECK:STDOUT: %F.specific_fn.loc6_46.1: = specific_function %F.ref, @F(constants.%T) [symbolic = %F.specific_fn.loc6_46.2 (constants.%F.specific_fn.ef1)] +// CHECK:STDOUT: %F.call: init @F.%T.loc6_6.1 (%T) = call %F.specific_fn.loc6_46.1(%a.ref) +// CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -315,7 +281,7 @@ fn G() -> i32 { // CHECK:STDOUT: %.loc9_30.1: %empty_struct_type = struct_literal () // CHECK:STDOUT: %.loc9_34.1: %empty_struct_type = struct_literal () // CHECK:STDOUT: %.loc9_35.1: %tuple.type.8d4 = tuple_literal (%.loc9_26.1, %.loc9_30.1, %.loc9_34.1) -// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6] +// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0] // CHECK:STDOUT: %.loc9_35.2: ref %C = array_index %a.var, %int_0 // CHECK:STDOUT: %.loc9_26.2: init %C = class_init (), %.loc9_35.2 [concrete = constants.%C.val] // CHECK:STDOUT: %.loc9_35.3: init %C = converted %.loc9_26.1, %.loc9_26.2 [concrete = constants.%C.val] @@ -338,7 +304,7 @@ fn G() -> i32 { // CHECK:STDOUT: %a: ref %array_type.002 = bind_name a, %a.var // CHECK:STDOUT: %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F] // CHECK:STDOUT: %a.ref: ref %array_type.002 = name_ref a, %a -// CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%C) [concrete = constants.%F.specific_fn] +// CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%C) [concrete = constants.%F.specific_fn.04a] // CHECK:STDOUT: %.loc8: ref %C = splice_block %return {} // CHECK:STDOUT: %.loc10: %array_type.002 = bind_value %a.ref // CHECK:STDOUT: %F.call: init %C = call %F.specific_fn(%.loc10) to %.loc8 @@ -354,7 +320,12 @@ fn G() -> i32 { // CHECK:STDOUT: %T.loc6_6.1 => constants.%T // CHECK:STDOUT: %array_type.loc6_29.1 => constants.%array_type.743 // CHECK:STDOUT: %pattern_type.loc6_16 => constants.%pattern_type.58b -// CHECK:STDOUT: %pattern_type.loc6_32 => constants.%pattern_type.7dcd0a.1 +// CHECK:STDOUT: %pattern_type.loc6_32 => constants.%pattern_type.7dc +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete.loc6_32 => constants.%require_complete.4ae +// CHECK:STDOUT: %require_complete.loc6_17 => constants.%require_complete.06f +// CHECK:STDOUT: %F.specific_fn.loc6_46.2 => constants.%F.specific_fn.ef1 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%C) { @@ -366,6 +337,7 @@ fn G() -> i32 { // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete.loc6_32 => constants.%complete_type.357 // CHECK:STDOUT: %require_complete.loc6_17 => constants.%complete_type.dd1 +// CHECK:STDOUT: %F.specific_fn.loc6_46.2 => constants.%F.specific_fn.04a // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- bound_only.carbon @@ -550,9 +522,8 @@ fn G() -> i32 { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc6_62.2: = bound_method %N.ref.loc6_61, %specific_fn [symbolic = %bound_method.loc6_62.3 (constants.%bound_method.1b6)] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc6_62.1: init %i32 = call %bound_method.loc6_62.2(%N.ref.loc6_61) [symbolic = %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc6_62.2 (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.call)] -// CHECK:STDOUT: %.loc6_62.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc6_62.1 [symbolic = %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc6_62.2 (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.call)] -// CHECK:STDOUT: %.loc6_62.2: %i32 = converted %N.ref.loc6_61, %.loc6_62.1 [symbolic = %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc6_62.2 (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.call)] -// CHECK:STDOUT: return %.loc6_62.2 +// CHECK:STDOUT: %.loc6_62: init %i32 = converted %N.ref.loc6_61, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc6_62.1 [symbolic = %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc6_62.2 (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.call)] +// CHECK:STDOUT: return %.loc6_62 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -591,16 +562,14 @@ fn G() -> i32 { // CHECK:STDOUT: %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F] // CHECK:STDOUT: %a.ref: ref %array_type.002 = name_ref a, %a // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%int_3.1ba) [concrete = constants.%F.specific_fn] -// CHECK:STDOUT: %.loc10_12: %array_type.002 = bind_value %a.ref -// CHECK:STDOUT: %F.call: init %i32 = call %F.specific_fn(%.loc10_12) -// CHECK:STDOUT: %.loc10_14.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc10_14.2: %i32 = converted %F.call, %.loc10_14.1 +// CHECK:STDOUT: %.loc10: %array_type.002 = bind_value %a.ref +// CHECK:STDOUT: %F.call: init %i32 = call %F.specific_fn(%.loc10) // CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %a.var, constants.%T.as.Destroy.impl.Op.7db // CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function constants.%T.as.Destroy.impl.Op.7db, @T.as.Destroy.impl.Op(constants.%array_type.002) [concrete = constants.%T.as.Destroy.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method: = bound_method %a.var, %T.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr: %ptr.301 = addr_of %a.var // CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method(%addr) -// CHECK:STDOUT: return %.loc10_14.2 +// CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%N) { @@ -848,27 +817,7 @@ fn G() -> i32 { // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] // CHECK:STDOUT: %require_complete.d11: = require_complete_type %array_type.9d4 [symbolic] -// CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.e8c: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %ImplicitAs.Convert.type.1b6: type = fn_type @ImplicitAs.Convert, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%To) [symbolic] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.f01: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.acc: = impl_witness imports.%ImplicitAs.impl_witness_table.b6b, @Core.IntLiteral.as.ImplicitAs.impl(%int_32) [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.9ec: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%int_32) [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.592: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.9ec = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.e8c = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.acc) [concrete] -// CHECK:STDOUT: %.7ea: type = fn_type_with_self_type %ImplicitAs.Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.bound: = bound_method %int_0.5c6, %Core.IntLiteral.as.ImplicitAs.impl.Convert.592 [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.592, @Core.IntLiteral.as.ImplicitAs.impl.Convert(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_0.5c6, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_0.6a9: %i32 = int_value 0 [concrete] +// CHECK:STDOUT: %F.specific_fn.ef1: = specific_function %F, @F(%T) [symbolic] // CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] // CHECK:STDOUT: %G.type: type = fn_type @G [concrete] // CHECK:STDOUT: %G: %G.type = struct_value () [concrete] @@ -877,12 +826,15 @@ fn G() -> i32 { // CHECK:STDOUT: %ptr.301: type = ptr_type %array_type.002 [concrete] // CHECK:STDOUT: %pattern_type.a63: type = pattern_type %array_type.002 [concrete] // CHECK:STDOUT: %tuple.type.8d4: type = tuple_type (%empty_struct_type, %empty_struct_type, %empty_struct_type) [concrete] +// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete] // CHECK:STDOUT: %C.val: %C = struct_value () [concrete] // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete] // CHECK:STDOUT: %array: %array_type.002 = tuple_value (%C.val, %C.val, %C.val) [concrete] // CHECK:STDOUT: %array_type.15a: type = array_type %int_2, %C [concrete] // CHECK:STDOUT: %pattern_type.114: type = pattern_type %array_type.15a [concrete] -// CHECK:STDOUT: %F.specific_fn: = specific_function %F, @F(%C) [concrete] +// CHECK:STDOUT: %F.specific_fn.04a: = specific_function %F, @F(%C) [concrete] +// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] +// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.type.050: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%array_type.002) [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.7db: %T.as.Destroy.impl.Op.type.050 = struct_value () [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function %T.as.Destroy.impl.Op.7db, @T.as.Destroy.impl.Op(%array_type.002) [concrete] @@ -892,16 +844,12 @@ fn G() -> i32 { // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Destroy = %Core.Destroy -// CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -924,7 +872,7 @@ fn G() -> i32 { // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] // CHECK:STDOUT: %T.loc6_6.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc6_6.1 (constants.%T)] // CHECK:STDOUT: %a.param: @F.%array_type.loc6_29.1 (%array_type.9d4) = value_param call_param0 -// CHECK:STDOUT: %.loc6_29: type = splice_block %array_type.loc6_29.2 [symbolic = %array_type.loc6_29.1 (constants.%array_type.9d4)] { +// CHECK:STDOUT: %.loc6: type = splice_block %array_type.loc6_29.2 [symbolic = %array_type.loc6_29.1 (constants.%array_type.9d4)] { // CHECK:STDOUT: %T.ref.loc6_25: type = name_ref T, %T.loc6_6.2 [symbolic = %T.loc6_6.1 (constants.%T)] // CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete = constants.%int_2] // CHECK:STDOUT: %array_type.loc6_29.2: type = array_type %int_2, %T.ref.loc6_25 [symbolic = %array_type.loc6_29.1 (constants.%array_type.9d4)] @@ -982,24 +930,15 @@ fn G() -> i32 { // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete.loc6_32: = require_complete_type %T.loc6_6.1 [symbolic = %require_complete.loc6_32 (constants.%require_complete.4ae)] // CHECK:STDOUT: %require_complete.loc6_17: = require_complete_type %array_type.loc6_29.1 [symbolic = %require_complete.loc6_17 (constants.%require_complete.d11)] +// CHECK:STDOUT: %F.specific_fn.loc6_46.2: = specific_function constants.%F, @F(%T.loc6_6.1) [symbolic = %F.specific_fn.loc6_46.2 (constants.%F.specific_fn.ef1)] // CHECK:STDOUT: // CHECK:STDOUT: fn(%a.param: @F.%array_type.loc6_29.1 (%array_type.9d4)) -> @F.%T.loc6_6.1 (%T) { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F] // CHECK:STDOUT: %a.ref: @F.%array_type.loc6_29.1 (%array_type.9d4) = name_ref a, %a -// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %impl.elem0: %.7ea = impl_witness_access constants.%ImplicitAs.impl_witness.acc, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.592] -// CHECK:STDOUT: %bound_method.loc6_48.1: = bound_method %int_0, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc6_48.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc6_48.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc6_48.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc6_48.2: %i32 = converted %int_0, %.loc6_48.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc6_49.1: ref @F.%array_type.loc6_29.1 (%array_type.9d4) = value_as_ref %a.ref -// CHECK:STDOUT: %.loc6_49.2: ref @F.%T.loc6_6.1 (%T) = array_index %.loc6_49.1, %.loc6_48.2 -// CHECK:STDOUT: %.loc6_49.3: @F.%T.loc6_6.1 (%T) = bind_value %.loc6_49.2 -// CHECK:STDOUT: return %.loc6_49.3 +// CHECK:STDOUT: %F.specific_fn.loc6_46.1: = specific_function %F.ref, @F(constants.%T) [symbolic = %F.specific_fn.loc6_46.2 (constants.%F.specific_fn.ef1)] +// CHECK:STDOUT: %F.call: init @F.%T.loc6_6.1 (%T) = call %F.specific_fn.loc6_46.1(%a.ref) +// CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1014,7 +953,7 @@ fn G() -> i32 { // CHECK:STDOUT: %.loc10_30.1: %empty_struct_type = struct_literal () // CHECK:STDOUT: %.loc10_34.1: %empty_struct_type = struct_literal () // CHECK:STDOUT: %.loc10_35.1: %tuple.type.8d4 = tuple_literal (%.loc10_26.1, %.loc10_30.1, %.loc10_34.1) -// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6] +// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0] // CHECK:STDOUT: %.loc10_35.2: ref %C = array_index %a.var, %int_0 // CHECK:STDOUT: %.loc10_26.2: init %C = class_init (), %.loc10_35.2 [concrete = constants.%C.val] // CHECK:STDOUT: %.loc10_35.3: init %C = converted %.loc10_26.1, %.loc10_26.2 [concrete = constants.%C.val] @@ -1037,7 +976,7 @@ fn G() -> i32 { // CHECK:STDOUT: %a: ref %array_type.002 = bind_name a, %a.var // CHECK:STDOUT: %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F] // CHECK:STDOUT: %a.ref: ref %array_type.002 = name_ref a, %a -// CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%C) [concrete = constants.%F.specific_fn] +// CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%C) [concrete = constants.%F.specific_fn.04a] // CHECK:STDOUT: %.loc8: ref %C = splice_block %return {} // CHECK:STDOUT: %.loc21: %array_type.15a = converted %a.ref, [concrete = ] // CHECK:STDOUT: %F.call: init %C = call %F.specific_fn() to %.loc8 @@ -1054,6 +993,11 @@ fn G() -> i32 { // CHECK:STDOUT: %array_type.loc6_29.1 => constants.%array_type.9d4 // CHECK:STDOUT: %pattern_type.loc6_16 => constants.%pattern_type.a4c // CHECK:STDOUT: %pattern_type.loc6_32 => constants.%pattern_type.7dcd0a.1 +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete.loc6_32 => constants.%require_complete.4ae +// CHECK:STDOUT: %require_complete.loc6_17 => constants.%require_complete.d11 +// CHECK:STDOUT: %F.specific_fn.loc6_46.2 => constants.%F.specific_fn.ef1 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%C) { @@ -1065,6 +1009,7 @@ fn G() -> i32 { // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete.loc6_32 => constants.%complete_type.357 // CHECK:STDOUT: %require_complete.loc6_17 => constants.%complete_type.8eb +// CHECK:STDOUT: %F.specific_fn.loc6_46.2 => constants.%F.specific_fn.04a // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_type_mismatch.carbon @@ -1289,9 +1234,8 @@ fn G() -> i32 { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc7_62.2: = bound_method %N.ref.loc7_61, %specific_fn [symbolic = %bound_method.loc7_62.3 (constants.%bound_method.1b6)] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc7_62.1: init %i32 = call %bound_method.loc7_62.2(%N.ref.loc7_61) [symbolic = %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc7_62.2 (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.call)] -// CHECK:STDOUT: %.loc7_62.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc7_62.1 [symbolic = %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc7_62.2 (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.call)] -// CHECK:STDOUT: %.loc7_62.2: %i32 = converted %N.ref.loc7_61, %.loc7_62.1 [symbolic = %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc7_62.2 (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.call)] -// CHECK:STDOUT: return %.loc7_62.2 +// CHECK:STDOUT: %.loc7_62: init %i32 = converted %N.ref.loc7_61, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc7_62.1 [symbolic = %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc7_62.2 (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.call)] +// CHECK:STDOUT: return %.loc7_62 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1330,16 +1274,14 @@ fn G() -> i32 { // CHECK:STDOUT: %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F] // CHECK:STDOUT: %a.ref: ref %array_type.fe4 = name_ref a, %a // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%int_3.1ba) [concrete = constants.%F.specific_fn] -// CHECK:STDOUT: %.loc22_12: %array_type.002 = converted %a.ref, [concrete = ] +// CHECK:STDOUT: %.loc22: %array_type.002 = converted %a.ref, [concrete = ] // CHECK:STDOUT: %F.call: init %i32 = call %F.specific_fn() -// CHECK:STDOUT: %.loc22_14.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc22_14.2: %i32 = converted %F.call, %.loc22_14.1 // CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %a.var, constants.%T.as.Destroy.impl.Op.cbf // CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function constants.%T.as.Destroy.impl.Op.cbf, @T.as.Destroy.impl.Op(constants.%array_type.fe4) [concrete = constants.%T.as.Destroy.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method: = bound_method %a.var, %T.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr: %ptr.af6 = addr_of %a.var // CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method(%addr) -// CHECK:STDOUT: return %.loc22_14.2 +// CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%N) { @@ -1379,6 +1321,7 @@ fn G() -> i32 { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N.c80: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %N.51e: %i32 = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] @@ -1396,13 +1339,25 @@ fn G() -> i32 { // CHECK:STDOUT: %.2d1: type = fn_type_with_self_type %ImplicitAs.Convert.type.71e, %ImplicitAs.facet [concrete] // CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.bound: = bound_method %N.51e, %Int.as.ImplicitAs.impl.Convert.87c [symbolic] // CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Int.as.ImplicitAs.impl.Convert.87c, @Int.as.ImplicitAs.impl.Convert(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %N.51e, %Int.as.ImplicitAs.impl.Convert.specific_fn [symbolic] -// CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.call: init Core.IntLiteral = call %bound_method(%N.51e) [symbolic] +// CHECK:STDOUT: %bound_method.13b: = bound_method %N.51e, %Int.as.ImplicitAs.impl.Convert.specific_fn [symbolic] +// CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.call: init Core.IntLiteral = call %bound_method.13b(%N.51e) [symbolic] // CHECK:STDOUT: %array_type.379: type = array_type %Int.as.ImplicitAs.impl.Convert.call, %C [symbolic] // CHECK:STDOUT: %pattern_type.180: type = pattern_type %array_type.379 [symbolic] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete.80a: = require_complete_type %array_type.379 [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N.c80) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.bound: = bound_method %N.51e, %Int.as.Copy.impl.Op.87e [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] +// CHECK:STDOUT: %bound_method.d93: = bound_method %N.51e, %Int.as.Copy.impl.Op.specific_fn [symbolic] // CHECK:STDOUT: %G.type: type = fn_type @G [concrete] // CHECK:STDOUT: %G: %G.type = struct_value () [concrete] // CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete] @@ -1425,6 +1380,7 @@ fn G() -> i32 { // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } @@ -1433,6 +1389,9 @@ fn G() -> i32 { // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.02e: @Int.as.ImplicitAs.impl.%Int.as.ImplicitAs.impl.Convert.type (%Int.as.ImplicitAs.impl.Convert.type.eb9) = import_ref Core//prelude/parts/int, loc27_44, loaded [symbolic = @Int.as.ImplicitAs.impl.%Int.as.ImplicitAs.impl.Convert (constants.%Int.as.ImplicitAs.impl.Convert.958)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.13c = impl_witness_table (%Core.import_ref.02e), @Int.as.ImplicitAs.impl [concrete] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -1463,10 +1422,10 @@ fn G() -> i32 { // CHECK:STDOUT: %.loc6_28: type = splice_block %array_type.loc6_28.2 [symbolic = %array_type.loc6_28.1 (constants.%array_type.379)] { // CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] // CHECK:STDOUT: %N.ref.loc6_27: %i32 = name_ref N, %N.loc6_6.2 [symbolic = %N.loc6_6.1 (constants.%N.51e)] -// CHECK:STDOUT: %impl.elem0: %.2d1 = impl_witness_access constants.%ImplicitAs.impl_witness.6fb, element0 [concrete = constants.%Int.as.ImplicitAs.impl.Convert.87c] -// CHECK:STDOUT: %bound_method.loc6_27.2: = bound_method %N.ref.loc6_27, %impl.elem0 [symbolic = %Int.as.ImplicitAs.impl.Convert.bound (constants.%Int.as.ImplicitAs.impl.Convert.bound)] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Int.as.ImplicitAs.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc6_27.3: = bound_method %N.ref.loc6_27, %specific_fn [symbolic = %bound_method.loc6_27.1 (constants.%bound_method)] +// CHECK:STDOUT: %impl.elem0.loc6_27: %.2d1 = impl_witness_access constants.%ImplicitAs.impl_witness.6fb, element0 [concrete = constants.%Int.as.ImplicitAs.impl.Convert.87c] +// CHECK:STDOUT: %bound_method.loc6_27.2: = bound_method %N.ref.loc6_27, %impl.elem0.loc6_27 [symbolic = %Int.as.ImplicitAs.impl.Convert.bound (constants.%Int.as.ImplicitAs.impl.Convert.bound)] +// CHECK:STDOUT: %specific_fn.loc6_27: = specific_function %impl.elem0.loc6_27, @Int.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Int.as.ImplicitAs.impl.Convert.specific_fn] +// CHECK:STDOUT: %bound_method.loc6_27.3: = bound_method %N.ref.loc6_27, %specific_fn.loc6_27 [symbolic = %bound_method.loc6_27.1 (constants.%bound_method.13b)] // CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.call.loc6_27.2: init Core.IntLiteral = call %bound_method.loc6_27.3(%N.ref.loc6_27) [symbolic = %Int.as.ImplicitAs.impl.Convert.call.loc6_27.1 (constants.%Int.as.ImplicitAs.impl.Convert.call)] // CHECK:STDOUT: %.loc6_27.1: Core.IntLiteral = value_of_initializer %Int.as.ImplicitAs.impl.Convert.call.loc6_27.2 [symbolic = %Int.as.ImplicitAs.impl.Convert.call.loc6_27.1 (constants.%Int.as.ImplicitAs.impl.Convert.call)] // CHECK:STDOUT: %.loc6_27.2: Core.IntLiteral = converted %N.ref.loc6_27, %.loc6_27.1 [symbolic = %Int.as.ImplicitAs.impl.Convert.call.loc6_27.1 (constants.%Int.as.ImplicitAs.impl.Convert.call)] @@ -1520,18 +1479,25 @@ fn G() -> i32 { // CHECK:STDOUT: generic fn @F(%N.loc6_6.2: %i32) { // CHECK:STDOUT: %N.loc6_6.1: %i32 = bind_symbolic_name N, 0 [symbolic = %N.loc6_6.1 (constants.%N.51e)] // CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.bound: = bound_method %N.loc6_6.1, constants.%Int.as.ImplicitAs.impl.Convert.87c [symbolic = %Int.as.ImplicitAs.impl.Convert.bound (constants.%Int.as.ImplicitAs.impl.Convert.bound)] -// CHECK:STDOUT: %bound_method.loc6_27.1: = bound_method %N.loc6_6.1, constants.%Int.as.ImplicitAs.impl.Convert.specific_fn [symbolic = %bound_method.loc6_27.1 (constants.%bound_method)] +// CHECK:STDOUT: %bound_method.loc6_27.1: = bound_method %N.loc6_6.1, constants.%Int.as.ImplicitAs.impl.Convert.specific_fn [symbolic = %bound_method.loc6_27.1 (constants.%bound_method.13b)] // CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.call.loc6_27.1: init Core.IntLiteral = call %bound_method.loc6_27.1(%N.loc6_6.1) [symbolic = %Int.as.ImplicitAs.impl.Convert.call.loc6_27.1 (constants.%Int.as.ImplicitAs.impl.Convert.call)] // CHECK:STDOUT: %array_type.loc6_28.1: type = array_type %Int.as.ImplicitAs.impl.Convert.call.loc6_27.1, constants.%C [symbolic = %array_type.loc6_28.1 (constants.%array_type.379)] // CHECK:STDOUT: %pattern_type: type = pattern_type %array_type.loc6_28.1 [symbolic = %pattern_type (constants.%pattern_type.180)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %array_type.loc6_28.1 [symbolic = %require_complete (constants.%require_complete.80a)] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.bound: = bound_method %N.loc6_6.1, constants.%Int.as.Copy.impl.Op.87e [symbolic = %Int.as.Copy.impl.Op.bound (constants.%Int.as.Copy.impl.Op.bound)] +// CHECK:STDOUT: %bound_method.loc6_47.3: = bound_method %N.loc6_6.1, constants.%Int.as.Copy.impl.Op.specific_fn [symbolic = %bound_method.loc6_47.3 (constants.%bound_method.d93)] // CHECK:STDOUT: // CHECK:STDOUT: fn(%a.param: @F.%array_type.loc6_28.1 (%array_type.379)) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %N.ref.loc6_47: %i32 = name_ref N, %N.loc6_6.2 [symbolic = %N.loc6_6.1 (constants.%N.51e)] -// CHECK:STDOUT: return %N.ref.loc6_47 +// CHECK:STDOUT: %impl.elem0.loc6_47: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc6_47.1: = bound_method %N.ref.loc6_47, %impl.elem0.loc6_47 [symbolic = %Int.as.Copy.impl.Op.bound (constants.%Int.as.Copy.impl.Op.bound)] +// CHECK:STDOUT: %specific_fn.loc6_47: = specific_function %impl.elem0.loc6_47, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc6_47.2: = bound_method %N.ref.loc6_47, %specific_fn.loc6_47 [symbolic = %bound_method.loc6_47.3 (constants.%bound_method.d93)] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc6_47.2(%N.ref.loc6_47) [symbolic = %N.loc6_6.1 (constants.%N.51e)] +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1574,13 +1540,13 @@ fn G() -> i32 { // CHECK:STDOUT: %bound_method: = bound_method %a.var, %T.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr: %ptr.301 = addr_of %a.var // CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method(%addr) -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%N.51e) { // CHECK:STDOUT: %N.loc6_6.1 => constants.%N.51e // CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.bound => constants.%Int.as.ImplicitAs.impl.Convert.bound -// CHECK:STDOUT: %bound_method.loc6_27.1 => constants.%bound_method +// CHECK:STDOUT: %bound_method.loc6_27.1 => constants.%bound_method.13b // CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.call.loc6_27.1 => constants.%Int.as.ImplicitAs.impl.Convert.call // CHECK:STDOUT: %array_type.loc6_28.1 => constants.%array_type.379 // CHECK:STDOUT: %pattern_type => constants.%pattern_type.180 diff --git a/toolchain/check/testdata/deduce/generic_type.carbon b/toolchain/check/testdata/deduce/generic_type.carbon index 90b21654d508..d73f87d56214 100644 --- a/toolchain/check/testdata/deduce/generic_type.carbon +++ b/toolchain/check/testdata/deduce/generic_type.carbon @@ -145,7 +145,7 @@ fn G() -> i32 { // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] // CHECK:STDOUT: %T.loc7_6.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc7_6.1 (constants.%T)] // CHECK:STDOUT: %p.param: @F.%C.loc7_22.1 (%C.f2e) = value_param call_param0 -// CHECK:STDOUT: %.loc7_22: type = splice_block %C.loc7_22.2 [symbolic = %C.loc7_22.1 (constants.%C.f2e)] { +// CHECK:STDOUT: %.loc7: type = splice_block %C.loc7_22.2 [symbolic = %C.loc7_22.1 (constants.%C.f2e)] { // CHECK:STDOUT: %C.ref: %C.type = name_ref C, file.%C.decl [concrete = constants.%C.generic] // CHECK:STDOUT: %T.ref.loc7_21: type = name_ref T, %T.loc7_6.2 [symbolic = %T.loc7_6.1 (constants.%T)] // CHECK:STDOUT: %C.loc7_22.2: type = class_type @C, @C(constants.%T) [symbolic = %C.loc7_22.1 (constants.%C.f2e)] @@ -278,9 +278,7 @@ fn G() -> i32 { // CHECK:STDOUT: %p.ref: @F.%C.loc7_22.1 (%C.f2e) = name_ref p, %p // CHECK:STDOUT: %F.specific_fn.loc7_39.1: = specific_function %F.ref, @F(constants.%T) [symbolic = %F.specific_fn.loc7_39.2 (constants.%F.specific_fn.ef1)] // CHECK:STDOUT: %F.call: init @F.%T.loc7_6.1 (%T) = call %F.specific_fn.loc7_39.1(%p.ref) -// CHECK:STDOUT: %.loc7_43.1: @F.%T.loc7_6.1 (%T) = value_of_initializer %F.call -// CHECK:STDOUT: %.loc7_43.2: @F.%T.loc7_6.1 (%T) = converted %F.call, %.loc7_43.1 -// CHECK:STDOUT: return %.loc7_43.2 +// CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1080,6 +1078,7 @@ fn G() -> i32 { // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N.c80: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %N.51e: %i32 = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] @@ -1099,6 +1098,18 @@ fn G() -> i32 { // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete.9c5: = require_complete_type %WithNontype.8a6 [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N.c80) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.bound.908: = bound_method %N.51e, %Int.as.Copy.impl.Op.87e [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] +// CHECK:STDOUT: %bound_method.d93: = bound_method %N.51e, %Int.as.Copy.impl.Op.specific_fn [symbolic] // CHECK:STDOUT: %G.type: type = fn_type @G [concrete] // CHECK:STDOUT: %G: %G.type = struct_value () [concrete] // CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete] @@ -1116,7 +1127,7 @@ fn G() -> i32 { // CHECK:STDOUT: %.7ea: type = fn_type_with_self_type %ImplicitAs.Convert.type.1b6, %ImplicitAs.facet [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.bound: = bound_method %int_0.5c6, %Core.IntLiteral.as.ImplicitAs.impl.Convert.592 [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.592, @Core.IntLiteral.as.ImplicitAs.impl.Convert(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_0.5c6, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] +// CHECK:STDOUT: %bound_method.698: = bound_method %int_0.5c6, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %int_0.6a9: %i32 = int_value 0 [concrete] // CHECK:STDOUT: %WithNontype.b82: type = class_type @WithNontype, @WithNontype(%int_0.6a9) [concrete] // CHECK:STDOUT: %WithNontype.val: %WithNontype.b82 = struct_value () [concrete] @@ -1128,18 +1139,24 @@ fn G() -> i32 { // CHECK:STDOUT: %ptr.791: type = ptr_type %WithNontype.b82 [concrete] // CHECK:STDOUT: %pattern_type.7a7: type = pattern_type %ptr.791 [concrete] // CHECK:STDOUT: %WithNontype.as.Destroy.impl.Op.specific_fn: = specific_function %WithNontype.as.Destroy.impl.Op.de0, @WithNontype.as.Destroy.impl.Op(%int_0.6a9) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.bound.65d: = bound_method %int_0.6a9, %Int.as.Copy.impl.Op.87e [concrete] +// CHECK:STDOUT: %bound_method.06d: = bound_method %int_0.6a9, %Int.as.Copy.impl.Op.specific_fn [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] @@ -1264,11 +1281,18 @@ fn G() -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %WithNontype.loc6_31.1 [symbolic = %require_complete (constants.%require_complete.9c5)] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.bound: = bound_method %N.loc6_6.1, constants.%Int.as.Copy.impl.Op.87e [symbolic = %Int.as.Copy.impl.Op.bound (constants.%Int.as.Copy.impl.Op.bound.908)] +// CHECK:STDOUT: %bound_method.loc6_50.3: = bound_method %N.loc6_6.1, constants.%Int.as.Copy.impl.Op.specific_fn [symbolic = %bound_method.loc6_50.3 (constants.%bound_method.d93)] // CHECK:STDOUT: // CHECK:STDOUT: fn(%x.param: @F.%WithNontype.loc6_31.1 (%WithNontype.8a6)) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %N.ref.loc6_50: %i32 = name_ref N, %N.loc6_6.2 [symbolic = %N.loc6_6.1 (constants.%N.51e)] -// CHECK:STDOUT: return %N.ref.loc6_50 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc6_50.1: = bound_method %N.ref.loc6_50, %impl.elem0 [symbolic = %Int.as.Copy.impl.Op.bound (constants.%Int.as.Copy.impl.Op.bound.908)] +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc6_50.2: = bound_method %N.ref.loc6_50, %specific_fn [symbolic = %bound_method.loc6_50.3 (constants.%bound_method.d93)] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc6_50.2(%N.ref.loc6_50) [symbolic = %N.loc6_6.1 (constants.%N.51e)] +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1281,7 +1305,7 @@ fn G() -> i32 { // CHECK:STDOUT: %impl.elem0: %.7ea = impl_witness_access constants.%ImplicitAs.impl_witness.acc, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.592] // CHECK:STDOUT: %bound_method.loc9_31.1: = bound_method %int_0, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc9_31.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method] +// CHECK:STDOUT: %bound_method.loc9_31.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method.698] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc9_31.2(%int_0) [concrete = constants.%int_0.6a9] // CHECK:STDOUT: %.loc9_31.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] // CHECK:STDOUT: %.loc9_31.2: %i32 = converted %int_0, %.loc9_31.1 [concrete = constants.%int_0.6a9] @@ -1293,14 +1317,12 @@ fn G() -> i32 { // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%int_0.6a9) [concrete = constants.%F.specific_fn] // CHECK:STDOUT: %.loc9_15.2: %WithNontype.b82 = bind_value %.loc9_15.1 // CHECK:STDOUT: %F.call: init %i32 = call %F.specific_fn(%.loc9_15.2) -// CHECK:STDOUT: %.loc9_33.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc9_33.2: %i32 = converted %F.call, %.loc9_33.1 // CHECK:STDOUT: %WithNontype.as.Destroy.impl.Op.bound: = bound_method %.loc9_13.4, constants.%WithNontype.as.Destroy.impl.Op.de0 // CHECK:STDOUT: %WithNontype.as.Destroy.impl.Op.specific_fn: = specific_function constants.%WithNontype.as.Destroy.impl.Op.de0, @WithNontype.as.Destroy.impl.Op(constants.%int_0.6a9) [concrete = constants.%WithNontype.as.Destroy.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc9_13: = bound_method %.loc9_13.4, %WithNontype.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr: %ptr.791 = addr_of %.loc9_13.4 // CHECK:STDOUT: %WithNontype.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc9_13(%addr) -// CHECK:STDOUT: return %.loc9_33.2 +// CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @WithNontype(constants.%N.51e) { @@ -1341,6 +1363,8 @@ fn G() -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.357 +// CHECK:STDOUT: %Int.as.Copy.impl.Op.bound => constants.%Int.as.Copy.impl.Op.bound.65d +// CHECK:STDOUT: %bound_method.loc6_50.3 => constants.%bound_method.06d // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @WithNontype.as.Destroy.impl(constants.%int_0.6a9) { diff --git a/toolchain/check/testdata/deduce/int_float.carbon b/toolchain/check/testdata/deduce/int_float.carbon index e35b037859b6..1f0da23f99c2 100644 --- a/toolchain/check/testdata/deduce/int_float.carbon +++ b/toolchain/check/testdata/deduce/int_float.carbon @@ -52,6 +52,14 @@ fn G(a: f64) -> Core.IntLiteral() { // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete.b4f: = require_complete_type %Int [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.impl_witness.9a8: = impl_witness imports.%Copy.impl_witness_table.529 [concrete] +// CHECK:STDOUT: %Copy.facet.c98: %Copy.type = facet_value Core.IntLiteral, (%Copy.impl_witness.9a8) [concrete] +// CHECK:STDOUT: %.f07: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.c98 [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op.type: type = fn_type @Core.IntLiteral.as.Copy.impl.Op [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op: %Core.IntLiteral.as.Copy.impl.Op.type = struct_value () [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op.bound.2f8: = bound_method %N, %Core.IntLiteral.as.Copy.impl.Op [symbolic] // CHECK:STDOUT: %int_64: Core.IntLiteral = int_value 64 [concrete] // CHECK:STDOUT: %i64: type = class_type @Int, @Int(%int_64) [concrete] // CHECK:STDOUT: %pattern_type.95b: type = pattern_type %i64 [concrete] @@ -60,17 +68,22 @@ fn G(a: f64) -> Core.IntLiteral() { // CHECK:STDOUT: %i64.builtin: type = int_type signed, %int_64 [concrete] // CHECK:STDOUT: %complete_type.4a1: = complete_type_witness %i64.builtin [concrete] // CHECK:STDOUT: %F.specific_fn: = specific_function %F, @F(%int_64) [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op.bound.04a: = bound_method %int_64, %Core.IntLiteral.as.Copy.impl.Op [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .IntLiteral = %Core.IntLiteral // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.IntLiteral: %IntLiteral.type = import_ref Core//prelude/parts/int_literal, IntLiteral, loaded [concrete = constants.%IntLiteral] // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.cac: %Core.IntLiteral.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc32_31, loaded [concrete = constants.%Core.IntLiteral.as.Copy.impl.Op] +// CHECK:STDOUT: %Copy.impl_witness_table.529 = impl_witness_table (%Core.import_ref.cac), @Core.IntLiteral.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -141,11 +154,15 @@ fn G(a: f64) -> Core.IntLiteral() { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %Int.loc4_42.1 [symbolic = %require_complete (constants.%require_complete.b4f)] +// CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op.bound: = bound_method %N.loc4_6.1, constants.%Core.IntLiteral.as.Copy.impl.Op [symbolic = %Core.IntLiteral.as.Copy.impl.Op.bound (constants.%Core.IntLiteral.as.Copy.impl.Op.bound.2f8)] // CHECK:STDOUT: // CHECK:STDOUT: fn(%n.param: @F.%Int.loc4_42.1 (%Int)) -> Core.IntLiteral { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %N.ref.loc5: Core.IntLiteral = name_ref N, %N.loc4_6.2 [symbolic = %N.loc4_6.1 (constants.%N)] -// CHECK:STDOUT: return %N.ref.loc5 +// CHECK:STDOUT: %impl.elem0: %.f07 = impl_witness_access constants.%Copy.impl_witness.9a8, element0 [concrete = constants.%Core.IntLiteral.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %N.ref.loc5, %impl.elem0 [symbolic = %Core.IntLiteral.as.Copy.impl.Op.bound (constants.%Core.IntLiteral.as.Copy.impl.Op.bound.2f8)] +// CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op.call: init Core.IntLiteral = call %bound_method(%N.ref.loc5) [symbolic = %N.loc4_6.1 (constants.%N)] +// CHECK:STDOUT: return %Core.IntLiteral.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -155,9 +172,7 @@ fn G(a: f64) -> Core.IntLiteral() { // CHECK:STDOUT: %a.ref: %i64 = name_ref a, %a // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%int_64) [concrete = constants.%F.specific_fn] // CHECK:STDOUT: %F.call: init Core.IntLiteral = call %F.specific_fn(%a.ref) -// CHECK:STDOUT: %.loc9_14.1: Core.IntLiteral = value_of_initializer %F.call -// CHECK:STDOUT: %.loc9_14.2: Core.IntLiteral = converted %F.call, %.loc9_14.1 -// CHECK:STDOUT: return %.loc9_14.2 +// CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%N) { @@ -173,6 +188,7 @@ fn G(a: f64) -> Core.IntLiteral() { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.4a1 +// CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op.bound => constants.%Core.IntLiteral.as.Copy.impl.Op.bound.04a // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- float.carbon @@ -191,6 +207,14 @@ fn G(a: f64) -> Core.IntLiteral() { // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete.957: = require_complete_type %Float [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.impl_witness.9a8: = impl_witness imports.%Copy.impl_witness_table.529 [concrete] +// CHECK:STDOUT: %Copy.facet.c98: %Copy.type = facet_value Core.IntLiteral, (%Copy.impl_witness.9a8) [concrete] +// CHECK:STDOUT: %.f07: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.c98 [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op.type: type = fn_type @Core.IntLiteral.as.Copy.impl.Op [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op: %Core.IntLiteral.as.Copy.impl.Op.type = struct_value () [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op.bound.2f8: = bound_method %N, %Core.IntLiteral.as.Copy.impl.Op [symbolic] // CHECK:STDOUT: %int_64: Core.IntLiteral = int_value 64 [concrete] // CHECK:STDOUT: %f64.d77: type = class_type @Float, @Float(%int_64) [concrete] // CHECK:STDOUT: %pattern_type.0ae: type = pattern_type %f64.d77 [concrete] @@ -199,17 +223,22 @@ fn G(a: f64) -> Core.IntLiteral() { // CHECK:STDOUT: %f64.794: type = float_type %int_64, f64 [concrete] // CHECK:STDOUT: %complete_type.7b9: = complete_type_witness %f64.794 [concrete] // CHECK:STDOUT: %F.specific_fn: = specific_function %F, @F(%int_64) [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op.bound.04a: = bound_method %int_64, %Core.IntLiteral.as.Copy.impl.Op [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .IntLiteral = %Core.IntLiteral // CHECK:STDOUT: .Float = %Core.Float +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.IntLiteral: %IntLiteral.type = import_ref Core//prelude/parts/int_literal, IntLiteral, loaded [concrete = constants.%IntLiteral] // CHECK:STDOUT: %Core.Float: %Float.type = import_ref Core//prelude/parts/float, Float, loaded [concrete = constants.%Float.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.cac: %Core.IntLiteral.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc32_31, loaded [concrete = constants.%Core.IntLiteral.as.Copy.impl.Op] +// CHECK:STDOUT: %Copy.impl_witness_table.529 = impl_witness_table (%Core.import_ref.cac), @Core.IntLiteral.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -280,11 +309,15 @@ fn G(a: f64) -> Core.IntLiteral() { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %Float.loc4_44.1 [symbolic = %require_complete (constants.%require_complete.957)] +// CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op.bound: = bound_method %N.loc4_6.1, constants.%Core.IntLiteral.as.Copy.impl.Op [symbolic = %Core.IntLiteral.as.Copy.impl.Op.bound (constants.%Core.IntLiteral.as.Copy.impl.Op.bound.2f8)] // CHECK:STDOUT: // CHECK:STDOUT: fn(%n.param: @F.%Float.loc4_44.1 (%Float)) -> Core.IntLiteral { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %N.ref.loc5: Core.IntLiteral = name_ref N, %N.loc4_6.2 [symbolic = %N.loc4_6.1 (constants.%N)] -// CHECK:STDOUT: return %N.ref.loc5 +// CHECK:STDOUT: %impl.elem0: %.f07 = impl_witness_access constants.%Copy.impl_witness.9a8, element0 [concrete = constants.%Core.IntLiteral.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %N.ref.loc5, %impl.elem0 [symbolic = %Core.IntLiteral.as.Copy.impl.Op.bound (constants.%Core.IntLiteral.as.Copy.impl.Op.bound.2f8)] +// CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op.call: init Core.IntLiteral = call %bound_method(%N.ref.loc5) [symbolic = %N.loc4_6.1 (constants.%N)] +// CHECK:STDOUT: return %Core.IntLiteral.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -294,9 +327,7 @@ fn G(a: f64) -> Core.IntLiteral() { // CHECK:STDOUT: %a.ref: %f64.d77 = name_ref a, %a // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%int_64) [concrete = constants.%F.specific_fn] // CHECK:STDOUT: %F.call: init Core.IntLiteral = call %F.specific_fn(%a.ref) -// CHECK:STDOUT: %.loc9_14.1: Core.IntLiteral = value_of_initializer %F.call -// CHECK:STDOUT: %.loc9_14.2: Core.IntLiteral = converted %F.call, %.loc9_14.1 -// CHECK:STDOUT: return %.loc9_14.2 +// CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%N) { @@ -312,5 +343,6 @@ fn G(a: f64) -> Core.IntLiteral() { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.7b9 +// CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op.bound => constants.%Core.IntLiteral.as.Copy.impl.Op.bound.04a // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/deduce/tuple.carbon b/toolchain/check/testdata/deduce/tuple.carbon index 56b7606cc443..ab03f7e2c10b 100644 --- a/toolchain/check/testdata/deduce/tuple.carbon +++ b/toolchain/check/testdata/deduce/tuple.carbon @@ -241,9 +241,7 @@ fn G(pair: (C, D)) -> D { // CHECK:STDOUT: %pair.ref: @F.%tuple.type (%tuple.type.30b) = name_ref pair, %pair // CHECK:STDOUT: %F.specific_fn.loc7_54.1: = specific_function %F.ref, @F(constants.%T, constants.%U) [symbolic = %F.specific_fn.loc7_54.2 (constants.%F.specific_fn.dd9)] // CHECK:STDOUT: %F.call: init @F.%U.loc7_16.1 (%U) = call %F.specific_fn.loc7_54.1(%pair.ref) -// CHECK:STDOUT: %.loc7_61.1: @F.%U.loc7_16.1 (%U) = value_of_initializer %F.call -// CHECK:STDOUT: %.loc7_61.2: @F.%U.loc7_16.1 (%U) = converted %F.call, %.loc7_61.1 -// CHECK:STDOUT: return %.loc7_61.2 +// CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -291,6 +289,7 @@ fn G(pair: (C, D)) -> D { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %tuple.type.24b: type = tuple_type (type, type) [concrete] // CHECK:STDOUT: %tuple.type.d07: type = tuple_type (%i32, %i32) [concrete] @@ -317,6 +316,18 @@ fn G(pair: (C, D)) -> D { // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete.6bc: = require_complete_type %HasPair.568 [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.bound.212: = bound_method %B, %Int.as.Copy.impl.Op.87e [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] +// CHECK:STDOUT: %bound_method.948: = bound_method %B, %Int.as.Copy.impl.Op.specific_fn [symbolic] // CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] // CHECK:STDOUT: %int_2.ecc: Core.IntLiteral = int_value 2 [concrete] // CHECK:STDOUT: %tuple.type.f94: type = tuple_type (Core.IntLiteral, Core.IntLiteral) [concrete] @@ -345,18 +356,24 @@ fn G(pair: (C, D)) -> D { // CHECK:STDOUT: %G.type: type = fn_type @G [concrete] // CHECK:STDOUT: %G: %G.type = struct_value () [concrete] // CHECK:STDOUT: %F.specific_fn: = specific_function %F, @F(%int_1.5d2, %int_2.ef8) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.bound.ec1: = bound_method %int_2.ef8, %Int.as.Copy.impl.Op.87e [concrete] +// CHECK:STDOUT: %bound_method.3b8: = bound_method %int_2.ef8, %Int.as.Copy.impl.Op.specific_fn [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] @@ -525,11 +542,18 @@ fn G(pair: (C, D)) -> D { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %HasPair.loc6_41.1 [symbolic = %require_complete (constants.%require_complete.6bc)] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.bound: = bound_method %B.loc6_15.1, constants.%Int.as.Copy.impl.Op.87e [symbolic = %Int.as.Copy.impl.Op.bound (constants.%Int.as.Copy.impl.Op.bound.212)] +// CHECK:STDOUT: %bound_method.loc6_60.3: = bound_method %B.loc6_15.1, constants.%Int.as.Copy.impl.Op.specific_fn [symbolic = %bound_method.loc6_60.3 (constants.%bound_method.948)] // CHECK:STDOUT: // CHECK:STDOUT: fn(%h.param: @F.%HasPair.loc6_41.1 (%HasPair.568)) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %B.ref.loc6_60: %i32 = name_ref B, %B.loc6_15.2 [symbolic = %B.loc6_15.1 (constants.%B)] -// CHECK:STDOUT: return %B.ref.loc6_60 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc6_60.1: = bound_method %B.ref.loc6_60, %impl.elem0 [symbolic = %Int.as.Copy.impl.Op.bound (constants.%Int.as.Copy.impl.Op.bound.212)] +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc6_60.2: = bound_method %B.ref.loc6_60, %specific_fn [symbolic = %bound_method.loc6_60.3 (constants.%bound_method.948)] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc6_60.2(%B.ref.loc6_60) [symbolic = %B.loc6_15.1 (constants.%B)] +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -539,9 +563,7 @@ fn G(pair: (C, D)) -> D { // CHECK:STDOUT: %h.ref: %HasPair.369 = name_ref h, %h // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%int_1.5d2, constants.%int_2.ef8) [concrete = constants.%F.specific_fn] // CHECK:STDOUT: %F.call: init %i32 = call %F.specific_fn(%h.ref) -// CHECK:STDOUT: %.loc9_14.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc9_14.2: %i32 = converted %F.call, %.loc9_14.1 -// CHECK:STDOUT: return %.loc9_14.2 +// CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HasPair(constants.%Pair) { @@ -590,6 +612,8 @@ fn G(pair: (C, D)) -> D { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.357 +// CHECK:STDOUT: %Int.as.Copy.impl.Op.bound => constants.%Int.as.Copy.impl.Op.bound.ec1 +// CHECK:STDOUT: %bound_method.loc6_60.3 => constants.%bound_method.3b8 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_inconsistent.carbon diff --git a/toolchain/check/testdata/deduce/type_operator.carbon b/toolchain/check/testdata/deduce/type_operator.carbon index dbe68a4b140d..d621b4ebf8df 100644 --- a/toolchain/check/testdata/deduce/type_operator.carbon +++ b/toolchain/check/testdata/deduce/type_operator.carbon @@ -128,7 +128,7 @@ fn G(p: C*) -> const C { // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] // CHECK:STDOUT: %T.loc6_6.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc6_6.1 (constants.%T)] // CHECK:STDOUT: %p.param: @F.%ptr.loc6_20.1 (%ptr.79f) = value_param call_param0 -// CHECK:STDOUT: %.loc6_20: type = splice_block %ptr.loc6_20.2 [symbolic = %ptr.loc6_20.1 (constants.%ptr.79f)] { +// CHECK:STDOUT: %.loc6: type = splice_block %ptr.loc6_20.2 [symbolic = %ptr.loc6_20.1 (constants.%ptr.79f)] { // CHECK:STDOUT: %T.ref.loc6_19: type = name_ref T, %T.loc6_6.2 [symbolic = %T.loc6_6.1 (constants.%T)] // CHECK:STDOUT: %ptr.loc6_20.2: type = ptr_type %T.ref.loc6_19 [symbolic = %ptr.loc6_20.1 (constants.%ptr.79f)] // CHECK:STDOUT: } @@ -201,9 +201,7 @@ fn G(p: C*) -> const C { // CHECK:STDOUT: %p.ref: @F.%ptr.loc6_20.1 (%ptr.79f) = name_ref p, %p // CHECK:STDOUT: %F.specific_fn.loc6_37.1: = specific_function %F.ref, @F(constants.%T) [symbolic = %F.specific_fn.loc6_37.2 (constants.%F.specific_fn.ef1)] // CHECK:STDOUT: %F.call: init @F.%T.loc6_6.1 (%T) = call %F.specific_fn.loc6_37.1(%p.ref) -// CHECK:STDOUT: %.loc6_41.1: @F.%T.loc6_6.1 (%T) = value_of_initializer %F.call -// CHECK:STDOUT: %.loc6_41.2: @F.%T.loc6_6.1 (%T) = converted %F.call, %.loc6_41.1 -// CHECK:STDOUT: return %.loc6_41.2 +// CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -306,7 +304,7 @@ fn G(p: C*) -> const C { // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] // CHECK:STDOUT: %T.loc6_6.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc6_6.1 (constants.%T)] // CHECK:STDOUT: %p.param: @F.%ptr.loc6_26.1 (%ptr.6d4) = value_param call_param0 -// CHECK:STDOUT: %.loc6_26: type = splice_block %ptr.loc6_26.2 [symbolic = %ptr.loc6_26.1 (constants.%ptr.6d4)] { +// CHECK:STDOUT: %.loc6: type = splice_block %ptr.loc6_26.2 [symbolic = %ptr.loc6_26.1 (constants.%ptr.6d4)] { // CHECK:STDOUT: %T.ref.loc6_25: type = name_ref T, %T.loc6_6.2 [symbolic = %T.loc6_6.1 (constants.%T)] // CHECK:STDOUT: %const.loc6_19.2: type = const_type %T.ref.loc6_25 [symbolic = %const.loc6_19.1 (constants.%const.a1a)] // CHECK:STDOUT: %ptr.loc6_26.2: type = ptr_type %const.loc6_19.2 [symbolic = %ptr.loc6_26.1 (constants.%ptr.6d4)] @@ -382,9 +380,7 @@ fn G(p: C*) -> const C { // CHECK:STDOUT: %p.ref: @F.%ptr.loc6_26.1 (%ptr.6d4) = name_ref p, %p // CHECK:STDOUT: %F.specific_fn.loc6_43.1: = specific_function %F.ref, @F(constants.%T) [symbolic = %F.specific_fn.loc6_43.2 (constants.%F.specific_fn.ef1)] // CHECK:STDOUT: %F.call: init @F.%T.loc6_6.1 (%T) = call %F.specific_fn.loc6_43.1(%p.ref) -// CHECK:STDOUT: %.loc6_47.1: @F.%T.loc6_6.1 (%T) = value_of_initializer %F.call -// CHECK:STDOUT: %.loc6_47.2: @F.%T.loc6_6.1 (%T) = converted %F.call, %.loc6_47.1 -// CHECK:STDOUT: return %.loc6_47.2 +// CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -488,7 +484,7 @@ fn G(p: C*) -> const C { // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] // CHECK:STDOUT: %T.loc6_6.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc6_6.1 (constants.%T)] // CHECK:STDOUT: %p.param: @F.%ptr.loc6_20.1 (%ptr.79f) = value_param call_param0 -// CHECK:STDOUT: %.loc6_20: type = splice_block %ptr.loc6_20.2 [symbolic = %ptr.loc6_20.1 (constants.%ptr.79f)] { +// CHECK:STDOUT: %.loc6: type = splice_block %ptr.loc6_20.2 [symbolic = %ptr.loc6_20.1 (constants.%ptr.79f)] { // CHECK:STDOUT: %T.ref.loc6_19: type = name_ref T, %T.loc6_6.2 [symbolic = %T.loc6_6.1 (constants.%T)] // CHECK:STDOUT: %ptr.loc6_20.2: type = ptr_type %T.ref.loc6_19 [symbolic = %ptr.loc6_20.1 (constants.%ptr.79f)] // CHECK:STDOUT: } @@ -563,9 +559,7 @@ fn G(p: C*) -> const C { // CHECK:STDOUT: %p.ref: @F.%ptr.loc6_20.1 (%ptr.79f) = name_ref p, %p // CHECK:STDOUT: %F.specific_fn.loc6_37.1: = specific_function %F.ref, @F(constants.%T) [symbolic = %F.specific_fn.loc6_37.2 (constants.%F.specific_fn.ef1)] // CHECK:STDOUT: %F.call: init @F.%T.loc6_6.1 (%T) = call %F.specific_fn.loc6_37.1(%p.ref) -// CHECK:STDOUT: %.loc6_41.1: @F.%T.loc6_6.1 (%T) = value_of_initializer %F.call -// CHECK:STDOUT: %.loc6_41.2: @F.%T.loc6_6.1 (%T) = converted %F.call, %.loc6_41.1 -// CHECK:STDOUT: return %.loc6_41.2 +// CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -664,7 +658,7 @@ fn G(p: C*) -> const C { // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] // CHECK:STDOUT: %T.loc6_6.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc6_6.1 (constants.%T)] // CHECK:STDOUT: %p.param: @F.%ptr.loc6_26.1 (%ptr.6d4) = value_param call_param0 -// CHECK:STDOUT: %.loc6_26: type = splice_block %ptr.loc6_26.2 [symbolic = %ptr.loc6_26.1 (constants.%ptr.6d4)] { +// CHECK:STDOUT: %.loc6: type = splice_block %ptr.loc6_26.2 [symbolic = %ptr.loc6_26.1 (constants.%ptr.6d4)] { // CHECK:STDOUT: %T.ref.loc6_25: type = name_ref T, %T.loc6_6.2 [symbolic = %T.loc6_6.1 (constants.%T)] // CHECK:STDOUT: %const.loc6_19.2: type = const_type %T.ref.loc6_25 [symbolic = %const.loc6_19.1 (constants.%const.a1a)] // CHECK:STDOUT: %ptr.loc6_26.2: type = ptr_type %const.loc6_19.2 [symbolic = %ptr.loc6_26.1 (constants.%ptr.6d4)] @@ -740,9 +734,7 @@ fn G(p: C*) -> const C { // CHECK:STDOUT: %p.ref: @F.%ptr.loc6_26.1 (%ptr.6d4) = name_ref p, %p // CHECK:STDOUT: %F.specific_fn.loc6_43.1: = specific_function %F.ref, @F(constants.%T) [symbolic = %F.specific_fn.loc6_43.2 (constants.%F.specific_fn)] // CHECK:STDOUT: %F.call: init @F.%T.loc6_6.1 (%T) = call %F.specific_fn.loc6_43.1(%p.ref) -// CHECK:STDOUT: %.loc6_47.1: @F.%T.loc6_6.1 (%T) = value_of_initializer %F.call -// CHECK:STDOUT: %.loc6_47.2: @F.%T.loc6_6.1 (%T) = converted %F.call, %.loc6_47.1 -// CHECK:STDOUT: return %.loc6_47.2 +// CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/deduce/value_with_type_through_access.carbon b/toolchain/check/testdata/deduce/value_with_type_through_access.carbon index 6c1d8d2690f6..12108a14b8b6 100644 --- a/toolchain/check/testdata/deduce/value_with_type_through_access.carbon +++ b/toolchain/check/testdata/deduce/value_with_type_through_access.carbon @@ -798,7 +798,7 @@ fn G() { // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.7bd: %type.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc36_31, loaded [concrete = constants.%type.as.Copy.impl.Op] +// CHECK:STDOUT: %Core.import_ref.7bd: %type.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc40_31, loaded [concrete = constants.%type.as.Copy.impl.Op] // CHECK:STDOUT: %Copy.impl_witness_table.095 = impl_witness_table (%Core.import_ref.7bd), @type.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1169,7 +1169,7 @@ fn G() { // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.7bd: %type.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc36_31, loaded [concrete = constants.%type.as.Copy.impl.Op] +// CHECK:STDOUT: %Core.import_ref.7bd: %type.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc40_31, loaded [concrete = constants.%type.as.Copy.impl.Op] // CHECK:STDOUT: %Copy.impl_witness_table.095 = impl_witness_table (%Core.import_ref.7bd), @type.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/facet/access.carbon b/toolchain/check/testdata/facet/access.carbon index 9006c257388e..012b63562f9c 100644 --- a/toolchain/check/testdata/facet/access.carbon +++ b/toolchain/check/testdata/facet/access.carbon @@ -84,7 +84,7 @@ fn UseIndirect[T:! I](x: T) -> T { library "[[@TEST_NAME]]"; interface I { let T:! type; } -fn Id[U:! type](x: U) -> U { return x; } +fn Id[U:! type](x: U) -> U { return Id(x); } impl () as I where .T = () {} // Type of member expr is associated entity type, // but value is not constant. @@ -97,7 +97,7 @@ var v: ().(Id(I.T)); // --- fail_non_const_associated_in_interface.carbon library "[[@TEST_NAME]]"; -fn Id[U:! type](x: U) -> U { return x; } +fn Id[U:! type](x: U) -> U { return Id(x); } interface J { let T:! type; @@ -274,9 +274,7 @@ fn G(AB:! A & B where .X = () and .Y = {}) -> AB.Y { // CHECK:STDOUT: %impl.elem0.loc10_11.1: @Use.%.loc10_11.2 (%.7da) = impl_witness_access constants.%I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc10_11.2 (constants.%impl.elem0)] // CHECK:STDOUT: %specific_impl_fn.loc10_11.1: = specific_impl_function %impl.elem0.loc10_11.1, @I.Make(constants.%I.facet) [symbolic = %specific_impl_fn.loc10_11.2 (constants.%specific_impl_fn)] // CHECK:STDOUT: %.loc10_17: init @Use.%T.as_type.loc8_18.1 (%T.as_type) = call %specific_impl_fn.loc10_11.1() -// CHECK:STDOUT: %.loc10_18.1: @Use.%T.as_type.loc8_18.1 (%T.as_type) = value_of_initializer %.loc10_17 -// CHECK:STDOUT: %.loc10_18.2: @Use.%T.as_type.loc8_18.1 (%T.as_type) = converted %.loc10_17, %.loc10_18.1 -// CHECK:STDOUT: return %.loc10_18.2 +// CHECK:STDOUT: return %.loc10_17 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -362,9 +360,7 @@ fn G(AB:! A & B where .X = () and .Y = {}) -> AB.Y { // CHECK:STDOUT: %specific_impl_fn.loc10_11.1: = specific_impl_function %impl.elem0.loc10_11.1, @I.Copy(constants.%I.facet) [symbolic = %specific_impl_fn.loc10_11.2 (constants.%specific_impl_fn)] // CHECK:STDOUT: %bound_method.loc10_17: = bound_method %x.ref, %specific_impl_fn.loc10_11.1 // CHECK:STDOUT: %.loc10_17: init @Use.%T.as_type.loc9_18.1 (%T.as_type) = call %bound_method.loc10_17(%x.ref) -// CHECK:STDOUT: %.loc10_18.1: @Use.%T.as_type.loc9_18.1 (%T.as_type) = value_of_initializer %.loc10_17 -// CHECK:STDOUT: %.loc10_18.2: @Use.%T.as_type.loc9_18.1 (%T.as_type) = converted %.loc10_17, %.loc10_18.1 -// CHECK:STDOUT: return %.loc10_18.2 +// CHECK:STDOUT: return %.loc10_17 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -468,9 +464,7 @@ fn G(AB:! A & B where .X = () and .Y = {}) -> AB.Y { // CHECK:STDOUT: %specific_impl_fn.loc10_14.1: = specific_impl_function %impl.elem0.loc10_14.1, @I.Copy(constants.%I.facet) [symbolic = %specific_impl_fn.loc10_14.2 (constants.%specific_impl_fn)] // CHECK:STDOUT: %bound_method.loc10_21: = bound_method %x.ref, %specific_impl_fn.loc10_14.1 // CHECK:STDOUT: %.loc10_21: init @UseIndirect.%T.as_type.loc8_26.1 (%T.as_type) = call %bound_method.loc10_21(%x.ref) -// CHECK:STDOUT: %.loc10_22.1: @UseIndirect.%T.as_type.loc8_26.1 (%T.as_type) = value_of_initializer %.loc10_21 -// CHECK:STDOUT: %.loc10_22.2: @UseIndirect.%T.as_type.loc8_26.1 (%T.as_type) = converted %.loc10_21, %.loc10_22.1 -// CHECK:STDOUT: return %.loc10_22.2 +// CHECK:STDOUT: return %.loc10_21 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -547,10 +541,10 @@ fn G(AB:! A & B where .X = () and .Y = {}) -> AB.Y { // CHECK:STDOUT: // CHECK:STDOUT: fn() -> %empty_tuple.type { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc7_11: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc7_12: %empty_tuple.type = converted %.loc7_11, %empty_tuple [concrete = constants.%empty_tuple] -// CHECK:STDOUT: return %.loc7_12 +// CHECK:STDOUT: %.loc7_11.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc7_11.2: init %empty_tuple.type = tuple_init () to %return [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc7_12: init %empty_tuple.type = converted %.loc7_11.1, %.loc7_11.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc7_12 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -707,10 +701,10 @@ fn G(AB:! A & B where .X = () and .Y = {}) -> AB.Y { // CHECK:STDOUT: // CHECK:STDOUT: fn() -> %empty_tuple.type { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc15_11: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc15_12: %empty_tuple.type = converted %.loc15_11, %empty_tuple [concrete = constants.%empty_tuple] -// CHECK:STDOUT: return %.loc15_12 +// CHECK:STDOUT: %.loc15_11.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc15_11.2: init %empty_tuple.type = tuple_init () to %return [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc15_12: init %empty_tuple.type = converted %.loc15_11.1, %.loc15_11.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc15_12 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -723,10 +717,10 @@ fn G(AB:! A & B where .X = () and .Y = {}) -> AB.Y { // CHECK:STDOUT: // CHECK:STDOUT: fn() -> %empty_struct_type { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc19_11: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] -// CHECK:STDOUT: %.loc19_12: %empty_struct_type = converted %.loc19_11, %empty_struct [concrete = constants.%empty_struct] -// CHECK:STDOUT: return %.loc19_12 +// CHECK:STDOUT: %.loc19_11.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc19_11.2: init %empty_struct_type = struct_init () to %return [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc19_12: init %empty_struct_type = converted %.loc19_11.1, %.loc19_11.2 [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc19_12 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/facet/self_in_interface_param.carbon b/toolchain/check/testdata/facet/self_in_interface_param.carbon index 083bdcec9ba1..2d433defa6e1 100644 --- a/toolchain/check/testdata/facet/self_in_interface_param.carbon +++ b/toolchain/check/testdata/facet/self_in_interface_param.carbon @@ -97,10 +97,10 @@ fn G(_:! I(.Self) where .I1 = ()) {} // CHECK:STDOUT: // CHECK:STDOUT: fn() -> %empty_tuple.type { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc19_11: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc19_12: %empty_tuple.type = converted %.loc19_11, %empty_tuple [concrete = constants.%empty_tuple] -// CHECK:STDOUT: return %.loc19_12 +// CHECK:STDOUT: %.loc19_11.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc19_11.2: init %empty_tuple.type = tuple_init () to %return [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc19_12: init %empty_tuple.type = converted %.loc19_11.1, %.loc19_11.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc19_12 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/for/actual.carbon b/toolchain/check/testdata/for/actual.carbon index b79489b60333..b57437fa4e9c 100644 --- a/toolchain/check/testdata/for/actual.carbon +++ b/toolchain/check/testdata/for/actual.carbon @@ -554,6 +554,11 @@ fn Read() { // CHECK:STDOUT: %require_complete.loc10_22: = require_complete_type %IntRange [symbolic = %require_complete.loc10_22 (constants.%require_complete.524)] // CHECK:STDOUT: %IntRange.elem: type = unbound_element_type %IntRange, %Int.loc10_45.1 [symbolic = %IntRange.elem (constants.%IntRange.elem.e7c)] // CHECK:STDOUT: %require_complete.loc10_60: = require_complete_type %Int.loc10_45.1 [symbolic = %require_complete.loc10_60 (constants.%require_complete.b4f426.1)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %Int.loc10_45.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.ccc)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %Int.loc10_45.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.7d5)] +// CHECK:STDOUT: %.loc10_60.4: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc10_60.4 (constants.%.ba0)] +// CHECK:STDOUT: %impl.elem0.loc10_60.2: @IntRange.as.Iterate.impl.NewCursor.%.loc10_60.4 (%.ba0) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc10_60.2 (constants.%impl.elem0.13c)] +// CHECK:STDOUT: %specific_impl_fn.loc10_60.2: = specific_impl_function %impl.elem0.loc10_60.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc10_60.2 (constants.%specific_impl_fn.2ab)] // CHECK:STDOUT: // CHECK:STDOUT: fn(%self.param: @IntRange.as.Iterate.impl.NewCursor.%IntRange (%IntRange.349)) -> @IntRange.as.Iterate.impl.NewCursor.%Int.loc10_45.1 (%Int.49d0e6.1) { // CHECK:STDOUT: !entry: @@ -561,7 +566,12 @@ fn Read() { // CHECK:STDOUT: %start.ref: @IntRange.as.Iterate.impl.NewCursor.%IntRange.elem (%IntRange.elem.e7c) = name_ref start, @IntRange.%.loc22 [concrete = @IntRange.%.loc22] // CHECK:STDOUT: %.loc10_60.1: ref @IntRange.as.Iterate.impl.NewCursor.%Int.loc10_45.1 (%Int.49d0e6.1) = class_element_access %self.ref, element0 // CHECK:STDOUT: %.loc10_60.2: @IntRange.as.Iterate.impl.NewCursor.%Int.loc10_45.1 (%Int.49d0e6.1) = bind_value %.loc10_60.1 -// CHECK:STDOUT: return %.loc10_60.2 +// CHECK:STDOUT: %impl.elem0.loc10_60.1: @IntRange.as.Iterate.impl.NewCursor.%.loc10_60.4 (%.ba0) = impl_witness_access constants.%Copy.lookup_impl_witness.ccc, element0 [symbolic = %impl.elem0.loc10_60.2 (constants.%impl.elem0.13c)] +// CHECK:STDOUT: %bound_method.loc10_60.1: = bound_method %.loc10_60.2, %impl.elem0.loc10_60.1 +// CHECK:STDOUT: %specific_impl_fn.loc10_60.1: = specific_impl_function %impl.elem0.loc10_60.1, @Copy.Op(constants.%Copy.facet.7d5) [symbolic = %specific_impl_fn.loc10_60.2 (constants.%specific_impl_fn.2ab)] +// CHECK:STDOUT: %bound_method.loc10_60.2: = bound_method %.loc10_60.2, %specific_impl_fn.loc10_60.1 +// CHECK:STDOUT: %.loc10_60.3: init @IntRange.as.Iterate.impl.NewCursor.%Int.loc10_45.1 (%Int.49d0e6.1) = call %bound_method.loc10_60.2(%.loc10_60.2) +// CHECK:STDOUT: return %.loc10_60.3 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -885,12 +895,12 @@ fn Read() { // CHECK:STDOUT: %IntRange.elem.ecb: type = unbound_element_type %IntRange.349, %Int.7ff11f.1 [symbolic] // CHECK:STDOUT: %require_complete.524: = require_complete_type %IntRange.349 [symbolic] // CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] -// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %Int.7ff11f.1, @Copy [symbolic] -// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %Int.7ff11f.1, (%Copy.lookup_impl_witness) [symbolic] +// CHECK:STDOUT: %Copy.lookup_impl_witness.cb9: = lookup_impl_witness %Int.7ff11f.1, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.edc: %Copy.type = facet_value %Int.7ff11f.1, (%Copy.lookup_impl_witness.cb9) [symbolic] // CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] -// CHECK:STDOUT: %.b47: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet [symbolic] -// CHECK:STDOUT: %impl.elem0: %.b47 = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic] -// CHECK:STDOUT: %specific_impl_fn: = specific_impl_function %impl.elem0, @Copy.Op(%Copy.facet) [symbolic] +// CHECK:STDOUT: %.b47: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.edc [symbolic] +// CHECK:STDOUT: %impl.elem0.eba: %.b47 = impl_witness_access %Copy.lookup_impl_witness.cb9, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.b25: = specific_impl_function %impl.elem0.eba, @Copy.Op(%Copy.facet.edc) [symbolic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %IntRange.365: type = class_type @IntRange, @IntRange(%int_32) [concrete] // CHECK:STDOUT: %IntRange.Make.type.cef: type = fn_type @IntRange.Make, @IntRange(%int_32) [concrete] @@ -959,7 +969,7 @@ fn Read() { // CHECK:STDOUT: %Main.import_ref.272: = import_ref Main//lib, loc4_39, loaded [symbolic = @IntRange.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness.e5b)] // CHECK:STDOUT: %Main.import_ref.f1e294.3: Core.IntLiteral = import_ref Main//lib, loc4_16, loaded [symbolic = @IntRange.%N (constants.%N)] // CHECK:STDOUT: %Main.import_ref.dae: type = import_ref Main//lib, loc4_39, loaded [symbolic = @IntRange.as.Destroy.impl.%IntRange (constants.%IntRange.349)] -// CHECK:STDOUT: %Main.import_ref.063: type = import_ref Main//lib, inst619 [no loc], loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Main.import_ref.063: type = import_ref Main//lib, inst733 [no loc], loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: %Main.import_ref.302: @IntRange.as.Destroy.impl.%IntRange.as.Destroy.impl.Op.type (%IntRange.as.Destroy.impl.Op.type.e28) = import_ref Main//lib, loc4_39, loaded [symbolic = @IntRange.as.Destroy.impl.%IntRange.as.Destroy.impl.Op (constants.%IntRange.as.Destroy.impl.Op.a7f)] // CHECK:STDOUT: %Destroy.impl_witness_table.0cc = impl_witness_table (%Main.import_ref.302), @IntRange.as.Destroy.impl [concrete] // CHECK:STDOUT: %Main.import_ref.f1e294.4: Core.IntLiteral = import_ref Main//lib, loc4_16, loaded [symbolic = @IntRange.%N (constants.%N)] @@ -1073,11 +1083,11 @@ fn Read() { // CHECK:STDOUT: %require_complete.1: = require_complete_type %IntRange [symbolic = %require_complete.1 (constants.%require_complete.524)] // CHECK:STDOUT: %require_complete.2: = require_complete_type %Int [symbolic = %require_complete.2 (constants.%require_complete.ffde5f.1)] // CHECK:STDOUT: %struct_type.start.end: type = struct_type {.start: @IntRange.Make.%Int (%Int.7ff11f.1), .end: @IntRange.Make.%Int (%Int.7ff11f.1)} [symbolic = %struct_type.start.end (constants.%struct_type.start.end.434)] -// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %Int, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness)] -// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %Int, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %Int, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.cb9)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %Int, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.edc)] // CHECK:STDOUT: %.1: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.1 (constants.%.b47)] -// CHECK:STDOUT: %impl.elem0: @IntRange.Make.%.1 (%.b47) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0 (constants.%impl.elem0)] -// CHECK:STDOUT: %specific_impl_fn: = specific_impl_function %impl.elem0, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn (constants.%specific_impl_fn)] +// CHECK:STDOUT: %impl.elem0: @IntRange.Make.%.1 (%.b47) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0 (constants.%impl.elem0.eba)] +// CHECK:STDOUT: %specific_impl_fn: = specific_impl_function %impl.elem0, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn (constants.%specific_impl_fn.b25)] // CHECK:STDOUT: // CHECK:STDOUT: fn; // CHECK:STDOUT: } diff --git a/toolchain/check/testdata/for/basic.carbon b/toolchain/check/testdata/for/basic.carbon index 0a32d317a6cf..bff0586db8c8 100644 --- a/toolchain/check/testdata/for/basic.carbon +++ b/toolchain/check/testdata/for/basic.carbon @@ -61,8 +61,8 @@ fn Run() { // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] // CHECK:STDOUT: %T.578: %Copy.type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %Copy.impl_witness.fc1: = impl_witness imports.%Copy.impl_witness_table.05f [concrete] -// CHECK:STDOUT: %Copy.facet.29a: %Copy.type = facet_value %empty_tuple.type, (%Copy.impl_witness.fc1) [concrete] +// CHECK:STDOUT: %Copy.impl_witness.e43: = impl_witness imports.%Copy.impl_witness_table.577 [concrete] +// CHECK:STDOUT: %Copy.facet.99f: %Copy.type = facet_value %empty_tuple.type, (%Copy.impl_witness.e43) [concrete] // CHECK:STDOUT: %Iterate.NewCursor.type: type = fn_type @Iterate.NewCursor [concrete] // CHECK:STDOUT: %Iterate.Next.type: type = fn_type @Iterate.Next [concrete] // CHECK:STDOUT: %Optional.HasValue.type.7f4: type = fn_type @Optional.HasValue, @Optional(%T.578) [symbolic] @@ -70,44 +70,46 @@ fn Run() { // CHECK:STDOUT: %Optional.Get.type.fd8: type = fn_type @Optional.Get, @Optional(%T.578) [symbolic] // CHECK:STDOUT: %Optional.Get.823: %Optional.Get.type.fd8 = struct_value () [symbolic] // CHECK:STDOUT: %Iterate.impl_witness: = impl_witness @TrivialRange.%Iterate.impl_witness_table [concrete] -// CHECK:STDOUT: %TrivialRange.as.Iterate.impl.NewCursor.type.2473fd.1: type = fn_type @TrivialRange.as.Iterate.impl.NewCursor.loc6_32.1 [concrete] -// CHECK:STDOUT: %TrivialRange.as.Iterate.impl.NewCursor.1374e3.1: %TrivialRange.as.Iterate.impl.NewCursor.type.2473fd.1 = struct_value () [concrete] +// CHECK:STDOUT: %TrivialRange.as.Iterate.impl.NewCursor.type.90b3e3.1: type = fn_type @TrivialRange.as.Iterate.impl.NewCursor.loc6_32.1 [concrete] +// CHECK:STDOUT: %TrivialRange.as.Iterate.impl.NewCursor.aab3e2.1: %TrivialRange.as.Iterate.impl.NewCursor.type.90b3e3.1 = struct_value () [concrete] // CHECK:STDOUT: %ptr.843: type = ptr_type %empty_tuple.type [concrete] -// CHECK:STDOUT: %Optional.4ad: type = class_type @Optional, @Optional(%Copy.facet.29a) [concrete] +// CHECK:STDOUT: %Optional.a0d: type = class_type @Optional, @Optional(%Copy.facet.99f) [concrete] // CHECK:STDOUT: %TrivialRange.as.Iterate.impl.Next.type: type = fn_type @TrivialRange.as.Iterate.impl.Next [concrete] // CHECK:STDOUT: %TrivialRange.as.Iterate.impl.Next: %TrivialRange.as.Iterate.impl.Next.type = struct_value () [concrete] -// CHECK:STDOUT: %Iterate.facet.06c: %Iterate.type = facet_value %TrivialRange, (%Iterate.impl_witness) [concrete] +// CHECK:STDOUT: %Iterate.facet.f05: %Iterate.type = facet_value %TrivialRange, (%Iterate.impl_witness) [concrete] // CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] -// CHECK:STDOUT: %TrivialRange.as.Iterate.impl.NewCursor.type.2473fd.2: type = fn_type @TrivialRange.as.Iterate.impl.NewCursor.loc6_32.2 [concrete] -// CHECK:STDOUT: %TrivialRange.as.Iterate.impl.NewCursor.1374e3.2: %TrivialRange.as.Iterate.impl.NewCursor.type.2473fd.2 = struct_value () [concrete] +// CHECK:STDOUT: %TrivialRange.as.Iterate.impl.NewCursor.type.90b3e3.2: type = fn_type @TrivialRange.as.Iterate.impl.NewCursor.loc6_32.2 [concrete] +// CHECK:STDOUT: %TrivialRange.as.Iterate.impl.NewCursor.aab3e2.2: %TrivialRange.as.Iterate.impl.NewCursor.type.90b3e3.2 = struct_value () [concrete] // CHECK:STDOUT: %ptr.41d: type = ptr_type %TrivialRange [concrete] // CHECK:STDOUT: %TrivialRange.as.Destroy.impl.Op.type: type = fn_type @TrivialRange.as.Destroy.impl.Op [concrete] // CHECK:STDOUT: %TrivialRange.as.Destroy.impl.Op: %TrivialRange.as.Destroy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %Optional.HasValue.type.9bf: type = fn_type @Optional.HasValue, @Optional(%Copy.facet.29a) [concrete] -// CHECK:STDOUT: %Optional.HasValue.28f: %Optional.HasValue.type.9bf = struct_value () [concrete] -// CHECK:STDOUT: %Optional.Get.type.aea: type = fn_type @Optional.Get, @Optional(%Copy.facet.29a) [concrete] -// CHECK:STDOUT: %Optional.Get.22d: %Optional.Get.type.aea = struct_value () [concrete] -// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.type.abd: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%empty_tuple.type) [concrete] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.bae: %T.as.Destroy.impl.Op.type.abd = struct_value () [concrete] +// CHECK:STDOUT: %Optional.HasValue.type.fd9: type = fn_type @Optional.HasValue, @Optional(%Copy.facet.99f) [concrete] +// CHECK:STDOUT: %Optional.HasValue.ff4: %Optional.HasValue.type.fd9 = struct_value () [concrete] +// CHECK:STDOUT: %Optional.Get.type.1ff: type = fn_type @Optional.Get, @Optional(%Copy.facet.99f) [concrete] +// CHECK:STDOUT: %Optional.Get.c8f: %Optional.Get.type.1ff = struct_value () [concrete] // CHECK:STDOUT: %Body.type: type = fn_type @Body [concrete] // CHECK:STDOUT: %Body: %Body.type = struct_value () [concrete] // CHECK:STDOUT: %AfterLoop.type: type = fn_type @AfterLoop [concrete] // CHECK:STDOUT: %AfterLoop: %AfterLoop.type = struct_value () [concrete] // CHECK:STDOUT: %TrivialRange.val: %TrivialRange = struct_value () [concrete] -// CHECK:STDOUT: %.a28: type = fn_type_with_self_type %Iterate.NewCursor.type, %Iterate.facet.06c [concrete] -// CHECK:STDOUT: %.e65: type = fn_type_with_self_type %Iterate.Next.type, %Iterate.facet.06c [concrete] -// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %Optional.HasValue.28f, @Optional.HasValue(%Copy.facet.29a) [concrete] -// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Optional.Get.22d, @Optional.Get(%Copy.facet.29a) [concrete] -// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.type.635: type = fn_type @Optional.as.Destroy.impl.Op, @Optional.as.Destroy.impl(%Copy.facet.29a) [concrete] -// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.b2a: %Optional.as.Destroy.impl.Op.type.635 = struct_value () [concrete] -// CHECK:STDOUT: %ptr.bbf: type = ptr_type %Optional.4ad [concrete] +// CHECK:STDOUT: %.ba5: type = fn_type_with_self_type %Iterate.NewCursor.type, %Iterate.facet.f05 [concrete] +// CHECK:STDOUT: %.c89: type = fn_type_with_self_type %Iterate.Next.type, %Iterate.facet.f05 [concrete] +// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %Optional.HasValue.ff4, @Optional.HasValue(%Copy.facet.99f) [concrete] +// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Optional.Get.c8f, @Optional.Get(%Copy.facet.99f) [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: %T.as.Destroy.impl.Op.type.abd: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%empty_tuple.type) [concrete] +// CHECK:STDOUT: %T.as.Destroy.impl.Op.bae: %T.as.Destroy.impl.Op.type.abd = struct_value () [concrete] +// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.type.f1d: type = fn_type @Optional.as.Destroy.impl.Op, @Optional.as.Destroy.impl(%Copy.facet.99f) [concrete] +// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.7aa: %Optional.as.Destroy.impl.Op.type.f1d = struct_value () [concrete] +// CHECK:STDOUT: %ptr.062: type = ptr_type %Optional.a0d [concrete] +// CHECK:STDOUT: %empty_tuple.type.as.Copy.impl.Op.type: type = fn_type @empty_tuple.type.as.Copy.impl.Op [concrete] +// CHECK:STDOUT: %empty_tuple.type.as.Copy.impl.Op: %empty_tuple.type.as.Copy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core.import_ref.0cc = import_ref Core//prelude/parts/copy, loc40_31, unloaded -// CHECK:STDOUT: %Copy.impl_witness_table.05f = impl_witness_table (%Core.import_ref.0cc), @empty_tuple.type.as.Copy.impl [concrete] +// CHECK:STDOUT: %Core.import_ref.c0f: %empty_tuple.type.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc44_31, loaded [concrete = constants.%empty_tuple.type.as.Copy.impl.Op] +// CHECK:STDOUT: %Copy.impl_witness_table.577 = impl_witness_table (%Core.import_ref.c0f), @empty_tuple.type.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.import_ref.b01: @Optional.%Optional.HasValue.type (%Optional.HasValue.type.7f4) = import_ref Core//prelude/parts/iterate, inst107 [indirect], loaded [symbolic = @Optional.%Optional.HasValue (constants.%Optional.HasValue.aa2)] // CHECK:STDOUT: %Core.import_ref.d9b: @Optional.%Optional.Get.type (%Optional.Get.type.fd8) = import_ref Core//prelude/parts/iterate, inst108 [indirect], loaded [symbolic = @Optional.%Optional.Get (constants.%Optional.Get.823)] // CHECK:STDOUT: } @@ -123,10 +125,10 @@ fn Run() { // CHECK:STDOUT: %.loc18_18.3: init %TrivialRange = class_init (), %.loc18_18.2 [concrete = constants.%TrivialRange.val] // CHECK:STDOUT: %.loc18_18.4: ref %TrivialRange = temporary %.loc18_18.2, %.loc18_18.3 // CHECK:STDOUT: %.loc18_20.1: ref %TrivialRange = converted %.loc18_18.1, %.loc18_18.4 -// CHECK:STDOUT: %impl.elem2: %.a28 = impl_witness_access constants.%Iterate.impl_witness, element2 [concrete = constants.%TrivialRange.as.Iterate.impl.NewCursor.1374e3.2] +// CHECK:STDOUT: %impl.elem2: %.ba5 = impl_witness_access constants.%Iterate.impl_witness, element2 [concrete = constants.%TrivialRange.as.Iterate.impl.NewCursor.aab3e2.2] // CHECK:STDOUT: %bound_method.loc18_35.1: = bound_method %.loc18_20.1, %impl.elem2 // CHECK:STDOUT: %.loc18_20.2: %TrivialRange = bind_value %.loc18_20.1 -// CHECK:STDOUT: %NewCursor.ref: %TrivialRange.as.Iterate.impl.NewCursor.type.2473fd.1 = name_ref NewCursor, @TrivialRange.as.Iterate.impl.%TrivialRange.as.Iterate.impl.NewCursor.decl.loc6_32.1 [concrete = constants.%TrivialRange.as.Iterate.impl.NewCursor.1374e3.1] +// CHECK:STDOUT: %NewCursor.ref: %TrivialRange.as.Iterate.impl.NewCursor.type.90b3e3.1 = name_ref NewCursor, @TrivialRange.as.Iterate.impl.%TrivialRange.as.Iterate.impl.NewCursor.decl.loc6_32.1 [concrete = constants.%TrivialRange.as.Iterate.impl.NewCursor.aab3e2.1] // CHECK:STDOUT: %TrivialRange.as.Iterate.impl.NewCursor.bound: = bound_method %.loc18_20.2, %NewCursor.ref // CHECK:STDOUT: %TrivialRange.as.Iterate.impl.NewCursor.call: init %empty_tuple.type = call %TrivialRange.as.Iterate.impl.NewCursor.bound(%.loc18_20.2) // CHECK:STDOUT: %var: ref %empty_tuple.type = var invalid @@ -135,30 +137,30 @@ fn Run() { // CHECK:STDOUT: // CHECK:STDOUT: !for.next: // CHECK:STDOUT: %addr.loc18_35.1: %ptr.843 = addr_of %var -// CHECK:STDOUT: %impl.elem3: %.e65 = impl_witness_access constants.%Iterate.impl_witness, element3 [concrete = constants.%TrivialRange.as.Iterate.impl.Next] +// CHECK:STDOUT: %impl.elem3: %.c89 = impl_witness_access constants.%Iterate.impl_witness, element3 [concrete = constants.%TrivialRange.as.Iterate.impl.Next] // CHECK:STDOUT: %bound_method.loc18_35.2: = bound_method %.loc18_20.1, %impl.elem3 -// CHECK:STDOUT: %.loc18_35.1: ref %Optional.4ad = temporary_storage +// CHECK:STDOUT: %.loc18_35.1: ref %Optional.a0d = temporary_storage // CHECK:STDOUT: %.loc18_20.3: %TrivialRange = bind_value %.loc18_20.1 -// CHECK:STDOUT: %TrivialRange.as.Iterate.impl.Next.call: init %Optional.4ad = call %bound_method.loc18_35.2(%.loc18_20.3, %addr.loc18_35.1) to %.loc18_35.1 -// CHECK:STDOUT: %.loc18_35.2: ref %Optional.4ad = temporary %.loc18_35.1, %TrivialRange.as.Iterate.impl.Next.call -// CHECK:STDOUT: %.loc18_35.3: %Optional.HasValue.type.9bf = specific_constant imports.%Core.import_ref.b01, @Optional(constants.%Copy.facet.29a) [concrete = constants.%Optional.HasValue.28f] -// CHECK:STDOUT: %HasValue.ref: %Optional.HasValue.type.9bf = name_ref HasValue, %.loc18_35.3 [concrete = constants.%Optional.HasValue.28f] +// CHECK:STDOUT: %TrivialRange.as.Iterate.impl.Next.call: init %Optional.a0d = call %bound_method.loc18_35.2(%.loc18_20.3, %addr.loc18_35.1) to %.loc18_35.1 +// CHECK:STDOUT: %.loc18_35.2: ref %Optional.a0d = temporary %.loc18_35.1, %TrivialRange.as.Iterate.impl.Next.call +// CHECK:STDOUT: %.loc18_35.3: %Optional.HasValue.type.fd9 = specific_constant imports.%Core.import_ref.b01, @Optional(constants.%Copy.facet.99f) [concrete = constants.%Optional.HasValue.ff4] +// CHECK:STDOUT: %HasValue.ref: %Optional.HasValue.type.fd9 = name_ref HasValue, %.loc18_35.3 [concrete = constants.%Optional.HasValue.ff4] // CHECK:STDOUT: %Optional.HasValue.bound: = bound_method %.loc18_35.2, %HasValue.ref -// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %HasValue.ref, @Optional.HasValue(constants.%Copy.facet.29a) [concrete = constants.%Optional.HasValue.specific_fn] +// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %HasValue.ref, @Optional.HasValue(constants.%Copy.facet.99f) [concrete = constants.%Optional.HasValue.specific_fn] // CHECK:STDOUT: %bound_method.loc18_35.3: = bound_method %.loc18_35.2, %Optional.HasValue.specific_fn -// CHECK:STDOUT: %.loc18_35.4: %Optional.4ad = bind_value %.loc18_35.2 +// CHECK:STDOUT: %.loc18_35.4: %Optional.a0d = bind_value %.loc18_35.2 // CHECK:STDOUT: %Optional.HasValue.call: init bool = call %bound_method.loc18_35.3(%.loc18_35.4) // CHECK:STDOUT: %.loc18_35.5: bool = value_of_initializer %Optional.HasValue.call // CHECK:STDOUT: %.loc18_35.6: bool = converted %Optional.HasValue.call, %.loc18_35.5 // CHECK:STDOUT: if %.loc18_35.6 br !for.body else br !for.done // CHECK:STDOUT: // CHECK:STDOUT: !for.body: -// CHECK:STDOUT: %.loc18_35.7: %Optional.Get.type.aea = specific_constant imports.%Core.import_ref.d9b, @Optional(constants.%Copy.facet.29a) [concrete = constants.%Optional.Get.22d] -// CHECK:STDOUT: %Get.ref: %Optional.Get.type.aea = name_ref Get, %.loc18_35.7 [concrete = constants.%Optional.Get.22d] +// CHECK:STDOUT: %.loc18_35.7: %Optional.Get.type.1ff = specific_constant imports.%Core.import_ref.d9b, @Optional(constants.%Copy.facet.99f) [concrete = constants.%Optional.Get.c8f] +// CHECK:STDOUT: %Get.ref: %Optional.Get.type.1ff = name_ref Get, %.loc18_35.7 [concrete = constants.%Optional.Get.c8f] // CHECK:STDOUT: %Optional.Get.bound: = bound_method %.loc18_35.2, %Get.ref -// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Get.ref, @Optional.Get(constants.%Copy.facet.29a) [concrete = constants.%Optional.Get.specific_fn] +// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Get.ref, @Optional.Get(constants.%Copy.facet.99f) [concrete = constants.%Optional.Get.specific_fn] // CHECK:STDOUT: %bound_method.loc18_35.4: = bound_method %.loc18_35.2, %Optional.Get.specific_fn -// CHECK:STDOUT: %.loc18_35.8: %Optional.4ad = bind_value %.loc18_35.2 +// CHECK:STDOUT: %.loc18_35.8: %Optional.a0d = bind_value %.loc18_35.2 // CHECK:STDOUT: %Optional.Get.call: init %empty_tuple.type = call %bound_method.loc18_35.4(%.loc18_35.8) // CHECK:STDOUT: %.loc18_12.1: type = splice_block %.loc18_12.3 [concrete = constants.%empty_tuple.type] { // CHECK:STDOUT: %.loc18_12.2: %empty_tuple.type = tuple_literal () @@ -181,10 +183,10 @@ fn Run() { // CHECK:STDOUT: %bound_method.loc18_35.5: = bound_method %.loc18_35.10, %T.as.Destroy.impl.Op.specific_fn.1 // CHECK:STDOUT: %addr.loc18_35.2: %ptr.843 = addr_of %.loc18_35.10 // CHECK:STDOUT: %T.as.Destroy.impl.Op.call.loc18_35.1: init %empty_tuple.type = call %bound_method.loc18_35.5(%addr.loc18_35.2) -// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.bound: = bound_method %.loc18_35.2, constants.%Optional.as.Destroy.impl.Op.b2a +// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.bound: = bound_method %.loc18_35.2, constants.%Optional.as.Destroy.impl.Op.7aa // CHECK:STDOUT: // CHECK:STDOUT: %bound_method.loc18_35.6: = bound_method %.loc18_35.2, %Optional.as.Destroy.impl.Op.specific_fn -// CHECK:STDOUT: %addr.loc18_35.3: %ptr.bbf = addr_of %.loc18_35.2 +// CHECK:STDOUT: %addr.loc18_35.3: %ptr.062 = addr_of %.loc18_35.2 // CHECK:STDOUT: %Optional.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc18_35.6(%addr.loc18_35.3) // CHECK:STDOUT: %T.as.Destroy.impl.Op.bound.loc18_35.2: = bound_method %var, constants.%T.as.Destroy.impl.Op.bae // CHECK:STDOUT: diff --git a/toolchain/check/testdata/for/pattern.carbon b/toolchain/check/testdata/for/pattern.carbon index dc7e64c9402e..7f35610ec1a8 100644 --- a/toolchain/check/testdata/for/pattern.carbon +++ b/toolchain/check/testdata/for/pattern.carbon @@ -133,12 +133,12 @@ fn Run() { // CHECK:STDOUT: %T.049: %Copy.type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %EmptyRange.Make.type.7d6: type = fn_type @EmptyRange.Make, @EmptyRange(%T.049) [symbolic] // CHECK:STDOUT: %EmptyRange.Make.4cc: %EmptyRange.Make.type.7d6 = struct_value () [symbolic] -// CHECK:STDOUT: %Copy.impl_witness.5fc: = impl_witness imports.%Copy.impl_witness_table.349 [concrete] -// CHECK:STDOUT: %Copy.facet.0cb: %Copy.type = facet_value %C, (%Copy.impl_witness.5fc) [concrete] -// CHECK:STDOUT: %EmptyRange.a62: type = class_type @EmptyRange, @EmptyRange(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %EmptyRange.Make.type.9ed: type = fn_type @EmptyRange.Make, @EmptyRange(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %EmptyRange.Make.a25: %EmptyRange.Make.type.9ed = struct_value () [concrete] -// CHECK:STDOUT: %EmptyRange.Make.specific_fn: = specific_function %EmptyRange.Make.a25, @EmptyRange.Make(%Copy.facet.0cb) [concrete] +// CHECK:STDOUT: %Copy.impl_witness.b58: = impl_witness imports.%Copy.impl_witness_table.943 [concrete] +// CHECK:STDOUT: %Copy.facet.bfc: %Copy.type = facet_value %C, (%Copy.impl_witness.b58) [concrete] +// CHECK:STDOUT: %EmptyRange.8bd: type = class_type @EmptyRange, @EmptyRange(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %EmptyRange.Make.type.f76: type = fn_type @EmptyRange.Make, @EmptyRange(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %EmptyRange.Make.393: %EmptyRange.Make.type.f76 = struct_value () [concrete] +// CHECK:STDOUT: %EmptyRange.Make.specific_fn: = specific_function %EmptyRange.Make.393, @EmptyRange.Make(%Copy.facet.bfc) [concrete] // CHECK:STDOUT: %Iterate.type: type = facet_type <@Iterate> [concrete] // CHECK:STDOUT: %Iterate.NewCursor.type: type = fn_type @Iterate.NewCursor [concrete] // CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.type.be4: type = fn_type @EmptyRange.as.Iterate.impl.NewCursor, @EmptyRange.as.Iterate.impl(%T.049) [symbolic] @@ -149,43 +149,45 @@ fn Run() { // CHECK:STDOUT: %Optional.HasValue.5a0: %Optional.HasValue.type.091 = struct_value () [symbolic] // CHECK:STDOUT: %Optional.Get.type.618: type = fn_type @Optional.Get, @Optional(%T.049) [symbolic] // CHECK:STDOUT: %Optional.Get.9cc: %Optional.Get.type.618 = struct_value () [symbolic] -// CHECK:STDOUT: %Iterate.impl_witness.4c0: = impl_witness imports.%Iterate.impl_witness_table, @EmptyRange.as.Iterate.impl(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.type.47b: type = fn_type @EmptyRange.as.Iterate.impl.NewCursor, @EmptyRange.as.Iterate.impl(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.d11: %EmptyRange.as.Iterate.impl.NewCursor.type.47b = struct_value () [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.type.173: type = fn_type @EmptyRange.as.Iterate.impl.Next, @EmptyRange.as.Iterate.impl(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.cad: %EmptyRange.as.Iterate.impl.Next.type.173 = struct_value () [concrete] -// CHECK:STDOUT: %Iterate.facet: %Iterate.type = facet_value %EmptyRange.a62, (%Iterate.impl_witness.4c0) [concrete] -// CHECK:STDOUT: %.130: type = fn_type_with_self_type %Iterate.NewCursor.type, %Iterate.facet [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.specific_fn: = specific_function %EmptyRange.as.Iterate.impl.NewCursor.d11, @EmptyRange.as.Iterate.impl.NewCursor(%Copy.facet.0cb) [concrete] +// CHECK:STDOUT: %Iterate.impl_witness.a1a: = impl_witness imports.%Iterate.impl_witness_table, @EmptyRange.as.Iterate.impl(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.type.1f8: type = fn_type @EmptyRange.as.Iterate.impl.NewCursor, @EmptyRange.as.Iterate.impl(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.ddc: %EmptyRange.as.Iterate.impl.NewCursor.type.1f8 = struct_value () [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.type.b3e: type = fn_type @EmptyRange.as.Iterate.impl.Next, @EmptyRange.as.Iterate.impl(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.67c: %EmptyRange.as.Iterate.impl.Next.type.b3e = struct_value () [concrete] +// CHECK:STDOUT: %Iterate.facet: %Iterate.type = facet_value %EmptyRange.8bd, (%Iterate.impl_witness.a1a) [concrete] +// CHECK:STDOUT: %.c55: type = fn_type_with_self_type %Iterate.NewCursor.type, %Iterate.facet [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.specific_fn: = specific_function %EmptyRange.as.Iterate.impl.NewCursor.ddc, @EmptyRange.as.Iterate.impl.NewCursor(%Copy.facet.bfc) [concrete] // CHECK:STDOUT: %Iterate.Next.type: type = fn_type @Iterate.Next [concrete] -// CHECK:STDOUT: %.cde: type = fn_type_with_self_type %Iterate.Next.type, %Iterate.facet [concrete] -// CHECK:STDOUT: %Optional.73d: type = class_type @Optional, @Optional(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.specific_fn: = specific_function %EmptyRange.as.Iterate.impl.Next.cad, @EmptyRange.as.Iterate.impl.Next(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %Optional.HasValue.type.c31: type = fn_type @Optional.HasValue, @Optional(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %Optional.HasValue.e8d: %Optional.HasValue.type.c31 = struct_value () [concrete] -// CHECK:STDOUT: %Optional.Get.type.a20: type = fn_type @Optional.Get, @Optional(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %Optional.Get.c56: %Optional.Get.type.a20 = struct_value () [concrete] -// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %Optional.HasValue.e8d, @Optional.HasValue(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Optional.Get.c56, @Optional.Get(%Copy.facet.0cb) [concrete] +// CHECK:STDOUT: %.eac: type = fn_type_with_self_type %Iterate.Next.type, %Iterate.facet [concrete] +// CHECK:STDOUT: %Optional.202: type = class_type @Optional, @Optional(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.specific_fn: = specific_function %EmptyRange.as.Iterate.impl.Next.67c, @EmptyRange.as.Iterate.impl.Next(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %Optional.HasValue.type.632: type = fn_type @Optional.HasValue, @Optional(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %Optional.HasValue.13f: %Optional.HasValue.type.632 = struct_value () [concrete] +// CHECK:STDOUT: %Optional.Get.type.e88: type = fn_type @Optional.Get, @Optional(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %Optional.Get.736: %Optional.Get.type.e88 = struct_value () [concrete] +// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %Optional.HasValue.13f, @Optional.HasValue(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Optional.Get.736, @Optional.Get(%Copy.facet.bfc) [concrete] // CHECK:STDOUT: %C.as.Destroy.impl.Op.type: type = fn_type @C.as.Destroy.impl.Op [concrete] // CHECK:STDOUT: %C.as.Destroy.impl.Op: %C.as.Destroy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] -// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.type.26d: type = fn_type @Optional.as.Destroy.impl.Op, @Optional.as.Destroy.impl(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.84e: %Optional.as.Destroy.impl.Op.type.26d = struct_value () [concrete] -// CHECK:STDOUT: %ptr.3f9: type = ptr_type %Optional.73d [concrete] +// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.type.af6: type = fn_type @Optional.as.Destroy.impl.Op, @Optional.as.Destroy.impl(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.5bc: %Optional.as.Destroy.impl.Op.type.af6 = struct_value () [concrete] +// CHECK:STDOUT: %ptr.00c: type = ptr_type %Optional.202 [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.type.456: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%empty_struct_type) [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.24b: %T.as.Destroy.impl.Op.type.456 = struct_value () [concrete] -// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.type.334: type = fn_type @EmptyRange.as.Destroy.impl.Op, @EmptyRange.as.Destroy.impl(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.61e: %EmptyRange.as.Destroy.impl.Op.type.334 = struct_value () [concrete] -// CHECK:STDOUT: %ptr.49e: type = ptr_type %EmptyRange.a62 [concrete] +// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.type.8ee: type = fn_type @EmptyRange.as.Destroy.impl.Op, @EmptyRange.as.Destroy.impl(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.dd8: %EmptyRange.as.Destroy.impl.Op.type.8ee = struct_value () [concrete] +// CHECK:STDOUT: %ptr.2e0: type = ptr_type %EmptyRange.8bd [concrete] +// CHECK:STDOUT: %C.as.Copy.impl.Op.type: type = fn_type @C.as.Copy.impl.Op [concrete] +// CHECK:STDOUT: %C.as.Copy.impl.Op: %C.as.Copy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.EmptyRange: %EmptyRange.type = import_ref Main//empty_range, EmptyRange, loaded [concrete = constants.%EmptyRange.generic] // CHECK:STDOUT: %Main.C: type = import_ref Main//empty_range, C, loaded [concrete = constants.%C] // CHECK:STDOUT: %Main.import_ref.787: @EmptyRange.%EmptyRange.Make.type (%EmptyRange.Make.type.7d6) = import_ref Main//empty_range, loc5_21, loaded [symbolic = @EmptyRange.%EmptyRange.Make (constants.%EmptyRange.Make.4cc)] -// CHECK:STDOUT: %Main.import_ref.a43 = import_ref Main//empty_range, loc19_33, unloaded -// CHECK:STDOUT: %Copy.impl_witness_table.349 = impl_witness_table (%Main.import_ref.a43), @C.as.Copy.impl [concrete] +// CHECK:STDOUT: %Main.import_ref.e69: %C.as.Copy.impl.Op.type = import_ref Main//empty_range, loc19_33, loaded [concrete = constants.%C.as.Copy.impl.Op] +// CHECK:STDOUT: %Copy.impl_witness_table.943 = impl_witness_table (%Main.import_ref.e69), @C.as.Copy.impl [concrete] // CHECK:STDOUT: %Main.import_ref.101 = import_ref Main//empty_range, loc7_68, unloaded // CHECK:STDOUT: %Main.import_ref.999 = import_ref Main//empty_range, loc7_68, unloaded // CHECK:STDOUT: %Main.import_ref.8f30: @EmptyRange.as.Iterate.impl.%EmptyRange.as.Iterate.impl.NewCursor.type (%EmptyRange.as.Iterate.impl.NewCursor.type.be4) = import_ref Main//empty_range, loc8_38, loaded [symbolic = @EmptyRange.as.Iterate.impl.%EmptyRange.as.Iterate.impl.NewCursor (constants.%EmptyRange.as.Iterate.impl.NewCursor.61a)] @@ -202,20 +204,20 @@ fn Run() { // CHECK:STDOUT: } // CHECK:STDOUT: %EmptyRange.ref: %EmptyRange.type = name_ref EmptyRange, imports.%Main.EmptyRange [concrete = constants.%EmptyRange.generic] // CHECK:STDOUT: %C.ref.loc10_27: type = name_ref C, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value constants.%C, (constants.%Copy.impl_witness.5fc) [concrete = constants.%Copy.facet.0cb] -// CHECK:STDOUT: %.loc10_28: %Copy.type = converted %C.ref.loc10_27, %Copy.facet [concrete = constants.%Copy.facet.0cb] -// CHECK:STDOUT: %EmptyRange: type = class_type @EmptyRange, @EmptyRange(constants.%Copy.facet.0cb) [concrete = constants.%EmptyRange.a62] -// CHECK:STDOUT: %.loc10_29: %EmptyRange.Make.type.9ed = specific_constant imports.%Main.import_ref.787, @EmptyRange(constants.%Copy.facet.0cb) [concrete = constants.%EmptyRange.Make.a25] -// CHECK:STDOUT: %Make.ref: %EmptyRange.Make.type.9ed = name_ref Make, %.loc10_29 [concrete = constants.%EmptyRange.Make.a25] -// CHECK:STDOUT: %EmptyRange.Make.specific_fn: = specific_function %Make.ref, @EmptyRange.Make(constants.%Copy.facet.0cb) [concrete = constants.%EmptyRange.Make.specific_fn] -// CHECK:STDOUT: %.loc10_35.1: ref %EmptyRange.a62 = temporary_storage -// CHECK:STDOUT: %EmptyRange.Make.call: init %EmptyRange.a62 = call %EmptyRange.Make.specific_fn() to %.loc10_35.1 -// CHECK:STDOUT: %.loc10_35.2: ref %EmptyRange.a62 = temporary %.loc10_35.1, %EmptyRange.Make.call -// CHECK:STDOUT: %impl.elem2: %.130 = impl_witness_access constants.%Iterate.impl_witness.4c0, element2 [concrete = constants.%EmptyRange.as.Iterate.impl.NewCursor.d11] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value constants.%C, (constants.%Copy.impl_witness.b58) [concrete = constants.%Copy.facet.bfc] +// CHECK:STDOUT: %.loc10_28: %Copy.type = converted %C.ref.loc10_27, %Copy.facet [concrete = constants.%Copy.facet.bfc] +// CHECK:STDOUT: %EmptyRange: type = class_type @EmptyRange, @EmptyRange(constants.%Copy.facet.bfc) [concrete = constants.%EmptyRange.8bd] +// CHECK:STDOUT: %.loc10_29: %EmptyRange.Make.type.f76 = specific_constant imports.%Main.import_ref.787, @EmptyRange(constants.%Copy.facet.bfc) [concrete = constants.%EmptyRange.Make.393] +// CHECK:STDOUT: %Make.ref: %EmptyRange.Make.type.f76 = name_ref Make, %.loc10_29 [concrete = constants.%EmptyRange.Make.393] +// CHECK:STDOUT: %EmptyRange.Make.specific_fn: = specific_function %Make.ref, @EmptyRange.Make(constants.%Copy.facet.bfc) [concrete = constants.%EmptyRange.Make.specific_fn] +// CHECK:STDOUT: %.loc10_35.1: ref %EmptyRange.8bd = temporary_storage +// CHECK:STDOUT: %EmptyRange.Make.call: init %EmptyRange.8bd = call %EmptyRange.Make.specific_fn() to %.loc10_35.1 +// CHECK:STDOUT: %.loc10_35.2: ref %EmptyRange.8bd = temporary %.loc10_35.1, %EmptyRange.Make.call +// CHECK:STDOUT: %impl.elem2: %.c55 = impl_witness_access constants.%Iterate.impl_witness.a1a, element2 [concrete = constants.%EmptyRange.as.Iterate.impl.NewCursor.ddc] // CHECK:STDOUT: %bound_method.loc10_36.1: = bound_method %.loc10_35.2, %impl.elem2 -// CHECK:STDOUT: %specific_fn.loc10_36.1: = specific_function %impl.elem2, @EmptyRange.as.Iterate.impl.NewCursor(constants.%Copy.facet.0cb) [concrete = constants.%EmptyRange.as.Iterate.impl.NewCursor.specific_fn] +// CHECK:STDOUT: %specific_fn.loc10_36.1: = specific_function %impl.elem2, @EmptyRange.as.Iterate.impl.NewCursor(constants.%Copy.facet.bfc) [concrete = constants.%EmptyRange.as.Iterate.impl.NewCursor.specific_fn] // CHECK:STDOUT: %bound_method.loc10_36.2: = bound_method %.loc10_35.2, %specific_fn.loc10_36.1 -// CHECK:STDOUT: %.loc10_35.3: %EmptyRange.a62 = bind_value %.loc10_35.2 +// CHECK:STDOUT: %.loc10_35.3: %EmptyRange.8bd = bind_value %.loc10_35.2 // CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.call: init %empty_struct_type = call %bound_method.loc10_36.2(%.loc10_35.3) // CHECK:STDOUT: %var: ref %empty_struct_type = var invalid // CHECK:STDOUT: assign %var, %EmptyRange.as.Iterate.impl.NewCursor.call @@ -223,33 +225,33 @@ fn Run() { // CHECK:STDOUT: // CHECK:STDOUT: !for.next: // CHECK:STDOUT: %addr.loc10_36.1: %ptr.c28 = addr_of %var -// CHECK:STDOUT: %impl.elem3: %.cde = impl_witness_access constants.%Iterate.impl_witness.4c0, element3 [concrete = constants.%EmptyRange.as.Iterate.impl.Next.cad] +// CHECK:STDOUT: %impl.elem3: %.eac = impl_witness_access constants.%Iterate.impl_witness.a1a, element3 [concrete = constants.%EmptyRange.as.Iterate.impl.Next.67c] // CHECK:STDOUT: %bound_method.loc10_36.3: = bound_method %.loc10_35.2, %impl.elem3 -// CHECK:STDOUT: %specific_fn.loc10_36.2: = specific_function %impl.elem3, @EmptyRange.as.Iterate.impl.Next(constants.%Copy.facet.0cb) [concrete = constants.%EmptyRange.as.Iterate.impl.Next.specific_fn] +// CHECK:STDOUT: %specific_fn.loc10_36.2: = specific_function %impl.elem3, @EmptyRange.as.Iterate.impl.Next(constants.%Copy.facet.bfc) [concrete = constants.%EmptyRange.as.Iterate.impl.Next.specific_fn] // CHECK:STDOUT: %bound_method.loc10_36.4: = bound_method %.loc10_35.2, %specific_fn.loc10_36.2 -// CHECK:STDOUT: %.loc10_36.1: ref %Optional.73d = temporary_storage -// CHECK:STDOUT: %.loc10_35.4: %EmptyRange.a62 = bind_value %.loc10_35.2 -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.call: init %Optional.73d = call %bound_method.loc10_36.4(%.loc10_35.4, %addr.loc10_36.1) to %.loc10_36.1 -// CHECK:STDOUT: %.loc10_36.2: ref %Optional.73d = temporary %.loc10_36.1, %EmptyRange.as.Iterate.impl.Next.call -// CHECK:STDOUT: %.loc10_36.3: %Optional.HasValue.type.c31 = specific_constant imports.%Main.import_ref.13f, @Optional(constants.%Copy.facet.0cb) [concrete = constants.%Optional.HasValue.e8d] -// CHECK:STDOUT: %HasValue.ref: %Optional.HasValue.type.c31 = name_ref HasValue, %.loc10_36.3 [concrete = constants.%Optional.HasValue.e8d] +// CHECK:STDOUT: %.loc10_36.1: ref %Optional.202 = temporary_storage +// CHECK:STDOUT: %.loc10_35.4: %EmptyRange.8bd = bind_value %.loc10_35.2 +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.call: init %Optional.202 = call %bound_method.loc10_36.4(%.loc10_35.4, %addr.loc10_36.1) to %.loc10_36.1 +// CHECK:STDOUT: %.loc10_36.2: ref %Optional.202 = temporary %.loc10_36.1, %EmptyRange.as.Iterate.impl.Next.call +// CHECK:STDOUT: %.loc10_36.3: %Optional.HasValue.type.632 = specific_constant imports.%Main.import_ref.13f, @Optional(constants.%Copy.facet.bfc) [concrete = constants.%Optional.HasValue.13f] +// CHECK:STDOUT: %HasValue.ref: %Optional.HasValue.type.632 = name_ref HasValue, %.loc10_36.3 [concrete = constants.%Optional.HasValue.13f] // CHECK:STDOUT: %Optional.HasValue.bound: = bound_method %.loc10_36.2, %HasValue.ref -// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %HasValue.ref, @Optional.HasValue(constants.%Copy.facet.0cb) [concrete = constants.%Optional.HasValue.specific_fn] +// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %HasValue.ref, @Optional.HasValue(constants.%Copy.facet.bfc) [concrete = constants.%Optional.HasValue.specific_fn] // CHECK:STDOUT: %bound_method.loc10_36.5: = bound_method %.loc10_36.2, %Optional.HasValue.specific_fn -// CHECK:STDOUT: %.loc10_36.4: %Optional.73d = bind_value %.loc10_36.2 +// CHECK:STDOUT: %.loc10_36.4: %Optional.202 = bind_value %.loc10_36.2 // CHECK:STDOUT: %Optional.HasValue.call: init bool = call %bound_method.loc10_36.5(%.loc10_36.4) // CHECK:STDOUT: %.loc10_36.5: bool = value_of_initializer %Optional.HasValue.call // CHECK:STDOUT: %.loc10_36.6: bool = converted %Optional.HasValue.call, %.loc10_36.5 // CHECK:STDOUT: if %.loc10_36.6 br !for.body else br !for.done // CHECK:STDOUT: // CHECK:STDOUT: !for.body: -// CHECK:STDOUT: %.loc10_36.7: %Optional.Get.type.a20 = specific_constant imports.%Main.import_ref.a3b, @Optional(constants.%Copy.facet.0cb) [concrete = constants.%Optional.Get.c56] -// CHECK:STDOUT: %Get.ref: %Optional.Get.type.a20 = name_ref Get, %.loc10_36.7 [concrete = constants.%Optional.Get.c56] +// CHECK:STDOUT: %.loc10_36.7: %Optional.Get.type.e88 = specific_constant imports.%Main.import_ref.a3b, @Optional(constants.%Copy.facet.bfc) [concrete = constants.%Optional.Get.736] +// CHECK:STDOUT: %Get.ref: %Optional.Get.type.e88 = name_ref Get, %.loc10_36.7 [concrete = constants.%Optional.Get.736] // CHECK:STDOUT: %Optional.Get.bound: = bound_method %.loc10_36.2, %Get.ref -// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Get.ref, @Optional.Get(constants.%Copy.facet.0cb) [concrete = constants.%Optional.Get.specific_fn] +// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Get.ref, @Optional.Get(constants.%Copy.facet.bfc) [concrete = constants.%Optional.Get.specific_fn] // CHECK:STDOUT: %bound_method.loc10_36.6: = bound_method %.loc10_36.2, %Optional.Get.specific_fn // CHECK:STDOUT: %.loc10_36.8: ref %C = temporary_storage -// CHECK:STDOUT: %.loc10_36.9: %Optional.73d = bind_value %.loc10_36.2 +// CHECK:STDOUT: %.loc10_36.9: %Optional.202 = bind_value %.loc10_36.2 // CHECK:STDOUT: %Optional.Get.call: init %C = call %bound_method.loc10_36.6(%.loc10_36.9) to %.loc10_36.8 // CHECK:STDOUT: %C.ref.loc10_11: type = name_ref C, imports.%Main.C [concrete = constants.%C] // CHECK:STDOUT: %.loc10_36.10: ref %C = temporary %.loc10_36.8, %Optional.Get.call @@ -264,20 +266,20 @@ fn Run() { // CHECK:STDOUT: %C.as.Destroy.impl.Op.bound: = bound_method %.loc10_36.10, constants.%C.as.Destroy.impl.Op // CHECK:STDOUT: %addr.loc10_36.2: %ptr.019 = addr_of %.loc10_36.10 // CHECK:STDOUT: %C.as.Destroy.impl.Op.call: init %empty_tuple.type = call %C.as.Destroy.impl.Op.bound(%addr.loc10_36.2) -// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.bound: = bound_method %.loc10_36.2, constants.%Optional.as.Destroy.impl.Op.84e +// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.bound: = bound_method %.loc10_36.2, constants.%Optional.as.Destroy.impl.Op.5bc // CHECK:STDOUT: // CHECK:STDOUT: %bound_method.loc10_36.7: = bound_method %.loc10_36.2, %Optional.as.Destroy.impl.Op.specific_fn -// CHECK:STDOUT: %addr.loc10_36.3: %ptr.3f9 = addr_of %.loc10_36.2 +// CHECK:STDOUT: %addr.loc10_36.3: %ptr.00c = addr_of %.loc10_36.2 // CHECK:STDOUT: %Optional.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc10_36.7(%addr.loc10_36.3) // CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %var, constants.%T.as.Destroy.impl.Op.24b // CHECK:STDOUT: // CHECK:STDOUT: %bound_method.loc10_36.8: = bound_method %var, %T.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr.loc10_36.4: %ptr.c28 = addr_of %var // CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc10_36.8(%addr.loc10_36.4) -// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.bound: = bound_method %.loc10_35.2, constants.%EmptyRange.as.Destroy.impl.Op.61e +// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.bound: = bound_method %.loc10_35.2, constants.%EmptyRange.as.Destroy.impl.Op.dd8 // CHECK:STDOUT: // CHECK:STDOUT: %bound_method.loc10_35: = bound_method %.loc10_35.2, %EmptyRange.as.Destroy.impl.Op.specific_fn -// CHECK:STDOUT: %addr.loc10_35: %ptr.49e = addr_of %.loc10_35.2 +// CHECK:STDOUT: %addr.loc10_35: %ptr.2e0 = addr_of %.loc10_35.2 // CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc10_35(%addr.loc10_35) // CHECK:STDOUT: // CHECK:STDOUT: } @@ -299,12 +301,12 @@ fn Run() { // CHECK:STDOUT: %T.049: %Copy.type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %EmptyRange.Make.type.7d6: type = fn_type @EmptyRange.Make, @EmptyRange(%T.049) [symbolic] // CHECK:STDOUT: %EmptyRange.Make.4cc: %EmptyRange.Make.type.7d6 = struct_value () [symbolic] -// CHECK:STDOUT: %Copy.impl_witness.5fc: = impl_witness imports.%Copy.impl_witness_table.349 [concrete] -// CHECK:STDOUT: %Copy.facet.0cb: %Copy.type = facet_value %C, (%Copy.impl_witness.5fc) [concrete] -// CHECK:STDOUT: %EmptyRange.a62: type = class_type @EmptyRange, @EmptyRange(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %EmptyRange.Make.type.9ed: type = fn_type @EmptyRange.Make, @EmptyRange(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %EmptyRange.Make.a25: %EmptyRange.Make.type.9ed = struct_value () [concrete] -// CHECK:STDOUT: %EmptyRange.Make.specific_fn: = specific_function %EmptyRange.Make.a25, @EmptyRange.Make(%Copy.facet.0cb) [concrete] +// CHECK:STDOUT: %Copy.impl_witness.b58: = impl_witness imports.%Copy.impl_witness_table.943 [concrete] +// CHECK:STDOUT: %Copy.facet.bfc: %Copy.type = facet_value %C, (%Copy.impl_witness.b58) [concrete] +// CHECK:STDOUT: %EmptyRange.8bd: type = class_type @EmptyRange, @EmptyRange(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %EmptyRange.Make.type.f76: type = fn_type @EmptyRange.Make, @EmptyRange(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %EmptyRange.Make.393: %EmptyRange.Make.type.f76 = struct_value () [concrete] +// CHECK:STDOUT: %EmptyRange.Make.specific_fn: = specific_function %EmptyRange.Make.393, @EmptyRange.Make(%Copy.facet.bfc) [concrete] // CHECK:STDOUT: %Iterate.type: type = facet_type <@Iterate> [concrete] // CHECK:STDOUT: %Iterate.NewCursor.type: type = fn_type @Iterate.NewCursor [concrete] // CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.type.be4: type = fn_type @EmptyRange.as.Iterate.impl.NewCursor, @EmptyRange.as.Iterate.impl(%T.049) [symbolic] @@ -315,42 +317,44 @@ fn Run() { // CHECK:STDOUT: %Optional.HasValue.5a0: %Optional.HasValue.type.091 = struct_value () [symbolic] // CHECK:STDOUT: %Optional.Get.type.618: type = fn_type @Optional.Get, @Optional(%T.049) [symbolic] // CHECK:STDOUT: %Optional.Get.9cc: %Optional.Get.type.618 = struct_value () [symbolic] -// CHECK:STDOUT: %Iterate.impl_witness.4c0: = impl_witness imports.%Iterate.impl_witness_table, @EmptyRange.as.Iterate.impl(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.type.47b: type = fn_type @EmptyRange.as.Iterate.impl.NewCursor, @EmptyRange.as.Iterate.impl(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.d11: %EmptyRange.as.Iterate.impl.NewCursor.type.47b = struct_value () [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.type.173: type = fn_type @EmptyRange.as.Iterate.impl.Next, @EmptyRange.as.Iterate.impl(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.cad: %EmptyRange.as.Iterate.impl.Next.type.173 = struct_value () [concrete] -// CHECK:STDOUT: %Iterate.facet: %Iterate.type = facet_value %EmptyRange.a62, (%Iterate.impl_witness.4c0) [concrete] -// CHECK:STDOUT: %.130: type = fn_type_with_self_type %Iterate.NewCursor.type, %Iterate.facet [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.specific_fn: = specific_function %EmptyRange.as.Iterate.impl.NewCursor.d11, @EmptyRange.as.Iterate.impl.NewCursor(%Copy.facet.0cb) [concrete] +// CHECK:STDOUT: %Iterate.impl_witness.a1a: = impl_witness imports.%Iterate.impl_witness_table, @EmptyRange.as.Iterate.impl(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.type.1f8: type = fn_type @EmptyRange.as.Iterate.impl.NewCursor, @EmptyRange.as.Iterate.impl(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.ddc: %EmptyRange.as.Iterate.impl.NewCursor.type.1f8 = struct_value () [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.type.b3e: type = fn_type @EmptyRange.as.Iterate.impl.Next, @EmptyRange.as.Iterate.impl(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.67c: %EmptyRange.as.Iterate.impl.Next.type.b3e = struct_value () [concrete] +// CHECK:STDOUT: %Iterate.facet: %Iterate.type = facet_value %EmptyRange.8bd, (%Iterate.impl_witness.a1a) [concrete] +// CHECK:STDOUT: %.c55: type = fn_type_with_self_type %Iterate.NewCursor.type, %Iterate.facet [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.specific_fn: = specific_function %EmptyRange.as.Iterate.impl.NewCursor.ddc, @EmptyRange.as.Iterate.impl.NewCursor(%Copy.facet.bfc) [concrete] // CHECK:STDOUT: %Iterate.Next.type: type = fn_type @Iterate.Next [concrete] -// CHECK:STDOUT: %.cde: type = fn_type_with_self_type %Iterate.Next.type, %Iterate.facet [concrete] -// CHECK:STDOUT: %Optional.73d: type = class_type @Optional, @Optional(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.specific_fn: = specific_function %EmptyRange.as.Iterate.impl.Next.cad, @EmptyRange.as.Iterate.impl.Next(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %Optional.HasValue.type.c31: type = fn_type @Optional.HasValue, @Optional(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %Optional.HasValue.e8d: %Optional.HasValue.type.c31 = struct_value () [concrete] -// CHECK:STDOUT: %Optional.Get.type.a20: type = fn_type @Optional.Get, @Optional(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %Optional.Get.c56: %Optional.Get.type.a20 = struct_value () [concrete] -// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %Optional.HasValue.e8d, @Optional.HasValue(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Optional.Get.c56, @Optional.Get(%Copy.facet.0cb) [concrete] +// CHECK:STDOUT: %.eac: type = fn_type_with_self_type %Iterate.Next.type, %Iterate.facet [concrete] +// CHECK:STDOUT: %Optional.202: type = class_type @Optional, @Optional(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.specific_fn: = specific_function %EmptyRange.as.Iterate.impl.Next.67c, @EmptyRange.as.Iterate.impl.Next(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %Optional.HasValue.type.632: type = fn_type @Optional.HasValue, @Optional(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %Optional.HasValue.13f: %Optional.HasValue.type.632 = struct_value () [concrete] +// CHECK:STDOUT: %Optional.Get.type.e88: type = fn_type @Optional.Get, @Optional(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %Optional.Get.736: %Optional.Get.type.e88 = struct_value () [concrete] +// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %Optional.HasValue.13f, @Optional.HasValue(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Optional.Get.736, @Optional.Get(%Copy.facet.bfc) [concrete] // CHECK:STDOUT: %C.as.Destroy.impl.Op.type: type = fn_type @C.as.Destroy.impl.Op [concrete] // CHECK:STDOUT: %C.as.Destroy.impl.Op: %C.as.Destroy.impl.Op.type = struct_value () [concrete] -// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.type.26d: type = fn_type @Optional.as.Destroy.impl.Op, @Optional.as.Destroy.impl(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.84e: %Optional.as.Destroy.impl.Op.type.26d = struct_value () [concrete] -// CHECK:STDOUT: %ptr.3f9: type = ptr_type %Optional.73d [concrete] +// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.type.af6: type = fn_type @Optional.as.Destroy.impl.Op, @Optional.as.Destroy.impl(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.5bc: %Optional.as.Destroy.impl.Op.type.af6 = struct_value () [concrete] +// CHECK:STDOUT: %ptr.00c: type = ptr_type %Optional.202 [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.type.456: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%empty_struct_type) [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.24b: %T.as.Destroy.impl.Op.type.456 = struct_value () [concrete] -// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.type.334: type = fn_type @EmptyRange.as.Destroy.impl.Op, @EmptyRange.as.Destroy.impl(%Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.61e: %EmptyRange.as.Destroy.impl.Op.type.334 = struct_value () [concrete] -// CHECK:STDOUT: %ptr.49e: type = ptr_type %EmptyRange.a62 [concrete] +// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.type.8ee: type = fn_type @EmptyRange.as.Destroy.impl.Op, @EmptyRange.as.Destroy.impl(%Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.dd8: %EmptyRange.as.Destroy.impl.Op.type.8ee = struct_value () [concrete] +// CHECK:STDOUT: %ptr.2e0: type = ptr_type %EmptyRange.8bd [concrete] +// CHECK:STDOUT: %C.as.Copy.impl.Op.type: type = fn_type @C.as.Copy.impl.Op [concrete] +// CHECK:STDOUT: %C.as.Copy.impl.Op: %C.as.Copy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.EmptyRange: %EmptyRange.type = import_ref Main//empty_range, EmptyRange, loaded [concrete = constants.%EmptyRange.generic] // CHECK:STDOUT: %Main.C: type = import_ref Main//empty_range, C, loaded [concrete = constants.%C] // CHECK:STDOUT: %Main.import_ref.787: @EmptyRange.%EmptyRange.Make.type (%EmptyRange.Make.type.7d6) = import_ref Main//empty_range, loc5_21, loaded [symbolic = @EmptyRange.%EmptyRange.Make (constants.%EmptyRange.Make.4cc)] -// CHECK:STDOUT: %Main.import_ref.a43 = import_ref Main//empty_range, loc19_33, unloaded -// CHECK:STDOUT: %Copy.impl_witness_table.349 = impl_witness_table (%Main.import_ref.a43), @C.as.Copy.impl [concrete] +// CHECK:STDOUT: %Main.import_ref.e69: %C.as.Copy.impl.Op.type = import_ref Main//empty_range, loc19_33, loaded [concrete = constants.%C.as.Copy.impl.Op] +// CHECK:STDOUT: %Copy.impl_witness_table.943 = impl_witness_table (%Main.import_ref.e69), @C.as.Copy.impl [concrete] // CHECK:STDOUT: %Main.import_ref.101 = import_ref Main//empty_range, loc7_68, unloaded // CHECK:STDOUT: %Main.import_ref.999 = import_ref Main//empty_range, loc7_68, unloaded // CHECK:STDOUT: %Main.import_ref.8f30: @EmptyRange.as.Iterate.impl.%EmptyRange.as.Iterate.impl.NewCursor.type (%EmptyRange.as.Iterate.impl.NewCursor.type.be4) = import_ref Main//empty_range, loc8_38, loaded [symbolic = @EmptyRange.as.Iterate.impl.%EmptyRange.as.Iterate.impl.NewCursor (constants.%EmptyRange.as.Iterate.impl.NewCursor.61a)] @@ -368,20 +372,20 @@ fn Run() { // CHECK:STDOUT: } // CHECK:STDOUT: %EmptyRange.ref: %EmptyRange.type = name_ref EmptyRange, imports.%Main.EmptyRange [concrete = constants.%EmptyRange.generic] // CHECK:STDOUT: %C.ref.loc10_31: type = name_ref C, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value constants.%C, (constants.%Copy.impl_witness.5fc) [concrete = constants.%Copy.facet.0cb] -// CHECK:STDOUT: %.loc10_32: %Copy.type = converted %C.ref.loc10_31, %Copy.facet [concrete = constants.%Copy.facet.0cb] -// CHECK:STDOUT: %EmptyRange: type = class_type @EmptyRange, @EmptyRange(constants.%Copy.facet.0cb) [concrete = constants.%EmptyRange.a62] -// CHECK:STDOUT: %.loc10_33: %EmptyRange.Make.type.9ed = specific_constant imports.%Main.import_ref.787, @EmptyRange(constants.%Copy.facet.0cb) [concrete = constants.%EmptyRange.Make.a25] -// CHECK:STDOUT: %Make.ref: %EmptyRange.Make.type.9ed = name_ref Make, %.loc10_33 [concrete = constants.%EmptyRange.Make.a25] -// CHECK:STDOUT: %EmptyRange.Make.specific_fn: = specific_function %Make.ref, @EmptyRange.Make(constants.%Copy.facet.0cb) [concrete = constants.%EmptyRange.Make.specific_fn] -// CHECK:STDOUT: %.loc10_39.1: ref %EmptyRange.a62 = temporary_storage -// CHECK:STDOUT: %EmptyRange.Make.call: init %EmptyRange.a62 = call %EmptyRange.Make.specific_fn() to %.loc10_39.1 -// CHECK:STDOUT: %.loc10_39.2: ref %EmptyRange.a62 = temporary %.loc10_39.1, %EmptyRange.Make.call -// CHECK:STDOUT: %impl.elem2: %.130 = impl_witness_access constants.%Iterate.impl_witness.4c0, element2 [concrete = constants.%EmptyRange.as.Iterate.impl.NewCursor.d11] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value constants.%C, (constants.%Copy.impl_witness.b58) [concrete = constants.%Copy.facet.bfc] +// CHECK:STDOUT: %.loc10_32: %Copy.type = converted %C.ref.loc10_31, %Copy.facet [concrete = constants.%Copy.facet.bfc] +// CHECK:STDOUT: %EmptyRange: type = class_type @EmptyRange, @EmptyRange(constants.%Copy.facet.bfc) [concrete = constants.%EmptyRange.8bd] +// CHECK:STDOUT: %.loc10_33: %EmptyRange.Make.type.f76 = specific_constant imports.%Main.import_ref.787, @EmptyRange(constants.%Copy.facet.bfc) [concrete = constants.%EmptyRange.Make.393] +// CHECK:STDOUT: %Make.ref: %EmptyRange.Make.type.f76 = name_ref Make, %.loc10_33 [concrete = constants.%EmptyRange.Make.393] +// CHECK:STDOUT: %EmptyRange.Make.specific_fn: = specific_function %Make.ref, @EmptyRange.Make(constants.%Copy.facet.bfc) [concrete = constants.%EmptyRange.Make.specific_fn] +// CHECK:STDOUT: %.loc10_39.1: ref %EmptyRange.8bd = temporary_storage +// CHECK:STDOUT: %EmptyRange.Make.call: init %EmptyRange.8bd = call %EmptyRange.Make.specific_fn() to %.loc10_39.1 +// CHECK:STDOUT: %.loc10_39.2: ref %EmptyRange.8bd = temporary %.loc10_39.1, %EmptyRange.Make.call +// CHECK:STDOUT: %impl.elem2: %.c55 = impl_witness_access constants.%Iterate.impl_witness.a1a, element2 [concrete = constants.%EmptyRange.as.Iterate.impl.NewCursor.ddc] // CHECK:STDOUT: %bound_method.loc10_40.1: = bound_method %.loc10_39.2, %impl.elem2 -// CHECK:STDOUT: %specific_fn.loc10_40.1: = specific_function %impl.elem2, @EmptyRange.as.Iterate.impl.NewCursor(constants.%Copy.facet.0cb) [concrete = constants.%EmptyRange.as.Iterate.impl.NewCursor.specific_fn] +// CHECK:STDOUT: %specific_fn.loc10_40.1: = specific_function %impl.elem2, @EmptyRange.as.Iterate.impl.NewCursor(constants.%Copy.facet.bfc) [concrete = constants.%EmptyRange.as.Iterate.impl.NewCursor.specific_fn] // CHECK:STDOUT: %bound_method.loc10_40.2: = bound_method %.loc10_39.2, %specific_fn.loc10_40.1 -// CHECK:STDOUT: %.loc10_39.3: %EmptyRange.a62 = bind_value %.loc10_39.2 +// CHECK:STDOUT: %.loc10_39.3: %EmptyRange.8bd = bind_value %.loc10_39.2 // CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.call: init %empty_struct_type = call %bound_method.loc10_40.2(%.loc10_39.3) // CHECK:STDOUT: %var: ref %empty_struct_type = var invalid // CHECK:STDOUT: assign %var, %EmptyRange.as.Iterate.impl.NewCursor.call @@ -389,20 +393,20 @@ fn Run() { // CHECK:STDOUT: // CHECK:STDOUT: !for.next: // CHECK:STDOUT: %addr.loc10_40.1: %ptr.c28 = addr_of %var -// CHECK:STDOUT: %impl.elem3: %.cde = impl_witness_access constants.%Iterate.impl_witness.4c0, element3 [concrete = constants.%EmptyRange.as.Iterate.impl.Next.cad] +// CHECK:STDOUT: %impl.elem3: %.eac = impl_witness_access constants.%Iterate.impl_witness.a1a, element3 [concrete = constants.%EmptyRange.as.Iterate.impl.Next.67c] // CHECK:STDOUT: %bound_method.loc10_40.3: = bound_method %.loc10_39.2, %impl.elem3 -// CHECK:STDOUT: %specific_fn.loc10_40.2: = specific_function %impl.elem3, @EmptyRange.as.Iterate.impl.Next(constants.%Copy.facet.0cb) [concrete = constants.%EmptyRange.as.Iterate.impl.Next.specific_fn] +// CHECK:STDOUT: %specific_fn.loc10_40.2: = specific_function %impl.elem3, @EmptyRange.as.Iterate.impl.Next(constants.%Copy.facet.bfc) [concrete = constants.%EmptyRange.as.Iterate.impl.Next.specific_fn] // CHECK:STDOUT: %bound_method.loc10_40.4: = bound_method %.loc10_39.2, %specific_fn.loc10_40.2 -// CHECK:STDOUT: %.loc10_40.1: ref %Optional.73d = temporary_storage -// CHECK:STDOUT: %.loc10_39.4: %EmptyRange.a62 = bind_value %.loc10_39.2 -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.call: init %Optional.73d = call %bound_method.loc10_40.4(%.loc10_39.4, %addr.loc10_40.1) to %.loc10_40.1 -// CHECK:STDOUT: %.loc10_40.2: ref %Optional.73d = temporary %.loc10_40.1, %EmptyRange.as.Iterate.impl.Next.call -// CHECK:STDOUT: %.loc10_40.3: %Optional.HasValue.type.c31 = specific_constant imports.%Main.import_ref.13f, @Optional(constants.%Copy.facet.0cb) [concrete = constants.%Optional.HasValue.e8d] -// CHECK:STDOUT: %HasValue.ref: %Optional.HasValue.type.c31 = name_ref HasValue, %.loc10_40.3 [concrete = constants.%Optional.HasValue.e8d] +// CHECK:STDOUT: %.loc10_40.1: ref %Optional.202 = temporary_storage +// CHECK:STDOUT: %.loc10_39.4: %EmptyRange.8bd = bind_value %.loc10_39.2 +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.call: init %Optional.202 = call %bound_method.loc10_40.4(%.loc10_39.4, %addr.loc10_40.1) to %.loc10_40.1 +// CHECK:STDOUT: %.loc10_40.2: ref %Optional.202 = temporary %.loc10_40.1, %EmptyRange.as.Iterate.impl.Next.call +// CHECK:STDOUT: %.loc10_40.3: %Optional.HasValue.type.632 = specific_constant imports.%Main.import_ref.13f, @Optional(constants.%Copy.facet.bfc) [concrete = constants.%Optional.HasValue.13f] +// CHECK:STDOUT: %HasValue.ref: %Optional.HasValue.type.632 = name_ref HasValue, %.loc10_40.3 [concrete = constants.%Optional.HasValue.13f] // CHECK:STDOUT: %Optional.HasValue.bound: = bound_method %.loc10_40.2, %HasValue.ref -// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %HasValue.ref, @Optional.HasValue(constants.%Copy.facet.0cb) [concrete = constants.%Optional.HasValue.specific_fn] +// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %HasValue.ref, @Optional.HasValue(constants.%Copy.facet.bfc) [concrete = constants.%Optional.HasValue.specific_fn] // CHECK:STDOUT: %bound_method.loc10_40.5: = bound_method %.loc10_40.2, %Optional.HasValue.specific_fn -// CHECK:STDOUT: %.loc10_40.4: %Optional.73d = bind_value %.loc10_40.2 +// CHECK:STDOUT: %.loc10_40.4: %Optional.202 = bind_value %.loc10_40.2 // CHECK:STDOUT: %Optional.HasValue.call: init bool = call %bound_method.loc10_40.5(%.loc10_40.4) // CHECK:STDOUT: %.loc10_40.5: bool = value_of_initializer %Optional.HasValue.call // CHECK:STDOUT: %.loc10_40.6: bool = converted %Optional.HasValue.call, %.loc10_40.5 @@ -410,13 +414,13 @@ fn Run() { // CHECK:STDOUT: // CHECK:STDOUT: !for.body: // CHECK:STDOUT: %c.var: ref %C = var %c.var_patt -// CHECK:STDOUT: %.loc10_40.7: %Optional.Get.type.a20 = specific_constant imports.%Main.import_ref.a3b, @Optional(constants.%Copy.facet.0cb) [concrete = constants.%Optional.Get.c56] -// CHECK:STDOUT: %Get.ref: %Optional.Get.type.a20 = name_ref Get, %.loc10_40.7 [concrete = constants.%Optional.Get.c56] +// CHECK:STDOUT: %.loc10_40.7: %Optional.Get.type.e88 = specific_constant imports.%Main.import_ref.a3b, @Optional(constants.%Copy.facet.bfc) [concrete = constants.%Optional.Get.736] +// CHECK:STDOUT: %Get.ref: %Optional.Get.type.e88 = name_ref Get, %.loc10_40.7 [concrete = constants.%Optional.Get.736] // CHECK:STDOUT: %Optional.Get.bound: = bound_method %.loc10_40.2, %Get.ref -// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Get.ref, @Optional.Get(constants.%Copy.facet.0cb) [concrete = constants.%Optional.Get.specific_fn] +// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Get.ref, @Optional.Get(constants.%Copy.facet.bfc) [concrete = constants.%Optional.Get.specific_fn] // CHECK:STDOUT: %bound_method.loc10_40.6: = bound_method %.loc10_40.2, %Optional.Get.specific_fn // CHECK:STDOUT: %.loc10_8: ref %C = splice_block %c.var {} -// CHECK:STDOUT: %.loc10_40.8: %Optional.73d = bind_value %.loc10_40.2 +// CHECK:STDOUT: %.loc10_40.8: %Optional.202 = bind_value %.loc10_40.2 // CHECK:STDOUT: %Optional.Get.call: init %C = call %bound_method.loc10_40.6(%.loc10_40.8) to %.loc10_8 // CHECK:STDOUT: assign %c.var, %Optional.Get.call // CHECK:STDOUT: %C.ref.loc10_15: type = name_ref C, imports.%Main.C [concrete = constants.%C] @@ -431,20 +435,20 @@ fn Run() { // CHECK:STDOUT: %C.as.Destroy.impl.Op.bound: = bound_method %c.var, constants.%C.as.Destroy.impl.Op // CHECK:STDOUT: %addr.loc10_8: %ptr.019 = addr_of %c.var // CHECK:STDOUT: %C.as.Destroy.impl.Op.call: init %empty_tuple.type = call %C.as.Destroy.impl.Op.bound(%addr.loc10_8) -// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.bound: = bound_method %.loc10_40.2, constants.%Optional.as.Destroy.impl.Op.84e +// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.bound: = bound_method %.loc10_40.2, constants.%Optional.as.Destroy.impl.Op.5bc // CHECK:STDOUT: // CHECK:STDOUT: %bound_method.loc10_40.7: = bound_method %.loc10_40.2, %Optional.as.Destroy.impl.Op.specific_fn -// CHECK:STDOUT: %addr.loc10_40.2: %ptr.3f9 = addr_of %.loc10_40.2 +// CHECK:STDOUT: %addr.loc10_40.2: %ptr.00c = addr_of %.loc10_40.2 // CHECK:STDOUT: %Optional.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc10_40.7(%addr.loc10_40.2) // CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %var, constants.%T.as.Destroy.impl.Op.24b // CHECK:STDOUT: // CHECK:STDOUT: %bound_method.loc10_40.8: = bound_method %var, %T.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr.loc10_40.3: %ptr.c28 = addr_of %var // CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc10_40.8(%addr.loc10_40.3) -// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.bound: = bound_method %.loc10_39.2, constants.%EmptyRange.as.Destroy.impl.Op.61e +// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.bound: = bound_method %.loc10_39.2, constants.%EmptyRange.as.Destroy.impl.Op.dd8 // CHECK:STDOUT: // CHECK:STDOUT: %bound_method.loc10_39: = bound_method %.loc10_39.2, %EmptyRange.as.Destroy.impl.Op.specific_fn -// CHECK:STDOUT: %addr.loc10_39: %ptr.49e = addr_of %.loc10_39.2 +// CHECK:STDOUT: %addr.loc10_39: %ptr.2e0 = addr_of %.loc10_39.2 // CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc10_39(%addr.loc10_39) // CHECK:STDOUT: // CHECK:STDOUT: } @@ -468,15 +472,18 @@ fn Run() { // CHECK:STDOUT: %EmptyRange.Make.type.7d6: type = fn_type @EmptyRange.Make, @EmptyRange(%T.049) [symbolic] // CHECK:STDOUT: %EmptyRange.Make.4cc: %EmptyRange.Make.type.7d6 = struct_value () [symbolic] // CHECK:STDOUT: %tuple.type.24b: type = tuple_type (type, type) [concrete] -// CHECK:STDOUT: %Copy.impl_witness.d73: = impl_witness imports.%Copy.impl_witness_table.71a [concrete] -// CHECK:STDOUT: %Copy.facet.c6c: %Copy.type = facet_value bool, (%Copy.impl_witness.d73) [concrete] -// CHECK:STDOUT: %Copy.impl_witness.573: = impl_witness imports.%Copy.impl_witness_table.d24, @tuple.type.as.Copy.impl(%Copy.facet.c6c, %Copy.facet.c6c) [concrete] -// CHECK:STDOUT: %Copy.facet.16a: %Copy.type = facet_value %tuple.type.784, (%Copy.impl_witness.573) [concrete] -// CHECK:STDOUT: %EmptyRange.cfc: type = class_type @EmptyRange, @EmptyRange(%Copy.facet.16a) [concrete] -// CHECK:STDOUT: %EmptyRange.Make.type.7a6: type = fn_type @EmptyRange.Make, @EmptyRange(%Copy.facet.16a) [concrete] -// CHECK:STDOUT: %EmptyRange.Make.5e1: %EmptyRange.Make.type.7a6 = struct_value () [concrete] +// CHECK:STDOUT: %U: %Copy.type = bind_symbolic_name U, 1 [symbolic] +// CHECK:STDOUT: %tuple.type.as.Copy.impl.Op.type.d93: type = fn_type @tuple.type.as.Copy.impl.Op.1, @tuple.type.as.Copy.impl.177(%T.049, %U) [symbolic] +// CHECK:STDOUT: %tuple.type.as.Copy.impl.Op.1f0: %tuple.type.as.Copy.impl.Op.type.d93 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.5da: = impl_witness imports.%Copy.impl_witness_table.185 [concrete] +// CHECK:STDOUT: %Copy.facet.2e3: %Copy.type = facet_value bool, (%Copy.impl_witness.5da) [concrete] +// CHECK:STDOUT: %Copy.impl_witness.df3: = impl_witness imports.%Copy.impl_witness_table.442, @tuple.type.as.Copy.impl.177(%Copy.facet.2e3, %Copy.facet.2e3) [concrete] +// CHECK:STDOUT: %Copy.facet.e16: %Copy.type = facet_value %tuple.type.784, (%Copy.impl_witness.df3) [concrete] +// CHECK:STDOUT: %EmptyRange.bb5: type = class_type @EmptyRange, @EmptyRange(%Copy.facet.e16) [concrete] +// CHECK:STDOUT: %EmptyRange.Make.type.e08: type = fn_type @EmptyRange.Make, @EmptyRange(%Copy.facet.e16) [concrete] +// CHECK:STDOUT: %EmptyRange.Make.f6d: %EmptyRange.Make.type.e08 = struct_value () [concrete] // CHECK:STDOUT: %ptr.c28: type = ptr_type %empty_struct_type [concrete] -// CHECK:STDOUT: %EmptyRange.Make.specific_fn: = specific_function %EmptyRange.Make.5e1, @EmptyRange.Make(%Copy.facet.16a) [concrete] +// CHECK:STDOUT: %EmptyRange.Make.specific_fn: = specific_function %EmptyRange.Make.f6d, @EmptyRange.Make(%Copy.facet.e16) [concrete] // CHECK:STDOUT: %Iterate.type: type = facet_type <@Iterate> [concrete] // CHECK:STDOUT: %Iterate.NewCursor.type: type = fn_type @Iterate.NewCursor [concrete] // CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.type.be4: type = fn_type @EmptyRange.as.Iterate.impl.NewCursor, @EmptyRange.as.Iterate.impl(%T.049) [symbolic] @@ -487,44 +494,46 @@ fn Run() { // CHECK:STDOUT: %Optional.HasValue.5a0: %Optional.HasValue.type.091 = struct_value () [symbolic] // CHECK:STDOUT: %Optional.Get.type.618: type = fn_type @Optional.Get, @Optional(%T.049) [symbolic] // CHECK:STDOUT: %Optional.Get.9cc: %Optional.Get.type.618 = struct_value () [symbolic] -// CHECK:STDOUT: %Iterate.impl_witness.9f8: = impl_witness imports.%Iterate.impl_witness_table, @EmptyRange.as.Iterate.impl(%Copy.facet.16a) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.type.f89: type = fn_type @EmptyRange.as.Iterate.impl.NewCursor, @EmptyRange.as.Iterate.impl(%Copy.facet.16a) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.2f0: %EmptyRange.as.Iterate.impl.NewCursor.type.f89 = struct_value () [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.type.4bb: type = fn_type @EmptyRange.as.Iterate.impl.Next, @EmptyRange.as.Iterate.impl(%Copy.facet.16a) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.ef5: %EmptyRange.as.Iterate.impl.Next.type.4bb = struct_value () [concrete] -// CHECK:STDOUT: %Iterate.facet: %Iterate.type = facet_value %EmptyRange.cfc, (%Iterate.impl_witness.9f8) [concrete] -// CHECK:STDOUT: %.b2f: type = fn_type_with_self_type %Iterate.NewCursor.type, %Iterate.facet [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.specific_fn: = specific_function %EmptyRange.as.Iterate.impl.NewCursor.2f0, @EmptyRange.as.Iterate.impl.NewCursor(%Copy.facet.16a) [concrete] +// CHECK:STDOUT: %Iterate.impl_witness.0ab: = impl_witness imports.%Iterate.impl_witness_table, @EmptyRange.as.Iterate.impl(%Copy.facet.e16) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.type.3b4: type = fn_type @EmptyRange.as.Iterate.impl.NewCursor, @EmptyRange.as.Iterate.impl(%Copy.facet.e16) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.5b3: %EmptyRange.as.Iterate.impl.NewCursor.type.3b4 = struct_value () [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.type.1b4: type = fn_type @EmptyRange.as.Iterate.impl.Next, @EmptyRange.as.Iterate.impl(%Copy.facet.e16) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.df7: %EmptyRange.as.Iterate.impl.Next.type.1b4 = struct_value () [concrete] +// CHECK:STDOUT: %Iterate.facet: %Iterate.type = facet_value %EmptyRange.bb5, (%Iterate.impl_witness.0ab) [concrete] +// CHECK:STDOUT: %.1a1: type = fn_type_with_self_type %Iterate.NewCursor.type, %Iterate.facet [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.specific_fn: = specific_function %EmptyRange.as.Iterate.impl.NewCursor.5b3, @EmptyRange.as.Iterate.impl.NewCursor(%Copy.facet.e16) [concrete] // CHECK:STDOUT: %Iterate.Next.type: type = fn_type @Iterate.Next [concrete] -// CHECK:STDOUT: %.d59: type = fn_type_with_self_type %Iterate.Next.type, %Iterate.facet [concrete] -// CHECK:STDOUT: %Optional.441: type = class_type @Optional, @Optional(%Copy.facet.16a) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.specific_fn: = specific_function %EmptyRange.as.Iterate.impl.Next.ef5, @EmptyRange.as.Iterate.impl.Next(%Copy.facet.16a) [concrete] -// CHECK:STDOUT: %Optional.HasValue.type.3a0: type = fn_type @Optional.HasValue, @Optional(%Copy.facet.16a) [concrete] -// CHECK:STDOUT: %Optional.HasValue.be0: %Optional.HasValue.type.3a0 = struct_value () [concrete] -// CHECK:STDOUT: %Optional.Get.type.48f: type = fn_type @Optional.Get, @Optional(%Copy.facet.16a) [concrete] -// CHECK:STDOUT: %Optional.Get.d5b: %Optional.Get.type.48f = struct_value () [concrete] +// CHECK:STDOUT: %.03b: type = fn_type_with_self_type %Iterate.Next.type, %Iterate.facet [concrete] +// CHECK:STDOUT: %Optional.9b3: type = class_type @Optional, @Optional(%Copy.facet.e16) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.specific_fn: = specific_function %EmptyRange.as.Iterate.impl.Next.df7, @EmptyRange.as.Iterate.impl.Next(%Copy.facet.e16) [concrete] +// CHECK:STDOUT: %Optional.HasValue.type.bcc: type = fn_type @Optional.HasValue, @Optional(%Copy.facet.e16) [concrete] +// CHECK:STDOUT: %Optional.HasValue.1e6: %Optional.HasValue.type.bcc = struct_value () [concrete] +// CHECK:STDOUT: %Optional.Get.type.ee0: type = fn_type @Optional.Get, @Optional(%Copy.facet.e16) [concrete] +// CHECK:STDOUT: %Optional.Get.5bb: %Optional.Get.type.ee0 = struct_value () [concrete] // CHECK:STDOUT: %ptr.b85: type = ptr_type %tuple.type.784 [concrete] -// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %Optional.HasValue.be0, @Optional.HasValue(%Copy.facet.16a) [concrete] -// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Optional.Get.d5b, @Optional.Get(%Copy.facet.16a) [concrete] +// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %Optional.HasValue.1e6, @Optional.HasValue(%Copy.facet.e16) [concrete] +// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Optional.Get.5bb, @Optional.Get(%Copy.facet.e16) [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.type.ca1: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%tuple.type.784) [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.af8: %T.as.Destroy.impl.Op.type.ca1 = struct_value () [concrete] -// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.type.aac: type = fn_type @Optional.as.Destroy.impl.Op, @Optional.as.Destroy.impl(%Copy.facet.16a) [concrete] -// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.1f8: %Optional.as.Destroy.impl.Op.type.aac = struct_value () [concrete] -// CHECK:STDOUT: %ptr.bed: type = ptr_type %Optional.441 [concrete] +// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.type.cec: type = fn_type @Optional.as.Destroy.impl.Op, @Optional.as.Destroy.impl(%Copy.facet.e16) [concrete] +// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.d4b: %Optional.as.Destroy.impl.Op.type.cec = struct_value () [concrete] +// CHECK:STDOUT: %ptr.9dd: type = ptr_type %Optional.9b3 [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.type.456: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%empty_struct_type) [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.24b: %T.as.Destroy.impl.Op.type.456 = struct_value () [concrete] -// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.type.f19: type = fn_type @EmptyRange.as.Destroy.impl.Op, @EmptyRange.as.Destroy.impl(%Copy.facet.16a) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.ecb: %EmptyRange.as.Destroy.impl.Op.type.f19 = struct_value () [concrete] -// CHECK:STDOUT: %ptr.df3: type = ptr_type %EmptyRange.cfc [concrete] +// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.type.6f7: type = fn_type @EmptyRange.as.Destroy.impl.Op, @EmptyRange.as.Destroy.impl(%Copy.facet.e16) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.49a: %EmptyRange.as.Destroy.impl.Op.type.6f7 = struct_value () [concrete] +// CHECK:STDOUT: %ptr.4e1: type = ptr_type %EmptyRange.bb5 [concrete] +// CHECK:STDOUT: %bool.as.Copy.impl.Op.type: type = fn_type @bool.as.Copy.impl.Op [concrete] +// CHECK:STDOUT: %bool.as.Copy.impl.Op: %bool.as.Copy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.EmptyRange: %EmptyRange.type = import_ref Main//empty_range, EmptyRange, loaded [concrete = constants.%EmptyRange.generic] // CHECK:STDOUT: %Main.import_ref.787: @EmptyRange.%EmptyRange.Make.type (%EmptyRange.Make.type.7d6) = import_ref Main//empty_range, loc5_21, loaded [symbolic = @EmptyRange.%EmptyRange.Make (constants.%EmptyRange.Make.4cc)] -// CHECK:STDOUT: %Core.import_ref.570 = import_ref Core//prelude/parts/copy, loc44_31, unloaded -// CHECK:STDOUT: %Copy.impl_witness_table.d24 = impl_witness_table (%Core.import_ref.570), @tuple.type.as.Copy.impl [concrete] -// CHECK:STDOUT: %Core.import_ref.a7d = import_ref Core//prelude/parts/copy, loc16_31, unloaded -// CHECK:STDOUT: %Copy.impl_witness_table.71a = impl_witness_table (%Core.import_ref.a7d), @bool.as.Copy.impl [concrete] +// CHECK:STDOUT: %Core.import_ref.d98: @tuple.type.as.Copy.impl.177.%tuple.type.as.Copy.impl.Op.type (%tuple.type.as.Copy.impl.Op.type.d93) = import_ref Core//prelude/parts/copy, loc48_31, loaded [symbolic = @tuple.type.as.Copy.impl.177.%tuple.type.as.Copy.impl.Op (constants.%tuple.type.as.Copy.impl.Op.1f0)] +// CHECK:STDOUT: %Copy.impl_witness_table.442 = impl_witness_table (%Core.import_ref.d98), @tuple.type.as.Copy.impl.177 [concrete] +// CHECK:STDOUT: %Core.import_ref.a3a: %bool.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc20_31, loaded [concrete = constants.%bool.as.Copy.impl.Op] +// CHECK:STDOUT: %Copy.impl_witness_table.185 = impl_witness_table (%Core.import_ref.a3a), @bool.as.Copy.impl [concrete] // CHECK:STDOUT: %Main.import_ref.101 = import_ref Main//empty_range, loc7_68, unloaded // CHECK:STDOUT: %Main.import_ref.999 = import_ref Main//empty_range, loc7_68, unloaded // CHECK:STDOUT: %Main.import_ref.8f30: @EmptyRange.as.Iterate.impl.%EmptyRange.as.Iterate.impl.NewCursor.type (%EmptyRange.as.Iterate.impl.NewCursor.type.be4) = import_ref Main//empty_range, loc8_38, loaded [symbolic = @EmptyRange.as.Iterate.impl.%EmptyRange.as.Iterate.impl.NewCursor (constants.%EmptyRange.as.Iterate.impl.NewCursor.61a)] @@ -549,24 +558,24 @@ fn Run() { // CHECK:STDOUT: %.loc10_53.2: type = converted %Bool.call.loc10_42, %.loc10_53.1 [concrete = bool] // CHECK:STDOUT: %.loc10_53.3: type = value_of_initializer %Bool.call.loc10_48 [concrete = bool] // CHECK:STDOUT: %.loc10_53.4: type = converted %Bool.call.loc10_48, %.loc10_53.3 [concrete = bool] -// CHECK:STDOUT: %Copy.facet.loc10_53.1: %Copy.type = facet_value bool, (constants.%Copy.impl_witness.d73) [concrete = constants.%Copy.facet.c6c] -// CHECK:STDOUT: %.loc10_53.5: %Copy.type = converted bool, %Copy.facet.loc10_53.1 [concrete = constants.%Copy.facet.c6c] -// CHECK:STDOUT: %Copy.facet.loc10_53.2: %Copy.type = facet_value bool, (constants.%Copy.impl_witness.d73) [concrete = constants.%Copy.facet.c6c] -// CHECK:STDOUT: %.loc10_53.6: %Copy.type = converted bool, %Copy.facet.loc10_53.2 [concrete = constants.%Copy.facet.c6c] -// CHECK:STDOUT: %Copy.facet.loc10_53.3: %Copy.type = facet_value constants.%tuple.type.784, (constants.%Copy.impl_witness.573) [concrete = constants.%Copy.facet.16a] -// CHECK:STDOUT: %.loc10_53.7: %Copy.type = converted %.loc10_52, %Copy.facet.loc10_53.3 [concrete = constants.%Copy.facet.16a] -// CHECK:STDOUT: %EmptyRange: type = class_type @EmptyRange, @EmptyRange(constants.%Copy.facet.16a) [concrete = constants.%EmptyRange.cfc] -// CHECK:STDOUT: %.loc10_54: %EmptyRange.Make.type.7a6 = specific_constant imports.%Main.import_ref.787, @EmptyRange(constants.%Copy.facet.16a) [concrete = constants.%EmptyRange.Make.5e1] -// CHECK:STDOUT: %Make.ref: %EmptyRange.Make.type.7a6 = name_ref Make, %.loc10_54 [concrete = constants.%EmptyRange.Make.5e1] -// CHECK:STDOUT: %EmptyRange.Make.specific_fn: = specific_function %Make.ref, @EmptyRange.Make(constants.%Copy.facet.16a) [concrete = constants.%EmptyRange.Make.specific_fn] -// CHECK:STDOUT: %.loc10_60.1: ref %EmptyRange.cfc = temporary_storage -// CHECK:STDOUT: %EmptyRange.Make.call: init %EmptyRange.cfc = call %EmptyRange.Make.specific_fn() to %.loc10_60.1 -// CHECK:STDOUT: %.loc10_60.2: ref %EmptyRange.cfc = temporary %.loc10_60.1, %EmptyRange.Make.call -// CHECK:STDOUT: %impl.elem2: %.b2f = impl_witness_access constants.%Iterate.impl_witness.9f8, element2 [concrete = constants.%EmptyRange.as.Iterate.impl.NewCursor.2f0] +// CHECK:STDOUT: %Copy.facet.loc10_53.1: %Copy.type = facet_value bool, (constants.%Copy.impl_witness.5da) [concrete = constants.%Copy.facet.2e3] +// CHECK:STDOUT: %.loc10_53.5: %Copy.type = converted bool, %Copy.facet.loc10_53.1 [concrete = constants.%Copy.facet.2e3] +// CHECK:STDOUT: %Copy.facet.loc10_53.2: %Copy.type = facet_value bool, (constants.%Copy.impl_witness.5da) [concrete = constants.%Copy.facet.2e3] +// CHECK:STDOUT: %.loc10_53.6: %Copy.type = converted bool, %Copy.facet.loc10_53.2 [concrete = constants.%Copy.facet.2e3] +// CHECK:STDOUT: %Copy.facet.loc10_53.3: %Copy.type = facet_value constants.%tuple.type.784, (constants.%Copy.impl_witness.df3) [concrete = constants.%Copy.facet.e16] +// CHECK:STDOUT: %.loc10_53.7: %Copy.type = converted %.loc10_52, %Copy.facet.loc10_53.3 [concrete = constants.%Copy.facet.e16] +// CHECK:STDOUT: %EmptyRange: type = class_type @EmptyRange, @EmptyRange(constants.%Copy.facet.e16) [concrete = constants.%EmptyRange.bb5] +// CHECK:STDOUT: %.loc10_54: %EmptyRange.Make.type.e08 = specific_constant imports.%Main.import_ref.787, @EmptyRange(constants.%Copy.facet.e16) [concrete = constants.%EmptyRange.Make.f6d] +// CHECK:STDOUT: %Make.ref: %EmptyRange.Make.type.e08 = name_ref Make, %.loc10_54 [concrete = constants.%EmptyRange.Make.f6d] +// CHECK:STDOUT: %EmptyRange.Make.specific_fn: = specific_function %Make.ref, @EmptyRange.Make(constants.%Copy.facet.e16) [concrete = constants.%EmptyRange.Make.specific_fn] +// CHECK:STDOUT: %.loc10_60.1: ref %EmptyRange.bb5 = temporary_storage +// CHECK:STDOUT: %EmptyRange.Make.call: init %EmptyRange.bb5 = call %EmptyRange.Make.specific_fn() to %.loc10_60.1 +// CHECK:STDOUT: %.loc10_60.2: ref %EmptyRange.bb5 = temporary %.loc10_60.1, %EmptyRange.Make.call +// CHECK:STDOUT: %impl.elem2: %.1a1 = impl_witness_access constants.%Iterate.impl_witness.0ab, element2 [concrete = constants.%EmptyRange.as.Iterate.impl.NewCursor.5b3] // CHECK:STDOUT: %bound_method.loc10_61.1: = bound_method %.loc10_60.2, %impl.elem2 -// CHECK:STDOUT: %specific_fn.loc10_61.1: = specific_function %impl.elem2, @EmptyRange.as.Iterate.impl.NewCursor(constants.%Copy.facet.16a) [concrete = constants.%EmptyRange.as.Iterate.impl.NewCursor.specific_fn] +// CHECK:STDOUT: %specific_fn.loc10_61.1: = specific_function %impl.elem2, @EmptyRange.as.Iterate.impl.NewCursor(constants.%Copy.facet.e16) [concrete = constants.%EmptyRange.as.Iterate.impl.NewCursor.specific_fn] // CHECK:STDOUT: %bound_method.loc10_61.2: = bound_method %.loc10_60.2, %specific_fn.loc10_61.1 -// CHECK:STDOUT: %.loc10_60.3: %EmptyRange.cfc = bind_value %.loc10_60.2 +// CHECK:STDOUT: %.loc10_60.3: %EmptyRange.bb5 = bind_value %.loc10_60.2 // CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.call: init %empty_struct_type = call %bound_method.loc10_61.2(%.loc10_60.3) // CHECK:STDOUT: %var: ref %empty_struct_type = var invalid // CHECK:STDOUT: assign %var, %EmptyRange.as.Iterate.impl.NewCursor.call @@ -574,33 +583,33 @@ fn Run() { // CHECK:STDOUT: // CHECK:STDOUT: !for.next: // CHECK:STDOUT: %addr.loc10_61.1: %ptr.c28 = addr_of %var -// CHECK:STDOUT: %impl.elem3: %.d59 = impl_witness_access constants.%Iterate.impl_witness.9f8, element3 [concrete = constants.%EmptyRange.as.Iterate.impl.Next.ef5] +// CHECK:STDOUT: %impl.elem3: %.03b = impl_witness_access constants.%Iterate.impl_witness.0ab, element3 [concrete = constants.%EmptyRange.as.Iterate.impl.Next.df7] // CHECK:STDOUT: %bound_method.loc10_61.3: = bound_method %.loc10_60.2, %impl.elem3 -// CHECK:STDOUT: %specific_fn.loc10_61.2: = specific_function %impl.elem3, @EmptyRange.as.Iterate.impl.Next(constants.%Copy.facet.16a) [concrete = constants.%EmptyRange.as.Iterate.impl.Next.specific_fn] +// CHECK:STDOUT: %specific_fn.loc10_61.2: = specific_function %impl.elem3, @EmptyRange.as.Iterate.impl.Next(constants.%Copy.facet.e16) [concrete = constants.%EmptyRange.as.Iterate.impl.Next.specific_fn] // CHECK:STDOUT: %bound_method.loc10_61.4: = bound_method %.loc10_60.2, %specific_fn.loc10_61.2 -// CHECK:STDOUT: %.loc10_61.1: ref %Optional.441 = temporary_storage -// CHECK:STDOUT: %.loc10_60.4: %EmptyRange.cfc = bind_value %.loc10_60.2 -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.call: init %Optional.441 = call %bound_method.loc10_61.4(%.loc10_60.4, %addr.loc10_61.1) to %.loc10_61.1 -// CHECK:STDOUT: %.loc10_61.2: ref %Optional.441 = temporary %.loc10_61.1, %EmptyRange.as.Iterate.impl.Next.call -// CHECK:STDOUT: %.loc10_61.3: %Optional.HasValue.type.3a0 = specific_constant imports.%Main.import_ref.13f, @Optional(constants.%Copy.facet.16a) [concrete = constants.%Optional.HasValue.be0] -// CHECK:STDOUT: %HasValue.ref: %Optional.HasValue.type.3a0 = name_ref HasValue, %.loc10_61.3 [concrete = constants.%Optional.HasValue.be0] +// CHECK:STDOUT: %.loc10_61.1: ref %Optional.9b3 = temporary_storage +// CHECK:STDOUT: %.loc10_60.4: %EmptyRange.bb5 = bind_value %.loc10_60.2 +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.call: init %Optional.9b3 = call %bound_method.loc10_61.4(%.loc10_60.4, %addr.loc10_61.1) to %.loc10_61.1 +// CHECK:STDOUT: %.loc10_61.2: ref %Optional.9b3 = temporary %.loc10_61.1, %EmptyRange.as.Iterate.impl.Next.call +// CHECK:STDOUT: %.loc10_61.3: %Optional.HasValue.type.bcc = specific_constant imports.%Main.import_ref.13f, @Optional(constants.%Copy.facet.e16) [concrete = constants.%Optional.HasValue.1e6] +// CHECK:STDOUT: %HasValue.ref: %Optional.HasValue.type.bcc = name_ref HasValue, %.loc10_61.3 [concrete = constants.%Optional.HasValue.1e6] // CHECK:STDOUT: %Optional.HasValue.bound: = bound_method %.loc10_61.2, %HasValue.ref -// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %HasValue.ref, @Optional.HasValue(constants.%Copy.facet.16a) [concrete = constants.%Optional.HasValue.specific_fn] +// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %HasValue.ref, @Optional.HasValue(constants.%Copy.facet.e16) [concrete = constants.%Optional.HasValue.specific_fn] // CHECK:STDOUT: %bound_method.loc10_61.5: = bound_method %.loc10_61.2, %Optional.HasValue.specific_fn -// CHECK:STDOUT: %.loc10_61.4: %Optional.441 = bind_value %.loc10_61.2 +// CHECK:STDOUT: %.loc10_61.4: %Optional.9b3 = bind_value %.loc10_61.2 // CHECK:STDOUT: %Optional.HasValue.call: init bool = call %bound_method.loc10_61.5(%.loc10_61.4) // CHECK:STDOUT: %.loc10_61.5: bool = value_of_initializer %Optional.HasValue.call // CHECK:STDOUT: %.loc10_61.6: bool = converted %Optional.HasValue.call, %.loc10_61.5 // CHECK:STDOUT: if %.loc10_61.6 br !for.body else br !for.done // CHECK:STDOUT: // CHECK:STDOUT: !for.body: -// CHECK:STDOUT: %.loc10_61.7: %Optional.Get.type.48f = specific_constant imports.%Main.import_ref.a3b, @Optional(constants.%Copy.facet.16a) [concrete = constants.%Optional.Get.d5b] -// CHECK:STDOUT: %Get.ref: %Optional.Get.type.48f = name_ref Get, %.loc10_61.7 [concrete = constants.%Optional.Get.d5b] +// CHECK:STDOUT: %.loc10_61.7: %Optional.Get.type.ee0 = specific_constant imports.%Main.import_ref.a3b, @Optional(constants.%Copy.facet.e16) [concrete = constants.%Optional.Get.5bb] +// CHECK:STDOUT: %Get.ref: %Optional.Get.type.ee0 = name_ref Get, %.loc10_61.7 [concrete = constants.%Optional.Get.5bb] // CHECK:STDOUT: %Optional.Get.bound: = bound_method %.loc10_61.2, %Get.ref -// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Get.ref, @Optional.Get(constants.%Copy.facet.16a) [concrete = constants.%Optional.Get.specific_fn] +// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Get.ref, @Optional.Get(constants.%Copy.facet.e16) [concrete = constants.%Optional.Get.specific_fn] // CHECK:STDOUT: %bound_method.loc10_61.6: = bound_method %.loc10_61.2, %Optional.Get.specific_fn // CHECK:STDOUT: %.loc10_61.8: ref %tuple.type.784 = temporary_storage -// CHECK:STDOUT: %.loc10_61.9: %Optional.441 = bind_value %.loc10_61.2 +// CHECK:STDOUT: %.loc10_61.9: %Optional.9b3 = bind_value %.loc10_61.2 // CHECK:STDOUT: %Optional.Get.call: init %tuple.type.784 = call %bound_method.loc10_61.6(%.loc10_61.9) to %.loc10_61.8 // CHECK:STDOUT: %.loc10_61.10: ref %tuple.type.784 = temporary %.loc10_61.8, %Optional.Get.call // CHECK:STDOUT: %tuple.elem0: ref bool = tuple_access %.loc10_61.10, element0 @@ -631,20 +640,20 @@ fn Run() { // CHECK:STDOUT: %bound_method.loc10_61.7: = bound_method %.loc10_61.10, %T.as.Destroy.impl.Op.specific_fn.1 // CHECK:STDOUT: %addr.loc10_61.2: %ptr.b85 = addr_of %.loc10_61.10 // CHECK:STDOUT: %T.as.Destroy.impl.Op.call.loc10_61.1: init %empty_tuple.type = call %bound_method.loc10_61.7(%addr.loc10_61.2) -// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.bound: = bound_method %.loc10_61.2, constants.%Optional.as.Destroy.impl.Op.1f8 +// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.bound: = bound_method %.loc10_61.2, constants.%Optional.as.Destroy.impl.Op.d4b // CHECK:STDOUT: // CHECK:STDOUT: %bound_method.loc10_61.8: = bound_method %.loc10_61.2, %Optional.as.Destroy.impl.Op.specific_fn -// CHECK:STDOUT: %addr.loc10_61.3: %ptr.bed = addr_of %.loc10_61.2 +// CHECK:STDOUT: %addr.loc10_61.3: %ptr.9dd = addr_of %.loc10_61.2 // CHECK:STDOUT: %Optional.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc10_61.8(%addr.loc10_61.3) // CHECK:STDOUT: %T.as.Destroy.impl.Op.bound.loc10_61.2: = bound_method %var, constants.%T.as.Destroy.impl.Op.24b // CHECK:STDOUT: // CHECK:STDOUT: %bound_method.loc10_61.9: = bound_method %var, %T.as.Destroy.impl.Op.specific_fn.2 // CHECK:STDOUT: %addr.loc10_61.4: %ptr.c28 = addr_of %var // CHECK:STDOUT: %T.as.Destroy.impl.Op.call.loc10_61.2: init %empty_tuple.type = call %bound_method.loc10_61.9(%addr.loc10_61.4) -// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.bound: = bound_method %.loc10_60.2, constants.%EmptyRange.as.Destroy.impl.Op.ecb +// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.bound: = bound_method %.loc10_60.2, constants.%EmptyRange.as.Destroy.impl.Op.49a // CHECK:STDOUT: // CHECK:STDOUT: %bound_method.loc10_60: = bound_method %.loc10_60.2, %EmptyRange.as.Destroy.impl.Op.specific_fn -// CHECK:STDOUT: %addr.loc10_60: %ptr.df3 = addr_of %.loc10_60.2 +// CHECK:STDOUT: %addr.loc10_60: %ptr.4e1 = addr_of %.loc10_60.2 // CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc10_60(%addr.loc10_60) // CHECK:STDOUT: // CHECK:STDOUT: } @@ -668,14 +677,17 @@ fn Run() { // CHECK:STDOUT: %EmptyRange.Make.type.7d6: type = fn_type @EmptyRange.Make, @EmptyRange(%T.049) [symbolic] // CHECK:STDOUT: %EmptyRange.Make.4cc: %EmptyRange.Make.type.7d6 = struct_value () [symbolic] // CHECK:STDOUT: %tuple.type.24b: type = tuple_type (type, type) [concrete] -// CHECK:STDOUT: %Copy.impl_witness.5fc: = impl_witness imports.%Copy.impl_witness_table.349 [concrete] -// CHECK:STDOUT: %Copy.facet.0cb: %Copy.type = facet_value %C, (%Copy.impl_witness.5fc) [concrete] -// CHECK:STDOUT: %Copy.impl_witness.cda: = impl_witness imports.%Copy.impl_witness_table.d24, @tuple.type.as.Copy.impl(%Copy.facet.0cb, %Copy.facet.0cb) [concrete] -// CHECK:STDOUT: %Copy.facet.84f: %Copy.type = facet_value %tuple.type.56b, (%Copy.impl_witness.cda) [concrete] -// CHECK:STDOUT: %EmptyRange.b93: type = class_type @EmptyRange, @EmptyRange(%Copy.facet.84f) [concrete] -// CHECK:STDOUT: %EmptyRange.Make.type.880: type = fn_type @EmptyRange.Make, @EmptyRange(%Copy.facet.84f) [concrete] -// CHECK:STDOUT: %EmptyRange.Make.85f: %EmptyRange.Make.type.880 = struct_value () [concrete] -// CHECK:STDOUT: %EmptyRange.Make.specific_fn: = specific_function %EmptyRange.Make.85f, @EmptyRange.Make(%Copy.facet.84f) [concrete] +// CHECK:STDOUT: %U: %Copy.type = bind_symbolic_name U, 1 [symbolic] +// CHECK:STDOUT: %tuple.type.as.Copy.impl.Op.type.d93: type = fn_type @tuple.type.as.Copy.impl.Op.1, @tuple.type.as.Copy.impl.177(%T.049, %U) [symbolic] +// CHECK:STDOUT: %tuple.type.as.Copy.impl.Op.1f0: %tuple.type.as.Copy.impl.Op.type.d93 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.b58: = impl_witness imports.%Copy.impl_witness_table.943 [concrete] +// CHECK:STDOUT: %Copy.facet.bfc: %Copy.type = facet_value %C, (%Copy.impl_witness.b58) [concrete] +// CHECK:STDOUT: %Copy.impl_witness.e55: = impl_witness imports.%Copy.impl_witness_table.442, @tuple.type.as.Copy.impl.177(%Copy.facet.bfc, %Copy.facet.bfc) [concrete] +// CHECK:STDOUT: %Copy.facet.1a8: %Copy.type = facet_value %tuple.type.56b, (%Copy.impl_witness.e55) [concrete] +// CHECK:STDOUT: %EmptyRange.426: type = class_type @EmptyRange, @EmptyRange(%Copy.facet.1a8) [concrete] +// CHECK:STDOUT: %EmptyRange.Make.type.480: type = fn_type @EmptyRange.Make, @EmptyRange(%Copy.facet.1a8) [concrete] +// CHECK:STDOUT: %EmptyRange.Make.464: %EmptyRange.Make.type.480 = struct_value () [concrete] +// CHECK:STDOUT: %EmptyRange.Make.specific_fn: = specific_function %EmptyRange.Make.464, @EmptyRange.Make(%Copy.facet.1a8) [concrete] // CHECK:STDOUT: %Iterate.type: type = facet_type <@Iterate> [concrete] // CHECK:STDOUT: %Iterate.NewCursor.type: type = fn_type @Iterate.NewCursor [concrete] // CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.type.be4: type = fn_type @EmptyRange.as.Iterate.impl.NewCursor, @EmptyRange.as.Iterate.impl(%T.049) [symbolic] @@ -686,45 +698,47 @@ fn Run() { // CHECK:STDOUT: %Optional.HasValue.5a0: %Optional.HasValue.type.091 = struct_value () [symbolic] // CHECK:STDOUT: %Optional.Get.type.618: type = fn_type @Optional.Get, @Optional(%T.049) [symbolic] // CHECK:STDOUT: %Optional.Get.9cc: %Optional.Get.type.618 = struct_value () [symbolic] -// CHECK:STDOUT: %Iterate.impl_witness.1c3: = impl_witness imports.%Iterate.impl_witness_table, @EmptyRange.as.Iterate.impl(%Copy.facet.84f) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.type.adf: type = fn_type @EmptyRange.as.Iterate.impl.NewCursor, @EmptyRange.as.Iterate.impl(%Copy.facet.84f) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.c8f: %EmptyRange.as.Iterate.impl.NewCursor.type.adf = struct_value () [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.type.f5b: type = fn_type @EmptyRange.as.Iterate.impl.Next, @EmptyRange.as.Iterate.impl(%Copy.facet.84f) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.bcf: %EmptyRange.as.Iterate.impl.Next.type.f5b = struct_value () [concrete] -// CHECK:STDOUT: %Iterate.facet: %Iterate.type = facet_value %EmptyRange.b93, (%Iterate.impl_witness.1c3) [concrete] -// CHECK:STDOUT: %.a9f: type = fn_type_with_self_type %Iterate.NewCursor.type, %Iterate.facet [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.specific_fn: = specific_function %EmptyRange.as.Iterate.impl.NewCursor.c8f, @EmptyRange.as.Iterate.impl.NewCursor(%Copy.facet.84f) [concrete] +// CHECK:STDOUT: %Iterate.impl_witness.999: = impl_witness imports.%Iterate.impl_witness_table, @EmptyRange.as.Iterate.impl(%Copy.facet.1a8) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.type.52f: type = fn_type @EmptyRange.as.Iterate.impl.NewCursor, @EmptyRange.as.Iterate.impl(%Copy.facet.1a8) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.097: %EmptyRange.as.Iterate.impl.NewCursor.type.52f = struct_value () [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.type.941: type = fn_type @EmptyRange.as.Iterate.impl.Next, @EmptyRange.as.Iterate.impl(%Copy.facet.1a8) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.7f8: %EmptyRange.as.Iterate.impl.Next.type.941 = struct_value () [concrete] +// CHECK:STDOUT: %Iterate.facet: %Iterate.type = facet_value %EmptyRange.426, (%Iterate.impl_witness.999) [concrete] +// CHECK:STDOUT: %.dd0: type = fn_type_with_self_type %Iterate.NewCursor.type, %Iterate.facet [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.specific_fn: = specific_function %EmptyRange.as.Iterate.impl.NewCursor.097, @EmptyRange.as.Iterate.impl.NewCursor(%Copy.facet.1a8) [concrete] // CHECK:STDOUT: %Iterate.Next.type: type = fn_type @Iterate.Next [concrete] -// CHECK:STDOUT: %.813: type = fn_type_with_self_type %Iterate.Next.type, %Iterate.facet [concrete] -// CHECK:STDOUT: %Optional.07d: type = class_type @Optional, @Optional(%Copy.facet.84f) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.specific_fn: = specific_function %EmptyRange.as.Iterate.impl.Next.bcf, @EmptyRange.as.Iterate.impl.Next(%Copy.facet.84f) [concrete] -// CHECK:STDOUT: %Optional.HasValue.type.8d2: type = fn_type @Optional.HasValue, @Optional(%Copy.facet.84f) [concrete] -// CHECK:STDOUT: %Optional.HasValue.d61: %Optional.HasValue.type.8d2 = struct_value () [concrete] -// CHECK:STDOUT: %Optional.Get.type.4f2: type = fn_type @Optional.Get, @Optional(%Copy.facet.84f) [concrete] -// CHECK:STDOUT: %Optional.Get.ded: %Optional.Get.type.4f2 = struct_value () [concrete] -// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %Optional.HasValue.d61, @Optional.HasValue(%Copy.facet.84f) [concrete] -// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Optional.Get.ded, @Optional.Get(%Copy.facet.84f) [concrete] +// CHECK:STDOUT: %.53a: type = fn_type_with_self_type %Iterate.Next.type, %Iterate.facet [concrete] +// CHECK:STDOUT: %Optional.681: type = class_type @Optional, @Optional(%Copy.facet.1a8) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.specific_fn: = specific_function %EmptyRange.as.Iterate.impl.Next.7f8, @EmptyRange.as.Iterate.impl.Next(%Copy.facet.1a8) [concrete] +// CHECK:STDOUT: %Optional.HasValue.type.bac: type = fn_type @Optional.HasValue, @Optional(%Copy.facet.1a8) [concrete] +// CHECK:STDOUT: %Optional.HasValue.d51: %Optional.HasValue.type.bac = struct_value () [concrete] +// CHECK:STDOUT: %Optional.Get.type.d8d: type = fn_type @Optional.Get, @Optional(%Copy.facet.1a8) [concrete] +// CHECK:STDOUT: %Optional.Get.504: %Optional.Get.type.d8d = struct_value () [concrete] +// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %Optional.HasValue.d51, @Optional.HasValue(%Copy.facet.1a8) [concrete] +// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Optional.Get.504, @Optional.Get(%Copy.facet.1a8) [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.type.ee9: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%tuple.type.56b) [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.de5: %T.as.Destroy.impl.Op.type.ee9 = struct_value () [concrete] // CHECK:STDOUT: %ptr.9f0: type = ptr_type %tuple.type.56b [concrete] -// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.type.8ba: type = fn_type @Optional.as.Destroy.impl.Op, @Optional.as.Destroy.impl(%Copy.facet.84f) [concrete] -// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.78b: %Optional.as.Destroy.impl.Op.type.8ba = struct_value () [concrete] -// CHECK:STDOUT: %ptr.d6a: type = ptr_type %Optional.07d [concrete] +// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.type.91e: type = fn_type @Optional.as.Destroy.impl.Op, @Optional.as.Destroy.impl(%Copy.facet.1a8) [concrete] +// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.e94: %Optional.as.Destroy.impl.Op.type.91e = struct_value () [concrete] +// CHECK:STDOUT: %ptr.015: type = ptr_type %Optional.681 [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.type.456: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%empty_struct_type) [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.24b: %T.as.Destroy.impl.Op.type.456 = struct_value () [concrete] -// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.type.31a: type = fn_type @EmptyRange.as.Destroy.impl.Op, @EmptyRange.as.Destroy.impl(%Copy.facet.84f) [concrete] -// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.c9d: %EmptyRange.as.Destroy.impl.Op.type.31a = struct_value () [concrete] -// CHECK:STDOUT: %ptr.894: type = ptr_type %EmptyRange.b93 [concrete] +// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.type.bd6: type = fn_type @EmptyRange.as.Destroy.impl.Op, @EmptyRange.as.Destroy.impl(%Copy.facet.1a8) [concrete] +// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.90d: %EmptyRange.as.Destroy.impl.Op.type.bd6 = struct_value () [concrete] +// CHECK:STDOUT: %ptr.271: type = ptr_type %EmptyRange.426 [concrete] +// CHECK:STDOUT: %C.as.Copy.impl.Op.type: type = fn_type @C.as.Copy.impl.Op [concrete] +// CHECK:STDOUT: %C.as.Copy.impl.Op: %C.as.Copy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.EmptyRange: %EmptyRange.type = import_ref Main//empty_range, EmptyRange, loaded [concrete = constants.%EmptyRange.generic] // CHECK:STDOUT: %Main.C: type = import_ref Main//empty_range, C, loaded [concrete = constants.%C] // CHECK:STDOUT: %Main.import_ref.787: @EmptyRange.%EmptyRange.Make.type (%EmptyRange.Make.type.7d6) = import_ref Main//empty_range, loc5_21, loaded [symbolic = @EmptyRange.%EmptyRange.Make (constants.%EmptyRange.Make.4cc)] -// CHECK:STDOUT: %Core.import_ref.570 = import_ref Core//prelude/parts/copy, loc44_31, unloaded -// CHECK:STDOUT: %Copy.impl_witness_table.d24 = impl_witness_table (%Core.import_ref.570), @tuple.type.as.Copy.impl [concrete] -// CHECK:STDOUT: %Main.import_ref.a43 = import_ref Main//empty_range, loc19_33, unloaded -// CHECK:STDOUT: %Copy.impl_witness_table.349 = impl_witness_table (%Main.import_ref.a43), @C.as.Copy.impl [concrete] +// CHECK:STDOUT: %Core.import_ref.d98: @tuple.type.as.Copy.impl.177.%tuple.type.as.Copy.impl.Op.type (%tuple.type.as.Copy.impl.Op.type.d93) = import_ref Core//prelude/parts/copy, loc48_31, loaded [symbolic = @tuple.type.as.Copy.impl.177.%tuple.type.as.Copy.impl.Op (constants.%tuple.type.as.Copy.impl.Op.1f0)] +// CHECK:STDOUT: %Copy.impl_witness_table.442 = impl_witness_table (%Core.import_ref.d98), @tuple.type.as.Copy.impl.177 [concrete] +// CHECK:STDOUT: %Main.import_ref.e69: %C.as.Copy.impl.Op.type = import_ref Main//empty_range, loc19_33, loaded [concrete = constants.%C.as.Copy.impl.Op] +// CHECK:STDOUT: %Copy.impl_witness_table.943 = impl_witness_table (%Main.import_ref.e69), @C.as.Copy.impl [concrete] // CHECK:STDOUT: %Main.import_ref.101 = import_ref Main//empty_range, loc7_68, unloaded // CHECK:STDOUT: %Main.import_ref.999 = import_ref Main//empty_range, loc7_68, unloaded // CHECK:STDOUT: %Main.import_ref.8f30: @EmptyRange.as.Iterate.impl.%EmptyRange.as.Iterate.impl.NewCursor.type (%EmptyRange.as.Iterate.impl.NewCursor.type.be4) = import_ref Main//empty_range, loc8_38, loaded [symbolic = @EmptyRange.as.Iterate.impl.%EmptyRange.as.Iterate.impl.NewCursor (constants.%EmptyRange.as.Iterate.impl.NewCursor.61a)] @@ -745,24 +759,24 @@ fn Run() { // CHECK:STDOUT: %C.ref.loc10_36: type = name_ref C, imports.%Main.C [concrete = constants.%C] // CHECK:STDOUT: %C.ref.loc10_39: type = name_ref C, imports.%Main.C [concrete = constants.%C] // CHECK:STDOUT: %.loc10_40: %tuple.type.24b = tuple_literal (%C.ref.loc10_36, %C.ref.loc10_39) -// CHECK:STDOUT: %Copy.facet.loc10_41.1: %Copy.type = facet_value constants.%C, (constants.%Copy.impl_witness.5fc) [concrete = constants.%Copy.facet.0cb] -// CHECK:STDOUT: %.loc10_41.1: %Copy.type = converted constants.%C, %Copy.facet.loc10_41.1 [concrete = constants.%Copy.facet.0cb] -// CHECK:STDOUT: %Copy.facet.loc10_41.2: %Copy.type = facet_value constants.%C, (constants.%Copy.impl_witness.5fc) [concrete = constants.%Copy.facet.0cb] -// CHECK:STDOUT: %.loc10_41.2: %Copy.type = converted constants.%C, %Copy.facet.loc10_41.2 [concrete = constants.%Copy.facet.0cb] -// CHECK:STDOUT: %Copy.facet.loc10_41.3: %Copy.type = facet_value constants.%tuple.type.56b, (constants.%Copy.impl_witness.cda) [concrete = constants.%Copy.facet.84f] -// CHECK:STDOUT: %.loc10_41.3: %Copy.type = converted %.loc10_40, %Copy.facet.loc10_41.3 [concrete = constants.%Copy.facet.84f] -// CHECK:STDOUT: %EmptyRange: type = class_type @EmptyRange, @EmptyRange(constants.%Copy.facet.84f) [concrete = constants.%EmptyRange.b93] -// CHECK:STDOUT: %.loc10_42: %EmptyRange.Make.type.880 = specific_constant imports.%Main.import_ref.787, @EmptyRange(constants.%Copy.facet.84f) [concrete = constants.%EmptyRange.Make.85f] -// CHECK:STDOUT: %Make.ref: %EmptyRange.Make.type.880 = name_ref Make, %.loc10_42 [concrete = constants.%EmptyRange.Make.85f] -// CHECK:STDOUT: %EmptyRange.Make.specific_fn: = specific_function %Make.ref, @EmptyRange.Make(constants.%Copy.facet.84f) [concrete = constants.%EmptyRange.Make.specific_fn] -// CHECK:STDOUT: %.loc10_48.1: ref %EmptyRange.b93 = temporary_storage -// CHECK:STDOUT: %EmptyRange.Make.call: init %EmptyRange.b93 = call %EmptyRange.Make.specific_fn() to %.loc10_48.1 -// CHECK:STDOUT: %.loc10_48.2: ref %EmptyRange.b93 = temporary %.loc10_48.1, %EmptyRange.Make.call -// CHECK:STDOUT: %impl.elem2: %.a9f = impl_witness_access constants.%Iterate.impl_witness.1c3, element2 [concrete = constants.%EmptyRange.as.Iterate.impl.NewCursor.c8f] +// CHECK:STDOUT: %Copy.facet.loc10_41.1: %Copy.type = facet_value constants.%C, (constants.%Copy.impl_witness.b58) [concrete = constants.%Copy.facet.bfc] +// CHECK:STDOUT: %.loc10_41.1: %Copy.type = converted constants.%C, %Copy.facet.loc10_41.1 [concrete = constants.%Copy.facet.bfc] +// CHECK:STDOUT: %Copy.facet.loc10_41.2: %Copy.type = facet_value constants.%C, (constants.%Copy.impl_witness.b58) [concrete = constants.%Copy.facet.bfc] +// CHECK:STDOUT: %.loc10_41.2: %Copy.type = converted constants.%C, %Copy.facet.loc10_41.2 [concrete = constants.%Copy.facet.bfc] +// CHECK:STDOUT: %Copy.facet.loc10_41.3: %Copy.type = facet_value constants.%tuple.type.56b, (constants.%Copy.impl_witness.e55) [concrete = constants.%Copy.facet.1a8] +// CHECK:STDOUT: %.loc10_41.3: %Copy.type = converted %.loc10_40, %Copy.facet.loc10_41.3 [concrete = constants.%Copy.facet.1a8] +// CHECK:STDOUT: %EmptyRange: type = class_type @EmptyRange, @EmptyRange(constants.%Copy.facet.1a8) [concrete = constants.%EmptyRange.426] +// CHECK:STDOUT: %.loc10_42: %EmptyRange.Make.type.480 = specific_constant imports.%Main.import_ref.787, @EmptyRange(constants.%Copy.facet.1a8) [concrete = constants.%EmptyRange.Make.464] +// CHECK:STDOUT: %Make.ref: %EmptyRange.Make.type.480 = name_ref Make, %.loc10_42 [concrete = constants.%EmptyRange.Make.464] +// CHECK:STDOUT: %EmptyRange.Make.specific_fn: = specific_function %Make.ref, @EmptyRange.Make(constants.%Copy.facet.1a8) [concrete = constants.%EmptyRange.Make.specific_fn] +// CHECK:STDOUT: %.loc10_48.1: ref %EmptyRange.426 = temporary_storage +// CHECK:STDOUT: %EmptyRange.Make.call: init %EmptyRange.426 = call %EmptyRange.Make.specific_fn() to %.loc10_48.1 +// CHECK:STDOUT: %.loc10_48.2: ref %EmptyRange.426 = temporary %.loc10_48.1, %EmptyRange.Make.call +// CHECK:STDOUT: %impl.elem2: %.dd0 = impl_witness_access constants.%Iterate.impl_witness.999, element2 [concrete = constants.%EmptyRange.as.Iterate.impl.NewCursor.097] // CHECK:STDOUT: %bound_method.loc10_49.1: = bound_method %.loc10_48.2, %impl.elem2 -// CHECK:STDOUT: %specific_fn.loc10_49.1: = specific_function %impl.elem2, @EmptyRange.as.Iterate.impl.NewCursor(constants.%Copy.facet.84f) [concrete = constants.%EmptyRange.as.Iterate.impl.NewCursor.specific_fn] +// CHECK:STDOUT: %specific_fn.loc10_49.1: = specific_function %impl.elem2, @EmptyRange.as.Iterate.impl.NewCursor(constants.%Copy.facet.1a8) [concrete = constants.%EmptyRange.as.Iterate.impl.NewCursor.specific_fn] // CHECK:STDOUT: %bound_method.loc10_49.2: = bound_method %.loc10_48.2, %specific_fn.loc10_49.1 -// CHECK:STDOUT: %.loc10_48.3: %EmptyRange.b93 = bind_value %.loc10_48.2 +// CHECK:STDOUT: %.loc10_48.3: %EmptyRange.426 = bind_value %.loc10_48.2 // CHECK:STDOUT: %EmptyRange.as.Iterate.impl.NewCursor.call: init %empty_struct_type = call %bound_method.loc10_49.2(%.loc10_48.3) // CHECK:STDOUT: %var: ref %empty_struct_type = var invalid // CHECK:STDOUT: assign %var, %EmptyRange.as.Iterate.impl.NewCursor.call @@ -770,33 +784,33 @@ fn Run() { // CHECK:STDOUT: // CHECK:STDOUT: !for.next: // CHECK:STDOUT: %addr.loc10_49.1: %ptr.c28 = addr_of %var -// CHECK:STDOUT: %impl.elem3: %.813 = impl_witness_access constants.%Iterate.impl_witness.1c3, element3 [concrete = constants.%EmptyRange.as.Iterate.impl.Next.bcf] +// CHECK:STDOUT: %impl.elem3: %.53a = impl_witness_access constants.%Iterate.impl_witness.999, element3 [concrete = constants.%EmptyRange.as.Iterate.impl.Next.7f8] // CHECK:STDOUT: %bound_method.loc10_49.3: = bound_method %.loc10_48.2, %impl.elem3 -// CHECK:STDOUT: %specific_fn.loc10_49.2: = specific_function %impl.elem3, @EmptyRange.as.Iterate.impl.Next(constants.%Copy.facet.84f) [concrete = constants.%EmptyRange.as.Iterate.impl.Next.specific_fn] +// CHECK:STDOUT: %specific_fn.loc10_49.2: = specific_function %impl.elem3, @EmptyRange.as.Iterate.impl.Next(constants.%Copy.facet.1a8) [concrete = constants.%EmptyRange.as.Iterate.impl.Next.specific_fn] // CHECK:STDOUT: %bound_method.loc10_49.4: = bound_method %.loc10_48.2, %specific_fn.loc10_49.2 -// CHECK:STDOUT: %.loc10_49.1: ref %Optional.07d = temporary_storage -// CHECK:STDOUT: %.loc10_48.4: %EmptyRange.b93 = bind_value %.loc10_48.2 -// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.call: init %Optional.07d = call %bound_method.loc10_49.4(%.loc10_48.4, %addr.loc10_49.1) to %.loc10_49.1 -// CHECK:STDOUT: %.loc10_49.2: ref %Optional.07d = temporary %.loc10_49.1, %EmptyRange.as.Iterate.impl.Next.call -// CHECK:STDOUT: %.loc10_49.3: %Optional.HasValue.type.8d2 = specific_constant imports.%Main.import_ref.13f, @Optional(constants.%Copy.facet.84f) [concrete = constants.%Optional.HasValue.d61] -// CHECK:STDOUT: %HasValue.ref: %Optional.HasValue.type.8d2 = name_ref HasValue, %.loc10_49.3 [concrete = constants.%Optional.HasValue.d61] +// CHECK:STDOUT: %.loc10_49.1: ref %Optional.681 = temporary_storage +// CHECK:STDOUT: %.loc10_48.4: %EmptyRange.426 = bind_value %.loc10_48.2 +// CHECK:STDOUT: %EmptyRange.as.Iterate.impl.Next.call: init %Optional.681 = call %bound_method.loc10_49.4(%.loc10_48.4, %addr.loc10_49.1) to %.loc10_49.1 +// CHECK:STDOUT: %.loc10_49.2: ref %Optional.681 = temporary %.loc10_49.1, %EmptyRange.as.Iterate.impl.Next.call +// CHECK:STDOUT: %.loc10_49.3: %Optional.HasValue.type.bac = specific_constant imports.%Main.import_ref.13f, @Optional(constants.%Copy.facet.1a8) [concrete = constants.%Optional.HasValue.d51] +// CHECK:STDOUT: %HasValue.ref: %Optional.HasValue.type.bac = name_ref HasValue, %.loc10_49.3 [concrete = constants.%Optional.HasValue.d51] // CHECK:STDOUT: %Optional.HasValue.bound: = bound_method %.loc10_49.2, %HasValue.ref -// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %HasValue.ref, @Optional.HasValue(constants.%Copy.facet.84f) [concrete = constants.%Optional.HasValue.specific_fn] +// CHECK:STDOUT: %Optional.HasValue.specific_fn: = specific_function %HasValue.ref, @Optional.HasValue(constants.%Copy.facet.1a8) [concrete = constants.%Optional.HasValue.specific_fn] // CHECK:STDOUT: %bound_method.loc10_49.5: = bound_method %.loc10_49.2, %Optional.HasValue.specific_fn -// CHECK:STDOUT: %.loc10_49.4: %Optional.07d = bind_value %.loc10_49.2 +// CHECK:STDOUT: %.loc10_49.4: %Optional.681 = bind_value %.loc10_49.2 // CHECK:STDOUT: %Optional.HasValue.call: init bool = call %bound_method.loc10_49.5(%.loc10_49.4) // CHECK:STDOUT: %.loc10_49.5: bool = value_of_initializer %Optional.HasValue.call // CHECK:STDOUT: %.loc10_49.6: bool = converted %Optional.HasValue.call, %.loc10_49.5 // CHECK:STDOUT: if %.loc10_49.6 br !for.body else br !for.done // CHECK:STDOUT: // CHECK:STDOUT: !for.body: -// CHECK:STDOUT: %.loc10_49.7: %Optional.Get.type.4f2 = specific_constant imports.%Main.import_ref.a3b, @Optional(constants.%Copy.facet.84f) [concrete = constants.%Optional.Get.ded] -// CHECK:STDOUT: %Get.ref: %Optional.Get.type.4f2 = name_ref Get, %.loc10_49.7 [concrete = constants.%Optional.Get.ded] +// CHECK:STDOUT: %.loc10_49.7: %Optional.Get.type.d8d = specific_constant imports.%Main.import_ref.a3b, @Optional(constants.%Copy.facet.1a8) [concrete = constants.%Optional.Get.504] +// CHECK:STDOUT: %Get.ref: %Optional.Get.type.d8d = name_ref Get, %.loc10_49.7 [concrete = constants.%Optional.Get.504] // CHECK:STDOUT: %Optional.Get.bound: = bound_method %.loc10_49.2, %Get.ref -// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Get.ref, @Optional.Get(constants.%Copy.facet.84f) [concrete = constants.%Optional.Get.specific_fn] +// CHECK:STDOUT: %Optional.Get.specific_fn: = specific_function %Get.ref, @Optional.Get(constants.%Copy.facet.1a8) [concrete = constants.%Optional.Get.specific_fn] // CHECK:STDOUT: %bound_method.loc10_49.6: = bound_method %.loc10_49.2, %Optional.Get.specific_fn // CHECK:STDOUT: %.loc10_49.8: ref %tuple.type.56b = temporary_storage -// CHECK:STDOUT: %.loc10_49.9: %Optional.07d = bind_value %.loc10_49.2 +// CHECK:STDOUT: %.loc10_49.9: %Optional.681 = bind_value %.loc10_49.2 // CHECK:STDOUT: %Optional.Get.call: init %tuple.type.56b = call %bound_method.loc10_49.6(%.loc10_49.9) to %.loc10_49.8 // CHECK:STDOUT: %.loc10_49.10: ref %tuple.type.56b = temporary %.loc10_49.8, %Optional.Get.call // CHECK:STDOUT: %tuple.elem0: ref %C = tuple_access %.loc10_49.10, element0 @@ -819,20 +833,20 @@ fn Run() { // CHECK:STDOUT: %bound_method.loc10_49.7: = bound_method %.loc10_49.10, %T.as.Destroy.impl.Op.specific_fn.1 // CHECK:STDOUT: %addr.loc10_49.2: %ptr.9f0 = addr_of %.loc10_49.10 // CHECK:STDOUT: %T.as.Destroy.impl.Op.call.loc10_49.1: init %empty_tuple.type = call %bound_method.loc10_49.7(%addr.loc10_49.2) -// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.bound: = bound_method %.loc10_49.2, constants.%Optional.as.Destroy.impl.Op.78b +// CHECK:STDOUT: %Optional.as.Destroy.impl.Op.bound: = bound_method %.loc10_49.2, constants.%Optional.as.Destroy.impl.Op.e94 // CHECK:STDOUT: // CHECK:STDOUT: %bound_method.loc10_49.8: = bound_method %.loc10_49.2, %Optional.as.Destroy.impl.Op.specific_fn -// CHECK:STDOUT: %addr.loc10_49.3: %ptr.d6a = addr_of %.loc10_49.2 +// CHECK:STDOUT: %addr.loc10_49.3: %ptr.015 = addr_of %.loc10_49.2 // CHECK:STDOUT: %Optional.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc10_49.8(%addr.loc10_49.3) // CHECK:STDOUT: %T.as.Destroy.impl.Op.bound.loc10_49.2: = bound_method %var, constants.%T.as.Destroy.impl.Op.24b // CHECK:STDOUT: // CHECK:STDOUT: %bound_method.loc10_49.9: = bound_method %var, %T.as.Destroy.impl.Op.specific_fn.2 // CHECK:STDOUT: %addr.loc10_49.4: %ptr.c28 = addr_of %var // CHECK:STDOUT: %T.as.Destroy.impl.Op.call.loc10_49.2: init %empty_tuple.type = call %bound_method.loc10_49.9(%addr.loc10_49.4) -// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.bound: = bound_method %.loc10_48.2, constants.%EmptyRange.as.Destroy.impl.Op.c9d +// CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.bound: = bound_method %.loc10_48.2, constants.%EmptyRange.as.Destroy.impl.Op.90d // CHECK:STDOUT: // CHECK:STDOUT: %bound_method.loc10_48: = bound_method %.loc10_48.2, %EmptyRange.as.Destroy.impl.Op.specific_fn -// CHECK:STDOUT: %addr.loc10_48: %ptr.894 = addr_of %.loc10_48.2 +// CHECK:STDOUT: %addr.loc10_48: %ptr.271 = addr_of %.loc10_48.2 // CHECK:STDOUT: %EmptyRange.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc10_48(%addr.loc10_48) // CHECK:STDOUT: // CHECK:STDOUT: } diff --git a/toolchain/check/testdata/function/builtin/call.carbon b/toolchain/check/testdata/function/builtin/call.carbon index 27fcb5ec9c8b..05e0a5186935 100644 --- a/toolchain/check/testdata/function/builtin/call.carbon +++ b/toolchain/check/testdata/function/builtin/call.carbon @@ -193,8 +193,6 @@ fn RuntimeCall(a: i32, b: i32) -> i32 { // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Add.call: init %i32 = call %Add.ref(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc20_19.1: %i32 = value_of_initializer %Add.call -// CHECK:STDOUT: %.loc20_19.2: %i32 = converted %Add.call, %.loc20_19.1 -// CHECK:STDOUT: return %.loc20_19.2 +// CHECK:STDOUT: return %Add.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/builtin/fail_redefined.carbon b/toolchain/check/testdata/function/builtin/fail_redefined.carbon index 84d6f52a606d..2aab515a29e9 100644 --- a/toolchain/check/testdata/function/builtin/fail_redefined.carbon +++ b/toolchain/check/testdata/function/builtin/fail_redefined.carbon @@ -48,12 +48,23 @@ fn C(n: i32, m: i32) -> i32 = "int.sadd"; // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %A.type.00d7e7.1: type = fn_type @A.loc15 [concrete] // CHECK:STDOUT: %A.1db889.1: %A.type.00d7e7.1 = struct_value () [concrete] // CHECK:STDOUT: %A.type.00d7e7.2: type = fn_type @A.loc23 [concrete] // CHECK:STDOUT: %A.1db889.2: %A.type.00d7e7.2 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %B.type.e168e5.1: type = fn_type @B.loc25 [concrete] // CHECK:STDOUT: %B.d1e2df.1: %B.type.e168e5.1 = struct_value () [concrete] // CHECK:STDOUT: %B.type.e168e5.2: type = fn_type @B.loc33 [concrete] @@ -67,10 +78,14 @@ fn C(n: i32, m: i32) -> i32 = "int.sadd"; // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -238,13 +253,23 @@ fn C(n: i32, m: i32) -> i32 = "int.sadd"; // CHECK:STDOUT: fn @A.loc23(%n.param: %i32, %m.param: %i32) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %n.ref: %i32 = name_ref n, %n -// CHECK:STDOUT: return %n.ref +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc23_38.1: = bound_method %n.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc23_38.2: = bound_method %n.ref, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc23_38.2(%n.ref) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B.loc25(%n.param: %i32, %m.param: %i32) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %n.ref: %i32 = name_ref n, %n -// CHECK:STDOUT: return %n.ref +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc25_38.1: = bound_method %n.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc25_38.2: = bound_method %n.ref, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc25_38.2(%n.ref) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B.loc33(%n.param: %i32, %m.param: %i32) -> %i32 = "int.sadd"; diff --git a/toolchain/check/testdata/function/call/alias.carbon b/toolchain/check/testdata/function/call/alias.carbon index 058d09fe5281..bbb66542fbec 100644 --- a/toolchain/check/testdata/function/call/alias.carbon +++ b/toolchain/check/testdata/function/call/alias.carbon @@ -70,10 +70,10 @@ fn Main() { // CHECK:STDOUT: // CHECK:STDOUT: fn @A() -> %empty_tuple.type { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc15_24: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc15_25: %empty_tuple.type = converted %.loc15_24, %empty_tuple [concrete = constants.%empty_tuple] -// CHECK:STDOUT: return %.loc15_25 +// CHECK:STDOUT: %.loc15_24.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc15_24.2: init %empty_tuple.type = tuple_init () to %return [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc15_25: init %empty_tuple.type = converted %.loc15_24.1, %.loc15_24.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc15_25 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() { diff --git a/toolchain/check/testdata/function/call/empty_struct.carbon b/toolchain/check/testdata/function/call/empty_struct.carbon index 7bbad25d51ed..3e4ed582076d 100644 --- a/toolchain/check/testdata/function/call/empty_struct.carbon +++ b/toolchain/check/testdata/function/call/empty_struct.carbon @@ -27,9 +27,9 @@ fn Main() { // CHECK:STDOUT: %pattern_type: type = pattern_type %empty_struct_type [concrete] // CHECK:STDOUT: %Echo.type: type = fn_type @Echo [concrete] // CHECK:STDOUT: %Echo: %Echo.type = struct_value () [concrete] +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete] // CHECK:STDOUT: %Main.type: type = fn_type @Main [concrete] // CHECK:STDOUT: %Main: %Main.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -60,7 +60,9 @@ fn Main() { // CHECK:STDOUT: fn @Echo(%a.param: %empty_struct_type) -> %empty_struct_type { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %empty_struct_type = name_ref a, %a -// CHECK:STDOUT: return %a.ref +// CHECK:STDOUT: %.loc16_10: init %empty_struct_type = struct_init () to %return [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc16_11: init %empty_struct_type = converted %a.ref, %.loc16_10 [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc16_11 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() { diff --git a/toolchain/check/testdata/function/call/empty_tuple.carbon b/toolchain/check/testdata/function/call/empty_tuple.carbon index 240ea4e9f6be..b89bada53418 100644 --- a/toolchain/check/testdata/function/call/empty_tuple.carbon +++ b/toolchain/check/testdata/function/call/empty_tuple.carbon @@ -27,9 +27,9 @@ fn Main() { // CHECK:STDOUT: %pattern_type: type = pattern_type %empty_tuple.type [concrete] // CHECK:STDOUT: %Echo.type: type = fn_type @Echo [concrete] // CHECK:STDOUT: %Echo: %Echo.type = struct_value () [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] // CHECK:STDOUT: %Main.type: type = fn_type @Main [concrete] // CHECK:STDOUT: %Main: %Main.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -60,7 +60,9 @@ fn Main() { // CHECK:STDOUT: fn @Echo(%a.param: %empty_tuple.type) -> %empty_tuple.type { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %empty_tuple.type = name_ref a, %a -// CHECK:STDOUT: return %a.ref +// CHECK:STDOUT: %.loc16_10: init %empty_tuple.type = tuple_init () to %return [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc16_11: init %empty_tuple.type = converted %a.ref, %.loc16_10 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc16_11 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() { diff --git a/toolchain/check/testdata/function/call/fail_return_type_mismatch.carbon b/toolchain/check/testdata/function/call/fail_return_type_mismatch.carbon index 19f71b8d1982..61b34d306187 100644 --- a/toolchain/check/testdata/function/call/fail_return_type_mismatch.carbon +++ b/toolchain/check/testdata/function/call/fail_return_type_mismatch.carbon @@ -111,9 +111,8 @@ fn Run() { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.FloatLiteral.as.ImplicitAs.impl.Convert(constants.%int_64) [concrete = constants.%Core.FloatLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc15_29.2: = bound_method %float, %specific_fn [concrete = constants.%bound_method] // CHECK:STDOUT: %Core.FloatLiteral.as.ImplicitAs.impl.Convert.call: init %f64.d77 = call %bound_method.loc15_29.2(%float) [concrete = constants.%float.d20] -// CHECK:STDOUT: %.loc15_29.1: %f64.d77 = value_of_initializer %Core.FloatLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%float.d20] -// CHECK:STDOUT: %.loc15_29.2: %f64.d77 = converted %float, %.loc15_29.1 [concrete = constants.%float.d20] -// CHECK:STDOUT: return %.loc15_29.2 +// CHECK:STDOUT: %.loc15: init %f64.d77 = converted %float, %Core.FloatLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%float.d20] +// CHECK:STDOUT: return %.loc15 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Run() { diff --git a/toolchain/check/testdata/function/call/i32.carbon b/toolchain/check/testdata/function/call/i32.carbon index 408be2a65632..87047846eba2 100644 --- a/toolchain/check/testdata/function/call/i32.carbon +++ b/toolchain/check/testdata/function/call/i32.carbon @@ -27,10 +27,21 @@ fn Main() { // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %Echo.type: type = fn_type @Echo [concrete] // CHECK:STDOUT: %Echo: %Echo.type = struct_value () [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %Main.type: type = fn_type @Main [concrete] // CHECK:STDOUT: %Main: %Main.type = struct_value () [concrete] // CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] @@ -60,12 +71,16 @@ fn Main() { // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] @@ -102,7 +117,12 @@ fn Main() { // CHECK:STDOUT: fn @Echo(%a.param: %i32) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a -// CHECK:STDOUT: return %a.ref +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc16_10.1: = bound_method %a.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc16_10.2: = bound_method %a.ref, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc16_10.2(%a.ref) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() { diff --git a/toolchain/check/testdata/function/call/prefer_unqualified_lookup.carbon b/toolchain/check/testdata/function/call/prefer_unqualified_lookup.carbon index 807b0e7f4b85..8c95da1deab8 100644 --- a/toolchain/check/testdata/function/call/prefer_unqualified_lookup.carbon +++ b/toolchain/check/testdata/function/call/prefer_unqualified_lookup.carbon @@ -252,9 +252,8 @@ fn Class(F:! type).Inner.G() -> i32 { return F(); } // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc8_29.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc8_29.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc8_29.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc8_29.2: %i32 = converted %int_0, %.loc8_29.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: return %.loc8_29.2 +// CHECK:STDOUT: %.loc8: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] +// CHECK:STDOUT: return %.loc8 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -267,13 +266,11 @@ fn Class(F:! type).Inner.G() -> i32 { return F(); } // CHECK:STDOUT: // CHECK:STDOUT: fn() -> %i32 { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc13_46: @Inner.G.%Inner.F.type (%Inner.F.type) = specific_constant @Inner.%Inner.F.decl, @Inner(constants.%F) [symbolic = %Inner.F (constants.%Inner.F)] -// CHECK:STDOUT: %F.ref: @Inner.G.%Inner.F.type (%Inner.F.type) = name_ref F, %.loc13_46 [symbolic = %Inner.F (constants.%Inner.F)] +// CHECK:STDOUT: %.loc13: @Inner.G.%Inner.F.type (%Inner.F.type) = specific_constant @Inner.%Inner.F.decl, @Inner(constants.%F) [symbolic = %Inner.F (constants.%Inner.F)] +// CHECK:STDOUT: %F.ref: @Inner.G.%Inner.F.type (%Inner.F.type) = name_ref F, %.loc13 [symbolic = %Inner.F (constants.%Inner.F)] // CHECK:STDOUT: %Inner.F.specific_fn.loc13_46.1: = specific_function %F.ref, @Inner.F(constants.%F) [symbolic = %Inner.F.specific_fn.loc13_46.2 (constants.%Inner.F.specific_fn)] // CHECK:STDOUT: %Inner.F.call: init %i32 = call %Inner.F.specific_fn.loc13_46.1() -// CHECK:STDOUT: %.loc13_49.1: %i32 = value_of_initializer %Inner.F.call -// CHECK:STDOUT: %.loc13_49.2: %i32 = converted %Inner.F.call, %.loc13_49.1 -// CHECK:STDOUT: return %.loc13_49.2 +// CHECK:STDOUT: return %Inner.F.call to %return.loc13 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/definition/fail_decl_param_mismatch.carbon b/toolchain/check/testdata/function/definition/fail_decl_param_mismatch.carbon index 8fe2205f8949..13be5e1d12bb 100644 --- a/toolchain/check/testdata/function/definition/fail_decl_param_mismatch.carbon +++ b/toolchain/check/testdata/function/definition/fail_decl_param_mismatch.carbon @@ -220,10 +220,10 @@ fn K() -> {} { return {}; } // CHECK:STDOUT: // CHECK:STDOUT: fn @I.loc50() -> %empty_tuple.type { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc50_24: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc50_25: %empty_tuple.type = converted %.loc50_24, %empty_tuple [concrete = constants.%empty_tuple] -// CHECK:STDOUT: return %.loc50_25 +// CHECK:STDOUT: %.loc50_24.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc50_24.2: init %empty_tuple.type = tuple_init () to %return [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc50_25: init %empty_tuple.type = converted %.loc50_24.1, %.loc50_24.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc50_25 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @J.loc52() -> %empty_tuple.type; @@ -237,9 +237,9 @@ fn K() -> {} { return {}; } // CHECK:STDOUT: // CHECK:STDOUT: fn @K.loc70() -> %empty_struct_type { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc70_24: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] -// CHECK:STDOUT: %.loc70_25: %empty_struct_type = converted %.loc70_24, %empty_struct [concrete = constants.%empty_struct] -// CHECK:STDOUT: return %.loc70_25 +// CHECK:STDOUT: %.loc70_24.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc70_24.2: init %empty_struct_type = struct_init () to %return [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc70_25: init %empty_struct_type = converted %.loc70_24.1, %.loc70_24.2 [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc70_25 to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/definition/import.carbon b/toolchain/check/testdata/function/definition/import.carbon index 9f8ac8660aee..aeadd325dcc8 100644 --- a/toolchain/check/testdata/function/definition/import.carbon +++ b/toolchain/check/testdata/function/definition/import.carbon @@ -122,10 +122,21 @@ fn D() {} // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %B.type: type = fn_type @B [concrete] // CHECK:STDOUT: %B: %B.type = struct_value () [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %tuple.type.85c: type = tuple_type (type) [concrete] // CHECK:STDOUT: %tuple.type.a1c: type = tuple_type (%i32) [concrete] // CHECK:STDOUT: %pattern_type.b74: type = pattern_type %tuple.type.a1c [concrete] @@ -141,10 +152,14 @@ fn D() {} // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -205,7 +220,12 @@ fn D() {} // CHECK:STDOUT: fn @B(%b.param: %i32) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b -// CHECK:STDOUT: return %b.ref +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc5_30.1: = bound_method %b.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc5_30.2: = bound_method %b.ref, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc5_30.2(%b.ref) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C(%c.param: %tuple.type.a1c) -> %struct_type.c { @@ -213,10 +233,15 @@ fn D() {} // CHECK:STDOUT: %c.ref: %tuple.type.a1c = name_ref c, %c // CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0] // CHECK:STDOUT: %tuple.elem0: %i32 = tuple_access %c.ref, element0 -// CHECK:STDOUT: %.loc6_48: %struct_type.c = struct_literal (%tuple.elem0) -// CHECK:STDOUT: %struct: %struct_type.c = struct_value (%tuple.elem0) -// CHECK:STDOUT: %.loc6_49: %struct_type.c = converted %.loc6_48, %struct -// CHECK:STDOUT: return %.loc6_49 +// CHECK:STDOUT: %.loc6_48.1: %struct_type.c = struct_literal (%tuple.elem0) +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc6_46.1: = bound_method %tuple.elem0, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc6_46.2: = bound_method %tuple.elem0, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc6_46.2(%tuple.elem0) +// CHECK:STDOUT: %.loc6_48.2: init %struct_type.c = struct_init (%Int.as.Copy.impl.Op.call) to %return +// CHECK:STDOUT: %.loc6_49: init %struct_type.c = converted %.loc6_48.1, %.loc6_48.2 +// CHECK:STDOUT: return %.loc6_49 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @D(); diff --git a/toolchain/check/testdata/function/generic/call.carbon b/toolchain/check/testdata/function/generic/call.carbon index 4a4f05ae9145..080fa74af4db 100644 --- a/toolchain/check/testdata/function/generic/call.carbon +++ b/toolchain/check/testdata/function/generic/call.carbon @@ -3,8 +3,6 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // // INCLUDE-FILE: toolchain/testing/testdata/min_prelude/convert.carbon -// TODO: Add ranges and switch to "--dump-sem-ir-ranges=only". -// EXTRA-ARGS: --dump-sem-ir-ranges=if-present // // AUTOUPDATE // TIP: To test this file alone, run: @@ -16,553 +14,508 @@ library "[[@TEST_NAME]]"; -fn Function(T:! type, x: T) -> T { +//@dump-sem-ir-begin +fn Function(T:! Core.Copy, x: T) -> T { return x; } +//@dump-sem-ir-end -fn CallGeneric(T:! type, x: T) -> T { +fn CallGeneric(T:! Core.Copy, x: T) -> T { + //@dump-sem-ir-begin return Function(T, x); + //@dump-sem-ir-end } fn CallGenericPtr(T:! type, x: T*) -> T* { + //@dump-sem-ir-begin return Function(T*, x); + //@dump-sem-ir-end } class C {} -fn CallSpecific(x: C) -> C { - return Function(C, x); +fn CallSpecific(x: C*) -> C* { + //@dump-sem-ir-begin + return Function(C*, x); + //@dump-sem-ir-end } // --- deduced.carbon library "[[@TEST_NAME]]"; -fn Function[T:! type](x: T) -> T { +//@dump-sem-ir-begin +fn Function[T:! Core.Copy](x: T) -> T { return x; } +//@dump-sem-ir-end -fn CallGeneric(T:! type, x: T) -> T { +fn CallGeneric(T:! Core.Copy, x: T) -> T { + //@dump-sem-ir-begin return Function(x); + //@dump-sem-ir-end } fn CallGenericPtr(T:! type, x: T*) -> T* { + //@dump-sem-ir-begin return Function(x); + //@dump-sem-ir-end } class C {} -fn CallSpecific(x: C) -> C { +fn CallSpecific(x: C*) -> C* { + //@dump-sem-ir-begin return Function(x); + //@dump-sem-ir-end } // CHECK:STDOUT: --- explicit.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %T.578: %Copy.type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %pattern_type.ce2: type = pattern_type %Copy.type [concrete] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T.578 [symbolic] +// CHECK:STDOUT: %pattern_type.f8cebc.1: type = pattern_type %T.as_type [symbolic] // CHECK:STDOUT: %Function.type: type = fn_type @Function [concrete] // CHECK:STDOUT: %Function: %Function.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %CallGeneric.type: type = fn_type @CallGeneric [concrete] -// CHECK:STDOUT: %CallGeneric: %CallGeneric.type = struct_value () [concrete] -// CHECK:STDOUT: %Function.specific_fn.46f: = specific_function %Function, @Function(%T) [symbolic] -// CHECK:STDOUT: %ptr.79f: type = ptr_type %T [symbolic] +// CHECK:STDOUT: %require_complete.ecc: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.lookup_impl_witness.3ba: = lookup_impl_witness %T.578, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.72e: %Copy.type = facet_value %T.as_type, (%Copy.lookup_impl_witness.3ba) [symbolic] +// CHECK:STDOUT: %.671: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.72e [symbolic] +// CHECK:STDOUT: %impl.elem0.56e: %.671 = impl_witness_access %Copy.lookup_impl_witness.3ba, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.fb7: = specific_impl_function %impl.elem0.56e, @Copy.Op(%Copy.facet.72e) [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %ptr.79f: type = ptr_type %T.8b3 [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf: %ptr.as.Copy.impl.Op.type.f23 = struct_value () [symbolic] // CHECK:STDOUT: %pattern_type.afe: type = pattern_type %ptr.79f [symbolic] -// CHECK:STDOUT: %CallGenericPtr.type: type = fn_type @CallGenericPtr [concrete] -// CHECK:STDOUT: %CallGenericPtr: %CallGenericPtr.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete.6e5: = require_complete_type %ptr.79f [symbolic] -// CHECK:STDOUT: %Function.specific_fn.4d7: = specific_function %Function, @Function(%ptr.79f) [symbolic] +// CHECK:STDOUT: %Function.specific_fn.e31: = specific_function %Function, @Function(%T.578) [symbolic] +// CHECK:STDOUT: %Copy.lookup_impl_witness.cb2: = lookup_impl_witness %ptr.79f, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.def: %Copy.type = facet_value %ptr.79f, (%Copy.lookup_impl_witness.cb2) [symbolic] +// CHECK:STDOUT: %Function.specific_fn.329: = specific_function %Function, @Function(%Copy.facet.def) [symbolic] // CHECK:STDOUT: %C: type = class_type @C [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @C.%Destroy.impl_witness_table [concrete] // CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] // CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr.019 [concrete] -// CHECK:STDOUT: %C.as.Destroy.impl.Op.type: type = fn_type @C.as.Destroy.impl.Op [concrete] -// CHECK:STDOUT: %C.as.Destroy.impl.Op: %C.as.Destroy.impl.Op.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] -// CHECK:STDOUT: %CallSpecific.type: type = fn_type @CallSpecific [concrete] -// CHECK:STDOUT: %CallSpecific: %CallSpecific.type = struct_value () [concrete] -// CHECK:STDOUT: %Function.specific_fn.1b5: = specific_function %Function, @Function(%C) [concrete] +// CHECK:STDOUT: %Copy.impl_witness.a94: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%C) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.0f5: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%C) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.fd1: %ptr.as.Copy.impl.Op.type.0f5 = struct_value () [concrete] +// CHECK:STDOUT: %complete_type.d05: = complete_type_witness %ptr.019 [concrete] +// CHECK:STDOUT: %Copy.facet.9a6: %Copy.type = facet_value %ptr.019, (%Copy.impl_witness.a94) [concrete] +// CHECK:STDOUT: %Function.specific_fn.527: = specific_function %Function, @Function(%Copy.facet.9a6) [concrete] +// CHECK:STDOUT: %.fe5: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.def [symbolic] +// CHECK:STDOUT: %impl.elem0.429: %.fe5 = impl_witness_access %Copy.lookup_impl_witness.cb2, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.d8a: = specific_impl_function %impl.elem0.429, @Copy.Op(%Copy.facet.def) [symbolic] +// CHECK:STDOUT: %.a98: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.9a6 [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn: = specific_function %ptr.as.Copy.impl.Op.fd1, @ptr.as.Copy.impl.Op(%C) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Function = %Function.decl -// CHECK:STDOUT: .CallGeneric = %CallGeneric.decl -// CHECK:STDOUT: .CallGenericPtr = %CallGenericPtr.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .CallSpecific = %CallSpecific.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core // CHECK:STDOUT: %Function.decl: %Function.type = fn_decl @Function [concrete = constants.%Function] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @Function.%pattern_type (%pattern_type.7dc) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @Function.%pattern_type (%pattern_type.7dc) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @Function.%pattern_type (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Function.%pattern_type (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type.ce2 = symbolic_binding_pattern T, 0 [concrete] +// CHECK:STDOUT: %x.patt: @Function.%pattern_type (%pattern_type.f8cebc.1) = binding_pattern x [concrete] +// CHECK:STDOUT: %x.param_patt: @Function.%pattern_type (%pattern_type.f8cebc.1) = value_param_pattern %x.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @Function.%pattern_type (%pattern_type.f8cebc.1) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @Function.%pattern_type (%pattern_type.f8cebc.1) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc4_32: type = name_ref T, %T.loc4_13.2 [symbolic = %T.loc4_13.1 (constants.%T)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @Function.%T.loc4_13.1 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc4_26: type = name_ref T, %T.loc4_13.2 [symbolic = %T.loc4_13.1 (constants.%T)] -// CHECK:STDOUT: %x: @Function.%T.loc4_13.1 (%T) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @Function.%T.loc4_13.1 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @Function.%T.loc4_13.1 (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallGeneric.decl: %CallGeneric.type = fn_decl @CallGeneric [concrete = constants.%CallGeneric] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @CallGeneric.%pattern_type (%pattern_type.7dc) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @CallGeneric.%pattern_type (%pattern_type.7dc) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @CallGeneric.%pattern_type (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @CallGeneric.%pattern_type (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc8_35: type = name_ref T, %T.loc8_16.2 [symbolic = %T.loc8_16.1 (constants.%T)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc8_16.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_16.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @CallGeneric.%T.loc8_16.1 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc8_29: type = name_ref T, %T.loc8_16.2 [symbolic = %T.loc8_16.1 (constants.%T)] -// CHECK:STDOUT: %x: @CallGeneric.%T.loc8_16.1 (%T) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @CallGeneric.%T.loc8_16.1 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @CallGeneric.%T.loc8_16.1 (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallGenericPtr.decl: %CallGenericPtr.type = fn_decl @CallGenericPtr [concrete = constants.%CallGenericPtr] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @CallGenericPtr.%pattern_type (%pattern_type.afe) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @CallGenericPtr.%pattern_type (%pattern_type.afe) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @CallGenericPtr.%pattern_type (%pattern_type.afe) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @CallGenericPtr.%pattern_type (%pattern_type.afe) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc12_39: type = name_ref T, %T.loc12_19.2 [symbolic = %T.loc12_19.1 (constants.%T)] -// CHECK:STDOUT: %ptr.loc12_40: type = ptr_type %T.ref.loc12_39 [symbolic = %ptr.loc12_33.1 (constants.%ptr.79f)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc12_19.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc12_19.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f) = value_param call_param0 -// CHECK:STDOUT: %.loc12: type = splice_block %ptr.loc12_33.2 [symbolic = %ptr.loc12_33.1 (constants.%ptr.79f)] { -// CHECK:STDOUT: %T.ref.loc12_32: type = name_ref T, %T.loc12_19.2 [symbolic = %T.loc12_19.1 (constants.%T)] -// CHECK:STDOUT: %ptr.loc12_33.2: type = ptr_type %T.ref.loc12_32 [symbolic = %ptr.loc12_33.1 (constants.%ptr.79f)] +// CHECK:STDOUT: %T.ref.loc5_37: %Copy.type = name_ref T, %T.loc5_13.2 [symbolic = %T.loc5_13.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc5_37: type = facet_access_type %T.ref.loc5_37 [symbolic = %T.as_type.loc5_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc5_37: type = converted %T.ref.loc5_37, %T.as_type.loc5_37 [symbolic = %T.as_type.loc5_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc5_21: type = splice_block %Copy.ref [concrete = constants.%Copy.type] { +// CHECK:STDOUT: +// CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core [concrete = imports.%Core] +// CHECK:STDOUT: %Copy.ref: type = name_ref Copy, imports.%Core.Copy [concrete = constants.%Copy.type] // CHECK:STDOUT: } -// CHECK:STDOUT: %x: @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f) = out_param call_param1 -// CHECK:STDOUT: %return: ref @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %CallSpecific.decl: %CallSpecific.type = fn_decl @CallSpecific [concrete = constants.%CallSpecific] { -// CHECK:STDOUT: %x.patt: %pattern_type.c48 = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: %pattern_type.c48 = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.c48 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.c48 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref.loc18_26: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %x.param: %C = value_param call_param0 -// CHECK:STDOUT: %C.ref.loc18_20: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %x: %C = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref %C = out_param call_param1 -// CHECK:STDOUT: %return: ref %C = return_slot %return.param +// CHECK:STDOUT: %T.loc5_13.2: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc5_13.1 (constants.%T.578)] +// CHECK:STDOUT: %x.param: @Function.%T.as_type.loc5_31.1 (%T.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc5_31.1: type = splice_block %.loc5_31.2 [symbolic = %T.as_type.loc5_31.1 (constants.%T.as_type)] { +// CHECK:STDOUT: %T.ref.loc5_31: %Copy.type = name_ref T, %T.loc5_13.2 [symbolic = %T.loc5_13.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc5_31.2: type = facet_access_type %T.ref.loc5_31 [symbolic = %T.as_type.loc5_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc5_31.2: type = converted %T.ref.loc5_31, %T.as_type.loc5_31.2 [symbolic = %T.as_type.loc5_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @Function.%T.as_type.loc5_31.1 (%T.as_type) = bind_name x, %x.param +// CHECK:STDOUT: %return.param: ref @Function.%T.as_type.loc5_31.1 (%T.as_type) = out_param call_param1 +// CHECK:STDOUT: %return: ref @Function.%T.as_type.loc5_31.1 (%T.as_type) = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: impl @C.as.Destroy.impl: @C.%Self.ref as constants.%Destroy.type { -// CHECK:STDOUT: %C.as.Destroy.impl.Op.decl: %C.as.Destroy.impl.Op.type = fn_decl @C.as.Destroy.impl.Op [concrete = constants.%C.as.Destroy.impl.Op] { -// CHECK:STDOUT: %self.patt: %pattern_type.44a = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.44a = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc16: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %ptr.019 = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] -// CHECK:STDOUT: %self: %ptr.019 = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Op = %C.as.Destroy.impl.Op.decl -// CHECK:STDOUT: witness = @C.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] -// CHECK:STDOUT: impl_decl @C.as.Destroy.impl [concrete] {} {} -// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@C.as.Destroy.impl.%C.as.Destroy.impl.Op.decl), @C.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table [concrete = constants.%Destroy.impl_witness] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Function(%T.loc4_13.2: type) { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.1 (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc4_13.1 [symbolic = %pattern_type (constants.%pattern_type.7dc)] +// CHECK:STDOUT: generic fn @Function(%T.loc5_13.2: %Copy.type) { +// CHECK:STDOUT: %T.loc5_13.1: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc5_13.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc5_31.1: type = facet_access_type %T.loc5_13.1 [symbolic = %T.as_type.loc5_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %T.as_type.loc5_31.1 [symbolic = %pattern_type (constants.%pattern_type.f8cebc.1)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_13.1 [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: %require_complete: = require_complete_type %T.as_type.loc5_31.1 [symbolic = %require_complete (constants.%require_complete.ecc)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %T.loc5_13.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.3ba)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %T.as_type.loc5_31.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.72e)] +// CHECK:STDOUT: %.loc6_10.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc6_10.2 (constants.%.671)] +// CHECK:STDOUT: %impl.elem0.loc6_10.2: @Function.%.loc6_10.2 (%.671) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc6_10.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %specific_impl_fn.loc6_10.2: = specific_impl_function %impl.elem0.loc6_10.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc6_10.2 (constants.%specific_impl_fn.fb7)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @Function.%T.loc4_13.1 (%T)) -> @Function.%T.loc4_13.1 (%T) { +// CHECK:STDOUT: fn(%x.param: @Function.%T.as_type.loc5_31.1 (%T.as_type)) -> @Function.%T.as_type.loc5_31.1 (%T.as_type) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @Function.%T.loc4_13.1 (%T) = name_ref x, %x -// CHECK:STDOUT: return %x.ref +// CHECK:STDOUT: %x.ref: @Function.%T.as_type.loc5_31.1 (%T.as_type) = name_ref x, %x +// CHECK:STDOUT: %impl.elem0.loc6_10.1: @Function.%.loc6_10.2 (%.671) = impl_witness_access constants.%Copy.lookup_impl_witness.3ba, element0 [symbolic = %impl.elem0.loc6_10.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %bound_method.loc6_10.1: = bound_method %x.ref, %impl.elem0.loc6_10.1 +// CHECK:STDOUT: %specific_impl_fn.loc6_10.1: = specific_impl_function %impl.elem0.loc6_10.1, @Copy.Op(constants.%Copy.facet.72e) [symbolic = %specific_impl_fn.loc6_10.2 (constants.%specific_impl_fn.fb7)] +// CHECK:STDOUT: %bound_method.loc6_10.2: = bound_method %x.ref, %specific_impl_fn.loc6_10.1 +// CHECK:STDOUT: %.loc6_10.1: init @Function.%T.as_type.loc5_31.1 (%T.as_type) = call %bound_method.loc6_10.2(%x.ref) +// CHECK:STDOUT: return %.loc6_10.1 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @CallGeneric(%T.loc8_16.2: type) { -// CHECK:STDOUT: %T.loc8_16.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_16.1 (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc8_16.1 [symbolic = %pattern_type (constants.%pattern_type.7dc)] +// CHECK:STDOUT: generic fn @CallGeneric(%T.loc10_16.2: %Copy.type) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc8_16.1 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Function.specific_fn.loc9_10.2: = specific_function constants.%Function, @Function(%T.loc8_16.1) [symbolic = %Function.specific_fn.loc9_10.2 (constants.%Function.specific_fn.46f)] +// CHECK:STDOUT: +// CHECK:STDOUT: %Function.specific_fn.loc12_10.2: = specific_function constants.%Function, @Function(%T.loc10_16.1) [symbolic = %Function.specific_fn.loc12_10.2 (constants.%Function.specific_fn.e31)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @CallGeneric.%T.loc8_16.1 (%T)) -> @CallGeneric.%T.loc8_16.1 (%T) { +// CHECK:STDOUT: fn(%x.param: @CallGeneric.%T.as_type.loc10_34.1 (%T.as_type)) -> @CallGeneric.%T.as_type.loc10_34.1 (%T.as_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %Function.ref: %Function.type = name_ref Function, file.%Function.decl [concrete = constants.%Function] -// CHECK:STDOUT: %T.ref.loc9: type = name_ref T, %T.loc8_16.2 [symbolic = %T.loc8_16.1 (constants.%T)] -// CHECK:STDOUT: %x.ref: @CallGeneric.%T.loc8_16.1 (%T) = name_ref x, %x -// CHECK:STDOUT: %Function.specific_fn.loc9_10.1: = specific_function %Function.ref, @Function(constants.%T) [symbolic = %Function.specific_fn.loc9_10.2 (constants.%Function.specific_fn.46f)] -// CHECK:STDOUT: %Function.call: init @CallGeneric.%T.loc8_16.1 (%T) = call %Function.specific_fn.loc9_10.1(%x.ref) -// CHECK:STDOUT: %.loc9_24.1: @CallGeneric.%T.loc8_16.1 (%T) = value_of_initializer %Function.call -// CHECK:STDOUT: %.loc9_24.2: @CallGeneric.%T.loc8_16.1 (%T) = converted %Function.call, %.loc9_24.1 -// CHECK:STDOUT: return %.loc9_24.2 +// CHECK:STDOUT: %T.ref.loc12: %Copy.type = name_ref T, %T.loc10_16.2 [symbolic = %T.loc10_16.1 (constants.%T.578)] +// CHECK:STDOUT: %x.ref: @CallGeneric.%T.as_type.loc10_34.1 (%T.as_type) = name_ref x, %x +// CHECK:STDOUT: %.loc12_23.1: %Copy.type = converted constants.%T.as_type, constants.%T.578 [symbolic = %T.loc10_16.1 (constants.%T.578)] +// CHECK:STDOUT: %.loc12_23.2: %Copy.type = converted constants.%T.as_type, constants.%T.578 [symbolic = %T.loc10_16.1 (constants.%T.578)] +// CHECK:STDOUT: %Function.specific_fn.loc12_10.1: = specific_function %Function.ref, @Function(constants.%T.578) [symbolic = %Function.specific_fn.loc12_10.2 (constants.%Function.specific_fn.e31)] +// CHECK:STDOUT: %Function.call: init @CallGeneric.%T.as_type.loc10_34.1 (%T.as_type) = call %Function.specific_fn.loc12_10.1(%x.ref) +// CHECK:STDOUT: return %Function.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @CallGenericPtr(%T.loc12_19.2: type) { -// CHECK:STDOUT: %T.loc12_19.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc12_19.1 (constants.%T)] -// CHECK:STDOUT: %ptr.loc12_33.1: type = ptr_type %T.loc12_19.1 [symbolic = %ptr.loc12_33.1 (constants.%ptr.79f)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr.loc12_33.1 [symbolic = %pattern_type (constants.%pattern_type.afe)] +// CHECK:STDOUT: generic fn @CallGenericPtr(%T.loc16_19.2: type) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %ptr.loc12_33.1 [symbolic = %require_complete (constants.%require_complete.6e5)] -// CHECK:STDOUT: %Function.specific_fn.loc13_10.2: = specific_function constants.%Function, @Function(%ptr.loc12_33.1) [symbolic = %Function.specific_fn.loc13_10.2 (constants.%Function.specific_fn.4d7)] +// CHECK:STDOUT: +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %ptr.loc16_33.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.cb2)] +// CHECK:STDOUT: %Copy.facet.loc18_24.4: %Copy.type = facet_value %ptr.loc16_33.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet.loc18_24.4 (constants.%Copy.facet.def)] +// CHECK:STDOUT: %Function.specific_fn.loc18_10.2: = specific_function constants.%Function, @Function(%Copy.facet.loc18_24.4) [symbolic = %Function.specific_fn.loc18_10.2 (constants.%Function.specific_fn.329)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f)) -> @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f) { +// CHECK:STDOUT: fn(%x.param: @CallGenericPtr.%ptr.loc16_33.1 (%ptr.79f)) -> @CallGenericPtr.%ptr.loc16_33.1 (%ptr.79f) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %Function.ref: %Function.type = name_ref Function, file.%Function.decl [concrete = constants.%Function] -// CHECK:STDOUT: %T.ref.loc13: type = name_ref T, %T.loc12_19.2 [symbolic = %T.loc12_19.1 (constants.%T)] -// CHECK:STDOUT: %ptr.loc13: type = ptr_type %T.ref.loc13 [symbolic = %ptr.loc12_33.1 (constants.%ptr.79f)] -// CHECK:STDOUT: %x.ref: @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f) = name_ref x, %x -// CHECK:STDOUT: %Function.specific_fn.loc13_10.1: = specific_function %Function.ref, @Function(constants.%ptr.79f) [symbolic = %Function.specific_fn.loc13_10.2 (constants.%Function.specific_fn.4d7)] -// CHECK:STDOUT: %Function.call: init @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f) = call %Function.specific_fn.loc13_10.1(%x.ref) -// CHECK:STDOUT: %.loc13_25.1: @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f) = value_of_initializer %Function.call -// CHECK:STDOUT: %.loc13_25.2: @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f) = converted %Function.call, %.loc13_25.1 -// CHECK:STDOUT: return %.loc13_25.2 +// CHECK:STDOUT: %T.ref.loc18: type = name_ref T, %T.loc16_19.2 [symbolic = %T.loc16_19.1 (constants.%T.8b3)] +// CHECK:STDOUT: %ptr.loc18: type = ptr_type %T.ref.loc18 [symbolic = %ptr.loc16_33.1 (constants.%ptr.79f)] +// CHECK:STDOUT: %x.ref: @CallGenericPtr.%ptr.loc16_33.1 (%ptr.79f) = name_ref x, %x +// CHECK:STDOUT: %Copy.facet.loc18_24.1: %Copy.type = facet_value constants.%ptr.79f, (constants.%Copy.lookup_impl_witness.cb2) [symbolic = %Copy.facet.loc18_24.4 (constants.%Copy.facet.def)] +// CHECK:STDOUT: %.loc18_24.1: %Copy.type = converted %ptr.loc18, %Copy.facet.loc18_24.1 [symbolic = %Copy.facet.loc18_24.4 (constants.%Copy.facet.def)] +// CHECK:STDOUT: %Copy.facet.loc18_24.2: %Copy.type = facet_value constants.%ptr.79f, (constants.%Copy.lookup_impl_witness.cb2) [symbolic = %Copy.facet.loc18_24.4 (constants.%Copy.facet.def)] +// CHECK:STDOUT: %.loc18_24.2: %Copy.type = converted constants.%ptr.79f, %Copy.facet.loc18_24.2 [symbolic = %Copy.facet.loc18_24.4 (constants.%Copy.facet.def)] +// CHECK:STDOUT: %Copy.facet.loc18_24.3: %Copy.type = facet_value constants.%ptr.79f, (constants.%Copy.lookup_impl_witness.cb2) [symbolic = %Copy.facet.loc18_24.4 (constants.%Copy.facet.def)] +// CHECK:STDOUT: %.loc18_24.3: %Copy.type = converted constants.%ptr.79f, %Copy.facet.loc18_24.3 [symbolic = %Copy.facet.loc18_24.4 (constants.%Copy.facet.def)] +// CHECK:STDOUT: %Function.specific_fn.loc18_10.1: = specific_function %Function.ref, @Function(constants.%Copy.facet.def) [symbolic = %Function.specific_fn.loc18_10.2 (constants.%Function.specific_fn.329)] +// CHECK:STDOUT: %Function.call: init @CallGenericPtr.%ptr.loc16_33.1 (%ptr.79f) = call %Function.specific_fn.loc18_10.1(%x.ref) +// CHECK:STDOUT: return %Function.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: fn @C.as.Destroy.impl.Op(%self.param: %ptr.019) = "no_op"; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CallSpecific(%x.param: %C) -> %return.param: %C { +// CHECK:STDOUT: fn @CallSpecific(%x.param: %ptr.019) -> %ptr.019 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %Function.ref: %Function.type = name_ref Function, file.%Function.decl [concrete = constants.%Function] -// CHECK:STDOUT: %C.ref.loc19: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %x.ref: %C = name_ref x, %x -// CHECK:STDOUT: %Function.specific_fn: = specific_function %Function.ref, @Function(constants.%C) [concrete = constants.%Function.specific_fn.1b5] -// CHECK:STDOUT: %.loc18: ref %C = splice_block %return {} -// CHECK:STDOUT: %Function.call: init %C = call %Function.specific_fn(%x.ref) to %.loc18 +// CHECK:STDOUT: %C.ref.loc26: type = name_ref C, file.%C.decl [concrete = constants.%C] +// CHECK:STDOUT: %ptr.loc26: type = ptr_type %C.ref.loc26 [concrete = constants.%ptr.019] +// CHECK:STDOUT: %x.ref: %ptr.019 = name_ref x, %x +// CHECK:STDOUT: %Copy.facet.loc26_24.1: %Copy.type = facet_value constants.%ptr.019, (constants.%Copy.impl_witness.a94) [concrete = constants.%Copy.facet.9a6] +// CHECK:STDOUT: %.loc26_24.1: %Copy.type = converted %ptr.loc26, %Copy.facet.loc26_24.1 [concrete = constants.%Copy.facet.9a6] +// CHECK:STDOUT: %Copy.facet.loc26_24.2: %Copy.type = facet_value constants.%ptr.019, (constants.%Copy.impl_witness.a94) [concrete = constants.%Copy.facet.9a6] +// CHECK:STDOUT: %.loc26_24.2: %Copy.type = converted constants.%ptr.019, %Copy.facet.loc26_24.2 [concrete = constants.%Copy.facet.9a6] +// CHECK:STDOUT: %Copy.facet.loc26_24.3: %Copy.type = facet_value constants.%ptr.019, (constants.%Copy.impl_witness.a94) [concrete = constants.%Copy.facet.9a6] +// CHECK:STDOUT: %.loc26_24.3: %Copy.type = converted constants.%ptr.019, %Copy.facet.loc26_24.3 [concrete = constants.%Copy.facet.9a6] +// CHECK:STDOUT: %Function.specific_fn: = specific_function %Function.ref, @Function(constants.%Copy.facet.9a6) [concrete = constants.%Function.specific_fn.527] +// CHECK:STDOUT: %Function.call: init %ptr.019 = call %Function.specific_fn(%x.ref) // CHECK:STDOUT: return %Function.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Function(constants.%T) { -// CHECK:STDOUT: %T.loc4_13.1 => constants.%T -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc +// CHECK:STDOUT: specific @Function(constants.%T.578) { +// CHECK:STDOUT: %T.loc5_13.1 => constants.%T.578 +// CHECK:STDOUT: %T.as_type.loc5_31.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.f8cebc.1 // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae +// CHECK:STDOUT: %require_complete => constants.%require_complete.ecc +// CHECK:STDOUT: %Copy.lookup_impl_witness => constants.%Copy.lookup_impl_witness.3ba +// CHECK:STDOUT: %Copy.facet => constants.%Copy.facet.72e +// CHECK:STDOUT: %.loc6_10.2 => constants.%.671 +// CHECK:STDOUT: %impl.elem0.loc6_10.2 => constants.%impl.elem0.56e +// CHECK:STDOUT: %specific_impl_fn.loc6_10.2 => constants.%specific_impl_fn.fb7 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @CallGeneric(constants.%T) { -// CHECK:STDOUT: %T.loc8_16.1 => constants.%T -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc +// CHECK:STDOUT: specific @CallGeneric(constants.%T.578) { +// CHECK:STDOUT: %T.loc10_16.1 => constants.%T.578 +// CHECK:STDOUT: %T.as_type.loc10_34.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.f8cebc.1 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @CallGenericPtr(constants.%T) { -// CHECK:STDOUT: %T.loc12_19.1 => constants.%T -// CHECK:STDOUT: %ptr.loc12_33.1 => constants.%ptr.79f +// CHECK:STDOUT: specific @CallGenericPtr(constants.%T.8b3) { +// CHECK:STDOUT: %T.loc16_19.1 => constants.%T.8b3 +// CHECK:STDOUT: %ptr.loc16_33.1 => constants.%ptr.79f // CHECK:STDOUT: %pattern_type => constants.%pattern_type.afe // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Function(constants.%ptr.79f) { -// CHECK:STDOUT: %T.loc4_13.1 => constants.%ptr.79f +// CHECK:STDOUT: specific @Function(constants.%Copy.facet.def) { +// CHECK:STDOUT: %T.loc5_13.1 => constants.%Copy.facet.def +// CHECK:STDOUT: %T.as_type.loc5_31.1 => constants.%ptr.79f // CHECK:STDOUT: %pattern_type => constants.%pattern_type.afe // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%require_complete.6e5 +// CHECK:STDOUT: %Copy.lookup_impl_witness => constants.%Copy.lookup_impl_witness.cb2 +// CHECK:STDOUT: %Copy.facet => constants.%Copy.facet.def +// CHECK:STDOUT: %.loc6_10.2 => constants.%.fe5 +// CHECK:STDOUT: %impl.elem0.loc6_10.2 => constants.%impl.elem0.429 +// CHECK:STDOUT: %specific_impl_fn.loc6_10.2 => constants.%specific_impl_fn.d8a // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Function(constants.%C) { -// CHECK:STDOUT: %T.loc4_13.1 => constants.%C -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.c48 +// CHECK:STDOUT: specific @Function(constants.%Copy.facet.9a6) { +// CHECK:STDOUT: %T.loc5_13.1 => constants.%Copy.facet.9a6 +// CHECK:STDOUT: %T.as_type.loc5_31.1 => constants.%ptr.019 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.44a // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type +// CHECK:STDOUT: %require_complete => constants.%complete_type.d05 +// CHECK:STDOUT: %Copy.lookup_impl_witness => constants.%Copy.impl_witness.a94 +// CHECK:STDOUT: %Copy.facet => constants.%Copy.facet.9a6 +// CHECK:STDOUT: %.loc6_10.2 => constants.%.a98 +// CHECK:STDOUT: %impl.elem0.loc6_10.2 => constants.%ptr.as.Copy.impl.Op.fd1 +// CHECK:STDOUT: %specific_impl_fn.loc6_10.2 => constants.%ptr.as.Copy.impl.Op.specific_fn // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- deduced.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %T.578: %Copy.type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %pattern_type.ce2: type = pattern_type %Copy.type [concrete] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T.578 [symbolic] +// CHECK:STDOUT: %pattern_type.f8cebc.1: type = pattern_type %T.as_type [symbolic] // CHECK:STDOUT: %Function.type: type = fn_type @Function [concrete] // CHECK:STDOUT: %Function: %Function.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %CallGeneric.type: type = fn_type @CallGeneric [concrete] -// CHECK:STDOUT: %CallGeneric: %CallGeneric.type = struct_value () [concrete] -// CHECK:STDOUT: %Function.specific_fn.46f: = specific_function %Function, @Function(%T) [symbolic] -// CHECK:STDOUT: %ptr.79f: type = ptr_type %T [symbolic] +// CHECK:STDOUT: %require_complete.ecc: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.lookup_impl_witness.3ba: = lookup_impl_witness %T.578, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.72e: %Copy.type = facet_value %T.as_type, (%Copy.lookup_impl_witness.3ba) [symbolic] +// CHECK:STDOUT: %.671: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.72e [symbolic] +// CHECK:STDOUT: %impl.elem0.56e: %.671 = impl_witness_access %Copy.lookup_impl_witness.3ba, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.fb7: = specific_impl_function %impl.elem0.56e, @Copy.Op(%Copy.facet.72e) [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %ptr.79f: type = ptr_type %T.8b3 [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf: %ptr.as.Copy.impl.Op.type.f23 = struct_value () [symbolic] // CHECK:STDOUT: %pattern_type.afe: type = pattern_type %ptr.79f [symbolic] -// CHECK:STDOUT: %CallGenericPtr.type: type = fn_type @CallGenericPtr [concrete] -// CHECK:STDOUT: %CallGenericPtr: %CallGenericPtr.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete.6e5: = require_complete_type %ptr.79f [symbolic] -// CHECK:STDOUT: %Function.specific_fn.4d7: = specific_function %Function, @Function(%ptr.79f) [symbolic] +// CHECK:STDOUT: %Function.specific_fn.e31: = specific_function %Function, @Function(%T.578) [symbolic] +// CHECK:STDOUT: %Copy.lookup_impl_witness.cb2: = lookup_impl_witness %ptr.79f, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.def: %Copy.type = facet_value %ptr.79f, (%Copy.lookup_impl_witness.cb2) [symbolic] +// CHECK:STDOUT: %Function.specific_fn.329: = specific_function %Function, @Function(%Copy.facet.def) [symbolic] // CHECK:STDOUT: %C: type = class_type @C [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @C.%Destroy.impl_witness_table [concrete] // CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] // CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr.019 [concrete] -// CHECK:STDOUT: %C.as.Destroy.impl.Op.type: type = fn_type @C.as.Destroy.impl.Op [concrete] -// CHECK:STDOUT: %C.as.Destroy.impl.Op: %C.as.Destroy.impl.Op.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] -// CHECK:STDOUT: %CallSpecific.type: type = fn_type @CallSpecific [concrete] -// CHECK:STDOUT: %CallSpecific: %CallSpecific.type = struct_value () [concrete] -// CHECK:STDOUT: %Function.specific_fn.1b5: = specific_function %Function, @Function(%C) [concrete] +// CHECK:STDOUT: %Copy.impl_witness.a94: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%C) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.0f5: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%C) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.fd1: %ptr.as.Copy.impl.Op.type.0f5 = struct_value () [concrete] +// CHECK:STDOUT: %complete_type.d05: = complete_type_witness %ptr.019 [concrete] +// CHECK:STDOUT: %Copy.facet.9a6: %Copy.type = facet_value %ptr.019, (%Copy.impl_witness.a94) [concrete] +// CHECK:STDOUT: %Function.specific_fn.527: = specific_function %Function, @Function(%Copy.facet.9a6) [concrete] +// CHECK:STDOUT: %.fe5: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.def [symbolic] +// CHECK:STDOUT: %impl.elem0.429: %.fe5 = impl_witness_access %Copy.lookup_impl_witness.cb2, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.d8a: = specific_impl_function %impl.elem0.429, @Copy.Op(%Copy.facet.def) [symbolic] +// CHECK:STDOUT: %.a98: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.9a6 [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn: = specific_function %ptr.as.Copy.impl.Op.fd1, @ptr.as.Copy.impl.Op(%C) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Function = %Function.decl -// CHECK:STDOUT: .CallGeneric = %CallGeneric.decl -// CHECK:STDOUT: .CallGenericPtr = %CallGenericPtr.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .CallSpecific = %CallSpecific.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core // CHECK:STDOUT: %Function.decl: %Function.type = fn_decl @Function [concrete = constants.%Function] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @Function.%pattern_type (%pattern_type.7dc) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @Function.%pattern_type (%pattern_type.7dc) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @Function.%pattern_type (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Function.%pattern_type (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type.ce2 = symbolic_binding_pattern T, 0 [concrete] +// CHECK:STDOUT: %x.patt: @Function.%pattern_type (%pattern_type.f8cebc.1) = binding_pattern x [concrete] +// CHECK:STDOUT: %x.param_patt: @Function.%pattern_type (%pattern_type.f8cebc.1) = value_param_pattern %x.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @Function.%pattern_type (%pattern_type.f8cebc.1) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @Function.%pattern_type (%pattern_type.f8cebc.1) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc4_32: type = name_ref T, %T.loc4_13.2 [symbolic = %T.loc4_13.1 (constants.%T)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @Function.%T.loc4_13.1 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc4_26: type = name_ref T, %T.loc4_13.2 [symbolic = %T.loc4_13.1 (constants.%T)] -// CHECK:STDOUT: %x: @Function.%T.loc4_13.1 (%T) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @Function.%T.loc4_13.1 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @Function.%T.loc4_13.1 (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallGeneric.decl: %CallGeneric.type = fn_decl @CallGeneric [concrete = constants.%CallGeneric] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @CallGeneric.%pattern_type (%pattern_type.7dc) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @CallGeneric.%pattern_type (%pattern_type.7dc) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @CallGeneric.%pattern_type (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @CallGeneric.%pattern_type (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc8_35: type = name_ref T, %T.loc8_16.2 [symbolic = %T.loc8_16.1 (constants.%T)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc8_16.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_16.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @CallGeneric.%T.loc8_16.1 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc8_29: type = name_ref T, %T.loc8_16.2 [symbolic = %T.loc8_16.1 (constants.%T)] -// CHECK:STDOUT: %x: @CallGeneric.%T.loc8_16.1 (%T) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @CallGeneric.%T.loc8_16.1 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @CallGeneric.%T.loc8_16.1 (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallGenericPtr.decl: %CallGenericPtr.type = fn_decl @CallGenericPtr [concrete = constants.%CallGenericPtr] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @CallGenericPtr.%pattern_type (%pattern_type.afe) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @CallGenericPtr.%pattern_type (%pattern_type.afe) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @CallGenericPtr.%pattern_type (%pattern_type.afe) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @CallGenericPtr.%pattern_type (%pattern_type.afe) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc12_39: type = name_ref T, %T.loc12_19.2 [symbolic = %T.loc12_19.1 (constants.%T)] -// CHECK:STDOUT: %ptr.loc12_40: type = ptr_type %T.ref.loc12_39 [symbolic = %ptr.loc12_33.1 (constants.%ptr.79f)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc12_19.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc12_19.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f) = value_param call_param0 -// CHECK:STDOUT: %.loc12: type = splice_block %ptr.loc12_33.2 [symbolic = %ptr.loc12_33.1 (constants.%ptr.79f)] { -// CHECK:STDOUT: %T.ref.loc12_32: type = name_ref T, %T.loc12_19.2 [symbolic = %T.loc12_19.1 (constants.%T)] -// CHECK:STDOUT: %ptr.loc12_33.2: type = ptr_type %T.ref.loc12_32 [symbolic = %ptr.loc12_33.1 (constants.%ptr.79f)] +// CHECK:STDOUT: %T.ref.loc5_37: %Copy.type = name_ref T, %T.loc5_13.2 [symbolic = %T.loc5_13.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc5_37: type = facet_access_type %T.ref.loc5_37 [symbolic = %T.as_type.loc5_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc5_37: type = converted %T.ref.loc5_37, %T.as_type.loc5_37 [symbolic = %T.as_type.loc5_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc5_21: type = splice_block %Copy.ref [concrete = constants.%Copy.type] { +// CHECK:STDOUT: +// CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core [concrete = imports.%Core] +// CHECK:STDOUT: %Copy.ref: type = name_ref Copy, imports.%Core.Copy [concrete = constants.%Copy.type] // CHECK:STDOUT: } -// CHECK:STDOUT: %x: @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f) = out_param call_param1 -// CHECK:STDOUT: %return: ref @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %CallSpecific.decl: %CallSpecific.type = fn_decl @CallSpecific [concrete = constants.%CallSpecific] { -// CHECK:STDOUT: %x.patt: %pattern_type.c48 = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: %pattern_type.c48 = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.c48 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.c48 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref.loc18_26: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %x.param: %C = value_param call_param0 -// CHECK:STDOUT: %C.ref.loc18_20: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %x: %C = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref %C = out_param call_param1 -// CHECK:STDOUT: %return: ref %C = return_slot %return.param +// CHECK:STDOUT: %T.loc5_13.2: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc5_13.1 (constants.%T.578)] +// CHECK:STDOUT: %x.param: @Function.%T.as_type.loc5_31.1 (%T.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc5_31.1: type = splice_block %.loc5_31.2 [symbolic = %T.as_type.loc5_31.1 (constants.%T.as_type)] { +// CHECK:STDOUT: %T.ref.loc5_31: %Copy.type = name_ref T, %T.loc5_13.2 [symbolic = %T.loc5_13.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc5_31.2: type = facet_access_type %T.ref.loc5_31 [symbolic = %T.as_type.loc5_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc5_31.2: type = converted %T.ref.loc5_31, %T.as_type.loc5_31.2 [symbolic = %T.as_type.loc5_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @Function.%T.as_type.loc5_31.1 (%T.as_type) = bind_name x, %x.param +// CHECK:STDOUT: %return.param: ref @Function.%T.as_type.loc5_31.1 (%T.as_type) = out_param call_param1 +// CHECK:STDOUT: %return: ref @Function.%T.as_type.loc5_31.1 (%T.as_type) = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: impl @C.as.Destroy.impl: @C.%Self.ref as constants.%Destroy.type { -// CHECK:STDOUT: %C.as.Destroy.impl.Op.decl: %C.as.Destroy.impl.Op.type = fn_decl @C.as.Destroy.impl.Op [concrete = constants.%C.as.Destroy.impl.Op] { -// CHECK:STDOUT: %self.patt: %pattern_type.44a = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.44a = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc16: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %ptr.019 = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] -// CHECK:STDOUT: %self: %ptr.019 = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Op = %C.as.Destroy.impl.Op.decl -// CHECK:STDOUT: witness = @C.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] -// CHECK:STDOUT: impl_decl @C.as.Destroy.impl [concrete] {} {} -// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@C.as.Destroy.impl.%C.as.Destroy.impl.Op.decl), @C.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table [concrete = constants.%Destroy.impl_witness] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Function(%T.loc4_13.2: type) { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.1 (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc4_13.1 [symbolic = %pattern_type (constants.%pattern_type.7dc)] +// CHECK:STDOUT: generic fn @Function(%T.loc5_13.2: %Copy.type) { +// CHECK:STDOUT: %T.loc5_13.1: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T.loc5_13.1 (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc5_31.1: type = facet_access_type %T.loc5_13.1 [symbolic = %T.as_type.loc5_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %T.as_type.loc5_31.1 [symbolic = %pattern_type (constants.%pattern_type.f8cebc.1)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_13.1 [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: %require_complete: = require_complete_type %T.as_type.loc5_31.1 [symbolic = %require_complete (constants.%require_complete.ecc)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %T.loc5_13.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.3ba)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %T.as_type.loc5_31.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.72e)] +// CHECK:STDOUT: %.loc6_10.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc6_10.2 (constants.%.671)] +// CHECK:STDOUT: %impl.elem0.loc6_10.2: @Function.%.loc6_10.2 (%.671) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc6_10.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %specific_impl_fn.loc6_10.2: = specific_impl_function %impl.elem0.loc6_10.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc6_10.2 (constants.%specific_impl_fn.fb7)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @Function.%T.loc4_13.1 (%T)) -> @Function.%T.loc4_13.1 (%T) { +// CHECK:STDOUT: fn(%x.param: @Function.%T.as_type.loc5_31.1 (%T.as_type)) -> @Function.%T.as_type.loc5_31.1 (%T.as_type) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @Function.%T.loc4_13.1 (%T) = name_ref x, %x -// CHECK:STDOUT: return %x.ref +// CHECK:STDOUT: %x.ref: @Function.%T.as_type.loc5_31.1 (%T.as_type) = name_ref x, %x +// CHECK:STDOUT: %impl.elem0.loc6_10.1: @Function.%.loc6_10.2 (%.671) = impl_witness_access constants.%Copy.lookup_impl_witness.3ba, element0 [symbolic = %impl.elem0.loc6_10.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %bound_method.loc6_10.1: = bound_method %x.ref, %impl.elem0.loc6_10.1 +// CHECK:STDOUT: %specific_impl_fn.loc6_10.1: = specific_impl_function %impl.elem0.loc6_10.1, @Copy.Op(constants.%Copy.facet.72e) [symbolic = %specific_impl_fn.loc6_10.2 (constants.%specific_impl_fn.fb7)] +// CHECK:STDOUT: %bound_method.loc6_10.2: = bound_method %x.ref, %specific_impl_fn.loc6_10.1 +// CHECK:STDOUT: %.loc6_10.1: init @Function.%T.as_type.loc5_31.1 (%T.as_type) = call %bound_method.loc6_10.2(%x.ref) +// CHECK:STDOUT: return %.loc6_10.1 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @CallGeneric(%T.loc8_16.2: type) { -// CHECK:STDOUT: %T.loc8_16.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_16.1 (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc8_16.1 [symbolic = %pattern_type (constants.%pattern_type.7dc)] +// CHECK:STDOUT: generic fn @CallGeneric(%T.loc10_16.2: %Copy.type) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc8_16.1 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Function.specific_fn.loc9_10.2: = specific_function constants.%Function, @Function(%T.loc8_16.1) [symbolic = %Function.specific_fn.loc9_10.2 (constants.%Function.specific_fn.46f)] +// CHECK:STDOUT: +// CHECK:STDOUT: %Function.specific_fn.loc12_10.2: = specific_function constants.%Function, @Function(%T.loc10_16.1) [symbolic = %Function.specific_fn.loc12_10.2 (constants.%Function.specific_fn.e31)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @CallGeneric.%T.loc8_16.1 (%T)) -> @CallGeneric.%T.loc8_16.1 (%T) { +// CHECK:STDOUT: fn(%x.param: @CallGeneric.%T.as_type.loc10_34.1 (%T.as_type)) -> @CallGeneric.%T.as_type.loc10_34.1 (%T.as_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %Function.ref: %Function.type = name_ref Function, file.%Function.decl [concrete = constants.%Function] -// CHECK:STDOUT: %x.ref: @CallGeneric.%T.loc8_16.1 (%T) = name_ref x, %x -// CHECK:STDOUT: %Function.specific_fn.loc9_10.1: = specific_function %Function.ref, @Function(constants.%T) [symbolic = %Function.specific_fn.loc9_10.2 (constants.%Function.specific_fn.46f)] -// CHECK:STDOUT: %Function.call: init @CallGeneric.%T.loc8_16.1 (%T) = call %Function.specific_fn.loc9_10.1(%x.ref) -// CHECK:STDOUT: %.loc9_21.1: @CallGeneric.%T.loc8_16.1 (%T) = value_of_initializer %Function.call -// CHECK:STDOUT: %.loc9_21.2: @CallGeneric.%T.loc8_16.1 (%T) = converted %Function.call, %.loc9_21.1 -// CHECK:STDOUT: return %.loc9_21.2 +// CHECK:STDOUT: %x.ref: @CallGeneric.%T.as_type.loc10_34.1 (%T.as_type) = name_ref x, %x +// CHECK:STDOUT: %.loc12_20.1: %Copy.type = converted constants.%T.as_type, constants.%T.578 [symbolic = %T.loc10_16.1 (constants.%T.578)] +// CHECK:STDOUT: %.loc12_20.2: %Copy.type = converted constants.%T.as_type, constants.%T.578 [symbolic = %T.loc10_16.1 (constants.%T.578)] +// CHECK:STDOUT: %Function.specific_fn.loc12_10.1: = specific_function %Function.ref, @Function(constants.%T.578) [symbolic = %Function.specific_fn.loc12_10.2 (constants.%Function.specific_fn.e31)] +// CHECK:STDOUT: %Function.call: init @CallGeneric.%T.as_type.loc10_34.1 (%T.as_type) = call %Function.specific_fn.loc12_10.1(%x.ref) +// CHECK:STDOUT: return %Function.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @CallGenericPtr(%T.loc12_19.2: type) { -// CHECK:STDOUT: %T.loc12_19.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc12_19.1 (constants.%T)] -// CHECK:STDOUT: %ptr.loc12_33.1: type = ptr_type %T.loc12_19.1 [symbolic = %ptr.loc12_33.1 (constants.%ptr.79f)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr.loc12_33.1 [symbolic = %pattern_type (constants.%pattern_type.afe)] +// CHECK:STDOUT: generic fn @CallGenericPtr(%T.loc16_19.2: type) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %ptr.loc12_33.1 [symbolic = %require_complete (constants.%require_complete.6e5)] -// CHECK:STDOUT: %Function.specific_fn.loc13_10.2: = specific_function constants.%Function, @Function(%ptr.loc12_33.1) [symbolic = %Function.specific_fn.loc13_10.2 (constants.%Function.specific_fn.4d7)] +// CHECK:STDOUT: +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %ptr.loc16_33.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.cb2)] +// CHECK:STDOUT: %Copy.facet.loc18_20.3: %Copy.type = facet_value %ptr.loc16_33.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet.loc18_20.3 (constants.%Copy.facet.def)] +// CHECK:STDOUT: %Function.specific_fn.loc18_10.2: = specific_function constants.%Function, @Function(%Copy.facet.loc18_20.3) [symbolic = %Function.specific_fn.loc18_10.2 (constants.%Function.specific_fn.329)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f)) -> @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f) { +// CHECK:STDOUT: fn(%x.param: @CallGenericPtr.%ptr.loc16_33.1 (%ptr.79f)) -> @CallGenericPtr.%ptr.loc16_33.1 (%ptr.79f) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %Function.ref: %Function.type = name_ref Function, file.%Function.decl [concrete = constants.%Function] -// CHECK:STDOUT: %x.ref: @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f) = name_ref x, %x -// CHECK:STDOUT: %Function.specific_fn.loc13_10.1: = specific_function %Function.ref, @Function(constants.%ptr.79f) [symbolic = %Function.specific_fn.loc13_10.2 (constants.%Function.specific_fn.4d7)] -// CHECK:STDOUT: %Function.call: init @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f) = call %Function.specific_fn.loc13_10.1(%x.ref) -// CHECK:STDOUT: %.loc13_21.1: @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f) = value_of_initializer %Function.call -// CHECK:STDOUT: %.loc13_21.2: @CallGenericPtr.%ptr.loc12_33.1 (%ptr.79f) = converted %Function.call, %.loc13_21.1 -// CHECK:STDOUT: return %.loc13_21.2 +// CHECK:STDOUT: %x.ref: @CallGenericPtr.%ptr.loc16_33.1 (%ptr.79f) = name_ref x, %x +// CHECK:STDOUT: %Copy.facet.loc18_20.1: %Copy.type = facet_value constants.%ptr.79f, (constants.%Copy.lookup_impl_witness.cb2) [symbolic = %Copy.facet.loc18_20.3 (constants.%Copy.facet.def)] +// CHECK:STDOUT: %.loc18_20.1: %Copy.type = converted constants.%ptr.79f, %Copy.facet.loc18_20.1 [symbolic = %Copy.facet.loc18_20.3 (constants.%Copy.facet.def)] +// CHECK:STDOUT: %Copy.facet.loc18_20.2: %Copy.type = facet_value constants.%ptr.79f, (constants.%Copy.lookup_impl_witness.cb2) [symbolic = %Copy.facet.loc18_20.3 (constants.%Copy.facet.def)] +// CHECK:STDOUT: %.loc18_20.2: %Copy.type = converted constants.%ptr.79f, %Copy.facet.loc18_20.2 [symbolic = %Copy.facet.loc18_20.3 (constants.%Copy.facet.def)] +// CHECK:STDOUT: %Function.specific_fn.loc18_10.1: = specific_function %Function.ref, @Function(constants.%Copy.facet.def) [symbolic = %Function.specific_fn.loc18_10.2 (constants.%Function.specific_fn.329)] +// CHECK:STDOUT: %Function.call: init @CallGenericPtr.%ptr.loc16_33.1 (%ptr.79f) = call %Function.specific_fn.loc18_10.1(%x.ref) +// CHECK:STDOUT: return %Function.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: fn @C.as.Destroy.impl.Op(%self.param: %ptr.019) = "no_op"; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CallSpecific(%x.param: %C) -> %return.param: %C { +// CHECK:STDOUT: fn @CallSpecific(%x.param: %ptr.019) -> %ptr.019 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %Function.ref: %Function.type = name_ref Function, file.%Function.decl [concrete = constants.%Function] -// CHECK:STDOUT: %x.ref: %C = name_ref x, %x -// CHECK:STDOUT: %Function.specific_fn: = specific_function %Function.ref, @Function(constants.%C) [concrete = constants.%Function.specific_fn.1b5] -// CHECK:STDOUT: %.loc18: ref %C = splice_block %return {} -// CHECK:STDOUT: %Function.call: init %C = call %Function.specific_fn(%x.ref) to %.loc18 +// CHECK:STDOUT: %x.ref: %ptr.019 = name_ref x, %x +// CHECK:STDOUT: %Copy.facet.loc26_20.1: %Copy.type = facet_value constants.%ptr.019, (constants.%Copy.impl_witness.a94) [concrete = constants.%Copy.facet.9a6] +// CHECK:STDOUT: %.loc26_20.1: %Copy.type = converted constants.%ptr.019, %Copy.facet.loc26_20.1 [concrete = constants.%Copy.facet.9a6] +// CHECK:STDOUT: %Copy.facet.loc26_20.2: %Copy.type = facet_value constants.%ptr.019, (constants.%Copy.impl_witness.a94) [concrete = constants.%Copy.facet.9a6] +// CHECK:STDOUT: %.loc26_20.2: %Copy.type = converted constants.%ptr.019, %Copy.facet.loc26_20.2 [concrete = constants.%Copy.facet.9a6] +// CHECK:STDOUT: %Function.specific_fn: = specific_function %Function.ref, @Function(constants.%Copy.facet.9a6) [concrete = constants.%Function.specific_fn.527] +// CHECK:STDOUT: %Function.call: init %ptr.019 = call %Function.specific_fn(%x.ref) // CHECK:STDOUT: return %Function.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Function(constants.%T) { -// CHECK:STDOUT: %T.loc4_13.1 => constants.%T -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc +// CHECK:STDOUT: specific @Function(constants.%T.578) { +// CHECK:STDOUT: %T.loc5_13.1 => constants.%T.578 +// CHECK:STDOUT: %T.as_type.loc5_31.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.f8cebc.1 // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae +// CHECK:STDOUT: %require_complete => constants.%require_complete.ecc +// CHECK:STDOUT: %Copy.lookup_impl_witness => constants.%Copy.lookup_impl_witness.3ba +// CHECK:STDOUT: %Copy.facet => constants.%Copy.facet.72e +// CHECK:STDOUT: %.loc6_10.2 => constants.%.671 +// CHECK:STDOUT: %impl.elem0.loc6_10.2 => constants.%impl.elem0.56e +// CHECK:STDOUT: %specific_impl_fn.loc6_10.2 => constants.%specific_impl_fn.fb7 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @CallGeneric(constants.%T) { -// CHECK:STDOUT: %T.loc8_16.1 => constants.%T -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc +// CHECK:STDOUT: specific @CallGeneric(constants.%T.578) { +// CHECK:STDOUT: %T.loc10_16.1 => constants.%T.578 +// CHECK:STDOUT: %T.as_type.loc10_34.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.f8cebc.1 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @CallGenericPtr(constants.%T) { -// CHECK:STDOUT: %T.loc12_19.1 => constants.%T -// CHECK:STDOUT: %ptr.loc12_33.1 => constants.%ptr.79f +// CHECK:STDOUT: specific @CallGenericPtr(constants.%T.8b3) { +// CHECK:STDOUT: %T.loc16_19.1 => constants.%T.8b3 +// CHECK:STDOUT: %ptr.loc16_33.1 => constants.%ptr.79f // CHECK:STDOUT: %pattern_type => constants.%pattern_type.afe // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Function(constants.%ptr.79f) { -// CHECK:STDOUT: %T.loc4_13.1 => constants.%ptr.79f +// CHECK:STDOUT: specific @Function(constants.%Copy.facet.def) { +// CHECK:STDOUT: %T.loc5_13.1 => constants.%Copy.facet.def +// CHECK:STDOUT: %T.as_type.loc5_31.1 => constants.%ptr.79f // CHECK:STDOUT: %pattern_type => constants.%pattern_type.afe // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%require_complete.6e5 +// CHECK:STDOUT: %Copy.lookup_impl_witness => constants.%Copy.lookup_impl_witness.cb2 +// CHECK:STDOUT: %Copy.facet => constants.%Copy.facet.def +// CHECK:STDOUT: %.loc6_10.2 => constants.%.fe5 +// CHECK:STDOUT: %impl.elem0.loc6_10.2 => constants.%impl.elem0.429 +// CHECK:STDOUT: %specific_impl_fn.loc6_10.2 => constants.%specific_impl_fn.d8a // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Function(constants.%C) { -// CHECK:STDOUT: %T.loc4_13.1 => constants.%C -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.c48 +// CHECK:STDOUT: specific @Function(constants.%Copy.facet.9a6) { +// CHECK:STDOUT: %T.loc5_13.1 => constants.%Copy.facet.9a6 +// CHECK:STDOUT: %T.as_type.loc5_31.1 => constants.%ptr.019 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.44a // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type +// CHECK:STDOUT: %require_complete => constants.%complete_type.d05 +// CHECK:STDOUT: %Copy.lookup_impl_witness => constants.%Copy.impl_witness.a94 +// CHECK:STDOUT: %Copy.facet => constants.%Copy.facet.9a6 +// CHECK:STDOUT: %.loc6_10.2 => constants.%.a98 +// CHECK:STDOUT: %impl.elem0.loc6_10.2 => constants.%ptr.as.Copy.impl.Op.fd1 +// CHECK:STDOUT: %specific_impl_fn.loc6_10.2 => constants.%ptr.as.Copy.impl.Op.specific_fn // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/generic/deduce.carbon b/toolchain/check/testdata/function/generic/deduce.carbon index ad19568baf70..0705eb16505c 100644 --- a/toolchain/check/testdata/function/generic/deduce.carbon +++ b/toolchain/check/testdata/function/generic/deduce.carbon @@ -314,9 +314,7 @@ fn F() { // CHECK:STDOUT: %T.ref.loc4_71: type = name_ref T, %T.loc4_25.2 [symbolic = %T.loc4_25.1 (constants.%T)] // CHECK:STDOUT: %ExplicitGenericParam.specific_fn.loc4_50.1: = specific_function %ExplicitGenericParam.ref, @ExplicitGenericParam(constants.%T) [symbolic = %ExplicitGenericParam.specific_fn.loc4_50.2 (constants.%ExplicitGenericParam.specific_fn.c0a)] // CHECK:STDOUT: %ExplicitGenericParam.call: init @ExplicitGenericParam.%ptr.loc4_39.1 (%ptr.79f) = call %ExplicitGenericParam.specific_fn.loc4_50.1() -// CHECK:STDOUT: %.loc4_73.1: @ExplicitGenericParam.%ptr.loc4_39.1 (%ptr.79f) = value_of_initializer %ExplicitGenericParam.call -// CHECK:STDOUT: %.loc4_73.2: @ExplicitGenericParam.%ptr.loc4_39.1 (%ptr.79f) = converted %ExplicitGenericParam.call, %.loc4_73.1 -// CHECK:STDOUT: return %.loc4_73.2 +// CHECK:STDOUT: return %ExplicitGenericParam.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -327,9 +325,7 @@ fn F() { // CHECK:STDOUT: %i32.loc7: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %ExplicitGenericParam.specific_fn: = specific_function %ExplicitGenericParam.ref, @ExplicitGenericParam(constants.%i32) [concrete = constants.%ExplicitGenericParam.specific_fn.74e] // CHECK:STDOUT: %ExplicitGenericParam.call: init %ptr.235 = call %ExplicitGenericParam.specific_fn() -// CHECK:STDOUT: %.loc7_35.1: %ptr.235 = value_of_initializer %ExplicitGenericParam.call -// CHECK:STDOUT: %.loc7_35.2: %ptr.235 = converted %ExplicitGenericParam.call, %.loc7_35.1 -// CHECK:STDOUT: return %.loc7_35.2 +// CHECK:STDOUT: return %ExplicitGenericParam.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @CallExplicitGenericParamWithGenericArg(%T.loc10_43.2: type) { @@ -349,9 +345,7 @@ fn F() { // CHECK:STDOUT: %struct_type.a.loc11: type = struct_type {.a: @CallExplicitGenericParamWithGenericArg.%T.loc10_43.1 (%T)} [symbolic = %struct_type.a.loc10_62.1 (constants.%struct_type.a)] // CHECK:STDOUT: %ExplicitGenericParam.specific_fn.loc11_10.1: = specific_function %ExplicitGenericParam.ref, @ExplicitGenericParam(constants.%struct_type.a) [symbolic = %ExplicitGenericParam.specific_fn.loc11_10.2 (constants.%ExplicitGenericParam.specific_fn.6ad)] // CHECK:STDOUT: %ExplicitGenericParam.call: init @CallExplicitGenericParamWithGenericArg.%ptr.loc10_63.1 (%ptr.48a) = call %ExplicitGenericParam.specific_fn.loc11_10.1() -// CHECK:STDOUT: %.loc11_39.1: @CallExplicitGenericParamWithGenericArg.%ptr.loc10_63.1 (%ptr.48a) = value_of_initializer %ExplicitGenericParam.call -// CHECK:STDOUT: %.loc11_39.2: @CallExplicitGenericParamWithGenericArg.%ptr.loc10_63.1 (%ptr.48a) = converted %ExplicitGenericParam.call, %.loc11_39.1 -// CHECK:STDOUT: return %.loc11_39.2 +// CHECK:STDOUT: return %ExplicitGenericParam.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -468,9 +462,7 @@ fn F() { // CHECK:STDOUT: %T.ref.loc4_71: type = name_ref T, %T.loc4_25.2 [symbolic = %T.loc4_25.1 (constants.%T)] // CHECK:STDOUT: %ExplicitGenericParam.specific_fn.loc4_50.1: = specific_function %ExplicitGenericParam.ref, @ExplicitGenericParam(constants.%T) [symbolic = %ExplicitGenericParam.specific_fn.loc4_50.2 (constants.%ExplicitGenericParam.specific_fn)] // CHECK:STDOUT: %ExplicitGenericParam.call: init @ExplicitGenericParam.%ptr.loc4_39.1 (%ptr) = call %ExplicitGenericParam.specific_fn.loc4_50.1() -// CHECK:STDOUT: %.loc4_73.1: @ExplicitGenericParam.%ptr.loc4_39.1 (%ptr) = value_of_initializer %ExplicitGenericParam.call -// CHECK:STDOUT: %.loc4_73.2: @ExplicitGenericParam.%ptr.loc4_39.1 (%ptr) = converted %ExplicitGenericParam.call, %.loc4_73.1 -// CHECK:STDOUT: return %.loc4_73.2 +// CHECK:STDOUT: return %ExplicitGenericParam.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -641,9 +633,7 @@ fn F() { // CHECK:STDOUT: %x.ref: @ExplicitAndAlsoDeduced.%T.loc6_27.1 (%T) = name_ref x, %x // CHECK:STDOUT: %ExplicitAndAlsoDeduced.specific_fn.loc7_10.1: = specific_function %ExplicitAndAlsoDeduced.ref, @ExplicitAndAlsoDeduced(constants.%T) [symbolic = %ExplicitAndAlsoDeduced.specific_fn.loc7_10.2 (constants.%ExplicitAndAlsoDeduced.specific_fn.41d)] // CHECK:STDOUT: %ExplicitAndAlsoDeduced.call: init @ExplicitAndAlsoDeduced.%ptr.loc6_47.1 (%ptr.79f) = call %ExplicitAndAlsoDeduced.specific_fn.loc7_10.1(%x.ref) -// CHECK:STDOUT: %.loc7_38.1: @ExplicitAndAlsoDeduced.%ptr.loc6_47.1 (%ptr.79f) = value_of_initializer %ExplicitAndAlsoDeduced.call -// CHECK:STDOUT: %.loc7_38.2: @ExplicitAndAlsoDeduced.%ptr.loc6_47.1 (%ptr.79f) = converted %ExplicitAndAlsoDeduced.call, %.loc7_38.1 -// CHECK:STDOUT: return %.loc7_38.2 +// CHECK:STDOUT: return %ExplicitAndAlsoDeduced.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -659,12 +649,10 @@ fn F() { // CHECK:STDOUT: %.loc11_37.5: ref %A = converted %.loc11_37.1, %.loc11_37.4 // CHECK:STDOUT: %.loc11_37.6: %A = bind_value %.loc11_37.5 // CHECK:STDOUT: %ExplicitAndAlsoDeduced.call: init %ptr.6db = call %ExplicitAndAlsoDeduced.specific_fn(%.loc11_37.6) -// CHECK:STDOUT: %.loc11_39.1: %ptr.6db = value_of_initializer %ExplicitAndAlsoDeduced.call -// CHECK:STDOUT: %.loc11_39.2: %ptr.6db = converted %ExplicitAndAlsoDeduced.call, %.loc11_39.1 // CHECK:STDOUT: %A.as.Destroy.impl.Op.bound: = bound_method %.loc11_37.4, constants.%A.as.Destroy.impl.Op // CHECK:STDOUT: %addr: %ptr.6db = addr_of %.loc11_37.4 // CHECK:STDOUT: %A.as.Destroy.impl.Op.call: init %empty_tuple.type = call %A.as.Destroy.impl.Op.bound(%addr) -// CHECK:STDOUT: return %.loc11_39.2 +// CHECK:STDOUT: return %ExplicitAndAlsoDeduced.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @ExplicitAndAlsoDeduced(constants.%T) { @@ -791,9 +779,7 @@ fn F() { // CHECK:STDOUT: %x.ref: @ImplicitGenericParam.%T.loc4_25.1 (%T) = name_ref x, %x // CHECK:STDOUT: %ImplicitGenericParam.specific_fn.loc4_56.1: = specific_function %ImplicitGenericParam.ref, @ImplicitGenericParam(constants.%T) [symbolic = %ImplicitGenericParam.specific_fn.loc4_56.2 (constants.%ImplicitGenericParam.specific_fn.fc1)] // CHECK:STDOUT: %ImplicitGenericParam.call: init @ImplicitGenericParam.%ptr.loc4_45.1 (%ptr.79f) = call %ImplicitGenericParam.specific_fn.loc4_56.1(%x.ref) -// CHECK:STDOUT: %.loc4_79.1: @ImplicitGenericParam.%ptr.loc4_45.1 (%ptr.79f) = value_of_initializer %ImplicitGenericParam.call -// CHECK:STDOUT: %.loc4_79.2: @ImplicitGenericParam.%ptr.loc4_45.1 (%ptr.79f) = converted %ImplicitGenericParam.call, %.loc4_79.1 -// CHECK:STDOUT: return %.loc4_79.2 +// CHECK:STDOUT: return %ImplicitGenericParam.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -803,9 +789,7 @@ fn F() { // CHECK:STDOUT: %n.ref: %i32 = name_ref n, %n // CHECK:STDOUT: %ImplicitGenericParam.specific_fn: = specific_function %ImplicitGenericParam.ref, @ImplicitGenericParam(constants.%i32) [concrete = constants.%ImplicitGenericParam.specific_fn.752] // CHECK:STDOUT: %ImplicitGenericParam.call: init %ptr.235 = call %ImplicitGenericParam.specific_fn(%n.ref) -// CHECK:STDOUT: %.loc7_33.1: %ptr.235 = value_of_initializer %ImplicitGenericParam.call -// CHECK:STDOUT: %.loc7_33.2: %ptr.235 = converted %ImplicitGenericParam.call, %.loc7_33.1 -// CHECK:STDOUT: return %.loc7_33.2 +// CHECK:STDOUT: return %ImplicitGenericParam.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @ImplicitGenericParam(constants.%T) { diff --git a/toolchain/check/testdata/function/generic/indirect_generic_type.carbon b/toolchain/check/testdata/function/generic/indirect_generic_type.carbon index d9ae36cbd2e6..8f730777185d 100644 --- a/toolchain/check/testdata/function/generic/indirect_generic_type.carbon +++ b/toolchain/check/testdata/function/generic/indirect_generic_type.carbon @@ -2,9 +2,7 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // -// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/none.carbon -// TODO: Add ranges and switch to "--dump-sem-ir-ranges=only". -// EXTRA-ARGS: --dump-sem-ir-ranges=if-present +// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/convert.carbon // // AUTOUPDATE // TIP: To test this file alone, run: @@ -12,79 +10,66 @@ // TIP: To dump output, run: // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/function/generic/indirect_generic_type.carbon +// --- pointer_to_pointer.carbon + +library "[[@TEST_NAME]]"; + fn F(T:! type, p: T**) -> T* { + //@dump-sem-ir-begin return *p; + //@dump-sem-ir-end } -// CHECK:STDOUT: --- indirect_generic_type.carbon +// CHECK:STDOUT: --- pointer_to_pointer.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %ptr.79f: type = ptr_type %T [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %ptr.79f: type = ptr_type %T.8b3 [symbolic] // CHECK:STDOUT: %ptr.a13: type = ptr_type %ptr.79f [symbolic] // CHECK:STDOUT: %pattern_type.12d: type = pattern_type %ptr.a13 [symbolic] // CHECK:STDOUT: %pattern_type.afe: type = pattern_type %ptr.79f [symbolic] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.6e5: = require_complete_type %ptr.79f [symbolic] -// CHECK:STDOUT: %require_complete.132: = require_complete_type %ptr.a13 [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.lookup_impl_witness.cb2: = lookup_impl_witness %ptr.79f, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.def: %Copy.type = facet_value %ptr.79f, (%Copy.lookup_impl_witness.cb2) [symbolic] +// CHECK:STDOUT: %.fe5: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.def [symbolic] +// CHECK:STDOUT: %impl.elem0.429: %.fe5 = impl_witness_access %Copy.lookup_impl_witness.cb2, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.d8a: = specific_impl_function %impl.elem0.429, @Copy.Op(%Copy.facet.def) [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %p.patt: @F.%pattern_type.loc15_16 (%pattern_type.12d) = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: @F.%pattern_type.loc15_16 (%pattern_type.12d) = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @F.%pattern_type.loc15_24 (%pattern_type.afe) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @F.%pattern_type.loc15_24 (%pattern_type.afe) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc15_27: type = name_ref T, %T.loc15_6.2 [symbolic = %T.loc15_6.1 (constants.%T)] -// CHECK:STDOUT: %ptr.loc15_28: type = ptr_type %T.ref.loc15_27 [symbolic = %ptr.loc15_20.1 (constants.%ptr.79f)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc15_6.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc15_6.1 (constants.%T)] -// CHECK:STDOUT: %p.param: @F.%ptr.loc15_21.1 (%ptr.a13) = value_param call_param0 -// CHECK:STDOUT: %.loc15: type = splice_block %ptr.loc15_21.2 [symbolic = %ptr.loc15_21.1 (constants.%ptr.a13)] { -// CHECK:STDOUT: %T.ref.loc15_19: type = name_ref T, %T.loc15_6.2 [symbolic = %T.loc15_6.1 (constants.%T)] -// CHECK:STDOUT: %ptr.loc15_20.2: type = ptr_type %T.ref.loc15_19 [symbolic = %ptr.loc15_20.1 (constants.%ptr.79f)] -// CHECK:STDOUT: %ptr.loc15_21.2: type = ptr_type %ptr.loc15_20.2 [symbolic = %ptr.loc15_21.1 (constants.%ptr.a13)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: @F.%ptr.loc15_21.1 (%ptr.a13) = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref @F.%ptr.loc15_20.1 (%ptr.79f) = out_param call_param1 -// CHECK:STDOUT: %return: ref @F.%ptr.loc15_20.1 (%ptr.79f) = return_slot %return.param -// CHECK:STDOUT: } +// CHECK:STDOUT: imports { // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F(%T.loc15_6.2: type) { -// CHECK:STDOUT: %T.loc15_6.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc15_6.1 (constants.%T)] -// CHECK:STDOUT: %ptr.loc15_20.1: type = ptr_type %T.loc15_6.1 [symbolic = %ptr.loc15_20.1 (constants.%ptr.79f)] -// CHECK:STDOUT: %ptr.loc15_21.1: type = ptr_type %ptr.loc15_20.1 [symbolic = %ptr.loc15_21.1 (constants.%ptr.a13)] -// CHECK:STDOUT: %pattern_type.loc15_16: type = pattern_type %ptr.loc15_21.1 [symbolic = %pattern_type.loc15_16 (constants.%pattern_type.12d)] -// CHECK:STDOUT: %pattern_type.loc15_24: type = pattern_type %ptr.loc15_20.1 [symbolic = %pattern_type.loc15_24 (constants.%pattern_type.afe)] +// CHECK:STDOUT: generic fn @F(%T.loc4_6.2: type) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc15_24: = require_complete_type %ptr.loc15_20.1 [symbolic = %require_complete.loc15_24 (constants.%require_complete.6e5)] -// CHECK:STDOUT: %require_complete.loc15_17: = require_complete_type %ptr.loc15_21.1 [symbolic = %require_complete.loc15_17 (constants.%require_complete.132)] +// CHECK:STDOUT: +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %ptr.loc4_20.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.cb2)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %ptr.loc4_20.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.def)] +// CHECK:STDOUT: %.loc6_10.4: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc6_10.4 (constants.%.fe5)] +// CHECK:STDOUT: %impl.elem0.loc6_10.2: @F.%.loc6_10.4 (%.fe5) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc6_10.2 (constants.%impl.elem0.429)] +// CHECK:STDOUT: %specific_impl_fn.loc6_10.2: = specific_impl_function %impl.elem0.loc6_10.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc6_10.2 (constants.%specific_impl_fn.d8a)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%p.param: @F.%ptr.loc15_21.1 (%ptr.a13)) -> @F.%ptr.loc15_20.1 (%ptr.79f) { +// CHECK:STDOUT: fn(%p.param: @F.%ptr.loc4_21.1 (%ptr.a13)) -> @F.%ptr.loc4_20.1 (%ptr.79f) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: @F.%ptr.loc15_21.1 (%ptr.a13) = name_ref p, %p -// CHECK:STDOUT: %.loc16_10.1: ref @F.%ptr.loc15_20.1 (%ptr.79f) = deref %p.ref -// CHECK:STDOUT: %.loc16_10.2: @F.%ptr.loc15_20.1 (%ptr.79f) = bind_value %.loc16_10.1 -// CHECK:STDOUT: return %.loc16_10.2 +// CHECK:STDOUT: %p.ref: @F.%ptr.loc4_21.1 (%ptr.a13) = name_ref p, %p +// CHECK:STDOUT: %.loc6_10.1: ref @F.%ptr.loc4_20.1 (%ptr.79f) = deref %p.ref +// CHECK:STDOUT: %.loc6_10.2: @F.%ptr.loc4_20.1 (%ptr.79f) = bind_value %.loc6_10.1 +// CHECK:STDOUT: %impl.elem0.loc6_10.1: @F.%.loc6_10.4 (%.fe5) = impl_witness_access constants.%Copy.lookup_impl_witness.cb2, element0 [symbolic = %impl.elem0.loc6_10.2 (constants.%impl.elem0.429)] +// CHECK:STDOUT: %bound_method.loc6_10.1: = bound_method %.loc6_10.2, %impl.elem0.loc6_10.1 +// CHECK:STDOUT: %specific_impl_fn.loc6_10.1: = specific_impl_function %impl.elem0.loc6_10.1, @Copy.Op(constants.%Copy.facet.def) [symbolic = %specific_impl_fn.loc6_10.2 (constants.%specific_impl_fn.d8a)] +// CHECK:STDOUT: %bound_method.loc6_10.2: = bound_method %.loc6_10.2, %specific_impl_fn.loc6_10.1 +// CHECK:STDOUT: %.loc6_10.3: init @F.%ptr.loc4_20.1 (%ptr.79f) = call %bound_method.loc6_10.2(%.loc6_10.2) +// CHECK:STDOUT: return %.loc6_10.3 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T.loc15_6.1 => constants.%T -// CHECK:STDOUT: %ptr.loc15_20.1 => constants.%ptr.79f -// CHECK:STDOUT: %ptr.loc15_21.1 => constants.%ptr.a13 -// CHECK:STDOUT: %pattern_type.loc15_16 => constants.%pattern_type.12d -// CHECK:STDOUT: %pattern_type.loc15_24 => constants.%pattern_type.afe +// CHECK:STDOUT: specific @F(constants.%T.8b3) { +// CHECK:STDOUT: %T.loc4_6.1 => constants.%T.8b3 +// CHECK:STDOUT: %ptr.loc4_20.1 => constants.%ptr.79f +// CHECK:STDOUT: %ptr.loc4_21.1 => constants.%ptr.a13 +// CHECK:STDOUT: %pattern_type.loc4_16 => constants.%pattern_type.12d +// CHECK:STDOUT: %pattern_type.loc4_24 => constants.%pattern_type.afe // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/generic/redeclare.carbon b/toolchain/check/testdata/function/generic/redeclare.carbon index ed564ca2a826..f668f537821b 100644 --- a/toolchain/check/testdata/function/generic/redeclare.carbon +++ b/toolchain/check/testdata/function/generic/redeclare.carbon @@ -163,9 +163,7 @@ fn F(U:! type, T:! type) -> U* { // CHECK:STDOUT: %T.ref.loc7: type = name_ref T, %T.loc6 [symbolic = %T.loc4_6.1 (constants.%T)] // CHECK:STDOUT: %F.specific_fn.loc7_10.1: = specific_function %F.ref, @F(constants.%T) [symbolic = %F.specific_fn.loc7_10.2 (constants.%F.specific_fn)] // CHECK:STDOUT: %F.call: init @F.%ptr.loc4_20.1 (%ptr) = call %F.specific_fn.loc7_10.1() -// CHECK:STDOUT: %.loc7_14.1: @F.%ptr.loc4_20.1 (%ptr) = value_of_initializer %F.call -// CHECK:STDOUT: %.loc7_14.2: @F.%ptr.loc4_20.1 (%ptr) = converted %F.call, %.loc7_14.1 -// CHECK:STDOUT: return %.loc7_14.2 +// CHECK:STDOUT: return %F.call to %return.loc6 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -265,7 +263,7 @@ fn F(U:! type, T:! type) -> U* { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %F.ref: %F.type.b25846.1 = name_ref F, file.%F.decl.loc4 [concrete = constants.%F.c41931.1] // CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc13_6.2 [symbolic = %T.loc13_6.1 (constants.%T)] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -371,7 +369,7 @@ fn F(U:! type, T:! type) -> U* { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %F.ref: %F.type.b25846.1 = name_ref F, file.%F.decl.loc4 [concrete = constants.%F.c41931.1] // CHECK:STDOUT: %T.ref.loc21: type = name_ref T, %T.loc13_16.2 [symbolic = %T.loc13_16.1 (constants.%T.336)] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -477,7 +475,7 @@ fn F(U:! type, T:! type) -> U* { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %F.ref: %F.type.b25846.1 = name_ref F, file.%F.decl.loc4 [concrete = constants.%F.c41931.1] // CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc13_16.2 [symbolic = %T.loc13_16.1 (constants.%T.336)] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/generic/return_slot.carbon b/toolchain/check/testdata/function/generic/return_slot.carbon index 76decad41094..8c450398debc 100644 --- a/toolchain/check/testdata/function/generic/return_slot.carbon +++ b/toolchain/check/testdata/function/generic/return_slot.carbon @@ -228,13 +228,11 @@ fn G() { // CHECK:STDOUT: // CHECK:STDOUT: fn() -> @Wrap.Make.%T (%T) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc16_27: @Wrap.Make.%Wrap.Make.type (%Wrap.Make.type.652) = specific_constant @Wrap.%Wrap.Make.decl, @Wrap(constants.%T) [symbolic = %Wrap.Make (constants.%Wrap.Make.eb2)] -// CHECK:STDOUT: %Make.ref: @Wrap.Make.%Wrap.Make.type (%Wrap.Make.type.652) = name_ref Make, %.loc16_27 [symbolic = %Wrap.Make (constants.%Wrap.Make.eb2)] +// CHECK:STDOUT: %.loc16: @Wrap.Make.%Wrap.Make.type (%Wrap.Make.type.652) = specific_constant @Wrap.%Wrap.Make.decl, @Wrap(constants.%T) [symbolic = %Wrap.Make (constants.%Wrap.Make.eb2)] +// CHECK:STDOUT: %Make.ref: @Wrap.Make.%Wrap.Make.type (%Wrap.Make.type.652) = name_ref Make, %.loc16 [symbolic = %Wrap.Make (constants.%Wrap.Make.eb2)] // CHECK:STDOUT: %Wrap.Make.specific_fn.loc16_27.1: = specific_function %Make.ref, @Wrap.Make(constants.%T) [symbolic = %Wrap.Make.specific_fn.loc16_27.2 (constants.%Wrap.Make.specific_fn.bf1)] // CHECK:STDOUT: %Wrap.Make.call: init @Wrap.Make.%T (%T) = call %Wrap.Make.specific_fn.loc16_27.1() -// CHECK:STDOUT: %.loc16_33.1: @Wrap.Make.%T (%T) = value_of_initializer %Wrap.Make.call -// CHECK:STDOUT: %.loc16_33.2: @Wrap.Make.%T (%T) = converted %Wrap.Make.call, %.loc16_33.1 -// CHECK:STDOUT: return %.loc16_33.2 +// CHECK:STDOUT: return %Wrap.Make.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/generic/type_param_scope.carbon b/toolchain/check/testdata/function/generic/type_param_scope.carbon index 20375d9b5484..ee513f0bae09 100644 --- a/toolchain/check/testdata/function/generic/type_param_scope.carbon +++ b/toolchain/check/testdata/function/generic/type_param_scope.carbon @@ -2,9 +2,7 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // -// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/none.carbon -// TODO: Add ranges and switch to "--dump-sem-ir-ranges=only". -// EXTRA-ARGS: --dump-sem-ir-ranges=if-present +// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/convert.carbon // // AUTOUPDATE // TIP: To test this file alone, run: @@ -12,68 +10,70 @@ // TIP: To dump output, run: // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/function/generic/type_param_scope.carbon -fn F(T:! type, n: T) -> T { - let m: T = n; +// --- local_let.carbon + +library "[[@TEST_NAME]]"; + +fn F(T:! type, n: T*) -> T* { + //@dump-sem-ir-begin + let m: T* = n; return m; + //@dump-sem-ir-end } -// CHECK:STDOUT: --- type_param_scope.carbon +// CHECK:STDOUT: --- local_let.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete: = require_complete_type %T [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %ptr: type = ptr_type %T.8b3 [symbolic] +// CHECK:STDOUT: %pattern_type.afe: type = pattern_type %ptr [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.lookup_impl_witness.cb2: = lookup_impl_witness %ptr, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.def: %Copy.type = facet_value %ptr, (%Copy.lookup_impl_witness.cb2) [symbolic] +// CHECK:STDOUT: %.fe5: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.def [symbolic] +// CHECK:STDOUT: %impl.elem0.429: %.fe5 = impl_witness_access %Copy.lookup_impl_witness.cb2, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.d8a: = specific_impl_function %impl.elem0.429, @Copy.Op(%Copy.facet.def) [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %n.patt: @F.%pattern_type (%pattern_type.7dc) = binding_pattern n [concrete] -// CHECK:STDOUT: %n.param_patt: @F.%pattern_type (%pattern_type.7dc) = value_param_pattern %n.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @F.%pattern_type (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @F.%pattern_type (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc15_25: type = name_ref T, %T.loc15_6.2 [symbolic = %T.loc15_6.1 (constants.%T)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc15_6.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc15_6.1 (constants.%T)] -// CHECK:STDOUT: %n.param: @F.%T.loc15_6.1 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc15_19: type = name_ref T, %T.loc15_6.2 [symbolic = %T.loc15_6.1 (constants.%T)] -// CHECK:STDOUT: %n: @F.%T.loc15_6.1 (%T) = bind_name n, %n.param -// CHECK:STDOUT: %return.param: ref @F.%T.loc15_6.1 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @F.%T.loc15_6.1 (%T) = return_slot %return.param -// CHECK:STDOUT: } +// CHECK:STDOUT: imports { // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F(%T.loc15_6.2: type) { -// CHECK:STDOUT: %T.loc15_6.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc15_6.1 (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc15_6.1 [symbolic = %pattern_type (constants.%pattern_type.7dc)] +// CHECK:STDOUT: generic fn @F(%T.loc4_6.2: type) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc15_6.1 [symbolic = %require_complete (constants.%require_complete)] +// CHECK:STDOUT: +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %ptr.loc4_20.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.cb2)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %ptr.loc4_20.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.def)] +// CHECK:STDOUT: %.loc7_10.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc7_10.2 (constants.%.fe5)] +// CHECK:STDOUT: %impl.elem0.loc7_10.2: @F.%.loc7_10.2 (%.fe5) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc7_10.2 (constants.%impl.elem0.429)] +// CHECK:STDOUT: %specific_impl_fn.loc7_10.2: = specific_impl_function %impl.elem0.loc7_10.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc7_10.2 (constants.%specific_impl_fn.d8a)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%n.param: @F.%T.loc15_6.1 (%T)) -> @F.%T.loc15_6.1 (%T) { +// CHECK:STDOUT: fn(%n.param: @F.%ptr.loc4_20.1 (%ptr)) -> @F.%ptr.loc4_20.1 (%ptr) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %m.patt: @F.%pattern_type (%pattern_type.7dc) = binding_pattern m [concrete] +// CHECK:STDOUT: %m.patt: @F.%pattern_type (%pattern_type.afe) = binding_pattern m [concrete] // CHECK:STDOUT: } -// CHECK:STDOUT: %n.ref: @F.%T.loc15_6.1 (%T) = name_ref n, %n -// CHECK:STDOUT: %T.ref.loc16: type = name_ref T, %T.loc15_6.2 [symbolic = %T.loc15_6.1 (constants.%T)] -// CHECK:STDOUT: %m: @F.%T.loc15_6.1 (%T) = bind_name m, %n.ref -// CHECK:STDOUT: %m.ref: @F.%T.loc15_6.1 (%T) = name_ref m, %m -// CHECK:STDOUT: return %m.ref +// CHECK:STDOUT: %n.ref: @F.%ptr.loc4_20.1 (%ptr) = name_ref n, %n +// CHECK:STDOUT: %.loc6: type = splice_block %ptr.loc6 [symbolic = %ptr.loc4_20.1 (constants.%ptr)] { +// CHECK:STDOUT: %T.ref.loc6: type = name_ref T, %T.loc4_6.2 [symbolic = %T.loc4_6.1 (constants.%T.8b3)] +// CHECK:STDOUT: %ptr.loc6: type = ptr_type %T.ref.loc6 [symbolic = %ptr.loc4_20.1 (constants.%ptr)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %m: @F.%ptr.loc4_20.1 (%ptr) = bind_name m, %n.ref +// CHECK:STDOUT: %m.ref: @F.%ptr.loc4_20.1 (%ptr) = name_ref m, %m +// CHECK:STDOUT: %impl.elem0.loc7_10.1: @F.%.loc7_10.2 (%.fe5) = impl_witness_access constants.%Copy.lookup_impl_witness.cb2, element0 [symbolic = %impl.elem0.loc7_10.2 (constants.%impl.elem0.429)] +// CHECK:STDOUT: %bound_method.loc7_10.1: = bound_method %m.ref, %impl.elem0.loc7_10.1 +// CHECK:STDOUT: %specific_impl_fn.loc7_10.1: = specific_impl_function %impl.elem0.loc7_10.1, @Copy.Op(constants.%Copy.facet.def) [symbolic = %specific_impl_fn.loc7_10.2 (constants.%specific_impl_fn.d8a)] +// CHECK:STDOUT: %bound_method.loc7_10.2: = bound_method %m.ref, %specific_impl_fn.loc7_10.1 +// CHECK:STDOUT: %.loc7_10.1: init @F.%ptr.loc4_20.1 (%ptr) = call %bound_method.loc7_10.2(%m.ref) +// CHECK:STDOUT: return %.loc7_10.1 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T.loc15_6.1 => constants.%T -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc +// CHECK:STDOUT: specific @F(constants.%T.8b3) { +// CHECK:STDOUT: %T.loc4_6.1 => constants.%T.8b3 +// CHECK:STDOUT: %ptr.loc4_20.1 => constants.%ptr +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.afe // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/generic/undefined.carbon b/toolchain/check/testdata/function/generic/undefined.carbon index 33c21018c932..2dcec42e6b9a 100644 --- a/toolchain/check/testdata/function/generic/undefined.carbon +++ b/toolchain/check/testdata/function/generic/undefined.carbon @@ -3,8 +3,6 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // // INCLUDE-FILE: toolchain/testing/testdata/min_prelude/int.carbon -// TODO: Add ranges and switch to "--dump-sem-ir-ranges=only". -// EXTRA-ARGS: --dump-sem-ir-ranges=if-present // // AUTOUPDATE // TIP: To test this file alone, run: @@ -16,447 +14,37 @@ library "[[@TEST_NAME]]"; -fn Defined[T:! type](x: T) -> T { - return x; -} +fn Defined[T:! type](x: T) {} -fn CallDefined() -> i32 { - return Defined(0 as i32); +fn CallDefined() { + Defined(0 as i32); } // --- call_defined_late.carbon library "[[@TEST_NAME]]"; -fn Defined[T:! type](x: T) -> T; +fn Defined[T:! type](x: T); -fn CallDefined() -> i32 { - return Defined(0 as i32); +fn CallDefined() { + Defined(0 as i32); } -fn Defined[T:! type](x: T) -> T { - return x; -} +fn Defined[T:! type](x: T) {} // --- fail_call_undefined.carbon library "[[@TEST_NAME]]"; -fn Undefined[T:! type](x: T) -> T; +fn Undefined[T:! type](x: T); -fn CallUndefined() -> i32 { - // CHECK:STDERR: fail_call_undefined.carbon:[[@LINE+7]]:10: error: use of undefined generic function [MissingGenericFunctionDefinition] - // CHECK:STDERR: return Undefined(0 as i32); - // CHECK:STDERR: ^~~~~~~~~ +fn CallUndefined() { + // CHECK:STDERR: fail_call_undefined.carbon:[[@LINE+7]]:3: error: use of undefined generic function [MissingGenericFunctionDefinition] + // CHECK:STDERR: Undefined(0 as i32); + // CHECK:STDERR: ^~~~~~~~~ // CHECK:STDERR: fail_call_undefined.carbon:[[@LINE-6]]:1: note: generic function declared here [MissingGenericFunctionDefinitionHere] - // CHECK:STDERR: fn Undefined[T:! type](x: T) -> T; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fn Undefined[T:! type](x: T); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: - return Undefined(0 as i32); + Undefined(0 as i32); } - -// CHECK:STDOUT: --- call_defined.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %pattern_type.7dcd0a.1: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %Defined.type: type = fn_type @Defined [concrete] -// CHECK:STDOUT: %Defined: %Defined.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %CallDefined.type: type = fn_type @CallDefined [concrete] -// CHECK:STDOUT: %CallDefined: %CallDefined.type = struct_value () [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] -// CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete] -// CHECK:STDOUT: %As.type.90f: type = generic_interface_type @As [concrete] -// CHECK:STDOUT: %As.generic: %As.type.90f = struct_value () [concrete] -// CHECK:STDOUT: %As.type.047: type = facet_type <@As, @As(%i32)> [concrete] -// CHECK:STDOUT: %As.Convert.type.99b: type = fn_type @As.Convert, @As(%i32) [concrete] -// CHECK:STDOUT: %To: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.type.676: type = fn_type @Core.IntLiteral.as.As.impl.Convert, @Core.IntLiteral.as.As.impl(%To) [symbolic] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.086: %Core.IntLiteral.as.As.impl.Convert.type.676 = struct_value () [symbolic] -// CHECK:STDOUT: %As.impl_witness.a7b: = impl_witness imports.%As.impl_witness_table.3fe, @Core.IntLiteral.as.As.impl(%int_32) [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.type.7bd: type = fn_type @Core.IntLiteral.as.As.impl.Convert, @Core.IntLiteral.as.As.impl(%int_32) [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.11b: %Core.IntLiteral.as.As.impl.Convert.type.7bd = struct_value () [concrete] -// CHECK:STDOUT: %As.facet: %As.type.047 = facet_value Core.IntLiteral, (%As.impl_witness.a7b) [concrete] -// CHECK:STDOUT: %.323: type = fn_type_with_self_type %As.Convert.type.99b, %As.facet [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.bound: = bound_method %int_0.5c6, %Core.IntLiteral.as.As.impl.Convert.11b [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.As.impl.Convert.11b, @Core.IntLiteral.as.As.impl.Convert(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_0.5c6, %Core.IntLiteral.as.As.impl.Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_0.6a9: %i32 = int_value 0 [concrete] -// CHECK:STDOUT: %Defined.specific_fn: = specific_function %Defined, @Defined(%i32) [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .As = %Core.As -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.As: %As.type.90f = import_ref Core//prelude/parts/as, As, loaded [concrete = constants.%As.generic] -// CHECK:STDOUT: %Core.import_ref.52c: @Core.IntLiteral.as.As.impl.%Core.IntLiteral.as.As.impl.Convert.type (%Core.IntLiteral.as.As.impl.Convert.type.676) = import_ref Core//prelude/parts/int, loc32_39, loaded [symbolic = @Core.IntLiteral.as.As.impl.%Core.IntLiteral.as.As.impl.Convert (constants.%Core.IntLiteral.as.As.impl.Convert.086)] -// CHECK:STDOUT: %As.impl_witness_table.3fe = impl_witness_table (%Core.import_ref.52c), @Core.IntLiteral.as.As.impl [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Defined = %Defined.decl -// CHECK:STDOUT: .CallDefined = %CallDefined.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Defined.decl: %Defined.type = fn_decl @Defined [concrete = constants.%Defined] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @Defined.%pattern_type (%pattern_type.7dcd0a.1) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @Defined.%pattern_type (%pattern_type.7dcd0a.1) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @Defined.%pattern_type (%pattern_type.7dcd0a.1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Defined.%pattern_type (%pattern_type.7dcd0a.1) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc4_31: type = name_ref T, %T.loc4_12.2 [symbolic = %T.loc4_12.1 (constants.%T)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_12.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_12.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @Defined.%T.loc4_12.1 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc4_25: type = name_ref T, %T.loc4_12.2 [symbolic = %T.loc4_12.1 (constants.%T)] -// CHECK:STDOUT: %x: @Defined.%T.loc4_12.1 (%T) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @Defined.%T.loc4_12.1 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @Defined.%T.loc4_12.1 (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallDefined.decl: %CallDefined.type = fn_decl @CallDefined [concrete = constants.%CallDefined] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc8: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc8: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Defined(%T.loc4_12.2: type) { -// CHECK:STDOUT: %T.loc4_12.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_12.1 (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc4_12.1 [symbolic = %pattern_type (constants.%pattern_type.7dcd0a.1)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_12.1 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @Defined.%T.loc4_12.1 (%T)) -> @Defined.%T.loc4_12.1 (%T) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @Defined.%T.loc4_12.1 (%T) = name_ref x, %x -// CHECK:STDOUT: return %x.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CallDefined() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Defined.ref: %Defined.type = name_ref Defined, file.%Defined.decl [concrete = constants.%Defined] -// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6] -// CHECK:STDOUT: %int_32.loc9: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc9: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %impl.elem0: %.323 = impl_witness_access constants.%As.impl_witness.a7b, element0 [concrete = constants.%Core.IntLiteral.as.As.impl.Convert.11b] -// CHECK:STDOUT: %bound_method.loc9_20.1: = bound_method %int_0, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.As.impl.Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.As.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.As.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc9_20.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.call: init %i32 = call %bound_method.loc9_20.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc9_20.1: %i32 = value_of_initializer %Core.IntLiteral.as.As.impl.Convert.call [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc9_20.2: %i32 = converted %int_0, %.loc9_20.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %Defined.specific_fn: = specific_function %Defined.ref, @Defined(constants.%i32) [concrete = constants.%Defined.specific_fn] -// CHECK:STDOUT: %Defined.call: init %i32 = call %Defined.specific_fn(%.loc9_20.2) -// CHECK:STDOUT: %.loc9_27.1: %i32 = value_of_initializer %Defined.call -// CHECK:STDOUT: %.loc9_27.2: %i32 = converted %Defined.call, %.loc9_27.1 -// CHECK:STDOUT: return %.loc9_27.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Defined(constants.%T) { -// CHECK:STDOUT: %T.loc4_12.1 => constants.%T -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dcd0a.1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Defined(constants.%i32) { -// CHECK:STDOUT: %T.loc4_12.1 => constants.%i32 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7ce -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- call_defined_late.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %pattern_type.7dcd0a.1: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %Defined.type: type = fn_type @Defined [concrete] -// CHECK:STDOUT: %Defined: %Defined.type = struct_value () [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %CallDefined.type: type = fn_type @CallDefined [concrete] -// CHECK:STDOUT: %CallDefined: %CallDefined.type = struct_value () [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] -// CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete] -// CHECK:STDOUT: %As.type.90f: type = generic_interface_type @As [concrete] -// CHECK:STDOUT: %As.generic: %As.type.90f = struct_value () [concrete] -// CHECK:STDOUT: %As.type.047: type = facet_type <@As, @As(%i32)> [concrete] -// CHECK:STDOUT: %As.Convert.type.99b: type = fn_type @As.Convert, @As(%i32) [concrete] -// CHECK:STDOUT: %To: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.type.676: type = fn_type @Core.IntLiteral.as.As.impl.Convert, @Core.IntLiteral.as.As.impl(%To) [symbolic] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.086: %Core.IntLiteral.as.As.impl.Convert.type.676 = struct_value () [symbolic] -// CHECK:STDOUT: %As.impl_witness.a7b: = impl_witness imports.%As.impl_witness_table.3fe, @Core.IntLiteral.as.As.impl(%int_32) [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.type.7bd: type = fn_type @Core.IntLiteral.as.As.impl.Convert, @Core.IntLiteral.as.As.impl(%int_32) [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.11b: %Core.IntLiteral.as.As.impl.Convert.type.7bd = struct_value () [concrete] -// CHECK:STDOUT: %As.facet: %As.type.047 = facet_value Core.IntLiteral, (%As.impl_witness.a7b) [concrete] -// CHECK:STDOUT: %.323: type = fn_type_with_self_type %As.Convert.type.99b, %As.facet [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.bound: = bound_method %int_0.5c6, %Core.IntLiteral.as.As.impl.Convert.11b [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.As.impl.Convert.11b, @Core.IntLiteral.as.As.impl.Convert(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_0.5c6, %Core.IntLiteral.as.As.impl.Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_0.6a9: %i32 = int_value 0 [concrete] -// CHECK:STDOUT: %Defined.specific_fn: = specific_function %Defined, @Defined(%i32) [concrete] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .As = %Core.As -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.As: %As.type.90f = import_ref Core//prelude/parts/as, As, loaded [concrete = constants.%As.generic] -// CHECK:STDOUT: %Core.import_ref.52c: @Core.IntLiteral.as.As.impl.%Core.IntLiteral.as.As.impl.Convert.type (%Core.IntLiteral.as.As.impl.Convert.type.676) = import_ref Core//prelude/parts/int, loc32_39, loaded [symbolic = @Core.IntLiteral.as.As.impl.%Core.IntLiteral.as.As.impl.Convert (constants.%Core.IntLiteral.as.As.impl.Convert.086)] -// CHECK:STDOUT: %As.impl_witness_table.3fe = impl_witness_table (%Core.import_ref.52c), @Core.IntLiteral.as.As.impl [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Defined = %Defined.decl.loc4 -// CHECK:STDOUT: .CallDefined = %CallDefined.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Defined.decl.loc4: %Defined.type = fn_decl @Defined [concrete = constants.%Defined] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @Defined.%pattern_type (%pattern_type.7dcd0a.1) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @Defined.%pattern_type (%pattern_type.7dcd0a.1) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @Defined.%pattern_type (%pattern_type.7dcd0a.1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Defined.%pattern_type (%pattern_type.7dcd0a.1) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc4_31: type = name_ref T, %T.loc4_12.2 [symbolic = %T.loc4_12.1 (constants.%T)] -// CHECK:STDOUT: %.Self.2: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_12.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_12.1 (constants.%T)] -// CHECK:STDOUT: %x.param.loc4: @Defined.%T.loc4_12.1 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc4_25: type = name_ref T, %T.loc4_12.2 [symbolic = %T.loc4_12.1 (constants.%T)] -// CHECK:STDOUT: %x.loc4: @Defined.%T.loc4_12.1 (%T) = bind_name x, %x.param.loc4 -// CHECK:STDOUT: %return.param.loc4: ref @Defined.%T.loc4_12.1 (%T) = out_param call_param1 -// CHECK:STDOUT: %return.loc4: ref @Defined.%T.loc4_12.1 (%T) = return_slot %return.param.loc4 -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallDefined.decl: %CallDefined.type = fn_decl @CallDefined [concrete = constants.%CallDefined] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc6: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc6: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Defined.decl.loc10: %Defined.type = fn_decl @Defined [concrete = constants.%Defined] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @Defined.%pattern_type (%pattern_type.7dcd0a.1) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @Defined.%pattern_type (%pattern_type.7dcd0a.1) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @Defined.%pattern_type (%pattern_type.7dcd0a.1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Defined.%pattern_type (%pattern_type.7dcd0a.1) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc10_31: type = name_ref T, %T.loc10 [symbolic = %T.loc4_12.1 (constants.%T)] -// CHECK:STDOUT: %.Self.1: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc10: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_12.1 (constants.%T)] -// CHECK:STDOUT: %x.param.loc10: @Defined.%T.loc4_12.1 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc10_25: type = name_ref T, %T.loc10 [symbolic = %T.loc4_12.1 (constants.%T)] -// CHECK:STDOUT: %x.loc10: @Defined.%T.loc4_12.1 (%T) = bind_name x, %x.param.loc10 -// CHECK:STDOUT: %return.param.loc10: ref @Defined.%T.loc4_12.1 (%T) = out_param call_param1 -// CHECK:STDOUT: %return.loc10: ref @Defined.%T.loc4_12.1 (%T) = return_slot %return.param.loc10 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Defined(%T.loc4_12.2: type) { -// CHECK:STDOUT: %T.loc4_12.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_12.1 (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc4_12.1 [symbolic = %pattern_type (constants.%pattern_type.7dcd0a.1)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_12.1 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param.loc10: @Defined.%T.loc4_12.1 (%T)) -> @Defined.%T.loc4_12.1 (%T) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @Defined.%T.loc4_12.1 (%T) = name_ref x, %x.loc10 -// CHECK:STDOUT: return %x.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CallDefined() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Defined.ref: %Defined.type = name_ref Defined, file.%Defined.decl.loc4 [concrete = constants.%Defined] -// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6] -// CHECK:STDOUT: %int_32.loc7: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc7: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %impl.elem0: %.323 = impl_witness_access constants.%As.impl_witness.a7b, element0 [concrete = constants.%Core.IntLiteral.as.As.impl.Convert.11b] -// CHECK:STDOUT: %bound_method.loc7_20.1: = bound_method %int_0, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.As.impl.Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.As.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.As.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc7_20.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.call: init %i32 = call %bound_method.loc7_20.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc7_20.1: %i32 = value_of_initializer %Core.IntLiteral.as.As.impl.Convert.call [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc7_20.2: %i32 = converted %int_0, %.loc7_20.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %Defined.specific_fn: = specific_function %Defined.ref, @Defined(constants.%i32) [concrete = constants.%Defined.specific_fn] -// CHECK:STDOUT: %Defined.call: init %i32 = call %Defined.specific_fn(%.loc7_20.2) -// CHECK:STDOUT: %.loc7_27.1: %i32 = value_of_initializer %Defined.call -// CHECK:STDOUT: %.loc7_27.2: %i32 = converted %Defined.call, %.loc7_27.1 -// CHECK:STDOUT: return %.loc7_27.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Defined(constants.%T) { -// CHECK:STDOUT: %T.loc4_12.1 => constants.%T -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dcd0a.1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Defined(constants.%i32) { -// CHECK:STDOUT: %T.loc4_12.1 => constants.%i32 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7ce -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_call_undefined.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %pattern_type.7dcd0a.1: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %Undefined.type: type = fn_type @Undefined [concrete] -// CHECK:STDOUT: %Undefined: %Undefined.type = struct_value () [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %CallUndefined.type: type = fn_type @CallUndefined [concrete] -// CHECK:STDOUT: %CallUndefined: %CallUndefined.type = struct_value () [concrete] -// CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete] -// CHECK:STDOUT: %As.type.90f: type = generic_interface_type @As [concrete] -// CHECK:STDOUT: %As.generic: %As.type.90f = struct_value () [concrete] -// CHECK:STDOUT: %As.type.047: type = facet_type <@As, @As(%i32)> [concrete] -// CHECK:STDOUT: %As.Convert.type.99b: type = fn_type @As.Convert, @As(%i32) [concrete] -// CHECK:STDOUT: %To: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.type.676: type = fn_type @Core.IntLiteral.as.As.impl.Convert, @Core.IntLiteral.as.As.impl(%To) [symbolic] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.086: %Core.IntLiteral.as.As.impl.Convert.type.676 = struct_value () [symbolic] -// CHECK:STDOUT: %As.impl_witness.a7b: = impl_witness imports.%As.impl_witness_table.3fe, @Core.IntLiteral.as.As.impl(%int_32) [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.type.7bd: type = fn_type @Core.IntLiteral.as.As.impl.Convert, @Core.IntLiteral.as.As.impl(%int_32) [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.11b: %Core.IntLiteral.as.As.impl.Convert.type.7bd = struct_value () [concrete] -// CHECK:STDOUT: %As.facet: %As.type.047 = facet_value Core.IntLiteral, (%As.impl_witness.a7b) [concrete] -// CHECK:STDOUT: %.323: type = fn_type_with_self_type %As.Convert.type.99b, %As.facet [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.bound: = bound_method %int_0.5c6, %Core.IntLiteral.as.As.impl.Convert.11b [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.As.impl.Convert.11b, @Core.IntLiteral.as.As.impl.Convert(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_0.5c6, %Core.IntLiteral.as.As.impl.Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_0.6a9: %i32 = int_value 0 [concrete] -// CHECK:STDOUT: %Undefined.specific_fn: = specific_function %Undefined, @Undefined(%i32) [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .As = %Core.As -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.As: %As.type.90f = import_ref Core//prelude/parts/as, As, loaded [concrete = constants.%As.generic] -// CHECK:STDOUT: %Core.import_ref.52c: @Core.IntLiteral.as.As.impl.%Core.IntLiteral.as.As.impl.Convert.type (%Core.IntLiteral.as.As.impl.Convert.type.676) = import_ref Core//prelude/parts/int, loc32_39, loaded [symbolic = @Core.IntLiteral.as.As.impl.%Core.IntLiteral.as.As.impl.Convert (constants.%Core.IntLiteral.as.As.impl.Convert.086)] -// CHECK:STDOUT: %As.impl_witness_table.3fe = impl_witness_table (%Core.import_ref.52c), @Core.IntLiteral.as.As.impl [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Undefined = %Undefined.decl -// CHECK:STDOUT: .CallUndefined = %CallUndefined.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Undefined.decl: %Undefined.type = fn_decl @Undefined [concrete = constants.%Undefined] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @Undefined.%pattern_type (%pattern_type.7dcd0a.1) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @Undefined.%pattern_type (%pattern_type.7dcd0a.1) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @Undefined.%pattern_type (%pattern_type.7dcd0a.1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Undefined.%pattern_type (%pattern_type.7dcd0a.1) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc4_33: type = name_ref T, %T.loc4_14.2 [symbolic = %T.loc4_14.1 (constants.%T)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_14.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_14.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @Undefined.%T.loc4_14.1 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc4_27: type = name_ref T, %T.loc4_14.2 [symbolic = %T.loc4_14.1 (constants.%T)] -// CHECK:STDOUT: %x: @Undefined.%T.loc4_14.1 (%T) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @Undefined.%T.loc4_14.1 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @Undefined.%T.loc4_14.1 (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallUndefined.decl: %CallUndefined.type = fn_decl @CallUndefined [concrete = constants.%CallUndefined] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc6: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc6: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Undefined(%T.loc4_14.2: type) { -// CHECK:STDOUT: %T.loc4_14.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_14.1 (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc4_14.1 [symbolic = %pattern_type (constants.%pattern_type.7dcd0a.1)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @Undefined.%T.loc4_14.1 (%T)) -> @Undefined.%T.loc4_14.1 (%T); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CallUndefined() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Undefined.ref: %Undefined.type = name_ref Undefined, file.%Undefined.decl [concrete = constants.%Undefined] -// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6] -// CHECK:STDOUT: %int_32.loc14: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc14: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %impl.elem0: %.323 = impl_witness_access constants.%As.impl_witness.a7b, element0 [concrete = constants.%Core.IntLiteral.as.As.impl.Convert.11b] -// CHECK:STDOUT: %bound_method.loc14_22.1: = bound_method %int_0, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.As.impl.Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.As.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.As.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc14_22.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.call: init %i32 = call %bound_method.loc14_22.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc14_22.1: %i32 = value_of_initializer %Core.IntLiteral.as.As.impl.Convert.call [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc14_22.2: %i32 = converted %int_0, %.loc14_22.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %Undefined.specific_fn: = specific_function %Undefined.ref, @Undefined(constants.%i32) [concrete = constants.%Undefined.specific_fn] -// CHECK:STDOUT: %Undefined.call: init %i32 = call %Undefined.specific_fn(%.loc14_22.2) -// CHECK:STDOUT: %.loc14_29.1: %i32 = value_of_initializer %Undefined.call -// CHECK:STDOUT: %.loc14_29.2: %i32 = converted %Undefined.call, %.loc14_29.1 -// CHECK:STDOUT: return %.loc14_29.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Undefined(constants.%T) { -// CHECK:STDOUT: %T.loc4_14.1 => constants.%T -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dcd0a.1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Undefined(constants.%i32) { -// CHECK:STDOUT: %T.loc4_14.1 => constants.%i32 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7ce -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/generic/call_basic_depth.carbon b/toolchain/check/testdata/generic/call_basic_depth.carbon index 211aefdc54af..325eb447c124 100644 --- a/toolchain/check/testdata/generic/call_basic_depth.carbon +++ b/toolchain/check/testdata/generic/call_basic_depth.carbon @@ -2,9 +2,7 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // -// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/int.carbon -// TODO: Add ranges and switch to "--dump-sem-ir-ranges=only". -// EXTRA-ARGS: --dump-sem-ir-ranges=if-present +// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/destroy.carbon // // AUTOUPDATE // TIP: To test this file alone, run: @@ -17,30 +15,34 @@ class C { } } +//@dump-sem-ir-begin fn F[T:! type](x: T) { } +//@dump-sem-ir-end -fn H[T:! type](x: T) -> T { - // TODO: Definition should be emitted for H for this to work in lowering. +fn H[T:! type](x: T) { + //@dump-sem-ir-begin F(x); - return x; + //@dump-sem-ir-end } -fn G[T:! type](x: T) -> T { +fn G[T:! type](x: T) { + //@dump-sem-ir-begin H(x); F(x); + //@dump-sem-ir-end var c: C; c.Cfn(x); - return x; } fn M() { - var n: i32 = 0; - var m: i32; + var n: C; + //@dump-sem-ir-begin F(n); - m = G(n); + G(n); + //@dump-sem-ir-end } // CHECK:STDOUT: --- call_basic_depth.carbon @@ -48,23 +50,14 @@ fn M() { // CHECK:STDOUT: constants { // CHECK:STDOUT: %C: type = class_type @C [concrete] // CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %pattern_type.7dcd0a.1: type = pattern_type %T [symbolic] +// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] // CHECK:STDOUT: %C.Cfn.type: type = fn_type @C.Cfn [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %C.Cfn: %C.Cfn.type = struct_value () [concrete] -// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness.9d0: = impl_witness @C.%Destroy.impl_witness_table [concrete] -// CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] -// CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr.019 [concrete] -// CHECK:STDOUT: %C.as.Destroy.impl.Op.type: type = fn_type @C.as.Destroy.impl.Op [concrete] -// CHECK:STDOUT: %C.as.Destroy.impl.Op: %C.as.Destroy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] +// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] @@ -74,316 +67,101 @@ fn M() { // CHECK:STDOUT: %G.type: type = fn_type @G [concrete] // CHECK:STDOUT: %G: %G.type = struct_value () [concrete] // CHECK:STDOUT: %H.specific_fn.1ed: = specific_function %H, @H(%T) [symbolic] -// CHECK:STDOUT: %C.Cfn.specific_fn.53f: = specific_function %C.Cfn, @C.Cfn(%T) [symbolic] -// CHECK:STDOUT: %M.type: type = fn_type @M [concrete] -// CHECK:STDOUT: %M: %M.type = struct_value () [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.e8c: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %ImplicitAs.Convert.type.1b6: type = fn_type @ImplicitAs.Convert, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%To) [symbolic] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.f01: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.acc: = impl_witness imports.%ImplicitAs.impl_witness_table.b6b, @Core.IntLiteral.as.ImplicitAs.impl(%int_32) [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.9ec: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%int_32) [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.592: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.9ec = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.e8c = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.acc) [concrete] -// CHECK:STDOUT: %.7ea: type = fn_type_with_self_type %ImplicitAs.Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.bound: = bound_method %int_0.5c6, %Core.IntLiteral.as.ImplicitAs.impl.Convert.592 [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.592, @Core.IntLiteral.as.ImplicitAs.impl.Convert(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_0.5c6, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_0.6a9: %i32 = int_value 0 [concrete] -// CHECK:STDOUT: %F.specific_fn.501: = specific_function %F, @F(%i32) [concrete] -// CHECK:STDOUT: %G.specific_fn: = specific_function %G, @G(%i32) [concrete] -// CHECK:STDOUT: %Int.as.Destroy.impl.Op.type.11b: type = fn_type @Int.as.Destroy.impl.Op, @Int.as.Destroy.impl(%int_32) [concrete] -// CHECK:STDOUT: %Int.as.Destroy.impl.Op.054: %Int.as.Destroy.impl.Op.type.11b = struct_value () [concrete] -// CHECK:STDOUT: %ptr.235: type = ptr_type %i32 [concrete] -// CHECK:STDOUT: %Int.as.Destroy.impl.Op.specific_fn: = specific_function %Int.as.Destroy.impl.Op.054, @Int.as.Destroy.impl.Op(%int_32) [concrete] -// CHECK:STDOUT: %H.specific_fn.aac: = specific_function %H, @H(%i32) [concrete] -// CHECK:STDOUT: %C.Cfn.specific_fn.7b2: = specific_function %C.Cfn, @C.Cfn(%i32) [concrete] +// CHECK:STDOUT: %F.specific_fn.04a: = specific_function %F, @F(%C) [concrete] +// CHECK:STDOUT: %G.specific_fn: = specific_function %G, @G(%C) [concrete] +// CHECK:STDOUT: %H.specific_fn.e3f: = specific_function %H, @H(%C) [concrete] +// CHECK:STDOUT: %C.Cfn.specific_fn.26d: = specific_function %C.Cfn, @C.Cfn(%C) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Destroy = %Core.Destroy -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .H = %H.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .M = %M.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} // CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @F.%pattern_type (%pattern_type.7dcd0a.1) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @F.%pattern_type (%pattern_type.7dcd0a.1) = value_param_pattern %x.patt, call_param0 [concrete] +// CHECK:STDOUT: %x.patt: @F.%pattern_type (%pattern_type.7dc) = binding_pattern x [concrete] +// CHECK:STDOUT: %x.param_patt: @F.%pattern_type (%pattern_type.7dc) = value_param_pattern %x.patt, call_param0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc20_6.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc20_6.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @F.%T.loc20_6.1 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc20_6.2 [symbolic = %T.loc20_6.1 (constants.%T)] -// CHECK:STDOUT: %x: @F.%T.loc20_6.1 (%T) = bind_name x, %x.param +// CHECK:STDOUT: +// CHECK:STDOUT: %T.loc19_6.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc19_6.1 (constants.%T)] +// CHECK:STDOUT: %x.param: @F.%T.loc19_6.1 (%T) = value_param call_param0 +// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc19_6.2 [symbolic = %T.loc19_6.1 (constants.%T)] +// CHECK:STDOUT: %x: @F.%T.loc19_6.1 (%T) = bind_name x, %x.param // CHECK:STDOUT: } -// CHECK:STDOUT: %H.decl: %H.type = fn_decl @H [concrete = constants.%H] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @H.%pattern_type (%pattern_type.7dcd0a.1) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @H.%pattern_type (%pattern_type.7dcd0a.1) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @H.%pattern_type (%pattern_type.7dcd0a.1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @H.%pattern_type (%pattern_type.7dcd0a.1) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc23_25: type = name_ref T, %T.loc23_6.2 [symbolic = %T.loc23_6.1 (constants.%T)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc23_6.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc23_6.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @H.%T.loc23_6.1 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc23_19: type = name_ref T, %T.loc23_6.2 [symbolic = %T.loc23_6.1 (constants.%T)] -// CHECK:STDOUT: %x: @H.%T.loc23_6.1 (%T) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @H.%T.loc23_6.1 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @H.%T.loc23_6.1 (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @G.%pattern_type (%pattern_type.7dcd0a.1) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @G.%pattern_type (%pattern_type.7dcd0a.1) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @G.%pattern_type (%pattern_type.7dcd0a.1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @G.%pattern_type (%pattern_type.7dcd0a.1) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc29_25: type = name_ref T, %T.loc29_6.2 [symbolic = %T.loc29_6.1 (constants.%T)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc29_6.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc29_6.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @G.%T.loc29_6.1 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc29_19: type = name_ref T, %T.loc29_6.2 [symbolic = %T.loc29_6.1 (constants.%T)] -// CHECK:STDOUT: %x: @G.%T.loc29_6.1 (%T) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @G.%T.loc29_6.1 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @G.%T.loc29_6.1 (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %M.decl: %M.type = fn_decl @M [concrete = constants.%M] {} {} // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: impl @C.as.Destroy.impl: @C.%Self.ref as constants.%Destroy.type { -// CHECK:STDOUT: %C.as.Destroy.impl.Op.decl: %C.as.Destroy.impl.Op.type = fn_decl @C.as.Destroy.impl.Op [concrete = constants.%C.as.Destroy.impl.Op] { -// CHECK:STDOUT: %self.patt: %pattern_type.44a = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.44a = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc15: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %ptr.019 = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] -// CHECK:STDOUT: %self: %ptr.019 = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Op = %C.as.Destroy.impl.Op.decl -// CHECK:STDOUT: witness = @C.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %C.Cfn.decl: %C.Cfn.type = fn_decl @C.Cfn [concrete = constants.%C.Cfn] { -// CHECK:STDOUT: %self.patt: %pattern_type.c48 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.c48 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @C.Cfn.%pattern_type (%pattern_type.7dcd0a.1) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @C.Cfn.%pattern_type (%pattern_type.7dcd0a.1) = value_param_pattern %x.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %C = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] -// CHECK:STDOUT: %self: %C = bind_name self, %self.param -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc16_22.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc16_22.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @C.Cfn.%T.loc16_22.1 (%T) = value_param call_param1 -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc16_22.2 [symbolic = %T.loc16_22.1 (constants.%T)] -// CHECK:STDOUT: %x: @C.Cfn.%T.loc16_22.1 (%T) = bind_name x, %x.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] -// CHECK:STDOUT: impl_decl @C.as.Destroy.impl [concrete] {} {} -// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@C.as.Destroy.impl.%C.as.Destroy.impl.Op.decl), @C.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table [concrete = constants.%Destroy.impl_witness.9d0] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .Cfn = %C.Cfn.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @C.Cfn(%T.loc16_22.2: type) { -// CHECK:STDOUT: %T.loc16_22.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc16_22.1 (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc16_22.1 [symbolic = %pattern_type (constants.%pattern_type.7dcd0a.1)] +// CHECK:STDOUT: generic fn @F(%T.loc19_6.2: type) { +// CHECK:STDOUT: %T.loc19_6.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc19_6.1 (constants.%T)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc19_6.1 [symbolic = %pattern_type (constants.%pattern_type.7dc)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc16_22.1 [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc19_6.1 [symbolic = %require_complete (constants.%require_complete.4ae)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: %C, %x.param: @C.Cfn.%T.loc16_22.1 (%T)) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @C.as.Destroy.impl.Op(%self.param: %ptr.019) = "no_op"; -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F(%T.loc20_6.2: type) { -// CHECK:STDOUT: %T.loc20_6.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc20_6.1 (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc20_6.1 [symbolic = %pattern_type (constants.%pattern_type.7dcd0a.1)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc20_6.1 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @F.%T.loc20_6.1 (%T)) { +// CHECK:STDOUT: fn(%x.param: @F.%T.loc19_6.1 (%T)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @H(%T.loc23_6.2: type) { -// CHECK:STDOUT: %T.loc23_6.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc23_6.1 (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc23_6.1 [symbolic = %pattern_type (constants.%pattern_type.7dcd0a.1)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc23_6.1 [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: // CHECK:STDOUT: %F.specific_fn.loc25_3.2: = specific_function constants.%F, @F(%T.loc23_6.1) [symbolic = %F.specific_fn.loc25_3.2 (constants.%F.specific_fn.ef1)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @H.%T.loc23_6.1 (%T)) -> @H.%T.loc23_6.1 (%T) { +// CHECK:STDOUT: fn(%x.param: @H.%T.loc23_6.1 (%T)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %x.ref.loc25: @H.%T.loc23_6.1 (%T) = name_ref x, %x +// CHECK:STDOUT: %x.ref: @H.%T.loc23_6.1 (%T) = name_ref x, %x // CHECK:STDOUT: %F.specific_fn.loc25_3.1: = specific_function %F.ref, @F(constants.%T) [symbolic = %F.specific_fn.loc25_3.2 (constants.%F.specific_fn.ef1)] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn.loc25_3.1(%x.ref.loc25) -// CHECK:STDOUT: %x.ref.loc26: @H.%T.loc23_6.1 (%T) = name_ref x, %x -// CHECK:STDOUT: return %x.ref.loc26 +// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn.loc25_3.1(%x.ref) +// CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @G(%T.loc29_6.2: type) { -// CHECK:STDOUT: %T.loc29_6.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc29_6.1 (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc29_6.1 [symbolic = %pattern_type (constants.%pattern_type.7dcd0a.1)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc29_6.1 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %H.specific_fn.loc30_3.2: = specific_function constants.%H, @H(%T.loc29_6.1) [symbolic = %H.specific_fn.loc30_3.2 (constants.%H.specific_fn.1ed)] -// CHECK:STDOUT: %F.specific_fn.loc31_3.2: = specific_function constants.%F, @F(%T.loc29_6.1) [symbolic = %F.specific_fn.loc31_3.2 (constants.%F.specific_fn.ef1)] -// CHECK:STDOUT: %C.Cfn.specific_fn.loc34_4.2: = specific_function constants.%C.Cfn, @C.Cfn(%T.loc29_6.1) [symbolic = %C.Cfn.specific_fn.loc34_4.2 (constants.%C.Cfn.specific_fn.53f)] +// CHECK:STDOUT: +// CHECK:STDOUT: %H.specific_fn.loc31_3.2: = specific_function constants.%H, @H(%T.loc29_6.1) [symbolic = %H.specific_fn.loc31_3.2 (constants.%H.specific_fn.1ed)] +// CHECK:STDOUT: %F.specific_fn.loc32_3.2: = specific_function constants.%F, @F(%T.loc29_6.1) [symbolic = %F.specific_fn.loc32_3.2 (constants.%F.specific_fn.ef1)] +// CHECK:STDOUT: // CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @G.%T.loc29_6.1 (%T)) -> @G.%T.loc29_6.1 (%T) { +// CHECK:STDOUT: fn(%x.param: @G.%T.loc29_6.1 (%T)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %H.ref: %H.type = name_ref H, file.%H.decl [concrete = constants.%H] -// CHECK:STDOUT: %x.ref.loc30: @G.%T.loc29_6.1 (%T) = name_ref x, %x -// CHECK:STDOUT: %H.specific_fn.loc30_3.1: = specific_function %H.ref, @H(constants.%T) [symbolic = %H.specific_fn.loc30_3.2 (constants.%H.specific_fn.1ed)] -// CHECK:STDOUT: %H.call: init @G.%T.loc29_6.1 (%T) = call %H.specific_fn.loc30_3.1(%x.ref.loc30) -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F] // CHECK:STDOUT: %x.ref.loc31: @G.%T.loc29_6.1 (%T) = name_ref x, %x -// CHECK:STDOUT: %F.specific_fn.loc31_3.1: = specific_function %F.ref, @F(constants.%T) [symbolic = %F.specific_fn.loc31_3.2 (constants.%F.specific_fn.ef1)] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn.loc31_3.1(%x.ref.loc31) -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: %pattern_type.c48 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.var_patt: %pattern_type.c48 = var_pattern %c.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.var: ref %C = var %c.var_patt -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %c: ref %C = bind_name c, %c.var -// CHECK:STDOUT: %c.ref: ref %C = name_ref c, %c -// CHECK:STDOUT: %Cfn.ref: %C.Cfn.type = name_ref Cfn, @C.%C.Cfn.decl [concrete = constants.%C.Cfn] -// CHECK:STDOUT: %C.Cfn.bound: = bound_method %c.ref, %Cfn.ref -// CHECK:STDOUT: %x.ref.loc34: @G.%T.loc29_6.1 (%T) = name_ref x, %x -// CHECK:STDOUT: %C.Cfn.specific_fn.loc34_4.1: = specific_function %Cfn.ref, @C.Cfn(constants.%T) [symbolic = %C.Cfn.specific_fn.loc34_4.2 (constants.%C.Cfn.specific_fn.53f)] -// CHECK:STDOUT: %bound_method: = bound_method %c.ref, %C.Cfn.specific_fn.loc34_4.1 -// CHECK:STDOUT: %.loc34: %C = bind_value %c.ref -// CHECK:STDOUT: %C.Cfn.call: init %empty_tuple.type = call %bound_method(%.loc34, %x.ref.loc34) -// CHECK:STDOUT: %x.ref.loc35: @G.%T.loc29_6.1 (%T) = name_ref x, %x -// CHECK:STDOUT: %C.as.Destroy.impl.Op.bound: = bound_method %c.var, constants.%C.as.Destroy.impl.Op -// CHECK:STDOUT: %addr: %ptr.019 = addr_of %c.var -// CHECK:STDOUT: %C.as.Destroy.impl.Op.call: init %empty_tuple.type = call %C.as.Destroy.impl.Op.bound(%addr) -// CHECK:STDOUT: return %x.ref.loc35 +// CHECK:STDOUT: %H.specific_fn.loc31_3.1: = specific_function %H.ref, @H(constants.%T) [symbolic = %H.specific_fn.loc31_3.2 (constants.%H.specific_fn.1ed)] +// CHECK:STDOUT: %H.call: init %empty_tuple.type = call %H.specific_fn.loc31_3.1(%x.ref.loc31) +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F] +// CHECK:STDOUT: %x.ref.loc32: @G.%T.loc29_6.1 (%T) = name_ref x, %x +// CHECK:STDOUT: %F.specific_fn.loc32_3.1: = specific_function %F.ref, @F(constants.%T) [symbolic = %F.specific_fn.loc32_3.2 (constants.%F.specific_fn.ef1)] +// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn.loc32_3.1(%x.ref.loc32) +// CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @M() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %n.patt: %pattern_type.7ce = binding_pattern n [concrete] -// CHECK:STDOUT: %n.var_patt: %pattern_type.7ce = var_pattern %n.patt [concrete] -// 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] -// CHECK:STDOUT: %impl.elem0: %.7ea = impl_witness_access constants.%ImplicitAs.impl_witness.acc, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.592] -// CHECK:STDOUT: %bound_method.loc39_3.1: = bound_method %int_0, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc39_3.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc39_3.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc39_3: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: assign %n.var, %.loc39_3 -// CHECK:STDOUT: %.loc39_10: type = splice_block %i32.loc39 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc39: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc39: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %n: ref %i32 = bind_name n, %n.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %m.patt: %pattern_type.7ce = binding_pattern m [concrete] -// CHECK:STDOUT: %m.var_patt: %pattern_type.7ce = var_pattern %m.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %m.var: ref %i32 = var %m.var_patt -// CHECK:STDOUT: %.loc40: type = splice_block %i32.loc40 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc40: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc40: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %m: ref %i32 = bind_name m, %m.var +// CHECK:STDOUT: // CHECK:STDOUT: %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %n.ref.loc42: ref %i32 = name_ref n, %n -// CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%i32) [concrete = constants.%F.specific_fn.501] -// CHECK:STDOUT: %.loc42: %i32 = bind_value %n.ref.loc42 -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn(%.loc42) -// CHECK:STDOUT: %m.ref: ref %i32 = name_ref m, %m +// CHECK:STDOUT: %n.ref.loc43: ref %C = name_ref n, %n +// CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%C) [concrete = constants.%F.specific_fn.04a] +// CHECK:STDOUT: %.loc43: %C = bind_value %n.ref.loc43 +// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn(%.loc43) // CHECK:STDOUT: %G.ref: %G.type = name_ref G, file.%G.decl [concrete = constants.%G] -// CHECK:STDOUT: %n.ref.loc43: ref %i32 = name_ref n, %n -// CHECK:STDOUT: %G.specific_fn: = specific_function %G.ref, @G(constants.%i32) [concrete = constants.%G.specific_fn] -// CHECK:STDOUT: %.loc43: %i32 = bind_value %n.ref.loc43 -// CHECK:STDOUT: %G.call: init %i32 = call %G.specific_fn(%.loc43) -// CHECK:STDOUT: assign %m.ref, %G.call -// CHECK:STDOUT: %Int.as.Destroy.impl.Op.bound.loc40: = bound_method %m.var, constants.%Int.as.Destroy.impl.Op.054 -// CHECK:STDOUT: %Int.as.Destroy.impl.Op.specific_fn.1: = specific_function constants.%Int.as.Destroy.impl.Op.054, @Int.as.Destroy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Destroy.impl.Op.specific_fn] -// CHECK:STDOUT: %bound_method.loc40: = bound_method %m.var, %Int.as.Destroy.impl.Op.specific_fn.1 -// CHECK:STDOUT: %addr.loc40: %ptr.235 = addr_of %m.var -// CHECK:STDOUT: %Int.as.Destroy.impl.Op.call.loc40: init %empty_tuple.type = call %bound_method.loc40(%addr.loc40) -// CHECK:STDOUT: %Int.as.Destroy.impl.Op.bound.loc39: = bound_method %n.var, constants.%Int.as.Destroy.impl.Op.054 -// CHECK:STDOUT: %Int.as.Destroy.impl.Op.specific_fn.2: = specific_function constants.%Int.as.Destroy.impl.Op.054, @Int.as.Destroy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Destroy.impl.Op.specific_fn] -// CHECK:STDOUT: %bound_method.loc39_3.3: = bound_method %n.var, %Int.as.Destroy.impl.Op.specific_fn.2 -// CHECK:STDOUT: %addr.loc39: %ptr.235 = addr_of %n.var -// CHECK:STDOUT: %Int.as.Destroy.impl.Op.call.loc39: init %empty_tuple.type = call %bound_method.loc39_3.3(%addr.loc39) -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C.Cfn(constants.%T) { -// CHECK:STDOUT: %T.loc16_22.1 => constants.%T -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dcd0a.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae +// CHECK:STDOUT: %n.ref.loc44: ref %C = name_ref n, %n +// CHECK:STDOUT: %G.specific_fn: = specific_function %G.ref, @G(constants.%C) [concrete = constants.%G.specific_fn] +// CHECK:STDOUT: %.loc44: %C = bind_value %n.ref.loc44 +// CHECK:STDOUT: %G.call: init %empty_tuple.type = call %G.specific_fn(%.loc44) +// CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T.loc20_6.1 => constants.%T -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dcd0a.1 +// CHECK:STDOUT: %T.loc19_6.1 => constants.%T +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%require_complete.4ae @@ -391,7 +169,7 @@ fn M() { // CHECK:STDOUT: // CHECK:STDOUT: specific @H(constants.%T) { // CHECK:STDOUT: %T.loc23_6.1 => constants.%T -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dcd0a.1 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%require_complete.4ae @@ -400,42 +178,34 @@ fn M() { // CHECK:STDOUT: // CHECK:STDOUT: specific @G(constants.%T) { // CHECK:STDOUT: %T.loc29_6.1 => constants.%T -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dcd0a.1 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%i32) { -// CHECK:STDOUT: %T.loc20_6.1 => constants.%i32 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7ce +// CHECK:STDOUT: specific @F(constants.%C) { +// CHECK:STDOUT: %T.loc19_6.1 => constants.%C +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.c48 // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a +// CHECK:STDOUT: %require_complete => constants.%complete_type // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @G(constants.%i32) { -// CHECK:STDOUT: %T.loc29_6.1 => constants.%i32 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7ce +// CHECK:STDOUT: specific @G(constants.%C) { +// CHECK:STDOUT: %T.loc29_6.1 => constants.%C +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.c48 // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %H.specific_fn.loc30_3.2 => constants.%H.specific_fn.aac -// CHECK:STDOUT: %F.specific_fn.loc31_3.2 => constants.%F.specific_fn.501 -// CHECK:STDOUT: %C.Cfn.specific_fn.loc34_4.2 => constants.%C.Cfn.specific_fn.7b2 +// CHECK:STDOUT: %require_complete => constants.%complete_type +// CHECK:STDOUT: %H.specific_fn.loc31_3.2 => constants.%H.specific_fn.e3f +// CHECK:STDOUT: %F.specific_fn.loc32_3.2 => constants.%F.specific_fn.04a +// CHECK:STDOUT: %C.Cfn.specific_fn.loc36_4.2 => constants.%C.Cfn.specific_fn.26d // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @H(constants.%i32) { -// CHECK:STDOUT: %T.loc23_6.1 => constants.%i32 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7ce +// CHECK:STDOUT: specific @H(constants.%C) { +// CHECK:STDOUT: %T.loc23_6.1 => constants.%C +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.c48 // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %F.specific_fn.loc25_3.2 => constants.%F.specific_fn.501 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C.Cfn(constants.%i32) { -// CHECK:STDOUT: %T.loc16_22.1 => constants.%i32 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7ce -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a +// CHECK:STDOUT: %require_complete => constants.%complete_type +// CHECK:STDOUT: %F.specific_fn.loc25_3.2 => constants.%F.specific_fn.04a // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/generic/dependent_param.carbon b/toolchain/check/testdata/generic/dependent_param.carbon index 9872edfe8bbc..2e55859f49ea 100644 --- a/toolchain/check/testdata/generic/dependent_param.carbon +++ b/toolchain/check/testdata/generic/dependent_param.carbon @@ -3,8 +3,6 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // // INCLUDE-FILE: toolchain/testing/testdata/min_prelude/int.carbon -// TODO: Add ranges and switch to "--dump-sem-ir-ranges=only". -// EXTRA-ARGS: --dump-sem-ir-ranges=if-present // // AUTOUPDATE // TIP: To test this file alone, run: @@ -16,59 +14,68 @@ library "[[@TEST_NAME]]"; -class Outer(T:! type) { +class Outer(T:! Core.Copy) { class Inner(U:! T) { + //@dump-sem-ir-begin fn Get() -> T { return U; } + //@dump-sem-ir-end } } +//@dump-sem-ir-begin var n: i32 = Outer(i32).Inner(42).Get(); +//@dump-sem-ir-end // CHECK:STDOUT: --- nested_class.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %T.578: %Copy.type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %Outer.type: type = generic_class_type @Outer [concrete] // CHECK:STDOUT: %Outer.generic: %Outer.type = struct_value () [concrete] -// CHECK:STDOUT: %Outer.9d6: type = class_type @Outer, @Outer(%T) [symbolic] -// CHECK:STDOUT: %U: %T = bind_symbolic_name U, 1 [symbolic] -// CHECK:STDOUT: %pattern_type.7dcd0a.1: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %Inner.type.eae: type = generic_class_type @Inner, @Outer(%T) [symbolic] -// CHECK:STDOUT: %Inner.generic.137: %Inner.type.eae = struct_value () [symbolic] -// CHECK:STDOUT: %Inner.879: type = class_type @Inner, @Inner(%T, %U) [symbolic] -// CHECK:STDOUT: %Inner.Get.type.889: type = fn_type @Inner.Get, @Inner(%T, %U) [symbolic] -// CHECK:STDOUT: %Inner.Get.118: %Inner.Get.type.889 = struct_value () [symbolic] +// CHECK:STDOUT: %Outer.0f8: type = class_type @Outer, @Outer(%T.578) [symbolic] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T.578 [symbolic] +// CHECK:STDOUT: %U.57a: %T.as_type = bind_symbolic_name U, 1 [symbolic] +// CHECK:STDOUT: %pattern_type.f8cebc.1: type = pattern_type %T.as_type [symbolic] +// CHECK:STDOUT: %Inner.type.0f1: type = generic_class_type @Inner, @Outer(%T.578) [symbolic] +// CHECK:STDOUT: %Inner.generic.bb8: %Inner.type.0f1 = struct_value () [symbolic] +// CHECK:STDOUT: %Inner.b59: type = class_type @Inner, @Inner(%T.578, %U.57a) [symbolic] +// CHECK:STDOUT: %Inner.Get.type.2e3: type = fn_type @Inner.Get, @Inner(%T.578, %U.57a) [symbolic] +// CHECK:STDOUT: %Inner.Get.57b: %Inner.Get.type.2e3 = struct_value () [symbolic] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness.ca6: = impl_witness @Inner.%Destroy.impl_witness_table, @Inner.as.Destroy.impl(%T, %U) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %ptr.59b: type = ptr_type %Inner.879 [symbolic] -// CHECK:STDOUT: %pattern_type.75d: type = pattern_type %ptr.59b [symbolic] -// CHECK:STDOUT: %Inner.as.Destroy.impl.Op.type: type = fn_type @Inner.as.Destroy.impl.Op, @Inner.as.Destroy.impl(%T, %U) [symbolic] -// CHECK:STDOUT: %Inner.as.Destroy.impl.Op: %Inner.as.Destroy.impl.Op.type = struct_value () [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Destroy.impl_witness.7ee: = impl_witness @Outer.%Destroy.impl_witness_table, @Outer.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %ptr.6ff: type = ptr_type %Outer.9d6 [symbolic] -// CHECK:STDOUT: %pattern_type.07e: type = pattern_type %ptr.6ff [symbolic] -// CHECK:STDOUT: %Outer.as.Destroy.impl.Op.type: type = fn_type @Outer.as.Destroy.impl.Op, @Outer.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %Outer.as.Destroy.impl.Op: %Outer.as.Destroy.impl.Op.type = struct_value () [symbolic] +// CHECK:STDOUT: %Destroy.impl_witness.022: = impl_witness @Inner.%Destroy.impl_witness_table, @Inner.as.Destroy.impl(%T.578, %U.57a) [symbolic] +// CHECK:STDOUT: %require_complete.ecc: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %ptr.ce1: type = ptr_type %Inner.b59 [symbolic] +// CHECK:STDOUT: %pattern_type.bec: type = pattern_type %ptr.ce1 [symbolic] +// CHECK:STDOUT: %Destroy.impl_witness.1e4: = impl_witness @Outer.%Destroy.impl_witness_table, @Outer.as.Destroy.impl(%T.578) [symbolic] +// CHECK:STDOUT: %ptr.b2c: type = ptr_type %Outer.0f8 [symbolic] +// CHECK:STDOUT: %pattern_type.3bd: type = pattern_type %ptr.b2c [symbolic] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.lookup_impl_witness.3ba: = lookup_impl_witness %T.578, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.72e: %Copy.type = facet_value %T.as_type, (%Copy.lookup_impl_witness.3ba) [symbolic] +// CHECK:STDOUT: %.671: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.72e [symbolic] +// CHECK:STDOUT: %impl.elem0.56e: %.671 = impl_witness_access %Copy.lookup_impl_witness.3ba, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.fb7: = specific_impl_function %impl.elem0.56e, @Copy.Op(%Copy.facet.72e) [symbolic] +// CHECK:STDOUT: %bound_method.224: = bound_method %U.57a, %impl.elem0.56e [symbolic] +// CHECK:STDOUT: %bound_method.077: = bound_method %U.57a, %specific_impl_fn.fb7 [symbolic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] // CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %Outer.545: type = class_type @Outer, @Outer(%i32) [concrete] -// CHECK:STDOUT: %Inner.type.bac: type = generic_class_type @Inner, @Outer(%i32) [concrete] -// CHECK:STDOUT: %Inner.generic.ba0: %Inner.type.bac = struct_value () [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %Outer.5dd: type = class_type @Outer, @Outer(%Copy.facet.26d) [concrete] +// CHECK:STDOUT: %Inner.type.5cb: type = generic_class_type @Inner, @Outer(%Copy.facet.26d) [concrete] +// CHECK:STDOUT: %Inner.generic.789: %Inner.type.5cb = struct_value () [concrete] // CHECK:STDOUT: %int_42.20e: Core.IntLiteral = int_value 42 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.impl_witness.d46: = impl_witness imports.%Copy.impl_witness_table.462 [concrete] +// CHECK:STDOUT: %Copy.facet.66a: %Copy.type = facet_value Core.IntLiteral, (%Copy.impl_witness.d46) [concrete] // CHECK:STDOUT: %ImplicitAs.type.e8c: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] // CHECK:STDOUT: %ImplicitAs.Convert.type.1b6: type = fn_type @ImplicitAs.Convert, @ImplicitAs(%i32) [concrete] // CHECK:STDOUT: %To: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] @@ -81,77 +88,48 @@ var n: i32 = Outer(i32).Inner(42).Get(); // CHECK:STDOUT: %.7ea: type = fn_type_with_self_type %ImplicitAs.Convert.type.1b6, %ImplicitAs.facet [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.bound: = bound_method %int_42.20e, %Core.IntLiteral.as.ImplicitAs.impl.Convert.592 [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.592, @Core.IntLiteral.as.ImplicitAs.impl.Convert(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_42.20e, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] +// CHECK:STDOUT: %bound_method.0fc: = bound_method %int_42.20e, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %int_42.c68: %i32 = int_value 42 [concrete] -// CHECK:STDOUT: %Inner.025: type = class_type @Inner, @Inner(%i32, %int_42.c68) [concrete] -// CHECK:STDOUT: %Inner.Get.type.512: type = fn_type @Inner.Get, @Inner(%i32, %int_42.c68) [concrete] -// CHECK:STDOUT: %Inner.Get.18c: %Inner.Get.type.512 = struct_value () [concrete] -// CHECK:STDOUT: %Inner.Get.specific_fn: = specific_function %Inner.Get.18c, @Inner.Get(%i32, %int_42.c68) [concrete] +// CHECK:STDOUT: %Inner.150: type = class_type @Inner, @Inner(%Copy.facet.26d, %int_42.c68) [concrete] +// CHECK:STDOUT: %Inner.Get.type.e7e: type = fn_type @Inner.Get, @Inner(%Copy.facet.26d, %int_42.c68) [concrete] +// CHECK:STDOUT: %Inner.Get.43d: %Inner.Get.type.e7e = struct_value () [concrete] +// CHECK:STDOUT: %Inner.Get.specific_fn: = specific_function %Inner.Get.43d, @Inner.Get(%Copy.facet.26d, %int_42.c68) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.bound: = bound_method %int_42.c68, %Int.as.Copy.impl.Op.87e [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] +// CHECK:STDOUT: %bound_method.6bf: = bound_method %int_42.c68, %Int.as.Copy.impl.Op.specific_fn [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Destroy = %Core.Destroy -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] +// CHECK:STDOUT: %Core.import_ref.c4d = import_ref Core//prelude/parts/copy, loc32_31, unloaded +// CHECK:STDOUT: %Copy.impl_witness_table.462 = impl_witness_table (%Core.import_ref.c4d), @Core.IntLiteral.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Outer = %Outer.decl -// CHECK:STDOUT: .n = %n -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Outer.decl: %Outer.type = class_decl @Outer [concrete = constants.%Outer.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.1 (constants.%T)] -// CHECK:STDOUT: } // CHECK:STDOUT: name_binding_decl { // CHECK:STDOUT: %n.patt: %pattern_type.7ce = binding_pattern n [concrete] // CHECK:STDOUT: %n.var_patt: %pattern_type.7ce = var_pattern %n.patt [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: %n.var: ref %i32 = var %n.var_patt [concrete] -// CHECK:STDOUT: %.loc10: type = splice_block %i32 [concrete = constants.%i32] { +// CHECK:STDOUT: %.loc13: type = splice_block %i32 [concrete = constants.%i32] { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: } // CHECK:STDOUT: %n: ref %i32 = bind_name n, %n.var [concrete = %n.var] // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic impl @Inner.as.Destroy.impl(@Outer.%T.loc4_13.2: type, @Inner.%U.loc5_15.2: @Inner.%T (%T)) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %U: @Inner.as.Destroy.impl.%T (%T) = bind_symbolic_name U, 1 [symbolic = %U (constants.%U)] -// CHECK:STDOUT: %Inner: type = class_type @Inner, @Inner(%T, %U) [symbolic = %Inner (constants.%Inner.879)] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Inner.%Destroy.impl_witness_table, @Inner.as.Destroy.impl(%T, %U) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.ca6)] +// CHECK:STDOUT: generic impl @Inner.as.Destroy.impl(@Outer.%T.loc4_13.2: %Copy.type, @Inner.%U.loc5_15.2: @Inner.%T.as_type.loc5_19.1 (%T.as_type)) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Inner.as.Destroy.impl.Op.type: type = fn_type @Inner.as.Destroy.impl.Op, @Inner.as.Destroy.impl(%T, %U) [symbolic = %Inner.as.Destroy.impl.Op.type (constants.%Inner.as.Destroy.impl.Op.type)] -// CHECK:STDOUT: %Inner.as.Destroy.impl.Op: @Inner.as.Destroy.impl.%Inner.as.Destroy.impl.Op.type (%Inner.as.Destroy.impl.Op.type) = struct_value () [symbolic = %Inner.as.Destroy.impl.Op (constants.%Inner.as.Destroy.impl.Op)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: impl: @Inner.%Self.ref as constants.%Destroy.type { -// CHECK:STDOUT: %Inner.as.Destroy.impl.Op.decl: @Inner.as.Destroy.impl.%Inner.as.Destroy.impl.Op.type (%Inner.as.Destroy.impl.Op.type) = fn_decl @Inner.as.Destroy.impl.Op [symbolic = @Inner.as.Destroy.impl.%Inner.as.Destroy.impl.Op (constants.%Inner.as.Destroy.impl.Op)] { -// CHECK:STDOUT: %self.patt: @Inner.as.Destroy.impl.Op.%pattern_type (%pattern_type.75d) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Inner.as.Destroy.impl.Op.%pattern_type (%pattern_type.75d) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc5_22.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @Inner.as.Destroy.impl.Op.%ptr (%ptr.59b) = value_param call_param0 -// CHECK:STDOUT: %.loc5_22.2: type = splice_block %Self.ref [symbolic = %Inner (constants.%Inner.879)] { -// CHECK:STDOUT: %.loc5_22.3: type = specific_constant constants.%Inner.879, @Inner(constants.%T, constants.%U) [symbolic = %Inner (constants.%Inner.879)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc5_22.3 [symbolic = %Inner (constants.%Inner.879)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Inner.as.Destroy.impl.Op.%ptr (%ptr.59b) = bind_name self, %self.param -// CHECK:STDOUT: } +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .Op = %Inner.as.Destroy.impl.Op.decl @@ -159,28 +137,14 @@ var n: i32 = Outer(i32).Inner(42).Get(); // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic impl @Outer.as.Destroy.impl(@Outer.%T.loc4_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Outer: type = class_type @Outer, @Outer(%T) [symbolic = %Outer (constants.%Outer.9d6)] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @Outer.%Destroy.impl_witness_table, @Outer.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.7ee)] +// CHECK:STDOUT: generic impl @Outer.as.Destroy.impl(@Outer.%T.loc4_13.2: %Copy.type) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Outer.as.Destroy.impl.Op.type: type = fn_type @Outer.as.Destroy.impl.Op, @Outer.as.Destroy.impl(%T) [symbolic = %Outer.as.Destroy.impl.Op.type (constants.%Outer.as.Destroy.impl.Op.type)] -// CHECK:STDOUT: %Outer.as.Destroy.impl.Op: @Outer.as.Destroy.impl.%Outer.as.Destroy.impl.Op.type (%Outer.as.Destroy.impl.Op.type) = struct_value () [symbolic = %Outer.as.Destroy.impl.Op (constants.%Outer.as.Destroy.impl.Op)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: impl: @Outer.%Self.ref as constants.%Destroy.type { -// CHECK:STDOUT: %Outer.as.Destroy.impl.Op.decl: @Outer.as.Destroy.impl.%Outer.as.Destroy.impl.Op.type (%Outer.as.Destroy.impl.Op.type) = fn_decl @Outer.as.Destroy.impl.Op [symbolic = @Outer.as.Destroy.impl.%Outer.as.Destroy.impl.Op (constants.%Outer.as.Destroy.impl.Op)] { -// CHECK:STDOUT: %self.patt: @Outer.as.Destroy.impl.Op.%pattern_type (%pattern_type.07e) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Outer.as.Destroy.impl.Op.%pattern_type (%pattern_type.07e) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc4_23.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @Outer.as.Destroy.impl.Op.%ptr (%ptr.6ff) = value_param call_param0 -// CHECK:STDOUT: %.loc4_23.2: type = splice_block %Self.ref [symbolic = %Outer (constants.%Outer.9d6)] { -// CHECK:STDOUT: %.loc4_23.3: type = specific_constant constants.%Outer.9d6, @Outer(constants.%T) [symbolic = %Outer (constants.%Outer.9d6)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc4_23.3 [symbolic = %Outer (constants.%Outer.9d6)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Outer.as.Destroy.impl.Op.%ptr (%ptr.6ff) = bind_name self, %self.param -// CHECK:STDOUT: } +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .Op = %Outer.as.Destroy.impl.Op.decl @@ -188,107 +152,95 @@ var n: i32 = Outer(i32).Inner(42).Get(); // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @Outer(%T.loc4_13.2: type) { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.1 (constants.%T)] +// CHECK:STDOUT: generic class @Outer(%T.loc4_13.2: %Copy.type) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Inner.type: type = generic_class_type @Inner, @Outer(%T.loc4_13.1) [symbolic = %Inner.type (constants.%Inner.type.eae)] -// CHECK:STDOUT: %Inner.generic: @Outer.%Inner.type (%Inner.type.eae) = struct_value () [symbolic = %Inner.generic (constants.%Inner.generic.137)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: class { -// CHECK:STDOUT: %Inner.decl: @Outer.%Inner.type (%Inner.type.eae) = class_decl @Inner [symbolic = @Outer.%Inner.generic (constants.%Inner.generic.137)] { -// CHECK:STDOUT: %U.patt: @Inner.%pattern_type (%pattern_type.7dcd0a.1) = symbolic_binding_pattern U, 1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc5: type = splice_block %T.ref [symbolic = %T (constants.%T)] { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.ref: type = name_ref T, @Outer.%T.loc4_13.2 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %U.loc5_15.2: @Inner.%T (%T) = bind_symbolic_name U, 1 [symbolic = %U.loc5_15.1 (constants.%U)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Outer.9d6 [symbolic = @Outer.as.Destroy.impl.%Outer (constants.%Outer.9d6)] -// CHECK:STDOUT: impl_decl @Outer.as.Destroy.impl [concrete] {} {} -// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Outer.as.Destroy.impl.%Outer.as.Destroy.impl.Op.decl), @Outer.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Outer.as.Destroy.impl(constants.%T) [symbolic = @Outer.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness.7ee)] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type.357] +// CHECK:STDOUT: // CHECK:STDOUT: complete_type_witness = %complete_type // CHECK:STDOUT: // CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Outer.9d6 +// CHECK:STDOUT: .Self = constants.%Outer.0f8 // CHECK:STDOUT: .T = // CHECK:STDOUT: .Inner = %Inner.decl // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @Inner(@Outer.%T.loc4_13.2: type, %U.loc5_15.2: @Inner.%T (%T)) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %U.loc5_15.1: @Inner.%T (%T) = bind_symbolic_name U, 1 [symbolic = %U.loc5_15.1 (constants.%U)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T [symbolic = %pattern_type (constants.%pattern_type.7dcd0a.1)] +// CHECK:STDOUT: generic class @Inner(@Outer.%T.loc4_13.2: %Copy.type, %U.loc5_15.2: @Inner.%T.as_type.loc5_19.1 (%T.as_type)) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Inner.Get.type: type = fn_type @Inner.Get, @Inner(%T, %U.loc5_15.1) [symbolic = %Inner.Get.type (constants.%Inner.Get.type.889)] -// CHECK:STDOUT: %Inner.Get: @Inner.%Inner.Get.type (%Inner.Get.type.889) = struct_value () [symbolic = %Inner.Get (constants.%Inner.Get.118)] -// CHECK:STDOUT: %require_complete: = require_complete_type %T [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: %Inner.Get.type: type = fn_type @Inner.Get, @Inner(%T, %U.loc5_15.1) [symbolic = %Inner.Get.type (constants.%Inner.Get.type.2e3)] +// CHECK:STDOUT: %Inner.Get: @Inner.%Inner.Get.type (%Inner.Get.type.2e3) = struct_value () [symbolic = %Inner.Get (constants.%Inner.Get.57b)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: class { -// CHECK:STDOUT: %Inner.Get.decl: @Inner.%Inner.Get.type (%Inner.Get.type.889) = fn_decl @Inner.Get [symbolic = @Inner.%Inner.Get (constants.%Inner.Get.118)] { -// CHECK:STDOUT: %return.patt: @Inner.Get.%pattern_type (%pattern_type.7dcd0a.1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Inner.Get.%pattern_type (%pattern_type.7dcd0a.1) = out_param_pattern %return.patt, call_param0 [concrete] +// CHECK:STDOUT: %Inner.Get.decl: @Inner.%Inner.Get.type (%Inner.Get.type.2e3) = fn_decl @Inner.Get [symbolic = @Inner.%Inner.Get (constants.%Inner.Get.57b)] { +// CHECK:STDOUT: %return.patt: @Inner.Get.%pattern_type (%pattern_type.f8cebc.1) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @Inner.Get.%pattern_type (%pattern_type.f8cebc.1) = out_param_pattern %return.patt, call_param0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref: type = name_ref T, @Outer.%T.loc4_13.2 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %return.param: ref @Inner.Get.%T (%T) = out_param call_param0 -// CHECK:STDOUT: %return: ref @Inner.Get.%T (%T) = return_slot %return.param +// CHECK:STDOUT: %T.ref: %Copy.type = name_ref T, @Outer.%T.loc4_13.2 [symbolic = %T (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc7_17.2: type = facet_access_type %T.ref [symbolic = %T.as_type.loc7_17.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc7_17: type = converted %T.ref, %T.as_type.loc7_17.2 [symbolic = %T.as_type.loc7_17.1 (constants.%T.as_type)] +// CHECK:STDOUT: %return.param: ref @Inner.Get.%T.as_type.loc7_17.1 (%T.as_type) = out_param call_param0 +// CHECK:STDOUT: %return: ref @Inner.Get.%T.as_type.loc7_17.1 (%T.as_type) = return_slot %return.param // CHECK:STDOUT: } -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Inner.879 [symbolic = @Inner.as.Destroy.impl.%Inner (constants.%Inner.879)] -// CHECK:STDOUT: impl_decl @Inner.as.Destroy.impl [concrete] {} {} -// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Inner.as.Destroy.impl.%Inner.as.Destroy.impl.Op.decl), @Inner.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @Inner.as.Destroy.impl(constants.%T, constants.%U) [symbolic = @Inner.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness.ca6)] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type.357] +// CHECK:STDOUT: // CHECK:STDOUT: complete_type_witness = %complete_type // CHECK:STDOUT: // CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Inner.879 +// CHECK:STDOUT: .Self = constants.%Inner.b59 // CHECK:STDOUT: .T = // CHECK:STDOUT: .Get = %Inner.Get.decl // CHECK:STDOUT: .U = // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Inner.Get(@Outer.%T.loc4_13.2: type, @Inner.%U.loc5_15.2: @Inner.%T (%T)) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T [symbolic = %pattern_type (constants.%pattern_type.7dcd0a.1)] +// CHECK:STDOUT: generic fn @Inner.Get(@Outer.%T.loc4_13.2: %Copy.type, @Inner.%U.loc5_15.2: @Inner.%T.as_type.loc5_19.1 (%T.as_type)) { +// CHECK:STDOUT: %T: %Copy.type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.578)] +// CHECK:STDOUT: %T.as_type.loc7_17.1: type = facet_access_type %T [symbolic = %T.as_type.loc7_17.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %T.as_type.loc7_17.1 [symbolic = %pattern_type (constants.%pattern_type.f8cebc.1)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %U: @Inner.Get.%T (%T) = bind_symbolic_name U, 1 [symbolic = %U (constants.%U)] -// CHECK:STDOUT: %require_complete: = require_complete_type %T [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: %U: @Inner.Get.%T.as_type.loc7_17.1 (%T.as_type) = bind_symbolic_name U, 1 [symbolic = %U (constants.%U.57a)] +// CHECK:STDOUT: %require_complete: = require_complete_type %T.as_type.loc7_17.1 [symbolic = %require_complete (constants.%require_complete.ecc)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %T, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.3ba)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %T.as_type.loc7_17.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.72e)] +// CHECK:STDOUT: %.loc7_28.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc7_28.2 (constants.%.671)] +// CHECK:STDOUT: %impl.elem0.loc7_28.2: @Inner.Get.%.loc7_28.2 (%.671) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc7_28.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %bound_method.loc7_28.3: = bound_method %U, %impl.elem0.loc7_28.2 [symbolic = %bound_method.loc7_28.3 (constants.%bound_method.224)] +// CHECK:STDOUT: %specific_impl_fn.loc7_28.2: = specific_impl_function %impl.elem0.loc7_28.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc7_28.2 (constants.%specific_impl_fn.fb7)] +// CHECK:STDOUT: %bound_method.loc7_28.4: = bound_method %U, %specific_impl_fn.loc7_28.2 [symbolic = %bound_method.loc7_28.4 (constants.%bound_method.077)] // CHECK:STDOUT: -// CHECK:STDOUT: fn() -> @Inner.Get.%T (%T) { +// CHECK:STDOUT: fn() -> @Inner.Get.%T.as_type.loc7_17.1 (%T.as_type) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %U.ref: @Inner.Get.%T (%T) = name_ref U, @Inner.%U.loc5_15.2 [symbolic = %U (constants.%U)] -// CHECK:STDOUT: return %U.ref +// CHECK:STDOUT: %U.ref: @Inner.Get.%T.as_type.loc7_17.1 (%T.as_type) = name_ref U, @Inner.%U.loc5_15.2 [symbolic = %U (constants.%U.57a)] +// CHECK:STDOUT: %impl.elem0.loc7_28.1: @Inner.Get.%.loc7_28.2 (%.671) = impl_witness_access constants.%Copy.lookup_impl_witness.3ba, element0 [symbolic = %impl.elem0.loc7_28.2 (constants.%impl.elem0.56e)] +// CHECK:STDOUT: %bound_method.loc7_28.1: = bound_method %U.ref, %impl.elem0.loc7_28.1 [symbolic = %bound_method.loc7_28.3 (constants.%bound_method.224)] +// CHECK:STDOUT: %specific_impl_fn.loc7_28.1: = specific_impl_function %impl.elem0.loc7_28.1, @Copy.Op(constants.%Copy.facet.72e) [symbolic = %specific_impl_fn.loc7_28.2 (constants.%specific_impl_fn.fb7)] +// CHECK:STDOUT: %bound_method.loc7_28.2: = bound_method %U.ref, %specific_impl_fn.loc7_28.1 [symbolic = %bound_method.loc7_28.4 (constants.%bound_method.077)] +// CHECK:STDOUT: %.loc7_28.1: init @Inner.Get.%T.as_type.loc7_17.1 (%T.as_type) = call %bound_method.loc7_28.2(%U.ref) +// CHECK:STDOUT: return %.loc7_28.1 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Inner.as.Destroy.impl.Op(@Outer.%T.loc4_13.2: type, @Inner.%U.loc5_15.2: @Inner.%T (%T)) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %U: @Inner.as.Destroy.impl.Op.%T (%T) = bind_symbolic_name U, 1 [symbolic = %U (constants.%U)] -// CHECK:STDOUT: %Inner: type = class_type @Inner, @Inner(%T, %U) [symbolic = %Inner (constants.%Inner.879)] -// CHECK:STDOUT: %ptr: type = ptr_type %Inner [symbolic = %ptr (constants.%ptr.59b)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.75d)] +// CHECK:STDOUT: generic fn @Inner.as.Destroy.impl.Op(@Outer.%T.loc4_13.2: %Copy.type, @Inner.%U.loc5_15.2: @Inner.%T.as_type.loc5_19.1 (%T.as_type)) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Inner.as.Destroy.impl.Op.%ptr (%ptr.59b)) = "no_op"; +// CHECK:STDOUT: fn(%self.param: @Inner.as.Destroy.impl.Op.%ptr (%ptr.ce1)) = "no_op"; // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Outer.as.Destroy.impl.Op(@Outer.%T.loc4_13.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Outer: type = class_type @Outer, @Outer(%T) [symbolic = %Outer (constants.%Outer.9d6)] -// CHECK:STDOUT: %ptr: type = ptr_type %Outer [symbolic = %ptr (constants.%ptr.6ff)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.07e)] +// CHECK:STDOUT: generic fn @Outer.as.Destroy.impl.Op(@Outer.%T.loc4_13.2: %Copy.type) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Outer.as.Destroy.impl.Op.%ptr (%ptr.6ff)) = "no_op"; +// CHECK:STDOUT: fn(%self.param: @Outer.as.Destroy.impl.Op.%ptr (%ptr.b2c)) = "no_op"; // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { @@ -296,103 +248,120 @@ var n: i32 = Outer(i32).Inner(42).Get(); // CHECK:STDOUT: %Outer.ref: %Outer.type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer.generic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %Outer: type = class_type @Outer, @Outer(constants.%i32) [concrete = constants.%Outer.545] -// CHECK:STDOUT: %.loc10_24: %Inner.type.bac = specific_constant @Outer.%Inner.decl, @Outer(constants.%i32) [concrete = constants.%Inner.generic.ba0] -// CHECK:STDOUT: %Inner.ref: %Inner.type.bac = name_ref Inner, %.loc10_24 [concrete = constants.%Inner.generic.ba0] +// CHECK:STDOUT: %Copy.facet.loc13_23: %Copy.type = facet_value constants.%i32, (constants.%Copy.impl_witness.f0b) [concrete = constants.%Copy.facet.26d] +// CHECK:STDOUT: %.loc13_23: %Copy.type = converted %i32, %Copy.facet.loc13_23 [concrete = constants.%Copy.facet.26d] +// CHECK:STDOUT: %Outer: type = class_type @Outer, @Outer(constants.%Copy.facet.26d) [concrete = constants.%Outer.5dd] +// CHECK:STDOUT: %.loc13_24: %Inner.type.5cb = specific_constant @Outer.%Inner.decl, @Outer(constants.%Copy.facet.26d) [concrete = constants.%Inner.generic.789] +// CHECK:STDOUT: %Inner.ref: %Inner.type.5cb = name_ref Inner, %.loc13_24 [concrete = constants.%Inner.generic.789] // CHECK:STDOUT: %int_42: Core.IntLiteral = int_value 42 [concrete = constants.%int_42.20e] +// CHECK:STDOUT: %Copy.facet.loc13_33: %Copy.type = facet_value Core.IntLiteral, (constants.%Copy.impl_witness.d46) [concrete = constants.%Copy.facet.66a] +// CHECK:STDOUT: %.loc13_33.1: %Copy.type = converted Core.IntLiteral, %Copy.facet.loc13_33 [concrete = constants.%Copy.facet.66a] // CHECK:STDOUT: %impl.elem0: %.7ea = impl_witness_access constants.%ImplicitAs.impl_witness.acc, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.592] -// CHECK:STDOUT: %bound_method.loc10_33.1: = bound_method constants.%int_42.20e, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] +// CHECK:STDOUT: %bound_method.loc13_33.1: = bound_method constants.%int_42.20e, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc10_33.2: = bound_method constants.%int_42.20e, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc10_33.2(constants.%int_42.20e) [concrete = constants.%int_42.c68] -// CHECK:STDOUT: %.loc10_33.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_42.c68] -// CHECK:STDOUT: %.loc10_33.2: %i32 = converted constants.%int_42.20e, %.loc10_33.1 [concrete = constants.%int_42.c68] -// CHECK:STDOUT: %Inner: type = class_type @Inner, @Inner(constants.%i32, constants.%int_42.c68) [concrete = constants.%Inner.025] -// CHECK:STDOUT: %.loc10_34: %Inner.Get.type.512 = specific_constant @Inner.%Inner.Get.decl, @Inner(constants.%i32, constants.%int_42.c68) [concrete = constants.%Inner.Get.18c] -// CHECK:STDOUT: %Get.ref: %Inner.Get.type.512 = name_ref Get, %.loc10_34 [concrete = constants.%Inner.Get.18c] -// CHECK:STDOUT: %Inner.Get.specific_fn: = specific_function %Get.ref, @Inner.Get(constants.%i32, constants.%int_42.c68) [concrete = constants.%Inner.Get.specific_fn] +// CHECK:STDOUT: %bound_method.loc13_33.2: = bound_method constants.%int_42.20e, %specific_fn [concrete = constants.%bound_method.0fc] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc13_33.2(constants.%int_42.20e) [concrete = constants.%int_42.c68] +// CHECK:STDOUT: %.loc13_33.2: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_42.c68] +// CHECK:STDOUT: %.loc13_33.3: %i32 = converted constants.%int_42.20e, %.loc13_33.2 [concrete = constants.%int_42.c68] +// CHECK:STDOUT: %Inner: type = class_type @Inner, @Inner(constants.%Copy.facet.26d, constants.%int_42.c68) [concrete = constants.%Inner.150] +// CHECK:STDOUT: %.loc13_34: %Inner.Get.type.e7e = specific_constant @Inner.%Inner.Get.decl, @Inner(constants.%Copy.facet.26d, constants.%int_42.c68) [concrete = constants.%Inner.Get.43d] +// CHECK:STDOUT: %Get.ref: %Inner.Get.type.e7e = name_ref Get, %.loc13_34 [concrete = constants.%Inner.Get.43d] +// CHECK:STDOUT: %Inner.Get.specific_fn: = specific_function %Get.ref, @Inner.Get(constants.%Copy.facet.26d, constants.%int_42.c68) [concrete = constants.%Inner.Get.specific_fn] // CHECK:STDOUT: %Inner.Get.call: init %i32 = call %Inner.Get.specific_fn() // CHECK:STDOUT: assign file.%n.var, %Inner.Get.call -// CHECK:STDOUT: return +// CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Outer(constants.%T) { -// CHECK:STDOUT: %T.loc4_13.1 => constants.%T +// CHECK:STDOUT: specific @Outer(constants.%T.578) { +// CHECK:STDOUT: %T.loc4_13.1 => constants.%T.578 // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Inner.type => constants.%Inner.type.eae -// CHECK:STDOUT: %Inner.generic => constants.%Inner.generic.137 +// CHECK:STDOUT: %Inner.type => constants.%Inner.type.0f1 +// CHECK:STDOUT: %Inner.generic => constants.%Inner.generic.bb8 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Inner(constants.%T, constants.%U) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %U.loc5_15.1 => constants.%U -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dcd0a.1 +// CHECK:STDOUT: specific @Inner(constants.%T.578, constants.%U.57a) { +// CHECK:STDOUT: %T => constants.%T.578 +// CHECK:STDOUT: %T.as_type.loc5_19.1 => constants.%T.as_type +// CHECK:STDOUT: %U.loc5_15.1 => constants.%U.57a +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.f8cebc.1 // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Inner.Get.type => constants.%Inner.Get.type.889 -// CHECK:STDOUT: %Inner.Get => constants.%Inner.Get.118 -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae +// CHECK:STDOUT: %Inner.Get.type => constants.%Inner.Get.type.2e3 +// CHECK:STDOUT: %Inner.Get => constants.%Inner.Get.57b +// CHECK:STDOUT: %require_complete => constants.%require_complete.ecc // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Inner.Get(constants.%T, constants.%U) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dcd0a.1 +// CHECK:STDOUT: specific @Inner.Get(constants.%T.578, constants.%U.57a) { +// CHECK:STDOUT: %T => constants.%T.578 +// CHECK:STDOUT: %T.as_type.loc7_17.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.f8cebc.1 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Inner.as.Destroy.impl(constants.%T, constants.%U) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %U => constants.%U -// CHECK:STDOUT: %Inner => constants.%Inner.879 -// CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness.ca6 +// CHECK:STDOUT: specific @Inner.as.Destroy.impl(constants.%T.578, constants.%U.57a) { +// CHECK:STDOUT: %T => constants.%T.578 +// CHECK:STDOUT: %T.as_type => constants.%T.as_type +// CHECK:STDOUT: %U => constants.%U.57a +// CHECK:STDOUT: %Inner => constants.%Inner.b59 +// CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness.022 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Inner.as.Destroy.impl.Op(constants.%T, constants.%U) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %U => constants.%U -// CHECK:STDOUT: %Inner => constants.%Inner.879 -// CHECK:STDOUT: %ptr => constants.%ptr.59b -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.75d +// CHECK:STDOUT: specific @Inner.as.Destroy.impl.Op(constants.%T.578, constants.%U.57a) { +// CHECK:STDOUT: %T => constants.%T.578 +// CHECK:STDOUT: %T.as_type => constants.%T.as_type +// CHECK:STDOUT: %U => constants.%U.57a +// CHECK:STDOUT: %Inner => constants.%Inner.b59 +// CHECK:STDOUT: %ptr => constants.%ptr.ce1 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.bec // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Outer.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Outer => constants.%Outer.9d6 -// CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness.7ee +// CHECK:STDOUT: specific @Outer.as.Destroy.impl(constants.%T.578) { +// CHECK:STDOUT: %T => constants.%T.578 +// CHECK:STDOUT: %Outer => constants.%Outer.0f8 +// CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness.1e4 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Outer.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Outer => constants.%Outer.9d6 -// CHECK:STDOUT: %ptr => constants.%ptr.6ff -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.07e +// CHECK:STDOUT: specific @Outer.as.Destroy.impl.Op(constants.%T.578) { +// CHECK:STDOUT: %T => constants.%T.578 +// CHECK:STDOUT: %Outer => constants.%Outer.0f8 +// CHECK:STDOUT: %ptr => constants.%ptr.b2c +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.3bd // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Outer(constants.%i32) { -// CHECK:STDOUT: %T.loc4_13.1 => constants.%i32 +// CHECK:STDOUT: specific @Outer(constants.%Copy.facet.26d) { +// CHECK:STDOUT: %T.loc4_13.1 => constants.%Copy.facet.26d // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Inner.type => constants.%Inner.type.bac -// CHECK:STDOUT: %Inner.generic => constants.%Inner.generic.ba0 +// CHECK:STDOUT: %Inner.type => constants.%Inner.type.5cb +// CHECK:STDOUT: %Inner.generic => constants.%Inner.generic.789 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Inner(constants.%i32, constants.%int_42.c68) { -// CHECK:STDOUT: %T => constants.%i32 +// CHECK:STDOUT: specific @Inner(constants.%Copy.facet.26d, constants.%int_42.c68) { +// CHECK:STDOUT: %T => constants.%Copy.facet.26d +// CHECK:STDOUT: %T.as_type.loc5_19.1 => constants.%i32 // CHECK:STDOUT: %U.loc5_15.1 => constants.%int_42.c68 // CHECK:STDOUT: %pattern_type => constants.%pattern_type.7ce // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Inner.Get.type => constants.%Inner.Get.type.512 -// CHECK:STDOUT: %Inner.Get => constants.%Inner.Get.18c +// CHECK:STDOUT: %Inner.Get.type => constants.%Inner.Get.type.e7e +// CHECK:STDOUT: %Inner.Get => constants.%Inner.Get.43d // CHECK:STDOUT: %require_complete => constants.%complete_type.f8a // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Inner.Get(constants.%i32, constants.%int_42.c68) { -// CHECK:STDOUT: %T => constants.%i32 +// CHECK:STDOUT: specific @Inner.Get(constants.%Copy.facet.26d, constants.%int_42.c68) { +// CHECK:STDOUT: %T => constants.%Copy.facet.26d +// CHECK:STDOUT: %T.as_type.loc7_17.1 => constants.%i32 // CHECK:STDOUT: %pattern_type => constants.%pattern_type.7ce // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %U => constants.%int_42.c68 // CHECK:STDOUT: %require_complete => constants.%complete_type.f8a +// CHECK:STDOUT: %Copy.lookup_impl_witness => constants.%Copy.impl_witness.f0b +// CHECK:STDOUT: %Copy.facet => constants.%Copy.facet.26d +// CHECK:STDOUT: %.loc7_28.2 => constants.%.3c4 +// CHECK:STDOUT: %impl.elem0.loc7_28.2 => constants.%Int.as.Copy.impl.Op.87e +// CHECK:STDOUT: %bound_method.loc7_28.3 => constants.%Int.as.Copy.impl.Op.bound +// CHECK:STDOUT: %specific_impl_fn.loc7_28.2 => constants.%Int.as.Copy.impl.Op.specific_fn +// CHECK:STDOUT: %bound_method.loc7_28.4 => constants.%bound_method.6bf // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/generic/fail_generic_copy.carbon b/toolchain/check/testdata/generic/fail_generic_copy.carbon new file mode 100644 index 000000000000..b8eaa38b3d4b --- /dev/null +++ b/toolchain/check/testdata/generic/fail_generic_copy.carbon @@ -0,0 +1,41 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/convert.carbon +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/generic/fail_generic_copy.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/generic/fail_generic_copy.carbon + +// --- fail_return.carbon + +library "[[@TEST_NAME]]"; + +fn F[T:! type](x: T) -> T { + // CHECK:STDERR: fail_return.carbon:[[@LINE+7]]:10: error: cannot copy value of type `T` [CopyOfUncopyableType] + // CHECK:STDERR: return x; + // CHECK:STDERR: ^ + // CHECK:STDERR: fail_return.carbon:[[@LINE+4]]:10: note: type `T` does not implement interface `Core.Copy` [MissingImplInMemberAccessNote] + // CHECK:STDERR: return x; + // CHECK:STDERR: ^ + // CHECK:STDERR: + return x; +} + +// --- fail_var.carbon + +library "[[@TEST_NAME]]"; + +fn F[T:! type](x: T) { + // CHECK:STDERR: fail_var.carbon:[[@LINE+7]]:14: error: cannot copy value of type `T` [CopyOfUncopyableType] + // CHECK:STDERR: var y: T = x; + // CHECK:STDERR: ^ + // CHECK:STDERR: fail_var.carbon:[[@LINE+4]]:14: note: type `T` does not implement interface `Core.Copy` [MissingImplInMemberAccessNote] + // CHECK:STDERR: var y: T = x; + // CHECK:STDERR: ^ + // CHECK:STDERR: + var y: T = x; +} diff --git a/toolchain/check/testdata/generic/template/convert.carbon b/toolchain/check/testdata/generic/template/convert.carbon index 4d70e5d795b9..0173bc3ba37c 100644 --- a/toolchain/check/testdata/generic/template/convert.carbon +++ b/toolchain/check/testdata/generic/template/convert.carbon @@ -17,7 +17,8 @@ library "[[@TEST_NAME]]"; fn F[template T:! type](x: T) -> i32 { - return x; + let n: i32 = x; + return n; } fn Test1(n: i32) -> i32 { @@ -40,13 +41,14 @@ fn Test2(c: C) -> i32 { library "[[@TEST_NAME]]"; fn F[template T:! type](x: T) -> i32 { - // CHECK:STDERR: fail_cannot_convert.carbon:[[@LINE+6]]:3: error: cannot implicitly convert expression of type `D` to `i32` [ConversionFailure] - // CHECK:STDERR: return x; - // CHECK:STDERR: ^~~~~~~~~ - // CHECK:STDERR: fail_cannot_convert.carbon:[[@LINE+3]]:3: note: type `D` does not implement interface `Core.ImplicitAs(i32)` [MissingImplInMemberAccessNote] - // CHECK:STDERR: return x; - // CHECK:STDERR: ^~~~~~~~~ - return x; + // CHECK:STDERR: fail_cannot_convert.carbon:[[@LINE+6]]:16: error: cannot implicitly convert expression of type `D` to `i32` [ConversionFailure] + // CHECK:STDERR: let n: i32 = x; + // CHECK:STDERR: ^ + // CHECK:STDERR: fail_cannot_convert.carbon:[[@LINE+3]]:16: note: type `D` does not implement interface `Core.ImplicitAs(i32)` [MissingImplInMemberAccessNote] + // CHECK:STDERR: let n: i32 = x; + // CHECK:STDERR: ^ + let n: i32 = x; + return n; } class D {} @@ -64,19 +66,30 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: constants { // CHECK:STDOUT: %type: type = facet_type [concrete] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0, template [template] +// CHECK:STDOUT: %T.8b3d5d.1: type = bind_symbolic_name T, 0, template [template] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %pattern_type.7dcd0a.1: type = pattern_type %T [template] +// CHECK:STDOUT: %pattern_type.7dcd0a.1: type = pattern_type %T.8b3d5d.1 [template] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %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: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [template] +// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T.8b3d5d.1 [template] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %Test1.type: type = fn_type @Test1 [concrete] // CHECK:STDOUT: %Test1: %Test1.type = struct_value () [concrete] // CHECK:STDOUT: %F.specific_fn.501: = specific_function %F, @F(%i32) [concrete] @@ -115,8 +128,8 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: %.b3b: type = fn_type_with_self_type %ImplicitAs.Convert.type.1b6, %ImplicitAs.facet [concrete] // CHECK:STDOUT: %inst.splice_block.7a1: = inst_value [concrete] { // CHECK:STDOUT: %.a23: %i32 = splice_block %.a7c { -// CHECK:STDOUT: %impl.elem0: %.b3b = impl_witness_access %ImplicitAs.impl_witness.9ce, element0 [concrete = %C.as.ImplicitAs.impl.Convert] -// CHECK:STDOUT: %bound_method: = bound_method %.fbe, %impl.elem0 +// CHECK:STDOUT: %impl.elem0.2ba: %.b3b = impl_witness_access %ImplicitAs.impl_witness.9ce, element0 [concrete = %C.as.ImplicitAs.impl.Convert] +// CHECK:STDOUT: %bound_method: = bound_method %.fbe, %impl.elem0.2ba // CHECK:STDOUT: %C.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method(%.fbe) // CHECK:STDOUT: %.2e3: %i32 = value_of_initializer %C.as.ImplicitAs.impl.Convert.call // CHECK:STDOUT: %.a7c: %i32 = converted %.fbe, %.2e3 @@ -127,12 +140,16 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } @@ -153,13 +170,13 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc4: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc4: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @F.%T.loc4_15.1 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_15.2 [template = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: %x: @F.%T.loc4_15.1 (%T) = bind_name x, %x.param +// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T.8b3d5d.1)] +// CHECK:STDOUT: %x.param: @F.%T.loc4_15.1 (%T.8b3d5d.1) = value_param call_param0 +// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_15.2 [template = %T.loc4_15.1 (constants.%T.8b3d5d.1)] +// CHECK:STDOUT: %x: @F.%T.loc4_15.1 (%T.8b3d5d.1) = bind_name x, %x.param // CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 // CHECK:STDOUT: %return: ref %i32 = return_slot %return.param // CHECK:STDOUT: } @@ -169,12 +186,12 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc8_21: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc8_21: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc9_21: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc9_21: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %n.param: %i32 = value_param call_param0 -// CHECK:STDOUT: %.loc8: type = splice_block %i32.loc8_13 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc8_13: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc8_13: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %.loc9: type = splice_block %i32.loc9_13 [concrete = constants.%i32] { +// CHECK:STDOUT: %int_32.loc9_13: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc9_13: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: } // CHECK:STDOUT: %n: %i32 = bind_name n, %n.param // CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 @@ -222,7 +239,7 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: %C.as.Destroy.impl.Op.decl: %C.as.Destroy.impl.Op.type = fn_decl @C.as.Destroy.impl.Op [concrete = constants.%C.as.Destroy.impl.Op] { // CHECK:STDOUT: %self.patt: %pattern_type.44a = binding_pattern self [concrete] // CHECK:STDOUT: %self.param_patt: %pattern_type.44a = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc12: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: %.loc13: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %self.param: %ptr.019 = value_param call_param0 // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] @@ -237,7 +254,7 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: class @C { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc13: %C.elem = field_decl n, element0 [concrete] +// CHECK:STDOUT: %.loc14: %C.elem = field_decl n, element0 [concrete] // CHECK:STDOUT: impl_decl @C.as.ImplicitAs.impl [concrete] {} { // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] // CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core [concrete = imports.%Core] @@ -257,24 +274,38 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .n = %.loc13 +// CHECK:STDOUT: .n = %.loc14 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @F(%T.loc4_15.2: type) { -// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T)] +// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T.8b3d5d.1)] // CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc4_15.1 [template = %pattern_type (constants.%pattern_type.7dcd0a.1)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_15.1 [template = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %.loc5_11.3: = refine_type_action %x.ref, %T.loc4_15.1 [template] -// CHECK:STDOUT: %.loc5_11.4: = convert_to_value_action %.loc5_11.1, constants.%i32 [template] +// CHECK:STDOUT: %.loc5_16.3: = refine_type_action %x.ref, %T.loc4_15.1 [template] +// CHECK:STDOUT: %.loc5_16.4: = convert_to_value_action %.loc5_16.1, constants.%i32 [template] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @F.%T.loc4_15.1 (%T)) -> %i32 { +// CHECK:STDOUT: fn(%x.param: @F.%T.loc4_15.1 (%T.8b3d5d.1)) -> %i32 { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @F.%T.loc4_15.1 (%T) = name_ref x, %x -// CHECK:STDOUT: %.loc5_11.1: @F.%T.loc4_15.1 (%T) = splice_inst %.loc5_11.3 -// CHECK:STDOUT: %.loc5_11.2: %i32 = splice_inst %.loc5_11.4 -// CHECK:STDOUT: return %.loc5_11.2 +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %n.patt: %pattern_type.7ce = binding_pattern n [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x.ref: @F.%T.loc4_15.1 (%T.8b3d5d.1) = name_ref x, %x +// CHECK:STDOUT: %.loc5_10: type = splice_block %i32.loc5 [concrete = constants.%i32] { +// CHECK:STDOUT: %int_32.loc5: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc5: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: } +// CHECK:STDOUT: %.loc5_16.1: @F.%T.loc4_15.1 (%T.8b3d5d.1) = splice_inst %.loc5_16.3 +// CHECK:STDOUT: %.loc5_16.2: %i32 = splice_inst %.loc5_16.4 +// CHECK:STDOUT: %n: %i32 = bind_name n, %.loc5_16.2 +// CHECK:STDOUT: %n.ref: %i32 = name_ref n, %n +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc6_10.1: = bound_method %n.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc6_10.2: = bound_method %n.ref, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc6_10.2(%n.ref) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -284,18 +315,21 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: %n.ref: %i32 = name_ref n, %n // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%i32) [concrete = constants.%F.specific_fn.501] // CHECK:STDOUT: %F.call: init %i32 = call %F.specific_fn(%n.ref) -// CHECK:STDOUT: %.loc9_14.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc9_14.2: %i32 = converted %F.call, %.loc9_14.1 -// CHECK:STDOUT: return %.loc9_14.2 +// CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.ImplicitAs.impl.Convert(%self.param: %C) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %self.ref: %C = name_ref self, %self -// CHECK:STDOUT: %n.ref: %C.elem = name_ref n, @C.%.loc13 [concrete = @C.%.loc13] -// CHECK:STDOUT: %.loc15_50.1: ref %i32 = class_element_access %self.ref, element0 -// CHECK:STDOUT: %.loc15_50.2: %i32 = bind_value %.loc15_50.1 -// CHECK:STDOUT: return %.loc15_50.2 +// CHECK:STDOUT: %n.ref: %C.elem = name_ref n, @C.%.loc14 [concrete = @C.%.loc14] +// CHECK:STDOUT: %.loc16_50.1: ref %i32 = class_element_access %self.ref, element0 +// CHECK:STDOUT: %.loc16_50.2: %i32 = bind_value %.loc16_50.1 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc16_50.1: = bound_method %.loc16_50.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc16_50.2: = bound_method %.loc16_50.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc16_50.2(%.loc16_50.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.Destroy.impl.Op(%self.param: %ptr.019) = "no_op"; @@ -306,13 +340,11 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: %c.ref: %C = name_ref c, %c // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%C) [concrete = constants.%F.specific_fn.04a] // CHECK:STDOUT: %F.call: init %i32 = call %F.specific_fn(%c.ref) -// CHECK:STDOUT: %.loc20_14.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc20_14.2: %i32 = converted %F.call, %.loc20_14.1 -// CHECK:STDOUT: return %.loc20_14.2 +// CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T.loc4_15.1 => constants.%T +// CHECK:STDOUT: specific @F(constants.%T.8b3d5d.1) { +// CHECK:STDOUT: %T.loc4_15.1 => constants.%T.8b3d5d.1 // CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dcd0a.1 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -322,8 +354,8 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %.loc5_11.3 => constants.%inst.as_compatible.d73 -// CHECK:STDOUT: %.loc5_11.4 => constants.%inst.splice_block.c18 +// CHECK:STDOUT: %.loc5_16.3 => constants.%inst.as_compatible.d73 +// CHECK:STDOUT: %.loc5_16.4 => constants.%inst.splice_block.c18 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%C) { @@ -332,8 +364,8 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.54b -// CHECK:STDOUT: %.loc5_11.3 => constants.%inst.as_compatible.c0a -// CHECK:STDOUT: %.loc5_11.4 => constants.%inst.splice_block.7a1 +// CHECK:STDOUT: %.loc5_16.3 => constants.%inst.as_compatible.c0a +// CHECK:STDOUT: %.loc5_16.4 => constants.%inst.splice_block.7a1 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_cannot_convert.carbon @@ -341,17 +373,28 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: constants { // CHECK:STDOUT: %type: type = facet_type [concrete] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0, template [template] +// CHECK:STDOUT: %T.8b3d5d.1: type = bind_symbolic_name T, 0, template [template] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %pattern_type.7dcd0a.1: type = pattern_type %T [template] +// CHECK:STDOUT: %pattern_type.7dcd0a.1: type = pattern_type %T.8b3d5d.1 [template] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [template] +// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T.8b3d5d.1 [template] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %D: type = class_type @D [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] @@ -381,12 +424,16 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: } @@ -406,13 +453,13 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc4: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc4: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @F.%T.loc4_15.1 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_15.2 [template = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: %x: @F.%T.loc4_15.1 (%T) = bind_name x, %x.param +// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T.8b3d5d.1)] +// CHECK:STDOUT: %x.param: @F.%T.loc4_15.1 (%T.8b3d5d.1) = value_param call_param0 +// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_15.2 [template = %T.loc4_15.1 (constants.%T.8b3d5d.1)] +// CHECK:STDOUT: %x: @F.%T.loc4_15.1 (%T.8b3d5d.1) = bind_name x, %x.param // CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 // CHECK:STDOUT: %return: ref %i32 = return_slot %return.param // CHECK:STDOUT: } @@ -437,7 +484,7 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: %D.as.Destroy.impl.Op.decl: %D.as.Destroy.impl.Op.type = fn_decl @D.as.Destroy.impl.Op [concrete = constants.%D.as.Destroy.impl.Op] { // CHECK:STDOUT: %self.patt: %pattern_type.a94 = binding_pattern self [concrete] // CHECK:STDOUT: %self.param_patt: %pattern_type.a94 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc14: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: %.loc15: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %self.param: %ptr.19c = value_param call_param0 // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%D [concrete = constants.%D] @@ -462,20 +509,34 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @F(%T.loc4_15.2: type) { -// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T)] +// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T.8b3d5d.1)] // CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc4_15.1 [template = %pattern_type (constants.%pattern_type.7dcd0a.1)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_15.1 [template = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %.loc11_11.3: = refine_type_action %x.ref, %T.loc4_15.1 [template] -// CHECK:STDOUT: %.loc11_11.4: = convert_to_value_action %.loc11_11.1, constants.%i32 [template] +// CHECK:STDOUT: %.loc11_16.3: = refine_type_action %x.ref, %T.loc4_15.1 [template] +// CHECK:STDOUT: %.loc11_16.4: = convert_to_value_action %.loc11_16.1, constants.%i32 [template] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @F.%T.loc4_15.1 (%T)) -> %i32 { +// CHECK:STDOUT: fn(%x.param: @F.%T.loc4_15.1 (%T.8b3d5d.1)) -> %i32 { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @F.%T.loc4_15.1 (%T) = name_ref x, %x -// CHECK:STDOUT: %.loc11_11.1: @F.%T.loc4_15.1 (%T) = splice_inst %.loc11_11.3 -// CHECK:STDOUT: %.loc11_11.2: %i32 = splice_inst %.loc11_11.4 -// CHECK:STDOUT: return %.loc11_11.2 +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %n.patt: %pattern_type.7ce = binding_pattern n [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x.ref: @F.%T.loc4_15.1 (%T.8b3d5d.1) = name_ref x, %x +// CHECK:STDOUT: %.loc11_10: type = splice_block %i32.loc11 [concrete = constants.%i32] { +// CHECK:STDOUT: %int_32.loc11: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc11: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: } +// CHECK:STDOUT: %.loc11_16.1: @F.%T.loc4_15.1 (%T.8b3d5d.1) = splice_inst %.loc11_16.3 +// CHECK:STDOUT: %.loc11_16.2: %i32 = splice_inst %.loc11_16.4 +// CHECK:STDOUT: %n: %i32 = bind_name n, %.loc11_16.2 +// CHECK:STDOUT: %n.ref: %i32 = name_ref n, %n +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc12_10.1: = bound_method %n.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc12_10.2: = bound_method %n.ref, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc12_10.2(%n.ref) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -487,13 +548,11 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: %d.ref: %D = name_ref d, %d // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%D) [concrete = constants.%F.specific_fn] // CHECK:STDOUT: %F.call: init %i32 = call %F.specific_fn(%d.ref) -// CHECK:STDOUT: %.loc21_14.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc21_14.2: %i32 = converted %F.call, %.loc21_14.1 -// CHECK:STDOUT: return %.loc21_14.2 +// CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T.loc4_15.1 => constants.%T +// CHECK:STDOUT: specific @F(constants.%T.8b3d5d.1) { +// CHECK:STDOUT: %T.loc4_15.1 => constants.%T.8b3d5d.1 // CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dcd0a.1 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -503,7 +562,7 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.357 -// CHECK:STDOUT: %.loc11_11.3 => constants.%inst.as_compatible -// CHECK:STDOUT: %.loc11_11.4 => constants.%inst.splice_block +// CHECK:STDOUT: %.loc11_16.3 => constants.%inst.as_compatible +// CHECK:STDOUT: %.loc11_16.4 => constants.%inst.splice_block // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/generic/template/member_access.carbon b/toolchain/check/testdata/generic/template/member_access.carbon index c6b318408d9d..3cccd360a154 100644 --- a/toolchain/check/testdata/generic/template/member_access.carbon +++ b/toolchain/check/testdata/generic/template/member_access.carbon @@ -17,7 +17,8 @@ library "[[@TEST_NAME]]"; fn F[template T:! type](x: T) -> i32 { - return x.n; + let n: i32 = x.n; + return n; } class C { @@ -37,10 +38,11 @@ fn Test2(x: {.m: i32, .n: i32}) { library "[[@TEST_NAME]]"; fn F[template T:! type](x: T) -> i32 { - // CHECK:STDERR: fail_no_such_member.carbon:[[@LINE+3]]:10: error: member name `n` not found in `D` [MemberNameNotFoundInInstScope] - // CHECK:STDERR: return x.n; - // CHECK:STDERR: ^~~ - return x.n; + // CHECK:STDERR: fail_no_such_member.carbon:[[@LINE+3]]:16: error: member name `n` not found in `D` [MemberNameNotFoundInInstScope] + // CHECK:STDERR: let n: i32 = x.n; + // CHECK:STDERR: ^~~ + let n: i32 = x.n; + return n; } class D { @@ -60,13 +62,14 @@ fn Test(d: D) { library "[[@TEST_NAME]]"; fn F[template T:! type](x: T) -> i32 { - // CHECK:STDERR: fail_member_wrong_type.carbon:[[@LINE+6]]:3: error: cannot implicitly convert expression of type `F` to `i32` [ConversionFailure] - // CHECK:STDERR: return x.n; - // CHECK:STDERR: ^~~~~~~~~~~ - // CHECK:STDERR: fail_member_wrong_type.carbon:[[@LINE+3]]:3: note: type `F` does not implement interface `Core.ImplicitAs(i32)` [MissingImplInMemberAccessNote] - // CHECK:STDERR: return x.n; - // CHECK:STDERR: ^~~~~~~~~~~ - return x.n; + // CHECK:STDERR: fail_member_wrong_type.carbon:[[@LINE+6]]:16: error: cannot implicitly convert expression of type `F` to `i32` [ConversionFailure] + // CHECK:STDERR: let n: i32 = x.n; + // CHECK:STDERR: ^~~ + // CHECK:STDERR: fail_member_wrong_type.carbon:[[@LINE+3]]:16: note: type `F` does not implement interface `Core.ImplicitAs(i32)` [MissingImplInMemberAccessNote] + // CHECK:STDERR: let n: i32 = x.n; + // CHECK:STDERR: ^~~ + let n: i32 = x.n; + return n; } class E { @@ -87,17 +90,28 @@ fn Test(e: E) { // CHECK:STDOUT: constants { // CHECK:STDOUT: %type: type = facet_type [concrete] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0, template [template] +// CHECK:STDOUT: %T.8b3d5d.1: type = bind_symbolic_name T, 0, template [template] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [template] +// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T.8b3d5d.1 [template] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [template] +// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T.8b3d5d.1 [template] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %C: type = class_type @C [concrete] // CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %i32 [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] @@ -123,7 +137,7 @@ fn Test(e: E) { // CHECK:STDOUT: } // CHECK:STDOUT: %inst.splice_block.d20: = inst_value [concrete] { // CHECK:STDOUT: %.39c: %i32 = splice_block %.e83 { -// CHECK:STDOUT: %n.ref: %C.elem = name_ref n, @C.%.loc9 [concrete = @C.%.loc9] +// CHECK:STDOUT: %n.ref: %C.elem = name_ref n, @C.%.loc10 [concrete = @C.%.loc10] // CHECK:STDOUT: %.d20: ref %i32 = class_element_access %.fbe, element0 // CHECK:STDOUT: %.e83: %i32 = bind_value %.d20 // CHECK:STDOUT: } @@ -146,11 +160,15 @@ fn Test(e: E) { // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -170,13 +188,13 @@ fn Test(e: E) { // CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc4: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc4: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @F.%T.loc4_15.1 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_15.2 [template = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: %x: @F.%T.loc4_15.1 (%T) = bind_name x, %x.param +// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T.8b3d5d.1)] +// CHECK:STDOUT: %x.param: @F.%T.loc4_15.1 (%T.8b3d5d.1) = value_param call_param0 +// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_15.2 [template = %T.loc4_15.1 (constants.%T.8b3d5d.1)] +// CHECK:STDOUT: %x: @F.%T.loc4_15.1 (%T.8b3d5d.1) = bind_name x, %x.param // CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 // CHECK:STDOUT: %return: ref %i32 = return_slot %return.param // CHECK:STDOUT: } @@ -194,11 +212,11 @@ fn Test(e: E) { // CHECK:STDOUT: %x.param_patt: %pattern_type.811 = value_param_pattern %x.patt, call_param0 [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %x.param: %struct_type.m.n = value_param call_param0 -// CHECK:STDOUT: %.loc16: type = splice_block %struct_type.m.n [concrete = constants.%struct_type.m.n] { -// CHECK:STDOUT: %int_32.loc16_18: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc16_18: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %int_32.loc16_27: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc16_27: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %.loc17: type = splice_block %struct_type.m.n [concrete = constants.%struct_type.m.n] { +// CHECK:STDOUT: %int_32.loc17_18: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc17_18: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc17_27: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc17_27: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %struct_type.m.n: type = struct_type {.m: %i32, .n: %i32} [concrete = constants.%struct_type.m.n] // CHECK:STDOUT: } // CHECK:STDOUT: %x: %struct_type.m.n = bind_name x, %x.param @@ -209,7 +227,7 @@ fn Test(e: E) { // CHECK:STDOUT: %C.as.Destroy.impl.Op.decl: %C.as.Destroy.impl.Op.type = fn_decl @C.as.Destroy.impl.Op [concrete = constants.%C.as.Destroy.impl.Op] { // CHECK:STDOUT: %self.patt: %pattern_type.44a = binding_pattern self [concrete] // CHECK:STDOUT: %self.param_patt: %pattern_type.44a = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: %.loc9: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %self.param: %ptr.019 = value_param call_param0 // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] @@ -224,7 +242,7 @@ fn Test(e: E) { // CHECK:STDOUT: class @C { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc9: %C.elem = field_decl n, element0 [concrete] +// CHECK:STDOUT: %.loc10: %C.elem = field_decl n, element0 [concrete] // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] // CHECK:STDOUT: impl_decl @C.as.Destroy.impl [concrete] {} {} // CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@C.as.Destroy.impl.%C.as.Destroy.impl.Op.decl), @C.as.Destroy.impl [concrete] @@ -234,27 +252,41 @@ fn Test(e: E) { // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .n = %.loc9 +// CHECK:STDOUT: .n = %.loc10 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @F(%T.loc4_15.2: type) { -// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T)] +// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T.8b3d5d.1)] // CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc4_15.1 [template = %pattern_type (constants.%pattern_type.7dc)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_15.1 [template = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %.loc5_11.3: = refine_type_action %x.ref, %T.loc4_15.1 [template] -// CHECK:STDOUT: %.loc5_11.4: = access_member_action %.loc5_11.1, n [template] -// CHECK:STDOUT: %.loc5_11.5: type = type_of_inst %.loc5_11.4 [template] -// CHECK:STDOUT: %.loc5_13.2: = convert_to_value_action %.loc5_11.2, constants.%i32 [template] +// CHECK:STDOUT: %.loc5_17.4: = refine_type_action %x.ref, %T.loc4_15.1 [template] +// CHECK:STDOUT: %.loc5_17.5: = access_member_action %.loc5_17.1, n [template] +// CHECK:STDOUT: %.loc5_17.6: type = type_of_inst %.loc5_17.5 [template] +// CHECK:STDOUT: %.loc5_17.7: = convert_to_value_action %.loc5_17.2, constants.%i32 [template] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @F.%T.loc4_15.1 (%T)) -> %i32 { +// CHECK:STDOUT: fn(%x.param: @F.%T.loc4_15.1 (%T.8b3d5d.1)) -> %i32 { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @F.%T.loc4_15.1 (%T) = name_ref x, %x -// CHECK:STDOUT: %.loc5_11.1: @F.%T.loc4_15.1 (%T) = splice_inst %.loc5_11.3 -// CHECK:STDOUT: %.loc5_11.2: @F.%.loc5_11.5 (@F.%.loc5_11.5) = splice_inst %.loc5_11.4 -// CHECK:STDOUT: %.loc5_13.1: %i32 = splice_inst %.loc5_13.2 -// CHECK:STDOUT: return %.loc5_13.1 +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %n.patt: %pattern_type.7ce = binding_pattern n [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x.ref: @F.%T.loc4_15.1 (%T.8b3d5d.1) = name_ref x, %x +// CHECK:STDOUT: %.loc5_17.1: @F.%T.loc4_15.1 (%T.8b3d5d.1) = splice_inst %.loc5_17.4 +// CHECK:STDOUT: %.loc5_17.2: @F.%.loc5_17.6 (@F.%.loc5_17.6) = splice_inst %.loc5_17.5 +// CHECK:STDOUT: %.loc5_10: type = splice_block %i32.loc5 [concrete = constants.%i32] { +// CHECK:STDOUT: %int_32.loc5: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc5: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: } +// CHECK:STDOUT: %.loc5_17.3: %i32 = splice_inst %.loc5_17.7 +// CHECK:STDOUT: %n: %i32 = bind_name n, %.loc5_17.3 +// CHECK:STDOUT: %n.ref: %i32 = name_ref n, %n +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc6_10.1: = bound_method %n.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc6_10.2: = bound_method %n.ref, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc6_10.2(%n.ref) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -278,8 +310,8 @@ fn Test(e: E) { // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T.loc4_15.1 => constants.%T +// CHECK:STDOUT: specific @F(constants.%T.8b3d5d.1) { +// CHECK:STDOUT: %T.loc4_15.1 => constants.%T.8b3d5d.1 // CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc // CHECK:STDOUT: } // CHECK:STDOUT: @@ -289,10 +321,10 @@ fn Test(e: E) { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.54b -// CHECK:STDOUT: %.loc5_11.3 => constants.%inst.as_compatible.c0a -// CHECK:STDOUT: %.loc5_11.4 => constants.%inst.splice_block.d20 -// CHECK:STDOUT: %.loc5_11.5 => constants.%i32 -// CHECK:STDOUT: %.loc5_13.2 => constants.%inst.splice_block.435 +// CHECK:STDOUT: %.loc5_17.4 => constants.%inst.as_compatible.c0a +// CHECK:STDOUT: %.loc5_17.5 => constants.%inst.splice_block.d20 +// CHECK:STDOUT: %.loc5_17.6 => constants.%i32 +// CHECK:STDOUT: %.loc5_17.7 => constants.%inst.splice_block.435 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%struct_type.m.n) { @@ -301,10 +333,10 @@ fn Test(e: E) { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.622 -// CHECK:STDOUT: %.loc5_11.3 => constants.%inst.as_compatible.8f8 -// CHECK:STDOUT: %.loc5_11.4 => constants.%inst.struct_access -// CHECK:STDOUT: %.loc5_11.5 => constants.%i32 -// CHECK:STDOUT: %.loc5_13.2 => constants.%inst.splice_block.57b +// CHECK:STDOUT: %.loc5_17.4 => constants.%inst.as_compatible.8f8 +// CHECK:STDOUT: %.loc5_17.5 => constants.%inst.struct_access +// CHECK:STDOUT: %.loc5_17.6 => constants.%i32 +// CHECK:STDOUT: %.loc5_17.7 => constants.%inst.splice_block.57b // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_no_such_member.carbon @@ -312,17 +344,28 @@ fn Test(e: E) { // CHECK:STDOUT: constants { // CHECK:STDOUT: %type: type = facet_type [concrete] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0, template [template] +// CHECK:STDOUT: %T.8b3d5d.1: type = bind_symbolic_name T, 0, template [template] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [template] +// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T.8b3d5d.1 [template] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [template] +// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T.8b3d5d.1 [template] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %D: type = class_type @D [concrete] // CHECK:STDOUT: %D.elem: type = unbound_element_type %D, %i32 [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] @@ -352,11 +395,15 @@ fn Test(e: E) { // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -375,13 +422,13 @@ fn Test(e: E) { // CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc4: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc4: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @F.%T.loc4_15.1 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_15.2 [template = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: %x: @F.%T.loc4_15.1 (%T) = bind_name x, %x.param +// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T.8b3d5d.1)] +// CHECK:STDOUT: %x.param: @F.%T.loc4_15.1 (%T.8b3d5d.1) = value_param call_param0 +// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_15.2 [template = %T.loc4_15.1 (constants.%T.8b3d5d.1)] +// CHECK:STDOUT: %x: @F.%T.loc4_15.1 (%T.8b3d5d.1) = bind_name x, %x.param // CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 // CHECK:STDOUT: %return: ref %i32 = return_slot %return.param // CHECK:STDOUT: } @@ -400,7 +447,7 @@ fn Test(e: E) { // CHECK:STDOUT: %D.as.Destroy.impl.Op.decl: %D.as.Destroy.impl.Op.type = fn_decl @D.as.Destroy.impl.Op [concrete = constants.%D.as.Destroy.impl.Op] { // CHECK:STDOUT: %self.patt: %pattern_type.a94 = binding_pattern self [concrete] // CHECK:STDOUT: %self.param_patt: %pattern_type.a94 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc11: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: %.loc12: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %self.param: %ptr.19c = value_param call_param0 // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%D [concrete = constants.%D] @@ -415,7 +462,7 @@ fn Test(e: E) { // CHECK:STDOUT: class @D { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc12: %D.elem = field_decl m, element0 [concrete] +// CHECK:STDOUT: %.loc13: %D.elem = field_decl m, element0 [concrete] // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%D [concrete = constants.%D] // CHECK:STDOUT: impl_decl @D.as.Destroy.impl [concrete] {} {} // CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@D.as.Destroy.impl.%D.as.Destroy.impl.Op.decl), @D.as.Destroy.impl [concrete] @@ -425,28 +472,42 @@ fn Test(e: E) { // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .Self = constants.%D -// CHECK:STDOUT: .m = %.loc12 +// CHECK:STDOUT: .m = %.loc13 // CHECK:STDOUT: .n = // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @F(%T.loc4_15.2: type) { -// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T)] +// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T.8b3d5d.1)] // CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc4_15.1 [template = %pattern_type (constants.%pattern_type.7dc)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_15.1 [template = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %.loc8_11.3: = refine_type_action %x.ref, %T.loc4_15.1 [template] -// CHECK:STDOUT: %.loc8_11.4: = access_member_action %.loc8_11.1, n [template] -// CHECK:STDOUT: %.loc8_11.5: type = type_of_inst %.loc8_11.4 [template] -// CHECK:STDOUT: %.loc8_13.2: = convert_to_value_action %.loc8_11.2, constants.%i32 [template] +// CHECK:STDOUT: %.loc8_17.4: = refine_type_action %x.ref, %T.loc4_15.1 [template] +// CHECK:STDOUT: %.loc8_17.5: = access_member_action %.loc8_17.1, n [template] +// CHECK:STDOUT: %.loc8_17.6: type = type_of_inst %.loc8_17.5 [template] +// CHECK:STDOUT: %.loc8_17.7: = convert_to_value_action %.loc8_17.2, constants.%i32 [template] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @F.%T.loc4_15.1 (%T)) -> %i32 { +// CHECK:STDOUT: fn(%x.param: @F.%T.loc4_15.1 (%T.8b3d5d.1)) -> %i32 { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @F.%T.loc4_15.1 (%T) = name_ref x, %x -// CHECK:STDOUT: %.loc8_11.1: @F.%T.loc4_15.1 (%T) = splice_inst %.loc8_11.3 -// CHECK:STDOUT: %.loc8_11.2: @F.%.loc8_11.5 (@F.%.loc8_11.5) = splice_inst %.loc8_11.4 -// CHECK:STDOUT: %.loc8_13.1: %i32 = splice_inst %.loc8_13.2 -// CHECK:STDOUT: return %.loc8_13.1 +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %n.patt: %pattern_type.7ce = binding_pattern n [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x.ref: @F.%T.loc4_15.1 (%T.8b3d5d.1) = name_ref x, %x +// CHECK:STDOUT: %.loc8_17.1: @F.%T.loc4_15.1 (%T.8b3d5d.1) = splice_inst %.loc8_17.4 +// CHECK:STDOUT: %.loc8_17.2: @F.%.loc8_17.6 (@F.%.loc8_17.6) = splice_inst %.loc8_17.5 +// CHECK:STDOUT: %.loc8_10: type = splice_block %i32.loc8 [concrete = constants.%i32] { +// CHECK:STDOUT: %int_32.loc8: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc8: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: } +// CHECK:STDOUT: %.loc8_17.3: %i32 = splice_inst %.loc8_17.7 +// CHECK:STDOUT: %n: %i32 = bind_name n, %.loc8_17.3 +// CHECK:STDOUT: %n.ref: %i32 = name_ref n, %n +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc9_10.1: = bound_method %n.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc9_10.2: = bound_method %n.ref, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc9_10.2(%n.ref) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -461,8 +522,8 @@ fn Test(e: E) { // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T.loc4_15.1 => constants.%T +// CHECK:STDOUT: specific @F(constants.%T.8b3d5d.1) { +// CHECK:STDOUT: %T.loc4_15.1 => constants.%T.8b3d5d.1 // CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc // CHECK:STDOUT: } // CHECK:STDOUT: @@ -472,10 +533,10 @@ fn Test(e: E) { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.218 -// CHECK:STDOUT: %.loc8_11.3 => constants.%inst.as_compatible -// CHECK:STDOUT: %.loc8_11.4 => constants.%inst.name_ref -// CHECK:STDOUT: %.loc8_11.5 => -// CHECK:STDOUT: %.loc8_13.2 => constants.%inst.splice_block +// CHECK:STDOUT: %.loc8_17.4 => constants.%inst.as_compatible +// CHECK:STDOUT: %.loc8_17.5 => constants.%inst.name_ref +// CHECK:STDOUT: %.loc8_17.6 => +// CHECK:STDOUT: %.loc8_17.7 => constants.%inst.splice_block // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_member_wrong_type.carbon @@ -483,22 +544,33 @@ fn Test(e: E) { // CHECK:STDOUT: constants { // CHECK:STDOUT: %type: type = facet_type [concrete] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0, template [template] +// CHECK:STDOUT: %T.8b3d5d.1: type = bind_symbolic_name T, 0, template [template] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %pattern_type.7dcd0a.1: type = pattern_type %T [template] +// CHECK:STDOUT: %pattern_type.7dcd0a.1: type = pattern_type %T.8b3d5d.1 [template] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %F.type: type = fn_type @F.loc4 [concrete] // CHECK:STDOUT: %F.c41: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [template] +// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T.8b3d5d.1 [template] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %E: type = class_type @E [concrete] -// CHECK:STDOUT: %F.a8a: type = class_type @F.loc15 [concrete] +// CHECK:STDOUT: %F.a8a: type = class_type @F.loc16 [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness.6fa: = impl_witness @F.loc15.%Destroy.impl_witness_table [concrete] +// CHECK:STDOUT: %Destroy.impl_witness.6fa: = impl_witness @F.loc16.%Destroy.impl_witness_table [concrete] // CHECK:STDOUT: %ptr.01c: type = ptr_type %F.a8a [concrete] // CHECK:STDOUT: %pattern_type.463: type = pattern_type %ptr.01c [concrete] // CHECK:STDOUT: %F.as.Destroy.impl.Op.type: type = fn_type @F.as.Destroy.impl.Op [concrete] @@ -522,7 +594,7 @@ fn Test(e: E) { // CHECK:STDOUT: } // CHECK:STDOUT: %inst.splice_block.2a2: = inst_value [concrete] { // CHECK:STDOUT: %.6c9: %F.a8a = splice_block %.e29 { -// CHECK:STDOUT: %n.ref: %E.elem = name_ref n, @E.%.loc16 [concrete = @E.%.loc16] +// CHECK:STDOUT: %n.ref: %E.elem = name_ref n, @E.%.loc17 [concrete = @E.%.loc17] // CHECK:STDOUT: %.999: ref %F.a8a = class_element_access %.a66, element0 // CHECK:STDOUT: %.e29: %F.a8a = bind_value %.999 // CHECK:STDOUT: } @@ -539,12 +611,16 @@ fn Test(e: E) { // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: } @@ -564,13 +640,13 @@ fn Test(e: E) { // CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc4: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc4: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @F.loc4.%T.loc4_15.1 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_15.2 [template = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: %x: @F.loc4.%T.loc4_15.1 (%T) = bind_name x, %x.param +// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T.8b3d5d.1)] +// CHECK:STDOUT: %x.param: @F.loc4.%T.loc4_15.1 (%T.8b3d5d.1) = value_param call_param0 +// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_15.2 [template = %T.loc4_15.1 (constants.%T.8b3d5d.1)] +// CHECK:STDOUT: %x: @F.loc4.%T.loc4_15.1 (%T.8b3d5d.1) = bind_name x, %x.param // CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 // CHECK:STDOUT: %return: ref %i32 = return_slot %return.param // CHECK:STDOUT: } @@ -585,11 +661,11 @@ fn Test(e: E) { // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: impl @F.as.Destroy.impl: @F.loc15.%Self.ref as constants.%Destroy.type { +// CHECK:STDOUT: impl @F.as.Destroy.impl: @F.loc16.%Self.ref as constants.%Destroy.type { // CHECK:STDOUT: %F.as.Destroy.impl.Op.decl: %F.as.Destroy.impl.Op.type = fn_decl @F.as.Destroy.impl.Op [concrete = constants.%F.as.Destroy.impl.Op] { // CHECK:STDOUT: %self.patt: %pattern_type.463 = binding_pattern self [concrete] // CHECK:STDOUT: %self.param_patt: %pattern_type.463 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc15: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: %.loc16: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %self.param: %ptr.01c = value_param call_param0 // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%F.a8a [concrete = constants.%F.a8a] @@ -598,14 +674,14 @@ fn Test(e: E) { // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .Op = %F.as.Destroy.impl.Op.decl -// CHECK:STDOUT: witness = @F.loc15.%Destroy.impl_witness +// CHECK:STDOUT: witness = @F.loc16.%Destroy.impl_witness // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @E.as.Destroy.impl: @E.%Self.ref as constants.%Destroy.type { // CHECK:STDOUT: %E.as.Destroy.impl.Op.decl: %E.as.Destroy.impl.Op.type = fn_decl @E.as.Destroy.impl.Op [concrete = constants.%E.as.Destroy.impl.Op] { // CHECK:STDOUT: %self.patt: %pattern_type.88c = binding_pattern self [concrete] // CHECK:STDOUT: %self.param_patt: %pattern_type.88c = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc14: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: %.loc15: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %self.param: %ptr.742 = value_param call_param0 // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%E [concrete = constants.%E] @@ -618,9 +694,9 @@ fn Test(e: E) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @E { -// CHECK:STDOUT: %F.decl: type = class_decl @F.loc15 [concrete = constants.%F.a8a] {} {} +// CHECK:STDOUT: %F.decl: type = class_decl @F.loc16 [concrete = constants.%F.a8a] {} {} // CHECK:STDOUT: %F.ref: type = name_ref F, %F.decl [concrete = constants.%F.a8a] -// CHECK:STDOUT: %.loc16: %E.elem = field_decl n, element0 [concrete] +// CHECK:STDOUT: %.loc17: %E.elem = field_decl n, element0 [concrete] // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%E [concrete = constants.%E] // CHECK:STDOUT: impl_decl @E.as.Destroy.impl [concrete] {} {} // CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@E.as.Destroy.impl.%E.as.Destroy.impl.Op.decl), @E.as.Destroy.impl [concrete] @@ -631,10 +707,10 @@ fn Test(e: E) { // CHECK:STDOUT: !members: // CHECK:STDOUT: .Self = constants.%E // CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .n = %.loc16 +// CHECK:STDOUT: .n = %.loc17 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: class @F.loc15 { +// CHECK:STDOUT: class @F.loc16 { // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%F.a8a [concrete = constants.%F.a8a] // CHECK:STDOUT: impl_decl @F.as.Destroy.impl [concrete] {} {} // CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@F.as.Destroy.impl.%F.as.Destroy.impl.Op.decl), @F.as.Destroy.impl [concrete] @@ -647,23 +723,37 @@ fn Test(e: E) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @F.loc4(%T.loc4_15.2: type) { -// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T)] +// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T.8b3d5d.1)] // CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc4_15.1 [template = %pattern_type (constants.%pattern_type.7dcd0a.1)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_15.1 [template = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %.loc11_11.3: = refine_type_action %x.ref, %T.loc4_15.1 [template] -// CHECK:STDOUT: %.loc11_11.4: = access_member_action %.loc11_11.1, n [template] -// CHECK:STDOUT: %.loc11_11.5: type = type_of_inst %.loc11_11.4 [template] -// CHECK:STDOUT: %.loc11_13.2: = convert_to_value_action %.loc11_11.2, constants.%i32 [template] +// CHECK:STDOUT: %.loc11_17.4: = refine_type_action %x.ref, %T.loc4_15.1 [template] +// CHECK:STDOUT: %.loc11_17.5: = access_member_action %.loc11_17.1, n [template] +// CHECK:STDOUT: %.loc11_17.6: type = type_of_inst %.loc11_17.5 [template] +// CHECK:STDOUT: %.loc11_17.7: = convert_to_value_action %.loc11_17.2, constants.%i32 [template] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @F.loc4.%T.loc4_15.1 (%T)) -> %i32 { +// CHECK:STDOUT: fn(%x.param: @F.loc4.%T.loc4_15.1 (%T.8b3d5d.1)) -> %i32 { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @F.loc4.%T.loc4_15.1 (%T) = name_ref x, %x -// CHECK:STDOUT: %.loc11_11.1: @F.loc4.%T.loc4_15.1 (%T) = splice_inst %.loc11_11.3 -// CHECK:STDOUT: %.loc11_11.2: @F.loc4.%.loc11_11.5 (@F.loc4.%.loc11_11.5) = splice_inst %.loc11_11.4 -// CHECK:STDOUT: %.loc11_13.1: %i32 = splice_inst %.loc11_13.2 -// CHECK:STDOUT: return %.loc11_13.1 +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %n.patt: %pattern_type.7ce = binding_pattern n [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x.ref: @F.loc4.%T.loc4_15.1 (%T.8b3d5d.1) = name_ref x, %x +// CHECK:STDOUT: %.loc11_17.1: @F.loc4.%T.loc4_15.1 (%T.8b3d5d.1) = splice_inst %.loc11_17.4 +// CHECK:STDOUT: %.loc11_17.2: @F.loc4.%.loc11_17.6 (@F.loc4.%.loc11_17.6) = splice_inst %.loc11_17.5 +// CHECK:STDOUT: %.loc11_10: type = splice_block %i32.loc11 [concrete = constants.%i32] { +// CHECK:STDOUT: %int_32.loc11: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc11: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: } +// CHECK:STDOUT: %.loc11_17.3: %i32 = splice_inst %.loc11_17.7 +// CHECK:STDOUT: %n: %i32 = bind_name n, %.loc11_17.3 +// CHECK:STDOUT: %n.ref: %i32 = name_ref n, %n +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc12_10.1: = bound_method %n.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc12_10.2: = bound_method %n.ref, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc12_10.2(%n.ref) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -680,8 +770,8 @@ fn Test(e: E) { // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @F.loc4(constants.%T) { -// CHECK:STDOUT: %T.loc4_15.1 => constants.%T +// CHECK:STDOUT: specific @F.loc4(constants.%T.8b3d5d.1) { +// CHECK:STDOUT: %T.loc4_15.1 => constants.%T.8b3d5d.1 // CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dcd0a.1 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -691,9 +781,9 @@ fn Test(e: E) { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.5ba -// CHECK:STDOUT: %.loc11_11.3 => constants.%inst.as_compatible -// CHECK:STDOUT: %.loc11_11.4 => constants.%inst.splice_block.2a2 -// CHECK:STDOUT: %.loc11_11.5 => constants.%F.a8a -// CHECK:STDOUT: %.loc11_13.2 => constants.%inst.splice_block.a04 +// CHECK:STDOUT: %.loc11_17.4 => constants.%inst.as_compatible +// CHECK:STDOUT: %.loc11_17.5 => constants.%inst.splice_block.2a2 +// CHECK:STDOUT: %.loc11_17.6 => constants.%F.a8a +// CHECK:STDOUT: %.loc11_17.7 => constants.%inst.splice_block.a04 // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/generic/template/unimplemented.carbon b/toolchain/check/testdata/generic/template/unimplemented.carbon index 640ee4209731..02fe59dc1a66 100644 --- a/toolchain/check/testdata/generic/template/unimplemented.carbon +++ b/toolchain/check/testdata/generic/template/unimplemented.carbon @@ -143,7 +143,7 @@ fn F[template T:! type](x: T) { // CHECK:STDOUT: %.loc11_11.1: @F.%T.loc6_15.1 (%T) = splice_inst %.loc11_11.3 // CHECK:STDOUT: %.loc11_11.2: @F.%.loc11_11.5 (@F.%.loc11_11.5) = splice_inst %.loc11_11.4 // CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete = constants.%int_3] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -266,7 +266,7 @@ fn F[template T:! type](x: T) { // CHECK:STDOUT: %c.ref: %C = name_ref c, %c.loc11_15.2 [template = %c.loc11_15.1 (constants.%c)] // CHECK:STDOUT: %.loc16_11.1: @F.%.loc16_11.3 (@F.%.loc16_11.3) = splice_inst %.loc16_11.2 // CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete = constants.%int_3] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -285,7 +285,7 @@ fn F[template T:! type](x: T) { // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.4aeca8.1: = require_complete_type %T.8b3d5d.1 [template] +// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T.8b3d5d.1 [template] // CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete] // CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] // CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] @@ -295,6 +295,9 @@ fn F[template T:! type](x: T) { // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.impl_witness.3d8: = impl_witness imports.%Copy.impl_witness_table.000, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Copy.facet.1d5: %Copy.type = facet_value %i32, (%Copy.impl_witness.3d8) [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %Destroy.Op.type: type = fn_type @Destroy.Op [concrete] // CHECK:STDOUT: %Int.as.Destroy.impl.Op.type.11b: type = fn_type @Int.as.Destroy.impl.Op, @Int.as.Destroy.impl(%int_32) [concrete] @@ -306,8 +309,8 @@ fn F[template T:! type](x: T) { // CHECK:STDOUT: %Destroy.lookup_impl_witness: = lookup_impl_witness %T.8b3d5d.1, @Destroy [template] // CHECK:STDOUT: %Destroy.facet.572: %Destroy.type = facet_value %T.8b3d5d.1, (%Destroy.lookup_impl_witness) [template] // CHECK:STDOUT: %.f8c: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.572 [template] -// CHECK:STDOUT: %impl.elem0: %.f8c = impl_witness_access %Destroy.lookup_impl_witness, element0 [template] -// CHECK:STDOUT: %specific_impl_fn: = specific_impl_function %impl.elem0, @Destroy.Op(%Destroy.facet.572) [template] +// CHECK:STDOUT: %impl.elem0.796: %.f8c = impl_witness_access %Destroy.lookup_impl_witness, element0 [template] +// CHECK:STDOUT: %specific_impl_fn.127: = specific_impl_function %impl.elem0.796, @Destroy.Op(%Destroy.facet.572) [template] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -320,6 +323,8 @@ fn F[template T:! type](x: T) { // CHECK:STDOUT: } // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.import_ref.46d = import_ref Core//prelude/types/int, loc21_31, unloaded +// CHECK:STDOUT: %Copy.impl_witness_table.000 = impl_witness_table (%Core.import_ref.46d), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -347,15 +352,15 @@ fn F[template T:! type](x: T) { // CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc4_15.1 [template = %pattern_type (constants.%pattern_type.7dcd0a.1)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc4: = require_complete_type %T.loc4_15.1 [template = %require_complete.loc4 (constants.%require_complete.4aeca8.1)] +// CHECK:STDOUT: %require_complete.loc4: = require_complete_type %T.loc4_15.1 [template = %require_complete.loc4 (constants.%require_complete.4ae)] // CHECK:STDOUT: %ImplicitAs.type.loc14_3.2: type = facet_type <@ImplicitAs, @ImplicitAs(%T.loc4_15.1)> [template = %ImplicitAs.type.loc14_3.2 (constants.%ImplicitAs.type.dc4d8f.2)] // CHECK:STDOUT: %.loc14_3.4: = access_member_action %ImplicitAs.type.loc14_3.1, Convert [template] // CHECK:STDOUT: %.loc14_3.5: type = type_of_inst %.loc14_3.4 [template] // CHECK:STDOUT: %Destroy.lookup_impl_witness: = lookup_impl_witness %T.loc4_15.1, @Destroy [template = %Destroy.lookup_impl_witness (constants.%Destroy.lookup_impl_witness)] // CHECK:STDOUT: %Destroy.facet: %Destroy.type = facet_value %T.loc4_15.1, (%Destroy.lookup_impl_witness) [template = %Destroy.facet (constants.%Destroy.facet.572)] // CHECK:STDOUT: %.loc14_3.6: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [template = %.loc14_3.6 (constants.%.f8c)] -// CHECK:STDOUT: %impl.elem0.loc14_3.2: @F.%.loc14_3.6 (%.f8c) = impl_witness_access %Destroy.lookup_impl_witness, element0 [template = %impl.elem0.loc14_3.2 (constants.%impl.elem0)] -// CHECK:STDOUT: %specific_impl_fn.loc14_3.2: = specific_impl_function %impl.elem0.loc14_3.2, @Destroy.Op(%Destroy.facet) [template = %specific_impl_fn.loc14_3.2 (constants.%specific_impl_fn)] +// CHECK:STDOUT: %impl.elem0.loc14_3.2: @F.%.loc14_3.6 (%.f8c) = impl_witness_access %Destroy.lookup_impl_witness, element0 [template = %impl.elem0.loc14_3.2 (constants.%impl.elem0.796)] +// CHECK:STDOUT: %specific_impl_fn.loc14_3.2: = specific_impl_function %impl.elem0.loc14_3.2, @Destroy.Op(%Destroy.facet) [template = %specific_impl_fn.loc14_3.2 (constants.%specific_impl_fn.127)] // CHECK:STDOUT: %ptr: type = ptr_type %T.loc4_15.1 [template = %ptr (constants.%ptr.79f131.2)] // CHECK:STDOUT: %require_complete.loc14: = require_complete_type %ptr [template = %require_complete.loc14 (constants.%require_complete.6e5e64.2)] // CHECK:STDOUT: @@ -379,7 +384,9 @@ fn F[template T:! type](x: T) { // CHECK:STDOUT: } // CHECK:STDOUT: %w.var: ref %i32 = var %w.var_patt // CHECK:STDOUT: %x.ref: @F.%T.loc4_15.1 (%T.8b3d5d.1) = name_ref x, %x -// CHECK:STDOUT: %.loc22_3: %i32 = converted %x.ref, [concrete = ] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value constants.%i32, (constants.%Copy.impl_witness.3d8) [concrete = constants.%Copy.facet.1d5] +// CHECK:STDOUT: %.loc22_3.1: %Copy.type = converted constants.%i32, %Copy.facet [concrete = constants.%Copy.facet.1d5] +// CHECK:STDOUT: %.loc22_3.2: %i32 = converted %x.ref, [concrete = ] // CHECK:STDOUT: assign %w.var, // CHECK:STDOUT: %.loc22_10: type = splice_block %i32 [concrete = constants.%i32] { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] @@ -391,9 +398,9 @@ fn F[template T:! type](x: T) { // CHECK:STDOUT: %bound_method.loc22: = bound_method %w.var, %Int.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr.loc22: %ptr.235 = addr_of %w.var // CHECK:STDOUT: %Int.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc22(%addr.loc22) -// CHECK:STDOUT: %impl.elem0.loc14_3.1: @F.%.loc14_3.6 (%.f8c) = impl_witness_access constants.%Destroy.lookup_impl_witness, element0 [template = %impl.elem0.loc14_3.2 (constants.%impl.elem0)] +// CHECK:STDOUT: %impl.elem0.loc14_3.1: @F.%.loc14_3.6 (%.f8c) = impl_witness_access constants.%Destroy.lookup_impl_witness, element0 [template = %impl.elem0.loc14_3.2 (constants.%impl.elem0.796)] // CHECK:STDOUT: %bound_method.loc14_3.1: = bound_method %v.var, %impl.elem0.loc14_3.1 -// CHECK:STDOUT: %specific_impl_fn.loc14_3.1: = specific_impl_function %impl.elem0.loc14_3.1, @Destroy.Op(constants.%Destroy.facet.572) [template = %specific_impl_fn.loc14_3.2 (constants.%specific_impl_fn)] +// CHECK:STDOUT: %specific_impl_fn.loc14_3.1: = specific_impl_function %impl.elem0.loc14_3.1, @Destroy.Op(constants.%Destroy.facet.572) [template = %specific_impl_fn.loc14_3.2 (constants.%specific_impl_fn.127)] // CHECK:STDOUT: %bound_method.loc14_3.2: = bound_method %v.var, %specific_impl_fn.loc14_3.1 // CHECK:STDOUT: %addr.loc14: @F.%ptr (%ptr.79f131.2) = addr_of %v.var // CHECK:STDOUT: %.loc14_3.3: init %empty_tuple.type = call %bound_method.loc14_3.2(%addr.loc14) diff --git a/toolchain/check/testdata/generic/template_dependence.carbon b/toolchain/check/testdata/generic/template_dependence.carbon index 69b860a397ef..4284ab69c17d 100644 --- a/toolchain/check/testdata/generic/template_dependence.carbon +++ b/toolchain/check/testdata/generic/template_dependence.carbon @@ -2,9 +2,7 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // -// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/destroy.carbon -// TODO: Add ranges and switch to "--dump-sem-ir-ranges=only". -// EXTRA-ARGS: --dump-sem-ir-ranges=if-present +// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/convert.carbon // // AUTOUPDATE // TIP: To test this file alone, run: @@ -16,104 +14,112 @@ library "[[@TEST_NAME]]"; +//@dump-sem-ir-begin fn F[template T:! type](x: T**) -> T* { return *x; } +//@dump-sem-ir-end // --- mixed.carbon library "[[@TEST_NAME]]"; +//@dump-sem-ir-begin fn F(template T:! type, U:! type) -> (T, U) { return F(T, U); } +//@dump-sem-ir-end // CHECK:STDOUT: --- type.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0, template [template] +// CHECK:STDOUT: %T.8b3d5d.1: type = bind_symbolic_name T, 0, template [template] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %ptr.79f: type = ptr_type %T [template] -// CHECK:STDOUT: %ptr.a13: type = ptr_type %ptr.79f [template] +// CHECK:STDOUT: %ptr.79f131.1: type = ptr_type %T.8b3d5d.1 [template] +// CHECK:STDOUT: %ptr.a13: type = ptr_type %ptr.79f131.1 [template] // CHECK:STDOUT: %pattern_type.12d: type = pattern_type %ptr.a13 [template] -// CHECK:STDOUT: %pattern_type.afe: type = pattern_type %ptr.79f [template] +// CHECK:STDOUT: %pattern_type.afe393.1: type = pattern_type %ptr.79f131.1 [template] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.6e5: = require_complete_type %ptr.79f [template] +// CHECK:STDOUT: %require_complete.6e5e64.1: = require_complete_type %ptr.79f131.1 [template] // CHECK:STDOUT: %require_complete.132: = require_complete_type %ptr.a13 [template] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.lookup_impl_witness.cb2: = lookup_impl_witness %ptr.79f131.1, @Copy [template] +// CHECK:STDOUT: %Copy.facet.def: %Copy.type = facet_value %ptr.79f131.1, (%Copy.lookup_impl_witness.cb2) [template] +// CHECK:STDOUT: %.fe5: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.def [template] +// CHECK:STDOUT: %impl.elem0.429: %.fe5 = impl_witness_access %Copy.lookup_impl_witness.cb2, element0 [template] +// CHECK:STDOUT: %specific_impl_fn.d8a: = specific_impl_function %impl.elem0.429, @Copy.Op(%Copy.facet.def) [template] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core // CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0, template [concrete] -// CHECK:STDOUT: %x.patt: @F.%pattern_type.loc4_25 (%pattern_type.12d) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @F.%pattern_type.loc4_25 (%pattern_type.12d) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @F.%pattern_type.loc4_33 (%pattern_type.afe) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @F.%pattern_type.loc4_33 (%pattern_type.afe) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %x.patt: @F.%pattern_type.loc5_25 (%pattern_type.12d) = binding_pattern x [concrete] +// CHECK:STDOUT: %x.param_patt: @F.%pattern_type.loc5_25 (%pattern_type.12d) = value_param_pattern %x.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @F.%pattern_type.loc5_33 (%pattern_type.afe393.1) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @F.%pattern_type.loc5_33 (%pattern_type.afe393.1) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc4_36: type = name_ref T, %T.loc4_15.2 [template = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: %ptr.loc4_37: type = ptr_type %T.ref.loc4_36 [template = %ptr.loc4_29.1 (constants.%ptr.79f)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: %x.param: @F.%ptr.loc4_30.1 (%ptr.a13) = value_param call_param0 -// CHECK:STDOUT: %.loc4: type = splice_block %ptr.loc4_30.2 [template = %ptr.loc4_30.1 (constants.%ptr.a13)] { -// CHECK:STDOUT: %T.ref.loc4_28: type = name_ref T, %T.loc4_15.2 [template = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: %ptr.loc4_29.2: type = ptr_type %T.ref.loc4_28 [template = %ptr.loc4_29.1 (constants.%ptr.79f)] -// CHECK:STDOUT: %ptr.loc4_30.2: type = ptr_type %ptr.loc4_29.2 [template = %ptr.loc4_30.1 (constants.%ptr.a13)] +// CHECK:STDOUT: %T.ref.loc5_36: type = name_ref T, %T.loc5_15.2 [template = %T.loc5_15.1 (constants.%T.8b3d5d.1)] +// CHECK:STDOUT: %ptr.loc5_37: type = ptr_type %T.ref.loc5_36 [template = %ptr.loc5_29.1 (constants.%ptr.79f131.1)] +// CHECK:STDOUT: +// CHECK:STDOUT: %T.loc5_15.2: type = bind_symbolic_name T, 0, template [template = %T.loc5_15.1 (constants.%T.8b3d5d.1)] +// CHECK:STDOUT: %x.param: @F.%ptr.loc5_30.1 (%ptr.a13) = value_param call_param0 +// CHECK:STDOUT: %.loc5: type = splice_block %ptr.loc5_30.2 [template = %ptr.loc5_30.1 (constants.%ptr.a13)] { +// CHECK:STDOUT: %T.ref.loc5_28: type = name_ref T, %T.loc5_15.2 [template = %T.loc5_15.1 (constants.%T.8b3d5d.1)] +// CHECK:STDOUT: %ptr.loc5_29.2: type = ptr_type %T.ref.loc5_28 [template = %ptr.loc5_29.1 (constants.%ptr.79f131.1)] +// CHECK:STDOUT: %ptr.loc5_30.2: type = ptr_type %ptr.loc5_29.2 [template = %ptr.loc5_30.1 (constants.%ptr.a13)] // CHECK:STDOUT: } -// CHECK:STDOUT: %x: @F.%ptr.loc4_30.1 (%ptr.a13) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @F.%ptr.loc4_29.1 (%ptr.79f) = out_param call_param1 -// CHECK:STDOUT: %return: ref @F.%ptr.loc4_29.1 (%ptr.79f) = return_slot %return.param +// CHECK:STDOUT: %x: @F.%ptr.loc5_30.1 (%ptr.a13) = bind_name x, %x.param +// CHECK:STDOUT: %return.param: ref @F.%ptr.loc5_29.1 (%ptr.79f131.1) = out_param call_param1 +// CHECK:STDOUT: %return: ref @F.%ptr.loc5_29.1 (%ptr.79f131.1) = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F(%T.loc4_15.2: type) { -// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: %ptr.loc4_29.1: type = ptr_type %T.loc4_15.1 [template = %ptr.loc4_29.1 (constants.%ptr.79f)] -// CHECK:STDOUT: %ptr.loc4_30.1: type = ptr_type %ptr.loc4_29.1 [template = %ptr.loc4_30.1 (constants.%ptr.a13)] -// CHECK:STDOUT: %pattern_type.loc4_25: type = pattern_type %ptr.loc4_30.1 [template = %pattern_type.loc4_25 (constants.%pattern_type.12d)] -// CHECK:STDOUT: %pattern_type.loc4_33: type = pattern_type %ptr.loc4_29.1 [template = %pattern_type.loc4_33 (constants.%pattern_type.afe)] +// CHECK:STDOUT: generic fn @F(%T.loc5_15.2: type) { +// CHECK:STDOUT: %T.loc5_15.1: type = bind_symbolic_name T, 0, template [template = %T.loc5_15.1 (constants.%T.8b3d5d.1)] +// CHECK:STDOUT: %ptr.loc5_29.1: type = ptr_type %T.loc5_15.1 [template = %ptr.loc5_29.1 (constants.%ptr.79f131.1)] +// CHECK:STDOUT: %ptr.loc5_30.1: type = ptr_type %ptr.loc5_29.1 [template = %ptr.loc5_30.1 (constants.%ptr.a13)] +// CHECK:STDOUT: %pattern_type.loc5_25: type = pattern_type %ptr.loc5_30.1 [template = %pattern_type.loc5_25 (constants.%pattern_type.12d)] +// CHECK:STDOUT: %pattern_type.loc5_33: type = pattern_type %ptr.loc5_29.1 [template = %pattern_type.loc5_33 (constants.%pattern_type.afe393.1)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc4_33: = require_complete_type %ptr.loc4_29.1 [template = %require_complete.loc4_33 (constants.%require_complete.6e5)] -// CHECK:STDOUT: %require_complete.loc4_26: = require_complete_type %ptr.loc4_30.1 [template = %require_complete.loc4_26 (constants.%require_complete.132)] +// CHECK:STDOUT: %require_complete.loc5_33: = require_complete_type %ptr.loc5_29.1 [template = %require_complete.loc5_33 (constants.%require_complete.6e5e64.1)] +// CHECK:STDOUT: %require_complete.loc5_26: = require_complete_type %ptr.loc5_30.1 [template = %require_complete.loc5_26 (constants.%require_complete.132)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %ptr.loc5_29.1, @Copy [template = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.cb2)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %ptr.loc5_29.1, (%Copy.lookup_impl_witness) [template = %Copy.facet (constants.%Copy.facet.def)] +// CHECK:STDOUT: %.loc6_10.4: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [template = %.loc6_10.4 (constants.%.fe5)] +// CHECK:STDOUT: %impl.elem0.loc6_10.2: @F.%.loc6_10.4 (%.fe5) = impl_witness_access %Copy.lookup_impl_witness, element0 [template = %impl.elem0.loc6_10.2 (constants.%impl.elem0.429)] +// CHECK:STDOUT: %specific_impl_fn.loc6_10.2: = specific_impl_function %impl.elem0.loc6_10.2, @Copy.Op(%Copy.facet) [template = %specific_impl_fn.loc6_10.2 (constants.%specific_impl_fn.d8a)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @F.%ptr.loc4_30.1 (%ptr.a13)) -> @F.%ptr.loc4_29.1 (%ptr.79f) { +// CHECK:STDOUT: fn(%x.param: @F.%ptr.loc5_30.1 (%ptr.a13)) -> @F.%ptr.loc5_29.1 (%ptr.79f131.1) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @F.%ptr.loc4_30.1 (%ptr.a13) = name_ref x, %x -// CHECK:STDOUT: %.loc5_10.1: ref @F.%ptr.loc4_29.1 (%ptr.79f) = deref %x.ref -// CHECK:STDOUT: %.loc5_10.2: @F.%ptr.loc4_29.1 (%ptr.79f) = bind_value %.loc5_10.1 -// CHECK:STDOUT: return %.loc5_10.2 +// CHECK:STDOUT: %x.ref: @F.%ptr.loc5_30.1 (%ptr.a13) = name_ref x, %x +// CHECK:STDOUT: %.loc6_10.1: ref @F.%ptr.loc5_29.1 (%ptr.79f131.1) = deref %x.ref +// CHECK:STDOUT: %.loc6_10.2: @F.%ptr.loc5_29.1 (%ptr.79f131.1) = bind_value %.loc6_10.1 +// CHECK:STDOUT: %impl.elem0.loc6_10.1: @F.%.loc6_10.4 (%.fe5) = impl_witness_access constants.%Copy.lookup_impl_witness.cb2, element0 [template = %impl.elem0.loc6_10.2 (constants.%impl.elem0.429)] +// CHECK:STDOUT: %bound_method.loc6_10.1: = bound_method %.loc6_10.2, %impl.elem0.loc6_10.1 +// CHECK:STDOUT: %specific_impl_fn.loc6_10.1: = specific_impl_function %impl.elem0.loc6_10.1, @Copy.Op(constants.%Copy.facet.def) [template = %specific_impl_fn.loc6_10.2 (constants.%specific_impl_fn.d8a)] +// CHECK:STDOUT: %bound_method.loc6_10.2: = bound_method %.loc6_10.2, %specific_impl_fn.loc6_10.1 +// CHECK:STDOUT: %.loc6_10.3: init @F.%ptr.loc5_29.1 (%ptr.79f131.1) = call %bound_method.loc6_10.2(%.loc6_10.2) +// CHECK:STDOUT: return %.loc6_10.3 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T.loc4_15.1 => constants.%T -// CHECK:STDOUT: %ptr.loc4_29.1 => constants.%ptr.79f -// CHECK:STDOUT: %ptr.loc4_30.1 => constants.%ptr.a13 -// CHECK:STDOUT: %pattern_type.loc4_25 => constants.%pattern_type.12d -// CHECK:STDOUT: %pattern_type.loc4_33 => constants.%pattern_type.afe +// CHECK:STDOUT: specific @F(constants.%T.8b3d5d.1) { +// CHECK:STDOUT: %T.loc5_15.1 => constants.%T.8b3d5d.1 +// CHECK:STDOUT: %ptr.loc5_29.1 => constants.%ptr.79f131.1 +// CHECK:STDOUT: %ptr.loc5_30.1 => constants.%ptr.a13 +// CHECK:STDOUT: %pattern_type.loc5_25 => constants.%pattern_type.12d +// CHECK:STDOUT: %pattern_type.loc5_33 => constants.%pattern_type.afe393.1 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- mixed.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0, template [template] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %U: type = bind_symbolic_name U, 1 [symbolic] @@ -127,67 +133,58 @@ fn F(template T:! type, U:! type) -> (T, U) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core // CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0, template [concrete] // CHECK:STDOUT: %U.patt: %pattern_type.98f = symbolic_binding_pattern U, 1 [concrete] // CHECK:STDOUT: %return.patt: @F.%pattern_type (%pattern_type.65c) = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: @F.%pattern_type (%pattern_type.65c) = out_param_pattern %return.patt, call_param0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc4: type = name_ref T, %T.loc4_15.2 [template = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: %U.ref.loc4: type = name_ref U, %U.loc4_25.2 [symbolic = %U.loc4_25.1 (constants.%U)] -// CHECK:STDOUT: %.loc4_43.1: %tuple.type.24b = tuple_literal (%T.ref.loc4, %U.ref.loc4) -// CHECK:STDOUT: %.loc4_43.2: type = converted %.loc4_43.1, constants.%tuple.type.30b [template = %tuple.type (constants.%tuple.type.30b)] -// CHECK:STDOUT: %.Self.1: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: %.Self.2: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %U.loc4_25.2: type = bind_symbolic_name U, 1 [symbolic = %U.loc4_25.1 (constants.%U)] +// CHECK:STDOUT: %T.ref.loc5: type = name_ref T, %T.loc5_15.2 [template = %T.loc5_15.1 (constants.%T)] +// CHECK:STDOUT: %U.ref.loc5: type = name_ref U, %U.loc5_25.2 [symbolic = %U.loc5_25.1 (constants.%U)] +// CHECK:STDOUT: %.loc5_43.1: %tuple.type.24b = tuple_literal (%T.ref.loc5, %U.ref.loc5) +// CHECK:STDOUT: %.loc5_43.2: type = converted %.loc5_43.1, constants.%tuple.type.30b [template = %tuple.type (constants.%tuple.type.30b)] +// CHECK:STDOUT: +// CHECK:STDOUT: %T.loc5_15.2: type = bind_symbolic_name T, 0, template [template = %T.loc5_15.1 (constants.%T)] +// CHECK:STDOUT: +// CHECK:STDOUT: %U.loc5_25.2: type = bind_symbolic_name U, 1 [symbolic = %U.loc5_25.1 (constants.%U)] // CHECK:STDOUT: %return.param: ref @F.%tuple.type (%tuple.type.30b) = out_param call_param0 // CHECK:STDOUT: %return: ref @F.%tuple.type (%tuple.type.30b) = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F(%T.loc4_15.2: type, %U.loc4_25.2: type) { -// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0, template [template = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: %U.loc4_25.1: type = bind_symbolic_name U, 1 [symbolic = %U.loc4_25.1 (constants.%U)] -// CHECK:STDOUT: %tuple.type: type = tuple_type (%T.loc4_15.1, %U.loc4_25.1) [template = %tuple.type (constants.%tuple.type.30b)] +// CHECK:STDOUT: generic fn @F(%T.loc5_15.2: type, %U.loc5_25.2: type) { +// CHECK:STDOUT: %T.loc5_15.1: type = bind_symbolic_name T, 0, template [template = %T.loc5_15.1 (constants.%T)] +// CHECK:STDOUT: %U.loc5_25.1: type = bind_symbolic_name U, 1 [symbolic = %U.loc5_25.1 (constants.%U)] +// CHECK:STDOUT: %tuple.type: type = tuple_type (%T.loc5_15.1, %U.loc5_25.1) [template = %tuple.type (constants.%tuple.type.30b)] // CHECK:STDOUT: %pattern_type: type = pattern_type %tuple.type [template = %pattern_type (constants.%pattern_type.65c)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %tuple.type [template = %require_complete (constants.%require_complete)] -// CHECK:STDOUT: %F.specific_fn.loc5_10.2: = specific_function constants.%F, @F(%T.loc4_15.1, %U.loc4_25.1) [template = %F.specific_fn.loc5_10.2 (constants.%F.specific_fn)] +// CHECK:STDOUT: %F.specific_fn.loc6_10.2: = specific_function constants.%F, @F(%T.loc5_15.1, %U.loc5_25.1) [template = %F.specific_fn.loc6_10.2 (constants.%F.specific_fn)] // CHECK:STDOUT: // CHECK:STDOUT: fn() -> %return.param: @F.%tuple.type (%tuple.type.30b) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %T.ref.loc5: type = name_ref T, %T.loc4_15.2 [template = %T.loc4_15.1 (constants.%T)] -// CHECK:STDOUT: %U.ref.loc5: type = name_ref U, %U.loc4_25.2 [symbolic = %U.loc4_25.1 (constants.%U)] -// CHECK:STDOUT: %F.specific_fn.loc5_10.1: = specific_function %F.ref, @F(constants.%T, constants.%U) [template = %F.specific_fn.loc5_10.2 (constants.%F.specific_fn)] -// CHECK:STDOUT: %.loc4_35: ref @F.%tuple.type (%tuple.type.30b) = splice_block %return {} -// CHECK:STDOUT: %F.call: init @F.%tuple.type (%tuple.type.30b) = call %F.specific_fn.loc5_10.1() to %.loc4_35 +// CHECK:STDOUT: %T.ref.loc6: type = name_ref T, %T.loc5_15.2 [template = %T.loc5_15.1 (constants.%T)] +// CHECK:STDOUT: %U.ref.loc6: type = name_ref U, %U.loc5_25.2 [symbolic = %U.loc5_25.1 (constants.%U)] +// CHECK:STDOUT: %F.specific_fn.loc6_10.1: = specific_function %F.ref, @F(constants.%T, constants.%U) [template = %F.specific_fn.loc6_10.2 (constants.%F.specific_fn)] +// CHECK:STDOUT: %.loc5_35: ref @F.%tuple.type (%tuple.type.30b) = splice_block %return {} +// CHECK:STDOUT: %F.call: init @F.%tuple.type (%tuple.type.30b) = call %F.specific_fn.loc6_10.1() to %.loc5_35 // CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T, constants.%U) { -// CHECK:STDOUT: %T.loc4_15.1 => constants.%T -// CHECK:STDOUT: %U.loc4_25.1 => constants.%U +// CHECK:STDOUT: %T.loc5_15.1 => constants.%T +// CHECK:STDOUT: %U.loc5_25.1 => constants.%U // CHECK:STDOUT: %tuple.type => constants.%tuple.type.30b // CHECK:STDOUT: %pattern_type => constants.%pattern_type.65c // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%require_complete -// CHECK:STDOUT: %F.specific_fn.loc5_10.2 => constants.%F.specific_fn +// CHECK:STDOUT: %F.specific_fn.loc6_10.2 => constants.%F.specific_fn // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/if/basics.carbon b/toolchain/check/testdata/if/basics.carbon index aeac2dcafd92..69585793514c 100644 --- a/toolchain/check/testdata/if/basics.carbon +++ b/toolchain/check/testdata/if/basics.carbon @@ -221,10 +221,21 @@ fn VarScope(b: bool) -> bool { // CHECK:STDOUT: %If.type: type = fn_type @If [concrete] // CHECK:STDOUT: %If: %If.type = struct_value () [concrete] // CHECK:STDOUT: %false: bool = bool_literal false [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.impl_witness.09f: = impl_witness imports.%Copy.impl_witness_table.47e [concrete] +// CHECK:STDOUT: %Copy.facet.dcd: %Copy.type = facet_value bool, (%Copy.impl_witness.09f) [concrete] +// CHECK:STDOUT: %.235: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.dcd [concrete] +// CHECK:STDOUT: %bool.as.Copy.impl.Op.type: type = fn_type @bool.as.Copy.impl.Op [concrete] +// CHECK:STDOUT: %bool.as.Copy.impl.Op: %bool.as.Copy.impl.Op.type = struct_value () [concrete] +// CHECK:STDOUT: %bool.as.Copy.impl.Op.bound.082: = bound_method %false, %bool.as.Copy.impl.Op [concrete] // CHECK:STDOUT: %true: bool = bool_literal true [concrete] +// CHECK:STDOUT: %bool.as.Copy.impl.Op.bound.12b: = bound_method %true, %bool.as.Copy.impl.Op [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core.import_ref.297: %bool.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc20_31, loaded [concrete = constants.%bool.as.Copy.impl.Op] +// CHECK:STDOUT: %Copy.impl_witness_table.47e = impl_witness_table (%Core.import_ref.297), @bool.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -256,10 +267,16 @@ fn VarScope(b: bool) -> bool { // CHECK:STDOUT: // CHECK:STDOUT: !if.then: // CHECK:STDOUT: %false: bool = bool_literal false [concrete = constants.%false] -// CHECK:STDOUT: return %false +// CHECK:STDOUT: %impl.elem0.loc6: %.235 = impl_witness_access constants.%Copy.impl_witness.09f, element0 [concrete = constants.%bool.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method.loc6: = bound_method %false, %impl.elem0.loc6 [concrete = constants.%bool.as.Copy.impl.Op.bound.082] +// CHECK:STDOUT: %bool.as.Copy.impl.Op.call.loc6: init bool = call %bound_method.loc6(%false) [concrete = constants.%false] +// CHECK:STDOUT: return %bool.as.Copy.impl.Op.call.loc6 to %return // CHECK:STDOUT: // CHECK:STDOUT: !if.else: // CHECK:STDOUT: %true: bool = bool_literal true [concrete = constants.%true] -// CHECK:STDOUT: return %true +// CHECK:STDOUT: %impl.elem0.loc8: %.235 = impl_witness_access constants.%Copy.impl_witness.09f, element0 [concrete = constants.%bool.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method.loc8: = bound_method %true, %impl.elem0.loc8 [concrete = constants.%bool.as.Copy.impl.Op.bound.12b] +// CHECK:STDOUT: %bool.as.Copy.impl.Op.call.loc8: init bool = call %bound_method.loc8(%true) [concrete = constants.%true] +// CHECK:STDOUT: return %bool.as.Copy.impl.Op.call.loc8 to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/if_expr/basic.carbon b/toolchain/check/testdata/if_expr/basic.carbon index 30206fc2cead..caf5ba649e7b 100644 --- a/toolchain/check/testdata/if_expr/basic.carbon +++ b/toolchain/check/testdata/if_expr/basic.carbon @@ -27,6 +27,7 @@ fn F(b: bool, n: i32, m: i32) -> i32 { // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] @@ -36,7 +37,7 @@ fn F(b: bool, n: i32, m: i32) -> i32 { // CHECK:STDOUT: %ptr.260: type = ptr_type %array_type [concrete] // CHECK:STDOUT: %pattern_type.a98: type = pattern_type %array_type [concrete] // CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete] -// CHECK:STDOUT: %tuple.type: type = tuple_type (Core.IntLiteral) [concrete] +// CHECK:STDOUT: %tuple.type.985: type = tuple_type (Core.IntLiteral) [concrete] // CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] // CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] // CHECK:STDOUT: %ImplicitAs.type.e8c: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] @@ -54,6 +55,16 @@ fn F(b: bool, n: i32, m: i32) -> i32 { // CHECK:STDOUT: %bound_method: = bound_method %int_0.5c6, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %int_0.6a9: %i32 = int_value 0 [concrete] // CHECK:STDOUT: %array: %array_type = tuple_value (%int_0.6a9) [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.type.0e7: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%array_type) [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.d4e: %T.as.Destroy.impl.Op.type.0e7 = struct_value () [concrete] @@ -65,6 +76,7 @@ fn F(b: bool, n: i32, m: i32) -> i32 { // CHECK:STDOUT: .Bool = %Core.Bool // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... @@ -74,6 +86,9 @@ fn F(b: bool, n: i32, m: i32) -> i32 { // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -127,11 +142,11 @@ fn F(b: bool, n: i32, m: i32) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: %x.var: ref %array_type = var %x.var_patt // CHECK:STDOUT: %int_0.loc16_27: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6] -// CHECK:STDOUT: %.loc16_29.1: %tuple.type = tuple_literal (%int_0.loc16_27) -// CHECK:STDOUT: %impl.elem0: %.7ea = impl_witness_access constants.%ImplicitAs.impl_witness.acc, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.592] -// CHECK:STDOUT: %bound_method.loc16_29.1: = bound_method %int_0.loc16_27, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc16_29.2: = bound_method %int_0.loc16_27, %specific_fn [concrete = constants.%bound_method] +// CHECK:STDOUT: %.loc16_29.1: %tuple.type.985 = tuple_literal (%int_0.loc16_27) +// CHECK:STDOUT: %impl.elem0.loc16: %.7ea = impl_witness_access constants.%ImplicitAs.impl_witness.acc, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.592] +// CHECK:STDOUT: %bound_method.loc16_29.1: = bound_method %int_0.loc16_27, %impl.elem0.loc16 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] +// CHECK:STDOUT: %specific_fn.loc16: = specific_function %impl.elem0.loc16, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] +// CHECK:STDOUT: %bound_method.loc16_29.2: = bound_method %int_0.loc16_27, %specific_fn.loc16 [concrete = constants.%bound_method] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc16_29.2(%int_0.loc16_27) [concrete = constants.%int_0.6a9] // CHECK:STDOUT: %.loc16_29.2: init %i32 = converted %int_0.loc16_27, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] // CHECK:STDOUT: %int_0.loc16_29: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6] @@ -170,11 +185,16 @@ fn F(b: bool, n: i32, m: i32) -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: !if.expr.result: // CHECK:STDOUT: %.loc17_10: %i32 = block_arg !if.expr.result +// CHECK:STDOUT: %impl.elem0.loc17: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc17_10.1: = bound_method %.loc17_10, %impl.elem0.loc17 +// CHECK:STDOUT: %specific_fn.loc17: = specific_function %impl.elem0.loc17, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc17_10.2: = bound_method %.loc17_10, %specific_fn.loc17 +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc17_10.2(%.loc17_10) // CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %x.var, constants.%T.as.Destroy.impl.Op.d4e // CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function constants.%T.as.Destroy.impl.Op.d4e, @T.as.Destroy.impl.Op(constants.%array_type) [concrete = constants.%T.as.Destroy.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc16_3: = bound_method %x.var, %T.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr: %ptr.260 = addr_of %x.var // CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc16_3(%addr) -// CHECK:STDOUT: return %.loc17_10 +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/if_expr/constant_condition.carbon b/toolchain/check/testdata/if_expr/constant_condition.carbon index 58e6216f1b69..2981fc65864a 100644 --- a/toolchain/check/testdata/if_expr/constant_condition.carbon +++ b/toolchain/check/testdata/if_expr/constant_condition.carbon @@ -42,6 +42,7 @@ fn PartiallyConstant(t: type) -> i32 { // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %A.type: type = fn_type @A [concrete] @@ -73,6 +74,19 @@ fn PartiallyConstant(t: type) -> i32 { // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %true: bool = bool_literal true [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf: %ptr.as.Copy.impl.Op.type.f23 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %G.type: type = fn_type @G [concrete] // CHECK:STDOUT: %G: %G.type = struct_value () [concrete] // CHECK:STDOUT: %false: bool = bool_literal false [concrete] @@ -80,11 +94,6 @@ fn PartiallyConstant(t: type) -> i32 { // CHECK:STDOUT: %Constant: %Constant.type = struct_value () [concrete] // CHECK:STDOUT: %ptr.235: type = ptr_type %i32 [concrete] // CHECK:STDOUT: %pattern_type.fe8: type = pattern_type %ptr.235 [concrete] -// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] -// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] -// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] -// CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf: %ptr.as.Copy.impl.Op.type.f23 = struct_value () [symbolic] // CHECK:STDOUT: %Copy.impl_witness.19c: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%i32) [concrete] // CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.3ea: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%i32) [concrete] // CHECK:STDOUT: %ptr.as.Copy.impl.Op.2f4: %ptr.as.Copy.impl.Op.type.3ea = struct_value () [concrete] @@ -117,7 +126,9 @@ fn PartiallyConstant(t: type) -> i32 { // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } @@ -201,9 +212,8 @@ fn PartiallyConstant(t: type) -> i32 { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc15_25.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method.b59] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc15_25.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc15_25.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc15_25.2: %i32 = converted %int_1, %.loc15_25.1 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: return %.loc15_25.2 +// CHECK:STDOUT: %.loc15: init %i32 = converted %int_1, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: return %.loc15 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B() -> %i32 { @@ -214,9 +224,8 @@ fn PartiallyConstant(t: type) -> i32 { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc16_25.2: = bound_method %int_2, %specific_fn [concrete = constants.%bound_method.f6f] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc16_25.2(%int_2) [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc16_25.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc16_25.2: %i32 = converted %int_2, %.loc16_25.1 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: return %.loc16_25.2 +// CHECK:STDOUT: %.loc16: init %i32 = converted %int_2, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_2.ef8] +// CHECK:STDOUT: return %.loc16 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() -> %i32 { @@ -240,7 +249,12 @@ fn PartiallyConstant(t: type) -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: !if.expr.result: // CHECK:STDOUT: %.loc19_10: %i32 = block_arg !if.expr.result -// CHECK:STDOUT: return %.loc19_10 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc19_10.1: = bound_method %.loc19_10, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc19_10.2: = bound_method %.loc19_10, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc19_10.2(%.loc19_10) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G() -> %i32 { @@ -264,7 +278,12 @@ fn PartiallyConstant(t: type) -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: !if.expr.result: // CHECK:STDOUT: %.loc23_10: %i32 = block_arg !if.expr.result -// CHECK:STDOUT: return %.loc23_10 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc23_10.1: = bound_method %.loc23_10, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc23_10.2: = bound_method %.loc23_10, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc23_10.2(%.loc23_10) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Constant() -> %i32 { @@ -345,6 +364,11 @@ fn PartiallyConstant(t: type) -> i32 { // CHECK:STDOUT: %.loc29_11: %ptr.235 = bind_value %w.ref // CHECK:STDOUT: %.loc29_10.1: ref %i32 = deref %.loc29_11 // CHECK:STDOUT: %.loc29_10.2: %i32 = bind_value %.loc29_10.1 +// CHECK:STDOUT: %impl.elem0.loc29: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc29_10.1: = bound_method %.loc29_10.2, %impl.elem0.loc29 +// CHECK:STDOUT: %specific_fn.loc29: = specific_function %impl.elem0.loc29, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc29_10.2: = bound_method %.loc29_10.2, %specific_fn.loc29 +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc29_10.2(%.loc29_10.2) // CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %w.var, constants.%T.as.Destroy.impl.Op.fad // CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function constants.%T.as.Destroy.impl.Op.fad, @T.as.Destroy.impl.Op(constants.%ptr.235) [concrete = constants.%T.as.Destroy.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc28_3: = bound_method %w.var, %T.as.Destroy.impl.Op.specific_fn @@ -355,7 +379,7 @@ fn PartiallyConstant(t: type) -> i32 { // CHECK:STDOUT: %bound_method.loc27_3.3: = bound_method %v.var, %Int.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr.loc27: %ptr.235 = addr_of %v.var // CHECK:STDOUT: %Int.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc27_3.3(%addr.loc27) -// CHECK:STDOUT: return %.loc29_10.2 +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @PartiallyConstant(%t.param: type) -> %i32 { @@ -433,6 +457,11 @@ fn PartiallyConstant(t: type) -> i32 { // CHECK:STDOUT: %.loc35_11: %ptr.235 = bind_value %w.ref // CHECK:STDOUT: %.loc35_10.1: ref %i32 = deref %.loc35_11 // CHECK:STDOUT: %.loc35_10.2: %i32 = bind_value %.loc35_10.1 +// CHECK:STDOUT: %impl.elem0.loc35: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc35_10.1: = bound_method %.loc35_10.2, %impl.elem0.loc35 +// CHECK:STDOUT: %specific_fn.loc35: = specific_function %impl.elem0.loc35, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc35_10.2: = bound_method %.loc35_10.2, %specific_fn.loc35 +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc35_10.2(%.loc35_10.2) // CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %w.var, constants.%T.as.Destroy.impl.Op.fad // CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function constants.%T.as.Destroy.impl.Op.fad, @T.as.Destroy.impl.Op(constants.%ptr.235) [concrete = constants.%T.as.Destroy.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc34_3: = bound_method %w.var, %T.as.Destroy.impl.Op.specific_fn @@ -443,6 +472,6 @@ fn PartiallyConstant(t: type) -> i32 { // CHECK:STDOUT: %bound_method.loc33_3.3: = bound_method %v.var, %Int.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr.loc33: %ptr.235 = addr_of %v.var // CHECK:STDOUT: %Int.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc33_3.3(%addr.loc33) -// CHECK:STDOUT: return %.loc35_10.2 +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/if_expr/control_flow.carbon b/toolchain/check/testdata/if_expr/control_flow.carbon index 4f2babae5704..09371d316c08 100644 --- a/toolchain/check/testdata/if_expr/control_flow.carbon +++ b/toolchain/check/testdata/if_expr/control_flow.carbon @@ -25,6 +25,7 @@ fn F(b: bool) -> i32 { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %A.type: type = fn_type @A [concrete] @@ -57,6 +58,16 @@ fn F(b: bool) -> i32 { // CHECK:STDOUT: %pattern_type.831: type = pattern_type bool [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] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -64,6 +75,7 @@ fn F(b: bool) -> i32 { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs // CHECK:STDOUT: .Bool = %Core.Bool +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } @@ -72,6 +84,9 @@ fn F(b: bool) -> i32 { // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: %Core.Bool: %Bool.type = import_ref Core//prelude/parts/bool, Bool, loaded [concrete = constants.%Bool] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -128,9 +143,8 @@ fn F(b: bool) -> i32 { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc15_25.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method.b59] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc15_25.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc15_25.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc15_25.2: %i32 = converted %int_1, %.loc15_25.1 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: return %.loc15_25.2 +// CHECK:STDOUT: %.loc15: init %i32 = converted %int_1, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: return %.loc15 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B() -> %i32 { @@ -141,9 +155,8 @@ fn F(b: bool) -> i32 { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc16_25.2: = bound_method %int_2, %specific_fn [concrete = constants.%bound_method.f6f] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc16_25.2(%int_2) [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc16_25.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc16_25.2: %i32 = converted %int_2, %.loc16_25.1 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: return %.loc16_25.2 +// CHECK:STDOUT: %.loc16: init %i32 = converted %int_2, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_2.ef8] +// CHECK:STDOUT: return %.loc16 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F(%b.param: bool) -> %i32 { @@ -167,6 +180,11 @@ fn F(b: bool) -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: !if.expr.result: // CHECK:STDOUT: %.loc19_10: %i32 = block_arg !if.expr.result -// CHECK:STDOUT: return %.loc19_10 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc19_10.1: = bound_method %.loc19_10, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc19_10.2: = bound_method %.loc19_10, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc19_10.2(%.loc19_10) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/if_expr/nested.carbon b/toolchain/check/testdata/if_expr/nested.carbon index abc1cdf04be8..b40d2a1f9833 100644 --- a/toolchain/check/testdata/if_expr/nested.carbon +++ b/toolchain/check/testdata/if_expr/nested.carbon @@ -25,6 +25,7 @@ fn F(a: bool, b: bool, c: bool) -> i32 { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] @@ -58,6 +59,16 @@ fn F(a: bool, b: bool, c: bool) -> i32 { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.bound.121: = bound_method %int_4.0c1, %Core.IntLiteral.as.ImplicitAs.impl.Convert.592 [concrete] // CHECK:STDOUT: %bound_method.564: = bound_method %int_4.0c1, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %int_4.940: %i32 = int_value 4 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -65,6 +76,7 @@ fn F(a: bool, b: bool, c: bool) -> i32 { // CHECK:STDOUT: .Bool = %Core.Bool // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } @@ -73,6 +85,9 @@ fn F(a: bool, b: bool, c: bool) -> i32 { // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -190,6 +205,11 @@ fn F(a: bool, b: bool, c: bool) -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: !if.expr.result.loc16_10: // CHECK:STDOUT: %.loc16_10: %i32 = block_arg !if.expr.result.loc16_10 -// CHECK:STDOUT: return %.loc16_10 +// CHECK:STDOUT: %impl.elem0.loc16_10: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc16_10.1: = bound_method %.loc16_10, %impl.elem0.loc16_10 +// CHECK:STDOUT: %specific_fn.loc16_10: = specific_function %impl.elem0.loc16_10, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc16_10.2: = bound_method %.loc16_10, %specific_fn.loc16_10 +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc16_10.2(%.loc16_10) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/fail_impl_bad_assoc_fn.carbon b/toolchain/check/testdata/impl/fail_impl_bad_assoc_fn.carbon index eabc678c810b..f851da815f8b 100644 --- a/toolchain/check/testdata/impl/fail_impl_bad_assoc_fn.carbon +++ b/toolchain/check/testdata/impl/fail_impl_bad_assoc_fn.carbon @@ -1580,7 +1580,7 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: %b.ref: bool = name_ref b, %b.param // CHECK:STDOUT: %return.ref: ref bool = name_ref , %return.param // CHECK:STDOUT: %FMissingParam.as.J.impl.F.bound: = bound_method %self.ref, %F.ref -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @FMissingParam.as.Destroy.impl.Op(%self.param: %ptr.fc8) = "no_op"; @@ -1594,9 +1594,7 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: %b.ref: bool = name_ref b, %b.param // CHECK:STDOUT: %return.ref: ref bool = name_ref , %return.param // CHECK:STDOUT: %FMissingImplicitParam.as.J.impl.F.call: init bool = call %F.ref(%b.ref) -// CHECK:STDOUT: %.loc130_26.1: bool = value_of_initializer %FMissingImplicitParam.as.J.impl.F.call -// CHECK:STDOUT: %.loc130_26.2: bool = converted %FMissingImplicitParam.as.J.impl.F.call, %.loc130_26.1 -// CHECK:STDOUT: return %.loc130_26.2 +// CHECK:STDOUT: return %FMissingImplicitParam.as.J.impl.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @FMissingImplicitParam.as.Destroy.impl.Op(%self.param: %ptr.c3c) = "no_op"; @@ -1612,7 +1610,7 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: %FMissingReturnType.as.J.impl.F.bound: = bound_method %self.ref, %F.ref // CHECK:STDOUT: %FMissingReturnType.as.J.impl.F.call: init %empty_tuple.type = call %FMissingReturnType.as.J.impl.F.bound(%self.ref, %b.ref) // CHECK:STDOUT: %.loc152: bool = converted %FMissingReturnType.as.J.impl.F.call, [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @FMissingReturnType.as.Destroy.impl.Op(%self.param: %ptr.41e) = "no_op"; @@ -1628,9 +1626,7 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: %FDifferentParamType.as.J.impl.F.bound: = bound_method %self.ref, %F.ref // CHECK:STDOUT: %.loc103: %FDifferentParamType = converted %b.ref, [concrete = ] // CHECK:STDOUT: %FDifferentParamType.as.J.impl.F.call: init bool = call %FDifferentParamType.as.J.impl.F.bound(%self.ref, ) -// CHECK:STDOUT: %.loc171_38.1: bool = value_of_initializer %FDifferentParamType.as.J.impl.F.call -// CHECK:STDOUT: %.loc171_38.2: bool = converted %FDifferentParamType.as.J.impl.F.call, %.loc171_38.1 -// CHECK:STDOUT: return %.loc171_38.2 +// CHECK:STDOUT: return %FDifferentParamType.as.J.impl.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @FDifferentParamType.as.Destroy.impl.Op(%self.param: %ptr.f1f) = "no_op"; @@ -1646,9 +1642,7 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: %FDifferentImplicitParamType.as.J.impl.F.bound: = bound_method %self.ref, %F.ref // CHECK:STDOUT: %.loc103: %FDifferentImplicitParamType = converted %self.ref, [concrete = ] // CHECK:STDOUT: %FDifferentImplicitParamType.as.J.impl.F.call: init bool = call %FDifferentImplicitParamType.as.J.impl.F.bound(, %b.ref) -// CHECK:STDOUT: %.loc184_38.1: bool = value_of_initializer %FDifferentImplicitParamType.as.J.impl.F.call -// CHECK:STDOUT: %.loc184_38.2: bool = converted %FDifferentImplicitParamType.as.J.impl.F.call, %.loc184_38.1 -// CHECK:STDOUT: return %.loc184_38.2 +// CHECK:STDOUT: return %FDifferentImplicitParamType.as.J.impl.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @FDifferentImplicitParamType.as.Destroy.impl.Op(%self.param: %ptr.dc5) = "no_op"; @@ -1665,7 +1659,7 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: %.loc200_38.1: ref %FDifferentReturnType = temporary_storage // CHECK:STDOUT: %FDifferentReturnType.as.J.impl.F.call: init %FDifferentReturnType = call %FDifferentReturnType.as.J.impl.F.bound(%self.ref, %b.ref) to %.loc200_38.1 // CHECK:STDOUT: %.loc200_38.2: bool = converted %FDifferentReturnType.as.J.impl.F.call, [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @FDifferentReturnType.as.Destroy.impl.Op(%self.param: %ptr.954) = "no_op"; diff --git a/toolchain/check/testdata/impl/generic_redeclaration.carbon b/toolchain/check/testdata/impl/generic_redeclaration.carbon index daf8680fed12..0953f820435c 100644 --- a/toolchain/check/testdata/impl/generic_redeclaration.carbon +++ b/toolchain/check/testdata/impl/generic_redeclaration.carbon @@ -589,7 +589,7 @@ impl forall [T:! type] T as I { // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %I.type: type = facet_type <@I> [concrete] -// CHECK:STDOUT: %Self.ce4: %I.type = bind_symbolic_name Self, 0 [symbolic] +// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic] // CHECK:STDOUT: %type: type = facet_type [concrete] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] @@ -607,20 +607,13 @@ impl forall [T:! type] T as I { // CHECK:STDOUT: %T.as.I.impl.D: %T.as.I.impl.D.type = struct_value () [symbolic] // CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] // CHECK:STDOUT: %T.as.I.impl.C.specific_fn: = specific_function %T.as.I.impl.C, @T.as.I.impl.C(%T) [symbolic] -// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.type.abd: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%empty_tuple.type) [concrete] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.bae: %T.as.Destroy.impl.Op.type.abd = struct_value () [concrete] -// CHECK:STDOUT: %ptr.843: type = ptr_type %empty_tuple.type [concrete] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function %T.as.Destroy.impl.Op.bae, @T.as.Destroy.impl.Op(%empty_tuple.type) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -651,7 +644,7 @@ impl forall [T:! type] T as I { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @I { -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self.ce4] +// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self] // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .Self = %Self @@ -738,10 +731,10 @@ impl forall [T:! type] T as I { // CHECK:STDOUT: // CHECK:STDOUT: fn() -> %empty_tuple.type { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc19_26: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc19_27: %empty_tuple.type = converted %.loc19_26, %empty_tuple [concrete = constants.%empty_tuple] -// CHECK:STDOUT: return %.loc19_27 +// CHECK:STDOUT: %.loc19_26.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc19_26.2: init %empty_tuple.type = tuple_init () to %return [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc19_27: init %empty_tuple.type = converted %.loc19_26.1, %.loc19_26.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc19_27 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -754,20 +747,11 @@ impl forall [T:! type] T as I { // CHECK:STDOUT: // CHECK:STDOUT: fn() -> %empty_tuple.type { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc21_12: @T.as.I.impl.D.%T.as.I.impl.C.type (%T.as.I.impl.C.type) = specific_constant @T.as.I.impl.c81295.2.%T.as.I.impl.C.decl, @T.as.I.impl.c81295.2(constants.%T) [symbolic = %T.as.I.impl.C (constants.%T.as.I.impl.C)] -// CHECK:STDOUT: %C.ref: @T.as.I.impl.D.%T.as.I.impl.C.type (%T.as.I.impl.C.type) = name_ref C, %.loc21_12 [symbolic = %T.as.I.impl.C (constants.%T.as.I.impl.C)] +// CHECK:STDOUT: %.loc21: @T.as.I.impl.D.%T.as.I.impl.C.type (%T.as.I.impl.C.type) = specific_constant @T.as.I.impl.c81295.2.%T.as.I.impl.C.decl, @T.as.I.impl.c81295.2(constants.%T) [symbolic = %T.as.I.impl.C (constants.%T.as.I.impl.C)] +// CHECK:STDOUT: %C.ref: @T.as.I.impl.D.%T.as.I.impl.C.type (%T.as.I.impl.C.type) = name_ref C, %.loc21 [symbolic = %T.as.I.impl.C (constants.%T.as.I.impl.C)] // CHECK:STDOUT: %T.as.I.impl.C.specific_fn.loc21_12.1: = specific_function %C.ref, @T.as.I.impl.C(constants.%T) [symbolic = %T.as.I.impl.C.specific_fn.loc21_12.2 (constants.%T.as.I.impl.C.specific_fn)] // CHECK:STDOUT: %T.as.I.impl.C.call: init %empty_tuple.type = call %T.as.I.impl.C.specific_fn.loc21_12.1() -// CHECK:STDOUT: %.loc21_14.1: ref %empty_tuple.type = temporary_storage -// CHECK:STDOUT: %.loc21_14.2: ref %empty_tuple.type = temporary %.loc21_14.1, %T.as.I.impl.C.call -// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc21_15: %empty_tuple.type = converted %T.as.I.impl.C.call, %tuple [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %.loc21_14.2, constants.%T.as.Destroy.impl.Op.bae -// CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function constants.%T.as.Destroy.impl.Op.bae, @T.as.Destroy.impl.Op(constants.%empty_tuple.type) [concrete = constants.%T.as.Destroy.impl.Op.specific_fn] -// CHECK:STDOUT: %bound_method: = bound_method %.loc21_14.2, %T.as.Destroy.impl.Op.specific_fn -// CHECK:STDOUT: %addr: %ptr.843 = addr_of %.loc21_14.2 -// CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method(%addr) -// CHECK:STDOUT: return %.loc21_15 +// CHECK:STDOUT: return %T.as.I.impl.C.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/impl_assoc_const_with_prelude.carbon b/toolchain/check/testdata/impl/impl_assoc_const_with_prelude.carbon index f1db346f5edf..cf566ac656a1 100644 --- a/toolchain/check/testdata/impl/impl_assoc_const_with_prelude.carbon +++ b/toolchain/check/testdata/impl/impl_assoc_const_with_prelude.carbon @@ -269,7 +269,7 @@ impl () as I where .X = {.a = true, .b = (1, 2)} and .X = {.a = false, .b = (3, // CHECK:STDOUT: %.Self.as_type: type = facet_access_type %.Self [symbolic_self] // CHECK:STDOUT: %I.lookup_impl_witness: = lookup_impl_witness %.Self, @I [symbolic_self] // CHECK:STDOUT: %I.facet: %I.type = facet_value %.Self.as_type, (%I.lookup_impl_witness) [symbolic_self] -// CHECK:STDOUT: %impl.elem0: %struct_type.a.b.fe2 = impl_witness_access %I.lookup_impl_witness, element0 [symbolic_self] +// CHECK:STDOUT: %impl.elem0.197: %struct_type.a.b.fe2 = impl_witness_access %I.lookup_impl_witness, element0 [symbolic_self] // CHECK:STDOUT: %true: bool = bool_literal true [concrete] // CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] // CHECK:STDOUT: %int_2.ecc: Core.IntLiteral = int_value 2 [concrete] @@ -340,7 +340,7 @@ impl () as I where .X = {.a = true, .b = (1, 2)} and .X = {.a = false, .b = (3, // CHECK:STDOUT: %X.ref.loc10_20: %I.assoc_type = name_ref X, @X.%assoc0 [concrete = constants.%assoc0.e7f] // CHECK:STDOUT: %.Self.as_type.loc10_20: type = facet_access_type %.Self.ref.loc10_20 [symbolic_self = constants.%.Self.as_type] // CHECK:STDOUT: %.loc10_20: type = converted %.Self.ref.loc10_20, %.Self.as_type.loc10_20 [symbolic_self = constants.%.Self.as_type] -// CHECK:STDOUT: %impl.elem0.loc10_20: %struct_type.a.b.fe2 = impl_witness_access constants.%I.lookup_impl_witness, element0 [symbolic_self = constants.%impl.elem0] +// CHECK:STDOUT: %impl.elem0.loc10_20: %struct_type.a.b.fe2 = impl_witness_access constants.%I.lookup_impl_witness, element0 [symbolic_self = constants.%impl.elem0.197] // CHECK:STDOUT: %true: bool = bool_literal true [concrete = constants.%true] // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] // CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc] @@ -368,7 +368,7 @@ impl () as I where .X = {.a = true, .b = (1, 2)} and .X = {.a = false, .b = (3, // CHECK:STDOUT: %X.ref.loc10_54: %I.assoc_type = name_ref X, @X.%assoc0 [concrete = constants.%assoc0.e7f] // CHECK:STDOUT: %.Self.as_type.loc10_54: type = facet_access_type %.Self.ref.loc10_54 [symbolic_self = constants.%.Self.as_type] // CHECK:STDOUT: %.loc10_54: type = converted %.Self.ref.loc10_54, %.Self.as_type.loc10_54 [symbolic_self = constants.%.Self.as_type] -// CHECK:STDOUT: %impl.elem0.loc10_54: %struct_type.a.b.fe2 = impl_witness_access constants.%I.lookup_impl_witness, element0 [symbolic_self = constants.%impl.elem0] +// CHECK:STDOUT: %impl.elem0.loc10_54: %struct_type.a.b.fe2 = impl_witness_access constants.%I.lookup_impl_witness, element0 [symbolic_self = constants.%impl.elem0.197] // CHECK:STDOUT: %impl.elem0.subst: %struct_type.a.b.fe2 = impl_witness_access_substituted %impl.elem0.loc10_54, %.loc10_48.3 [concrete = constants.%struct.682] // CHECK:STDOUT: %false: bool = bool_literal false [concrete = constants.%false] // CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete = constants.%int_3.1ba] diff --git a/toolchain/check/testdata/impl/impl_thunk.carbon b/toolchain/check/testdata/impl/impl_thunk.carbon index c3d865ba6717..4a59cad0f18a 100644 --- a/toolchain/check/testdata/impl/impl_thunk.carbon +++ b/toolchain/check/testdata/impl/impl_thunk.carbon @@ -273,7 +273,7 @@ interface I { impl () as I { //@dump-sem-ir-begin - fn F[U:! type](x: U) -> U { return x; } + fn F[U:! Core.Copy](x: U) -> U { return x; } //@dump-sem-ir-end } @@ -290,13 +290,13 @@ interface I { impl () as I { //@dump-sem-ir-begin // CHECK:STDERR: fail_todo_generic_method.carbon:[[@LINE+7]]:3: error: expression cannot be used as a value [UseOfNonExprAsValue] - // CHECK:STDERR: fn F[self: (), U:! type](x: U) -> U { return x; } - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fn F[self: (), U:! Core.Copy](x: U) -> U { return x; } + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_todo_generic_method.carbon:[[@LINE-10]]:3: note: while building thunk to match the signature of this function [ThunkSignature] // CHECK:STDERR: fn F[self: Self, T:! type](x: T*) -> T*; // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: - fn F[self: (), U:! type](x: U) -> U { return x; } + fn F[self: (), U:! Core.Copy](x: U) -> U { return x; } //@dump-sem-ir-end } @@ -419,9 +419,22 @@ impl () as I({}) { // CHECK:STDOUT: %B.as.X.impl.F.c4bc28.1: %B.as.X.impl.F.type.30dea9.1 = struct_value () [concrete] // CHECK:STDOUT: %B.as.X.impl.F.type.30dea9.2: type = fn_type @B.as.X.impl.F.loc14_39.2 [concrete] // CHECK:STDOUT: %B.as.X.impl.F.c4bc28.2: %B.as.X.impl.F.type.30dea9.2 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf: %ptr.as.Copy.impl.Op.type.f23 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.b52: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%B) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.3c5: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%B) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.aa5: %ptr.as.Copy.impl.Op.type.3c5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.a1c: %Copy.type = facet_value %ptr.e79, (%Copy.impl_witness.b52) [concrete] +// CHECK:STDOUT: %.711: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.a1c [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn: = specific_function %ptr.as.Copy.impl.Op.aa5, @ptr.as.Copy.impl.Op(%B) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @B.as.X.impl: %B.ref as %X.ref { @@ -479,7 +492,12 @@ impl () as I({}) { // CHECK:STDOUT: %.loc14_39.4: ref %B = class_element_access %.loc14_39.3, element0 // CHECK:STDOUT: %addr.loc14: %ptr.e79 = addr_of %.loc14_39.4 // CHECK:STDOUT: %.loc14_39.5: %ptr.e79 = converted %B.as.X.impl.F.call, %addr.loc14 -// CHECK:STDOUT: return %.loc14_39.5 +// CHECK:STDOUT: %impl.elem0: %.711 = impl_witness_access constants.%Copy.impl_witness.b52, element0 [concrete = constants.%ptr.as.Copy.impl.Op.aa5] +// CHECK:STDOUT: %bound_method.loc14_39.1: = bound_method %.loc14_39.5, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @ptr.as.Copy.impl.Op(constants.%B) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc14_39.2: = bound_method %.loc14_39.5, %specific_fn +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.e79 = call %bound_method.loc14_39.2(%.loc14_39.5) +// CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- inheritance_value_conversion.carbon @@ -552,9 +570,22 @@ impl () as I({}) { // CHECK:STDOUT: %B.as.X.impl.F.c4bc28.1: %B.as.X.impl.F.type.30dea9.1 = struct_value () [concrete] // CHECK:STDOUT: %B.as.X.impl.F.type.30dea9.2: type = fn_type @B.as.X.impl.F.loc14_39.2 [concrete] // CHECK:STDOUT: %B.as.X.impl.F.c4bc28.2: %B.as.X.impl.F.type.30dea9.2 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf: %ptr.as.Copy.impl.Op.type.f23 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.b52: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%B) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.3c5: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%B) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.aa5: %ptr.as.Copy.impl.Op.type.3c5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.a1c: %Copy.type = facet_value %ptr.e79, (%Copy.impl_witness.b52) [concrete] +// CHECK:STDOUT: %.711: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.a1c [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn: = specific_function %ptr.as.Copy.impl.Op.aa5, @ptr.as.Copy.impl.Op(%B) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @B.as.X.impl: %B.ref as %X.ref { @@ -612,7 +643,12 @@ impl () as I({}) { // CHECK:STDOUT: %.loc14_39.4: ref %B = class_element_access %.loc14_39.3, element0 // CHECK:STDOUT: %addr.loc14: %ptr.e79 = addr_of %.loc14_39.4 // CHECK:STDOUT: %.loc14_39.5: %ptr.e79 = converted %B.as.X.impl.F.call, %addr.loc14 -// CHECK:STDOUT: return %.loc14_39.5 +// CHECK:STDOUT: %impl.elem0: %.711 = impl_witness_access constants.%Copy.impl_witness.b52, element0 [concrete = constants.%ptr.as.Copy.impl.Op.aa5] +// CHECK:STDOUT: %bound_method.loc14_39.1: = bound_method %.loc14_39.5, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @ptr.as.Copy.impl.Op(constants.%B) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc14_39.2: = bound_method %.loc14_39.5, %specific_fn +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.e79 = call %bound_method.loc14_39.2(%.loc14_39.5) +// CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_inheritance_value_conversion_copy_return.carbon @@ -676,194 +712,281 @@ impl () as I({}) { // CHECK:STDOUT: --- generic_function.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %U [symbolic] -// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.type.f02023.1: type = fn_type @empty_tuple.type.as.I.impl.F.loc10_29.1 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %U.578: %Copy.type = bind_symbolic_name U, 0 [symbolic] +// CHECK:STDOUT: %pattern_type.ce2: type = pattern_type %Copy.type [concrete] +// CHECK:STDOUT: %U.as_type.565: type = facet_access_type %U.578 [symbolic] +// CHECK:STDOUT: %pattern_type.f8cebc.1: type = pattern_type %U.as_type.565 [symbolic] +// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.type.f02023.1: type = fn_type @empty_tuple.type.as.I.impl.F.loc10_34.1 [concrete] // CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.a00f9e.1: %empty_tuple.type.as.I.impl.F.type.f02023.1 = struct_value () [concrete] // CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %ptr.79f: type = ptr_type %T.8b3 [symbolic] // CHECK:STDOUT: %pattern_type.afe: type = pattern_type %ptr.79f [symbolic] -// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.type.f02023.2: type = fn_type @empty_tuple.type.as.I.impl.F.loc10_29.2 [concrete] +// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.type.f02023.2: type = fn_type @empty_tuple.type.as.I.impl.F.loc10_34.2 [concrete] // CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.a00f9e.2: %empty_tuple.type.as.I.impl.F.type.f02023.2 = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %U [symbolic] +// CHECK:STDOUT: %require_complete.ecc136.1: = require_complete_type %U.as_type.565 [symbolic] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] // CHECK:STDOUT: %require_complete.6e5: = require_complete_type %ptr.79f [symbolic] -// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.specific_fn: = specific_function %empty_tuple.type.as.I.impl.F.a00f9e.1, @empty_tuple.type.as.I.impl.F.loc10_29.1(%ptr.79f) [symbolic] +// CHECK:STDOUT: %Copy.lookup_impl_witness.3ba2b3.2: = lookup_impl_witness %U.578, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.72ea01.2: %Copy.type = facet_value %U.as_type.565, (%Copy.lookup_impl_witness.3ba2b3.2) [symbolic] +// CHECK:STDOUT: %.671c3a.2: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.72ea01.2 [symbolic] +// CHECK:STDOUT: %impl.elem0.56eb4a.2: %.671c3a.2 = impl_witness_access %Copy.lookup_impl_witness.3ba2b3.2, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.fb70c0.2: = specific_impl_function %impl.elem0.56eb4a.2, @Copy.Op(%Copy.facet.72ea01.2) [symbolic] +// CHECK:STDOUT: %Copy.lookup_impl_witness.cb2: = lookup_impl_witness %ptr.79f, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.def: %Copy.type = facet_value %ptr.79f, (%Copy.lookup_impl_witness.cb2) [symbolic] +// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.specific_fn: = specific_function %empty_tuple.type.as.I.impl.F.a00f9e.1, @empty_tuple.type.as.I.impl.F.loc10_34.1(%Copy.facet.def) [symbolic] +// CHECK:STDOUT: %.fe5: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.def [symbolic] +// CHECK:STDOUT: %impl.elem0.429: %.fe5 = impl_witness_access %Copy.lookup_impl_witness.cb2, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.d8a: = specific_impl_function %impl.elem0.429, @Copy.Op(%Copy.facet.def) [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .Copy = %Core.Copy +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_tuple.type.as.I.impl: %.loc8_7.2 as %I.ref { -// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.decl.loc10_29.1: %empty_tuple.type.as.I.impl.F.type.f02023.1 = fn_decl @empty_tuple.type.as.I.impl.F.loc10_29.1 [concrete = constants.%empty_tuple.type.as.I.impl.F.a00f9e.1] { -// CHECK:STDOUT: %U.patt: %pattern_type.98f = symbolic_binding_pattern U, 0 [concrete] -// CHECK:STDOUT: %x.patt: @empty_tuple.type.as.I.impl.F.loc10_29.1.%pattern_type (%pattern_type.7dc) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @empty_tuple.type.as.I.impl.F.loc10_29.1.%pattern_type (%pattern_type.7dc) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @empty_tuple.type.as.I.impl.F.loc10_29.1.%pattern_type (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @empty_tuple.type.as.I.impl.F.loc10_29.1.%pattern_type (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.decl.loc10_34.1: %empty_tuple.type.as.I.impl.F.type.f02023.1 = fn_decl @empty_tuple.type.as.I.impl.F.loc10_34.1 [concrete = constants.%empty_tuple.type.as.I.impl.F.a00f9e.1] { +// CHECK:STDOUT: %U.patt: %pattern_type.ce2 = symbolic_binding_pattern U, 0 [concrete] +// CHECK:STDOUT: %x.patt: @empty_tuple.type.as.I.impl.F.loc10_34.1.%pattern_type (%pattern_type.f8cebc.1) = binding_pattern x [concrete] +// CHECK:STDOUT: %x.param_patt: @empty_tuple.type.as.I.impl.F.loc10_34.1.%pattern_type (%pattern_type.f8cebc.1) = value_param_pattern %x.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @empty_tuple.type.as.I.impl.F.loc10_34.1.%pattern_type (%pattern_type.f8cebc.1) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @empty_tuple.type.as.I.impl.F.loc10_34.1.%pattern_type (%pattern_type.f8cebc.1) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %U.ref.loc10_27: type = name_ref U, %U.loc10_8.2 [symbolic = %U.loc10_8.1 (constants.%U)] -// CHECK:STDOUT: -// CHECK:STDOUT: %U.loc10_8.2: type = bind_symbolic_name U, 0 [symbolic = %U.loc10_8.1 (constants.%U)] -// CHECK:STDOUT: %x.param: @empty_tuple.type.as.I.impl.F.loc10_29.1.%U.loc10_8.1 (%U) = value_param call_param0 -// CHECK:STDOUT: %U.ref.loc10_21: type = name_ref U, %U.loc10_8.2 [symbolic = %U.loc10_8.1 (constants.%U)] -// CHECK:STDOUT: %x: @empty_tuple.type.as.I.impl.F.loc10_29.1.%U.loc10_8.1 (%U) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @empty_tuple.type.as.I.impl.F.loc10_29.1.%U.loc10_8.1 (%U) = out_param call_param1 -// CHECK:STDOUT: %return: ref @empty_tuple.type.as.I.impl.F.loc10_29.1.%U.loc10_8.1 (%U) = return_slot %return.param +// CHECK:STDOUT: %U.ref.loc10_32: %Copy.type = name_ref U, %U.loc10_8.2 [symbolic = %U.loc10_8.1 (constants.%U.578)] +// CHECK:STDOUT: %U.as_type.loc10_32: type = facet_access_type %U.ref.loc10_32 [symbolic = %U.as_type.loc10_26.1 (constants.%U.as_type.565)] +// CHECK:STDOUT: %.loc10_32: type = converted %U.ref.loc10_32, %U.as_type.loc10_32 [symbolic = %U.as_type.loc10_26.1 (constants.%U.as_type.565)] +// CHECK:STDOUT: %.loc10_16: type = splice_block %Copy.ref [concrete = constants.%Copy.type] { +// CHECK:STDOUT: +// CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core [concrete = imports.%Core] +// CHECK:STDOUT: %Copy.ref: type = name_ref Copy, imports.%Core.Copy [concrete = constants.%Copy.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %U.loc10_8.2: %Copy.type = bind_symbolic_name U, 0 [symbolic = %U.loc10_8.1 (constants.%U.578)] +// CHECK:STDOUT: %x.param: @empty_tuple.type.as.I.impl.F.loc10_34.1.%U.as_type.loc10_26.1 (%U.as_type.565) = value_param call_param0 +// CHECK:STDOUT: %.loc10_26.1: type = splice_block %.loc10_26.2 [symbolic = %U.as_type.loc10_26.1 (constants.%U.as_type.565)] { +// CHECK:STDOUT: %U.ref.loc10_26: %Copy.type = name_ref U, %U.loc10_8.2 [symbolic = %U.loc10_8.1 (constants.%U.578)] +// CHECK:STDOUT: %U.as_type.loc10_26.2: type = facet_access_type %U.ref.loc10_26 [symbolic = %U.as_type.loc10_26.1 (constants.%U.as_type.565)] +// CHECK:STDOUT: %.loc10_26.2: type = converted %U.ref.loc10_26, %U.as_type.loc10_26.2 [symbolic = %U.as_type.loc10_26.1 (constants.%U.as_type.565)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @empty_tuple.type.as.I.impl.F.loc10_34.1.%U.as_type.loc10_26.1 (%U.as_type.565) = bind_name x, %x.param +// CHECK:STDOUT: %return.param: ref @empty_tuple.type.as.I.impl.F.loc10_34.1.%U.as_type.loc10_26.1 (%U.as_type.565) = out_param call_param1 +// CHECK:STDOUT: %return: ref @empty_tuple.type.as.I.impl.F.loc10_34.1.%U.as_type.loc10_26.1 (%U.as_type.565) = return_slot %return.param // CHECK:STDOUT: } -// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.decl.loc10_29.2: %empty_tuple.type.as.I.impl.F.type.f02023.2 = fn_decl @empty_tuple.type.as.I.impl.F.loc10_29.2 [concrete = constants.%empty_tuple.type.as.I.impl.F.a00f9e.2] { +// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.decl.loc10_34.2: %empty_tuple.type.as.I.impl.F.type.f02023.2 = fn_decl @empty_tuple.type.as.I.impl.F.loc10_34.2 [concrete = constants.%empty_tuple.type.as.I.impl.F.a00f9e.2] { // CHECK:STDOUT: // CHECK:STDOUT: } { // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !members: -// CHECK:STDOUT: .F = %empty_tuple.type.as.I.impl.F.decl.loc10_29.1 +// CHECK:STDOUT: .F = %empty_tuple.type.as.I.impl.F.decl.loc10_34.1 // CHECK:STDOUT: witness = file.%I.impl_witness // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @empty_tuple.type.as.I.impl.F.loc10_29.1(%U.loc10_8.2: type) { -// CHECK:STDOUT: %U.loc10_8.1: type = bind_symbolic_name U, 0 [symbolic = %U.loc10_8.1 (constants.%U)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %U.loc10_8.1 [symbolic = %pattern_type (constants.%pattern_type.7dc)] +// CHECK:STDOUT: generic fn @empty_tuple.type.as.I.impl.F.loc10_34.1(%U.loc10_8.2: %Copy.type) { +// CHECK:STDOUT: %U.loc10_8.1: %Copy.type = bind_symbolic_name U, 0 [symbolic = %U.loc10_8.1 (constants.%U.578)] +// CHECK:STDOUT: %U.as_type.loc10_26.1: type = facet_access_type %U.loc10_8.1 [symbolic = %U.as_type.loc10_26.1 (constants.%U.as_type.565)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %U.as_type.loc10_26.1 [symbolic = %pattern_type (constants.%pattern_type.f8cebc.1)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %U.loc10_8.1 [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: %require_complete: = require_complete_type %U.as_type.loc10_26.1 [symbolic = %require_complete (constants.%require_complete.ecc136.1)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %U.loc10_8.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.3ba2b3.2)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %U.as_type.loc10_26.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.72ea01.2)] +// CHECK:STDOUT: %.loc10_43.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc10_43.2 (constants.%.671c3a.2)] +// CHECK:STDOUT: %impl.elem0.loc10_43.2: @empty_tuple.type.as.I.impl.F.loc10_34.1.%.loc10_43.2 (%.671c3a.2) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc10_43.2 (constants.%impl.elem0.56eb4a.2)] +// CHECK:STDOUT: %specific_impl_fn.loc10_43.2: = specific_impl_function %impl.elem0.loc10_43.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc10_43.2 (constants.%specific_impl_fn.fb70c0.2)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @empty_tuple.type.as.I.impl.F.loc10_29.1.%U.loc10_8.1 (%U)) -> @empty_tuple.type.as.I.impl.F.loc10_29.1.%U.loc10_8.1 (%U) { +// CHECK:STDOUT: fn(%x.param: @empty_tuple.type.as.I.impl.F.loc10_34.1.%U.as_type.loc10_26.1 (%U.as_type.565)) -> @empty_tuple.type.as.I.impl.F.loc10_34.1.%U.as_type.loc10_26.1 (%U.as_type.565) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @empty_tuple.type.as.I.impl.F.loc10_29.1.%U.loc10_8.1 (%U) = name_ref x, %x -// CHECK:STDOUT: return %x.ref +// CHECK:STDOUT: %x.ref: @empty_tuple.type.as.I.impl.F.loc10_34.1.%U.as_type.loc10_26.1 (%U.as_type.565) = name_ref x, %x +// CHECK:STDOUT: %impl.elem0.loc10_43.1: @empty_tuple.type.as.I.impl.F.loc10_34.1.%.loc10_43.2 (%.671c3a.2) = impl_witness_access constants.%Copy.lookup_impl_witness.3ba2b3.2, element0 [symbolic = %impl.elem0.loc10_43.2 (constants.%impl.elem0.56eb4a.2)] +// CHECK:STDOUT: %bound_method.loc10_43.1: = bound_method %x.ref, %impl.elem0.loc10_43.1 +// CHECK:STDOUT: %specific_impl_fn.loc10_43.1: = specific_impl_function %impl.elem0.loc10_43.1, @Copy.Op(constants.%Copy.facet.72ea01.2) [symbolic = %specific_impl_fn.loc10_43.2 (constants.%specific_impl_fn.fb70c0.2)] +// CHECK:STDOUT: %bound_method.loc10_43.2: = bound_method %x.ref, %specific_impl_fn.loc10_43.1 +// CHECK:STDOUT: %.loc10_43.1: init @empty_tuple.type.as.I.impl.F.loc10_34.1.%U.as_type.loc10_26.1 (%U.as_type.565) = call %bound_method.loc10_43.2(%x.ref) +// CHECK:STDOUT: return %.loc10_43.1 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @empty_tuple.type.as.I.impl.F.loc10_29.2(%T.loc5_8.2: type) { +// CHECK:STDOUT: generic fn @empty_tuple.type.as.I.impl.F.loc10_34.2(%T.loc5_8.2: type) { // CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.specific_fn.loc10_29.2: = specific_function constants.%empty_tuple.type.as.I.impl.F.a00f9e.1, @empty_tuple.type.as.I.impl.F.loc10_29.1(%ptr) [symbolic = %empty_tuple.type.as.I.impl.F.specific_fn.loc10_29.2 (constants.%empty_tuple.type.as.I.impl.F.specific_fn)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %ptr, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.cb2)] +// CHECK:STDOUT: %Copy.facet.loc10_34.3: %Copy.type = facet_value %ptr, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet.loc10_34.3 (constants.%Copy.facet.def)] +// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.specific_fn.loc10_34.2: = specific_function constants.%empty_tuple.type.as.I.impl.F.a00f9e.1, @empty_tuple.type.as.I.impl.F.loc10_34.1(%Copy.facet.loc10_34.3) [symbolic = %empty_tuple.type.as.I.impl.F.specific_fn.loc10_34.2 (constants.%empty_tuple.type.as.I.impl.F.specific_fn)] // CHECK:STDOUT: // CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @empty_tuple.type.as.I.impl.F.loc10_29.2.%ptr (%ptr.79f)) -> @empty_tuple.type.as.I.impl.F.loc10_29.2.%ptr (%ptr.79f) [thunk @empty_tuple.type.as.I.impl.%empty_tuple.type.as.I.impl.F.decl.loc10_29.1] { +// CHECK:STDOUT: fn(%x.param: @empty_tuple.type.as.I.impl.F.loc10_34.2.%ptr (%ptr.79f)) -> @empty_tuple.type.as.I.impl.F.loc10_34.2.%ptr (%ptr.79f) [thunk @empty_tuple.type.as.I.impl.%empty_tuple.type.as.I.impl.F.decl.loc10_34.1] { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %F.ref: %empty_tuple.type.as.I.impl.F.type.f02023.1 = name_ref F, @empty_tuple.type.as.I.impl.%empty_tuple.type.as.I.impl.F.decl.loc10_29.1 [concrete = constants.%empty_tuple.type.as.I.impl.F.a00f9e.1] +// CHECK:STDOUT: %F.ref: %empty_tuple.type.as.I.impl.F.type.f02023.1 = name_ref F, @empty_tuple.type.as.I.impl.%empty_tuple.type.as.I.impl.F.decl.loc10_34.1 [concrete = constants.%empty_tuple.type.as.I.impl.F.a00f9e.1] // CHECK:STDOUT: -// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.specific_fn.loc10_29.1: = specific_function %F.ref, @empty_tuple.type.as.I.impl.F.loc10_29.1(constants.%ptr.79f) [symbolic = %empty_tuple.type.as.I.impl.F.specific_fn.loc10_29.2 (constants.%empty_tuple.type.as.I.impl.F.specific_fn)] -// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.call: init @empty_tuple.type.as.I.impl.F.loc10_29.2.%ptr (%ptr.79f) = call %empty_tuple.type.as.I.impl.F.specific_fn.loc10_29.1(%x.ref) -// CHECK:STDOUT: %.loc10_29.1: @empty_tuple.type.as.I.impl.F.loc10_29.2.%ptr (%ptr.79f) = value_of_initializer %empty_tuple.type.as.I.impl.F.call -// CHECK:STDOUT: %.loc10_29.2: @empty_tuple.type.as.I.impl.F.loc10_29.2.%ptr (%ptr.79f) = converted %empty_tuple.type.as.I.impl.F.call, %.loc10_29.1 -// CHECK:STDOUT: return %.loc10_29.2 +// CHECK:STDOUT: %Copy.facet.loc10_34.1: %Copy.type = facet_value constants.%ptr.79f, (constants.%Copy.lookup_impl_witness.cb2) [symbolic = %Copy.facet.loc10_34.3 (constants.%Copy.facet.def)] +// CHECK:STDOUT: %.loc10_34.1: %Copy.type = converted constants.%ptr.79f, %Copy.facet.loc10_34.1 [symbolic = %Copy.facet.loc10_34.3 (constants.%Copy.facet.def)] +// CHECK:STDOUT: %Copy.facet.loc10_34.2: %Copy.type = facet_value constants.%ptr.79f, (constants.%Copy.lookup_impl_witness.cb2) [symbolic = %Copy.facet.loc10_34.3 (constants.%Copy.facet.def)] +// CHECK:STDOUT: %.loc10_34.2: %Copy.type = converted constants.%ptr.79f, %Copy.facet.loc10_34.2 [symbolic = %Copy.facet.loc10_34.3 (constants.%Copy.facet.def)] +// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.specific_fn.loc10_34.1: = specific_function %F.ref, @empty_tuple.type.as.I.impl.F.loc10_34.1(constants.%Copy.facet.def) [symbolic = %empty_tuple.type.as.I.impl.F.specific_fn.loc10_34.2 (constants.%empty_tuple.type.as.I.impl.F.specific_fn)] +// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.call: init @empty_tuple.type.as.I.impl.F.loc10_34.2.%ptr (%ptr.79f) = call %empty_tuple.type.as.I.impl.F.specific_fn.loc10_34.1(%x.ref) +// CHECK:STDOUT: return %empty_tuple.type.as.I.impl.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @empty_tuple.type.as.I.impl.F.loc10_29.1(constants.%U) { -// CHECK:STDOUT: %U.loc10_8.1 => constants.%U -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc +// CHECK:STDOUT: specific @empty_tuple.type.as.I.impl.F.loc10_34.1(constants.%U.578) { +// CHECK:STDOUT: %U.loc10_8.1 => constants.%U.578 +// CHECK:STDOUT: %U.as_type.loc10_26.1 => constants.%U.as_type.565 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.f8cebc.1 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @empty_tuple.type.as.I.impl.F.loc10_29.2(constants.%T.8b3) { +// CHECK:STDOUT: specific @empty_tuple.type.as.I.impl.F.loc10_34.2(constants.%T.8b3) { // CHECK:STDOUT: %T.loc5_8.1 => constants.%T.8b3 // CHECK:STDOUT: %ptr => constants.%ptr.79f // CHECK:STDOUT: %pattern_type => constants.%pattern_type.afe // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @empty_tuple.type.as.I.impl.F.loc10_29.1(constants.%ptr.79f) { -// CHECK:STDOUT: %U.loc10_8.1 => constants.%ptr.79f +// CHECK:STDOUT: specific @empty_tuple.type.as.I.impl.F.loc10_34.1(constants.%Copy.facet.def) { +// CHECK:STDOUT: %U.loc10_8.1 => constants.%Copy.facet.def +// CHECK:STDOUT: %U.as_type.loc10_26.1 => constants.%ptr.79f // CHECK:STDOUT: %pattern_type => constants.%pattern_type.afe // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%require_complete.6e5 +// CHECK:STDOUT: %Copy.lookup_impl_witness => constants.%Copy.lookup_impl_witness.cb2 +// CHECK:STDOUT: %Copy.facet => constants.%Copy.facet.def +// CHECK:STDOUT: %.loc10_43.2 => constants.%.fe5 +// CHECK:STDOUT: %impl.elem0.loc10_43.2 => constants.%impl.elem0.429 +// CHECK:STDOUT: %specific_impl_fn.loc10_43.2 => constants.%specific_impl_fn.d8a // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_generic_method.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %U [symbolic] -// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.type.f02023.1: type = fn_type @empty_tuple.type.as.I.impl.F.loc19_39.1 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %U.578: %Copy.type = bind_symbolic_name U, 0 [symbolic] +// CHECK:STDOUT: %pattern_type.ce2: type = pattern_type %Copy.type [concrete] +// CHECK:STDOUT: %U.as_type.565: type = facet_access_type %U.578 [symbolic] +// CHECK:STDOUT: %pattern_type.f8cebc.1: type = pattern_type %U.as_type.565 [symbolic] +// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.type.f02023.1: type = fn_type @empty_tuple.type.as.I.impl.F.loc19_44.1 [concrete] // CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.a00f9e.1: %empty_tuple.type.as.I.impl.F.type.f02023.1 = struct_value () [concrete] // CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %ptr.79f: type = ptr_type %T.8b3 [symbolic] // CHECK:STDOUT: %pattern_type.afe: type = pattern_type %ptr.79f [symbolic] -// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.type.f02023.2: type = fn_type @empty_tuple.type.as.I.impl.F.loc19_39.2 [concrete] +// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.type.f02023.2: type = fn_type @empty_tuple.type.as.I.impl.F.loc19_44.2 [concrete] // CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.a00f9e.2: %empty_tuple.type.as.I.impl.F.type.f02023.2 = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %U [symbolic] +// CHECK:STDOUT: %require_complete.ecc136.1: = require_complete_type %U.as_type.565 [symbolic] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.lookup_impl_witness.3ba2b3.2: = lookup_impl_witness %U.578, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.72ea01.2: %Copy.type = facet_value %U.as_type.565, (%Copy.lookup_impl_witness.3ba2b3.2) [symbolic] +// CHECK:STDOUT: %.671c3a.2: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.72ea01.2 [symbolic] +// CHECK:STDOUT: %impl.elem0.56eb4a.2: %.671c3a.2 = impl_witness_access %Copy.lookup_impl_witness.3ba2b3.2, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.fb70c0.2: = specific_impl_function %impl.elem0.56eb4a.2, @Copy.Op(%Copy.facet.72ea01.2) [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .Copy = %Core.Copy +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_tuple.type.as.I.impl: %.loc10_7.2 as %I.ref { -// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.decl.loc19_39.1: %empty_tuple.type.as.I.impl.F.type.f02023.1 = fn_decl @empty_tuple.type.as.I.impl.F.loc19_39.1 [concrete = constants.%empty_tuple.type.as.I.impl.F.a00f9e.1] { +// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.decl.loc19_44.1: %empty_tuple.type.as.I.impl.F.type.f02023.1 = fn_decl @empty_tuple.type.as.I.impl.F.loc19_44.1 [concrete = constants.%empty_tuple.type.as.I.impl.F.a00f9e.1] { // CHECK:STDOUT: %self.patt: %pattern_type.cb1 = binding_pattern self [concrete] // CHECK:STDOUT: %self.param_patt: %pattern_type.cb1 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %U.patt: %pattern_type.98f = symbolic_binding_pattern U, 0 [concrete] -// CHECK:STDOUT: %x.patt: @empty_tuple.type.as.I.impl.F.loc19_39.1.%pattern_type (%pattern_type.7dc) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @empty_tuple.type.as.I.impl.F.loc19_39.1.%pattern_type (%pattern_type.7dc) = value_param_pattern %x.patt, call_param1 [concrete] -// CHECK:STDOUT: %return.patt: @empty_tuple.type.as.I.impl.F.loc19_39.1.%pattern_type (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @empty_tuple.type.as.I.impl.F.loc19_39.1.%pattern_type (%pattern_type.7dc) = out_param_pattern %return.patt, call_param2 [concrete] +// CHECK:STDOUT: %U.patt: %pattern_type.ce2 = symbolic_binding_pattern U, 0 [concrete] +// CHECK:STDOUT: %x.patt: @empty_tuple.type.as.I.impl.F.loc19_44.1.%pattern_type (%pattern_type.f8cebc.1) = binding_pattern x [concrete] +// CHECK:STDOUT: %x.param_patt: @empty_tuple.type.as.I.impl.F.loc19_44.1.%pattern_type (%pattern_type.f8cebc.1) = value_param_pattern %x.patt, call_param1 [concrete] +// CHECK:STDOUT: %return.patt: @empty_tuple.type.as.I.impl.F.loc19_44.1.%pattern_type (%pattern_type.f8cebc.1) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @empty_tuple.type.as.I.impl.F.loc19_44.1.%pattern_type (%pattern_type.f8cebc.1) = out_param_pattern %return.patt, call_param2 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %U.ref.loc19_37: type = name_ref U, %U.loc19_18.2 [symbolic = %U.loc19_18.1 (constants.%U)] +// CHECK:STDOUT: %U.ref.loc19_42: %Copy.type = name_ref U, %U.loc19_18.2 [symbolic = %U.loc19_18.1 (constants.%U.578)] +// CHECK:STDOUT: %U.as_type.loc19_42: type = facet_access_type %U.ref.loc19_42 [symbolic = %U.as_type.loc19_36.1 (constants.%U.as_type.565)] +// CHECK:STDOUT: %.loc19_42: type = converted %U.ref.loc19_42, %U.as_type.loc19_42 [symbolic = %U.as_type.loc19_36.1 (constants.%U.as_type.565)] // CHECK:STDOUT: %self.param: %empty_tuple.type = value_param call_param0 // CHECK:STDOUT: %.loc19_15.1: type = splice_block %.loc19_15.3 [concrete = constants.%empty_tuple.type] { // CHECK:STDOUT: %.loc19_15.2: %empty_tuple.type = tuple_literal () // CHECK:STDOUT: %.loc19_15.3: type = converted %.loc19_15.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] // CHECK:STDOUT: } // CHECK:STDOUT: %self: %empty_tuple.type = bind_name self, %self.param -// CHECK:STDOUT: -// CHECK:STDOUT: %U.loc19_18.2: type = bind_symbolic_name U, 0 [symbolic = %U.loc19_18.1 (constants.%U)] -// CHECK:STDOUT: %x.param: @empty_tuple.type.as.I.impl.F.loc19_39.1.%U.loc19_18.1 (%U) = value_param call_param1 -// CHECK:STDOUT: %U.ref.loc19_31: type = name_ref U, %U.loc19_18.2 [symbolic = %U.loc19_18.1 (constants.%U)] -// CHECK:STDOUT: %x: @empty_tuple.type.as.I.impl.F.loc19_39.1.%U.loc19_18.1 (%U) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @empty_tuple.type.as.I.impl.F.loc19_39.1.%U.loc19_18.1 (%U) = out_param call_param2 -// CHECK:STDOUT: %return: ref @empty_tuple.type.as.I.impl.F.loc19_39.1.%U.loc19_18.1 (%U) = return_slot %return.param +// CHECK:STDOUT: %.loc19_26: type = splice_block %Copy.ref [concrete = constants.%Copy.type] { +// CHECK:STDOUT: +// CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core [concrete = imports.%Core] +// CHECK:STDOUT: %Copy.ref: type = name_ref Copy, imports.%Core.Copy [concrete = constants.%Copy.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %U.loc19_18.2: %Copy.type = bind_symbolic_name U, 0 [symbolic = %U.loc19_18.1 (constants.%U.578)] +// CHECK:STDOUT: %x.param: @empty_tuple.type.as.I.impl.F.loc19_44.1.%U.as_type.loc19_36.1 (%U.as_type.565) = value_param call_param1 +// CHECK:STDOUT: %.loc19_36.1: type = splice_block %.loc19_36.2 [symbolic = %U.as_type.loc19_36.1 (constants.%U.as_type.565)] { +// CHECK:STDOUT: %U.ref.loc19_36: %Copy.type = name_ref U, %U.loc19_18.2 [symbolic = %U.loc19_18.1 (constants.%U.578)] +// CHECK:STDOUT: %U.as_type.loc19_36.2: type = facet_access_type %U.ref.loc19_36 [symbolic = %U.as_type.loc19_36.1 (constants.%U.as_type.565)] +// CHECK:STDOUT: %.loc19_36.2: type = converted %U.ref.loc19_36, %U.as_type.loc19_36.2 [symbolic = %U.as_type.loc19_36.1 (constants.%U.as_type.565)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @empty_tuple.type.as.I.impl.F.loc19_44.1.%U.as_type.loc19_36.1 (%U.as_type.565) = bind_name x, %x.param +// CHECK:STDOUT: %return.param: ref @empty_tuple.type.as.I.impl.F.loc19_44.1.%U.as_type.loc19_36.1 (%U.as_type.565) = out_param call_param2 +// CHECK:STDOUT: %return: ref @empty_tuple.type.as.I.impl.F.loc19_44.1.%U.as_type.loc19_36.1 (%U.as_type.565) = return_slot %return.param // CHECK:STDOUT: } -// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.decl.loc19_39.2: %empty_tuple.type.as.I.impl.F.type.f02023.2 = fn_decl @empty_tuple.type.as.I.impl.F.loc19_39.2 [concrete = constants.%empty_tuple.type.as.I.impl.F.a00f9e.2] { +// CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.decl.loc19_44.2: %empty_tuple.type.as.I.impl.F.type.f02023.2 = fn_decl @empty_tuple.type.as.I.impl.F.loc19_44.2 [concrete = constants.%empty_tuple.type.as.I.impl.F.a00f9e.2] { // CHECK:STDOUT: // CHECK:STDOUT: } { // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !members: -// CHECK:STDOUT: .F = %empty_tuple.type.as.I.impl.F.decl.loc19_39.1 +// CHECK:STDOUT: .F = %empty_tuple.type.as.I.impl.F.decl.loc19_44.1 // CHECK:STDOUT: witness = file.%I.impl_witness // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @empty_tuple.type.as.I.impl.F.loc19_39.1(%U.loc19_18.2: type) { -// CHECK:STDOUT: %U.loc19_18.1: type = bind_symbolic_name U, 0 [symbolic = %U.loc19_18.1 (constants.%U)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %U.loc19_18.1 [symbolic = %pattern_type (constants.%pattern_type.7dc)] +// CHECK:STDOUT: generic fn @empty_tuple.type.as.I.impl.F.loc19_44.1(%U.loc19_18.2: %Copy.type) { +// CHECK:STDOUT: %U.loc19_18.1: %Copy.type = bind_symbolic_name U, 0 [symbolic = %U.loc19_18.1 (constants.%U.578)] +// CHECK:STDOUT: %U.as_type.loc19_36.1: type = facet_access_type %U.loc19_18.1 [symbolic = %U.as_type.loc19_36.1 (constants.%U.as_type.565)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %U.as_type.loc19_36.1 [symbolic = %pattern_type (constants.%pattern_type.f8cebc.1)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %U.loc19_18.1 [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: %require_complete: = require_complete_type %U.as_type.loc19_36.1 [symbolic = %require_complete (constants.%require_complete.ecc136.1)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %U.loc19_18.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.3ba2b3.2)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %U.as_type.loc19_36.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.72ea01.2)] +// CHECK:STDOUT: %.loc19_53.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc19_53.2 (constants.%.671c3a.2)] +// CHECK:STDOUT: %impl.elem0.loc19_53.2: @empty_tuple.type.as.I.impl.F.loc19_44.1.%.loc19_53.2 (%.671c3a.2) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc19_53.2 (constants.%impl.elem0.56eb4a.2)] +// CHECK:STDOUT: %specific_impl_fn.loc19_53.2: = specific_impl_function %impl.elem0.loc19_53.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc19_53.2 (constants.%specific_impl_fn.fb70c0.2)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: %empty_tuple.type, %x.param: @empty_tuple.type.as.I.impl.F.loc19_39.1.%U.loc19_18.1 (%U)) -> @empty_tuple.type.as.I.impl.F.loc19_39.1.%U.loc19_18.1 (%U) { +// CHECK:STDOUT: fn(%self.param: %empty_tuple.type, %x.param: @empty_tuple.type.as.I.impl.F.loc19_44.1.%U.as_type.loc19_36.1 (%U.as_type.565)) -> @empty_tuple.type.as.I.impl.F.loc19_44.1.%U.as_type.loc19_36.1 (%U.as_type.565) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @empty_tuple.type.as.I.impl.F.loc19_39.1.%U.loc19_18.1 (%U) = name_ref x, %x -// CHECK:STDOUT: return %x.ref +// CHECK:STDOUT: %x.ref: @empty_tuple.type.as.I.impl.F.loc19_44.1.%U.as_type.loc19_36.1 (%U.as_type.565) = name_ref x, %x +// CHECK:STDOUT: %impl.elem0.loc19_53.1: @empty_tuple.type.as.I.impl.F.loc19_44.1.%.loc19_53.2 (%.671c3a.2) = impl_witness_access constants.%Copy.lookup_impl_witness.3ba2b3.2, element0 [symbolic = %impl.elem0.loc19_53.2 (constants.%impl.elem0.56eb4a.2)] +// CHECK:STDOUT: %bound_method.loc19_53.1: = bound_method %x.ref, %impl.elem0.loc19_53.1 +// CHECK:STDOUT: %specific_impl_fn.loc19_53.1: = specific_impl_function %impl.elem0.loc19_53.1, @Copy.Op(constants.%Copy.facet.72ea01.2) [symbolic = %specific_impl_fn.loc19_53.2 (constants.%specific_impl_fn.fb70c0.2)] +// CHECK:STDOUT: %bound_method.loc19_53.2: = bound_method %x.ref, %specific_impl_fn.loc19_53.1 +// CHECK:STDOUT: %.loc19_53.1: init @empty_tuple.type.as.I.impl.F.loc19_44.1.%U.as_type.loc19_36.1 (%U.as_type.565) = call %bound_method.loc19_53.2(%x.ref) +// CHECK:STDOUT: return %.loc19_53.1 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @empty_tuple.type.as.I.impl.F.loc19_39.2(%T.loc5_20.2: type) { +// CHECK:STDOUT: generic fn @empty_tuple.type.as.I.impl.F.loc19_44.2(%T.loc5_20.2: type) { // CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: %empty_tuple.type, %x.param: @empty_tuple.type.as.I.impl.F.loc19_39.2.%ptr (%ptr.79f)) -> @empty_tuple.type.as.I.impl.F.loc19_39.2.%ptr (%ptr.79f) [thunk @empty_tuple.type.as.I.impl.%empty_tuple.type.as.I.impl.F.decl.loc19_39.1] { +// CHECK:STDOUT: fn(%self.param: %empty_tuple.type, %x.param: @empty_tuple.type.as.I.impl.F.loc19_44.2.%ptr (%ptr.79f)) -> @empty_tuple.type.as.I.impl.F.loc19_44.2.%ptr (%ptr.79f) [thunk @empty_tuple.type.as.I.impl.%empty_tuple.type.as.I.impl.F.decl.loc19_44.1] { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %F.ref: %empty_tuple.type.as.I.impl.F.type.f02023.1 = name_ref F, @empty_tuple.type.as.I.impl.%empty_tuple.type.as.I.impl.F.decl.loc19_39.1 [concrete = constants.%empty_tuple.type.as.I.impl.F.a00f9e.1] +// CHECK:STDOUT: %F.ref: %empty_tuple.type.as.I.impl.F.type.f02023.1 = name_ref F, @empty_tuple.type.as.I.impl.%empty_tuple.type.as.I.impl.F.decl.loc19_44.1 [concrete = constants.%empty_tuple.type.as.I.impl.F.a00f9e.1] // CHECK:STDOUT: -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @empty_tuple.type.as.I.impl.F.loc19_39.1(constants.%U) { -// CHECK:STDOUT: %U.loc19_18.1 => constants.%U -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc +// CHECK:STDOUT: specific @empty_tuple.type.as.I.impl.F.loc19_44.1(constants.%U.578) { +// CHECK:STDOUT: %U.loc19_18.1 => constants.%U.578 +// CHECK:STDOUT: %U.as_type.loc19_36.1 => constants.%U.as_type.565 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.f8cebc.1 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @empty_tuple.type.as.I.impl.F.loc19_39.2(constants.%T.8b3) { +// CHECK:STDOUT: specific @empty_tuple.type.as.I.impl.F.loc19_44.2(constants.%T.8b3) { // CHECK:STDOUT: %T.loc5_20.1 => constants.%T.8b3 // CHECK:STDOUT: %ptr => constants.%ptr.79f // CHECK:STDOUT: %pattern_type => constants.%pattern_type.afe diff --git a/toolchain/check/testdata/impl/import_builtin_call.carbon b/toolchain/check/testdata/impl/import_builtin_call.carbon index 14bbc66a404c..ae3ad4ec6e18 100644 --- a/toolchain/check/testdata/impl/import_builtin_call.carbon +++ b/toolchain/check/testdata/impl/import_builtin_call.carbon @@ -363,9 +363,7 @@ var n: Int(64) = MakeFromClass(FromLiteral(64) as OtherInt); // CHECK:STDOUT: %specific_impl_fn.loc20_11.1: = specific_impl_function %impl.elem0.loc20_11.1, @Add.Op(constants.%Add.facet.1d5) [symbolic = %specific_impl_fn.loc20_11.2 (constants.%specific_impl_fn)] // CHECK:STDOUT: %bound_method.loc20_22: = bound_method %x.ref.loc20_10, %specific_impl_fn.loc20_11.1 // CHECK:STDOUT: %.loc20_22.3: init @Double.%MyInt.loc19_39.1 (%MyInt) = call %bound_method.loc20_22(%x.ref.loc20_10, %x.ref.loc20_21) -// CHECK:STDOUT: %.loc20_23.1: @Double.%MyInt.loc19_39.1 (%MyInt) = value_of_initializer %.loc20_22.3 -// CHECK:STDOUT: %.loc20_23.2: @Double.%MyInt.loc19_39.1 (%MyInt) = converted %.loc20_22.3, %.loc20_23.1 -// CHECK:STDOUT: return %.loc20_23.2 +// CHECK:STDOUT: return %.loc20_22.3 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -592,9 +590,7 @@ var n: Int(64) = MakeFromClass(FromLiteral(64) as OtherInt); // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @MyInt.as.Add.impl.Op(constants.%int_64) [concrete = constants.%MyInt.as.Add.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc9_22: = bound_method %x.ref.loc9_10, %specific_fn // CHECK:STDOUT: %MyInt.as.Add.impl.Op.call: init %MyInt.f30 = call %bound_method.loc9_22(%x.ref.loc9_10, %x.ref.loc9_21) -// CHECK:STDOUT: %.loc9_23.1: %MyInt.f30 = value_of_initializer %MyInt.as.Add.impl.Op.call -// CHECK:STDOUT: %.loc9_23.2: %MyInt.f30 = converted %MyInt.as.Add.impl.Op.call, %.loc9_23.1 -// CHECK:STDOUT: return %.loc9_23.2 +// CHECK:STDOUT: return %MyInt.as.Add.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Add.Op(imports.%Main.import_ref.2a7: %Add.type) [from "generic_impl.carbon"] { @@ -621,9 +617,7 @@ var n: Int(64) = MakeFromClass(FromLiteral(64) as OtherInt); // CHECK:STDOUT: %n.ref: %MyInt.f30 = name_ref n, %n // CHECK:STDOUT: %Double.specific_fn: = specific_function %Double.ref, @Double(constants.%int_64) [concrete = constants.%Double.specific_fn] // CHECK:STDOUT: %Double.call: init %MyInt.f30 = call %Double.specific_fn(%n.ref) -// CHECK:STDOUT: %.loc13_19.1: %MyInt.f30 = value_of_initializer %Double.call -// CHECK:STDOUT: %.loc13_19.2: %MyInt.f30 = converted %Double.call, %.loc13_19.1 -// CHECK:STDOUT: return %.loc13_19.2 +// CHECK:STDOUT: return %Double.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Double(imports.%Main.import_ref.f1e294.4: Core.IntLiteral) [from "generic_impl.carbon"] { @@ -979,9 +973,7 @@ var n: Int(64) = MakeFromClass(FromLiteral(64) as OtherInt); // CHECK:STDOUT: %N.ref.loc9_57: %i32.builtin = name_ref N, %N.loc9_9.2 [symbolic = %N.loc9_9.1 (constants.%N.987)] // CHECK:STDOUT: %Make.specific_fn.loc9_52.1: = specific_function %Make.ref, @Make(constants.%N.987) [symbolic = %Make.specific_fn.loc9_52.2 (constants.%Make.specific_fn)] // CHECK:STDOUT: %Make.call: init @Make.%iN.builtin (%iN.builtin.016) = call %Make.specific_fn.loc9_52.1() -// CHECK:STDOUT: %.loc9_59.1: @Make.%iN.builtin (%iN.builtin.016) = value_of_initializer %Make.call -// CHECK:STDOUT: %.loc9_59.2: @Make.%iN.builtin (%iN.builtin.016) = converted %Make.call, %.loc9_59.1 -// CHECK:STDOUT: return %.loc9_59.2 +// CHECK:STDOUT: return %Make.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1004,9 +996,7 @@ var n: Int(64) = MakeFromClass(FromLiteral(64) as OtherInt); // CHECK:STDOUT: %N.ref.loc18_77: %OtherInt = name_ref N, %N.loc18_18.2 [symbolic = %N.loc18_18.1 (constants.%N.335)] // CHECK:STDOUT: %MakeFromClass.specific_fn.loc18_63.1: = specific_function %MakeFromClass.ref, @MakeFromClass(constants.%N.335) [symbolic = %MakeFromClass.specific_fn.loc18_63.2 (constants.%MakeFromClass.specific_fn)] // CHECK:STDOUT: %MakeFromClass.call: init @MakeFromClass.%iN.builtin (%iN.builtin.9ef) = call %MakeFromClass.specific_fn.loc18_63.1() -// CHECK:STDOUT: %.loc18_79.1: @MakeFromClass.%iN.builtin (%iN.builtin.9ef) = value_of_initializer %MakeFromClass.call -// CHECK:STDOUT: %.loc18_79.2: @MakeFromClass.%iN.builtin (%iN.builtin.9ef) = converted %MakeFromClass.call, %.loc18_79.1 -// CHECK:STDOUT: return %.loc18_79.2 +// CHECK:STDOUT: return %MakeFromClass.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1086,7 +1076,7 @@ var n: Int(64) = MakeFromClass(FromLiteral(64) as OtherInt); // CHECK:STDOUT: %Main.MakeFromClass: %MakeFromClass.type = import_ref Main//convert_symbolic, MakeFromClass, loaded [concrete = constants.%MakeFromClass] // CHECK:STDOUT: %Main.import_ref.85e: %i32.builtin = import_ref Main//convert_symbolic, loc9_9, loaded [symbolic = @Make.%N (constants.%N.987)] // CHECK:STDOUT: %Main.import_ref.b03: = import_ref Main//convert_symbolic, loc14_1, loaded [concrete = constants.%complete_type.f8a] -// CHECK:STDOUT: %Main.import_ref.d11 = import_ref Main//convert_symbolic, inst135 [no loc], unloaded +// CHECK:STDOUT: %Main.import_ref.d11 = import_ref Main//convert_symbolic, inst133 [no loc], unloaded // CHECK:STDOUT: %Main.import_ref.8f7 = import_ref Main//convert_symbolic, loc13_45, unloaded // CHECK:STDOUT: %Main.import_ref.77d: %OtherInt = import_ref Main//convert_symbolic, loc18_18, loaded [symbolic = @MakeFromClass.%N (constants.%N.335)] // CHECK:STDOUT: } diff --git a/toolchain/check/testdata/impl/import_self.carbon b/toolchain/check/testdata/impl/import_self.carbon index 8a5de4c2e057..1358198309f0 100644 --- a/toolchain/check/testdata/impl/import_self.carbon +++ b/toolchain/check/testdata/impl/import_self.carbon @@ -120,11 +120,11 @@ fn F(x: (), y: ()) -> () { // CHECK:STDOUT: constants { // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Add.type: type = facet_type <@Add> [concrete] -// CHECK:STDOUT: %Self.365: %Add.type = bind_symbolic_name Self, 0 [symbolic] +// CHECK:STDOUT: %Self: %Add.type = bind_symbolic_name Self, 0 [symbolic] // CHECK:STDOUT: %Add.Op.type: type = fn_type @Add.Op [concrete] // CHECK:STDOUT: %Add.Op: %Add.Op.type = struct_value () [concrete] -// CHECK:STDOUT: %Self.as_type.3c7: type = facet_access_type %Self.365 [symbolic] -// CHECK:STDOUT: %pattern_type.2f8: type = pattern_type %Self.as_type.3c7 [symbolic] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic] +// CHECK:STDOUT: %pattern_type.2f8: type = pattern_type %Self.as_type [symbolic] // CHECK:STDOUT: %Add.impl_witness: = impl_witness file.%Add.impl_witness_table [concrete] // CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] // CHECK:STDOUT: %empty_tuple.type.as.Add.impl.Op.type: type = fn_type @empty_tuple.type.as.Add.impl.Op [concrete] @@ -134,28 +134,21 @@ fn F(x: (), y: ()) -> () { // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %Add.assoc_type: type = assoc_entity_type @Add [concrete] -// CHECK:STDOUT: %assoc0.5ca: %Add.assoc_type = assoc_entity element0, imports.%Main.import_ref.5a3 [concrete] +// CHECK:STDOUT: %assoc0: %Add.assoc_type = assoc_entity element0, imports.%Main.import_ref.5a3 [concrete] // CHECK:STDOUT: %.589: type = fn_type_with_self_type %Add.Op.type, %Add.facet [concrete] -// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.type.abd: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%empty_tuple.type) [concrete] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.bae: %T.as.Destroy.impl.Op.type.abd = struct_value () [concrete] -// CHECK:STDOUT: %ptr.843: type = ptr_type %empty_tuple.type [concrete] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function %T.as.Destroy.impl.Op.bae, @T.as.Destroy.impl.Op(%empty_tuple.type) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.Add: type = import_ref Main//a, Add, loaded [concrete = constants.%Add.type] // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Main.import_ref.ff9 = import_ref Main//a, inst19 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.f99: %Add.assoc_type = import_ref Main//a, loc5_41, loaded [concrete = constants.%assoc0.5ca] +// CHECK:STDOUT: %Main.import_ref.f99: %Add.assoc_type = import_ref Main//a, loc5_41, loaded [concrete = constants.%assoc0] // CHECK:STDOUT: %Main.Op: %Add.Op.type = import_ref Main//a, Op, loaded [concrete = constants.%Add.Op] -// CHECK:STDOUT: %Main.import_ref.2a7: %Add.type = import_ref Main//a, inst19 [no loc], loaded [symbolic = constants.%Self.365] +// CHECK:STDOUT: %Main.import_ref.2a7: %Add.type = import_ref Main//a, inst19 [no loc], loaded [symbolic = constants.%Self] // CHECK:STDOUT: %Main.import_ref.5a3: %Add.Op.type = import_ref Main//a, loc5_41, loaded [concrete = constants.%Add.Op] -// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -233,8 +226,8 @@ fn F(x: (), y: ()) -> () { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Add.Op(imports.%Main.import_ref.2a7: %Add.type) [from "a.carbon"] { -// CHECK:STDOUT: %Self: %Add.type = bind_symbolic_name Self, 0 [symbolic = %Self (constants.%Self.365)] -// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.3c7)] +// CHECK:STDOUT: %Self: %Add.type = bind_symbolic_name Self, 0 [symbolic = %Self (constants.%Self)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type)] // CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type [symbolic = %pattern_type (constants.%pattern_type.2f8)] // CHECK:STDOUT: // CHECK:STDOUT: fn; @@ -242,36 +235,27 @@ fn F(x: (), y: ()) -> () { // CHECK:STDOUT: // CHECK:STDOUT: fn @empty_tuple.type.as.Add.impl.Op(%self.param: %empty_tuple.type, %other.param: %empty_tuple.type) -> %empty_tuple.type { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc7_52: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc7_53: %empty_tuple.type = converted %.loc7_52, %empty_tuple [concrete = constants.%empty_tuple] -// CHECK:STDOUT: return %.loc7_53 +// CHECK:STDOUT: %.loc7_52.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc7_52.2: init %empty_tuple.type = tuple_init () to %return [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc7_53: init %empty_tuple.type = converted %.loc7_52.1, %.loc7_52.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc7_53 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F(%x.param: %empty_tuple.type, %y.param: %empty_tuple.type) -> %empty_tuple.type { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %x.ref: %empty_tuple.type = name_ref x, %x // CHECK:STDOUT: %Add.ref: type = name_ref Add, imports.%Main.Add [concrete = constants.%Add.type] -// CHECK:STDOUT: %Op.ref: %Add.assoc_type = name_ref Op, imports.%Main.import_ref.f99 [concrete = constants.%assoc0.5ca] +// CHECK:STDOUT: %Op.ref: %Add.assoc_type = name_ref Op, imports.%Main.import_ref.f99 [concrete = constants.%assoc0] // CHECK:STDOUT: %impl.elem0: %.589 = impl_witness_access constants.%Add.impl_witness, element0 [concrete = constants.%empty_tuple.type.as.Add.impl.Op] -// CHECK:STDOUT: %bound_method.loc11_11: = bound_method %x.ref, %impl.elem0 +// CHECK:STDOUT: %bound_method: = bound_method %x.ref, %impl.elem0 // CHECK:STDOUT: %y.ref: %empty_tuple.type = name_ref y, %y -// CHECK:STDOUT: %empty_tuple.type.as.Add.impl.Op.call: init %empty_tuple.type = call %bound_method.loc11_11(%x.ref, %y.ref) -// CHECK:STDOUT: %.loc11_22.1: ref %empty_tuple.type = temporary_storage -// CHECK:STDOUT: %.loc11_22.2: ref %empty_tuple.type = temporary %.loc11_22.1, %empty_tuple.type.as.Add.impl.Op.call -// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc11_23: %empty_tuple.type = converted %empty_tuple.type.as.Add.impl.Op.call, %tuple [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %.loc11_22.2, constants.%T.as.Destroy.impl.Op.bae -// CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function constants.%T.as.Destroy.impl.Op.bae, @T.as.Destroy.impl.Op(constants.%empty_tuple.type) [concrete = constants.%T.as.Destroy.impl.Op.specific_fn] -// CHECK:STDOUT: %bound_method.loc11_22: = bound_method %.loc11_22.2, %T.as.Destroy.impl.Op.specific_fn -// CHECK:STDOUT: %addr: %ptr.843 = addr_of %.loc11_22.2 -// CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc11_22(%addr) -// CHECK:STDOUT: return %.loc11_23 +// CHECK:STDOUT: %empty_tuple.type.as.Add.impl.Op.call: init %empty_tuple.type = call %bound_method(%x.ref, %y.ref) +// CHECK:STDOUT: return %empty_tuple.type.as.Add.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Add.Op(constants.%Self.365) { -// CHECK:STDOUT: %Self => constants.%Self.365 -// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.3c7 +// CHECK:STDOUT: specific @Add.Op(constants.%Self) { +// CHECK:STDOUT: %Self => constants.%Self +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type // CHECK:STDOUT: %pattern_type => constants.%pattern_type.2f8 // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/lookup/find_in_final.carbon b/toolchain/check/testdata/impl/lookup/find_in_final.carbon index 95e498867ed7..381a192b783b 100644 --- a/toolchain/check/testdata/impl/lookup/find_in_final.carbon +++ b/toolchain/check/testdata/impl/lookup/find_in_final.carbon @@ -103,14 +103,14 @@ class D(T:! J) { var c: C(T)*; } -fn F(T:! I & J) -> T.(I.X) { +fn F(T:! I & J) -> T.(I.X)* { var x: C(T); var y: D(T); // The witness for `I` found here directly, and inside `D` from a FacetValue // come from the same facet, the `T` binding in the params of F, so they // should be compatible. y.c = &x; - return (*y.c).b; + return &(*y.c).b; } // --- todo_fail_facet_value_rewrite_incompatible_with_final_impl.carbon diff --git a/toolchain/check/testdata/impl/lookup/generic.carbon b/toolchain/check/testdata/impl/lookup/generic.carbon index 35ac3a8045ed..de3a3cfb2195 100644 --- a/toolchain/check/testdata/impl/lookup/generic.carbon +++ b/toolchain/check/testdata/impl/lookup/generic.carbon @@ -2,7 +2,7 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // -// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/destroy.carbon +// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/convert.carbon // TODO: Add ranges and switch to "--dump-sem-ir-ranges=only". // EXTRA-ARGS: --dump-sem-ir-ranges=if-present // @@ -36,11 +36,11 @@ interface HasF { fn F[self: Self]() -> Self; } -impl forall [T:! type] T as HasF { - fn F[self: Self]() -> T { return self; } +impl forall [T:! type] T* as HasF { + fn F[self: Self]() -> T* { return self; } } -fn G(x: {}) -> {} { +fn G(x: {}*) -> {}* { return x.(HasF.F)(); } @@ -331,46 +331,58 @@ fn G(x: A) { // CHECK:STDOUT: %Self.as_type.978: type = facet_access_type %Self.fc4 [symbolic] // CHECK:STDOUT: %pattern_type.7c4: type = pattern_type %Self.as_type.978 [symbolic] // CHECK:STDOUT: %HasF.F.type: type = fn_type @HasF.F [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %HasF.F: %HasF.F.type = struct_value () [concrete] // CHECK:STDOUT: %HasF.assoc_type: type = assoc_entity_type @HasF [concrete] // CHECK:STDOUT: %assoc0.97a: %HasF.assoc_type = assoc_entity element0, @HasF.%HasF.F.decl [concrete] // CHECK:STDOUT: %type: type = facet_type [concrete] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %HasF.impl_witness.672: = impl_witness file.%HasF.impl_witness_table, @T.as.HasF.impl(%T) [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %T.as.HasF.impl.F.type.b56: type = fn_type @T.as.HasF.impl.F, @T.as.HasF.impl(%T) [symbolic] -// CHECK:STDOUT: %T.as.HasF.impl.F.343: %T.as.HasF.impl.F.type.b56 = struct_value () [symbolic] -// CHECK:STDOUT: %HasF.facet.bac: %HasF.type = facet_value %T, (%HasF.impl_witness.672) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] +// CHECK:STDOUT: %ptr.79f: type = ptr_type %T.8b3 [symbolic] +// CHECK:STDOUT: %HasF.impl_witness.50b: = impl_witness file.%HasF.impl_witness_table, @ptr.as.HasF.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %pattern_type.afe: type = pattern_type %ptr.79f [symbolic] +// CHECK:STDOUT: %ptr.as.HasF.impl.F.type.c51: type = fn_type @ptr.as.HasF.impl.F, @ptr.as.HasF.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.as.HasF.impl.F.7b7: %ptr.as.HasF.impl.F.type.c51 = struct_value () [symbolic] +// CHECK:STDOUT: %HasF.facet.f29: %HasF.type = facet_value %ptr.79f, (%HasF.impl_witness.50b) [symbolic] +// CHECK:STDOUT: %require_complete.6e5: = require_complete_type %ptr.79f [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf: %ptr.as.Copy.impl.Op.type.f23 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.lookup_impl_witness.cb2: = lookup_impl_witness %ptr.79f, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.def: %Copy.type = facet_value %ptr.79f, (%Copy.lookup_impl_witness.cb2) [symbolic] +// CHECK:STDOUT: %.fe5: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.def [symbolic] +// CHECK:STDOUT: %impl.elem0.429: %.fe5 = impl_witness_access %Copy.lookup_impl_witness.cb2, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.d8a: = specific_impl_function %impl.elem0.429, @Copy.Op(%Copy.facet.def) [symbolic] // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %pattern_type.a96: type = pattern_type %empty_struct_type [concrete] +// CHECK:STDOUT: %ptr.c28: type = ptr_type %empty_struct_type [concrete] +// CHECK:STDOUT: %pattern_type.1cc: type = pattern_type %ptr.c28 [concrete] // CHECK:STDOUT: %G.type: type = fn_type @G [concrete] // CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %HasF.impl_witness.b6e: = impl_witness file.%HasF.impl_witness_table, @T.as.HasF.impl(%empty_struct_type) [concrete] -// CHECK:STDOUT: %T.as.HasF.impl.F.type.61c: type = fn_type @T.as.HasF.impl.F, @T.as.HasF.impl(%empty_struct_type) [concrete] -// CHECK:STDOUT: %T.as.HasF.impl.F.cd5: %T.as.HasF.impl.F.type.61c = struct_value () [concrete] -// CHECK:STDOUT: %HasF.facet.e55: %HasF.type = facet_value %empty_struct_type, (%HasF.impl_witness.b6e) [concrete] -// CHECK:STDOUT: %.b41: type = fn_type_with_self_type %HasF.F.type, %HasF.facet.e55 [concrete] -// CHECK:STDOUT: %T.as.HasF.impl.F.specific_fn: = specific_function %T.as.HasF.impl.F.cd5, @T.as.HasF.impl.F(%empty_struct_type) [concrete] -// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete] -// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.type.456: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%empty_struct_type) [concrete] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.24b: %T.as.Destroy.impl.Op.type.456 = struct_value () [concrete] -// CHECK:STDOUT: %ptr.c28: type = ptr_type %empty_struct_type [concrete] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function %T.as.Destroy.impl.Op.24b, @T.as.Destroy.impl.Op(%empty_struct_type) [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] +// CHECK:STDOUT: %HasF.impl_witness.d89: = impl_witness file.%HasF.impl_witness_table, @ptr.as.HasF.impl(%empty_struct_type) [concrete] +// CHECK:STDOUT: %ptr.as.HasF.impl.F.type.df2: type = fn_type @ptr.as.HasF.impl.F, @ptr.as.HasF.impl(%empty_struct_type) [concrete] +// CHECK:STDOUT: %ptr.as.HasF.impl.F.b9c: %ptr.as.HasF.impl.F.type.df2 = struct_value () [concrete] +// CHECK:STDOUT: %HasF.facet.a16: %HasF.type = facet_value %ptr.c28, (%HasF.impl_witness.d89) [concrete] +// CHECK:STDOUT: %.9b4: type = fn_type_with_self_type %HasF.F.type, %HasF.facet.a16 [concrete] +// CHECK:STDOUT: %ptr.as.HasF.impl.F.specific_fn: = specific_function %ptr.as.HasF.impl.F.b9c, @ptr.as.HasF.impl.F(%empty_struct_type) [concrete] +// CHECK:STDOUT: %complete_type: = complete_type_witness %ptr.c28 [concrete] +// CHECK:STDOUT: %Copy.impl_witness.bca: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%empty_struct_type) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.fc8: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%empty_struct_type) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.f47: %ptr.as.Copy.impl.Op.type.fc8 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.968: %Copy.type = facet_value %ptr.c28, (%Copy.impl_witness.bca) [concrete] +// CHECK:STDOUT: %.f28: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.968 [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn: = specific_function %ptr.as.Copy.impl.Op.f47, @ptr.as.Copy.impl.Op(%empty_struct_type) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -381,32 +393,35 @@ fn G(x: A) { // CHECK:STDOUT: } // CHECK:STDOUT: %Core.import = import Core // CHECK:STDOUT: %HasF.decl: type = interface_decl @HasF [concrete = constants.%HasF.type] {} {} -// CHECK:STDOUT: impl_decl @T.as.HasF.impl [concrete] { +// CHECK:STDOUT: impl_decl @ptr.as.HasF.impl [concrete] { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc8_14.2 [symbolic = %T.loc8_14.1 (constants.%T)] +// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc8_14.2 [symbolic = %T.loc8_14.1 (constants.%T.8b3)] +// CHECK:STDOUT: %ptr.loc8_25.2: type = ptr_type %T.ref [symbolic = %ptr.loc8_25.1 (constants.%ptr.79f)] // CHECK:STDOUT: %HasF.ref: type = name_ref HasF, file.%HasF.decl [concrete = constants.%HasF.type] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc8_14.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_14.1 (constants.%T)] +// CHECK:STDOUT: %T.loc8_14.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_14.1 (constants.%T.8b3)] // CHECK:STDOUT: } -// CHECK:STDOUT: %HasF.impl_witness_table = impl_witness_table (@T.as.HasF.impl.%T.as.HasF.impl.F.decl), @T.as.HasF.impl [concrete] -// CHECK:STDOUT: %HasF.impl_witness: = impl_witness %HasF.impl_witness_table, @T.as.HasF.impl(constants.%T) [symbolic = @T.as.HasF.impl.%HasF.impl_witness (constants.%HasF.impl_witness.672)] +// CHECK:STDOUT: %HasF.impl_witness_table = impl_witness_table (@ptr.as.HasF.impl.%ptr.as.HasF.impl.F.decl), @ptr.as.HasF.impl [concrete] +// CHECK:STDOUT: %HasF.impl_witness: = impl_witness %HasF.impl_witness_table, @ptr.as.HasF.impl(constants.%T.8b3) [symbolic = @ptr.as.HasF.impl.%HasF.impl_witness (constants.%HasF.impl_witness.50b)] // CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %x.patt: %pattern_type.a96 = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: %pattern_type.a96 = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %x.patt: %pattern_type.1cc = binding_pattern x [concrete] +// CHECK:STDOUT: %x.param_patt: %pattern_type.1cc = value_param_pattern %x.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.1cc = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.1cc = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc12_17.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc12_17.2: type = converted %.loc12_17.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %x.param: %empty_struct_type = value_param call_param0 -// CHECK:STDOUT: %.loc12_10.1: type = splice_block %.loc12_10.3 [concrete = constants.%empty_struct_type] { -// CHECK:STDOUT: %.loc12_10.2: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc12_10.3: type = converted %.loc12_10.2, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %.loc12_18: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc12_19: type = converted %.loc12_18, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %ptr.loc12_19: type = ptr_type %.loc12_19 [concrete = constants.%ptr.c28] +// CHECK:STDOUT: %x.param: %ptr.c28 = value_param call_param0 +// CHECK:STDOUT: %.loc12_11.1: type = splice_block %ptr.loc12_11 [concrete = constants.%ptr.c28] { +// CHECK:STDOUT: %.loc12_10: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc12_11.2: type = converted %.loc12_10, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %ptr.loc12_11: type = ptr_type %.loc12_11.2 [concrete = constants.%ptr.c28] // CHECK:STDOUT: } -// CHECK:STDOUT: %x: %empty_struct_type = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref %empty_struct_type = out_param call_param1 -// CHECK:STDOUT: %return: ref %empty_struct_type = return_slot %return.param +// CHECK:STDOUT: %x: %ptr.c28 = bind_name x, %x.param +// CHECK:STDOUT: %return.param: ref %ptr.c28 = out_param call_param1 +// CHECK:STDOUT: %return: ref %ptr.c28 = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -439,32 +454,34 @@ fn G(x: A) { // CHECK:STDOUT: witness = (%HasF.F.decl) // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic impl @T.as.HasF.impl(%T.loc8_14.2: type) { -// CHECK:STDOUT: %T.loc8_14.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_14.1 (constants.%T)] -// CHECK:STDOUT: %HasF.impl_witness: = impl_witness file.%HasF.impl_witness_table, @T.as.HasF.impl(%T.loc8_14.1) [symbolic = %HasF.impl_witness (constants.%HasF.impl_witness.672)] +// CHECK:STDOUT: generic impl @ptr.as.HasF.impl(%T.loc8_14.2: type) { +// CHECK:STDOUT: %T.loc8_14.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_14.1 (constants.%T.8b3)] +// CHECK:STDOUT: %ptr.loc8_25.1: type = ptr_type %T.loc8_14.1 [symbolic = %ptr.loc8_25.1 (constants.%ptr.79f)] +// CHECK:STDOUT: %HasF.impl_witness: = impl_witness file.%HasF.impl_witness_table, @ptr.as.HasF.impl(%T.loc8_14.1) [symbolic = %HasF.impl_witness (constants.%HasF.impl_witness.50b)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %T.as.HasF.impl.F.type: type = fn_type @T.as.HasF.impl.F, @T.as.HasF.impl(%T.loc8_14.1) [symbolic = %T.as.HasF.impl.F.type (constants.%T.as.HasF.impl.F.type.b56)] -// CHECK:STDOUT: %T.as.HasF.impl.F: @T.as.HasF.impl.%T.as.HasF.impl.F.type (%T.as.HasF.impl.F.type.b56) = struct_value () [symbolic = %T.as.HasF.impl.F (constants.%T.as.HasF.impl.F.343)] +// CHECK:STDOUT: %ptr.as.HasF.impl.F.type: type = fn_type @ptr.as.HasF.impl.F, @ptr.as.HasF.impl(%T.loc8_14.1) [symbolic = %ptr.as.HasF.impl.F.type (constants.%ptr.as.HasF.impl.F.type.c51)] +// CHECK:STDOUT: %ptr.as.HasF.impl.F: @ptr.as.HasF.impl.%ptr.as.HasF.impl.F.type (%ptr.as.HasF.impl.F.type.c51) = struct_value () [symbolic = %ptr.as.HasF.impl.F (constants.%ptr.as.HasF.impl.F.7b7)] // CHECK:STDOUT: -// CHECK:STDOUT: impl: %T.ref as %HasF.ref { -// CHECK:STDOUT: %T.as.HasF.impl.F.decl: @T.as.HasF.impl.%T.as.HasF.impl.F.type (%T.as.HasF.impl.F.type.b56) = fn_decl @T.as.HasF.impl.F [symbolic = @T.as.HasF.impl.%T.as.HasF.impl.F (constants.%T.as.HasF.impl.F.343)] { -// CHECK:STDOUT: %self.patt: @T.as.HasF.impl.F.%pattern_type (%pattern_type.7dc) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @T.as.HasF.impl.F.%pattern_type (%pattern_type.7dc) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @T.as.HasF.impl.F.%pattern_type (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @T.as.HasF.impl.F.%pattern_type (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: impl: %ptr.loc8_25.2 as %HasF.ref { +// CHECK:STDOUT: %ptr.as.HasF.impl.F.decl: @ptr.as.HasF.impl.%ptr.as.HasF.impl.F.type (%ptr.as.HasF.impl.F.type.c51) = fn_decl @ptr.as.HasF.impl.F [symbolic = @ptr.as.HasF.impl.%ptr.as.HasF.impl.F (constants.%ptr.as.HasF.impl.F.7b7)] { +// CHECK:STDOUT: %self.patt: @ptr.as.HasF.impl.F.%pattern_type (%pattern_type.afe) = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: @ptr.as.HasF.impl.F.%pattern_type (%pattern_type.afe) = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @ptr.as.HasF.impl.F.%pattern_type (%pattern_type.afe) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @ptr.as.HasF.impl.F.%pattern_type (%pattern_type.afe) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref: type = name_ref T, @T.as.HasF.impl.%T.loc8_14.2 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %self.param: @T.as.HasF.impl.F.%T (%T) = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, @T.as.HasF.impl.%T.ref [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %self: @T.as.HasF.impl.F.%T (%T) = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref @T.as.HasF.impl.F.%T (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @T.as.HasF.impl.F.%T (%T) = return_slot %return.param +// CHECK:STDOUT: %T.ref: type = name_ref T, @ptr.as.HasF.impl.%T.loc8_14.2 [symbolic = %T (constants.%T.8b3)] +// CHECK:STDOUT: %ptr.loc9_26: type = ptr_type %T.ref [symbolic = %ptr.loc9_14 (constants.%ptr.79f)] +// CHECK:STDOUT: %self.param: @ptr.as.HasF.impl.F.%ptr.loc9_14 (%ptr.79f) = value_param call_param0 +// CHECK:STDOUT: %Self.ref: type = name_ref Self, @ptr.as.HasF.impl.%ptr.loc8_25.2 [symbolic = %ptr.loc9_14 (constants.%ptr.79f)] +// CHECK:STDOUT: %self: @ptr.as.HasF.impl.F.%ptr.loc9_14 (%ptr.79f) = bind_name self, %self.param +// CHECK:STDOUT: %return.param: ref @ptr.as.HasF.impl.F.%ptr.loc9_14 (%ptr.79f) = out_param call_param1 +// CHECK:STDOUT: %return: ref @ptr.as.HasF.impl.F.%ptr.loc9_14 (%ptr.79f) = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .T = -// CHECK:STDOUT: .F = %T.as.HasF.impl.F.decl +// CHECK:STDOUT: .F = %ptr.as.HasF.impl.F.decl // CHECK:STDOUT: witness = file.%HasF.impl_witness // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -477,40 +494,42 @@ fn G(x: A) { // CHECK:STDOUT: fn(%self.param: @HasF.F.%Self.as_type.loc5_14.1 (%Self.as_type.978)) -> @HasF.F.%Self.as_type.loc5_14.1 (%Self.as_type.978); // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @T.as.HasF.impl.F(@T.as.HasF.impl.%T.loc8_14.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T [symbolic = %pattern_type (constants.%pattern_type.7dc)] +// CHECK:STDOUT: generic fn @ptr.as.HasF.impl.F(@ptr.as.HasF.impl.%T.loc8_14.2: type) { +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] +// CHECK:STDOUT: %ptr.loc9_14: type = ptr_type %T [symbolic = %ptr.loc9_14 (constants.%ptr.79f)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr.loc9_14 [symbolic = %pattern_type (constants.%pattern_type.afe)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: %require_complete: = require_complete_type %ptr.loc9_14 [symbolic = %require_complete (constants.%require_complete.6e5)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %ptr.loc9_14, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.cb2)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %ptr.loc9_14, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.def)] +// CHECK:STDOUT: %.loc9_37.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc9_37.2 (constants.%.fe5)] +// CHECK:STDOUT: %impl.elem0.loc9_37.2: @ptr.as.HasF.impl.F.%.loc9_37.2 (%.fe5) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc9_37.2 (constants.%impl.elem0.429)] +// CHECK:STDOUT: %specific_impl_fn.loc9_37.2: = specific_impl_function %impl.elem0.loc9_37.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc9_37.2 (constants.%specific_impl_fn.d8a)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @T.as.HasF.impl.F.%T (%T)) -> @T.as.HasF.impl.F.%T (%T) { +// CHECK:STDOUT: fn(%self.param: @ptr.as.HasF.impl.F.%ptr.loc9_14 (%ptr.79f)) -> @ptr.as.HasF.impl.F.%ptr.loc9_14 (%ptr.79f) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: @T.as.HasF.impl.F.%T (%T) = name_ref self, %self -// CHECK:STDOUT: return %self.ref +// CHECK:STDOUT: %self.ref: @ptr.as.HasF.impl.F.%ptr.loc9_14 (%ptr.79f) = name_ref self, %self +// CHECK:STDOUT: %impl.elem0.loc9_37.1: @ptr.as.HasF.impl.F.%.loc9_37.2 (%.fe5) = impl_witness_access constants.%Copy.lookup_impl_witness.cb2, element0 [symbolic = %impl.elem0.loc9_37.2 (constants.%impl.elem0.429)] +// CHECK:STDOUT: %bound_method.loc9_37.1: = bound_method %self.ref, %impl.elem0.loc9_37.1 +// CHECK:STDOUT: %specific_impl_fn.loc9_37.1: = specific_impl_function %impl.elem0.loc9_37.1, @Copy.Op(constants.%Copy.facet.def) [symbolic = %specific_impl_fn.loc9_37.2 (constants.%specific_impl_fn.d8a)] +// CHECK:STDOUT: %bound_method.loc9_37.2: = bound_method %self.ref, %specific_impl_fn.loc9_37.1 +// CHECK:STDOUT: %.loc9_37.1: init @ptr.as.HasF.impl.F.%ptr.loc9_14 (%ptr.79f) = call %bound_method.loc9_37.2(%self.ref) +// CHECK:STDOUT: return %.loc9_37.1 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: fn @G(%x.param: %empty_struct_type) -> %empty_struct_type { +// CHECK:STDOUT: fn @G(%x.param: %ptr.c28) -> %ptr.c28 { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: %empty_struct_type = name_ref x, %x +// CHECK:STDOUT: %x.ref: %ptr.c28 = name_ref x, %x // CHECK:STDOUT: %HasF.ref: type = name_ref HasF, file.%HasF.decl [concrete = constants.%HasF.type] // CHECK:STDOUT: %F.ref: %HasF.assoc_type = name_ref F, @HasF.%assoc0 [concrete = constants.%assoc0.97a] -// CHECK:STDOUT: %impl.elem0: %.b41 = impl_witness_access constants.%HasF.impl_witness.b6e, element0 [concrete = constants.%T.as.HasF.impl.F.cd5] +// CHECK:STDOUT: %impl.elem0: %.9b4 = impl_witness_access constants.%HasF.impl_witness.d89, element0 [concrete = constants.%ptr.as.HasF.impl.F.b9c] // CHECK:STDOUT: %bound_method.loc13_11: = bound_method %x.ref, %impl.elem0 -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @T.as.HasF.impl.F(constants.%empty_struct_type) [concrete = constants.%T.as.HasF.impl.F.specific_fn] -// CHECK:STDOUT: %bound_method.loc13_21.1: = bound_method %x.ref, %specific_fn -// CHECK:STDOUT: %T.as.HasF.impl.F.call: init %empty_struct_type = call %bound_method.loc13_21.1(%x.ref) -// CHECK:STDOUT: %.loc13_21.1: ref %empty_struct_type = temporary_storage -// CHECK:STDOUT: %.loc13_21.2: ref %empty_struct_type = temporary %.loc13_21.1, %T.as.HasF.impl.F.call -// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] -// CHECK:STDOUT: %.loc13_22: %empty_struct_type = converted %T.as.HasF.impl.F.call, %empty_struct [concrete = constants.%empty_struct] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %.loc13_21.2, constants.%T.as.Destroy.impl.Op.24b -// CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function constants.%T.as.Destroy.impl.Op.24b, @T.as.Destroy.impl.Op(constants.%empty_struct_type) [concrete = constants.%T.as.Destroy.impl.Op.specific_fn] -// CHECK:STDOUT: %bound_method.loc13_21.2: = bound_method %.loc13_21.2, %T.as.Destroy.impl.Op.specific_fn -// CHECK:STDOUT: %addr: %ptr.c28 = addr_of %.loc13_21.2 -// CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc13_21.2(%addr) -// CHECK:STDOUT: return %.loc13_22 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @ptr.as.HasF.impl.F(constants.%empty_struct_type) [concrete = constants.%ptr.as.HasF.impl.F.specific_fn] +// CHECK:STDOUT: %bound_method.loc13_21: = bound_method %x.ref, %specific_fn +// CHECK:STDOUT: %ptr.as.HasF.impl.F.call: init %ptr.c28 = call %bound_method.loc13_21(%x.ref) +// CHECK:STDOUT: return %ptr.as.HasF.impl.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HasF.F(constants.%Self.fc4) { @@ -519,41 +538,50 @@ fn G(x: A) { // CHECK:STDOUT: %pattern_type => constants.%pattern_type.7c4 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @T.as.HasF.impl(constants.%T) { -// CHECK:STDOUT: %T.loc8_14.1 => constants.%T -// CHECK:STDOUT: %HasF.impl_witness => constants.%HasF.impl_witness.672 +// CHECK:STDOUT: specific @ptr.as.HasF.impl(constants.%T.8b3) { +// CHECK:STDOUT: %T.loc8_14.1 => constants.%T.8b3 +// CHECK:STDOUT: %ptr.loc8_25.1 => constants.%ptr.79f +// CHECK:STDOUT: %HasF.impl_witness => constants.%HasF.impl_witness.50b // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %T.as.HasF.impl.F.type => constants.%T.as.HasF.impl.F.type.b56 -// CHECK:STDOUT: %T.as.HasF.impl.F => constants.%T.as.HasF.impl.F.343 +// CHECK:STDOUT: %ptr.as.HasF.impl.F.type => constants.%ptr.as.HasF.impl.F.type.c51 +// CHECK:STDOUT: %ptr.as.HasF.impl.F => constants.%ptr.as.HasF.impl.F.7b7 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @T.as.HasF.impl.F(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc +// CHECK:STDOUT: specific @ptr.as.HasF.impl.F(constants.%T.8b3) { +// CHECK:STDOUT: %T => constants.%T.8b3 +// CHECK:STDOUT: %ptr.loc9_14 => constants.%ptr.79f +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.afe // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @HasF.F(constants.%HasF.facet.bac) { -// CHECK:STDOUT: %Self => constants.%HasF.facet.bac -// CHECK:STDOUT: %Self.as_type.loc5_14.1 => constants.%T -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc +// CHECK:STDOUT: specific @HasF.F(constants.%HasF.facet.f29) { +// CHECK:STDOUT: %Self => constants.%HasF.facet.f29 +// CHECK:STDOUT: %Self.as_type.loc5_14.1 => constants.%ptr.79f +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.afe // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @T.as.HasF.impl(constants.%empty_struct_type) { +// CHECK:STDOUT: specific @ptr.as.HasF.impl(constants.%empty_struct_type) { // CHECK:STDOUT: %T.loc8_14.1 => constants.%empty_struct_type -// CHECK:STDOUT: %HasF.impl_witness => constants.%HasF.impl_witness.b6e +// CHECK:STDOUT: %ptr.loc8_25.1 => constants.%ptr.c28 +// CHECK:STDOUT: %HasF.impl_witness => constants.%HasF.impl_witness.d89 // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %T.as.HasF.impl.F.type => constants.%T.as.HasF.impl.F.type.61c -// CHECK:STDOUT: %T.as.HasF.impl.F => constants.%T.as.HasF.impl.F.cd5 +// CHECK:STDOUT: %ptr.as.HasF.impl.F.type => constants.%ptr.as.HasF.impl.F.type.df2 +// CHECK:STDOUT: %ptr.as.HasF.impl.F => constants.%ptr.as.HasF.impl.F.b9c // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @T.as.HasF.impl.F(constants.%empty_struct_type) { +// CHECK:STDOUT: specific @ptr.as.HasF.impl.F(constants.%empty_struct_type) { // CHECK:STDOUT: %T => constants.%empty_struct_type -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.a96 +// CHECK:STDOUT: %ptr.loc9_14 => constants.%ptr.c28 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.1cc // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.357 +// CHECK:STDOUT: %require_complete => constants.%complete_type +// CHECK:STDOUT: %Copy.lookup_impl_witness => constants.%Copy.impl_witness.bca +// CHECK:STDOUT: %Copy.facet => constants.%Copy.facet.968 +// CHECK:STDOUT: %.loc9_37.2 => constants.%.f28 +// CHECK:STDOUT: %impl.elem0.loc9_37.2 => constants.%ptr.as.Copy.impl.Op.f47 +// CHECK:STDOUT: %specific_impl_fn.loc9_37.2 => constants.%ptr.as.Copy.impl.Op.specific_fn // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- deduced_type_argument.carbon diff --git a/toolchain/check/testdata/impl/lookup/impl_forall.carbon b/toolchain/check/testdata/impl/lookup/impl_forall.carbon index d95ebbee568e..4a713a715491 100644 --- a/toolchain/check/testdata/impl/lookup/impl_forall.carbon +++ b/toolchain/check/testdata/impl/lookup/impl_forall.carbon @@ -2,9 +2,7 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // -// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/destroy.carbon -// TODO: Add ranges and switch to "--dump-sem-ir-ranges=only". -// EXTRA-ARGS: --dump-sem-ir-ranges=if-present +// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/convert.carbon // // AUTOUPDATE // TIP: To test this file alone, run: @@ -20,92 +18,71 @@ class A(T:! type) { } interface I(U:! type) { - fn F[self: Self]() -> U; + fn F[addr self: Self*]() -> U*; } +//@dump-sem-ir-begin impl forall [V:! type] A(V) as I(V) { - fn F[self: Self]() -> V { - return self.n; + fn F[addr self: Self*]() -> V* { + return &self->n; } } +//@dump-sem-ir-end -fn TestGeneric[W:! type](a: A(W)) -> W { - return a.(I(W).F)(); +fn TestGeneric[W:! type](a: A(W)*) -> W* { + //@dump-sem-ir-begin + return a->(I(W).F)(); + //@dump-sem-ir-end } -fn TestSpecific(a: A({})) -> {} { - return a.(I({}).F)(); +fn TestSpecific(a: A({})*) -> {}* { + //@dump-sem-ir-begin + return a->(I({}).F)(); + //@dump-sem-ir-end } // CHECK:STDOUT: --- impl_forall.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %A.type: type = generic_class_type @A [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %A.generic: %A.type = struct_value () [concrete] -// CHECK:STDOUT: %A.13025a.1: type = class_type @A, @A(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4aeca8.1: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %A.elem.1ceb36.1: type = unbound_element_type %A.13025a.1, %T [symbolic] -// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness.7e1: = impl_witness @A.%Destroy.impl_witness_table, @A.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %ptr.ca9: type = ptr_type %A.13025a.1 [symbolic] -// CHECK:STDOUT: %pattern_type.09b: type = pattern_type %ptr.ca9 [symbolic] -// CHECK:STDOUT: %A.as.Destroy.impl.Op.type: type = fn_type @A.as.Destroy.impl.Op, @A.as.Destroy.impl(%T) [symbolic] -// CHECK:STDOUT: %A.as.Destroy.impl.Op: %A.as.Destroy.impl.Op.type = struct_value () [symbolic] -// CHECK:STDOUT: %struct_type.n.848971.1: type = struct_type {.n: %T} [symbolic] -// CHECK:STDOUT: %complete_type.84bb3d.1: = complete_type_witness %struct_type.n.848971.1 [symbolic] -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 0 [symbolic] // CHECK:STDOUT: %I.type.dac: type = generic_interface_type @I [concrete] // CHECK:STDOUT: %I.generic: %I.type.dac = struct_value () [concrete] -// CHECK:STDOUT: %I.type.328ca8.1: type = facet_type <@I, @I(%U)> [symbolic] -// CHECK:STDOUT: %Self.0d86b8.1: %I.type.328ca8.1 = bind_symbolic_name Self, 1 [symbolic] -// CHECK:STDOUT: %Self.as_type.ec9: type = facet_access_type %Self.0d86b8.1 [symbolic] -// CHECK:STDOUT: %pattern_type.857: type = pattern_type %Self.as_type.ec9 [symbolic] -// CHECK:STDOUT: %pattern_type.7dcd0a.1: type = pattern_type %U [symbolic] -// CHECK:STDOUT: %I.F.type.2aef59.1: type = fn_type @I.F, @I(%U) [symbolic] -// CHECK:STDOUT: %I.F.bb2dd4.1: %I.F.type.2aef59.1 = struct_value () [symbolic] -// CHECK:STDOUT: %I.assoc_type.1e5078.1: type = assoc_entity_type @I, @I(%U) [symbolic] -// CHECK:STDOUT: %assoc0.8f0422.1: %I.assoc_type.1e5078.1 = assoc_entity element0, @I.%I.F.decl [symbolic] -// CHECK:STDOUT: %V: type = bind_symbolic_name V, 0 [symbolic] -// CHECK:STDOUT: %A.13025a.2: type = class_type @A, @A(%V) [symbolic] -// CHECK:STDOUT: %I.type.328ca8.2: type = facet_type <@I, @I(%V)> [symbolic] -// CHECK:STDOUT: %Self.0d86b8.2: %I.type.328ca8.2 = bind_symbolic_name Self, 1 [symbolic] -// CHECK:STDOUT: %I.F.type.2aef59.2: type = fn_type @I.F, @I(%V) [symbolic] -// CHECK:STDOUT: %I.F.bb2dd4.2: %I.F.type.2aef59.2 = struct_value () [symbolic] -// CHECK:STDOUT: %I.assoc_type.1e5078.2: type = assoc_entity_type @I, @I(%V) [symbolic] -// CHECK:STDOUT: %assoc0.8f0422.2: %I.assoc_type.1e5078.2 = assoc_entity element0, @I.%I.F.decl [symbolic] +// CHECK:STDOUT: %V.8b3: type = bind_symbolic_name V, 0 [symbolic] +// CHECK:STDOUT: %A.13025a.2: type = class_type @A, @A(%V.8b3) [symbolic] +// CHECK:STDOUT: %I.type.328ca8.2: type = facet_type <@I, @I(%V.8b3)> [symbolic] // CHECK:STDOUT: %require_complete.3e6bdc.1: = require_complete_type %I.type.328ca8.2 [symbolic] -// CHECK:STDOUT: %I.impl_witness.c31b26.1: = impl_witness file.%I.impl_witness_table, @A.as.I.impl(%V) [symbolic] -// CHECK:STDOUT: %pattern_type.68d8d3.1: type = pattern_type %A.13025a.2 [symbolic] -// CHECK:STDOUT: %pattern_type.7dcd0a.2: type = pattern_type %V [symbolic] -// CHECK:STDOUT: %A.as.I.impl.F.type.d34923.1: type = fn_type @A.as.I.impl.F, @A.as.I.impl(%V) [symbolic] +// CHECK:STDOUT: %I.impl_witness.c31b26.1: = impl_witness file.%I.impl_witness_table, @A.as.I.impl(%V.8b3) [symbolic] +// CHECK:STDOUT: %ptr.ca9f10.2: type = ptr_type %A.13025a.2 [symbolic] +// CHECK:STDOUT: %pattern_type.09bae9.2: type = pattern_type %ptr.ca9f10.2 [symbolic] +// CHECK:STDOUT: %ptr.79f131.2: type = ptr_type %V.8b3 [symbolic] +// CHECK:STDOUT: %pattern_type.afe393.2: type = pattern_type %ptr.79f131.2 [symbolic] +// CHECK:STDOUT: %A.as.I.impl.F.type.d34923.1: type = fn_type @A.as.I.impl.F, @A.as.I.impl(%V.8b3) [symbolic] // CHECK:STDOUT: %A.as.I.impl.F.9f6f75.1: %A.as.I.impl.F.type.d34923.1 = struct_value () [symbolic] -// CHECK:STDOUT: %I.facet.cb9: %I.type.328ca8.2 = facet_value %A.13025a.2, (%I.impl_witness.c31b26.1) [symbolic] -// CHECK:STDOUT: %require_complete.4aeca8.2: = require_complete_type %V [symbolic] -// CHECK:STDOUT: %A.elem.1ceb36.2: type = unbound_element_type %A.13025a.2, %V [symbolic] -// CHECK:STDOUT: %struct_type.n.848971.2: type = struct_type {.n: %V} [symbolic] -// CHECK:STDOUT: %complete_type.84bb3d.2: = complete_type_witness %struct_type.n.848971.2 [symbolic] +// CHECK:STDOUT: %require_complete.6e5e64.1: = require_complete_type %ptr.79f131.2 [symbolic] +// CHECK:STDOUT: %require_complete.84dcf9.1: = require_complete_type %ptr.ca9f10.2 [symbolic] +// CHECK:STDOUT: %A.elem.1ceb36.2: type = unbound_element_type %A.13025a.2, %V.8b3 [symbolic] // CHECK:STDOUT: %require_complete.5b8aee.1: = require_complete_type %A.13025a.2 [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23dbd.1: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf12b.1: %ptr.as.Copy.impl.Op.type.f23dbd.1 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.lookup_impl_witness.cb2: = lookup_impl_witness %ptr.79f131.2, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.def: %Copy.type = facet_value %ptr.79f131.2, (%Copy.lookup_impl_witness.cb2) [symbolic] +// CHECK:STDOUT: %.fe5: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.def [symbolic] +// CHECK:STDOUT: %impl.elem0.429: %.fe5 = impl_witness_access %Copy.lookup_impl_witness.cb2, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.d8a: = specific_impl_function %impl.elem0.429, @Copy.Op(%Copy.facet.def) [symbolic] // CHECK:STDOUT: %W: type = bind_symbolic_name W, 0 [symbolic] // CHECK:STDOUT: %A.13025a.3: type = class_type @A, @A(%W) [symbolic] -// CHECK:STDOUT: %pattern_type.68d8d3.2: type = pattern_type %A.13025a.3 [symbolic] -// CHECK:STDOUT: %pattern_type.7dcd0a.3: type = pattern_type %W [symbolic] -// CHECK:STDOUT: %TestGeneric.type: type = fn_type @TestGeneric [concrete] -// CHECK:STDOUT: %TestGeneric: %TestGeneric.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.4aeca8.3: = require_complete_type %W [symbolic] -// CHECK:STDOUT: %A.elem.1ceb36.3: type = unbound_element_type %A.13025a.3, %W [symbolic] -// CHECK:STDOUT: %struct_type.n.848971.3: type = struct_type {.n: %W} [symbolic] -// CHECK:STDOUT: %complete_type.84bb3d.3: = complete_type_witness %struct_type.n.848971.3 [symbolic] -// CHECK:STDOUT: %require_complete.5b8aee.2: = require_complete_type %A.13025a.3 [symbolic] +// CHECK:STDOUT: %ptr.ca9f10.3: type = ptr_type %A.13025a.3 [symbolic] +// CHECK:STDOUT: %pattern_type.09bae9.3: type = pattern_type %ptr.ca9f10.3 [symbolic] +// CHECK:STDOUT: %ptr.79f131.4: type = ptr_type %W [symbolic] +// CHECK:STDOUT: %pattern_type.afe393.4: type = pattern_type %ptr.79f131.4 [symbolic] // CHECK:STDOUT: %I.type.328ca8.3: type = facet_type <@I, @I(%W)> [symbolic] -// CHECK:STDOUT: %Self.0d86b8.3: %I.type.328ca8.3 = bind_symbolic_name Self, 1 [symbolic] // CHECK:STDOUT: %I.F.type.2aef59.3: type = fn_type @I.F, @I(%W) [symbolic] -// CHECK:STDOUT: %I.F.bb2dd4.3: %I.F.type.2aef59.3 = struct_value () [symbolic] // CHECK:STDOUT: %I.assoc_type.1e5078.3: type = assoc_entity_type @I, @I(%W) [symbolic] // CHECK:STDOUT: %assoc0.8f0422.3: %I.assoc_type.1e5078.3 = assoc_entity element0, @I.%I.F.decl [symbolic] // CHECK:STDOUT: %require_complete.3e6bdc.2: = require_complete_type %I.type.328ca8.3 [symbolic] @@ -115,22 +92,17 @@ fn TestSpecific(a: A({})) -> {} { // CHECK:STDOUT: %I.lookup_impl_witness: = lookup_impl_witness %A.13025a.3, @I, @I(%W) [symbolic] // CHECK:STDOUT: %I.facet.99d: %I.type.328ca8.3 = facet_value %A.13025a.3, (%I.lookup_impl_witness) [symbolic] // CHECK:STDOUT: %.02b: type = fn_type_with_self_type %I.F.type.2aef59.3, %I.facet.99d [symbolic] -// CHECK:STDOUT: %impl.elem0: %.02b = impl_witness_access %I.lookup_impl_witness, element0 [symbolic] -// CHECK:STDOUT: %specific_impl_fn: = specific_impl_function %impl.elem0, @I.F(%W, %I.facet.99d) [symbolic] +// CHECK:STDOUT: %impl.elem0.dc5: %.02b = impl_witness_access %I.lookup_impl_witness, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.486: = specific_impl_function %impl.elem0.dc5, @I.F(%W, %I.facet.99d) [symbolic] +// CHECK:STDOUT: %require_complete.5b8aee.2: = require_complete_type %A.13025a.3 [symbolic] // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] // CHECK:STDOUT: %A.235: type = class_type @A, @A(%empty_struct_type) [concrete] -// CHECK:STDOUT: %pattern_type.496: type = pattern_type %A.235 [concrete] -// CHECK:STDOUT: %pattern_type.a96: type = pattern_type %empty_struct_type [concrete] -// CHECK:STDOUT: %TestSpecific.type: type = fn_type @TestSpecific [concrete] -// CHECK:STDOUT: %TestSpecific: %TestSpecific.type = struct_value () [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %A.elem.2af: type = unbound_element_type %A.235, %empty_struct_type [concrete] -// CHECK:STDOUT: %struct_type.n.91c: type = struct_type {.n: %empty_struct_type} [concrete] -// CHECK:STDOUT: %complete_type.0a6: = complete_type_witness %struct_type.n.91c [concrete] +// CHECK:STDOUT: %ptr.197: type = ptr_type %A.235 [concrete] +// CHECK:STDOUT: %pattern_type.e47: type = pattern_type %ptr.197 [concrete] +// CHECK:STDOUT: %ptr.c28: type = ptr_type %empty_struct_type [concrete] +// CHECK:STDOUT: %pattern_type.1cc: type = pattern_type %ptr.c28 [concrete] // CHECK:STDOUT: %I.type.cba: type = facet_type <@I, @I(%empty_struct_type)> [concrete] -// CHECK:STDOUT: %Self.3aa: %I.type.cba = bind_symbolic_name Self, 1 [symbolic] // CHECK:STDOUT: %I.F.type.684: type = fn_type @I.F, @I(%empty_struct_type) [concrete] -// CHECK:STDOUT: %I.F.a8d: %I.F.type.684 = struct_value () [concrete] // CHECK:STDOUT: %I.assoc_type.22c: type = assoc_entity_type @I, @I(%empty_struct_type) [concrete] // CHECK:STDOUT: %assoc0.722: %I.assoc_type.22c = assoc_entity element0, @I.%I.F.decl [concrete] // CHECK:STDOUT: %complete_type.03e: = complete_type_witness %I.type.cba [concrete] @@ -140,192 +112,70 @@ fn TestSpecific(a: A({})) -> {} { // CHECK:STDOUT: %I.facet.3c2: %I.type.cba = facet_value %A.235, (%I.impl_witness.365) [concrete] // CHECK:STDOUT: %.a6c: type = fn_type_with_self_type %I.F.type.684, %I.facet.3c2 [concrete] // CHECK:STDOUT: %A.as.I.impl.F.specific_fn: = specific_function %A.as.I.impl.F.291, @A.as.I.impl.F(%empty_struct_type) [concrete] -// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.type.456: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%empty_struct_type) [concrete] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.24b: %T.as.Destroy.impl.Op.type.456 = struct_value () [concrete] -// CHECK:STDOUT: %ptr.c28: type = ptr_type %empty_struct_type [concrete] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function %T.as.Destroy.impl.Op.24b, @T.as.Destroy.impl.Op(%empty_struct_type) [concrete] +// CHECK:STDOUT: %A.elem.2af: type = unbound_element_type %A.235, %empty_struct_type [concrete] +// CHECK:STDOUT: %struct_type.n.91c: type = struct_type {.n: %empty_struct_type} [concrete] +// CHECK:STDOUT: %complete_type.0a6: = complete_type_witness %struct_type.n.91c [concrete] +// CHECK:STDOUT: %complete_type.38e: = complete_type_witness %ptr.c28 [concrete] +// CHECK:STDOUT: %complete_type.d27: = complete_type_witness %ptr.197 [concrete] +// CHECK:STDOUT: %Copy.impl_witness.bca: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%empty_struct_type) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.fc8: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%empty_struct_type) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.f47: %ptr.as.Copy.impl.Op.type.fc8 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.968: %Copy.type = facet_value %ptr.c28, (%Copy.impl_witness.bca) [concrete] +// CHECK:STDOUT: %.f28: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.968 [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn: = specific_function %ptr.as.Copy.impl.Op.f47, @ptr.as.Copy.impl.Op(%empty_struct_type) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Destroy = %Core.Destroy -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23dbd.1) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf12b.1)] +// CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .I = %I.decl -// CHECK:STDOUT: .TestGeneric = %TestGeneric.decl -// CHECK:STDOUT: .TestSpecific = %TestSpecific.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl: %A.type = class_decl @A [concrete = constants.%A.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc3_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc3_9.1 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %I.decl: %I.type.dac = interface_decl @I [concrete = constants.%I.generic] { -// CHECK:STDOUT: %U.patt: %pattern_type.98f = symbolic_binding_pattern U, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %U.loc7_13.2: type = bind_symbolic_name U, 0 [symbolic = %U.loc7_13.1 (constants.%U)] -// CHECK:STDOUT: } // CHECK:STDOUT: impl_decl @A.as.I.impl [concrete] { // CHECK:STDOUT: %V.patt: %pattern_type.98f = symbolic_binding_pattern V, 0 [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %A.ref: %A.type = name_ref A, file.%A.decl [concrete = constants.%A.generic] -// CHECK:STDOUT: %V.ref.loc11_26: type = name_ref V, %V.loc11_14.2 [symbolic = %V.loc11_14.1 (constants.%V)] -// CHECK:STDOUT: %A.loc11_27.2: type = class_type @A, @A(constants.%V) [symbolic = %A.loc11_27.1 (constants.%A.13025a.2)] +// CHECK:STDOUT: %V.ref.loc12_26: type = name_ref V, %V.loc12_14.2 [symbolic = %V.loc12_14.1 (constants.%V.8b3)] +// CHECK:STDOUT: %A.loc12_27.2: type = class_type @A, @A(constants.%V.8b3) [symbolic = %A.loc12_27.1 (constants.%A.13025a.2)] // CHECK:STDOUT: %I.ref: %I.type.dac = name_ref I, file.%I.decl [concrete = constants.%I.generic] -// CHECK:STDOUT: %V.ref.loc11_34: type = name_ref V, %V.loc11_14.2 [symbolic = %V.loc11_14.1 (constants.%V)] -// CHECK:STDOUT: %I.type.loc11_35.2: type = facet_type <@I, @I(constants.%V)> [symbolic = %I.type.loc11_35.1 (constants.%I.type.328ca8.2)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %V.loc11_14.2: type = bind_symbolic_name V, 0 [symbolic = %V.loc11_14.1 (constants.%V)] +// CHECK:STDOUT: %V.ref.loc12_34: type = name_ref V, %V.loc12_14.2 [symbolic = %V.loc12_14.1 (constants.%V.8b3)] +// CHECK:STDOUT: %I.type.loc12_35.2: type = facet_type <@I, @I(constants.%V.8b3)> [symbolic = %I.type.loc12_35.1 (constants.%I.type.328ca8.2)] +// CHECK:STDOUT: +// CHECK:STDOUT: %V.loc12_14.2: type = bind_symbolic_name V, 0 [symbolic = %V.loc12_14.1 (constants.%V.8b3)] // CHECK:STDOUT: } // CHECK:STDOUT: %I.impl_witness_table = impl_witness_table (@A.as.I.impl.%A.as.I.impl.F.decl), @A.as.I.impl [concrete] -// CHECK:STDOUT: %I.impl_witness: = impl_witness %I.impl_witness_table, @A.as.I.impl(constants.%V) [symbolic = @A.as.I.impl.%I.impl_witness (constants.%I.impl_witness.c31b26.1)] -// CHECK:STDOUT: %TestGeneric.decl: %TestGeneric.type = fn_decl @TestGeneric [concrete = constants.%TestGeneric] { -// CHECK:STDOUT: %W.patt: %pattern_type.98f = symbolic_binding_pattern W, 0 [concrete] -// CHECK:STDOUT: %a.patt: @TestGeneric.%pattern_type.loc17_26 (%pattern_type.68d8d3.2) = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: @TestGeneric.%pattern_type.loc17_26 (%pattern_type.68d8d3.2) = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @TestGeneric.%pattern_type.loc17_35 (%pattern_type.7dcd0a.3) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @TestGeneric.%pattern_type.loc17_35 (%pattern_type.7dcd0a.3) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %W.ref.loc17_38: type = name_ref W, %W.loc17_16.2 [symbolic = %W.loc17_16.1 (constants.%W)] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %W.loc17_16.2: type = bind_symbolic_name W, 0 [symbolic = %W.loc17_16.1 (constants.%W)] -// CHECK:STDOUT: %a.param: @TestGeneric.%A.loc17_32.1 (%A.13025a.3) = value_param call_param0 -// CHECK:STDOUT: %.loc17: type = splice_block %A.loc17_32.2 [symbolic = %A.loc17_32.1 (constants.%A.13025a.3)] { -// CHECK:STDOUT: %A.ref: %A.type = name_ref A, file.%A.decl [concrete = constants.%A.generic] -// CHECK:STDOUT: %W.ref.loc17_31: type = name_ref W, %W.loc17_16.2 [symbolic = %W.loc17_16.1 (constants.%W)] -// CHECK:STDOUT: %A.loc17_32.2: type = class_type @A, @A(constants.%W) [symbolic = %A.loc17_32.1 (constants.%A.13025a.3)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a: @TestGeneric.%A.loc17_32.1 (%A.13025a.3) = bind_name a, %a.param -// CHECK:STDOUT: %return.param: ref @TestGeneric.%W.loc17_16.1 (%W) = out_param call_param1 -// CHECK:STDOUT: %return: ref @TestGeneric.%W.loc17_16.1 (%W) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %TestSpecific.decl: %TestSpecific.type = fn_decl @TestSpecific [concrete = constants.%TestSpecific] { -// CHECK:STDOUT: %a.patt: %pattern_type.496 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.496 = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc21_31.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc21_31.2: type = converted %.loc21_31.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %a.param: %A.235 = value_param call_param0 -// CHECK:STDOUT: %.loc21_24.1: type = splice_block %A [concrete = constants.%A.235] { -// CHECK:STDOUT: %A.ref: %A.type = name_ref A, file.%A.decl [concrete = constants.%A.generic] -// CHECK:STDOUT: %.loc21_23: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc21_24.2: type = converted %.loc21_23, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %A: type = class_type @A, @A(constants.%empty_struct_type) [concrete = constants.%A.235] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a: %A.235 = bind_name a, %a.param -// CHECK:STDOUT: %return.param: ref %empty_struct_type = out_param call_param1 -// CHECK:STDOUT: %return: ref %empty_struct_type = return_slot %return.param -// CHECK:STDOUT: } +// CHECK:STDOUT: %I.impl_witness: = impl_witness %I.impl_witness_table, @A.as.I.impl(constants.%V.8b3) [symbolic = @A.as.I.impl.%I.impl_witness (constants.%I.impl_witness.c31b26.1)] // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic interface @I(%U.loc7_13.2: type) { -// CHECK:STDOUT: %U.loc7_13.1: type = bind_symbolic_name U, 0 [symbolic = %U.loc7_13.1 (constants.%U)] +// CHECK:STDOUT: generic impl @A.as.I.impl(%V.loc12_14.2: type) { +// CHECK:STDOUT: %V.loc12_14.1: type = bind_symbolic_name V, 0 [symbolic = %V.loc12_14.1 (constants.%V.8b3)] +// CHECK:STDOUT: %A.loc12_27.1: type = class_type @A, @A(%V.loc12_14.1) [symbolic = %A.loc12_27.1 (constants.%A.13025a.2)] +// CHECK:STDOUT: %I.type.loc12_35.1: type = facet_type <@I, @I(%V.loc12_14.1)> [symbolic = %I.type.loc12_35.1 (constants.%I.type.328ca8.2)] +// CHECK:STDOUT: %require_complete: = require_complete_type %I.type.loc12_35.1 [symbolic = %require_complete (constants.%require_complete.3e6bdc.1)] +// CHECK:STDOUT: %I.impl_witness: = impl_witness file.%I.impl_witness_table, @A.as.I.impl(%V.loc12_14.1) [symbolic = %I.impl_witness (constants.%I.impl_witness.c31b26.1)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %I.type: type = facet_type <@I, @I(%U.loc7_13.1)> [symbolic = %I.type (constants.%I.type.328ca8.1)] -// CHECK:STDOUT: %Self.2: @I.%I.type (%I.type.328ca8.1) = bind_symbolic_name Self, 1 [symbolic = %Self.2 (constants.%Self.0d86b8.1)] -// CHECK:STDOUT: %I.F.type: type = fn_type @I.F, @I(%U.loc7_13.1) [symbolic = %I.F.type (constants.%I.F.type.2aef59.1)] -// CHECK:STDOUT: %I.F: @I.%I.F.type (%I.F.type.2aef59.1) = struct_value () [symbolic = %I.F (constants.%I.F.bb2dd4.1)] -// CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I, @I(%U.loc7_13.1) [symbolic = %I.assoc_type (constants.%I.assoc_type.1e5078.1)] -// CHECK:STDOUT: %assoc0.loc8_26.2: @I.%I.assoc_type (%I.assoc_type.1e5078.1) = assoc_entity element0, %I.F.decl [symbolic = %assoc0.loc8_26.2 (constants.%assoc0.8f0422.1)] -// CHECK:STDOUT: -// CHECK:STDOUT: interface { -// CHECK:STDOUT: %Self.1: @I.%I.type (%I.type.328ca8.1) = bind_symbolic_name Self, 1 [symbolic = %Self.2 (constants.%Self.0d86b8.1)] -// CHECK:STDOUT: %I.F.decl: @I.%I.F.type (%I.F.type.2aef59.1) = fn_decl @I.F [symbolic = @I.%I.F (constants.%I.F.bb2dd4.1)] { -// CHECK:STDOUT: %self.patt: @I.F.%pattern_type.loc8_8 (%pattern_type.857) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @I.F.%pattern_type.loc8_8 (%pattern_type.857) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @I.F.%pattern_type.loc8_22 (%pattern_type.7dcd0a.1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @I.F.%pattern_type.loc8_22 (%pattern_type.7dcd0a.1) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %U.ref: type = name_ref U, @I.%U.loc7_13.2 [symbolic = %U (constants.%U)] -// CHECK:STDOUT: %self.param: @I.F.%Self.as_type.loc8_14.1 (%Self.as_type.ec9) = value_param call_param0 -// CHECK:STDOUT: %.loc8_14.1: type = splice_block %.loc8_14.3 [symbolic = %Self.as_type.loc8_14.1 (constants.%Self.as_type.ec9)] { -// CHECK:STDOUT: %.loc8_14.2: @I.F.%I.type (%I.type.328ca8.1) = specific_constant @I.%Self.1, @I(constants.%U) [symbolic = %Self (constants.%Self.0d86b8.1)] -// CHECK:STDOUT: %Self.ref: @I.F.%I.type (%I.type.328ca8.1) = name_ref Self, %.loc8_14.2 [symbolic = %Self (constants.%Self.0d86b8.1)] -// CHECK:STDOUT: %Self.as_type.loc8_14.2: type = facet_access_type %Self.ref [symbolic = %Self.as_type.loc8_14.1 (constants.%Self.as_type.ec9)] -// CHECK:STDOUT: %.loc8_14.3: type = converted %Self.ref, %Self.as_type.loc8_14.2 [symbolic = %Self.as_type.loc8_14.1 (constants.%Self.as_type.ec9)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @I.F.%Self.as_type.loc8_14.1 (%Self.as_type.ec9) = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref @I.F.%U (%U) = out_param call_param1 -// CHECK:STDOUT: %return: ref @I.F.%U (%U) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %assoc0.loc8_26.1: @I.%I.assoc_type (%I.assoc_type.1e5078.1) = assoc_entity element0, %I.F.decl [symbolic = %assoc0.loc8_26.2 (constants.%assoc0.8f0422.1)] -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self.1 -// CHECK:STDOUT: .U = -// CHECK:STDOUT: .F = %assoc0.loc8_26.1 -// CHECK:STDOUT: witness = (%I.F.decl) -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic impl @A.as.Destroy.impl(@A.%T.loc3_9.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %A: type = class_type @A, @A(%T) [symbolic = %A (constants.%A.13025a.1)] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @A.%Destroy.impl_witness_table, @A.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.7e1)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %A.as.Destroy.impl.Op.type: type = fn_type @A.as.Destroy.impl.Op, @A.as.Destroy.impl(%T) [symbolic = %A.as.Destroy.impl.Op.type (constants.%A.as.Destroy.impl.Op.type)] -// CHECK:STDOUT: %A.as.Destroy.impl.Op: @A.as.Destroy.impl.%A.as.Destroy.impl.Op.type (%A.as.Destroy.impl.Op.type) = struct_value () [symbolic = %A.as.Destroy.impl.Op (constants.%A.as.Destroy.impl.Op)] -// CHECK:STDOUT: -// CHECK:STDOUT: impl: @A.%Self.ref as constants.%Destroy.type { -// CHECK:STDOUT: %A.as.Destroy.impl.Op.decl: @A.as.Destroy.impl.%A.as.Destroy.impl.Op.type (%A.as.Destroy.impl.Op.type) = fn_decl @A.as.Destroy.impl.Op [symbolic = @A.as.Destroy.impl.%A.as.Destroy.impl.Op (constants.%A.as.Destroy.impl.Op)] { -// CHECK:STDOUT: %self.patt: @A.as.Destroy.impl.Op.%pattern_type (%pattern_type.09b) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @A.as.Destroy.impl.Op.%pattern_type (%pattern_type.09b) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc3_19.1: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @A.as.Destroy.impl.Op.%ptr (%ptr.ca9) = value_param call_param0 -// CHECK:STDOUT: %.loc3_19.2: type = splice_block %Self.ref [symbolic = %A (constants.%A.13025a.1)] { -// CHECK:STDOUT: %.loc3_19.3: type = specific_constant constants.%A.13025a.1, @A(constants.%T) [symbolic = %A (constants.%A.13025a.1)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc3_19.3 [symbolic = %A (constants.%A.13025a.1)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @A.as.Destroy.impl.Op.%ptr (%ptr.ca9) = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Op = %A.as.Destroy.impl.Op.decl -// CHECK:STDOUT: witness = @A.%Destroy.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic impl @A.as.I.impl(%V.loc11_14.2: type) { -// CHECK:STDOUT: %V.loc11_14.1: type = bind_symbolic_name V, 0 [symbolic = %V.loc11_14.1 (constants.%V)] -// CHECK:STDOUT: %A.loc11_27.1: type = class_type @A, @A(%V.loc11_14.1) [symbolic = %A.loc11_27.1 (constants.%A.13025a.2)] -// CHECK:STDOUT: %I.type.loc11_35.1: type = facet_type <@I, @I(%V.loc11_14.1)> [symbolic = %I.type.loc11_35.1 (constants.%I.type.328ca8.2)] -// CHECK:STDOUT: %require_complete: = require_complete_type %I.type.loc11_35.1 [symbolic = %require_complete (constants.%require_complete.3e6bdc.1)] -// CHECK:STDOUT: %I.impl_witness: = impl_witness file.%I.impl_witness_table, @A.as.I.impl(%V.loc11_14.1) [symbolic = %I.impl_witness (constants.%I.impl_witness.c31b26.1)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %A.as.I.impl.F.type: type = fn_type @A.as.I.impl.F, @A.as.I.impl(%V.loc11_14.1) [symbolic = %A.as.I.impl.F.type (constants.%A.as.I.impl.F.type.d34923.1)] +// CHECK:STDOUT: %A.as.I.impl.F.type: type = fn_type @A.as.I.impl.F, @A.as.I.impl(%V.loc12_14.1) [symbolic = %A.as.I.impl.F.type (constants.%A.as.I.impl.F.type.d34923.1)] // CHECK:STDOUT: %A.as.I.impl.F: @A.as.I.impl.%A.as.I.impl.F.type (%A.as.I.impl.F.type.d34923.1) = struct_value () [symbolic = %A.as.I.impl.F (constants.%A.as.I.impl.F.9f6f75.1)] // CHECK:STDOUT: -// CHECK:STDOUT: impl: %A.loc11_27.2 as %I.type.loc11_35.2 { +// CHECK:STDOUT: impl: %A.loc12_27.2 as %I.type.loc12_35.2 { // CHECK:STDOUT: %A.as.I.impl.F.decl: @A.as.I.impl.%A.as.I.impl.F.type (%A.as.I.impl.F.type.d34923.1) = fn_decl @A.as.I.impl.F [symbolic = @A.as.I.impl.%A.as.I.impl.F (constants.%A.as.I.impl.F.9f6f75.1)] { -// CHECK:STDOUT: %self.patt: @A.as.I.impl.F.%pattern_type.loc12_8 (%pattern_type.68d8d3.1) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @A.as.I.impl.F.%pattern_type.loc12_8 (%pattern_type.68d8d3.1) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @A.as.I.impl.F.%pattern_type.loc12_22 (%pattern_type.7dcd0a.2) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @A.as.I.impl.F.%pattern_type.loc12_22 (%pattern_type.7dcd0a.2) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %self.patt: @A.as.I.impl.F.%pattern_type.loc13_13 (%pattern_type.09bae9.2) = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: @A.as.I.impl.F.%pattern_type.loc13_13 (%pattern_type.09bae9.2) = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %.loc13_8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: %return.patt: @A.as.I.impl.F.%pattern_type.loc13_28 (%pattern_type.afe393.2) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @A.as.I.impl.F.%pattern_type.loc13_28 (%pattern_type.afe393.2) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %V.ref: type = name_ref V, @A.as.I.impl.%V.loc11_14.2 [symbolic = %V (constants.%V)] -// CHECK:STDOUT: %self.param: @A.as.I.impl.F.%A (%A.13025a.2) = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, @A.as.I.impl.%A.loc11_27.2 [symbolic = %A (constants.%A.13025a.2)] -// CHECK:STDOUT: %self: @A.as.I.impl.F.%A (%A.13025a.2) = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref @A.as.I.impl.F.%V (%V) = out_param call_param1 -// CHECK:STDOUT: %return: ref @A.as.I.impl.F.%V (%V) = return_slot %return.param +// CHECK:STDOUT: %V.ref: type = name_ref V, @A.as.I.impl.%V.loc12_14.2 [symbolic = %V (constants.%V.8b3)] +// CHECK:STDOUT: %ptr.loc13_32.2: type = ptr_type %V.ref [symbolic = %ptr.loc13_32.1 (constants.%ptr.79f131.2)] +// CHECK:STDOUT: %self.param: @A.as.I.impl.F.%ptr.loc13_23.1 (%ptr.ca9f10.2) = value_param call_param0 +// CHECK:STDOUT: %.loc13_23: type = splice_block %ptr.loc13_23.2 [symbolic = %ptr.loc13_23.1 (constants.%ptr.ca9f10.2)] { +// CHECK:STDOUT: %Self.ref: type = name_ref Self, @A.as.I.impl.%A.loc12_27.2 [symbolic = %A (constants.%A.13025a.2)] +// CHECK:STDOUT: %ptr.loc13_23.2: type = ptr_type %Self.ref [symbolic = %ptr.loc13_23.1 (constants.%ptr.ca9f10.2)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %self: @A.as.I.impl.F.%ptr.loc13_23.1 (%ptr.ca9f10.2) = bind_name self, %self.param +// CHECK:STDOUT: %return.param: ref @A.as.I.impl.F.%ptr.loc13_32.1 (%ptr.79f131.2) = out_param call_param1 +// CHECK:STDOUT: %return: ref @A.as.I.impl.F.%ptr.loc13_32.1 (%ptr.79f131.2) = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !members: @@ -335,198 +185,100 @@ fn TestSpecific(a: A({})) -> {} { // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @A(%T.loc3_9.2: type) { -// CHECK:STDOUT: %T.loc3_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc3_9.1 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc3_9.1 [symbolic = %require_complete (constants.%require_complete.4aeca8.1)] -// CHECK:STDOUT: %A: type = class_type @A, @A(%T.loc3_9.1) [symbolic = %A (constants.%A.13025a.1)] -// CHECK:STDOUT: %A.elem: type = unbound_element_type %A, %T.loc3_9.1 [symbolic = %A.elem (constants.%A.elem.1ceb36.1)] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: @A.%T.loc3_9.1 (%T)} [symbolic = %struct_type.n (constants.%struct_type.n.848971.1)] -// CHECK:STDOUT: %complete_type.loc5_1.2: = complete_type_witness %struct_type.n [symbolic = %complete_type.loc5_1.2 (constants.%complete_type.84bb3d.1)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc3_9.2 [symbolic = %T.loc3_9.1 (constants.%T)] -// CHECK:STDOUT: %.loc4: @A.%A.elem (%A.elem.1ceb36.1) = field_decl n, element0 [concrete] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%A.13025a.1 [symbolic = @A.as.Destroy.impl.%A (constants.%A.13025a.1)] -// CHECK:STDOUT: impl_decl @A.as.Destroy.impl [concrete] {} {} -// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@A.as.Destroy.impl.%A.as.Destroy.impl.Op.decl), @A.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @A.as.Destroy.impl(constants.%T) [symbolic = @A.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness.7e1)] -// CHECK:STDOUT: %complete_type.loc5_1.1: = complete_type_witness constants.%struct_type.n.848971.1 [symbolic = %complete_type.loc5_1.2 (constants.%complete_type.84bb3d.1)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc5_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A.13025a.1 -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .n = %.loc4 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @A.as.Destroy.impl.Op(@A.%T.loc3_9.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %A: type = class_type @A, @A(%T) [symbolic = %A (constants.%A.13025a.1)] -// CHECK:STDOUT: %ptr: type = ptr_type %A [symbolic = %ptr (constants.%ptr.ca9)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.09b)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @A.as.Destroy.impl.Op.%ptr (%ptr.ca9)) = "no_op"; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @I.F(@I.%U.loc7_13.2: type, @I.%Self.1: @I.%I.type (%I.type.328ca8.1)) { -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 0 [symbolic = %U (constants.%U)] -// CHECK:STDOUT: %I.type: type = facet_type <@I, @I(%U)> [symbolic = %I.type (constants.%I.type.328ca8.1)] -// CHECK:STDOUT: %Self: @I.F.%I.type (%I.type.328ca8.1) = bind_symbolic_name Self, 1 [symbolic = %Self (constants.%Self.0d86b8.1)] -// CHECK:STDOUT: %Self.as_type.loc8_14.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc8_14.1 (constants.%Self.as_type.ec9)] -// CHECK:STDOUT: %pattern_type.loc8_8: type = pattern_type %Self.as_type.loc8_14.1 [symbolic = %pattern_type.loc8_8 (constants.%pattern_type.857)] -// CHECK:STDOUT: %pattern_type.loc8_22: type = pattern_type %U [symbolic = %pattern_type.loc8_22 (constants.%pattern_type.7dcd0a.1)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @I.F.%Self.as_type.loc8_14.1 (%Self.as_type.ec9)) -> @I.F.%U (%U); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @A.as.I.impl.F(@A.as.I.impl.%V.loc11_14.2: type) { -// CHECK:STDOUT: %V: type = bind_symbolic_name V, 0 [symbolic = %V (constants.%V)] +// CHECK:STDOUT: generic fn @A.as.I.impl.F(@A.as.I.impl.%V.loc12_14.2: type) { +// CHECK:STDOUT: %V: type = bind_symbolic_name V, 0 [symbolic = %V (constants.%V.8b3)] // CHECK:STDOUT: %A: type = class_type @A, @A(%V) [symbolic = %A (constants.%A.13025a.2)] -// CHECK:STDOUT: %pattern_type.loc12_8: type = pattern_type %A [symbolic = %pattern_type.loc12_8 (constants.%pattern_type.68d8d3.1)] -// CHECK:STDOUT: %pattern_type.loc12_22: type = pattern_type %V [symbolic = %pattern_type.loc12_22 (constants.%pattern_type.7dcd0a.2)] +// CHECK:STDOUT: %ptr.loc13_23.1: type = ptr_type %A [symbolic = %ptr.loc13_23.1 (constants.%ptr.ca9f10.2)] +// CHECK:STDOUT: %pattern_type.loc13_13: type = pattern_type %ptr.loc13_23.1 [symbolic = %pattern_type.loc13_13 (constants.%pattern_type.09bae9.2)] +// CHECK:STDOUT: %ptr.loc13_32.1: type = ptr_type %V [symbolic = %ptr.loc13_32.1 (constants.%ptr.79f131.2)] +// CHECK:STDOUT: %pattern_type.loc13_28: type = pattern_type %ptr.loc13_32.1 [symbolic = %pattern_type.loc13_28 (constants.%pattern_type.afe393.2)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc12_22: = require_complete_type %V [symbolic = %require_complete.loc12_22 (constants.%require_complete.4aeca8.2)] -// CHECK:STDOUT: %require_complete.loc12_12: = require_complete_type %A [symbolic = %require_complete.loc12_12 (constants.%require_complete.5b8aee.1)] +// CHECK:STDOUT: %require_complete.loc13_28: = require_complete_type %ptr.loc13_32.1 [symbolic = %require_complete.loc13_28 (constants.%require_complete.6e5e64.1)] +// CHECK:STDOUT: %require_complete.loc13_17: = require_complete_type %ptr.loc13_23.1 [symbolic = %require_complete.loc13_17 (constants.%require_complete.84dcf9.1)] +// CHECK:STDOUT: %require_complete.loc14: = require_complete_type %A [symbolic = %require_complete.loc14 (constants.%require_complete.5b8aee.1)] // CHECK:STDOUT: %A.elem: type = unbound_element_type %A, %V [symbolic = %A.elem (constants.%A.elem.1ceb36.2)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %ptr.loc13_32.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.cb2)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %ptr.loc13_32.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.def)] +// CHECK:STDOUT: %.loc14_12.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc14_12.2 (constants.%.fe5)] +// CHECK:STDOUT: %impl.elem0.loc14_12.2: @A.as.I.impl.F.%.loc14_12.2 (%.fe5) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc14_12.2 (constants.%impl.elem0.429)] +// CHECK:STDOUT: %specific_impl_fn.loc14_12.2: = specific_impl_function %impl.elem0.loc14_12.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc14_12.2 (constants.%specific_impl_fn.d8a)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @A.as.I.impl.F.%A (%A.13025a.2)) -> @A.as.I.impl.F.%V (%V) { +// CHECK:STDOUT: fn(%self.param: @A.as.I.impl.F.%ptr.loc13_23.1 (%ptr.ca9f10.2)) -> @A.as.I.impl.F.%ptr.loc13_32.1 (%ptr.79f131.2) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: @A.as.I.impl.F.%A (%A.13025a.2) = name_ref self, %self +// CHECK:STDOUT: %self.ref: @A.as.I.impl.F.%ptr.loc13_23.1 (%ptr.ca9f10.2) = name_ref self, %self +// CHECK:STDOUT: %.loc14_17.1: ref @A.as.I.impl.F.%A (%A.13025a.2) = deref %self.ref // CHECK:STDOUT: %n.ref: @A.as.I.impl.F.%A.elem (%A.elem.1ceb36.2) = name_ref n, @A.%.loc4 [concrete = @A.%.loc4] -// CHECK:STDOUT: %.loc13_16.1: ref @A.as.I.impl.F.%V (%V) = class_element_access %self.ref, element0 -// CHECK:STDOUT: %.loc13_16.2: @A.as.I.impl.F.%V (%V) = bind_value %.loc13_16.1 -// CHECK:STDOUT: return %.loc13_16.2 +// CHECK:STDOUT: %.loc14_17.2: ref @A.as.I.impl.F.%V (%V.8b3) = class_element_access %.loc14_17.1, element0 +// CHECK:STDOUT: %addr: @A.as.I.impl.F.%ptr.loc13_32.1 (%ptr.79f131.2) = addr_of %.loc14_17.2 +// CHECK:STDOUT: %impl.elem0.loc14_12.1: @A.as.I.impl.F.%.loc14_12.2 (%.fe5) = impl_witness_access constants.%Copy.lookup_impl_witness.cb2, element0 [symbolic = %impl.elem0.loc14_12.2 (constants.%impl.elem0.429)] +// CHECK:STDOUT: %bound_method.loc14_12.1: = bound_method %addr, %impl.elem0.loc14_12.1 +// CHECK:STDOUT: %specific_impl_fn.loc14_12.1: = specific_impl_function %impl.elem0.loc14_12.1, @Copy.Op(constants.%Copy.facet.def) [symbolic = %specific_impl_fn.loc14_12.2 (constants.%specific_impl_fn.d8a)] +// CHECK:STDOUT: %bound_method.loc14_12.2: = bound_method %addr, %specific_impl_fn.loc14_12.1 +// CHECK:STDOUT: %.loc14_12.1: init @A.as.I.impl.F.%ptr.loc13_32.1 (%ptr.79f131.2) = call %bound_method.loc14_12.2(%addr) +// CHECK:STDOUT: return %.loc14_12.1 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @TestGeneric(%W.loc17_16.2: type) { -// CHECK:STDOUT: %W.loc17_16.1: type = bind_symbolic_name W, 0 [symbolic = %W.loc17_16.1 (constants.%W)] -// CHECK:STDOUT: %A.loc17_32.1: type = class_type @A, @A(%W.loc17_16.1) [symbolic = %A.loc17_32.1 (constants.%A.13025a.3)] -// CHECK:STDOUT: %pattern_type.loc17_26: type = pattern_type %A.loc17_32.1 [symbolic = %pattern_type.loc17_26 (constants.%pattern_type.68d8d3.2)] -// CHECK:STDOUT: %pattern_type.loc17_35: type = pattern_type %W.loc17_16.1 [symbolic = %pattern_type.loc17_35 (constants.%pattern_type.7dcd0a.3)] +// CHECK:STDOUT: generic fn @TestGeneric(%W.loc19_16.2: type) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc17_35: = require_complete_type %W.loc17_16.1 [symbolic = %require_complete.loc17_35 (constants.%require_complete.4aeca8.3)] -// CHECK:STDOUT: %require_complete.loc17_27: = require_complete_type %A.loc17_32.1 [symbolic = %require_complete.loc17_27 (constants.%require_complete.5b8aee.2)] -// CHECK:STDOUT: %I.type.loc18_16.2: type = facet_type <@I, @I(%W.loc17_16.1)> [symbolic = %I.type.loc18_16.2 (constants.%I.type.328ca8.3)] -// CHECK:STDOUT: %require_complete.loc18: = require_complete_type %I.type.loc18_16.2 [symbolic = %require_complete.loc18 (constants.%require_complete.3e6bdc.2)] -// CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I, @I(%W.loc17_16.1) [symbolic = %I.assoc_type (constants.%I.assoc_type.1e5078.3)] +// CHECK:STDOUT: +// CHECK:STDOUT: %I.type.loc21_17.2: type = facet_type <@I, @I(%W.loc19_16.1)> [symbolic = %I.type.loc21_17.2 (constants.%I.type.328ca8.3)] +// CHECK:STDOUT: %require_complete.loc21_18: = require_complete_type %I.type.loc21_17.2 [symbolic = %require_complete.loc21_18 (constants.%require_complete.3e6bdc.2)] +// CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I, @I(%W.loc19_16.1) [symbolic = %I.assoc_type (constants.%I.assoc_type.1e5078.3)] // CHECK:STDOUT: %assoc0: @TestGeneric.%I.assoc_type (%I.assoc_type.1e5078.3) = assoc_entity element0, @I.%I.F.decl [symbolic = %assoc0 (constants.%assoc0.8f0422.3)] -// CHECK:STDOUT: %I.lookup_impl_witness: = lookup_impl_witness %A.loc17_32.1, @I, @I(%W.loc17_16.1) [symbolic = %I.lookup_impl_witness (constants.%I.lookup_impl_witness)] -// CHECK:STDOUT: %I.F.type: type = fn_type @I.F, @I(%W.loc17_16.1) [symbolic = %I.F.type (constants.%I.F.type.2aef59.3)] -// CHECK:STDOUT: %I.facet: @TestGeneric.%I.type.loc18_16.2 (%I.type.328ca8.3) = facet_value %A.loc17_32.1, (%I.lookup_impl_witness) [symbolic = %I.facet (constants.%I.facet.99d)] -// CHECK:STDOUT: %.loc18_11: type = fn_type_with_self_type %I.F.type, %I.facet [symbolic = %.loc18_11 (constants.%.02b)] -// CHECK:STDOUT: %impl.elem0.loc18_11.2: @TestGeneric.%.loc18_11 (%.02b) = impl_witness_access %I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc18_11.2 (constants.%impl.elem0)] -// CHECK:STDOUT: %specific_impl_fn.loc18_11.2: = specific_impl_function %impl.elem0.loc18_11.2, @I.F(%W.loc17_16.1, %I.facet) [symbolic = %specific_impl_fn.loc18_11.2 (constants.%specific_impl_fn)] +// CHECK:STDOUT: %I.lookup_impl_witness: = lookup_impl_witness %A.loc19_32.1, @I, @I(%W.loc19_16.1) [symbolic = %I.lookup_impl_witness (constants.%I.lookup_impl_witness)] +// CHECK:STDOUT: %I.F.type: type = fn_type @I.F, @I(%W.loc19_16.1) [symbolic = %I.F.type (constants.%I.F.type.2aef59.3)] +// CHECK:STDOUT: %I.facet: @TestGeneric.%I.type.loc21_17.2 (%I.type.328ca8.3) = facet_value %A.loc19_32.1, (%I.lookup_impl_witness) [symbolic = %I.facet (constants.%I.facet.99d)] +// CHECK:STDOUT: %.loc21_11.2: type = fn_type_with_self_type %I.F.type, %I.facet [symbolic = %.loc21_11.2 (constants.%.02b)] +// CHECK:STDOUT: %impl.elem0.loc21_11.2: @TestGeneric.%.loc21_11.2 (%.02b) = impl_witness_access %I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc21_11.2 (constants.%impl.elem0.dc5)] +// CHECK:STDOUT: %specific_impl_fn.loc21_11.2: = specific_impl_function %impl.elem0.loc21_11.2, @I.F(%W.loc19_16.1, %I.facet) [symbolic = %specific_impl_fn.loc21_11.2 (constants.%specific_impl_fn.486)] +// CHECK:STDOUT: %require_complete.loc21_11: = require_complete_type %A.loc19_32.1 [symbolic = %require_complete.loc21_11 (constants.%require_complete.5b8aee.2)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%a.param: @TestGeneric.%A.loc17_32.1 (%A.13025a.3)) -> @TestGeneric.%W.loc17_16.1 (%W) { +// CHECK:STDOUT: fn(%a.param: @TestGeneric.%ptr.loc19_33.1 (%ptr.ca9f10.3)) -> @TestGeneric.%ptr.loc19_40.1 (%ptr.79f131.4) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.ref: @TestGeneric.%A.loc17_32.1 (%A.13025a.3) = name_ref a, %a +// CHECK:STDOUT: %a.ref: @TestGeneric.%ptr.loc19_33.1 (%ptr.ca9f10.3) = name_ref a, %a // CHECK:STDOUT: %I.ref: %I.type.dac = name_ref I, file.%I.decl [concrete = constants.%I.generic] -// CHECK:STDOUT: %W.ref.loc18: type = name_ref W, %W.loc17_16.2 [symbolic = %W.loc17_16.1 (constants.%W)] -// CHECK:STDOUT: %I.type.loc18_16.1: type = facet_type <@I, @I(constants.%W)> [symbolic = %I.type.loc18_16.2 (constants.%I.type.328ca8.3)] -// CHECK:STDOUT: %.loc18_17: @TestGeneric.%I.assoc_type (%I.assoc_type.1e5078.3) = specific_constant @I.%assoc0.loc8_26.1, @I(constants.%W) [symbolic = %assoc0 (constants.%assoc0.8f0422.3)] -// CHECK:STDOUT: %F.ref: @TestGeneric.%I.assoc_type (%I.assoc_type.1e5078.3) = name_ref F, %.loc18_17 [symbolic = %assoc0 (constants.%assoc0.8f0422.3)] -// CHECK:STDOUT: %impl.elem0.loc18_11.1: @TestGeneric.%.loc18_11 (%.02b) = impl_witness_access constants.%I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc18_11.2 (constants.%impl.elem0)] -// CHECK:STDOUT: %bound_method.loc18_11: = bound_method %a.ref, %impl.elem0.loc18_11.1 -// CHECK:STDOUT: %specific_impl_fn.loc18_11.1: = specific_impl_function %impl.elem0.loc18_11.1, @I.F(constants.%W, constants.%I.facet.99d) [symbolic = %specific_impl_fn.loc18_11.2 (constants.%specific_impl_fn)] -// CHECK:STDOUT: %bound_method.loc18_21: = bound_method %a.ref, %specific_impl_fn.loc18_11.1 -// CHECK:STDOUT: %.loc18_21: init @TestGeneric.%W.loc17_16.1 (%W) = call %bound_method.loc18_21(%a.ref) -// CHECK:STDOUT: %.loc18_22.1: @TestGeneric.%W.loc17_16.1 (%W) = value_of_initializer %.loc18_21 -// CHECK:STDOUT: %.loc18_22.2: @TestGeneric.%W.loc17_16.1 (%W) = converted %.loc18_21, %.loc18_22.1 -// CHECK:STDOUT: return %.loc18_22.2 +// CHECK:STDOUT: %W.ref.loc21: type = name_ref W, %W.loc19_16.2 [symbolic = %W.loc19_16.1 (constants.%W)] +// CHECK:STDOUT: %I.type.loc21_17.1: type = facet_type <@I, @I(constants.%W)> [symbolic = %I.type.loc21_17.2 (constants.%I.type.328ca8.3)] +// CHECK:STDOUT: %.loc21_18: @TestGeneric.%I.assoc_type (%I.assoc_type.1e5078.3) = specific_constant @I.%assoc0.loc8_33.1, @I(constants.%W) [symbolic = %assoc0 (constants.%assoc0.8f0422.3)] +// CHECK:STDOUT: %F.ref: @TestGeneric.%I.assoc_type (%I.assoc_type.1e5078.3) = name_ref F, %.loc21_18 [symbolic = %assoc0 (constants.%assoc0.8f0422.3)] +// CHECK:STDOUT: %.loc21_11.1: ref @TestGeneric.%A.loc19_32.1 (%A.13025a.3) = deref %a.ref +// CHECK:STDOUT: %impl.elem0.loc21_11.1: @TestGeneric.%.loc21_11.2 (%.02b) = impl_witness_access constants.%I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc21_11.2 (constants.%impl.elem0.dc5)] +// CHECK:STDOUT: %bound_method.loc21_11: = bound_method %.loc21_11.1, %impl.elem0.loc21_11.1 +// CHECK:STDOUT: %specific_impl_fn.loc21_11.1: = specific_impl_function %impl.elem0.loc21_11.1, @I.F(constants.%W, constants.%I.facet.99d) [symbolic = %specific_impl_fn.loc21_11.2 (constants.%specific_impl_fn.486)] +// CHECK:STDOUT: %bound_method.loc21_22: = bound_method %.loc21_11.1, %specific_impl_fn.loc21_11.1 +// CHECK:STDOUT: %addr: @TestGeneric.%ptr.loc19_33.1 (%ptr.ca9f10.3) = addr_of %.loc21_11.1 +// CHECK:STDOUT: %.loc21_22: init @TestGeneric.%ptr.loc19_40.1 (%ptr.79f131.4) = call %bound_method.loc21_22(%addr) +// CHECK:STDOUT: return %.loc21_22 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: fn @TestSpecific(%a.param: %A.235) -> %empty_struct_type { +// CHECK:STDOUT: fn @TestSpecific(%a.param: %ptr.197) -> %ptr.c28 { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.ref: %A.235 = name_ref a, %a +// CHECK:STDOUT: %a.ref: %ptr.197 = name_ref a, %a // CHECK:STDOUT: %I.ref: %I.type.dac = name_ref I, file.%I.decl [concrete = constants.%I.generic] -// CHECK:STDOUT: %.loc22_16: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc22_17: type = converted %.loc22_16, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %.loc27_17: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc27_18: type = converted %.loc27_17, constants.%empty_struct_type [concrete = constants.%empty_struct_type] // CHECK:STDOUT: %I.type: type = facet_type <@I, @I(constants.%empty_struct_type)> [concrete = constants.%I.type.cba] -// CHECK:STDOUT: %.loc22_18: %I.assoc_type.22c = specific_constant @I.%assoc0.loc8_26.1, @I(constants.%empty_struct_type) [concrete = constants.%assoc0.722] -// CHECK:STDOUT: %F.ref: %I.assoc_type.22c = name_ref F, %.loc22_18 [concrete = constants.%assoc0.722] +// CHECK:STDOUT: %.loc27_19: %I.assoc_type.22c = specific_constant @I.%assoc0.loc8_33.1, @I(constants.%empty_struct_type) [concrete = constants.%assoc0.722] +// CHECK:STDOUT: %F.ref: %I.assoc_type.22c = name_ref F, %.loc27_19 [concrete = constants.%assoc0.722] +// CHECK:STDOUT: %.loc27_11: ref %A.235 = deref %a.ref // CHECK:STDOUT: %impl.elem0: %.a6c = impl_witness_access constants.%I.impl_witness.365, element0 [concrete = constants.%A.as.I.impl.F.291] -// CHECK:STDOUT: %bound_method.loc22_11: = bound_method %a.ref, %impl.elem0 +// CHECK:STDOUT: %bound_method.loc27_11: = bound_method %.loc27_11, %impl.elem0 // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @A.as.I.impl.F(constants.%empty_struct_type) [concrete = constants.%A.as.I.impl.F.specific_fn] -// CHECK:STDOUT: %bound_method.loc22_22.1: = bound_method %a.ref, %specific_fn -// CHECK:STDOUT: %A.as.I.impl.F.call: init %empty_struct_type = call %bound_method.loc22_22.1(%a.ref) -// CHECK:STDOUT: %.loc22_22.1: ref %empty_struct_type = temporary_storage -// CHECK:STDOUT: %.loc22_22.2: ref %empty_struct_type = temporary %.loc22_22.1, %A.as.I.impl.F.call -// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] -// CHECK:STDOUT: %.loc22_23: %empty_struct_type = converted %A.as.I.impl.F.call, %empty_struct [concrete = constants.%empty_struct] -// CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %.loc22_22.2, constants.%T.as.Destroy.impl.Op.24b -// CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function constants.%T.as.Destroy.impl.Op.24b, @T.as.Destroy.impl.Op(constants.%empty_struct_type) [concrete = constants.%T.as.Destroy.impl.Op.specific_fn] -// CHECK:STDOUT: %bound_method.loc22_22.2: = bound_method %.loc22_22.2, %T.as.Destroy.impl.Op.specific_fn -// CHECK:STDOUT: %addr: %ptr.c28 = addr_of %.loc22_22.2 -// CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc22_22.2(%addr) -// CHECK:STDOUT: return %.loc22_23 +// CHECK:STDOUT: %bound_method.loc27_23: = bound_method %.loc27_11, %specific_fn +// CHECK:STDOUT: %addr: %ptr.197 = addr_of %.loc27_11 +// CHECK:STDOUT: %A.as.I.impl.F.call: init %ptr.c28 = call %bound_method.loc27_23(%addr) +// CHECK:STDOUT: return %A.as.I.impl.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @A(constants.%T) { -// CHECK:STDOUT: %T.loc3_9.1 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @A.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %A => constants.%A.13025a.1 -// CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness.7e1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @A.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %A => constants.%A.13025a.1 -// CHECK:STDOUT: %ptr => constants.%ptr.ca9 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.09b -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @I(constants.%U) { -// CHECK:STDOUT: %U.loc7_13.1 => constants.%U -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @I.F(constants.%U, constants.%Self.0d86b8.1) { -// CHECK:STDOUT: %U => constants.%U -// CHECK:STDOUT: %I.type => constants.%I.type.328ca8.1 -// CHECK:STDOUT: %Self => constants.%Self.0d86b8.1 -// CHECK:STDOUT: %Self.as_type.loc8_14.1 => constants.%Self.as_type.ec9 -// CHECK:STDOUT: %pattern_type.loc8_8 => constants.%pattern_type.857 -// CHECK:STDOUT: %pattern_type.loc8_22 => constants.%pattern_type.7dcd0a.1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @A(constants.%V) { -// CHECK:STDOUT: %T.loc3_9.1 => constants.%V -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4aeca8.2 -// CHECK:STDOUT: %A => constants.%A.13025a.2 -// CHECK:STDOUT: %A.elem => constants.%A.elem.1ceb36.2 -// CHECK:STDOUT: %struct_type.n => constants.%struct_type.n.848971.2 -// CHECK:STDOUT: %complete_type.loc5_1.2 => constants.%complete_type.84bb3d.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @I(constants.%V) { -// CHECK:STDOUT: %U.loc7_13.1 => constants.%V -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %I.type => constants.%I.type.328ca8.2 -// CHECK:STDOUT: %Self.2 => constants.%Self.0d86b8.2 -// CHECK:STDOUT: %I.F.type => constants.%I.F.type.2aef59.2 -// CHECK:STDOUT: %I.F => constants.%I.F.bb2dd4.2 -// CHECK:STDOUT: %I.assoc_type => constants.%I.assoc_type.1e5078.2 -// CHECK:STDOUT: %assoc0.loc8_26.2 => constants.%assoc0.8f0422.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @A.as.I.impl(constants.%V) { -// CHECK:STDOUT: %V.loc11_14.1 => constants.%V -// CHECK:STDOUT: %A.loc11_27.1 => constants.%A.13025a.2 -// CHECK:STDOUT: %I.type.loc11_35.1 => constants.%I.type.328ca8.2 +// CHECK:STDOUT: specific @A.as.I.impl(constants.%V.8b3) { +// CHECK:STDOUT: %V.loc12_14.1 => constants.%V.8b3 +// CHECK:STDOUT: %A.loc12_27.1 => constants.%A.13025a.2 +// CHECK:STDOUT: %I.type.loc12_35.1 => constants.%I.type.328ca8.2 // CHECK:STDOUT: %require_complete => constants.%require_complete.3e6bdc.1 // CHECK:STDOUT: %I.impl_witness => constants.%I.impl_witness.c31b26.1 // CHECK:STDOUT: @@ -535,56 +287,28 @@ fn TestSpecific(a: A({})) -> {} { // CHECK:STDOUT: %A.as.I.impl.F => constants.%A.as.I.impl.F.9f6f75.1 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @A.as.I.impl.F(constants.%V) { -// CHECK:STDOUT: %V => constants.%V +// CHECK:STDOUT: specific @A.as.I.impl.F(constants.%V.8b3) { +// CHECK:STDOUT: %V => constants.%V.8b3 // CHECK:STDOUT: %A => constants.%A.13025a.2 -// CHECK:STDOUT: %pattern_type.loc12_8 => constants.%pattern_type.68d8d3.1 -// CHECK:STDOUT: %pattern_type.loc12_22 => constants.%pattern_type.7dcd0a.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @I.F(constants.%V, constants.%I.facet.cb9) { -// CHECK:STDOUT: %U => constants.%V -// CHECK:STDOUT: %I.type => constants.%I.type.328ca8.2 -// CHECK:STDOUT: %Self => constants.%I.facet.cb9 -// CHECK:STDOUT: %Self.as_type.loc8_14.1 => constants.%A.13025a.2 -// CHECK:STDOUT: %pattern_type.loc8_8 => constants.%pattern_type.68d8d3.1 -// CHECK:STDOUT: %pattern_type.loc8_22 => constants.%pattern_type.7dcd0a.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @A(constants.%W) { -// CHECK:STDOUT: %T.loc3_9.1 => constants.%W -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4aeca8.3 -// CHECK:STDOUT: %A => constants.%A.13025a.3 -// CHECK:STDOUT: %A.elem => constants.%A.elem.1ceb36.3 -// CHECK:STDOUT: %struct_type.n => constants.%struct_type.n.848971.3 -// CHECK:STDOUT: %complete_type.loc5_1.2 => constants.%complete_type.84bb3d.3 +// CHECK:STDOUT: %ptr.loc13_23.1 => constants.%ptr.ca9f10.2 +// CHECK:STDOUT: %pattern_type.loc13_13 => constants.%pattern_type.09bae9.2 +// CHECK:STDOUT: %ptr.loc13_32.1 => constants.%ptr.79f131.2 +// CHECK:STDOUT: %pattern_type.loc13_28 => constants.%pattern_type.afe393.2 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @TestGeneric(constants.%W) { -// CHECK:STDOUT: %W.loc17_16.1 => constants.%W -// CHECK:STDOUT: %A.loc17_32.1 => constants.%A.13025a.3 -// CHECK:STDOUT: %pattern_type.loc17_26 => constants.%pattern_type.68d8d3.2 -// CHECK:STDOUT: %pattern_type.loc17_35 => constants.%pattern_type.7dcd0a.3 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @I(constants.%W) { -// CHECK:STDOUT: %U.loc7_13.1 => constants.%W -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %I.type => constants.%I.type.328ca8.3 -// CHECK:STDOUT: %Self.2 => constants.%Self.0d86b8.3 -// CHECK:STDOUT: %I.F.type => constants.%I.F.type.2aef59.3 -// CHECK:STDOUT: %I.F => constants.%I.F.bb2dd4.3 -// CHECK:STDOUT: %I.assoc_type => constants.%I.assoc_type.1e5078.3 -// CHECK:STDOUT: %assoc0.loc8_26.2 => constants.%assoc0.8f0422.3 +// CHECK:STDOUT: %W.loc19_16.1 => constants.%W +// CHECK:STDOUT: %A.loc19_32.1 => constants.%A.13025a.3 +// CHECK:STDOUT: %ptr.loc19_33.1 => constants.%ptr.ca9f10.3 +// CHECK:STDOUT: %pattern_type.loc19_26 => constants.%pattern_type.09bae9.3 +// CHECK:STDOUT: %ptr.loc19_40.1 => constants.%ptr.79f131.4 +// CHECK:STDOUT: %pattern_type.loc19_36 => constants.%pattern_type.afe393.4 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @A.as.I.impl(constants.%W) { -// CHECK:STDOUT: %V.loc11_14.1 => constants.%W -// CHECK:STDOUT: %A.loc11_27.1 => constants.%A.13025a.3 -// CHECK:STDOUT: %I.type.loc11_35.1 => constants.%I.type.328ca8.3 +// CHECK:STDOUT: %V.loc12_14.1 => constants.%W +// CHECK:STDOUT: %A.loc12_27.1 => constants.%A.13025a.3 +// CHECK:STDOUT: %I.type.loc12_35.1 => constants.%I.type.328ca8.3 // CHECK:STDOUT: %require_complete => constants.%require_complete.3e6bdc.2 // CHECK:STDOUT: %I.impl_witness => constants.%I.impl_witness.c31b26.2 // CHECK:STDOUT: @@ -593,42 +317,10 @@ fn TestSpecific(a: A({})) -> {} { // CHECK:STDOUT: %A.as.I.impl.F => constants.%A.as.I.impl.F.9f6f75.2 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @I.F(constants.%W, constants.%I.facet.99d) { -// CHECK:STDOUT: %U => constants.%W -// CHECK:STDOUT: %I.type => constants.%I.type.328ca8.3 -// CHECK:STDOUT: %Self => constants.%I.facet.99d -// CHECK:STDOUT: %Self.as_type.loc8_14.1 => constants.%A.13025a.3 -// CHECK:STDOUT: %pattern_type.loc8_8 => constants.%pattern_type.68d8d3.2 -// CHECK:STDOUT: %pattern_type.loc8_22 => constants.%pattern_type.7dcd0a.3 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @A(constants.%empty_struct_type) { -// CHECK:STDOUT: %T.loc3_9.1 => constants.%empty_struct_type -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.357 -// CHECK:STDOUT: %A => constants.%A.235 -// CHECK:STDOUT: %A.elem => constants.%A.elem.2af -// CHECK:STDOUT: %struct_type.n => constants.%struct_type.n.91c -// CHECK:STDOUT: %complete_type.loc5_1.2 => constants.%complete_type.0a6 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @I(constants.%empty_struct_type) { -// CHECK:STDOUT: %U.loc7_13.1 => constants.%empty_struct_type -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %I.type => constants.%I.type.cba -// CHECK:STDOUT: %Self.2 => constants.%Self.3aa -// CHECK:STDOUT: %I.F.type => constants.%I.F.type.684 -// CHECK:STDOUT: %I.F => constants.%I.F.a8d -// CHECK:STDOUT: %I.assoc_type => constants.%I.assoc_type.22c -// CHECK:STDOUT: %assoc0.loc8_26.2 => constants.%assoc0.722 -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: specific @A.as.I.impl(constants.%empty_struct_type) { -// CHECK:STDOUT: %V.loc11_14.1 => constants.%empty_struct_type -// CHECK:STDOUT: %A.loc11_27.1 => constants.%A.235 -// CHECK:STDOUT: %I.type.loc11_35.1 => constants.%I.type.cba +// CHECK:STDOUT: %V.loc12_14.1 => constants.%empty_struct_type +// CHECK:STDOUT: %A.loc12_27.1 => constants.%A.235 +// CHECK:STDOUT: %I.type.loc12_35.1 => constants.%I.type.cba // CHECK:STDOUT: %require_complete => constants.%complete_type.03e // CHECK:STDOUT: %I.impl_witness => constants.%I.impl_witness.365 // CHECK:STDOUT: @@ -640,12 +332,20 @@ fn TestSpecific(a: A({})) -> {} { // CHECK:STDOUT: specific @A.as.I.impl.F(constants.%empty_struct_type) { // CHECK:STDOUT: %V => constants.%empty_struct_type // CHECK:STDOUT: %A => constants.%A.235 -// CHECK:STDOUT: %pattern_type.loc12_8 => constants.%pattern_type.496 -// CHECK:STDOUT: %pattern_type.loc12_22 => constants.%pattern_type.a96 +// CHECK:STDOUT: %ptr.loc13_23.1 => constants.%ptr.197 +// CHECK:STDOUT: %pattern_type.loc13_13 => constants.%pattern_type.e47 +// CHECK:STDOUT: %ptr.loc13_32.1 => constants.%ptr.c28 +// CHECK:STDOUT: %pattern_type.loc13_28 => constants.%pattern_type.1cc // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc12_22 => constants.%complete_type.357 -// CHECK:STDOUT: %require_complete.loc12_12 => constants.%complete_type.0a6 +// CHECK:STDOUT: %require_complete.loc13_28 => constants.%complete_type.38e +// CHECK:STDOUT: %require_complete.loc13_17 => constants.%complete_type.d27 +// CHECK:STDOUT: %require_complete.loc14 => constants.%complete_type.0a6 // CHECK:STDOUT: %A.elem => constants.%A.elem.2af +// CHECK:STDOUT: %Copy.lookup_impl_witness => constants.%Copy.impl_witness.bca +// CHECK:STDOUT: %Copy.facet => constants.%Copy.facet.968 +// CHECK:STDOUT: %.loc14_12.2 => constants.%.f28 +// CHECK:STDOUT: %impl.elem0.loc14_12.2 => constants.%ptr.as.Copy.impl.Op.f47 +// CHECK:STDOUT: %specific_impl_fn.loc14_12.2 => constants.%ptr.as.Copy.impl.Op.specific_fn // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/lookup/instance_method.carbon b/toolchain/check/testdata/impl/lookup/instance_method.carbon index 0c7758db8d0b..848c0402c307 100644 --- a/toolchain/check/testdata/impl/lookup/instance_method.carbon +++ b/toolchain/check/testdata/impl/lookup/instance_method.carbon @@ -207,9 +207,7 @@ fn F(c: C) -> i32 { // CHECK:STDOUT: %impl.elem0: %.6ae = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%C.as.I.impl.F] // CHECK:STDOUT: %bound_method: = bound_method %c.ref, %impl.elem0 // CHECK:STDOUT: %C.as.I.impl.F.call: init %i32 = call %bound_method(%c.ref) -// CHECK:STDOUT: %.loc28_15.1: %i32 = value_of_initializer %C.as.I.impl.F.call -// CHECK:STDOUT: %.loc28_15.2: %i32 = converted %C.as.I.impl.F.call, %.loc28_15.1 -// CHECK:STDOUT: return %.loc28_15.2 +// CHECK:STDOUT: return %C.as.I.impl.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.F(constants.%Self.ce4) { diff --git a/toolchain/check/testdata/impl/lookup/specialization.carbon b/toolchain/check/testdata/impl/lookup/specialization.carbon index 9cfde95c614a..7c73c4466cdf 100644 --- a/toolchain/check/testdata/impl/lookup/specialization.carbon +++ b/toolchain/check/testdata/impl/lookup/specialization.carbon @@ -356,19 +356,21 @@ library "[[@TEST_NAME]]"; interface Z { let V:! type; - fn ZZ() -> V; + fn ZZ() -> V*; } +var t: (); + interface Y {} impl forall [T:! Y] T as Z where .V = () { - fn ZZ() -> () { return (); } + fn ZZ() -> ()* { return &t; } } -fn H(W:! Z, X: W.(Z.V)) -> W.(Z.V) { +fn H(W:! Z, X: W.(Z.V)*) -> W.(Z.V)* { return X; } -fn G(U:! Y) -> U.(Z.V) { +fn G(U:! Y) -> U.(Z.V)* { return H(U, U.(Z.ZZ)()); } @@ -376,12 +378,14 @@ class C { impl as Y {} } +var s: {}; + impl C as Z where .V = {} { - fn ZZ() -> {} { return {}; } + fn ZZ() -> {}* { return &s; } } fn F() { - let x: {} = G(C); + let x: {}* = G(C); } // --- specialization_written_after_generic_use_with_generic_interface.carbon @@ -389,19 +393,21 @@ library "[[@TEST_NAME]]"; interface Z(T:! type) { let V:! type; - fn ZZ() -> V; + fn ZZ() -> V*; } +var t: (); + interface Y {} impl forall [T:! Y] T as Z(T) where .V = () { - fn ZZ() -> () { return (); } + fn ZZ() -> ()* { return &t; } } -fn H(U:! Y, W:! Y & Z(U), X: W.(Z(U).V)) -> W.(Z(U).V) { +fn H(U:! Y, W:! Y & Z(U), X: W.(Z(U).V)*) -> W.(Z(U).V)* { return X; } -fn G(U:! Y) -> U.(Z(U).V) { +fn G(U:! Y) -> U.(Z(U).V)* { return H(U, U, U.(Z(U).ZZ)()); } @@ -409,12 +415,14 @@ class C { impl as Y {} } +var s: {}; + impl C as Z(C) where .V = {} { - fn ZZ() -> {} { return {}; } + fn ZZ() -> {}* { return &s; } } fn F() { - let x: {} = G(C); + let x: {}* = G(C); } // --- type_structure_first_difference.carbon @@ -457,12 +465,13 @@ impl forall [T:! type, S:! type] T as Z(S) where .X = {} {} class C(S:! type) { extend impl as Z(S) where .X = () {} - fn CC(a: Self.(Z(S).X)) -> Self.(Z(S).X) { return a; } + fn CC(a: Self.(Z(S).X)*) -> Self.(Z(S).X)* { return a; } } fn F() { - let a: () = C(()).CC(()); - let b: C(()).X = a; + var t: (); + let a: ()* = C(()).CC(&t); + let b: C(()).X = *a; } // --- final_impl_as_specialization.carbon diff --git a/toolchain/check/testdata/impl/lookup/specialization_poison.carbon b/toolchain/check/testdata/impl/lookup/specialization_poison.carbon index 2524f8ab136d..37d0e25a0f5f 100644 --- a/toolchain/check/testdata/impl/lookup/specialization_poison.carbon +++ b/toolchain/check/testdata/impl/lookup/specialization_poison.carbon @@ -165,6 +165,6 @@ fn G[X:! type](p: X*) -> (X*).(I.T) { // TODO: This should be diagnosed as poisoned, as H() uses an associated // constant from the `impl` which was treated as a symbolic, but this would // change it to be a concrete type. -final impl forall [V:! type] V* as I where .T = V { +final impl forall [V:! Core.Copy] V* as I where .T = V { fn F[self: Self]() -> V { return *self; } } diff --git a/toolchain/check/testdata/impl/lookup/specialization_with_symbolic_rewrite.carbon b/toolchain/check/testdata/impl/lookup/specialization_with_symbolic_rewrite.carbon index c8768f5f3e1a..d0a1cf2a6e5c 100644 --- a/toolchain/check/testdata/impl/lookup/specialization_with_symbolic_rewrite.carbon +++ b/toolchain/check/testdata/impl/lookup/specialization_with_symbolic_rewrite.carbon @@ -839,41 +839,50 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %Ptr.type: type = facet_type <@Ptr> [concrete] -// CHECK:STDOUT: %Self: %Ptr.type = bind_symbolic_name Self, 0 [symbolic] +// CHECK:STDOUT: %Self.684: %Ptr.type = bind_symbolic_name Self, 0 [symbolic] // CHECK:STDOUT: %Ptr.assoc_type: type = assoc_entity_type @Ptr [concrete] -// CHECK:STDOUT: %assoc0: %Ptr.assoc_type = assoc_entity element0, @Ptr.%Type [concrete] +// CHECK:STDOUT: %assoc0.d28: %Ptr.assoc_type = assoc_entity element0, @Ptr.%Type [concrete] // CHECK:STDOUT: %type: type = facet_type [concrete] // CHECK:STDOUT: %.Self.eb1: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 0 [symbolic] +// CHECK:STDOUT: %U.8b3: type = bind_symbolic_name U, 0 [symbolic] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %.Self.542: %Ptr.type = bind_symbolic_name .Self [symbolic_self] // CHECK:STDOUT: %.Self.as_type: type = facet_access_type %.Self.542 [symbolic_self] // CHECK:STDOUT: %Ptr.lookup_impl_witness: = lookup_impl_witness %.Self.542, @Ptr [symbolic_self] // CHECK:STDOUT: %Ptr.facet.283: %Ptr.type = facet_value %.Self.as_type, (%Ptr.lookup_impl_witness) [symbolic_self] -// CHECK:STDOUT: %impl.elem0: type = impl_witness_access %Ptr.lookup_impl_witness, element0 [symbolic_self] -// CHECK:STDOUT: %ptr.79f131.1: type = ptr_type %U [symbolic] -// CHECK:STDOUT: %Ptr_where.type.6e0648.1: type = facet_type <@Ptr where %impl.elem0 = %ptr.79f131.1> [symbolic] +// CHECK:STDOUT: %impl.elem0.a93: type = impl_witness_access %Ptr.lookup_impl_witness, element0 [symbolic_self] +// CHECK:STDOUT: %ptr.79f131.1: type = ptr_type %U.8b3 [symbolic] +// CHECK:STDOUT: %Ptr_where.type.6e0648.1: type = facet_type <@Ptr where %impl.elem0.a93 = %ptr.79f131.1> [symbolic] // CHECK:STDOUT: %require_complete.7db06c.1: = require_complete_type %Ptr_where.type.6e0648.1 [symbolic] -// CHECK:STDOUT: %Ptr.impl_witness.f78935.1: = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%U) [symbolic] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %ptr.79f131.2: type = ptr_type %T [symbolic] -// CHECK:STDOUT: %Ptr_where.type.6e0648.2: type = facet_type <@Ptr where %impl.elem0 = %ptr.79f131.2> [symbolic] +// CHECK:STDOUT: %Ptr.impl_witness.f78935.1: = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%U.8b3) [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T.8b3 [symbolic] +// CHECK:STDOUT: %ptr.79f131.2: type = ptr_type %T.8b3 [symbolic] +// CHECK:STDOUT: %Ptr_where.type.6e0648.2: type = facet_type <@Ptr where %impl.elem0.a93 = %ptr.79f131.2> [symbolic] // CHECK:STDOUT: %require_complete.7db06c.2: = require_complete_type %Ptr_where.type.6e0648.2 [symbolic] -// CHECK:STDOUT: %Ptr.impl_witness.f78935.2: = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%T) [symbolic] -// CHECK:STDOUT: %Ptr.facet.c9a: %Ptr.type = facet_value %T, (%Ptr.impl_witness.f78935.2) [symbolic] +// CHECK:STDOUT: %Ptr.impl_witness.f78935.2: = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %Ptr.facet.c9a: %Ptr.type = facet_value %T.8b3, (%Ptr.impl_witness.f78935.2) [symbolic] // CHECK:STDOUT: %pattern_type.afe: type = pattern_type %ptr.79f131.2 [symbolic] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete.6e5: = require_complete_type %ptr.79f131.2 [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] +// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T.8b3 [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.lookup_impl_witness.cb2: = lookup_impl_witness %ptr.79f131.2, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.def: %Copy.type = facet_value %ptr.79f131.2, (%Copy.lookup_impl_witness.cb2) [symbolic] +// CHECK:STDOUT: %.fe5: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.def [symbolic] +// CHECK:STDOUT: %impl.elem0.429: %.fe5 = impl_witness_access %Copy.lookup_impl_witness.cb2, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.d8a: = specific_impl_function %impl.elem0.429, @Copy.Op(%Copy.facet.def) [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -887,25 +896,25 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: impl_decl @U.as.Ptr.impl [concrete] { // CHECK:STDOUT: %U.patt: %pattern_type.98f = symbolic_binding_pattern U, 0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %U.ref.loc7_30: type = name_ref U, %U.loc7_20.1 [symbolic = %U.loc7_20.2 (constants.%U)] +// CHECK:STDOUT: %U.ref.loc7_30: type = name_ref U, %U.loc7_20.1 [symbolic = %U.loc7_20.2 (constants.%U.8b3)] // CHECK:STDOUT: %Ptr.ref: type = name_ref Ptr, file.%Ptr.decl [concrete = constants.%Ptr.type] // CHECK:STDOUT: %.Self.1: %Ptr.type = bind_symbolic_name .Self [symbolic_self = constants.%.Self.542] // CHECK:STDOUT: %.Self.ref: %Ptr.type = name_ref .Self, %.Self.1 [symbolic_self = constants.%.Self.542] -// CHECK:STDOUT: %Type.ref: %Ptr.assoc_type = name_ref Type, @Type.%assoc0 [concrete = constants.%assoc0] +// CHECK:STDOUT: %Type.ref: %Ptr.assoc_type = name_ref Type, @Type.%assoc0 [concrete = constants.%assoc0.d28] // CHECK:STDOUT: %.Self.as_type: type = facet_access_type %.Self.ref [symbolic_self = constants.%.Self.as_type] // CHECK:STDOUT: %.loc7_45: type = converted %.Self.ref, %.Self.as_type [symbolic_self = constants.%.Self.as_type] -// CHECK:STDOUT: %impl.elem0: type = impl_witness_access constants.%Ptr.lookup_impl_witness, element0 [symbolic_self = constants.%impl.elem0] -// CHECK:STDOUT: %U.ref.loc7_53: type = name_ref U, %U.loc7_20.1 [symbolic = %U.loc7_20.2 (constants.%U)] +// CHECK:STDOUT: %impl.elem0: type = impl_witness_access constants.%Ptr.lookup_impl_witness, element0 [symbolic_self = constants.%impl.elem0.a93] +// CHECK:STDOUT: %U.ref.loc7_53: type = name_ref U, %U.loc7_20.1 [symbolic = %U.loc7_20.2 (constants.%U.8b3)] // CHECK:STDOUT: %ptr.loc7_54.1: type = ptr_type %U.ref.loc7_53 [symbolic = %ptr.loc7_54.2 (constants.%ptr.79f131.1)] // CHECK:STDOUT: %.loc7_39: type = where_expr %.Self.1 [symbolic = %Ptr_where.type (constants.%Ptr_where.type.6e0648.1)] { // CHECK:STDOUT: requirement_base_facet_type constants.%Ptr.type // CHECK:STDOUT: requirement_rewrite %impl.elem0, %ptr.loc7_54.1 // CHECK:STDOUT: } // CHECK:STDOUT: %.Self.2: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self.eb1] -// CHECK:STDOUT: %U.loc7_20.1: type = bind_symbolic_name U, 0 [symbolic = %U.loc7_20.2 (constants.%U)] +// CHECK:STDOUT: %U.loc7_20.1: type = bind_symbolic_name U, 0 [symbolic = %U.loc7_20.2 (constants.%U.8b3)] // CHECK:STDOUT: } // CHECK:STDOUT: %Ptr.impl_witness_table = impl_witness_table (%impl_witness_assoc_constant), @U.as.Ptr.impl [concrete] -// CHECK:STDOUT: %Ptr.impl_witness: = impl_witness %Ptr.impl_witness_table, @U.as.Ptr.impl(constants.%U) [symbolic = @U.as.Ptr.impl.%Ptr.impl_witness (constants.%Ptr.impl_witness.f78935.1)] +// CHECK:STDOUT: %Ptr.impl_witness: = impl_witness %Ptr.impl_witness_table, @U.as.Ptr.impl(constants.%U.8b3) [symbolic = @U.as.Ptr.impl.%Ptr.impl_witness (constants.%Ptr.impl_witness.f78935.1)] // CHECK:STDOUT: %impl_witness_assoc_constant: type = impl_witness_assoc_constant constants.%ptr.79f131.1 [symbolic = @U.as.Ptr.impl.%ptr.loc7_54.2 (constants.%ptr.79f131.1)] // CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] @@ -915,26 +924,26 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: %return.patt: @F.%pattern_type.loc9_26 (%pattern_type.afe) = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: @F.%pattern_type.loc9_26 (%pattern_type.afe) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc9_29: type = name_ref T, %T.loc9_6.2 [symbolic = %T.loc9_6.1 (constants.%T)] +// CHECK:STDOUT: %T.ref.loc9_29: type = name_ref T, %T.loc9_6.2 [symbolic = %T.loc9_6.1 (constants.%T.8b3)] // CHECK:STDOUT: %Ptr.ref: type = name_ref Ptr, file.%Ptr.decl [concrete = constants.%Ptr.type] -// CHECK:STDOUT: %Type.ref: %Ptr.assoc_type = name_ref Type, @Type.%assoc0 [concrete = constants.%assoc0] -// CHECK:STDOUT: %Ptr.facet.loc9_30.2: %Ptr.type = facet_value constants.%T, (constants.%Ptr.impl_witness.f78935.2) [symbolic = %Ptr.facet.loc9_30.1 (constants.%Ptr.facet.c9a)] +// CHECK:STDOUT: %Type.ref: %Ptr.assoc_type = name_ref Type, @Type.%assoc0 [concrete = constants.%assoc0.d28] +// CHECK:STDOUT: %Ptr.facet.loc9_30.2: %Ptr.type = facet_value constants.%T.8b3, (constants.%Ptr.impl_witness.f78935.2) [symbolic = %Ptr.facet.loc9_30.1 (constants.%Ptr.facet.c9a)] // CHECK:STDOUT: %.loc9: %Ptr.type = converted %T.ref.loc9_29, %Ptr.facet.loc9_30.2 [symbolic = %Ptr.facet.loc9_30.1 (constants.%Ptr.facet.c9a)] -// CHECK:STDOUT: %impl.elem0: type = impl_witness_access constants.%Ptr.impl_witness.f78935.2, element0 [symbolic = %ptr (constants.%ptr.79f131.2)] +// CHECK:STDOUT: %impl.elem0.loc9: type = impl_witness_access constants.%Ptr.impl_witness.f78935.2, element0 [symbolic = %ptr (constants.%ptr.79f131.2)] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self.eb1] -// CHECK:STDOUT: %T.loc9_6.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc9_6.1 (constants.%T)] -// CHECK:STDOUT: %t.param: ref @F.%T.loc9_6.1 (%T) = ref_param call_param0 -// CHECK:STDOUT: %T.ref.loc9_23: type = name_ref T, %T.loc9_6.2 [symbolic = %T.loc9_6.1 (constants.%T)] -// CHECK:STDOUT: %t: ref @F.%T.loc9_6.1 (%T) = bind_name t, %t.param +// CHECK:STDOUT: %T.loc9_6.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc9_6.1 (constants.%T.8b3)] +// CHECK:STDOUT: %t.param: ref @F.%T.loc9_6.1 (%T.8b3) = ref_param call_param0 +// CHECK:STDOUT: %T.ref.loc9_23: type = name_ref T, %T.loc9_6.2 [symbolic = %T.loc9_6.1 (constants.%T.8b3)] +// CHECK:STDOUT: %t: ref @F.%T.loc9_6.1 (%T.8b3) = bind_name t, %t.param // CHECK:STDOUT: %return.param: ref @F.%ptr (%ptr.79f131.2) = out_param call_param1 // CHECK:STDOUT: %return: ref @F.%ptr (%ptr.79f131.2) = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Ptr { -// CHECK:STDOUT: %Self: %Ptr.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self] +// CHECK:STDOUT: %Self: %Ptr.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self.684] // CHECK:STDOUT: %Type: type = assoc_const_decl @Type [concrete] { -// CHECK:STDOUT: %assoc0: %Ptr.assoc_type = assoc_entity element0, @Ptr.%Type [concrete = constants.%assoc0] +// CHECK:STDOUT: %assoc0: %Ptr.assoc_type = assoc_entity element0, @Ptr.%Type [concrete = constants.%assoc0.d28] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !members: @@ -948,9 +957,9 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @U.as.Ptr.impl(%U.loc7_20.1: type) { -// CHECK:STDOUT: %U.loc7_20.2: type = bind_symbolic_name U, 0 [symbolic = %U.loc7_20.2 (constants.%U)] +// CHECK:STDOUT: %U.loc7_20.2: type = bind_symbolic_name U, 0 [symbolic = %U.loc7_20.2 (constants.%U.8b3)] // CHECK:STDOUT: %ptr.loc7_54.2: type = ptr_type %U.loc7_20.2 [symbolic = %ptr.loc7_54.2 (constants.%ptr.79f131.1)] -// CHECK:STDOUT: %Ptr_where.type: type = facet_type <@Ptr where constants.%impl.elem0 = %ptr.loc7_54.2> [symbolic = %Ptr_where.type (constants.%Ptr_where.type.6e0648.1)] +// CHECK:STDOUT: %Ptr_where.type: type = facet_type <@Ptr where constants.%impl.elem0.a93 = %ptr.loc7_54.2> [symbolic = %Ptr_where.type (constants.%Ptr_where.type.6e0648.1)] // CHECK:STDOUT: %require_complete: = require_complete_type %Ptr_where.type [symbolic = %require_complete (constants.%require_complete.7db06c.1)] // CHECK:STDOUT: %Ptr.impl_witness: = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%U.loc7_20.2) [symbolic = %Ptr.impl_witness (constants.%Ptr.impl_witness.f78935.1)] // CHECK:STDOUT: @@ -963,7 +972,7 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @F(%T.loc9_6.2: type) { -// CHECK:STDOUT: %T.loc9_6.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc9_6.1 (constants.%T)] +// CHECK:STDOUT: %T.loc9_6.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc9_6.1 (constants.%T.8b3)] // CHECK:STDOUT: %pattern_type.loc9_20: type = pattern_type %T.loc9_6.1 [symbolic = %pattern_type.loc9_20 (constants.%pattern_type.7dc)] // CHECK:STDOUT: %Ptr.impl_witness: = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%T.loc9_6.1) [symbolic = %Ptr.impl_witness (constants.%Ptr.impl_witness.f78935.2)] // CHECK:STDOUT: %Ptr.facet.loc9_30.1: %Ptr.type = facet_value %T.loc9_6.1, (%Ptr.impl_witness) [symbolic = %Ptr.facet.loc9_30.1 (constants.%Ptr.facet.c9a)] @@ -973,29 +982,39 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete.loc9_26: = require_complete_type %ptr [symbolic = %require_complete.loc9_26 (constants.%require_complete.6e5)] // CHECK:STDOUT: %require_complete.loc9_16: = require_complete_type %T.loc9_6.1 [symbolic = %require_complete.loc9_16 (constants.%require_complete.4ae)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %ptr, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.cb2)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %ptr, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.def)] +// CHECK:STDOUT: %.loc10_10.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc10_10.2 (constants.%.fe5)] +// CHECK:STDOUT: %impl.elem0.loc10_10.2: @F.%.loc10_10.2 (%.fe5) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc10_10.2 (constants.%impl.elem0.429)] +// CHECK:STDOUT: %specific_impl_fn.loc10_10.2: = specific_impl_function %impl.elem0.loc10_10.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc10_10.2 (constants.%specific_impl_fn.d8a)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%t.param: @F.%T.loc9_6.1 (%T)) -> @F.%ptr (%ptr.79f131.2) { +// CHECK:STDOUT: fn(%t.param: @F.%T.loc9_6.1 (%T.8b3)) -> @F.%ptr (%ptr.79f131.2) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %t.ref: ref @F.%T.loc9_6.1 (%T) = name_ref t, %t +// CHECK:STDOUT: %t.ref: ref @F.%T.loc9_6.1 (%T.8b3) = name_ref t, %t // CHECK:STDOUT: %addr: @F.%ptr (%ptr.79f131.2) = addr_of %t.ref -// CHECK:STDOUT: return %addr +// CHECK:STDOUT: %impl.elem0.loc10_10.1: @F.%.loc10_10.2 (%.fe5) = impl_witness_access constants.%Copy.lookup_impl_witness.cb2, element0 [symbolic = %impl.elem0.loc10_10.2 (constants.%impl.elem0.429)] +// CHECK:STDOUT: %bound_method.loc10_10.1: = bound_method %addr, %impl.elem0.loc10_10.1 +// CHECK:STDOUT: %specific_impl_fn.loc10_10.1: = specific_impl_function %impl.elem0.loc10_10.1, @Copy.Op(constants.%Copy.facet.def) [symbolic = %specific_impl_fn.loc10_10.2 (constants.%specific_impl_fn.d8a)] +// CHECK:STDOUT: %bound_method.loc10_10.2: = bound_method %addr, %specific_impl_fn.loc10_10.1 +// CHECK:STDOUT: %.loc10_10.1: init @F.%ptr (%ptr.79f131.2) = call %bound_method.loc10_10.2(%addr) +// CHECK:STDOUT: return %.loc10_10.1 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Type(constants.%Self) {} +// CHECK:STDOUT: specific @Type(constants.%Self.684) {} // CHECK:STDOUT: // CHECK:STDOUT: specific @Type(constants.%Ptr.facet.283) {} // CHECK:STDOUT: -// CHECK:STDOUT: specific @U.as.Ptr.impl(constants.%U) { -// CHECK:STDOUT: %U.loc7_20.2 => constants.%U +// CHECK:STDOUT: specific @U.as.Ptr.impl(constants.%U.8b3) { +// CHECK:STDOUT: %U.loc7_20.2 => constants.%U.8b3 // CHECK:STDOUT: %ptr.loc7_54.2 => constants.%ptr.79f131.1 // CHECK:STDOUT: %Ptr_where.type => constants.%Ptr_where.type.6e0648.1 // CHECK:STDOUT: %require_complete => constants.%require_complete.7db06c.1 // CHECK:STDOUT: %Ptr.impl_witness => constants.%Ptr.impl_witness.f78935.1 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @U.as.Ptr.impl(constants.%T) { -// CHECK:STDOUT: %U.loc7_20.2 => constants.%T +// CHECK:STDOUT: specific @U.as.Ptr.impl(constants.%T.8b3) { +// CHECK:STDOUT: %U.loc7_20.2 => constants.%T.8b3 // CHECK:STDOUT: %ptr.loc7_54.2 => constants.%ptr.79f131.2 // CHECK:STDOUT: %Ptr_where.type => constants.%Ptr_where.type.6e0648.2 // CHECK:STDOUT: %require_complete => constants.%require_complete.7db06c.2 @@ -1006,8 +1025,8 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: // CHECK:STDOUT: specific @Type(constants.%Ptr.facet.c9a) {} // CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T.loc9_6.1 => constants.%T +// CHECK:STDOUT: specific @F(constants.%T.8b3) { +// CHECK:STDOUT: %T.loc9_6.1 => constants.%T.8b3 // CHECK:STDOUT: %pattern_type.loc9_20 => constants.%pattern_type.7dc // CHECK:STDOUT: %Ptr.impl_witness => constants.%Ptr.impl_witness.f78935.2 // CHECK:STDOUT: %Ptr.facet.loc9_30.1 => constants.%Ptr.facet.c9a @@ -1019,43 +1038,52 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %Ptr.type: type = facet_type <@Ptr> [concrete] -// CHECK:STDOUT: %Self: %Ptr.type = bind_symbolic_name Self, 0 [symbolic] +// CHECK:STDOUT: %Self.684: %Ptr.type = bind_symbolic_name Self, 0 [symbolic] // CHECK:STDOUT: %Ptr.assoc_type: type = assoc_entity_type @Ptr [concrete] -// CHECK:STDOUT: %assoc0: %Ptr.assoc_type = assoc_entity element0, @Ptr.%Type [concrete] +// CHECK:STDOUT: %assoc0.d28: %Ptr.assoc_type = assoc_entity element0, @Ptr.%Type [concrete] // CHECK:STDOUT: %type: type = facet_type [concrete] // CHECK:STDOUT: %.Self.eb1: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 0 [symbolic] +// CHECK:STDOUT: %U.8b3: type = bind_symbolic_name U, 0 [symbolic] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %.Self.542: %Ptr.type = bind_symbolic_name .Self [symbolic_self] // CHECK:STDOUT: %.Self.as_type: type = facet_access_type %.Self.542 [symbolic_self] // CHECK:STDOUT: %Ptr.lookup_impl_witness: = lookup_impl_witness %.Self.542, @Ptr [symbolic_self] // CHECK:STDOUT: %Ptr.facet.283: %Ptr.type = facet_value %.Self.as_type, (%Ptr.lookup_impl_witness) [symbolic_self] -// CHECK:STDOUT: %impl.elem0: type = impl_witness_access %Ptr.lookup_impl_witness, element0 [symbolic_self] -// CHECK:STDOUT: %ptr.79f: type = ptr_type %U [symbolic] -// CHECK:STDOUT: %Ptr_where.type.6e0: type = facet_type <@Ptr where %impl.elem0 = %ptr.79f> [symbolic] +// CHECK:STDOUT: %impl.elem0.a93: type = impl_witness_access %Ptr.lookup_impl_witness, element0 [symbolic_self] +// CHECK:STDOUT: %ptr.79f131.1: type = ptr_type %U.8b3 [symbolic] +// CHECK:STDOUT: %Ptr_where.type.6e0: type = facet_type <@Ptr where %impl.elem0.a93 = %ptr.79f131.1> [symbolic] // CHECK:STDOUT: %require_complete.7db: = require_complete_type %Ptr_where.type.6e0 [symbolic] -// CHECK:STDOUT: %Ptr.impl_witness.f78: = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%U) [symbolic] -// CHECK:STDOUT: %T: %Ptr.type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %Ptr.impl_witness.f78: = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%U.8b3) [symbolic] +// CHECK:STDOUT: %T.684: %Ptr.type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %pattern_type.93a: type = pattern_type %Ptr.type [concrete] -// CHECK:STDOUT: %T.as_type: type = facet_access_type %T [symbolic] -// CHECK:STDOUT: %pattern_type.d6e: type = pattern_type %T.as_type [symbolic] -// CHECK:STDOUT: %ptr.a2b: type = ptr_type %T.as_type [symbolic] -// CHECK:STDOUT: %Ptr_where.type.2a2: type = facet_type <@Ptr where %impl.elem0 = %ptr.a2b> [symbolic] +// CHECK:STDOUT: %T.as_type.fa5: type = facet_access_type %T.684 [symbolic] +// CHECK:STDOUT: %pattern_type.d6e: type = pattern_type %T.as_type.fa5 [symbolic] +// CHECK:STDOUT: %ptr.a2b: type = ptr_type %T.as_type.fa5 [symbolic] +// CHECK:STDOUT: %Ptr_where.type.2a2: type = facet_type <@Ptr where %impl.elem0.a93 = %ptr.a2b> [symbolic] // CHECK:STDOUT: %require_complete.02c: = require_complete_type %Ptr_where.type.2a2 [symbolic] -// CHECK:STDOUT: %Ptr.impl_witness.f47: = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%T.as_type) [symbolic] -// CHECK:STDOUT: %Ptr.facet.044: %Ptr.type = facet_value %T.as_type, (%Ptr.impl_witness.f47) [symbolic] +// CHECK:STDOUT: %Ptr.impl_witness.f47: = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%T.as_type.fa5) [symbolic] +// CHECK:STDOUT: %Ptr.facet.044: %Ptr.type = facet_value %T.as_type.fa5, (%Ptr.impl_witness.f47) [symbolic] // CHECK:STDOUT: %pattern_type.194: type = pattern_type %ptr.a2b [symbolic] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete.c7c: = require_complete_type %ptr.a2b [symbolic] -// CHECK:STDOUT: %require_complete.868: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %require_complete.868: = require_complete_type %T.as_type.fa5 [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.lookup_impl_witness.a50: = lookup_impl_witness %ptr.a2b, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.9a4: %Copy.type = facet_value %ptr.a2b, (%Copy.lookup_impl_witness.a50) [symbolic] +// CHECK:STDOUT: %.d99: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.9a4 [symbolic] +// CHECK:STDOUT: %impl.elem0.eae: %.d99 = impl_witness_access %Copy.lookup_impl_witness.a50, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.796: = specific_impl_function %impl.elem0.eae, @Copy.Op(%Copy.facet.9a4) [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -1069,26 +1097,26 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: impl_decl @U.as.Ptr.impl [concrete] { // CHECK:STDOUT: %U.patt: %pattern_type.98f = symbolic_binding_pattern U, 0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %U.ref.loc7_30: type = name_ref U, %U.loc7_20.1 [symbolic = %U.loc7_20.2 (constants.%U)] +// CHECK:STDOUT: %U.ref.loc7_30: type = name_ref U, %U.loc7_20.1 [symbolic = %U.loc7_20.2 (constants.%U.8b3)] // CHECK:STDOUT: %Ptr.ref: type = name_ref Ptr, file.%Ptr.decl [concrete = constants.%Ptr.type] // CHECK:STDOUT: %.Self.1: %Ptr.type = bind_symbolic_name .Self [symbolic_self = constants.%.Self.542] // CHECK:STDOUT: %.Self.ref: %Ptr.type = name_ref .Self, %.Self.1 [symbolic_self = constants.%.Self.542] -// CHECK:STDOUT: %Type.ref: %Ptr.assoc_type = name_ref Type, @Type.%assoc0 [concrete = constants.%assoc0] +// CHECK:STDOUT: %Type.ref: %Ptr.assoc_type = name_ref Type, @Type.%assoc0 [concrete = constants.%assoc0.d28] // CHECK:STDOUT: %.Self.as_type: type = facet_access_type %.Self.ref [symbolic_self = constants.%.Self.as_type] // CHECK:STDOUT: %.loc7_45: type = converted %.Self.ref, %.Self.as_type [symbolic_self = constants.%.Self.as_type] -// CHECK:STDOUT: %impl.elem0: type = impl_witness_access constants.%Ptr.lookup_impl_witness, element0 [symbolic_self = constants.%impl.elem0] -// CHECK:STDOUT: %U.ref.loc7_53: type = name_ref U, %U.loc7_20.1 [symbolic = %U.loc7_20.2 (constants.%U)] -// CHECK:STDOUT: %ptr.loc7_54.1: type = ptr_type %U.ref.loc7_53 [symbolic = %ptr.loc7_54.2 (constants.%ptr.79f)] +// CHECK:STDOUT: %impl.elem0: type = impl_witness_access constants.%Ptr.lookup_impl_witness, element0 [symbolic_self = constants.%impl.elem0.a93] +// CHECK:STDOUT: %U.ref.loc7_53: type = name_ref U, %U.loc7_20.1 [symbolic = %U.loc7_20.2 (constants.%U.8b3)] +// CHECK:STDOUT: %ptr.loc7_54.1: type = ptr_type %U.ref.loc7_53 [symbolic = %ptr.loc7_54.2 (constants.%ptr.79f131.1)] // CHECK:STDOUT: %.loc7_39: type = where_expr %.Self.1 [symbolic = %Ptr_where.type (constants.%Ptr_where.type.6e0)] { // CHECK:STDOUT: requirement_base_facet_type constants.%Ptr.type // CHECK:STDOUT: requirement_rewrite %impl.elem0, %ptr.loc7_54.1 // CHECK:STDOUT: } // CHECK:STDOUT: %.Self.2: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self.eb1] -// CHECK:STDOUT: %U.loc7_20.1: type = bind_symbolic_name U, 0 [symbolic = %U.loc7_20.2 (constants.%U)] +// CHECK:STDOUT: %U.loc7_20.1: type = bind_symbolic_name U, 0 [symbolic = %U.loc7_20.2 (constants.%U.8b3)] // CHECK:STDOUT: } // CHECK:STDOUT: %Ptr.impl_witness_table = impl_witness_table (%impl_witness_assoc_constant), @U.as.Ptr.impl [concrete] -// CHECK:STDOUT: %Ptr.impl_witness: = impl_witness %Ptr.impl_witness_table, @U.as.Ptr.impl(constants.%U) [symbolic = @U.as.Ptr.impl.%Ptr.impl_witness (constants.%Ptr.impl_witness.f78)] -// CHECK:STDOUT: %impl_witness_assoc_constant: type = impl_witness_assoc_constant constants.%ptr.79f [symbolic = @U.as.Ptr.impl.%ptr.loc7_54.2 (constants.%ptr.79f)] +// CHECK:STDOUT: %Ptr.impl_witness: = impl_witness %Ptr.impl_witness_table, @U.as.Ptr.impl(constants.%U.8b3) [symbolic = @U.as.Ptr.impl.%Ptr.impl_witness (constants.%Ptr.impl_witness.f78)] +// CHECK:STDOUT: %impl_witness_assoc_constant: type = impl_witness_assoc_constant constants.%ptr.79f131.1 [symbolic = @U.as.Ptr.impl.%ptr.loc7_54.2 (constants.%ptr.79f131.1)] // CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { // CHECK:STDOUT: %T.patt: %pattern_type.93a = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: %t.patt: @F.%pattern_type.loc9_19 (%pattern_type.d6e) = binding_pattern t [concrete] @@ -1097,34 +1125,34 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: %return.patt: @F.%pattern_type.loc9_25 (%pattern_type.194) = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: @F.%pattern_type.loc9_25 (%pattern_type.194) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc9_28: %Ptr.type = name_ref T, %T.loc9_6.2 [symbolic = %T.loc9_6.1 (constants.%T)] -// CHECK:STDOUT: %Type.ref: %Ptr.assoc_type = name_ref Type, @Type.%assoc0 [concrete = constants.%assoc0] -// CHECK:STDOUT: %T.as_type.loc9_29.1: type = facet_access_type %T.ref.loc9_28 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type)] -// CHECK:STDOUT: %.loc9_29.1: type = converted %T.ref.loc9_28, %T.as_type.loc9_29.1 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type)] -// CHECK:STDOUT: %T.as_type.loc9_29.2: type = facet_access_type constants.%T [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type)] -// CHECK:STDOUT: %.loc9_29.2: type = converted constants.%T, %T.as_type.loc9_29.2 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type)] -// CHECK:STDOUT: %impl.elem0: type = impl_witness_access constants.%Ptr.impl_witness.f47, element0 [symbolic = %ptr (constants.%ptr.a2b)] +// CHECK:STDOUT: %T.ref.loc9_28: %Ptr.type = name_ref T, %T.loc9_6.2 [symbolic = %T.loc9_6.1 (constants.%T.684)] +// CHECK:STDOUT: %Type.ref: %Ptr.assoc_type = name_ref Type, @Type.%assoc0 [concrete = constants.%assoc0.d28] +// CHECK:STDOUT: %T.as_type.loc9_29.1: type = facet_access_type %T.ref.loc9_28 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type.fa5)] +// CHECK:STDOUT: %.loc9_29.1: type = converted %T.ref.loc9_28, %T.as_type.loc9_29.1 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type.fa5)] +// CHECK:STDOUT: %T.as_type.loc9_29.2: type = facet_access_type constants.%T.684 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type.fa5)] +// CHECK:STDOUT: %.loc9_29.2: type = converted constants.%T.684, %T.as_type.loc9_29.2 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type.fa5)] +// CHECK:STDOUT: %impl.elem0.loc9: type = impl_witness_access constants.%Ptr.impl_witness.f47, element0 [symbolic = %ptr (constants.%ptr.a2b)] // CHECK:STDOUT: %.loc9_10: type = splice_block %Ptr.ref [concrete = constants.%Ptr.type] { // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self.eb1] // CHECK:STDOUT: %Ptr.ref: type = name_ref Ptr, file.%Ptr.decl [concrete = constants.%Ptr.type] // CHECK:STDOUT: } -// CHECK:STDOUT: %T.loc9_6.2: %Ptr.type = bind_symbolic_name T, 0 [symbolic = %T.loc9_6.1 (constants.%T)] -// CHECK:STDOUT: %t.param: ref @F.%T.as_type.loc9_22.1 (%T.as_type) = ref_param call_param0 -// CHECK:STDOUT: %.loc9_22.1: type = splice_block %.loc9_22.2 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type)] { -// CHECK:STDOUT: %T.ref.loc9_22: %Ptr.type = name_ref T, %T.loc9_6.2 [symbolic = %T.loc9_6.1 (constants.%T)] -// CHECK:STDOUT: %T.as_type.loc9_22.2: type = facet_access_type %T.ref.loc9_22 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type)] -// CHECK:STDOUT: %.loc9_22.2: type = converted %T.ref.loc9_22, %T.as_type.loc9_22.2 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type)] +// CHECK:STDOUT: %T.loc9_6.2: %Ptr.type = bind_symbolic_name T, 0 [symbolic = %T.loc9_6.1 (constants.%T.684)] +// CHECK:STDOUT: %t.param: ref @F.%T.as_type.loc9_22.1 (%T.as_type.fa5) = ref_param call_param0 +// CHECK:STDOUT: %.loc9_22.1: type = splice_block %.loc9_22.2 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type.fa5)] { +// CHECK:STDOUT: %T.ref.loc9_22: %Ptr.type = name_ref T, %T.loc9_6.2 [symbolic = %T.loc9_6.1 (constants.%T.684)] +// CHECK:STDOUT: %T.as_type.loc9_22.2: type = facet_access_type %T.ref.loc9_22 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type.fa5)] +// CHECK:STDOUT: %.loc9_22.2: type = converted %T.ref.loc9_22, %T.as_type.loc9_22.2 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type.fa5)] // CHECK:STDOUT: } -// CHECK:STDOUT: %t: ref @F.%T.as_type.loc9_22.1 (%T.as_type) = bind_name t, %t.param +// CHECK:STDOUT: %t: ref @F.%T.as_type.loc9_22.1 (%T.as_type.fa5) = bind_name t, %t.param // CHECK:STDOUT: %return.param: ref @F.%ptr (%ptr.a2b) = out_param call_param1 // CHECK:STDOUT: %return: ref @F.%ptr (%ptr.a2b) = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Ptr { -// CHECK:STDOUT: %Self: %Ptr.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self] +// CHECK:STDOUT: %Self: %Ptr.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self.684] // CHECK:STDOUT: %Type: type = assoc_const_decl @Type [concrete] { -// CHECK:STDOUT: %assoc0: %Ptr.assoc_type = assoc_entity element0, @Ptr.%Type [concrete = constants.%assoc0] +// CHECK:STDOUT: %assoc0: %Ptr.assoc_type = assoc_entity element0, @Ptr.%Type [concrete = constants.%assoc0.d28] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !members: @@ -1138,9 +1166,9 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @U.as.Ptr.impl(%U.loc7_20.1: type) { -// CHECK:STDOUT: %U.loc7_20.2: type = bind_symbolic_name U, 0 [symbolic = %U.loc7_20.2 (constants.%U)] -// CHECK:STDOUT: %ptr.loc7_54.2: type = ptr_type %U.loc7_20.2 [symbolic = %ptr.loc7_54.2 (constants.%ptr.79f)] -// CHECK:STDOUT: %Ptr_where.type: type = facet_type <@Ptr where constants.%impl.elem0 = %ptr.loc7_54.2> [symbolic = %Ptr_where.type (constants.%Ptr_where.type.6e0)] +// CHECK:STDOUT: %U.loc7_20.2: type = bind_symbolic_name U, 0 [symbolic = %U.loc7_20.2 (constants.%U.8b3)] +// CHECK:STDOUT: %ptr.loc7_54.2: type = ptr_type %U.loc7_20.2 [symbolic = %ptr.loc7_54.2 (constants.%ptr.79f131.1)] +// CHECK:STDOUT: %Ptr_where.type: type = facet_type <@Ptr where constants.%impl.elem0.a93 = %ptr.loc7_54.2> [symbolic = %Ptr_where.type (constants.%Ptr_where.type.6e0)] // CHECK:STDOUT: %require_complete: = require_complete_type %Ptr_where.type [symbolic = %require_complete (constants.%require_complete.7db)] // CHECK:STDOUT: %Ptr.impl_witness: = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%U.loc7_20.2) [symbolic = %Ptr.impl_witness (constants.%Ptr.impl_witness.f78)] // CHECK:STDOUT: @@ -1153,8 +1181,8 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @F(%T.loc9_6.2: %Ptr.type) { -// CHECK:STDOUT: %T.loc9_6.1: %Ptr.type = bind_symbolic_name T, 0 [symbolic = %T.loc9_6.1 (constants.%T)] -// CHECK:STDOUT: %T.as_type.loc9_22.1: type = facet_access_type %T.loc9_6.1 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type)] +// CHECK:STDOUT: %T.loc9_6.1: %Ptr.type = bind_symbolic_name T, 0 [symbolic = %T.loc9_6.1 (constants.%T.684)] +// CHECK:STDOUT: %T.as_type.loc9_22.1: type = facet_access_type %T.loc9_6.1 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type.fa5)] // CHECK:STDOUT: %pattern_type.loc9_19: type = pattern_type %T.as_type.loc9_22.1 [symbolic = %pattern_type.loc9_19 (constants.%pattern_type.d6e)] // CHECK:STDOUT: %Ptr.impl_witness: = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%T.as_type.loc9_22.1) [symbolic = %Ptr.impl_witness (constants.%Ptr.impl_witness.f47)] // CHECK:STDOUT: %ptr: type = ptr_type %T.as_type.loc9_22.1 [symbolic = %ptr (constants.%ptr.a2b)] @@ -1163,29 +1191,39 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete.loc9_25: = require_complete_type %ptr [symbolic = %require_complete.loc9_25 (constants.%require_complete.c7c)] // CHECK:STDOUT: %require_complete.loc9_15: = require_complete_type %T.as_type.loc9_22.1 [symbolic = %require_complete.loc9_15 (constants.%require_complete.868)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %ptr, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.a50)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %ptr, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.9a4)] +// CHECK:STDOUT: %.loc10_10.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc10_10.2 (constants.%.d99)] +// CHECK:STDOUT: %impl.elem0.loc10_10.2: @F.%.loc10_10.2 (%.d99) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc10_10.2 (constants.%impl.elem0.eae)] +// CHECK:STDOUT: %specific_impl_fn.loc10_10.2: = specific_impl_function %impl.elem0.loc10_10.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc10_10.2 (constants.%specific_impl_fn.796)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%t.param: @F.%T.as_type.loc9_22.1 (%T.as_type)) -> @F.%ptr (%ptr.a2b) { +// CHECK:STDOUT: fn(%t.param: @F.%T.as_type.loc9_22.1 (%T.as_type.fa5)) -> @F.%ptr (%ptr.a2b) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %t.ref: ref @F.%T.as_type.loc9_22.1 (%T.as_type) = name_ref t, %t +// CHECK:STDOUT: %t.ref: ref @F.%T.as_type.loc9_22.1 (%T.as_type.fa5) = name_ref t, %t // CHECK:STDOUT: %addr: @F.%ptr (%ptr.a2b) = addr_of %t.ref -// CHECK:STDOUT: return %addr +// CHECK:STDOUT: %impl.elem0.loc10_10.1: @F.%.loc10_10.2 (%.d99) = impl_witness_access constants.%Copy.lookup_impl_witness.a50, element0 [symbolic = %impl.elem0.loc10_10.2 (constants.%impl.elem0.eae)] +// CHECK:STDOUT: %bound_method.loc10_10.1: = bound_method %addr, %impl.elem0.loc10_10.1 +// CHECK:STDOUT: %specific_impl_fn.loc10_10.1: = specific_impl_function %impl.elem0.loc10_10.1, @Copy.Op(constants.%Copy.facet.9a4) [symbolic = %specific_impl_fn.loc10_10.2 (constants.%specific_impl_fn.796)] +// CHECK:STDOUT: %bound_method.loc10_10.2: = bound_method %addr, %specific_impl_fn.loc10_10.1 +// CHECK:STDOUT: %.loc10_10.1: init @F.%ptr (%ptr.a2b) = call %bound_method.loc10_10.2(%addr) +// CHECK:STDOUT: return %.loc10_10.1 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Type(constants.%Self) {} +// CHECK:STDOUT: specific @Type(constants.%Self.684) {} // CHECK:STDOUT: // CHECK:STDOUT: specific @Type(constants.%Ptr.facet.283) {} // CHECK:STDOUT: -// CHECK:STDOUT: specific @U.as.Ptr.impl(constants.%U) { -// CHECK:STDOUT: %U.loc7_20.2 => constants.%U -// CHECK:STDOUT: %ptr.loc7_54.2 => constants.%ptr.79f +// CHECK:STDOUT: specific @U.as.Ptr.impl(constants.%U.8b3) { +// CHECK:STDOUT: %U.loc7_20.2 => constants.%U.8b3 +// CHECK:STDOUT: %ptr.loc7_54.2 => constants.%ptr.79f131.1 // CHECK:STDOUT: %Ptr_where.type => constants.%Ptr_where.type.6e0 // CHECK:STDOUT: %require_complete => constants.%require_complete.7db // CHECK:STDOUT: %Ptr.impl_witness => constants.%Ptr.impl_witness.f78 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @U.as.Ptr.impl(constants.%T.as_type) { -// CHECK:STDOUT: %U.loc7_20.2 => constants.%T.as_type +// CHECK:STDOUT: specific @U.as.Ptr.impl(constants.%T.as_type.fa5) { +// CHECK:STDOUT: %U.loc7_20.2 => constants.%T.as_type.fa5 // CHECK:STDOUT: %ptr.loc7_54.2 => constants.%ptr.a2b // CHECK:STDOUT: %Ptr_where.type => constants.%Ptr_where.type.2a2 // CHECK:STDOUT: %require_complete => constants.%require_complete.02c @@ -1196,9 +1234,9 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: // CHECK:STDOUT: specific @Type(constants.%Ptr.facet.044) {} // CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T.loc9_6.1 => constants.%T -// CHECK:STDOUT: %T.as_type.loc9_22.1 => constants.%T.as_type +// CHECK:STDOUT: specific @F(constants.%T.684) { +// CHECK:STDOUT: %T.loc9_6.1 => constants.%T.684 +// CHECK:STDOUT: %T.as_type.loc9_22.1 => constants.%T.as_type.fa5 // CHECK:STDOUT: %pattern_type.loc9_19 => constants.%pattern_type.d6e // CHECK:STDOUT: %Ptr.impl_witness => constants.%Ptr.impl_witness.f47 // CHECK:STDOUT: %ptr => constants.%ptr.a2b @@ -1209,43 +1247,52 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %Ptr.type: type = facet_type <@Ptr> [concrete] -// CHECK:STDOUT: %Self: %Ptr.type = bind_symbolic_name Self, 0 [symbolic] +// CHECK:STDOUT: %Self.684: %Ptr.type = bind_symbolic_name Self, 0 [symbolic] // CHECK:STDOUT: %Ptr.assoc_type: type = assoc_entity_type @Ptr [concrete] -// CHECK:STDOUT: %assoc0: %Ptr.assoc_type = assoc_entity element0, @Ptr.%Type [concrete] +// CHECK:STDOUT: %assoc0.d28: %Ptr.assoc_type = assoc_entity element0, @Ptr.%Type [concrete] // CHECK:STDOUT: %type: type = facet_type [concrete] // CHECK:STDOUT: %.Self.eb1: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 0 [symbolic] +// CHECK:STDOUT: %U.8b3: type = bind_symbolic_name U, 0 [symbolic] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %.Self.542: %Ptr.type = bind_symbolic_name .Self [symbolic_self] // CHECK:STDOUT: %.Self.as_type: type = facet_access_type %.Self.542 [symbolic_self] // CHECK:STDOUT: %Ptr.lookup_impl_witness: = lookup_impl_witness %.Self.542, @Ptr [symbolic_self] // CHECK:STDOUT: %Ptr.facet.283: %Ptr.type = facet_value %.Self.as_type, (%Ptr.lookup_impl_witness) [symbolic_self] -// CHECK:STDOUT: %impl.elem0: type = impl_witness_access %Ptr.lookup_impl_witness, element0 [symbolic_self] -// CHECK:STDOUT: %ptr.79f: type = ptr_type %U [symbolic] -// CHECK:STDOUT: %Ptr_where.type.6e0: type = facet_type <@Ptr where %impl.elem0 = %ptr.79f> [symbolic] +// CHECK:STDOUT: %impl.elem0.a93: type = impl_witness_access %Ptr.lookup_impl_witness, element0 [symbolic_self] +// CHECK:STDOUT: %ptr.79f131.1: type = ptr_type %U.8b3 [symbolic] +// CHECK:STDOUT: %Ptr_where.type.6e0: type = facet_type <@Ptr where %impl.elem0.a93 = %ptr.79f131.1> [symbolic] // CHECK:STDOUT: %require_complete.7db: = require_complete_type %Ptr_where.type.6e0 [symbolic] -// CHECK:STDOUT: %Ptr.impl_witness.f78: = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%U) [symbolic] -// CHECK:STDOUT: %T: %Ptr.type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %Ptr.impl_witness.f78: = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%U.8b3) [symbolic] +// CHECK:STDOUT: %T.684: %Ptr.type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %pattern_type.93a: type = pattern_type %Ptr.type [concrete] -// CHECK:STDOUT: %T.as_type: type = facet_access_type %T [symbolic] -// CHECK:STDOUT: %pattern_type.d6e: type = pattern_type %T.as_type [symbolic] -// CHECK:STDOUT: %ptr.a2b: type = ptr_type %T.as_type [symbolic] -// CHECK:STDOUT: %Ptr_where.type.2a2: type = facet_type <@Ptr where %impl.elem0 = %ptr.a2b> [symbolic] +// CHECK:STDOUT: %T.as_type.fa5: type = facet_access_type %T.684 [symbolic] +// CHECK:STDOUT: %pattern_type.d6e: type = pattern_type %T.as_type.fa5 [symbolic] +// CHECK:STDOUT: %ptr.a2b: type = ptr_type %T.as_type.fa5 [symbolic] +// CHECK:STDOUT: %Ptr_where.type.2a2: type = facet_type <@Ptr where %impl.elem0.a93 = %ptr.a2b> [symbolic] // CHECK:STDOUT: %require_complete.02c: = require_complete_type %Ptr_where.type.2a2 [symbolic] -// CHECK:STDOUT: %Ptr.impl_witness.f47: = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%T.as_type) [symbolic] -// CHECK:STDOUT: %Ptr.facet.044: %Ptr.type = facet_value %T.as_type, (%Ptr.impl_witness.f47) [symbolic] +// CHECK:STDOUT: %Ptr.impl_witness.f47: = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%T.as_type.fa5) [symbolic] +// CHECK:STDOUT: %Ptr.facet.044: %Ptr.type = facet_value %T.as_type.fa5, (%Ptr.impl_witness.f47) [symbolic] // CHECK:STDOUT: %pattern_type.194: type = pattern_type %ptr.a2b [symbolic] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete.c7c: = require_complete_type %ptr.a2b [symbolic] -// CHECK:STDOUT: %require_complete.868: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %require_complete.868: = require_complete_type %T.as_type.fa5 [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.lookup_impl_witness.a50: = lookup_impl_witness %ptr.a2b, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.9a4: %Copy.type = facet_value %ptr.a2b, (%Copy.lookup_impl_witness.a50) [symbolic] +// CHECK:STDOUT: %.d99: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.9a4 [symbolic] +// CHECK:STDOUT: %impl.elem0.eae: %.d99 = impl_witness_access %Copy.lookup_impl_witness.a50, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.796: = specific_impl_function %impl.elem0.eae, @Copy.Op(%Copy.facet.9a4) [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -1259,26 +1306,26 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: impl_decl @U.as.Ptr.impl [concrete] { // CHECK:STDOUT: %U.patt: %pattern_type.98f = symbolic_binding_pattern U, 0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %U.ref.loc7_30: type = name_ref U, %U.loc7_20.1 [symbolic = %U.loc7_20.2 (constants.%U)] +// CHECK:STDOUT: %U.ref.loc7_30: type = name_ref U, %U.loc7_20.1 [symbolic = %U.loc7_20.2 (constants.%U.8b3)] // CHECK:STDOUT: %Ptr.ref: type = name_ref Ptr, file.%Ptr.decl [concrete = constants.%Ptr.type] // CHECK:STDOUT: %.Self.1: %Ptr.type = bind_symbolic_name .Self [symbolic_self = constants.%.Self.542] // CHECK:STDOUT: %.Self.ref: %Ptr.type = name_ref .Self, %.Self.1 [symbolic_self = constants.%.Self.542] -// CHECK:STDOUT: %Type.ref: %Ptr.assoc_type = name_ref Type, @Type.%assoc0 [concrete = constants.%assoc0] +// CHECK:STDOUT: %Type.ref: %Ptr.assoc_type = name_ref Type, @Type.%assoc0 [concrete = constants.%assoc0.d28] // CHECK:STDOUT: %.Self.as_type: type = facet_access_type %.Self.ref [symbolic_self = constants.%.Self.as_type] // CHECK:STDOUT: %.loc7_45: type = converted %.Self.ref, %.Self.as_type [symbolic_self = constants.%.Self.as_type] -// CHECK:STDOUT: %impl.elem0: type = impl_witness_access constants.%Ptr.lookup_impl_witness, element0 [symbolic_self = constants.%impl.elem0] -// CHECK:STDOUT: %U.ref.loc7_53: type = name_ref U, %U.loc7_20.1 [symbolic = %U.loc7_20.2 (constants.%U)] -// CHECK:STDOUT: %ptr.loc7_54.1: type = ptr_type %U.ref.loc7_53 [symbolic = %ptr.loc7_54.2 (constants.%ptr.79f)] +// CHECK:STDOUT: %impl.elem0: type = impl_witness_access constants.%Ptr.lookup_impl_witness, element0 [symbolic_self = constants.%impl.elem0.a93] +// CHECK:STDOUT: %U.ref.loc7_53: type = name_ref U, %U.loc7_20.1 [symbolic = %U.loc7_20.2 (constants.%U.8b3)] +// CHECK:STDOUT: %ptr.loc7_54.1: type = ptr_type %U.ref.loc7_53 [symbolic = %ptr.loc7_54.2 (constants.%ptr.79f131.1)] // CHECK:STDOUT: %.loc7_39: type = where_expr %.Self.1 [symbolic = %Ptr_where.type (constants.%Ptr_where.type.6e0)] { // CHECK:STDOUT: requirement_base_facet_type constants.%Ptr.type // CHECK:STDOUT: requirement_rewrite %impl.elem0, %ptr.loc7_54.1 // CHECK:STDOUT: } // CHECK:STDOUT: %.Self.2: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self.eb1] -// CHECK:STDOUT: %U.loc7_20.1: type = bind_symbolic_name U, 0 [symbolic = %U.loc7_20.2 (constants.%U)] +// CHECK:STDOUT: %U.loc7_20.1: type = bind_symbolic_name U, 0 [symbolic = %U.loc7_20.2 (constants.%U.8b3)] // CHECK:STDOUT: } // CHECK:STDOUT: %Ptr.impl_witness_table = impl_witness_table (%impl_witness_assoc_constant), @U.as.Ptr.impl [concrete] -// CHECK:STDOUT: %Ptr.impl_witness: = impl_witness %Ptr.impl_witness_table, @U.as.Ptr.impl(constants.%U) [symbolic = @U.as.Ptr.impl.%Ptr.impl_witness (constants.%Ptr.impl_witness.f78)] -// CHECK:STDOUT: %impl_witness_assoc_constant: type = impl_witness_assoc_constant constants.%ptr.79f [symbolic = @U.as.Ptr.impl.%ptr.loc7_54.2 (constants.%ptr.79f)] +// CHECK:STDOUT: %Ptr.impl_witness: = impl_witness %Ptr.impl_witness_table, @U.as.Ptr.impl(constants.%U.8b3) [symbolic = @U.as.Ptr.impl.%Ptr.impl_witness (constants.%Ptr.impl_witness.f78)] +// CHECK:STDOUT: %impl_witness_assoc_constant: type = impl_witness_assoc_constant constants.%ptr.79f131.1 [symbolic = @U.as.Ptr.impl.%ptr.loc7_54.2 (constants.%ptr.79f131.1)] // CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { // CHECK:STDOUT: %T.patt: %pattern_type.93a = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: %t.patt: @F.%pattern_type.loc9_19 (%pattern_type.d6e) = binding_pattern t [concrete] @@ -1287,33 +1334,33 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: %return.patt: @F.%pattern_type.loc9_25 (%pattern_type.194) = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: @F.%pattern_type.loc9_25 (%pattern_type.194) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc9_28: %Ptr.type = name_ref T, %T.loc9_6.2 [symbolic = %T.loc9_6.1 (constants.%T)] +// CHECK:STDOUT: %T.ref.loc9_28: %Ptr.type = name_ref T, %T.loc9_6.2 [symbolic = %T.loc9_6.1 (constants.%T.684)] // CHECK:STDOUT: %Ptr.ref.loc9_31: type = name_ref Ptr, file.%Ptr.decl [concrete = constants.%Ptr.type] -// CHECK:STDOUT: %Type.ref: %Ptr.assoc_type = name_ref Type, @Type.%assoc0 [concrete = constants.%assoc0] -// CHECK:STDOUT: %T.as_type.loc9_29: type = facet_access_type constants.%T [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type)] -// CHECK:STDOUT: %.loc9_29: type = converted constants.%T, %T.as_type.loc9_29 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type)] -// CHECK:STDOUT: %impl.elem0: type = impl_witness_access constants.%Ptr.impl_witness.f47, element0 [symbolic = %ptr (constants.%ptr.a2b)] +// CHECK:STDOUT: %Type.ref: %Ptr.assoc_type = name_ref Type, @Type.%assoc0 [concrete = constants.%assoc0.d28] +// CHECK:STDOUT: %T.as_type.loc9_29: type = facet_access_type constants.%T.684 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type.fa5)] +// CHECK:STDOUT: %.loc9_29: type = converted constants.%T.684, %T.as_type.loc9_29 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type.fa5)] +// CHECK:STDOUT: %impl.elem0.loc9: type = impl_witness_access constants.%Ptr.impl_witness.f47, element0 [symbolic = %ptr (constants.%ptr.a2b)] // CHECK:STDOUT: %.loc9_10: type = splice_block %Ptr.ref.loc9_10 [concrete = constants.%Ptr.type] { // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self.eb1] // CHECK:STDOUT: %Ptr.ref.loc9_10: type = name_ref Ptr, file.%Ptr.decl [concrete = constants.%Ptr.type] // CHECK:STDOUT: } -// CHECK:STDOUT: %T.loc9_6.2: %Ptr.type = bind_symbolic_name T, 0 [symbolic = %T.loc9_6.1 (constants.%T)] -// CHECK:STDOUT: %t.param: ref @F.%T.as_type.loc9_22.1 (%T.as_type) = ref_param call_param0 -// CHECK:STDOUT: %.loc9_22.1: type = splice_block %.loc9_22.2 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type)] { -// CHECK:STDOUT: %T.ref.loc9_22: %Ptr.type = name_ref T, %T.loc9_6.2 [symbolic = %T.loc9_6.1 (constants.%T)] -// CHECK:STDOUT: %T.as_type.loc9_22.2: type = facet_access_type %T.ref.loc9_22 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type)] -// CHECK:STDOUT: %.loc9_22.2: type = converted %T.ref.loc9_22, %T.as_type.loc9_22.2 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type)] +// CHECK:STDOUT: %T.loc9_6.2: %Ptr.type = bind_symbolic_name T, 0 [symbolic = %T.loc9_6.1 (constants.%T.684)] +// CHECK:STDOUT: %t.param: ref @F.%T.as_type.loc9_22.1 (%T.as_type.fa5) = ref_param call_param0 +// CHECK:STDOUT: %.loc9_22.1: type = splice_block %.loc9_22.2 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type.fa5)] { +// CHECK:STDOUT: %T.ref.loc9_22: %Ptr.type = name_ref T, %T.loc9_6.2 [symbolic = %T.loc9_6.1 (constants.%T.684)] +// CHECK:STDOUT: %T.as_type.loc9_22.2: type = facet_access_type %T.ref.loc9_22 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type.fa5)] +// CHECK:STDOUT: %.loc9_22.2: type = converted %T.ref.loc9_22, %T.as_type.loc9_22.2 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type.fa5)] // CHECK:STDOUT: } -// CHECK:STDOUT: %t: ref @F.%T.as_type.loc9_22.1 (%T.as_type) = bind_name t, %t.param +// CHECK:STDOUT: %t: ref @F.%T.as_type.loc9_22.1 (%T.as_type.fa5) = bind_name t, %t.param // CHECK:STDOUT: %return.param: ref @F.%ptr (%ptr.a2b) = out_param call_param1 // CHECK:STDOUT: %return: ref @F.%ptr (%ptr.a2b) = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Ptr { -// CHECK:STDOUT: %Self: %Ptr.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self] +// CHECK:STDOUT: %Self: %Ptr.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self.684] // CHECK:STDOUT: %Type: type = assoc_const_decl @Type [concrete] { -// CHECK:STDOUT: %assoc0: %Ptr.assoc_type = assoc_entity element0, @Ptr.%Type [concrete = constants.%assoc0] +// CHECK:STDOUT: %assoc0: %Ptr.assoc_type = assoc_entity element0, @Ptr.%Type [concrete = constants.%assoc0.d28] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !members: @@ -1327,9 +1374,9 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @U.as.Ptr.impl(%U.loc7_20.1: type) { -// CHECK:STDOUT: %U.loc7_20.2: type = bind_symbolic_name U, 0 [symbolic = %U.loc7_20.2 (constants.%U)] -// CHECK:STDOUT: %ptr.loc7_54.2: type = ptr_type %U.loc7_20.2 [symbolic = %ptr.loc7_54.2 (constants.%ptr.79f)] -// CHECK:STDOUT: %Ptr_where.type: type = facet_type <@Ptr where constants.%impl.elem0 = %ptr.loc7_54.2> [symbolic = %Ptr_where.type (constants.%Ptr_where.type.6e0)] +// CHECK:STDOUT: %U.loc7_20.2: type = bind_symbolic_name U, 0 [symbolic = %U.loc7_20.2 (constants.%U.8b3)] +// CHECK:STDOUT: %ptr.loc7_54.2: type = ptr_type %U.loc7_20.2 [symbolic = %ptr.loc7_54.2 (constants.%ptr.79f131.1)] +// CHECK:STDOUT: %Ptr_where.type: type = facet_type <@Ptr where constants.%impl.elem0.a93 = %ptr.loc7_54.2> [symbolic = %Ptr_where.type (constants.%Ptr_where.type.6e0)] // CHECK:STDOUT: %require_complete: = require_complete_type %Ptr_where.type [symbolic = %require_complete (constants.%require_complete.7db)] // CHECK:STDOUT: %Ptr.impl_witness: = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%U.loc7_20.2) [symbolic = %Ptr.impl_witness (constants.%Ptr.impl_witness.f78)] // CHECK:STDOUT: @@ -1342,8 +1389,8 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @F(%T.loc9_6.2: %Ptr.type) { -// CHECK:STDOUT: %T.loc9_6.1: %Ptr.type = bind_symbolic_name T, 0 [symbolic = %T.loc9_6.1 (constants.%T)] -// CHECK:STDOUT: %T.as_type.loc9_22.1: type = facet_access_type %T.loc9_6.1 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type)] +// CHECK:STDOUT: %T.loc9_6.1: %Ptr.type = bind_symbolic_name T, 0 [symbolic = %T.loc9_6.1 (constants.%T.684)] +// CHECK:STDOUT: %T.as_type.loc9_22.1: type = facet_access_type %T.loc9_6.1 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type.fa5)] // CHECK:STDOUT: %pattern_type.loc9_19: type = pattern_type %T.as_type.loc9_22.1 [symbolic = %pattern_type.loc9_19 (constants.%pattern_type.d6e)] // CHECK:STDOUT: %Ptr.impl_witness: = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%T.as_type.loc9_22.1) [symbolic = %Ptr.impl_witness (constants.%Ptr.impl_witness.f47)] // CHECK:STDOUT: %ptr: type = ptr_type %T.as_type.loc9_22.1 [symbolic = %ptr (constants.%ptr.a2b)] @@ -1352,29 +1399,39 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete.loc9_25: = require_complete_type %ptr [symbolic = %require_complete.loc9_25 (constants.%require_complete.c7c)] // CHECK:STDOUT: %require_complete.loc9_15: = require_complete_type %T.as_type.loc9_22.1 [symbolic = %require_complete.loc9_15 (constants.%require_complete.868)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %ptr, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.a50)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %ptr, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.9a4)] +// CHECK:STDOUT: %.loc10_10.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc10_10.2 (constants.%.d99)] +// CHECK:STDOUT: %impl.elem0.loc10_10.2: @F.%.loc10_10.2 (%.d99) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc10_10.2 (constants.%impl.elem0.eae)] +// CHECK:STDOUT: %specific_impl_fn.loc10_10.2: = specific_impl_function %impl.elem0.loc10_10.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc10_10.2 (constants.%specific_impl_fn.796)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%t.param: @F.%T.as_type.loc9_22.1 (%T.as_type)) -> @F.%ptr (%ptr.a2b) { +// CHECK:STDOUT: fn(%t.param: @F.%T.as_type.loc9_22.1 (%T.as_type.fa5)) -> @F.%ptr (%ptr.a2b) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %t.ref: ref @F.%T.as_type.loc9_22.1 (%T.as_type) = name_ref t, %t +// CHECK:STDOUT: %t.ref: ref @F.%T.as_type.loc9_22.1 (%T.as_type.fa5) = name_ref t, %t // CHECK:STDOUT: %addr: @F.%ptr (%ptr.a2b) = addr_of %t.ref -// CHECK:STDOUT: return %addr +// CHECK:STDOUT: %impl.elem0.loc10_10.1: @F.%.loc10_10.2 (%.d99) = impl_witness_access constants.%Copy.lookup_impl_witness.a50, element0 [symbolic = %impl.elem0.loc10_10.2 (constants.%impl.elem0.eae)] +// CHECK:STDOUT: %bound_method.loc10_10.1: = bound_method %addr, %impl.elem0.loc10_10.1 +// CHECK:STDOUT: %specific_impl_fn.loc10_10.1: = specific_impl_function %impl.elem0.loc10_10.1, @Copy.Op(constants.%Copy.facet.9a4) [symbolic = %specific_impl_fn.loc10_10.2 (constants.%specific_impl_fn.796)] +// CHECK:STDOUT: %bound_method.loc10_10.2: = bound_method %addr, %specific_impl_fn.loc10_10.1 +// CHECK:STDOUT: %.loc10_10.1: init @F.%ptr (%ptr.a2b) = call %bound_method.loc10_10.2(%addr) +// CHECK:STDOUT: return %.loc10_10.1 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Type(constants.%Self) {} +// CHECK:STDOUT: specific @Type(constants.%Self.684) {} // CHECK:STDOUT: // CHECK:STDOUT: specific @Type(constants.%Ptr.facet.283) {} // CHECK:STDOUT: -// CHECK:STDOUT: specific @U.as.Ptr.impl(constants.%U) { -// CHECK:STDOUT: %U.loc7_20.2 => constants.%U -// CHECK:STDOUT: %ptr.loc7_54.2 => constants.%ptr.79f +// CHECK:STDOUT: specific @U.as.Ptr.impl(constants.%U.8b3) { +// CHECK:STDOUT: %U.loc7_20.2 => constants.%U.8b3 +// CHECK:STDOUT: %ptr.loc7_54.2 => constants.%ptr.79f131.1 // CHECK:STDOUT: %Ptr_where.type => constants.%Ptr_where.type.6e0 // CHECK:STDOUT: %require_complete => constants.%require_complete.7db // CHECK:STDOUT: %Ptr.impl_witness => constants.%Ptr.impl_witness.f78 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @U.as.Ptr.impl(constants.%T.as_type) { -// CHECK:STDOUT: %U.loc7_20.2 => constants.%T.as_type +// CHECK:STDOUT: specific @U.as.Ptr.impl(constants.%T.as_type.fa5) { +// CHECK:STDOUT: %U.loc7_20.2 => constants.%T.as_type.fa5 // CHECK:STDOUT: %ptr.loc7_54.2 => constants.%ptr.a2b // CHECK:STDOUT: %Ptr_where.type => constants.%Ptr_where.type.2a2 // CHECK:STDOUT: %require_complete => constants.%require_complete.02c @@ -1385,9 +1442,9 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: // CHECK:STDOUT: specific @Type(constants.%Ptr.facet.044) {} // CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T.loc9_6.1 => constants.%T -// CHECK:STDOUT: %T.as_type.loc9_22.1 => constants.%T.as_type +// CHECK:STDOUT: specific @F(constants.%T.684) { +// CHECK:STDOUT: %T.loc9_6.1 => constants.%T.684 +// CHECK:STDOUT: %T.as_type.loc9_22.1 => constants.%T.as_type.fa5 // CHECK:STDOUT: %pattern_type.loc9_19 => constants.%pattern_type.d6e // CHECK:STDOUT: %Ptr.impl_witness => constants.%Ptr.impl_witness.f47 // CHECK:STDOUT: %ptr => constants.%ptr.a2b diff --git a/toolchain/check/testdata/impl/use_assoc_const.carbon b/toolchain/check/testdata/impl/use_assoc_const.carbon index 3193cab59efd..89b75f471d18 100644 --- a/toolchain/check/testdata/impl/use_assoc_const.carbon +++ b/toolchain/check/testdata/impl/use_assoc_const.carbon @@ -365,6 +365,8 @@ fn F() { // CHECK:STDOUT: %C.as.J.impl.F.type: type = fn_type @C.as.J.impl.F [concrete] // CHECK:STDOUT: %C.as.J.impl.F: %C.as.J.impl.F.type = struct_value () [concrete] // CHECK:STDOUT: %J.facet.00a: %J.type = facet_value %C, (%J.impl_witness.71e) [concrete] +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete] +// CHECK:STDOUT: %C.val: %C = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -513,7 +515,7 @@ fn F() { // CHECK:STDOUT: %Self.ref: type = name_ref Self, @empty_tuple.type.as.J.impl.%.loc8_7.2 [concrete = constants.%empty_tuple.type] // CHECK:STDOUT: %self: %empty_tuple.type = bind_name self, %self.param // CHECK:STDOUT: %u.param: %i32 = value_param call_param1 -// CHECK:STDOUT: %.loc9_23: type = splice_block %i32.loc9_23 [concrete = constants.%i32] { +// CHECK:STDOUT: %.loc9: type = splice_block %i32.loc9_23 [concrete = constants.%i32] { // CHECK:STDOUT: %int_32.loc9_23: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] // CHECK:STDOUT: %i32.loc9_23: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: } @@ -603,9 +605,7 @@ fn F() { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem1, @Int.as.Negate.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Negate.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc9_44.2: = bound_method %u.ref, %specific_fn // CHECK:STDOUT: %Int.as.Negate.impl.Op.call: init %i32 = call %bound_method.loc9_44.2(%u.ref) -// CHECK:STDOUT: %.loc9_46.1: %i32 = value_of_initializer %Int.as.Negate.impl.Op.call -// CHECK:STDOUT: %.loc9_46.2: %i32 = converted %Int.as.Negate.impl.Op.call, %.loc9_46.1 -// CHECK:STDOUT: return %.loc9_46.2 +// CHECK:STDOUT: return %Int.as.Negate.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallMethod(%x.param: %empty_tuple.type) -> %i32 { @@ -624,9 +624,7 @@ fn F() { // CHECK:STDOUT: %.loc13_18.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_40.518] // CHECK:STDOUT: %.loc13_18.2: %i32 = converted %int_40, %.loc13_18.1 [concrete = constants.%int_40.518] // CHECK:STDOUT: %empty_tuple.type.as.J.impl.F.call: init %i32 = call %bound_method.loc13_11(%x.ref, %.loc13_18.2) -// CHECK:STDOUT: %.loc13_21.1: %i32 = value_of_initializer %empty_tuple.type.as.J.impl.F.call -// CHECK:STDOUT: %.loc13_21.2: %i32 = converted %empty_tuple.type.as.J.impl.F.call, %.loc13_21.1 -// CHECK:STDOUT: return %.loc13_21.2 +// CHECK:STDOUT: return %empty_tuple.type.as.J.impl.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.Destroy.impl.Op(%self.param: %ptr.019) = "no_op"; @@ -634,7 +632,12 @@ fn F() { // CHECK:STDOUT: fn @C.as.J.impl.F(%self.param: %C, %u.param: %C) -> %C { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %self.ref: %C = name_ref self, %self -// CHECK:STDOUT: return %self.ref +// CHECK:STDOUT: %.loc22_44.1: %empty_struct_type = as_compatible %self.ref +// CHECK:STDOUT: %.loc22_44.2: ref %empty_struct_type = as_compatible %return +// CHECK:STDOUT: %.loc22_44.3: init %empty_struct_type = struct_init () to %.loc22_44.2 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc22_44.4: init %C = as_compatible %.loc22_44.3 [concrete = constants.%C.val] +// CHECK:STDOUT: %.loc22_44.5: init %C = converted %self.ref, %.loc22_44.4 [concrete = constants.%C.val] +// CHECK:STDOUT: return %.loc22_44.5 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @U(constants.%Self.212) {} @@ -864,7 +867,7 @@ fn F() { // CHECK:STDOUT: %int_32.loc11_19: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] // CHECK:STDOUT: %i32.loc11_19: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %u.param: %i32 = value_param call_param0 -// CHECK:STDOUT: %.loc11_11: type = splice_block %i32.loc11_11 [concrete = constants.%i32] { +// CHECK:STDOUT: %.loc11: type = splice_block %i32.loc11_11 [concrete = constants.%i32] { // CHECK:STDOUT: %int_32.loc11_11: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] // CHECK:STDOUT: %i32.loc11_11: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: } @@ -909,9 +912,7 @@ fn F() { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem1, @Int.as.Negate.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Negate.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc11_32.2: = bound_method %u.ref, %specific_fn // CHECK:STDOUT: %Int.as.Negate.impl.Op.call: init %i32 = call %bound_method.loc11_32.2(%u.ref) -// CHECK:STDOUT: %.loc11_34.1: %i32 = value_of_initializer %Int.as.Negate.impl.Op.call -// CHECK:STDOUT: %.loc11_34.2: %i32 = converted %Int.as.Negate.impl.Op.call, %.loc11_34.1 -// CHECK:STDOUT: return %.loc11_34.2 +// CHECK:STDOUT: return %Int.as.Negate.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallFunction() -> %i32 { @@ -931,9 +932,7 @@ fn F() { // CHECK:STDOUT: %.loc15_18.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_4.940] // CHECK:STDOUT: %.loc15_18.2: %i32 = converted %int_4, %.loc15_18.1 [concrete = constants.%int_4.940] // CHECK:STDOUT: %D.as.J.impl.F.call: init %i32 = call %impl.elem1(%.loc15_18.2) -// CHECK:STDOUT: %.loc15_20.1: %i32 = value_of_initializer %D.as.J.impl.F.call -// CHECK:STDOUT: %.loc15_20.2: %i32 = converted %D.as.J.impl.F.call, %.loc15_20.1 -// CHECK:STDOUT: return %.loc15_20.2 +// CHECK:STDOUT: return %D.as.J.impl.F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @U(constants.%Self.212) {} @@ -1358,9 +1357,7 @@ fn F() { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem1, @Int.as.Negate.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Negate.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc12_14.2: = bound_method %u.ref, %specific_fn // CHECK:STDOUT: %Int.as.Negate.impl.Op.call: init %i32 = call %bound_method.loc12_14.2(%u.ref) -// CHECK:STDOUT: %.loc12_16.1: %i32 = value_of_initializer %Int.as.Negate.impl.Op.call -// CHECK:STDOUT: %.loc12_16.2: %i32 = converted %Int.as.Negate.impl.Op.call, %.loc12_16.1 -// CHECK:STDOUT: return %.loc12_16.2 +// CHECK:STDOUT: return %Int.as.Negate.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @E.as.J.impl.G(%self.param: %E, %v.param: %i32) -> %i32 { @@ -1371,9 +1368,7 @@ fn F() { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem1, @Int.as.Negate.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Negate.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc15_14.2: = bound_method %v.ref, %specific_fn // CHECK:STDOUT: %Int.as.Negate.impl.Op.call: init %i32 = call %bound_method.loc15_14.2(%v.ref) -// CHECK:STDOUT: %.loc15_16.1: %i32 = value_of_initializer %Int.as.Negate.impl.Op.call -// CHECK:STDOUT: %.loc15_16.2: %i32 = converted %Int.as.Negate.impl.Op.call, %.loc15_16.1 -// CHECK:STDOUT: return %.loc15_16.2 +// CHECK:STDOUT: return %Int.as.Negate.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @E.as.Destroy.impl.Op(%self.param: %ptr.742) = "no_op"; @@ -1524,9 +1519,7 @@ fn F() { // CHECK:STDOUT: %u.ref: @GenericCallF.%impl.elem0.loc28_34.1 (%impl.elem0.3a2921.2) = name_ref u, %u // CHECK:STDOUT: %specific_impl_fn.loc29_11.1: = specific_impl_function %impl.elem1.loc29_11.1, @J.F(constants.%J.facet.276c17.2) [symbolic = %specific_impl_fn.loc29_11.2 (constants.%specific_impl_fn)] // CHECK:STDOUT: %.loc29_15: init @GenericCallF.%impl.elem0.loc28_34.1 (%impl.elem0.3a2921.2) = call %specific_impl_fn.loc29_11.1(%u.ref) -// CHECK:STDOUT: %.loc29_16.1: @GenericCallF.%impl.elem0.loc28_34.1 (%impl.elem0.3a2921.2) = value_of_initializer %.loc29_15 -// CHECK:STDOUT: %.loc29_16.2: @GenericCallF.%impl.elem0.loc28_34.1 (%impl.elem0.3a2921.2) = converted %.loc29_15, %.loc29_16.1 -// CHECK:STDOUT: return %.loc29_16.2 +// CHECK:STDOUT: return %.loc29_15 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1548,9 +1541,7 @@ fn F() { // CHECK:STDOUT: %.loc33_26.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_2.ef8] // CHECK:STDOUT: %.loc33_26.2: %i32 = converted %int_2, %.loc33_26.1 [concrete = constants.%int_2.ef8] // CHECK:STDOUT: %GenericCallF.call: init %i32 = call %GenericCallF.specific_fn(%e.ref, %.loc33_26.2) -// CHECK:STDOUT: %.loc33_28.1: %i32 = value_of_initializer %GenericCallF.call -// CHECK:STDOUT: %.loc33_28.2: %i32 = converted %GenericCallF.call, %.loc33_28.1 -// CHECK:STDOUT: return %.loc33_28.2 +// CHECK:STDOUT: return %GenericCallF.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @U(constants.%Self.212) {} @@ -1889,9 +1880,7 @@ fn F() { // CHECK:STDOUT: %.loc13_29.4: @GenericResult.%as_type.loc12_35.1 (%as_type.f6fdf9.2) = value_of_initializer %.loc13_29.3 // CHECK:STDOUT: %.loc13_29.5: @GenericResult.%as_type.loc12_35.1 (%as_type.f6fdf9.2) = converted %.loc13_29.3, %.loc13_29.4 // CHECK:STDOUT: %.loc13_30.3: init @GenericResult.%as_type.loc12_35.1 (%as_type.f6fdf9.2) = call %bound_method.loc13_30(%.loc13_15.5, %.loc13_29.5) -// CHECK:STDOUT: %.loc13_31.1: @GenericResult.%as_type.loc12_35.1 (%as_type.f6fdf9.2) = value_of_initializer %.loc13_30.3 -// CHECK:STDOUT: %.loc13_31.2: @GenericResult.%as_type.loc12_35.1 (%as_type.f6fdf9.2) = converted %.loc13_30.3, %.loc13_31.1 -// CHECK:STDOUT: return %.loc13_31.2 +// CHECK:STDOUT: return %.loc13_30.3 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -2111,9 +2100,7 @@ fn F() { // CHECK:STDOUT: %specific_impl_fn.loc9_11.1: = specific_impl_function %impl.elem1.loc9_11.1, @J.G(constants.%J.facet.276c17.2) [symbolic = %specific_impl_fn.loc9_11.2 (constants.%specific_impl_fn)] // CHECK:STDOUT: %bound_method.loc9_19: = bound_method %t.ref, %specific_impl_fn.loc9_11.1 // CHECK:STDOUT: %.loc9_19: init @GenericCallInterfaceQualified.%impl.elem0.loc8_51.1 (%impl.elem0.3a2921.2) = call %bound_method.loc9_19(%t.ref, %u.ref) -// CHECK:STDOUT: %.loc9_20.1: @GenericCallInterfaceQualified.%impl.elem0.loc8_51.1 (%impl.elem0.3a2921.2) = value_of_initializer %.loc9_19 -// CHECK:STDOUT: %.loc9_20.2: @GenericCallInterfaceQualified.%impl.elem0.loc8_51.1 (%impl.elem0.3a2921.2) = converted %.loc9_19, %.loc9_20.1 -// CHECK:STDOUT: return %.loc9_20.2 +// CHECK:STDOUT: return %.loc9_19 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -2342,9 +2329,7 @@ fn F() { // CHECK:STDOUT: %.loc9_14.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_2.ef8] // CHECK:STDOUT: %.loc9_14.2: %i32 = converted %int_2, %.loc9_14.1 [concrete = constants.%int_2.ef8] // CHECK:STDOUT: %.loc9_15: init %i32 = call %specific_impl_fn.loc9_11.1(%.loc9_14.2) -// CHECK:STDOUT: %.loc9_16.1: %i32 = value_of_initializer %.loc9_15 -// CHECK:STDOUT: %.loc9_16.2: %i32 = converted %.loc9_15, %.loc9_16.1 -// CHECK:STDOUT: return %.loc9_16.2 +// CHECK:STDOUT: return %.loc9_15 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -2577,7 +2562,7 @@ fn F() { // CHECK:STDOUT: fn @E.as.J.impl.F.loc24_21.1(%u.param: ) -> { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %u.ref: = name_ref u, %u -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @E.as.J.impl.F.loc24_21.2(%u.param: %i32) -> %i32 [thunk @E.as.J.impl.%E.as.J.impl.F.decl.loc24_21.1] { @@ -2586,7 +2571,7 @@ fn F() { // CHECK:STDOUT: %u.ref: %i32 = name_ref u, %u.param // CHECK:STDOUT: %return.ref: ref %i32 = name_ref , %return.param // CHECK:STDOUT: %E.as.J.impl.F.call: init = call %F.ref() -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @E.as.Destroy.impl.Op(%self.param: %ptr.742) = "no_op"; @@ -2639,6 +2624,7 @@ fn F() { // CHECK:STDOUT: %J2.facet.2bd: %J2.type = facet_value %empty_tuple.type, (%J2.impl_witness.d7c) [concrete] // CHECK:STDOUT: %empty_tuple.type.as.J2.impl.F.type.d5ba25.2: type = fn_type @empty_tuple.type.as.J2.impl.F.loc30_33.2 [concrete] // CHECK:STDOUT: %empty_tuple.type.as.J2.impl.F.a185df.2: %empty_tuple.type.as.J2.impl.F.type.d5ba25.2 = struct_value () [concrete] +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete] // CHECK:STDOUT: %C2: type = class_type @C2 [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] @@ -2656,6 +2642,7 @@ fn F() { // CHECK:STDOUT: %J2.facet.41b: %J2.type = facet_value %C2, (%J2.impl_witness.33e) [concrete] // CHECK:STDOUT: %C2.as.J2.impl.F.type.88fb30.2: type = fn_type @C2.as.J2.impl.F.loc39_33.2 [concrete] // CHECK:STDOUT: %C2.as.J2.impl.F.78bd1b.2: %C2.as.J2.impl.F.type.88fb30.2 = struct_value () [concrete] +// CHECK:STDOUT: %C2.val: %C2 = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -2879,7 +2866,9 @@ fn F() { // CHECK:STDOUT: fn @empty_tuple.type.as.J2.impl.F.loc30_33.1(%self.param: %empty_tuple.type, %z.param: %empty_struct_type) -> %empty_struct_type { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %z.ref: %empty_struct_type = name_ref z, %z -// CHECK:STDOUT: return %z.ref +// CHECK:STDOUT: %.loc30_42: init %empty_struct_type = struct_init () to %return [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc30_43: init %empty_struct_type = converted %z.ref, %.loc30_42 [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc30_43 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @empty_tuple.type.as.J2.impl.F.loc30_33.2(%self.param: %empty_tuple.type, %.param: ) -> [thunk @empty_tuple.type.as.J2.impl.%empty_tuple.type.as.J2.impl.F.decl.loc30_33.1] { @@ -2888,7 +2877,7 @@ fn F() { // CHECK:STDOUT: %self.ref: %empty_tuple.type = name_ref self, %self.param // CHECK:STDOUT: %.ref: = name_ref , %.param // CHECK:STDOUT: %return.ref: ref = name_ref , %return.param -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C2.as.Destroy.impl.Op(%self.param: %ptr.0d6) = "no_op"; @@ -2896,7 +2885,12 @@ fn F() { // CHECK:STDOUT: fn @C2.as.J2.impl.F.loc39_33.1(%self.param: %C2, %z.param: %C2) -> %C2 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %self.ref: %C2 = name_ref self, %self -// CHECK:STDOUT: return %self.ref +// CHECK:STDOUT: %.loc39_46.1: %empty_struct_type = as_compatible %self.ref +// CHECK:STDOUT: %.loc39_46.2: ref %empty_struct_type = as_compatible %return +// CHECK:STDOUT: %.loc39_46.3: init %empty_struct_type = struct_init () to %.loc39_46.2 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc39_46.4: init %C2 = as_compatible %.loc39_46.3 [concrete = constants.%C2.val] +// CHECK:STDOUT: %.loc39_46.5: init %C2 = converted %self.ref, %.loc39_46.4 [concrete = constants.%C2.val] +// CHECK:STDOUT: return %.loc39_46.5 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C2.as.J2.impl.F.loc39_33.2(%self.param: %C2, %.param: ) -> [thunk @C2.as.J2.impl.%C2.as.J2.impl.F.decl.loc39_33.1] { @@ -2907,7 +2901,7 @@ fn F() { // CHECK:STDOUT: %return.ref: ref = name_ref , %return.param // CHECK:STDOUT: %C2.as.J2.impl.F.bound: = bound_method %self.ref, %F.ref // CHECK:STDOUT: %C2.as.J2.impl.F.call: init %C2 = call %C2.as.J2.impl.F.bound(%self.ref, ) -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @U2(constants.%Self.1dc) {} @@ -2966,6 +2960,8 @@ fn F() { // CHECK:STDOUT: %pattern_type.e85: type = pattern_type %struct_type.a [concrete] // CHECK:STDOUT: %empty_tuple.type.as.K.impl.F.type.be31a8.2: type = fn_type @empty_tuple.type.as.K.impl.F.loc16_45.2 [concrete] // CHECK:STDOUT: %empty_tuple.type.as.K.impl.F.062233.2: %empty_tuple.type.as.K.impl.F.type.be31a8.2 = struct_value () [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: %struct: %struct_type.x = struct_value (%empty_tuple) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -3109,7 +3105,13 @@ fn F() { // CHECK:STDOUT: fn @empty_tuple.type.as.K.impl.F.loc16_45.1(%self.param: %empty_tuple.type, %v.param: %struct_type.x) -> %struct_type.x { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %v.ref: %struct_type.x = name_ref v, %v -// CHECK:STDOUT: return %v.ref +// CHECK:STDOUT: %.loc16_54.1: %empty_tuple.type = struct_access %v.ref, element0 +// CHECK:STDOUT: %.loc16_54.2: ref %empty_tuple.type = struct_access %return, element0 +// CHECK:STDOUT: %.loc16_54.3: init %empty_tuple.type = tuple_init () to %.loc16_54.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc16_54.4: init %empty_tuple.type = converted %.loc16_54.1, %.loc16_54.3 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc16_54.5: init %struct_type.x = struct_init (%.loc16_54.4) to %return [concrete = constants.%struct] +// CHECK:STDOUT: %.loc16_55: init %struct_type.x = converted %v.ref, %.loc16_54.5 [concrete = constants.%struct] +// CHECK:STDOUT: return %.loc16_55 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @empty_tuple.type.as.K.impl.F.loc16_45.2(%self.param: %empty_tuple.type, %v.param: %struct_type.a) -> %struct_type.a [thunk @empty_tuple.type.as.K.impl.%empty_tuple.type.as.K.impl.F.decl.loc16_45.1] { @@ -3118,7 +3120,7 @@ fn F() { // CHECK:STDOUT: %self.ref: %empty_tuple.type = name_ref self, %self.param // CHECK:STDOUT: %v.ref: %struct_type.a = name_ref v, %v.param // CHECK:STDOUT: %return.ref: ref %struct_type.a = name_ref , %return.param -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @V(constants.%Self) {} @@ -3271,8 +3273,10 @@ fn F() { // CHECK:STDOUT: %as_type: type = facet_access_type %.loc10_18 [concrete = constants.%empty_tuple.type] // CHECK:STDOUT: %.loc10_23: type = converted %.loc10_18, %as_type [concrete = constants.%empty_tuple.type] // CHECK:STDOUT: %impl.elem0: %struct_type.b.347 = impl_witness_access constants.%M.impl_witness, element0 [concrete = constants.%struct] -// CHECK:STDOUT: %.loc10_25: %empty_struct_type = struct_access %impl.elem0, element0 [concrete = constants.%empty_struct] -// CHECK:STDOUT: return %.loc10_25 +// CHECK:STDOUT: %.loc10_25.1: %empty_struct_type = struct_access %impl.elem0, element0 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc10_25.2: init %empty_struct_type = struct_init () to %return [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc10_27: init %empty_struct_type = converted %.loc10_25.1, %.loc10_25.2 [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc10_27 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Z(constants.%Self) {} @@ -3290,18 +3294,18 @@ fn F() { // CHECK:STDOUT: constants { // CHECK:STDOUT: %type: type = facet_type [concrete] // CHECK:STDOUT: %.Self.eb1: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %C.type: type = generic_class_type @C [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %C.generic: %C.type = struct_value () [concrete] -// CHECK:STDOUT: %C.f2e: type = class_type @C, @C(%T) [symbolic] +// CHECK:STDOUT: %C.f2e: type = class_type @C, @C(%T.8b3) [symbolic] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @C.%Destroy.impl_witness_table, @C.as.Destroy.impl(%T) [symbolic] +// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @C.%Destroy.impl_witness_table, @C.as.Destroy.impl(%T.8b3) [symbolic] // CHECK:STDOUT: %ptr.7d2: type = ptr_type %C.f2e [symbolic] // CHECK:STDOUT: %pattern_type.1d2: type = pattern_type %ptr.7d2 [symbolic] -// CHECK:STDOUT: %C.as.Destroy.impl.Op.type: type = fn_type @C.as.Destroy.impl.Op, @C.as.Destroy.impl(%T) [symbolic] +// CHECK:STDOUT: %C.as.Destroy.impl.Op.type: type = fn_type @C.as.Destroy.impl.Op, @C.as.Destroy.impl(%T.8b3) [symbolic] // CHECK:STDOUT: %C.as.Destroy.impl.Op: %C.as.Destroy.impl.Op.type = struct_value () [symbolic] // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] // CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] @@ -3309,7 +3313,7 @@ fn F() { // CHECK:STDOUT: %Self.484: %M.type = bind_symbolic_name Self, 0 [symbolic] // CHECK:STDOUT: %struct_type.b.86f: type = struct_type {.b: type} [concrete] // CHECK:STDOUT: %M.assoc_type: type = assoc_entity_type @M [concrete] -// CHECK:STDOUT: %assoc0: %M.assoc_type = assoc_entity element0, @M.%Z [concrete] +// CHECK:STDOUT: %assoc0.105: %M.assoc_type = assoc_entity element0, @M.%Z [concrete] // CHECK:STDOUT: %M.G.type: type = fn_type @M.G [concrete] // CHECK:STDOUT: %M.G: %M.G.type = struct_value () [concrete] // CHECK:STDOUT: %assoc1: %M.assoc_type = assoc_entity element1, @M.%M.G.decl [concrete] @@ -3318,31 +3322,44 @@ fn F() { // CHECK:STDOUT: %.Self.as_type: type = facet_access_type %.Self.78d [symbolic_self] // CHECK:STDOUT: %M.lookup_impl_witness: = lookup_impl_witness %.Self.78d, @M [symbolic_self] // CHECK:STDOUT: %M.facet.c53: %M.type = facet_value %.Self.as_type, (%M.lookup_impl_witness) [symbolic_self] -// CHECK:STDOUT: %impl.elem0: %struct_type.b.86f = impl_witness_access %M.lookup_impl_witness, element0 [symbolic_self] +// CHECK:STDOUT: %impl.elem0.441: %struct_type.b.86f = impl_witness_access %M.lookup_impl_witness, element0 [symbolic_self] // CHECK:STDOUT: %struct_type.b.347: type = struct_type {.b: %empty_struct_type} [concrete] // CHECK:STDOUT: %struct_type.b.161: type = struct_type {.b: %empty_tuple.type} [concrete] // CHECK:STDOUT: %struct.0f3: %struct_type.b.86f = struct_value (%empty_struct_type) [concrete] -// CHECK:STDOUT: %M_where.type.123: type = facet_type <@M where %impl.elem0 = %struct.0f3> [concrete] +// CHECK:STDOUT: %M_where.type.123: type = facet_type <@M where %impl.elem0.441 = %struct.0f3> [concrete] // CHECK:STDOUT: %M.impl_witness.889: = impl_witness file.%M.impl_witness_table.loc10 [concrete] // CHECK:STDOUT: %C.as.M.impl.G.type.d59: type = fn_type @C.as.M.impl.G.loc11 [concrete] // CHECK:STDOUT: %C.as.M.impl.G.f14: %C.as.M.impl.G.type.d59 = struct_value () [concrete] // CHECK:STDOUT: %M.facet.eff: %M.type = facet_value %C.7a7, (%M.impl_witness.889) [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.impl_witness.fde: = impl_witness imports.%Copy.impl_witness_table.095 [concrete] +// CHECK:STDOUT: %Copy.facet.0af: %Copy.type = facet_value type, (%Copy.impl_witness.fde) [concrete] +// CHECK:STDOUT: %.130: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.0af [concrete] +// CHECK:STDOUT: %type.as.Copy.impl.Op.type: type = fn_type @type.as.Copy.impl.Op [concrete] +// CHECK:STDOUT: %type.as.Copy.impl.Op: %type.as.Copy.impl.Op.type = struct_value () [concrete] +// CHECK:STDOUT: %type.as.Copy.impl.Op.bound.bca: = bound_method %empty_struct_type, %type.as.Copy.impl.Op [concrete] // CHECK:STDOUT: %C.3a0: type = class_type @C, @C(%empty_tuple.type) [concrete] // CHECK:STDOUT: %struct.c94: %struct_type.b.86f = struct_value (%empty_tuple.type) [concrete] -// CHECK:STDOUT: %M_where.type.998: type = facet_type <@M where %impl.elem0 = %struct.c94> [concrete] +// CHECK:STDOUT: %M_where.type.998: type = facet_type <@M where %impl.elem0.441 = %struct.c94> [concrete] // CHECK:STDOUT: %M.impl_witness.129: = impl_witness file.%M.impl_witness_table.loc16 [concrete] // CHECK:STDOUT: %C.as.M.impl.G.type.379: type = fn_type @C.as.M.impl.G.loc17 [concrete] // CHECK:STDOUT: %C.as.M.impl.G.e99: %C.as.M.impl.G.type.379 = struct_value () [concrete] // CHECK:STDOUT: %M.facet.86a: %M.type = facet_value %C.3a0, (%M.impl_witness.129) [concrete] +// CHECK:STDOUT: %type.as.Copy.impl.Op.bound.f05: = bound_method %empty_tuple.type, %type.as.Copy.impl.Op [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.7bd: %type.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc40_31, loaded [concrete = constants.%type.as.Copy.impl.Op] +// CHECK:STDOUT: %Copy.impl_witness_table.095 = impl_witness_table (%Core.import_ref.7bd), @type.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -3356,7 +3373,7 @@ fn F() { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self.eb1] -// CHECK:STDOUT: %T.loc3_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc3_9.1 (constants.%T)] +// CHECK:STDOUT: %T.loc3_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc3_9.1 (constants.%T.8b3)] // CHECK:STDOUT: } // CHECK:STDOUT: %M.decl: type = interface_decl @M [concrete = constants.%M.type] {} {} // CHECK:STDOUT: impl_decl @C.as.M.impl.99b [concrete] {} { @@ -3367,10 +3384,10 @@ fn F() { // CHECK:STDOUT: %M.ref: type = name_ref M, file.%M.decl [concrete = constants.%M.type] // CHECK:STDOUT: %.Self: %M.type = bind_symbolic_name .Self [symbolic_self = constants.%.Self.78d] // CHECK:STDOUT: %.Self.ref: %M.type = name_ref .Self, %.Self [symbolic_self = constants.%.Self.78d] -// CHECK:STDOUT: %Z.ref: %M.assoc_type = name_ref Z, @Z.%assoc0 [concrete = constants.%assoc0] +// CHECK:STDOUT: %Z.ref: %M.assoc_type = name_ref Z, @Z.%assoc0 [concrete = constants.%assoc0.105] // CHECK:STDOUT: %.Self.as_type: type = facet_access_type %.Self.ref [symbolic_self = constants.%.Self.as_type] // CHECK:STDOUT: %.loc10_23: type = converted %.Self.ref, %.Self.as_type [symbolic_self = constants.%.Self.as_type] -// CHECK:STDOUT: %impl.elem0: %struct_type.b.86f = impl_witness_access constants.%M.lookup_impl_witness, element0 [symbolic_self = constants.%impl.elem0] +// CHECK:STDOUT: %impl.elem0: %struct_type.b.86f = impl_witness_access constants.%M.lookup_impl_witness, element0 [symbolic_self = constants.%impl.elem0.441] // CHECK:STDOUT: %.loc10_35: %empty_struct_type = struct_literal () // CHECK:STDOUT: %.loc10_36.1: %struct_type.b.347 = struct_literal (%.loc10_35) // CHECK:STDOUT: %.loc10_36.2: type = converted %.loc10_35, constants.%empty_struct_type [concrete = constants.%empty_struct_type] @@ -3392,10 +3409,10 @@ fn F() { // CHECK:STDOUT: %M.ref: type = name_ref M, file.%M.decl [concrete = constants.%M.type] // CHECK:STDOUT: %.Self: %M.type = bind_symbolic_name .Self [symbolic_self = constants.%.Self.78d] // CHECK:STDOUT: %.Self.ref: %M.type = name_ref .Self, %.Self [symbolic_self = constants.%.Self.78d] -// CHECK:STDOUT: %Z.ref: %M.assoc_type = name_ref Z, @Z.%assoc0 [concrete = constants.%assoc0] +// CHECK:STDOUT: %Z.ref: %M.assoc_type = name_ref Z, @Z.%assoc0 [concrete = constants.%assoc0.105] // CHECK:STDOUT: %.Self.as_type: type = facet_access_type %.Self.ref [symbolic_self = constants.%.Self.as_type] // CHECK:STDOUT: %.loc16_23: type = converted %.Self.ref, %.Self.as_type [symbolic_self = constants.%.Self.as_type] -// CHECK:STDOUT: %impl.elem0: %struct_type.b.86f = impl_witness_access constants.%M.lookup_impl_witness, element0 [symbolic_self = constants.%impl.elem0] +// CHECK:STDOUT: %impl.elem0: %struct_type.b.86f = impl_witness_access constants.%M.lookup_impl_witness, element0 [symbolic_self = constants.%impl.elem0.441] // CHECK:STDOUT: %.loc16_35: %empty_tuple.type = tuple_literal () // CHECK:STDOUT: %.loc16_36.1: %struct_type.b.161 = struct_literal (%.loc16_35) // CHECK:STDOUT: %.loc16_36.2: type = converted %.loc16_35, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] @@ -3414,7 +3431,7 @@ fn F() { // CHECK:STDOUT: interface @M { // CHECK:STDOUT: %Self: %M.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self.484] // CHECK:STDOUT: %Z: %struct_type.b.86f = assoc_const_decl @Z [concrete] { -// CHECK:STDOUT: %assoc0: %M.assoc_type = assoc_entity element0, @M.%Z [concrete = constants.%assoc0] +// CHECK:STDOUT: %assoc0: %M.assoc_type = assoc_entity element0, @M.%Z [concrete = constants.%assoc0.105] // CHECK:STDOUT: } // CHECK:STDOUT: %M.G.decl: %M.G.type = fn_decl @M.G [concrete = constants.%M.G] { // CHECK:STDOUT: %return.patt: %pattern_type.98f = return_slot_pattern [concrete] @@ -3437,7 +3454,7 @@ fn F() { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @C.as.Destroy.impl(@C.%T.loc3_9.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] // CHECK:STDOUT: %C: type = class_type @C, @C(%T) [symbolic = %C (constants.%C.f2e)] // CHECK:STDOUT: %Destroy.impl_witness: = impl_witness @C.%Destroy.impl_witness_table, @C.as.Destroy.impl(%T) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness)] // CHECK:STDOUT: @@ -3453,7 +3470,7 @@ fn F() { // CHECK:STDOUT: } { // CHECK:STDOUT: %self.param: @C.as.Destroy.impl.Op.%ptr (%ptr.7d2) = value_param call_param0 // CHECK:STDOUT: %.loc3_19.2: type = splice_block %Self.ref [symbolic = %C (constants.%C.f2e)] { -// CHECK:STDOUT: %.loc3_19.3: type = specific_constant constants.%C.f2e, @C(constants.%T) [symbolic = %C (constants.%C.f2e)] +// CHECK:STDOUT: %.loc3_19.3: type = specific_constant constants.%C.f2e, @C(constants.%T.8b3) [symbolic = %C (constants.%C.f2e)] // CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc3_19.3 [symbolic = %C (constants.%C.f2e)] // CHECK:STDOUT: } // CHECK:STDOUT: %self: @C.as.Destroy.impl.Op.%ptr (%ptr.7d2) = bind_name self, %self.param @@ -3496,7 +3513,7 @@ fn F() { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic class @C(%T.loc3_9.2: type) { -// CHECK:STDOUT: %T.loc3_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc3_9.1 (constants.%T)] +// CHECK:STDOUT: %T.loc3_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc3_9.1 (constants.%T.8b3)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: @@ -3504,7 +3521,7 @@ fn F() { // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C.f2e [symbolic = @C.as.Destroy.impl.%C (constants.%C.f2e)] // CHECK:STDOUT: impl_decl @C.as.Destroy.impl [concrete] {} {} // CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@C.as.Destroy.impl.%C.as.Destroy.impl.Op.decl), @C.as.Destroy.impl [concrete] -// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @C.as.Destroy.impl(constants.%T) [symbolic = @C.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness)] +// CHECK:STDOUT: %Destroy.impl_witness: = impl_witness %Destroy.impl_witness_table, @C.as.Destroy.impl(constants.%T.8b3) [symbolic = @C.as.Destroy.impl.%Destroy.impl_witness (constants.%Destroy.impl_witness)] // CHECK:STDOUT: %complete_type: = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type] // CHECK:STDOUT: complete_type_witness = %complete_type // CHECK:STDOUT: @@ -3514,7 +3531,7 @@ fn F() { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @C.as.Destroy.impl.Op(@C.%T.loc3_9.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] // CHECK:STDOUT: %C: type = class_type @C, @C(%T) [symbolic = %C (constants.%C.f2e)] // CHECK:STDOUT: %ptr: type = ptr_type %C [symbolic = %ptr (constants.%ptr.7d2)] // CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [symbolic = %pattern_type (constants.%pattern_type.1d2)] @@ -3534,12 +3551,15 @@ fn F() { // CHECK:STDOUT: %M.ref: type = name_ref M, file.%M.decl [concrete = constants.%M.type] // CHECK:STDOUT: %M.facet: %M.type = facet_value constants.%C.7a7, (constants.%M.impl_witness.889) [concrete = constants.%M.facet.eff] // CHECK:STDOUT: %.loc12_18: %M.type = converted %Self.ref, %M.facet [concrete = constants.%M.facet.eff] -// CHECK:STDOUT: %Z.ref: %M.assoc_type = name_ref Z, @Z.%assoc0 [concrete = constants.%assoc0] +// CHECK:STDOUT: %Z.ref: %M.assoc_type = name_ref Z, @Z.%assoc0 [concrete = constants.%assoc0.105] // CHECK:STDOUT: %as_type: type = facet_access_type %.loc12_18 [concrete = constants.%C.7a7] // CHECK:STDOUT: %.loc12_23: type = converted %.loc12_18, %as_type [concrete = constants.%C.7a7] -// CHECK:STDOUT: %impl.elem0: %struct_type.b.86f = impl_witness_access constants.%M.impl_witness.889, element0 [concrete = constants.%struct.0f3] -// CHECK:STDOUT: %.loc12_25: type = struct_access %impl.elem0, element0 [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: return %.loc12_25 +// CHECK:STDOUT: %impl.elem0.loc12_23: %struct_type.b.86f = impl_witness_access constants.%M.impl_witness.889, element0 [concrete = constants.%struct.0f3] +// CHECK:STDOUT: %.loc12_25: type = struct_access %impl.elem0.loc12_23, element0 [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %impl.elem0.loc12_25: %.130 = impl_witness_access constants.%Copy.impl_witness.fde, element0 [concrete = constants.%type.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %.loc12_25, %impl.elem0.loc12_25 [concrete = constants.%type.as.Copy.impl.Op.bound.bca] +// CHECK:STDOUT: %type.as.Copy.impl.Op.call: init type = call %bound_method(%.loc12_25) [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: return %type.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.M.impl.G.loc17() -> type { @@ -3548,26 +3568,29 @@ fn F() { // CHECK:STDOUT: %M.ref: type = name_ref M, file.%M.decl [concrete = constants.%M.type] // CHECK:STDOUT: %M.facet: %M.type = facet_value constants.%C.3a0, (constants.%M.impl_witness.129) [concrete = constants.%M.facet.86a] // CHECK:STDOUT: %.loc18_18: %M.type = converted %Self.ref, %M.facet [concrete = constants.%M.facet.86a] -// CHECK:STDOUT: %Z.ref: %M.assoc_type = name_ref Z, @Z.%assoc0 [concrete = constants.%assoc0] +// CHECK:STDOUT: %Z.ref: %M.assoc_type = name_ref Z, @Z.%assoc0 [concrete = constants.%assoc0.105] // CHECK:STDOUT: %as_type: type = facet_access_type %.loc18_18 [concrete = constants.%C.3a0] // CHECK:STDOUT: %.loc18_23: type = converted %.loc18_18, %as_type [concrete = constants.%C.3a0] -// CHECK:STDOUT: %impl.elem0: %struct_type.b.86f = impl_witness_access constants.%M.impl_witness.129, element0 [concrete = constants.%struct.c94] -// CHECK:STDOUT: %.loc18_25: type = struct_access %impl.elem0, element0 [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: return %.loc18_25 +// CHECK:STDOUT: %impl.elem0.loc18_23: %struct_type.b.86f = impl_witness_access constants.%M.impl_witness.129, element0 [concrete = constants.%struct.c94] +// CHECK:STDOUT: %.loc18_25: type = struct_access %impl.elem0.loc18_23, element0 [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: %impl.elem0.loc18_25: %.130 = impl_witness_access constants.%Copy.impl_witness.fde, element0 [concrete = constants.%type.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %.loc18_25, %impl.elem0.loc18_25 [concrete = constants.%type.as.Copy.impl.Op.bound.f05] +// CHECK:STDOUT: %type.as.Copy.impl.Op.call: init type = call %bound_method(%.loc18_25) [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: return %type.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%T) { -// CHECK:STDOUT: %T.loc3_9.1 => constants.%T +// CHECK:STDOUT: specific @C(constants.%T.8b3) { +// CHECK:STDOUT: %T.loc3_9.1 => constants.%T.8b3 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @C.as.Destroy.impl(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @C.as.Destroy.impl(constants.%T.8b3) { +// CHECK:STDOUT: %T => constants.%T.8b3 // CHECK:STDOUT: %C => constants.%C.f2e // CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @C.as.Destroy.impl.Op(constants.%T) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @C.as.Destroy.impl.Op(constants.%T.8b3) { +// CHECK:STDOUT: %T => constants.%T.8b3 // CHECK:STDOUT: %C => constants.%C.f2e // CHECK:STDOUT: %ptr => constants.%ptr.7d2 // CHECK:STDOUT: %pattern_type => constants.%pattern_type.1d2 @@ -3699,7 +3722,7 @@ fn F() { // CHECK:STDOUT: %Core.import_ref.02e: @Int.as.ImplicitAs.impl.%Int.as.ImplicitAs.impl.Convert.type (%Int.as.ImplicitAs.impl.Convert.type.eb9) = import_ref Core//prelude/parts/int, loc27_44, loaded [symbolic = @Int.as.ImplicitAs.impl.%Int.as.ImplicitAs.impl.Convert (constants.%Int.as.ImplicitAs.impl.Convert.958)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.13c = impl_witness_table (%Core.import_ref.02e), @Int.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.297: %bool.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc16_31, loaded [concrete = constants.%bool.as.Copy.impl.Op] +// CHECK:STDOUT: %Core.import_ref.297: %bool.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc20_31, loaded [concrete = constants.%bool.as.Copy.impl.Op] // CHECK:STDOUT: %Copy.impl_witness_table.47e = impl_witness_table (%Core.import_ref.297), @bool.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/index/expr_category.carbon b/toolchain/check/testdata/index/expr_category.carbon index 6e26d5b41ad4..2e633b26e3e9 100644 --- a/toolchain/check/testdata/index/expr_category.carbon +++ b/toolchain/check/testdata/index/expr_category.carbon @@ -121,7 +121,7 @@ fn ValueBinding(b: array(i32, 3)) { // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } diff --git a/toolchain/check/testdata/index/fail_expr_category.carbon b/toolchain/check/testdata/index/fail_expr_category.carbon index 70c727b1a3b4..ca4aaed161f7 100644 --- a/toolchain/check/testdata/index/fail_expr_category.carbon +++ b/toolchain/check/testdata/index/fail_expr_category.carbon @@ -115,7 +115,7 @@ fn G(b: array(i32, 3)) { // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } diff --git a/toolchain/check/testdata/interface/fail_todo_define_default_fn_out_of_line.carbon b/toolchain/check/testdata/interface/fail_todo_define_default_fn_out_of_line.carbon index 3a165be89e51..1c91b20b9bc5 100644 --- a/toolchain/check/testdata/interface/fail_todo_define_default_fn_out_of_line.carbon +++ b/toolchain/check/testdata/interface/fail_todo_define_default_fn_out_of_line.carbon @@ -56,17 +56,17 @@ library "dependent_return_type.carbon"; interface Interface { // TODO: This should be - // default fn F[self: Self](U:! type, u: U) -> U; + // default fn F[self: Self](U:! type, u: U*) -> U*; // rather than a class member, but we don't currently accept that due to the // TODOs above. class C { - fn F[self: Self](U:! type, u: U) -> U; + fn F[self: Self](U:! type, u: U*) -> U*; } } // TODO: This should be -// fn Interface.F[self: Self](U:! type, u: U) -> U { return u; } -fn Interface.C.F[self: Self](U:! type, u: U) -> U { return u; } +// fn Interface.F[self: Self](U:! type, u: U*) -> U* { return u; } +fn Interface.C.F[self: Self](U:! type, u: U*) -> U* { return u; } // CHECK:STDOUT: --- fail_todo_define_default_fn_out_of_line.carbon // CHECK:STDOUT: @@ -213,9 +213,10 @@ fn Interface.C.F[self: Self](U:! type, u: U) -> U { return u; } // CHECK:STDOUT: %pattern_type.68b: type = pattern_type %C [symbolic] // CHECK:STDOUT: %type: type = facet_type [concrete] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 1 [symbolic] +// CHECK:STDOUT: %U.336: type = bind_symbolic_name U, 1 [symbolic] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %pattern_type.a32: type = pattern_type %U [symbolic] +// CHECK:STDOUT: %ptr.b51: type = ptr_type %U.336 [symbolic] +// CHECK:STDOUT: %pattern_type.ead: type = pattern_type %ptr.b51 [symbolic] // CHECK:STDOUT: %C.F.type: type = fn_type @C.F, @C(%Self.4f1) [symbolic] // CHECK:STDOUT: %C.F: %C.F.type = struct_value () [symbolic] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] @@ -227,17 +228,26 @@ fn Interface.C.F[self: Self](U:! type, u: U) -> U { return u; } // CHECK:STDOUT: %C.as.Destroy.impl.Op: %C.as.Destroy.impl.Op.type = struct_value () [symbolic] // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] // CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %require_complete.b54: = require_complete_type %U [symbolic] +// CHECK:STDOUT: %require_complete.301: = require_complete_type %ptr.b51 [symbolic] // CHECK:STDOUT: %require_complete.0ee: = require_complete_type %C [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.lookup_impl_witness.043: = lookup_impl_witness %ptr.b51, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.c8f: %Copy.type = facet_value %ptr.b51, (%Copy.lookup_impl_witness.043) [symbolic] +// CHECK:STDOUT: %.ad3: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.c8f [symbolic] +// CHECK:STDOUT: %impl.elem0.428: %.ad3 = impl_witness_access %Copy.lookup_impl_witness.043, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.641: = specific_impl_function %impl.elem0.428, @Copy.Op(%Copy.facet.c8f) [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -251,12 +261,13 @@ fn Interface.C.F[self: Self](U:! type, u: U) -> U { return u; } // CHECK:STDOUT: %self.patt: @C.F.%pattern_type.loc14_10 (%pattern_type.68b) = binding_pattern self [concrete] // CHECK:STDOUT: %self.param_patt: @C.F.%pattern_type.loc14_10 (%pattern_type.68b) = value_param_pattern %self.patt, call_param0 [concrete] // CHECK:STDOUT: %U.patt: %pattern_type.98f = symbolic_binding_pattern U, 1 [concrete] -// CHECK:STDOUT: %u.patt: @C.F.%pattern_type.loc14_32 (%pattern_type.a32) = binding_pattern u [concrete] -// CHECK:STDOUT: %u.param_patt: @C.F.%pattern_type.loc14_32 (%pattern_type.a32) = value_param_pattern %u.patt, call_param1 [concrete] -// CHECK:STDOUT: %return.patt: @C.F.%pattern_type.loc14_32 (%pattern_type.a32) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @C.F.%pattern_type.loc14_32 (%pattern_type.a32) = out_param_pattern %return.patt, call_param2 [concrete] +// CHECK:STDOUT: %u.patt: @C.F.%pattern_type.loc14_32 (%pattern_type.ead) = binding_pattern u [concrete] +// CHECK:STDOUT: %u.param_patt: @C.F.%pattern_type.loc14_32 (%pattern_type.ead) = value_param_pattern %u.patt, call_param1 [concrete] +// CHECK:STDOUT: %return.patt: @C.F.%pattern_type.loc14_32 (%pattern_type.ead) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @C.F.%pattern_type.loc14_32 (%pattern_type.ead) = out_param_pattern %return.patt, call_param2 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %U.ref.loc20_49: type = name_ref U, %U.loc20 [symbolic = %U.loc14_22.1 (constants.%U)] +// CHECK:STDOUT: %U.ref.loc20_50: type = name_ref U, %U.loc20 [symbolic = %U.loc14_22.1 (constants.%U.336)] +// CHECK:STDOUT: %ptr.loc20_51: type = ptr_type %U.ref.loc20_50 [symbolic = %ptr.loc14_36.1 (constants.%ptr.b51)] // CHECK:STDOUT: %self.param.loc20: @C.F.%C (%C) = value_param call_param0 // CHECK:STDOUT: %.loc20_24.1: type = splice_block %Self.ref.loc20 [symbolic = %C (constants.%C)] { // CHECK:STDOUT: %.loc20_24.2: type = specific_constant constants.%C, @C(constants.%Self.4f1) [symbolic = %C (constants.%C)] @@ -264,12 +275,15 @@ fn Interface.C.F[self: Self](U:! type, u: U) -> U { return u; } // CHECK:STDOUT: } // CHECK:STDOUT: %self.loc20: @C.F.%C (%C) = bind_name self, %self.param.loc20 // CHECK:STDOUT: %.Self.2: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %U.loc20: type = bind_symbolic_name U, 1 [symbolic = %U.loc14_22.1 (constants.%U)] -// CHECK:STDOUT: %u.param.loc20: @C.F.%U.loc14_22.1 (%U) = value_param call_param1 -// CHECK:STDOUT: %U.ref.loc20_43: type = name_ref U, %U.loc20 [symbolic = %U.loc14_22.1 (constants.%U)] -// CHECK:STDOUT: %u.loc20: @C.F.%U.loc14_22.1 (%U) = bind_name u, %u.param.loc20 -// CHECK:STDOUT: %return.param.loc20: ref @C.F.%U.loc14_22.1 (%U) = out_param call_param2 -// CHECK:STDOUT: %return.loc20: ref @C.F.%U.loc14_22.1 (%U) = return_slot %return.param.loc20 +// CHECK:STDOUT: %U.loc20: type = bind_symbolic_name U, 1 [symbolic = %U.loc14_22.1 (constants.%U.336)] +// CHECK:STDOUT: %u.param.loc20: @C.F.%ptr.loc14_36.1 (%ptr.b51) = value_param call_param1 +// CHECK:STDOUT: %.loc20_44: type = splice_block %ptr.loc20_44 [symbolic = %ptr.loc14_36.1 (constants.%ptr.b51)] { +// CHECK:STDOUT: %U.ref.loc20_43: type = name_ref U, %U.loc20 [symbolic = %U.loc14_22.1 (constants.%U.336)] +// CHECK:STDOUT: %ptr.loc20_44: type = ptr_type %U.ref.loc20_43 [symbolic = %ptr.loc14_36.1 (constants.%ptr.b51)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %u.loc20: @C.F.%ptr.loc14_36.1 (%ptr.b51) = bind_name u, %u.param.loc20 +// CHECK:STDOUT: %return.param.loc20: ref @C.F.%ptr.loc14_36.1 (%ptr.b51) = out_param call_param2 +// CHECK:STDOUT: %return.loc20: ref @C.F.%ptr.loc14_36.1 (%ptr.b51) = return_slot %return.param.loc20 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -323,12 +337,13 @@ fn Interface.C.F[self: Self](U:! type, u: U) -> U { return u; } // CHECK:STDOUT: %self.patt: @C.F.%pattern_type.loc14_10 (%pattern_type.68b) = binding_pattern self [concrete] // CHECK:STDOUT: %self.param_patt: @C.F.%pattern_type.loc14_10 (%pattern_type.68b) = value_param_pattern %self.patt, call_param0 [concrete] // CHECK:STDOUT: %U.patt: %pattern_type.98f = symbolic_binding_pattern U, 1 [concrete] -// CHECK:STDOUT: %u.patt: @C.F.%pattern_type.loc14_32 (%pattern_type.a32) = binding_pattern u [concrete] -// CHECK:STDOUT: %u.param_patt: @C.F.%pattern_type.loc14_32 (%pattern_type.a32) = value_param_pattern %u.patt, call_param1 [concrete] -// CHECK:STDOUT: %return.patt: @C.F.%pattern_type.loc14_32 (%pattern_type.a32) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @C.F.%pattern_type.loc14_32 (%pattern_type.a32) = out_param_pattern %return.patt, call_param2 [concrete] +// CHECK:STDOUT: %u.patt: @C.F.%pattern_type.loc14_32 (%pattern_type.ead) = binding_pattern u [concrete] +// CHECK:STDOUT: %u.param_patt: @C.F.%pattern_type.loc14_32 (%pattern_type.ead) = value_param_pattern %u.patt, call_param1 [concrete] +// CHECK:STDOUT: %return.patt: @C.F.%pattern_type.loc14_32 (%pattern_type.ead) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @C.F.%pattern_type.loc14_32 (%pattern_type.ead) = out_param_pattern %return.patt, call_param2 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %U.ref.loc14_41: type = name_ref U, %U.loc14_22.2 [symbolic = %U.loc14_22.1 (constants.%U)] +// CHECK:STDOUT: %U.ref.loc14_42: type = name_ref U, %U.loc14_22.2 [symbolic = %U.loc14_22.1 (constants.%U.336)] +// CHECK:STDOUT: %ptr.loc14_43: type = ptr_type %U.ref.loc14_42 [symbolic = %ptr.loc14_36.1 (constants.%ptr.b51)] // CHECK:STDOUT: %self.param.loc14: @C.F.%C (%C) = value_param call_param0 // CHECK:STDOUT: %.loc14_16.1: type = splice_block %Self.ref.loc14 [symbolic = %C (constants.%C)] { // CHECK:STDOUT: %.loc14_16.2: type = specific_constant constants.%C, @C(constants.%Self.4f1) [symbolic = %C (constants.%C)] @@ -336,12 +351,15 @@ fn Interface.C.F[self: Self](U:! type, u: U) -> U { return u; } // CHECK:STDOUT: } // CHECK:STDOUT: %self.loc14: @C.F.%C (%C) = bind_name self, %self.param.loc14 // CHECK:STDOUT: %.Self.1: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %U.loc14_22.2: type = bind_symbolic_name U, 1 [symbolic = %U.loc14_22.1 (constants.%U)] -// CHECK:STDOUT: %u.param.loc14: @C.F.%U.loc14_22.1 (%U) = value_param call_param1 -// CHECK:STDOUT: %U.ref.loc14_35: type = name_ref U, %U.loc14_22.2 [symbolic = %U.loc14_22.1 (constants.%U)] -// CHECK:STDOUT: %u.loc14: @C.F.%U.loc14_22.1 (%U) = bind_name u, %u.param.loc14 -// CHECK:STDOUT: %return.param.loc14: ref @C.F.%U.loc14_22.1 (%U) = out_param call_param2 -// CHECK:STDOUT: %return.loc14: ref @C.F.%U.loc14_22.1 (%U) = return_slot %return.param.loc14 +// CHECK:STDOUT: %U.loc14_22.2: type = bind_symbolic_name U, 1 [symbolic = %U.loc14_22.1 (constants.%U.336)] +// CHECK:STDOUT: %u.param.loc14: @C.F.%ptr.loc14_36.1 (%ptr.b51) = value_param call_param1 +// CHECK:STDOUT: %.loc14_36: type = splice_block %ptr.loc14_36.2 [symbolic = %ptr.loc14_36.1 (constants.%ptr.b51)] { +// CHECK:STDOUT: %U.ref.loc14_35: type = name_ref U, %U.loc14_22.2 [symbolic = %U.loc14_22.1 (constants.%U.336)] +// CHECK:STDOUT: %ptr.loc14_36.2: type = ptr_type %U.ref.loc14_35 [symbolic = %ptr.loc14_36.1 (constants.%ptr.b51)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %u.loc14: @C.F.%ptr.loc14_36.1 (%ptr.b51) = bind_name u, %u.param.loc14 +// CHECK:STDOUT: %return.param.loc14: ref @C.F.%ptr.loc14_36.1 (%ptr.b51) = out_param call_param2 +// CHECK:STDOUT: %return.loc14: ref @C.F.%ptr.loc14_36.1 (%ptr.b51) = return_slot %return.param.loc14 // CHECK:STDOUT: } // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [symbolic = @C.as.Destroy.impl.%C (constants.%C)] // CHECK:STDOUT: impl_decl @C.as.Destroy.impl [concrete] {} {} @@ -360,17 +378,28 @@ fn Interface.C.F[self: Self](U:! type, u: U) -> U { return u; } // CHECK:STDOUT: %Self: %Interface.type = bind_symbolic_name Self, 0 [symbolic = %Self (constants.%Self.4f1)] // CHECK:STDOUT: %C: type = class_type @C, @C(%Self) [symbolic = %C (constants.%C)] // CHECK:STDOUT: %pattern_type.loc14_10: type = pattern_type %C [symbolic = %pattern_type.loc14_10 (constants.%pattern_type.68b)] -// CHECK:STDOUT: %U.loc14_22.1: type = bind_symbolic_name U, 1 [symbolic = %U.loc14_22.1 (constants.%U)] -// CHECK:STDOUT: %pattern_type.loc14_32: type = pattern_type %U.loc14_22.1 [symbolic = %pattern_type.loc14_32 (constants.%pattern_type.a32)] +// CHECK:STDOUT: %U.loc14_22.1: type = bind_symbolic_name U, 1 [symbolic = %U.loc14_22.1 (constants.%U.336)] +// CHECK:STDOUT: %ptr.loc14_36.1: type = ptr_type %U.loc14_22.1 [symbolic = %ptr.loc14_36.1 (constants.%ptr.b51)] +// CHECK:STDOUT: %pattern_type.loc14_32: type = pattern_type %ptr.loc14_36.1 [symbolic = %pattern_type.loc14_32 (constants.%pattern_type.ead)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc20_46: = require_complete_type %U.loc14_22.1 [symbolic = %require_complete.loc20_46 (constants.%require_complete.b54)] +// CHECK:STDOUT: %require_complete.loc20_47: = require_complete_type %ptr.loc14_36.1 [symbolic = %require_complete.loc20_47 (constants.%require_complete.301)] // CHECK:STDOUT: %require_complete.loc20_22: = require_complete_type %C [symbolic = %require_complete.loc20_22 (constants.%require_complete.0ee)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %ptr.loc14_36.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.043)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %ptr.loc14_36.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.c8f)] +// CHECK:STDOUT: %.loc20_62.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc20_62.2 (constants.%.ad3)] +// CHECK:STDOUT: %impl.elem0.loc20_62.2: @C.F.%.loc20_62.2 (%.ad3) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc20_62.2 (constants.%impl.elem0.428)] +// CHECK:STDOUT: %specific_impl_fn.loc20_62.2: = specific_impl_function %impl.elem0.loc20_62.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc20_62.2 (constants.%specific_impl_fn.641)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param.loc20: @C.F.%C (%C), %u.param.loc20: @C.F.%U.loc14_22.1 (%U)) -> @C.F.%U.loc14_22.1 (%U) { +// CHECK:STDOUT: fn(%self.param.loc20: @C.F.%C (%C), %u.param.loc20: @C.F.%ptr.loc14_36.1 (%ptr.b51)) -> @C.F.%ptr.loc14_36.1 (%ptr.b51) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %u.ref: @C.F.%U.loc14_22.1 (%U) = name_ref u, %u.loc20 -// CHECK:STDOUT: return %u.ref +// CHECK:STDOUT: %u.ref: @C.F.%ptr.loc14_36.1 (%ptr.b51) = name_ref u, %u.loc20 +// CHECK:STDOUT: %impl.elem0.loc20_62.1: @C.F.%.loc20_62.2 (%.ad3) = impl_witness_access constants.%Copy.lookup_impl_witness.043, element0 [symbolic = %impl.elem0.loc20_62.2 (constants.%impl.elem0.428)] +// CHECK:STDOUT: %bound_method.loc20_62.1: = bound_method %u.ref, %impl.elem0.loc20_62.1 +// CHECK:STDOUT: %specific_impl_fn.loc20_62.1: = specific_impl_function %impl.elem0.loc20_62.1, @Copy.Op(constants.%Copy.facet.c8f) [symbolic = %specific_impl_fn.loc20_62.2 (constants.%specific_impl_fn.641)] +// CHECK:STDOUT: %bound_method.loc20_62.2: = bound_method %u.ref, %specific_impl_fn.loc20_62.1 +// CHECK:STDOUT: %.loc20_62.1: init @C.F.%ptr.loc14_36.1 (%ptr.b51) = call %bound_method.loc20_62.2(%u.ref) +// CHECK:STDOUT: return %.loc20_62.1 to %return.loc20 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -392,12 +421,13 @@ fn Interface.C.F[self: Self](U:! type, u: U) -> U { return u; } // CHECK:STDOUT: %C.F => constants.%C.F // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @C.F(constants.%Self.4f1, constants.%U) { +// CHECK:STDOUT: specific @C.F(constants.%Self.4f1, constants.%U.336) { // CHECK:STDOUT: %Self => constants.%Self.4f1 // CHECK:STDOUT: %C => constants.%C // CHECK:STDOUT: %pattern_type.loc14_10 => constants.%pattern_type.68b -// CHECK:STDOUT: %U.loc14_22.1 => constants.%U -// CHECK:STDOUT: %pattern_type.loc14_32 => constants.%pattern_type.a32 +// CHECK:STDOUT: %U.loc14_22.1 => constants.%U.336 +// CHECK:STDOUT: %ptr.loc14_36.1 => constants.%ptr.b51 +// CHECK:STDOUT: %pattern_type.loc14_32 => constants.%pattern_type.ead // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C.as.Destroy.impl(constants.%Self.4f1) { diff --git a/toolchain/check/testdata/interface/fail_todo_generic_default_fn.carbon b/toolchain/check/testdata/interface/fail_todo_generic_default_fn.carbon index bf201d2528b3..aa7df08721cf 100644 --- a/toolchain/check/testdata/interface/fail_todo_generic_default_fn.carbon +++ b/toolchain/check/testdata/interface/fail_todo_generic_default_fn.carbon @@ -2,9 +2,7 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // -// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/none.carbon -// TODO: Add ranges and switch to "--dump-sem-ir-ranges=only". -// EXTRA-ARGS: --dump-sem-ir-ranges=if-present +// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/convert.carbon // // AUTOUPDATE // TIP: To test this file alone, run: @@ -14,170 +12,14 @@ interface I(T:! type) { // TODO: Use `default` here. - fn F[self: Self]() -> Self; + fn F[addr self: Self*]() -> Self*; } // CHECK:STDERR: fail_todo_generic_default_fn.carbon:[[@LINE+7]]:16: error: duplicate name `F` being declared in the same scope [NameDeclDuplicate] -// CHECK:STDERR: fn I(T:! type).F[self: Self]() -> Self { return self; } +// CHECK:STDERR: fn I(T:! type).F[addr self: Self*]() -> Self* { return self; } // CHECK:STDERR: ^ // CHECK:STDERR: fail_todo_generic_default_fn.carbon:[[@LINE-6]]:3: note: name is previously declared here [NameDeclPrevious] -// CHECK:STDERR: fn F[self: Self]() -> Self; -// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +// CHECK:STDERR: fn F[addr self: Self*]() -> Self*; +// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: -fn I(T:! type).F[self: Self]() -> Self { return self; } - -// CHECK:STDOUT: --- fail_todo_generic_default_fn.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %type: type = facet_type [concrete] -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %I.type.dac: type = generic_interface_type @I [concrete] -// CHECK:STDOUT: %I.generic: %I.type.dac = struct_value () [concrete] -// CHECK:STDOUT: %I.type.328: type = facet_type <@I, @I(%T)> [symbolic] -// CHECK:STDOUT: %Self: %I.type.328 = bind_symbolic_name Self, 1 [symbolic] -// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic] -// CHECK:STDOUT: %pattern_type.857: type = pattern_type %Self.as_type [symbolic] -// CHECK:STDOUT: %I.F.type.2aef59.1: type = fn_type @I.F.loc17, @I(%T) [symbolic] -// CHECK:STDOUT: %I.F.bb2dd4.1: %I.F.type.2aef59.1 = struct_value () [symbolic] -// CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I, @I(%T) [symbolic] -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, @I.%I.F.decl [symbolic] -// CHECK:STDOUT: %I.F.type.2aef59.2: type = fn_type @I.F.loc27, @I(%T) [symbolic] -// CHECK:STDOUT: %I.F.bb2dd4.2: %I.F.type.2aef59.2 = struct_value () [symbolic] -// CHECK:STDOUT: %require_complete: = require_complete_type %Self.as_type [symbolic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .I = %I.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %I.decl: %I.type.dac = interface_decl @I [concrete = constants.%I.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc15_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc15_13.1 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %I.F.decl: %I.F.type.2aef59.2 = fn_decl @I.F.loc27 [symbolic = constants.%I.F.bb2dd4.2] { -// CHECK:STDOUT: %self.patt: @I.F.loc27.%pattern_type (%pattern_type.857) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @I.F.loc27.%pattern_type (%pattern_type.857) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @I.F.loc27.%pattern_type (%pattern_type.857) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @I.F.loc27.%pattern_type (%pattern_type.857) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc27_6: type = bind_symbolic_name T, 0 [symbolic = @I.%T.loc15_13.1 (constants.%T)] -// CHECK:STDOUT: %.loc27_35.1: @I.F.loc27.%I.type (%I.type.328) = specific_constant @I.%Self.1, @I(constants.%T) [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.ref.loc27_35: @I.F.loc27.%I.type (%I.type.328) = name_ref Self, %.loc27_35.1 [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc27_35: type = facet_access_type %Self.ref.loc27_35 [symbolic = %Self.as_type.loc27_24.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %.loc27_35.2: type = converted %Self.ref.loc27_35, %Self.as_type.loc27_35 [symbolic = %Self.as_type.loc27_24.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %self.param: @I.F.loc27.%Self.as_type.loc27_24.1 (%Self.as_type) = value_param call_param0 -// CHECK:STDOUT: %.loc27_24.1: type = splice_block %.loc27_24.3 [symbolic = %Self.as_type.loc27_24.1 (constants.%Self.as_type)] { -// CHECK:STDOUT: %.loc27_24.2: @I.F.loc27.%I.type (%I.type.328) = specific_constant @I.%Self.1, @I(constants.%T) [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.ref.loc27_24: @I.F.loc27.%I.type (%I.type.328) = name_ref Self, %.loc27_24.2 [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc27_24.2: type = facet_access_type %Self.ref.loc27_24 [symbolic = %Self.as_type.loc27_24.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %.loc27_24.3: type = converted %Self.ref.loc27_24, %Self.as_type.loc27_24.2 [symbolic = %Self.as_type.loc27_24.1 (constants.%Self.as_type)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @I.F.loc27.%Self.as_type.loc27_24.1 (%Self.as_type) = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref @I.F.loc27.%Self.as_type.loc27_24.1 (%Self.as_type) = out_param call_param1 -// CHECK:STDOUT: %return: ref @I.F.loc27.%Self.as_type.loc27_24.1 (%Self.as_type) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic interface @I(%T.loc15_13.2: type) { -// CHECK:STDOUT: %T.loc15_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc15_13.1 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %I.type: type = facet_type <@I, @I(%T.loc15_13.1)> [symbolic = %I.type (constants.%I.type.328)] -// CHECK:STDOUT: %Self.2: @I.%I.type (%I.type.328) = bind_symbolic_name Self, 1 [symbolic = %Self.2 (constants.%Self)] -// CHECK:STDOUT: %I.F.type: type = fn_type @I.F.loc17, @I(%T.loc15_13.1) [symbolic = %I.F.type (constants.%I.F.type.2aef59.1)] -// CHECK:STDOUT: %I.F: @I.%I.F.type (%I.F.type.2aef59.1) = struct_value () [symbolic = %I.F (constants.%I.F.bb2dd4.1)] -// CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I, @I(%T.loc15_13.1) [symbolic = %I.assoc_type (constants.%I.assoc_type)] -// CHECK:STDOUT: %assoc0.loc17_29.2: @I.%I.assoc_type (%I.assoc_type) = assoc_entity element0, %I.F.decl [symbolic = %assoc0.loc17_29.2 (constants.%assoc0)] -// CHECK:STDOUT: -// CHECK:STDOUT: interface { -// CHECK:STDOUT: %Self.1: @I.%I.type (%I.type.328) = bind_symbolic_name Self, 1 [symbolic = %Self.2 (constants.%Self)] -// CHECK:STDOUT: %I.F.decl: @I.%I.F.type (%I.F.type.2aef59.1) = fn_decl @I.F.loc17 [symbolic = @I.%I.F (constants.%I.F.bb2dd4.1)] { -// CHECK:STDOUT: %self.patt: @I.F.loc17.%pattern_type (%pattern_type.857) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @I.F.loc17.%pattern_type (%pattern_type.857) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @I.F.loc17.%pattern_type (%pattern_type.857) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @I.F.loc17.%pattern_type (%pattern_type.857) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc17_25.1: @I.F.loc17.%I.type (%I.type.328) = specific_constant @I.%Self.1, @I(constants.%T) [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.ref.loc17_25: @I.F.loc17.%I.type (%I.type.328) = name_ref Self, %.loc17_25.1 [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc17_25: type = facet_access_type %Self.ref.loc17_25 [symbolic = %Self.as_type.loc17_14.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %.loc17_25.2: type = converted %Self.ref.loc17_25, %Self.as_type.loc17_25 [symbolic = %Self.as_type.loc17_14.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %self.param: @I.F.loc17.%Self.as_type.loc17_14.1 (%Self.as_type) = value_param call_param0 -// CHECK:STDOUT: %.loc17_14.1: type = splice_block %.loc17_14.3 [symbolic = %Self.as_type.loc17_14.1 (constants.%Self.as_type)] { -// CHECK:STDOUT: %.loc17_14.2: @I.F.loc17.%I.type (%I.type.328) = specific_constant @I.%Self.1, @I(constants.%T) [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.ref.loc17_14: @I.F.loc17.%I.type (%I.type.328) = name_ref Self, %.loc17_14.2 [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc17_14.2: type = facet_access_type %Self.ref.loc17_14 [symbolic = %Self.as_type.loc17_14.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %.loc17_14.3: type = converted %Self.ref.loc17_14, %Self.as_type.loc17_14.2 [symbolic = %Self.as_type.loc17_14.1 (constants.%Self.as_type)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @I.F.loc17.%Self.as_type.loc17_14.1 (%Self.as_type) = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref @I.F.loc17.%Self.as_type.loc17_14.1 (%Self.as_type) = out_param call_param1 -// CHECK:STDOUT: %return: ref @I.F.loc17.%Self.as_type.loc17_14.1 (%Self.as_type) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %assoc0.loc17_29.1: @I.%I.assoc_type (%I.assoc_type) = assoc_entity element0, %I.F.decl [symbolic = %assoc0.loc17_29.2 (constants.%assoc0)] -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self.1 -// CHECK:STDOUT: .F = %assoc0.loc17_29.1 -// CHECK:STDOUT: witness = (%I.F.decl) -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @I.F.loc17(@I.%T.loc15_13.2: type, @I.%Self.1: @I.%I.type (%I.type.328)) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %I.type: type = facet_type <@I, @I(%T)> [symbolic = %I.type (constants.%I.type.328)] -// CHECK:STDOUT: %Self: @I.F.loc17.%I.type (%I.type.328) = bind_symbolic_name Self, 1 [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc17_14.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc17_14.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type.loc17_14.1 [symbolic = %pattern_type (constants.%pattern_type.857)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @I.F.loc17.%Self.as_type.loc17_14.1 (%Self.as_type)) -> @I.F.loc17.%Self.as_type.loc17_14.1 (%Self.as_type); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @I.F.loc27(%T.loc27_6: type, @I.%Self.1: @I.%I.type (%I.type.328)) { -// CHECK:STDOUT: %T.loc27_24: type = bind_symbolic_name T, 0 [symbolic = %T.loc27_24 (constants.%T)] -// CHECK:STDOUT: %I.type: type = facet_type <@I, @I(%T.loc27_24)> [symbolic = %I.type (constants.%I.type.328)] -// CHECK:STDOUT: %Self: @I.F.loc27.%I.type (%I.type.328) = bind_symbolic_name Self, 1 [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc27_24.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc27_24.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type.loc27_24.1 [symbolic = %pattern_type (constants.%pattern_type.857)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %Self.as_type.loc27_24.1 [symbolic = %require_complete (constants.%require_complete)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @I.F.loc27.%Self.as_type.loc27_24.1 (%Self.as_type)) -> @I.F.loc27.%Self.as_type.loc27_24.1 (%Self.as_type) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: @I.F.loc27.%Self.as_type.loc27_24.1 (%Self.as_type) = name_ref self, %self -// CHECK:STDOUT: return %self.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @I(constants.%T) { -// CHECK:STDOUT: %T.loc15_13.1 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %I.type => constants.%I.type.328 -// CHECK:STDOUT: %Self.2 => constants.%Self -// CHECK:STDOUT: %I.F.type => constants.%I.F.type.2aef59.1 -// CHECK:STDOUT: %I.F => constants.%I.F.bb2dd4.1 -// CHECK:STDOUT: %I.assoc_type => constants.%I.assoc_type -// CHECK:STDOUT: %assoc0.loc17_29.2 => constants.%assoc0 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @I.F.loc17(constants.%T, constants.%Self) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %I.type => constants.%I.type.328 -// CHECK:STDOUT: %Self => constants.%Self -// CHECK:STDOUT: %Self.as_type.loc17_14.1 => constants.%Self.as_type -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.857 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @I.F.loc27(constants.%T, constants.%Self) { -// CHECK:STDOUT: %T.loc27_24 => constants.%T -// CHECK:STDOUT: %I.type => constants.%I.type.328 -// CHECK:STDOUT: %Self => constants.%Self -// CHECK:STDOUT: %Self.as_type.loc27_24.1 => constants.%Self.as_type -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.857 -// CHECK:STDOUT: } -// CHECK:STDOUT: +fn I(T:! type).F[addr self: Self*]() -> Self* { return self; } diff --git a/toolchain/check/testdata/interface/generic_method.carbon b/toolchain/check/testdata/interface/generic_method.carbon index 256d2a67711e..e71e15c0193e 100644 --- a/toolchain/check/testdata/interface/generic_method.carbon +++ b/toolchain/check/testdata/interface/generic_method.carbon @@ -220,7 +220,7 @@ fn CallIndirect() { // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23dbd.1) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf12b.1)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23dbd.1) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf12b.1)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.import_ref.efe: @T.as.Destroy.impl.%T.as.Destroy.impl.Op.type (%T.as.Destroy.impl.Op.type.305) = import_ref Core//prelude/parts/destroy, loc8_29, loaded [symbolic = @T.as.Destroy.impl.%T.as.Destroy.impl.Op (constants.%T.as.Destroy.impl.Op.e3a)] // CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (%Core.import_ref.efe), @T.as.Destroy.impl [concrete] diff --git a/toolchain/check/testdata/interface/import.carbon b/toolchain/check/testdata/interface/import.carbon index 81fb98cfd964..ef64c40fc550 100644 --- a/toolchain/check/testdata/interface/import.carbon +++ b/toolchain/check/testdata/interface/import.carbon @@ -239,7 +239,7 @@ var f: ForwardDeclared* = &f_ref.f; // CHECK:STDOUT: %f_ref.var_patt: %pattern_type.ffe = var_pattern %f_ref.patt [concrete] // CHECK:STDOUT: %f_ref.var: ref %struct_type.f = var %f_ref.var_patt [concrete] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interface/member_lookup.carbon b/toolchain/check/testdata/interface/member_lookup.carbon index 3f0060b0205e..68683f0255cd 100644 --- a/toolchain/check/testdata/interface/member_lookup.carbon +++ b/toolchain/check/testdata/interface/member_lookup.carbon @@ -17,14 +17,14 @@ library "[[@TEST_NAME]]"; interface Interface(T:! type) { - let X:! T; + let X:! T*; } -fn AccessGeneric[T:! type](I:! Interface(T)) -> T { +fn AccessGeneric[T:! type](I:! Interface(T)) -> T* { return I.X; } -fn AccessConcrete(I:! Interface(i32)) -> i32 { +fn AccessConcrete(I:! Interface(i32)) -> i32* { return I.X; } @@ -33,7 +33,7 @@ fn AccessConcrete(I:! Interface(i32)) -> i32 { library "[[@TEST_NAME]]"; interface Interface(T:! type) { - let X:! T; + let X:! T*; } fn AccessMissingGeneric[T:! type](I:! Interface(T)) -> T { @@ -57,25 +57,37 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: constants { // CHECK:STDOUT: %type: type = facet_type [concrete] // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %Interface.type.e32: type = generic_interface_type @Interface [concrete] // CHECK:STDOUT: %Interface.generic: %Interface.type.e32 = struct_value () [concrete] -// CHECK:STDOUT: %Interface.type.1a8: type = facet_type <@Interface, @Interface(%T)> [symbolic] +// CHECK:STDOUT: %Interface.type.1a8: type = facet_type <@Interface, @Interface(%T.8b3)> [symbolic] // CHECK:STDOUT: %Self.c05: %Interface.type.1a8 = bind_symbolic_name Self, 1 [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %Interface.assoc_type.0d9: type = assoc_entity_type @Interface, @Interface(%T) [symbolic] -// CHECK:STDOUT: %assoc0.dbe: %Interface.assoc_type.0d9 = assoc_entity element0, @Interface.%X [symbolic] +// CHECK:STDOUT: %ptr.79f: type = ptr_type %T.8b3 [symbolic] +// CHECK:STDOUT: %require_complete.6e5: = require_complete_type %ptr.79f [symbolic] +// CHECK:STDOUT: %Interface.assoc_type.0d9: type = assoc_entity_type @Interface, @Interface(%T.8b3) [symbolic] +// CHECK:STDOUT: %assoc0.7e7: %Interface.assoc_type.0d9 = assoc_entity element0, @Interface.%X [symbolic] // CHECK:STDOUT: %I.c05: %Interface.type.1a8 = bind_symbolic_name I, 1 [symbolic] // CHECK:STDOUT: %pattern_type.eaa: type = pattern_type %Interface.type.1a8 [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] +// CHECK:STDOUT: %pattern_type.afe: type = pattern_type %ptr.79f [symbolic] // CHECK:STDOUT: %AccessGeneric.type: type = fn_type @AccessGeneric [concrete] // CHECK:STDOUT: %AccessGeneric: %AccessGeneric.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete.376: = require_complete_type %Interface.type.1a8 [symbolic] // CHECK:STDOUT: %I.as_type.fe1: type = facet_access_type %I.c05 [symbolic] -// CHECK:STDOUT: %Interface.lookup_impl_witness.301: = lookup_impl_witness %I.c05, @Interface, @Interface(%T) [symbolic] +// CHECK:STDOUT: %Interface.lookup_impl_witness.301: = lookup_impl_witness %I.c05, @Interface, @Interface(%T.8b3) [symbolic] // CHECK:STDOUT: %Interface.facet.b19: %Interface.type.1a8 = facet_value %I.as_type.fe1, (%Interface.lookup_impl_witness.301) [symbolic] -// CHECK:STDOUT: %impl.elem0.245: %T = impl_witness_access %Interface.lookup_impl_witness.301, element0 [symbolic] +// CHECK:STDOUT: %impl.elem0.aca: %ptr.79f = impl_witness_access %Interface.lookup_impl_witness.301, element0 [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf: %ptr.as.Copy.impl.Op.type.f23 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.lookup_impl_witness.cb2: = lookup_impl_witness %ptr.79f, @Copy [symbolic] +// CHECK:STDOUT: %Copy.facet.def: %Copy.type = facet_value %ptr.79f, (%Copy.lookup_impl_witness.cb2) [symbolic] +// CHECK:STDOUT: %.fe5: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.def [symbolic] +// CHECK:STDOUT: %impl.elem0.429: %.fe5 = impl_witness_access %Copy.lookup_impl_witness.cb2, element0 [symbolic] +// CHECK:STDOUT: %bound_method.313: = bound_method %impl.elem0.aca, %impl.elem0.429 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.d8a: = specific_impl_function %impl.elem0.429, @Copy.Op(%Copy.facet.def) [symbolic] +// CHECK:STDOUT: %bound_method.5c7: = bound_method %impl.elem0.aca, %specific_impl_fn.d8a [symbolic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] @@ -83,26 +95,38 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: %Interface.type.bcd: type = facet_type <@Interface, @Interface(%i32)> [concrete] // CHECK:STDOUT: %I.910: %Interface.type.bcd = bind_symbolic_name I, 0 [symbolic] // CHECK:STDOUT: %pattern_type.1c1: type = pattern_type %Interface.type.bcd [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] +// CHECK:STDOUT: %ptr.235: type = ptr_type %i32 [concrete] +// CHECK:STDOUT: %pattern_type.fe8: type = pattern_type %ptr.235 [concrete] // CHECK:STDOUT: %AccessConcrete.type: type = fn_type @AccessConcrete [concrete] // CHECK:STDOUT: %AccessConcrete: %AccessConcrete.type = struct_value () [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %Self.e75: %Interface.type.bcd = bind_symbolic_name Self, 1 [symbolic] // CHECK:STDOUT: %Interface.assoc_type.aaa: type = assoc_entity_type @Interface, @Interface(%i32) [concrete] -// CHECK:STDOUT: %assoc0.69f: %Interface.assoc_type.aaa = assoc_entity element0, @Interface.%X [concrete] +// CHECK:STDOUT: %assoc0.04e: %Interface.assoc_type.aaa = assoc_entity element0, @Interface.%X [concrete] // CHECK:STDOUT: %I.as_type.85e: type = facet_access_type %I.910 [symbolic] // CHECK:STDOUT: %Interface.lookup_impl_witness.73f: = lookup_impl_witness %I.910, @Interface, @Interface(%i32) [symbolic] // CHECK:STDOUT: %Interface.facet.c5c: %Interface.type.bcd = facet_value %I.as_type.85e, (%Interface.lookup_impl_witness.73f) [symbolic] -// CHECK:STDOUT: %impl.elem0.f4f: %i32 = impl_witness_access %Interface.lookup_impl_witness.73f, element0 [symbolic] +// CHECK:STDOUT: %complete_type.3d0: = complete_type_witness %ptr.235 [concrete] +// CHECK:STDOUT: %impl.elem0.5f0: %ptr.235 = impl_witness_access %Interface.lookup_impl_witness.73f, element0 [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.19c: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%i32) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.3ea: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%i32) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.2f4: %ptr.as.Copy.impl.Op.type.3ea = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.bab: %Copy.type = facet_value %ptr.235, (%Copy.impl_witness.19c) [concrete] +// CHECK:STDOUT: %.284: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.bab [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.bound: = bound_method %impl.elem0.5f0, %ptr.as.Copy.impl.Op.2f4 [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn: = specific_function %ptr.as.Copy.impl.Op.2f4, @ptr.as.Copy.impl.Op(%i32) [concrete] +// CHECK:STDOUT: %bound_method.f5e: = bound_method %impl.elem0.5f0, %ptr.as.Copy.impl.Op.specific_fn [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @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: } // CHECK:STDOUT: @@ -118,34 +142,36 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc4_21.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_21.1 (constants.%T)] +// CHECK:STDOUT: %T.loc4_21.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_21.1 (constants.%T.8b3)] // CHECK:STDOUT: } // CHECK:STDOUT: %AccessGeneric.decl: %AccessGeneric.type = fn_decl @AccessGeneric [concrete = constants.%AccessGeneric] { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: %I.patt: @AccessGeneric.%pattern_type.loc8_28 (%pattern_type.eaa) = symbolic_binding_pattern I, 1 [concrete] -// CHECK:STDOUT: %return.patt: @AccessGeneric.%pattern_type.loc8_46 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @AccessGeneric.%pattern_type.loc8_46 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @AccessGeneric.%pattern_type.loc8_46 (%pattern_type.afe) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @AccessGeneric.%pattern_type.loc8_46 (%pattern_type.afe) = out_param_pattern %return.patt, call_param0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc8_49: type = name_ref T, %T.loc8_18.2 [symbolic = %T.loc8_18.1 (constants.%T)] +// CHECK:STDOUT: %T.ref.loc8_49: type = name_ref T, %T.loc8_18.2 [symbolic = %T.loc8_18.1 (constants.%T.8b3)] +// CHECK:STDOUT: %ptr.loc8_50.2: type = ptr_type %T.ref.loc8_49 [symbolic = %ptr.loc8_50.1 (constants.%ptr.79f)] // CHECK:STDOUT: %.Self.1: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %T.loc8_18.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_18.1 (constants.%T)] +// CHECK:STDOUT: %T.loc8_18.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_18.1 (constants.%T.8b3)] // CHECK:STDOUT: %.loc8: type = splice_block %Interface.type.loc8_43.2 [symbolic = %Interface.type.loc8_43.1 (constants.%Interface.type.1a8)] { // CHECK:STDOUT: %.Self.2: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] // CHECK:STDOUT: %Interface.ref: %Interface.type.e32 = name_ref Interface, file.%Interface.decl [concrete = constants.%Interface.generic] -// CHECK:STDOUT: %T.ref.loc8_42: type = name_ref T, %T.loc8_18.2 [symbolic = %T.loc8_18.1 (constants.%T)] -// CHECK:STDOUT: %Interface.type.loc8_43.2: type = facet_type <@Interface, @Interface(constants.%T)> [symbolic = %Interface.type.loc8_43.1 (constants.%Interface.type.1a8)] +// CHECK:STDOUT: %T.ref.loc8_42: type = name_ref T, %T.loc8_18.2 [symbolic = %T.loc8_18.1 (constants.%T.8b3)] +// CHECK:STDOUT: %Interface.type.loc8_43.2: type = facet_type <@Interface, @Interface(constants.%T.8b3)> [symbolic = %Interface.type.loc8_43.1 (constants.%Interface.type.1a8)] // CHECK:STDOUT: } // CHECK:STDOUT: %I.loc8_28.2: @AccessGeneric.%Interface.type.loc8_43.1 (%Interface.type.1a8) = bind_symbolic_name I, 1 [symbolic = %I.loc8_28.1 (constants.%I.c05)] -// CHECK:STDOUT: %return.param: ref @AccessGeneric.%T.loc8_18.1 (%T) = out_param call_param0 -// CHECK:STDOUT: %return: ref @AccessGeneric.%T.loc8_18.1 (%T) = return_slot %return.param +// CHECK:STDOUT: %return.param: ref @AccessGeneric.%ptr.loc8_50.1 (%ptr.79f) = out_param call_param0 +// CHECK:STDOUT: %return: ref @AccessGeneric.%ptr.loc8_50.1 (%ptr.79f) = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: %AccessConcrete.decl: %AccessConcrete.type = fn_decl @AccessConcrete [concrete = constants.%AccessConcrete] { // CHECK:STDOUT: %I.patt: %pattern_type.1c1 = symbolic_binding_pattern I, 0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.fe8 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.fe8 = out_param_pattern %return.patt, call_param0 [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %int_32.loc12_42: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] // CHECK:STDOUT: %i32.loc12_42: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %ptr: type = ptr_type %i32.loc12_42 [concrete = constants.%ptr.235] // CHECK:STDOUT: %.loc12: type = splice_block %Interface.type [concrete = constants.%Interface.type.bcd] { // CHECK:STDOUT: %.Self: %type = bind_symbolic_name .Self [symbolic_self = constants.%.Self] // CHECK:STDOUT: %Interface.ref: %Interface.type.e32 = name_ref Interface, file.%Interface.decl [concrete = constants.%Interface.generic] @@ -154,24 +180,24 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: %Interface.type: type = facet_type <@Interface, @Interface(constants.%i32)> [concrete = constants.%Interface.type.bcd] // CHECK:STDOUT: } // CHECK:STDOUT: %I.loc12_19.2: %Interface.type.bcd = bind_symbolic_name I, 0 [symbolic = %I.loc12_19.1 (constants.%I.910)] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param +// CHECK:STDOUT: %return.param: ref %ptr.235 = out_param call_param0 +// CHECK:STDOUT: %return: ref %ptr.235 = return_slot %return.param // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic interface @Interface(%T.loc4_21.2: type) { -// CHECK:STDOUT: %T.loc4_21.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_21.1 (constants.%T)] +// CHECK:STDOUT: %T.loc4_21.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_21.1 (constants.%T.8b3)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %Interface.type: type = facet_type <@Interface, @Interface(%T.loc4_21.1)> [symbolic = %Interface.type (constants.%Interface.type.1a8)] // CHECK:STDOUT: %Self.2: @Interface.%Interface.type (%Interface.type.1a8) = bind_symbolic_name Self, 1 [symbolic = %Self.2 (constants.%Self.c05)] // CHECK:STDOUT: %Interface.assoc_type: type = assoc_entity_type @Interface, @Interface(%T.loc4_21.1) [symbolic = %Interface.assoc_type (constants.%Interface.assoc_type.0d9)] -// CHECK:STDOUT: %assoc0: @Interface.%Interface.assoc_type (%Interface.assoc_type.0d9) = assoc_entity element0, %X [symbolic = %assoc0 (constants.%assoc0.dbe)] +// CHECK:STDOUT: %assoc0: @Interface.%Interface.assoc_type (%Interface.assoc_type.0d9) = assoc_entity element0, %X [symbolic = %assoc0 (constants.%assoc0.7e7)] // CHECK:STDOUT: // CHECK:STDOUT: interface { // CHECK:STDOUT: %Self.1: @Interface.%Interface.type (%Interface.type.1a8) = bind_symbolic_name Self, 1 [symbolic = %Self.2 (constants.%Self.c05)] -// CHECK:STDOUT: %X: @X.%T (%T) = assoc_const_decl @X [concrete] { -// CHECK:STDOUT: %assoc0: @Interface.%Interface.assoc_type (%Interface.assoc_type.0d9) = assoc_entity element0, @Interface.%X [symbolic = @Interface.%assoc0 (constants.%assoc0.dbe)] +// CHECK:STDOUT: %X: @X.%ptr (%ptr.79f) = assoc_const_decl @X [concrete] { +// CHECK:STDOUT: %assoc0: @Interface.%Interface.assoc_type (%Interface.assoc_type.0d9) = assoc_entity element0, @Interface.%X [symbolic = @Interface.%assoc0 (constants.%assoc0.7e7)] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !members: @@ -183,37 +209,51 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic assoc_const @X(@Interface.%T.loc4_21.2: type, @Interface.%Self.1: @Interface.%Interface.type (%Interface.type.1a8)) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %require_complete: = require_complete_type %T [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T.8b3)] +// CHECK:STDOUT: %ptr: type = ptr_type %T [symbolic = %ptr (constants.%ptr.79f)] +// CHECK:STDOUT: %require_complete: = require_complete_type %ptr [symbolic = %require_complete (constants.%require_complete.6e5)] // CHECK:STDOUT: -// CHECK:STDOUT: assoc_const X:! @X.%T (%T); +// CHECK:STDOUT: assoc_const X:! @X.%ptr (%ptr.79f); // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @AccessGeneric(%T.loc8_18.2: type, %I.loc8_28.2: @AccessGeneric.%Interface.type.loc8_43.1 (%Interface.type.1a8)) { -// CHECK:STDOUT: %T.loc8_18.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_18.1 (constants.%T)] +// CHECK:STDOUT: %T.loc8_18.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_18.1 (constants.%T.8b3)] // CHECK:STDOUT: %Interface.type.loc8_43.1: type = facet_type <@Interface, @Interface(%T.loc8_18.1)> [symbolic = %Interface.type.loc8_43.1 (constants.%Interface.type.1a8)] // CHECK:STDOUT: %I.loc8_28.1: @AccessGeneric.%Interface.type.loc8_43.1 (%Interface.type.1a8) = bind_symbolic_name I, 1 [symbolic = %I.loc8_28.1 (constants.%I.c05)] // CHECK:STDOUT: %pattern_type.loc8_28: type = pattern_type %Interface.type.loc8_43.1 [symbolic = %pattern_type.loc8_28 (constants.%pattern_type.eaa)] -// CHECK:STDOUT: %pattern_type.loc8_46: type = pattern_type %T.loc8_18.1 [symbolic = %pattern_type.loc8_46 (constants.%pattern_type.7dc)] +// CHECK:STDOUT: %ptr.loc8_50.1: type = ptr_type %T.loc8_18.1 [symbolic = %ptr.loc8_50.1 (constants.%ptr.79f)] +// CHECK:STDOUT: %pattern_type.loc8_46: type = pattern_type %ptr.loc8_50.1 [symbolic = %pattern_type.loc8_46 (constants.%pattern_type.afe)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete.loc9_10: = require_complete_type %Interface.type.loc8_43.1 [symbolic = %require_complete.loc9_10 (constants.%require_complete.376)] // CHECK:STDOUT: %Interface.assoc_type: type = assoc_entity_type @Interface, @Interface(%T.loc8_18.1) [symbolic = %Interface.assoc_type (constants.%Interface.assoc_type.0d9)] -// CHECK:STDOUT: %assoc0: @AccessGeneric.%Interface.assoc_type (%Interface.assoc_type.0d9) = assoc_entity element0, @Interface.%X [symbolic = %assoc0 (constants.%assoc0.dbe)] +// CHECK:STDOUT: %assoc0: @AccessGeneric.%Interface.assoc_type (%Interface.assoc_type.0d9) = assoc_entity element0, @Interface.%X [symbolic = %assoc0 (constants.%assoc0.7e7)] // CHECK:STDOUT: %I.as_type.loc9_11.2: type = facet_access_type %I.loc8_28.1 [symbolic = %I.as_type.loc9_11.2 (constants.%I.as_type.fe1)] // CHECK:STDOUT: %Interface.lookup_impl_witness: = lookup_impl_witness %I.loc8_28.1, @Interface, @Interface(%T.loc8_18.1) [symbolic = %Interface.lookup_impl_witness (constants.%Interface.lookup_impl_witness.301)] -// CHECK:STDOUT: %impl.elem0.loc9_11.2: @AccessGeneric.%T.loc8_18.1 (%T) = impl_witness_access %Interface.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc9_11.2 (constants.%impl.elem0.245)] -// CHECK:STDOUT: %require_complete.loc9_13: = require_complete_type %T.loc8_18.1 [symbolic = %require_complete.loc9_13 (constants.%require_complete.4ae)] +// CHECK:STDOUT: %impl.elem0.loc9_11.3: @AccessGeneric.%ptr.loc8_50.1 (%ptr.79f) = impl_witness_access %Interface.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc9_11.3 (constants.%impl.elem0.aca)] +// CHECK:STDOUT: %require_complete.loc9_13: = require_complete_type %ptr.loc8_50.1 [symbolic = %require_complete.loc9_13 (constants.%require_complete.6e5)] +// CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %ptr.loc8_50.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.cb2)] +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %ptr.loc8_50.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.def)] +// CHECK:STDOUT: %.loc9_11.4: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc9_11.4 (constants.%.fe5)] +// CHECK:STDOUT: %impl.elem0.loc9_11.4: @AccessGeneric.%.loc9_11.4 (%.fe5) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc9_11.4 (constants.%impl.elem0.429)] +// CHECK:STDOUT: %bound_method.loc9_11.3: = bound_method %impl.elem0.loc9_11.3, %impl.elem0.loc9_11.4 [symbolic = %bound_method.loc9_11.3 (constants.%bound_method.313)] +// CHECK:STDOUT: %specific_impl_fn.loc9_11.2: = specific_impl_function %impl.elem0.loc9_11.4, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc9_11.2 (constants.%specific_impl_fn.d8a)] +// CHECK:STDOUT: %bound_method.loc9_11.4: = bound_method %impl.elem0.loc9_11.3, %specific_impl_fn.loc9_11.2 [symbolic = %bound_method.loc9_11.4 (constants.%bound_method.5c7)] // CHECK:STDOUT: -// CHECK:STDOUT: fn() -> @AccessGeneric.%T.loc8_18.1 (%T) { +// CHECK:STDOUT: fn() -> @AccessGeneric.%ptr.loc8_50.1 (%ptr.79f) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %I.ref: @AccessGeneric.%Interface.type.loc8_43.1 (%Interface.type.1a8) = name_ref I, %I.loc8_28.2 [symbolic = %I.loc8_28.1 (constants.%I.c05)] -// CHECK:STDOUT: %.loc9_11.1: @AccessGeneric.%Interface.assoc_type (%Interface.assoc_type.0d9) = specific_constant @X.%assoc0, @Interface(constants.%T) [symbolic = %assoc0 (constants.%assoc0.dbe)] -// CHECK:STDOUT: %X.ref: @AccessGeneric.%Interface.assoc_type (%Interface.assoc_type.0d9) = name_ref X, %.loc9_11.1 [symbolic = %assoc0 (constants.%assoc0.dbe)] +// CHECK:STDOUT: %.loc9_11.1: @AccessGeneric.%Interface.assoc_type (%Interface.assoc_type.0d9) = specific_constant @X.%assoc0, @Interface(constants.%T.8b3) [symbolic = %assoc0 (constants.%assoc0.7e7)] +// CHECK:STDOUT: %X.ref: @AccessGeneric.%Interface.assoc_type (%Interface.assoc_type.0d9) = name_ref X, %.loc9_11.1 [symbolic = %assoc0 (constants.%assoc0.7e7)] // CHECK:STDOUT: %I.as_type.loc9_11.1: type = facet_access_type %I.ref [symbolic = %I.as_type.loc9_11.2 (constants.%I.as_type.fe1)] // CHECK:STDOUT: %.loc9_11.2: type = converted %I.ref, %I.as_type.loc9_11.1 [symbolic = %I.as_type.loc9_11.2 (constants.%I.as_type.fe1)] -// CHECK:STDOUT: %impl.elem0.loc9_11.1: @AccessGeneric.%T.loc8_18.1 (%T) = impl_witness_access constants.%Interface.lookup_impl_witness.301, element0 [symbolic = %impl.elem0.loc9_11.2 (constants.%impl.elem0.245)] -// CHECK:STDOUT: return %impl.elem0.loc9_11.1 +// CHECK:STDOUT: %impl.elem0.loc9_11.1: @AccessGeneric.%ptr.loc8_50.1 (%ptr.79f) = impl_witness_access constants.%Interface.lookup_impl_witness.301, element0 [symbolic = %impl.elem0.loc9_11.3 (constants.%impl.elem0.aca)] +// CHECK:STDOUT: %impl.elem0.loc9_11.2: @AccessGeneric.%.loc9_11.4 (%.fe5) = impl_witness_access constants.%Copy.lookup_impl_witness.cb2, element0 [symbolic = %impl.elem0.loc9_11.4 (constants.%impl.elem0.429)] +// CHECK:STDOUT: %bound_method.loc9_11.1: = bound_method %impl.elem0.loc9_11.1, %impl.elem0.loc9_11.2 [symbolic = %bound_method.loc9_11.3 (constants.%bound_method.313)] +// CHECK:STDOUT: %specific_impl_fn.loc9_11.1: = specific_impl_function %impl.elem0.loc9_11.2, @Copy.Op(constants.%Copy.facet.def) [symbolic = %specific_impl_fn.loc9_11.2 (constants.%specific_impl_fn.d8a)] +// CHECK:STDOUT: %bound_method.loc9_11.2: = bound_method %impl.elem0.loc9_11.1, %specific_impl_fn.loc9_11.1 [symbolic = %bound_method.loc9_11.4 (constants.%bound_method.5c7)] +// CHECK:STDOUT: %.loc9_11.3: init @AccessGeneric.%ptr.loc8_50.1 (%ptr.79f) = call %bound_method.loc9_11.2(%impl.elem0.loc9_11.1) +// CHECK:STDOUT: return %.loc9_11.3 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -223,46 +263,56 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: !definition: // CHECK:STDOUT: %I.as_type.loc13_11.2: type = facet_access_type %I.loc12_19.1 [symbolic = %I.as_type.loc13_11.2 (constants.%I.as_type.85e)] // CHECK:STDOUT: %Interface.lookup_impl_witness: = lookup_impl_witness %I.loc12_19.1, @Interface, @Interface(constants.%i32) [symbolic = %Interface.lookup_impl_witness (constants.%Interface.lookup_impl_witness.73f)] -// CHECK:STDOUT: %impl.elem0.loc13_11.2: %i32 = impl_witness_access %Interface.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc13_11.2 (constants.%impl.elem0.f4f)] +// CHECK:STDOUT: %impl.elem0.loc13_11.3: %ptr.235 = impl_witness_access %Interface.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc13_11.3 (constants.%impl.elem0.5f0)] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.bound: = bound_method %impl.elem0.loc13_11.3, constants.%ptr.as.Copy.impl.Op.2f4 [symbolic = %ptr.as.Copy.impl.Op.bound (constants.%ptr.as.Copy.impl.Op.bound)] +// CHECK:STDOUT: %bound_method.loc13_11.3: = bound_method %impl.elem0.loc13_11.3, constants.%ptr.as.Copy.impl.Op.specific_fn [symbolic = %bound_method.loc13_11.3 (constants.%bound_method.f5e)] // CHECK:STDOUT: -// CHECK:STDOUT: fn() -> %i32 { +// CHECK:STDOUT: fn() -> %ptr.235 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %I.ref: %Interface.type.bcd = name_ref I, %I.loc12_19.2 [symbolic = %I.loc12_19.1 (constants.%I.910)] -// CHECK:STDOUT: %.loc13_11.1: %Interface.assoc_type.aaa = specific_constant @X.%assoc0, @Interface(constants.%i32) [concrete = constants.%assoc0.69f] -// CHECK:STDOUT: %X.ref: %Interface.assoc_type.aaa = name_ref X, %.loc13_11.1 [concrete = constants.%assoc0.69f] +// CHECK:STDOUT: %.loc13_11.1: %Interface.assoc_type.aaa = specific_constant @X.%assoc0, @Interface(constants.%i32) [concrete = constants.%assoc0.04e] +// CHECK:STDOUT: %X.ref: %Interface.assoc_type.aaa = name_ref X, %.loc13_11.1 [concrete = constants.%assoc0.04e] // CHECK:STDOUT: %I.as_type.loc13_11.1: type = facet_access_type %I.ref [symbolic = %I.as_type.loc13_11.2 (constants.%I.as_type.85e)] // CHECK:STDOUT: %.loc13_11.2: type = converted %I.ref, %I.as_type.loc13_11.1 [symbolic = %I.as_type.loc13_11.2 (constants.%I.as_type.85e)] -// CHECK:STDOUT: %impl.elem0.loc13_11.1: %i32 = impl_witness_access constants.%Interface.lookup_impl_witness.73f, element0 [symbolic = %impl.elem0.loc13_11.2 (constants.%impl.elem0.f4f)] -// CHECK:STDOUT: return %impl.elem0.loc13_11.1 +// CHECK:STDOUT: %impl.elem0.loc13_11.1: %ptr.235 = impl_witness_access constants.%Interface.lookup_impl_witness.73f, element0 [symbolic = %impl.elem0.loc13_11.3 (constants.%impl.elem0.5f0)] +// CHECK:STDOUT: %impl.elem0.loc13_11.2: %.284 = impl_witness_access constants.%Copy.impl_witness.19c, element0 [concrete = constants.%ptr.as.Copy.impl.Op.2f4] +// CHECK:STDOUT: %bound_method.loc13_11.1: = bound_method %impl.elem0.loc13_11.1, %impl.elem0.loc13_11.2 [symbolic = %ptr.as.Copy.impl.Op.bound (constants.%ptr.as.Copy.impl.Op.bound)] +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0.loc13_11.2, @ptr.as.Copy.impl.Op(constants.%i32) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc13_11.2: = bound_method %impl.elem0.loc13_11.1, %specific_fn [symbolic = %bound_method.loc13_11.3 (constants.%bound_method.f5e)] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.235 = call %bound_method.loc13_11.2(%impl.elem0.loc13_11.1) [symbolic = %impl.elem0.loc13_11.3 (constants.%impl.elem0.5f0)] +// CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Interface(constants.%T) { -// CHECK:STDOUT: %T.loc4_21.1 => constants.%T +// CHECK:STDOUT: specific @Interface(constants.%T.8b3) { +// CHECK:STDOUT: %T.loc4_21.1 => constants.%T.8b3 // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %Interface.type => constants.%Interface.type.1a8 // CHECK:STDOUT: %Self.2 => constants.%Self.c05 // CHECK:STDOUT: %Interface.assoc_type => constants.%Interface.assoc_type.0d9 -// CHECK:STDOUT: %assoc0 => constants.%assoc0.dbe +// CHECK:STDOUT: %assoc0 => constants.%assoc0.7e7 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @X(constants.%T, constants.%Self.c05) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae +// CHECK:STDOUT: specific @X(constants.%T.8b3, constants.%Self.c05) { +// CHECK:STDOUT: %T => constants.%T.8b3 +// CHECK:STDOUT: %ptr => constants.%ptr.79f +// CHECK:STDOUT: %require_complete => constants.%require_complete.6e5 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @AccessGeneric(constants.%T, constants.%I.c05) { -// CHECK:STDOUT: %T.loc8_18.1 => constants.%T +// CHECK:STDOUT: specific @AccessGeneric(constants.%T.8b3, constants.%I.c05) { +// CHECK:STDOUT: %T.loc8_18.1 => constants.%T.8b3 // CHECK:STDOUT: %Interface.type.loc8_43.1 => constants.%Interface.type.1a8 // CHECK:STDOUT: %I.loc8_28.1 => constants.%I.c05 // CHECK:STDOUT: %pattern_type.loc8_28 => constants.%pattern_type.eaa -// CHECK:STDOUT: %pattern_type.loc8_46 => constants.%pattern_type.7dc +// CHECK:STDOUT: %ptr.loc8_50.1 => constants.%ptr.79f +// CHECK:STDOUT: %pattern_type.loc8_46 => constants.%pattern_type.afe // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @X(constants.%T, constants.%Interface.facet.b19) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae +// CHECK:STDOUT: specific @X(constants.%T.8b3, constants.%Interface.facet.b19) { +// CHECK:STDOUT: %T => constants.%T.8b3 +// CHECK:STDOUT: %ptr => constants.%ptr.79f +// CHECK:STDOUT: %require_complete => constants.%require_complete.6e5 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Interface(constants.%i32) { @@ -272,7 +322,7 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: %Interface.type => constants.%Interface.type.bcd // CHECK:STDOUT: %Self.2 => constants.%Self.e75 // CHECK:STDOUT: %Interface.assoc_type => constants.%Interface.assoc_type.aaa -// CHECK:STDOUT: %assoc0 => constants.%assoc0.69f +// CHECK:STDOUT: %assoc0 => constants.%assoc0.04e // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @AccessConcrete(constants.%I.910) { @@ -281,7 +331,8 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: specific @X(constants.%i32, constants.%Interface.facet.c5c) { // CHECK:STDOUT: %T => constants.%i32 -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a +// CHECK:STDOUT: %ptr => constants.%ptr.235 +// CHECK:STDOUT: %require_complete => constants.%complete_type.3d0 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_no_member.carbon @@ -295,14 +346,16 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: %Interface.generic: %Interface.type.e32 = struct_value () [concrete] // CHECK:STDOUT: %Interface.type.1a8: type = facet_type <@Interface, @Interface(%T)> [symbolic] // CHECK:STDOUT: %Self.c05: %Interface.type.1a8 = bind_symbolic_name Self, 1 [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] +// CHECK:STDOUT: %ptr: type = ptr_type %T [symbolic] +// CHECK:STDOUT: %require_complete.6e5: = require_complete_type %ptr [symbolic] // CHECK:STDOUT: %Interface.assoc_type.0d9: type = assoc_entity_type @Interface, @Interface(%T) [symbolic] -// CHECK:STDOUT: %assoc0.dbe: %Interface.assoc_type.0d9 = assoc_entity element0, @Interface.%X [symbolic] +// CHECK:STDOUT: %assoc0.7e7: %Interface.assoc_type.0d9 = assoc_entity element0, @Interface.%X [symbolic] // CHECK:STDOUT: %I.c05: %Interface.type.1a8 = bind_symbolic_name I, 1 [symbolic] // CHECK:STDOUT: %pattern_type.eaa: type = pattern_type %Interface.type.1a8 [symbolic] // CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] // CHECK:STDOUT: %AccessMissingGeneric.type: type = fn_type @AccessMissingGeneric [concrete] // CHECK:STDOUT: %AccessMissingGeneric: %AccessMissingGeneric.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] // CHECK:STDOUT: %require_complete.376: = require_complete_type %Interface.type.1a8 [symbolic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] @@ -316,7 +369,7 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: %AccessMissingConcrete: %AccessMissingConcrete.type = struct_value () [concrete] // CHECK:STDOUT: %Self.e75: %Interface.type.bcd = bind_symbolic_name Self, 1 [symbolic] // CHECK:STDOUT: %Interface.assoc_type.aaa: type = assoc_entity_type @Interface, @Interface(%i32) [concrete] -// CHECK:STDOUT: %assoc0.69f: %Interface.assoc_type.aaa = assoc_entity element0, @Interface.%X [concrete] +// CHECK:STDOUT: %assoc0.04e: %Interface.assoc_type.aaa = assoc_entity element0, @Interface.%X [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -388,12 +441,12 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: %Interface.type: type = facet_type <@Interface, @Interface(%T.loc4_21.1)> [symbolic = %Interface.type (constants.%Interface.type.1a8)] // CHECK:STDOUT: %Self.2: @Interface.%Interface.type (%Interface.type.1a8) = bind_symbolic_name Self, 1 [symbolic = %Self.2 (constants.%Self.c05)] // CHECK:STDOUT: %Interface.assoc_type: type = assoc_entity_type @Interface, @Interface(%T.loc4_21.1) [symbolic = %Interface.assoc_type (constants.%Interface.assoc_type.0d9)] -// CHECK:STDOUT: %assoc0: @Interface.%Interface.assoc_type (%Interface.assoc_type.0d9) = assoc_entity element0, %X [symbolic = %assoc0 (constants.%assoc0.dbe)] +// CHECK:STDOUT: %assoc0: @Interface.%Interface.assoc_type (%Interface.assoc_type.0d9) = assoc_entity element0, %X [symbolic = %assoc0 (constants.%assoc0.7e7)] // CHECK:STDOUT: // CHECK:STDOUT: interface { // CHECK:STDOUT: %Self.1: @Interface.%Interface.type (%Interface.type.1a8) = bind_symbolic_name Self, 1 [symbolic = %Self.2 (constants.%Self.c05)] -// CHECK:STDOUT: %X: @X.%T (%T) = assoc_const_decl @X [concrete] { -// CHECK:STDOUT: %assoc0: @Interface.%Interface.assoc_type (%Interface.assoc_type.0d9) = assoc_entity element0, @Interface.%X [symbolic = @Interface.%assoc0 (constants.%assoc0.dbe)] +// CHECK:STDOUT: %X: @X.%ptr (%ptr) = assoc_const_decl @X [concrete] { +// CHECK:STDOUT: %assoc0: @Interface.%Interface.assoc_type (%Interface.assoc_type.0d9) = assoc_entity element0, @Interface.%X [symbolic = @Interface.%assoc0 (constants.%assoc0.7e7)] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !members: @@ -407,9 +460,10 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: generic assoc_const @X(@Interface.%T.loc4_21.2: type, @Interface.%Self.1: @Interface.%Interface.type (%Interface.type.1a8)) { // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %require_complete: = require_complete_type %T [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: %ptr: type = ptr_type %T [symbolic = %ptr (constants.%ptr)] +// CHECK:STDOUT: %require_complete: = require_complete_type %ptr [symbolic = %require_complete (constants.%require_complete.6e5)] // CHECK:STDOUT: -// CHECK:STDOUT: assoc_const X:! @X.%T (%T); +// CHECK:STDOUT: assoc_const X:! @X.%ptr (%ptr); // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @AccessMissingGeneric(%T.loc8_25.2: type, %I.loc8_35.2: @AccessMissingGeneric.%Interface.type.loc8_50.1 (%Interface.type.1a8)) { @@ -420,13 +474,14 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: %pattern_type.loc8_53: type = pattern_type %T.loc8_25.1 [symbolic = %pattern_type.loc8_53 (constants.%pattern_type.7dc)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %Interface.type.loc8_50.1 [symbolic = %require_complete (constants.%require_complete.376)] +// CHECK:STDOUT: %require_complete.loc8: = require_complete_type %T.loc8_25.1 [symbolic = %require_complete.loc8 (constants.%require_complete.4ae)] +// CHECK:STDOUT: %require_complete.loc13: = require_complete_type %Interface.type.loc8_50.1 [symbolic = %require_complete.loc13 (constants.%require_complete.376)] // CHECK:STDOUT: // CHECK:STDOUT: fn() -> @AccessMissingGeneric.%T.loc8_25.1 (%T) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %I.ref: @AccessMissingGeneric.%Interface.type.loc8_50.1 (%Interface.type.1a8) = name_ref I, %I.loc8_35.2 [symbolic = %I.loc8_35.1 (constants.%I.c05)] // CHECK:STDOUT: %nonesuch.ref: = name_ref nonesuch, [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -439,7 +494,7 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %I.ref: %Interface.type.bcd = name_ref I, %I.loc16_26.2 [symbolic = %I.loc16_26.1 (constants.%I.910)] // CHECK:STDOUT: %nonesuch.ref: = name_ref nonesuch, [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -450,12 +505,13 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: %Interface.type => constants.%Interface.type.1a8 // CHECK:STDOUT: %Self.2 => constants.%Self.c05 // CHECK:STDOUT: %Interface.assoc_type => constants.%Interface.assoc_type.0d9 -// CHECK:STDOUT: %assoc0 => constants.%assoc0.dbe +// CHECK:STDOUT: %assoc0 => constants.%assoc0.7e7 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @X(constants.%T, constants.%Self.c05) { // CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae +// CHECK:STDOUT: %ptr => constants.%ptr +// CHECK:STDOUT: %require_complete => constants.%require_complete.6e5 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @AccessMissingGeneric(constants.%T, constants.%I.c05) { @@ -473,7 +529,7 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: %Interface.type => constants.%Interface.type.bcd // CHECK:STDOUT: %Self.2 => constants.%Self.e75 // CHECK:STDOUT: %Interface.assoc_type => constants.%Interface.assoc_type.aaa -// CHECK:STDOUT: %assoc0 => constants.%assoc0.69f +// CHECK:STDOUT: %assoc0 => constants.%assoc0.04e // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @AccessMissingConcrete(constants.%I.910) { diff --git a/toolchain/check/testdata/interop/cpp/class/base.carbon b/toolchain/check/testdata/interop/cpp/class/base.carbon index 14f811de90f6..917f58110d9d 100644 --- a/toolchain/check/testdata/interop/cpp/class/base.carbon +++ b/toolchain/check/testdata/interop/cpp/class/base.carbon @@ -250,6 +250,17 @@ class V { // CHECK:STDOUT: %ConvertPtr.type: type = fn_type @ConvertPtr [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %ConvertPtr: %ConvertPtr.type = struct_value () [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf: %ptr.as.Copy.impl.Op.type.f23 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.add: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%Base) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.212: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%Base) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.eb2: %ptr.as.Copy.impl.Op.type.212 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.869: %Copy.type = facet_value %ptr.fb2, (%Copy.impl_witness.add) [concrete] +// CHECK:STDOUT: %.e4a: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.869 [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn: = specific_function %ptr.as.Copy.impl.Op.eb2, @ptr.as.Copy.impl.Op(%Base) [concrete] // CHECK:STDOUT: %AcceptVal.type: type = fn_type @AcceptVal [concrete] // CHECK:STDOUT: %AcceptVal: %AcceptVal.type = struct_value () [concrete] // CHECK:STDOUT: %pattern_type.5de: type = pattern_type %Derived [concrete] @@ -265,6 +276,8 @@ class V { // CHECK:STDOUT: } // CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} // CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -307,7 +320,12 @@ class V { // CHECK:STDOUT: %.loc8_11.2: ref %Base = class_element_access %.loc8_11.1, element0 // CHECK:STDOUT: %addr: %ptr.fb2 = addr_of %.loc8_11.2 // CHECK:STDOUT: %.loc8_11.3: %ptr.fb2 = converted %d.ref, %addr -// CHECK:STDOUT: return %.loc8_11.3 +// CHECK:STDOUT: %impl.elem0: %.e4a = impl_witness_access constants.%Copy.impl_witness.add, element0 [concrete = constants.%ptr.as.Copy.impl.Op.eb2] +// CHECK:STDOUT: %bound_method.loc8_11.1: = bound_method %.loc8_11.3, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @ptr.as.Copy.impl.Op(constants.%Base) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc8_11.2: = bound_method %.loc8_11.3, %specific_fn +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.fb2 = call %bound_method.loc8_11.2(%.loc8_11.3) +// CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConvertVal(%d.param: %Derived) { @@ -367,9 +385,20 @@ class V { // CHECK:STDOUT: constants { // CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Base: type = class_type @Base [concrete] // CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %i32 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -380,6 +409,8 @@ class V { // CHECK:STDOUT: } // CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} // CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @AccessDirect(%d.param: %Derived) -> %i32 { @@ -390,7 +421,12 @@ class V { // CHECK:STDOUT: %.loc8_11.2: ref %Base = converted %d.ref, %.loc8_11.1 // CHECK:STDOUT: %.loc8_11.3: ref %i32 = class_element_access %.loc8_11.2, element0 // CHECK:STDOUT: %.loc8_11.4: %i32 = bind_value %.loc8_11.3 -// CHECK:STDOUT: return %.loc8_11.4 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc8_11.1: = bound_method %.loc8_11.4, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc8_11.2: = bound_method %.loc8_11.4, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc8_11.2(%.loc8_11.4) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @AccessQualified(%d.param: %Derived) -> %i32 { @@ -403,7 +439,12 @@ class V { // CHECK:STDOUT: %.loc14_11.2: ref %Base = converted %d.ref, %.loc14_11.1 // CHECK:STDOUT: %.loc14_11.3: ref %i32 = class_element_access %.loc14_11.2, element1 // CHECK:STDOUT: %.loc14_11.4: %i32 = bind_value %.loc14_11.3 -// CHECK:STDOUT: return %.loc14_11.4 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc14_11.1: = bound_method %.loc14_11.4, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc14_11.2: = bound_method %.loc14_11.4, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc14_11.2(%.loc14_11.4) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_base_method.carbon diff --git a/toolchain/check/testdata/interop/cpp/class/field.carbon b/toolchain/check/testdata/interop/cpp/class/field.carbon index 21515fad411f..3385f2f98f20 100644 --- a/toolchain/check/testdata/interop/cpp/class/field.carbon +++ b/toolchain/check/testdata/interop/cpp/class/field.carbon @@ -295,13 +295,26 @@ fn Test(m: Cpp.UnsupportedMembers*) { // CHECK:STDOUT: constants { // CHECK:STDOUT: %Union: type = class_type @Union [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Union.elem.041: type = unbound_element_type %Union, %i32 [concrete] // CHECK:STDOUT: %ptr.235: type = ptr_type %i32 [concrete] // CHECK:STDOUT: %Union.elem.92a: type = unbound_element_type %Union, %ptr.235 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/types/int, loc21_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F(%u.param: %Union) -> %i32 { @@ -310,7 +323,12 @@ fn Test(m: Cpp.UnsupportedMembers*) { // CHECK:STDOUT: %a.ref: %Union.elem.041 = name_ref a, @Union.%.1 [concrete = @Union.%.1] // CHECK:STDOUT: %.loc8_11.1: ref %i32 = class_element_access %u.ref, element0 // CHECK:STDOUT: %.loc8_11.2: %i32 = bind_value %.loc8_11.1 -// CHECK:STDOUT: return %.loc8_11.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc8_11.1: = bound_method %.loc8_11.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc8_11.2: = bound_method %.loc8_11.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc8_11.2(%.loc8_11.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G(%u.param: %Union) -> %i32 { @@ -319,7 +337,12 @@ fn Test(m: Cpp.UnsupportedMembers*) { // CHECK:STDOUT: %b.ref: %Union.elem.041 = name_ref b, @Union.%.2 [concrete = @Union.%.2] // CHECK:STDOUT: %.loc14_11.1: ref %i32 = class_element_access %u.ref, element1 // CHECK:STDOUT: %.loc14_11.2: %i32 = bind_value %.loc14_11.1 -// CHECK:STDOUT: return %.loc14_11.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc14_11.1: = bound_method %.loc14_11.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc14_11.2: = bound_method %.loc14_11.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc14_11.2(%.loc14_11.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @H(%u.param: %Union) -> %i32 { @@ -330,7 +353,12 @@ fn Test(m: Cpp.UnsupportedMembers*) { // CHECK:STDOUT: %.loc20_12.2: %ptr.235 = bind_value %.loc20_12.1 // CHECK:STDOUT: %.loc20_10.1: ref %i32 = deref %.loc20_12.2 // CHECK:STDOUT: %.loc20_10.2: %i32 = bind_value %.loc20_10.1 -// CHECK:STDOUT: return %.loc20_10.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc20_10.1: = bound_method %.loc20_10.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc20_10.2: = bound_method %.loc20_10.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc20_10.2(%.loc20_10.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_non_bitfields_in_type_with_bitfields.carbon @@ -338,13 +366,26 @@ fn Test(m: Cpp.UnsupportedMembers*) { // CHECK:STDOUT: constants { // CHECK:STDOUT: %Struct: type = class_type @Struct [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Struct.elem: type = unbound_element_type %Struct, %i32 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %Union: type = class_type @Union [concrete] // CHECK:STDOUT: %Union.elem: type = unbound_element_type %Union, %i32 [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/types/int, loc21_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F(%s.param: %Struct) -> %i32 { @@ -353,7 +394,12 @@ fn Test(m: Cpp.UnsupportedMembers*) { // CHECK:STDOUT: %a.ref: %Struct.elem = name_ref a, @Struct.%.1 [concrete = @Struct.%.1] // CHECK:STDOUT: %.loc8_11.1: ref %i32 = class_element_access %s.ref, element0 // CHECK:STDOUT: %.loc8_11.2: %i32 = bind_value %.loc8_11.1 -// CHECK:STDOUT: return %.loc8_11.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc8_11.1: = bound_method %.loc8_11.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc8_11.2: = bound_method %.loc8_11.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc8_11.2(%.loc8_11.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G(%s.param: %Union) -> %i32 { @@ -362,7 +408,12 @@ fn Test(m: Cpp.UnsupportedMembers*) { // CHECK:STDOUT: %c.ref: %Union.elem = name_ref c, @Union.%.1 [concrete = @Union.%.1] // CHECK:STDOUT: %.loc14_11.1: ref %i32 = class_element_access %s.ref, element0 // CHECK:STDOUT: %.loc14_11.2: %i32 = bind_value %.loc14_11.1 -// CHECK:STDOUT: return %.loc14_11.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc14_11.1: = bound_method %.loc14_11.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc14_11.2: = bound_method %.loc14_11.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc14_11.2(%.loc14_11.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_use_bitfields.carbon @@ -381,13 +432,13 @@ fn Test(m: Cpp.UnsupportedMembers*) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %s.ref: %Struct = name_ref s, %s // CHECK:STDOUT: %b.ref: = name_ref b, [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G(%s.param: %Union) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %s.ref: %Union = name_ref s, %s // CHECK:STDOUT: %d.ref: = name_ref d, [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/class/template.carbon b/toolchain/check/testdata/interop/cpp/class/template.carbon index 0a7db0be9dea..c6fed92987da 100644 --- a/toolchain/check/testdata/interop/cpp/class/template.carbon +++ b/toolchain/check/testdata/interop/cpp/class/template.carbon @@ -86,19 +86,39 @@ var y: Cpp.Xint.r#type = 0; // CHECK:STDOUT: %A.0bedf0.1: type = class_type @A.1 [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Base: type = class_type @Base [concrete] // CHECK:STDOUT: %A.elem.c3f: type = unbound_element_type %A.0bedf0.1, %i32 [concrete] // CHECK:STDOUT: %A.f.type: type = fn_type @A.f [concrete] // CHECK:STDOUT: %A.f: %A.f.type = struct_value () [concrete] -// CHECK:STDOUT: %const: type = const_type %A.0bedf0.1 [concrete] -// CHECK:STDOUT: %ptr.703: type = ptr_type %const [concrete] +// CHECK:STDOUT: %const.16f: type = const_type %A.0bedf0.1 [concrete] +// CHECK:STDOUT: %ptr.703: type = ptr_type %const.16f [concrete] // CHECK:STDOUT: %f__carbon_thunk.type: type = fn_type @f__carbon_thunk [concrete] // CHECK:STDOUT: %f__carbon_thunk: %f__carbon_thunk.type = struct_value () [concrete] // CHECK:STDOUT: %ptr.270828.1: type = ptr_type %A.0bedf0.1 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf: %ptr.as.Copy.impl.Op.type.f23 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %A.0bedf0.2: type = class_type @A.2 [concrete] // CHECK:STDOUT: %ptr.270828.2: type = ptr_type %A.0bedf0.2 [concrete] // CHECK:STDOUT: %ptr.fb2: type = ptr_type %Base [concrete] +// CHECK:STDOUT: %Copy.impl_witness.add: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%Base) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.212: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%Base) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.eb2: %ptr.as.Copy.impl.Op.type.212 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.869: %Copy.type = facet_value %ptr.fb2, (%Copy.impl_witness.add) [concrete] +// CHECK:STDOUT: %.e4a: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.869 [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn: = specific_function %ptr.as.Copy.impl.Op.eb2, @ptr.as.Copy.impl.Op(%Base) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -112,6 +132,10 @@ var y: Cpp.Xint.r#type = 0; // CHECK:STDOUT: } { // CHECK:STDOUT: // CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F(%x.param: %A.0bedf0.1) -> %i32 { @@ -128,7 +152,12 @@ var y: Cpp.Xint.r#type = 0; // CHECK:STDOUT: %n.ref: %A.elem.c3f = name_ref n, @A.1.%.2 [concrete = @A.1.%.2] // CHECK:STDOUT: %.loc10_11.1: ref %i32 = class_element_access %x.ref.loc10, element1 // CHECK:STDOUT: %.loc10_11.2: %i32 = bind_value %.loc10_11.1 -// CHECK:STDOUT: return %.loc10_11.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc10_11.1: = bound_method %.loc10_11.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc10_11.2: = bound_method %.loc10_11.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc10_11.2(%.loc10_11.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G(%p.param: %ptr.270828.2) -> %ptr.fb2 { @@ -138,7 +167,12 @@ var y: Cpp.Xint.r#type = 0; // CHECK:STDOUT: %.loc17_11.2: ref %Base = class_element_access %.loc17_11.1, element0 // CHECK:STDOUT: %addr: %ptr.fb2 = addr_of %.loc17_11.2 // CHECK:STDOUT: %.loc17_11.3: %ptr.fb2 = converted %p.ref, %addr -// CHECK:STDOUT: return %.loc17_11.3 +// CHECK:STDOUT: %impl.elem0: %.e4a = impl_witness_access constants.%Copy.impl_witness.add, element0 [concrete = constants.%ptr.as.Copy.impl.Op.eb2] +// CHECK:STDOUT: %bound_method.loc17_11.1: = bound_method %.loc17_11.3, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @ptr.as.Copy.impl.Op(constants.%Base) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc17_11.2: = bound_method %.loc17_11.3, %specific_fn +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.fb2 = call %bound_method.loc17_11.2(%.loc17_11.3) +// CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_use_instantiation_error.carbon diff --git a/toolchain/check/testdata/interop/cpp/function/arithmetic_types_bridged.carbon b/toolchain/check/testdata/interop/cpp/function/arithmetic_types_bridged.carbon index 22d8ea4330ca..c1130bb7e0d8 100644 --- a/toolchain/check/testdata/interop/cpp/function/arithmetic_types_bridged.carbon +++ b/toolchain/check/testdata/interop/cpp/function/arithmetic_types_bridged.carbon @@ -721,7 +721,7 @@ fn F() { // CHECK:STDOUT: } { // CHECK:STDOUT: // CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import_ref.297: %bool.as.Copy.impl.Op.type = import_ref Core//prelude/copy, loc19_31, loaded [concrete = constants.%bool.as.Copy.impl.Op] +// CHECK:STDOUT: %Core.import_ref.297: %bool.as.Copy.impl.Op.type = import_ref Core//prelude/copy, loc23_31, loaded [concrete = constants.%bool.as.Copy.impl.Op] // CHECK:STDOUT: %Copy.impl_witness_table.47e = impl_witness_table (%Core.import_ref.297), @bool.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -782,7 +782,7 @@ fn F() { // CHECK:STDOUT: } { // CHECK:STDOUT: // CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import_ref.297: %bool.as.Copy.impl.Op.type = import_ref Core//prelude/copy, loc19_31, loaded [concrete = constants.%bool.as.Copy.impl.Op] +// CHECK:STDOUT: %Core.import_ref.297: %bool.as.Copy.impl.Op.type = import_ref Core//prelude/copy, loc23_31, loaded [concrete = constants.%bool.as.Copy.impl.Op] // CHECK:STDOUT: %Copy.impl_witness_table.47e = impl_witness_table (%Core.import_ref.297), @bool.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -833,6 +833,8 @@ fn F() { // CHECK:STDOUT: %To: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%To) [symbolic] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.f01: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] // CHECK:STDOUT: %ImplicitAs.impl_witness.f3c: = impl_witness imports.%ImplicitAs.impl_witness_table.b6b, @Core.IntLiteral.as.ImplicitAs.impl(%int_8) [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.8ba: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%int_8) [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.05d: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.8ba = struct_value () [concrete] @@ -842,8 +844,6 @@ fn F() { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.05d, @Core.IntLiteral.as.ImplicitAs.impl.Convert(%int_8) [concrete] // CHECK:STDOUT: %bound_method.cc3: = bound_method %int_-1.638, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %int_-1.416: %i8 = int_value -1 [concrete] -// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] -// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] // CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] // CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] // CHECK:STDOUT: %Copy.impl_witness.537: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_8) [concrete] @@ -934,6 +934,8 @@ fn F() { // CHECK:STDOUT: %To: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.367: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%To) [symbolic] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.8f6: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.367 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] // CHECK:STDOUT: %ImplicitAs.impl_witness.038: = impl_witness imports.%ImplicitAs.impl_witness_table.b63, @Core.IntLiteral.as.ImplicitAs.impl(%int_8) [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.d67: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%int_8) [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.f59: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.d67 = struct_value () [concrete] @@ -943,8 +945,6 @@ fn F() { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.f59, @Core.IntLiteral.as.ImplicitAs.impl.Convert(%int_8) [concrete] // CHECK:STDOUT: %bound_method.43c: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %int_1.e80: %u8 = int_value 1 [concrete] -// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] -// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] // CHECK:STDOUT: %UInt.as.Copy.impl.Op.type.464: type = fn_type @UInt.as.Copy.impl.Op, @UInt.as.Copy.impl(%N) [symbolic] // CHECK:STDOUT: %UInt.as.Copy.impl.Op.be7: %UInt.as.Copy.impl.Op.type.464 = struct_value () [symbolic] // CHECK:STDOUT: %Copy.impl_witness.f2e: = impl_witness imports.%Copy.impl_witness_table.70d, @UInt.as.Copy.impl(%int_8) [concrete] @@ -1022,6 +1022,8 @@ fn F() { // CHECK:STDOUT: %.d16: Core.CharLiteral = char_value U+0058 [concrete] // CHECK:STDOUT: %ImplicitAs.type.d99: type = facet_type <@ImplicitAs, @ImplicitAs(%Char)> [concrete] // CHECK:STDOUT: %ImplicitAs.Convert.type.f57: type = fn_type @ImplicitAs.Convert, @ImplicitAs(%Char) [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] // CHECK:STDOUT: %ImplicitAs.impl_witness.ce4: = impl_witness imports.%ImplicitAs.impl_witness_table.97b [concrete] // CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.d99 = facet_value Core.CharLiteral, (%ImplicitAs.impl_witness.ce4) [concrete] // CHECK:STDOUT: %.674: type = fn_type_with_self_type %ImplicitAs.Convert.type.f57, %ImplicitAs.facet [concrete] @@ -1029,8 +1031,6 @@ fn F() { // CHECK:STDOUT: %Core.CharLiteral.as.ImplicitAs.impl.Convert: %Core.CharLiteral.as.ImplicitAs.impl.Convert.type = struct_value () [concrete] // CHECK:STDOUT: %Core.CharLiteral.as.ImplicitAs.impl.Convert.bound: = bound_method %.d16, %Core.CharLiteral.as.ImplicitAs.impl.Convert [concrete] // CHECK:STDOUT: %int_88: %Char = int_value 88 [concrete] -// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] -// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] // CHECK:STDOUT: %Copy.impl_witness.0c3: = impl_witness imports.%Copy.impl_witness_table.e5f [concrete] // CHECK:STDOUT: %Copy.facet.2e3: %Copy.type = facet_value %Char, (%Copy.impl_witness.0c3) [concrete] // CHECK:STDOUT: %.579: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.2e3 [concrete] @@ -1056,8 +1056,8 @@ fn F() { // CHECK:STDOUT: } { // CHECK:STDOUT: // CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import_ref.adf1: %Core.CharLiteral.as.ImplicitAs.impl.Convert.type = import_ref Core//prelude/types/char, loc23_36, loaded [concrete = constants.%Core.CharLiteral.as.ImplicitAs.impl.Convert] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.97b = impl_witness_table (%Core.import_ref.adf1), @Core.CharLiteral.as.ImplicitAs.impl [concrete] +// CHECK:STDOUT: %Core.import_ref.adf: %Core.CharLiteral.as.ImplicitAs.impl.Convert.type = import_ref Core//prelude/types/char, loc23_36, loaded [concrete = constants.%Core.CharLiteral.as.ImplicitAs.impl.Convert] +// CHECK:STDOUT: %ImplicitAs.impl_witness_table.97b = impl_witness_table (%Core.import_ref.adf), @Core.CharLiteral.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: %Core.import_ref.a11: %Char.as.Copy.impl.Op.type = import_ref Core//prelude/types/char, loc19_31, loaded [concrete = constants.%Char.as.Copy.impl.Op] // CHECK:STDOUT: %Copy.impl_witness_table.e5f = impl_witness_table (%Core.import_ref.a11), @Char.as.Copy.impl [concrete] // CHECK:STDOUT: } @@ -1317,6 +1317,8 @@ fn F() { // CHECK:STDOUT: %To: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%To) [symbolic] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.f01: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] // CHECK:STDOUT: %ImplicitAs.impl_witness.43c: = impl_witness imports.%ImplicitAs.impl_witness_table.b6b, @Core.IntLiteral.as.ImplicitAs.impl(%int_16) [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.346: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%int_16) [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.1f1: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.346 = struct_value () [concrete] @@ -1326,8 +1328,6 @@ fn F() { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.1f1, @Core.IntLiteral.as.ImplicitAs.impl.Convert(%int_16) [concrete] // CHECK:STDOUT: %bound_method.2e8: = bound_method %int_32767.f4b, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %int_32767.faa: %i16 = int_value 32767 [concrete] -// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] -// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] // CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] // CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] // CHECK:STDOUT: %Copy.impl_witness.52b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_16) [concrete] @@ -1419,6 +1419,8 @@ fn F() { // CHECK:STDOUT: %To: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%To) [symbolic] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.f01: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] // CHECK:STDOUT: %ImplicitAs.impl_witness.43c: = impl_witness imports.%ImplicitAs.impl_witness_table.b6b, @Core.IntLiteral.as.ImplicitAs.impl(%int_16) [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.346: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%int_16) [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.1f1: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.346 = struct_value () [concrete] @@ -1428,8 +1430,6 @@ fn F() { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.1f1, @Core.IntLiteral.as.ImplicitAs.impl.Convert(%int_16) [concrete] // CHECK:STDOUT: %bound_method.b0d: = bound_method %int_-32768.882, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %int_-32768.7e5: %i16 = int_value -32768 [concrete] -// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] -// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] // CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] // CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] // CHECK:STDOUT: %Copy.impl_witness.52b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_16) [concrete] @@ -1888,10 +1888,10 @@ fn F() { // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %int_16: Core.IntLiteral = int_value 16 [concrete] // CHECK:STDOUT: %i16: type = class_type @Int, @Int(%int_16) [concrete] -// CHECK:STDOUT: %const: type = const_type %i16 [concrete] +// CHECK:STDOUT: %const.660: type = const_type %i16 [concrete] // CHECK:STDOUT: %foo.type: type = fn_type @foo [concrete] // CHECK:STDOUT: %foo: %foo.type = struct_value () [concrete] -// CHECK:STDOUT: %ptr: type = ptr_type %const [concrete] +// CHECK:STDOUT: %ptr.758: type = ptr_type %const.660 [concrete] // CHECK:STDOUT: %foo__carbon_thunk.type: type = fn_type @foo__carbon_thunk [concrete] // CHECK:STDOUT: %foo__carbon_thunk: %foo__carbon_thunk.type = struct_value () [concrete] // CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] @@ -1909,6 +1909,11 @@ fn F() { // CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.As.impl.Convert.3d5, @Core.IntLiteral.as.As.impl.Convert(%int_16) [concrete] // CHECK:STDOUT: %bound_method: = bound_method %int_1.5b8, %Core.IntLiteral.as.As.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %int_1.f90: %i16 = int_value 1 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.impl_witness.22b: = impl_witness imports.%Copy.impl_witness_table.000, @Int.as.Copy.impl(%int_16) [concrete] +// CHECK:STDOUT: %Copy.facet.7cf: %Copy.type = facet_value %i16, (%Copy.impl_witness.22b) [concrete] +// CHECK:STDOUT: %Copy.impl_witness.992: = impl_witness imports.%Copy.impl_witness_table.159, @const.as.Copy.impl(%Copy.facet.7cf) [concrete] +// CHECK:STDOUT: %Copy.facet.afb: %Copy.type = facet_value %const.660, (%Copy.impl_witness.992) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -1928,6 +1933,10 @@ fn F() { // CHECK:STDOUT: } // CHECK:STDOUT: %Core.import_ref.52c: @Core.IntLiteral.as.As.impl.%Core.IntLiteral.as.As.impl.Convert.type (%Core.IntLiteral.as.As.impl.Convert.type.676) = import_ref Core//prelude/types/int, loc36_39, loaded [symbolic = @Core.IntLiteral.as.As.impl.%Core.IntLiteral.as.As.impl.Convert (constants.%Core.IntLiteral.as.As.impl.Convert.086)] // CHECK:STDOUT: %As.impl_witness_table.3fe = impl_witness_table (%Core.import_ref.52c), @Core.IntLiteral.as.As.impl [concrete] +// CHECK:STDOUT: %Core.import_ref.ce8 = import_ref Core//prelude/copy, loc19_31, unloaded +// CHECK:STDOUT: %Copy.impl_witness_table.159 = impl_witness_table (%Core.import_ref.ce8), @const.as.Copy.impl [concrete] +// CHECK:STDOUT: %Core.import_ref.46d = import_ref Core//prelude/types/int, loc21_31, unloaded +// CHECK:STDOUT: %Copy.impl_witness_table.000 = impl_witness_table (%Core.import_ref.46d), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() { @@ -1944,8 +1953,14 @@ fn F() { // CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.call: init %i16 = call %bound_method.loc16_13.2(%int_1) [concrete = constants.%int_1.f90] // CHECK:STDOUT: %.loc16_13.1: %i16 = value_of_initializer %Core.IntLiteral.as.As.impl.Convert.call [concrete = constants.%int_1.f90] // CHECK:STDOUT: %.loc16_13.2: %i16 = converted %int_1, %.loc16_13.1 [concrete = constants.%int_1.f90] -// CHECK:STDOUT: %.loc16_13.3: %const = converted %.loc16_13.2, [concrete = ] -// CHECK:STDOUT: %addr: %ptr = addr_of [concrete = ] +// CHECK:STDOUT: %Copy.facet.loc16_13.1: %Copy.type = facet_value constants.%i16, (constants.%Copy.impl_witness.22b) [concrete = constants.%Copy.facet.7cf] +// CHECK:STDOUT: %.loc16_13.3: %Copy.type = converted constants.%i16, %Copy.facet.loc16_13.1 [concrete = constants.%Copy.facet.7cf] +// CHECK:STDOUT: %Copy.facet.loc16_13.2: %Copy.type = facet_value constants.%const.660, (constants.%Copy.impl_witness.992) [concrete = constants.%Copy.facet.afb] +// CHECK:STDOUT: %.loc16_13.4: %Copy.type = converted constants.%const.660, %Copy.facet.loc16_13.2 [concrete = constants.%Copy.facet.afb] +// CHECK:STDOUT: %Copy.facet.loc16_13.3: %Copy.type = facet_value constants.%i16, (constants.%Copy.impl_witness.22b) [concrete = constants.%Copy.facet.7cf] +// CHECK:STDOUT: %.loc16_13.5: %Copy.type = converted constants.%i16, %Copy.facet.loc16_13.3 [concrete = constants.%Copy.facet.7cf] +// CHECK:STDOUT: %.loc16_13.6: %const.660 = converted %.loc16_13.2, [concrete = ] +// CHECK:STDOUT: %addr: %ptr.758 = addr_of [concrete = ] // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: // CHECK:STDOUT: } diff --git a/toolchain/check/testdata/interop/cpp/function/pointer.carbon b/toolchain/check/testdata/interop/cpp/function/pointer.carbon index 0b8d7f12b9fd..c773573b9f3d 100644 --- a/toolchain/check/testdata/interop/cpp/function/pointer.carbon +++ b/toolchain/check/testdata/interop/cpp/function/pointer.carbon @@ -282,7 +282,7 @@ fn F() { // CHECK:STDOUT: import Cpp//... // CHECK:STDOUT: } // CHECK:STDOUT: %S.decl: type = class_decl @S [concrete = constants.%S] {} {} -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: %foo.decl: %foo.type = fn_decl @foo [concrete = constants.%foo] { // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/typedef.carbon b/toolchain/check/testdata/interop/cpp/typedef.carbon index 3ad1fe3fb60d..d2114eb13e58 100644 --- a/toolchain/check/testdata/interop/cpp/typedef.carbon +++ b/toolchain/check/testdata/interop/cpp/typedef.carbon @@ -99,7 +99,7 @@ fn H(var c: Cpp.C, var d: Cpp.D) { // CHECK:STDOUT: } // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -187,7 +187,7 @@ fn H(var c: Cpp.C, var d: Cpp.D) { // CHECK:STDOUT: import Cpp//... // CHECK:STDOUT: } // CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/let/compile_time_bindings.carbon b/toolchain/check/testdata/let/compile_time_bindings.carbon index b419eeb73c4d..3b85937fe6f6 100644 --- a/toolchain/check/testdata/let/compile_time_bindings.carbon +++ b/toolchain/check/testdata/let/compile_time_bindings.carbon @@ -254,7 +254,9 @@ impl i32 as Empty { // CHECK:STDOUT: fn @C.F() -> %empty_tuple.type { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %x.ref: %empty_tuple.type = name_ref x, @C.%x -// CHECK:STDOUT: return %x.ref +// CHECK:STDOUT: %.loc5_25: init %empty_tuple.type = tuple_init () to %return [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc5_26: init %empty_tuple.type = converted %x.ref, %.loc5_25 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc5_26 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.Destroy.impl.Op(%self.param: %ptr.019) = "no_op"; @@ -353,7 +355,9 @@ impl i32 as Empty { // CHECK:STDOUT: fn @C.F() -> %empty_tuple.type { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %x.ref: %empty_tuple.type = name_ref x, @C.%x -// CHECK:STDOUT: return %x.ref +// CHECK:STDOUT: %.loc10_25: init %empty_tuple.type = tuple_init () to %return [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc10_26: init %empty_tuple.type = converted %x.ref, %.loc10_25 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc10_26 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.Destroy.impl.Op(%self.param: %ptr.019) = "no_op"; @@ -682,6 +686,7 @@ impl i32 as Empty { // CHECK:STDOUT: %C.as.Destroy.impl.Op: %C.as.Destroy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] // CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -747,7 +752,9 @@ impl i32 as Empty { // CHECK:STDOUT: fn @C.F() -> %empty_tuple.type { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %x.ref: %empty_tuple.type = name_ref x, .inst35.loc14_7 -// CHECK:STDOUT: return %x.ref +// CHECK:STDOUT: %.loc5_25: init %empty_tuple.type = tuple_init () to %return [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc5_26: init %empty_tuple.type = converted %x.ref, %.loc5_25 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc5_26 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.Destroy.impl.Op(%self.param: %ptr.019) = "no_op"; @@ -758,6 +765,7 @@ impl i32 as Empty { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] @@ -780,14 +788,27 @@ impl i32 as Empty { // CHECK:STDOUT: %.7ea: type = fn_type_with_self_type %ImplicitAs.Convert.type.1b6, %ImplicitAs.facet [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.bound: = bound_method %int_0.5c6, %Core.IntLiteral.as.ImplicitAs.impl.Convert.592 [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.592, @Core.IntLiteral.as.ImplicitAs.impl.Convert(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_0.5c6, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] +// CHECK:STDOUT: %bound_method.698: = bound_method %int_0.5c6, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %int_0.6a9: %i32 = int_value 0 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.bound: = bound_method %Zero, %Int.as.Copy.impl.Op.87e [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] +// CHECK:STDOUT: %bound_method.d93: = bound_method %Zero, %Int.as.Copy.impl.Op.specific_fn [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } @@ -795,6 +816,9 @@ impl i32 as Empty { // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -825,16 +849,21 @@ impl i32 as Empty { // CHECK:STDOUT: %int_32.loc5: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] // CHECK:STDOUT: %i32.loc5: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: } -// CHECK:STDOUT: %impl.elem0: %.7ea = impl_witness_access constants.%ImplicitAs.impl_witness.acc, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.592] -// CHECK:STDOUT: %bound_method.loc5_20.1: = bound_method %int_0, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc5_20.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method] +// CHECK:STDOUT: %impl.elem0.loc5: %.7ea = impl_witness_access constants.%ImplicitAs.impl_witness.acc, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.592] +// CHECK:STDOUT: %bound_method.loc5_20.1: = bound_method %int_0, %impl.elem0.loc5 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] +// CHECK:STDOUT: %specific_fn.loc5: = specific_function %impl.elem0.loc5, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] +// CHECK:STDOUT: %bound_method.loc5_20.2: = bound_method %int_0, %specific_fn.loc5 [concrete = constants.%bound_method.698] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc5_20.2(%int_0) [concrete = constants.%int_0.6a9] // CHECK:STDOUT: %.loc5_20.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] // CHECK:STDOUT: %.loc5_20.2: %i32 = converted %int_0, %.loc5_20.1 [concrete = constants.%int_0.6a9] // CHECK:STDOUT: %Zero: %i32 = bind_symbolic_name Zero, 0, %.loc5_20.2 [symbolic = constants.%Zero] // CHECK:STDOUT: %Zero.ref: %i32 = name_ref Zero, %Zero [symbolic = constants.%Zero] -// CHECK:STDOUT: return %Zero.ref +// CHECK:STDOUT: %impl.elem0.loc6: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc6_10.1: = bound_method %Zero.ref, %impl.elem0.loc6 [symbolic = constants.%Int.as.Copy.impl.Op.bound] +// CHECK:STDOUT: %specific_fn.loc6: = specific_function %impl.elem0.loc6, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc6_10.2: = bound_method %Zero.ref, %specific_fn.loc6 [symbolic = constants.%bound_method.d93] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc6_10.2(%Zero.ref) [symbolic = constants.%Zero] +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_in_block.carbon @@ -843,6 +872,7 @@ impl i32 as Empty { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] @@ -868,6 +898,18 @@ impl i32 as Empty { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.592, @Core.IntLiteral.as.ImplicitAs.impl.Convert(%int_32) [concrete] // CHECK:STDOUT: %bound_method.698: = bound_method %int_0.5c6, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %int_0.6a9: %i32 = int_value 0 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.bound: = bound_method %Zero, %Int.as.Copy.impl.Op.87e [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] +// CHECK:STDOUT: %bound_method.d93: = bound_method %Zero, %Int.as.Copy.impl.Op.specific_fn [symbolic] // CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.bound.a02: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.592 [concrete] // CHECK:STDOUT: %bound_method.b59: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] @@ -878,6 +920,7 @@ impl i32 as Empty { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } @@ -885,6 +928,9 @@ impl i32 as Empty { // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -928,7 +974,12 @@ impl i32 as Empty { // CHECK:STDOUT: %.loc6_22.2: %i32 = converted %int_0, %.loc6_22.1 [concrete = constants.%int_0.6a9] // CHECK:STDOUT: %Zero: %i32 = bind_symbolic_name Zero, 0, %.loc6_22.2 [symbolic = constants.%Zero] // CHECK:STDOUT: %Zero.ref: %i32 = name_ref Zero, %Zero [symbolic = constants.%Zero] -// CHECK:STDOUT: return %Zero.ref +// CHECK:STDOUT: %impl.elem0.loc7: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc7_12.1: = bound_method %Zero.ref, %impl.elem0.loc7 [symbolic = constants.%Int.as.Copy.impl.Op.bound] +// CHECK:STDOUT: %specific_fn.loc7: = specific_function %impl.elem0.loc7, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc7_12.2: = bound_method %Zero.ref, %specific_fn.loc7 [symbolic = constants.%bound_method.d93] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc7_12.2(%Zero.ref) [symbolic = constants.%Zero] +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: // CHECK:STDOUT: !if.else: // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] @@ -937,9 +988,8 @@ impl i32 as Empty { // CHECK:STDOUT: %specific_fn.loc9: = specific_function %impl.elem0.loc9, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc9_11.2: = bound_method %int_1, %specific_fn.loc9 [concrete = constants.%bound_method.b59] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc9: init %i32 = call %bound_method.loc9_11.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc9_11.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc9 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc9_11.2: %i32 = converted %int_1, %.loc9_11.1 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: return %.loc9_11.2 +// CHECK:STDOUT: %.loc9: init %i32 = converted %int_1, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc9 [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: return %.loc9 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- return_in_interface.carbon diff --git a/toolchain/check/testdata/let/fail_generic.carbon b/toolchain/check/testdata/let/fail_generic.carbon index 09d58af4b7dc..da5a5d732208 100644 --- a/toolchain/check/testdata/let/fail_generic.carbon +++ b/toolchain/check/testdata/let/fail_generic.carbon @@ -121,6 +121,6 @@ fn F(a: i32) -> i32 { // CHECK:STDOUT: %x: %T = bind_name x, [concrete = ] // CHECK:STDOUT: %x.ref: %T = name_ref x, %x [concrete = ] // CHECK:STDOUT: %.loc33: %i32 = converted %x.ref, [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/let/global.carbon b/toolchain/check/testdata/let/global.carbon index ec210887b6d5..f9ff9006db93 100644 --- a/toolchain/check/testdata/let/global.carbon +++ b/toolchain/check/testdata/let/global.carbon @@ -22,6 +22,7 @@ fn F() -> i32 { return n; } // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] @@ -43,12 +44,23 @@ fn F() -> i32 { return n; } // CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [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] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } @@ -56,6 +68,9 @@ fn F() -> i32 { return n; } // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -94,7 +109,12 @@ fn F() -> i32 { return n; } // CHECK:STDOUT: fn @F() -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %n.ref: %i32 = name_ref n, file.%n -// CHECK:STDOUT: return %n.ref +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc17_24.1: = bound_method %n.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc17_24.2: = bound_method %n.ref, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc17_24.2(%n.ref) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/let/local.carbon b/toolchain/check/testdata/let/local.carbon index 1b67670de37a..01f813ef8c35 100644 --- a/toolchain/check/testdata/let/local.carbon +++ b/toolchain/check/testdata/let/local.carbon @@ -23,19 +23,34 @@ fn F(a: i32) -> i32 { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [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] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -75,6 +90,11 @@ fn F(a: i32) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: %b: %i32 = bind_name b, %a.ref // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b -// CHECK:STDOUT: return %b.ref +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc17_10.1: = bound_method %b.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc17_10.2: = bound_method %b.ref, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc17_10.2(%b.ref) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/let/shadowed_decl.carbon b/toolchain/check/testdata/let/shadowed_decl.carbon index 526fe5ae62bc..4f8000fe77bb 100644 --- a/toolchain/check/testdata/let/shadowed_decl.carbon +++ b/toolchain/check/testdata/let/shadowed_decl.carbon @@ -24,6 +24,7 @@ fn F(a: i32) -> i32 { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] @@ -45,12 +46,23 @@ fn F(a: i32) -> i32 { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.592, @Core.IntLiteral.as.ImplicitAs.impl.Convert(%int_32) [concrete] // CHECK:STDOUT: %bound_method: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } @@ -58,6 +70,9 @@ fn F(a: i32) -> i32 { // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -95,15 +110,20 @@ fn F(a: i32) -> i32 { // CHECK:STDOUT: %int_32.loc16: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] // CHECK:STDOUT: %i32.loc16: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: } -// CHECK:STDOUT: %impl.elem0: %.7ea = impl_witness_access constants.%ImplicitAs.impl_witness.acc, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.592] -// CHECK:STDOUT: %bound_method.loc16_16.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc16_16.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] +// CHECK:STDOUT: %impl.elem0.loc16: %.7ea = impl_witness_access constants.%ImplicitAs.impl_witness.acc, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.592] +// CHECK:STDOUT: %bound_method.loc16_16.1: = bound_method %int_1, %impl.elem0.loc16 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] +// CHECK:STDOUT: %specific_fn.loc16: = specific_function %impl.elem0.loc16, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] +// CHECK:STDOUT: %bound_method.loc16_16.2: = bound_method %int_1, %specific_fn.loc16 [concrete = constants.%bound_method] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc16_16.2(%int_1) [concrete = constants.%int_1.5d2] // CHECK:STDOUT: %.loc16_16.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5d2] // CHECK:STDOUT: %.loc16_16.2: %i32 = converted %int_1, %.loc16_16.1 [concrete = constants.%int_1.5d2] // CHECK:STDOUT: %a.loc16: %i32 = bind_name a, %.loc16_16.2 // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a.loc16 -// CHECK:STDOUT: return %a.ref +// CHECK:STDOUT: %impl.elem0.loc18: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc18_10.1: = bound_method %a.ref, %impl.elem0.loc18 +// CHECK:STDOUT: %specific_fn.loc18: = specific_function %impl.elem0.loc18, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc18_10.2: = bound_method %a.ref, %specific_fn.loc18 +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc18_10.2(%a.ref) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/main_run/return_i32.carbon b/toolchain/check/testdata/main_run/return_i32.carbon index 397c9c71b073..478dce06dee3 100644 --- a/toolchain/check/testdata/main_run/return_i32.carbon +++ b/toolchain/check/testdata/main_run/return_i32.carbon @@ -82,8 +82,7 @@ fn Run() -> i32 { return 0; } // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc14_27.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc14_27.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc14_27.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc14_27.2: %i32 = converted %int_0, %.loc14_27.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: return %.loc14_27.2 +// CHECK:STDOUT: %.loc14: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] +// CHECK:STDOUT: return %.loc14 to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/namespace/add_to_import.carbon b/toolchain/check/testdata/namespace/add_to_import.carbon index 751cc0ea0f9d..2fa5829ed249 100644 --- a/toolchain/check/testdata/namespace/add_to_import.carbon +++ b/toolchain/check/testdata/namespace/add_to_import.carbon @@ -128,9 +128,8 @@ var a: i32 = NS.A(); // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc4_28.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc4_28.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc4_28.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc4_28.2: %i32 = converted %int_0, %.loc4_28.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: return %.loc4_28.2 +// CHECK:STDOUT: %.loc4: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] +// CHECK:STDOUT: return %.loc4 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/namespace/alias.carbon b/toolchain/check/testdata/namespace/alias.carbon index d468f92dbfe9..6af9b211d93c 100644 --- a/toolchain/check/testdata/namespace/alias.carbon +++ b/toolchain/check/testdata/namespace/alias.carbon @@ -125,9 +125,8 @@ fn D() -> i32 { return C(); } // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc19_28.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc19_28.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc19_28.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc19_28.2: %i32 = converted %int_0, %.loc19_28.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: return %.loc19_28.2 +// CHECK:STDOUT: %.loc19: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] +// CHECK:STDOUT: return %.loc19 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B() -> %i32 { @@ -135,17 +134,13 @@ fn D() -> i32 { return C(); } // CHECK:STDOUT: %ns.ref: = name_ref ns, file.%ns [concrete = file.%NS] // CHECK:STDOUT: %A.ref: %A.type = name_ref A, file.%A.decl [concrete = constants.%A] // CHECK:STDOUT: %A.call: init %i32 = call %A.ref() -// CHECK:STDOUT: %.loc21_30.1: %i32 = value_of_initializer %A.call -// CHECK:STDOUT: %.loc21_30.2: %i32 = converted %A.call, %.loc21_30.1 -// CHECK:STDOUT: return %.loc21_30.2 +// CHECK:STDOUT: return %A.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @D() -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %C.ref: %A.type = name_ref C, file.%C [concrete = constants.%A] // CHECK:STDOUT: %A.call: init %i32 = call %C.ref() -// CHECK:STDOUT: %.loc25_27.1: %i32 = value_of_initializer %A.call -// CHECK:STDOUT: %.loc25_27.2: %i32 = converted %A.call, %.loc25_27.1 -// CHECK:STDOUT: return %.loc25_27.2 +// CHECK:STDOUT: return %A.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/namespace/fail_decl_in_alias.carbon b/toolchain/check/testdata/namespace/fail_decl_in_alias.carbon index 437884ddaf36..f51b781338b3 100644 --- a/toolchain/check/testdata/namespace/fail_decl_in_alias.carbon +++ b/toolchain/check/testdata/namespace/fail_decl_in_alias.carbon @@ -97,8 +97,7 @@ fn ns.A() -> i32 { return 0; } // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc27_28.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc27_28.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc27_28.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc27_28.2: %i32 = converted %int_0, %.loc27_28.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: return %.loc27_28.2 +// CHECK:STDOUT: %.loc27: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] +// CHECK:STDOUT: return %.loc27 to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/namespace/shadow.carbon b/toolchain/check/testdata/namespace/shadow.carbon index 4fd78e8d18e0..aa051fb03453 100644 --- a/toolchain/check/testdata/namespace/shadow.carbon +++ b/toolchain/check/testdata/namespace/shadow.carbon @@ -42,6 +42,7 @@ fn N.M.B() -> i32 { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %B.type: type = fn_type @B [concrete] @@ -64,6 +65,16 @@ fn N.M.B() -> i32 { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.592, @Core.IntLiteral.as.ImplicitAs.impl.Convert(%int_32) [concrete] // CHECK:STDOUT: %bound_method: = bound_method %int_0.5c6, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %int_0.6a9: %i32 = int_value 0 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %Int.as.Destroy.impl.Op.type.11b: type = fn_type @Int.as.Destroy.impl.Op, @Int.as.Destroy.impl(%int_32) [concrete] // CHECK:STDOUT: %Int.as.Destroy.impl.Op.054: %Int.as.Destroy.impl.Op.type.11b = struct_value () [concrete] @@ -75,6 +86,7 @@ fn N.M.B() -> i32 { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... @@ -83,6 +95,9 @@ fn N.M.B() -> i32 { // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -146,12 +161,17 @@ fn N.M.B() -> i32 { // CHECK:STDOUT: %A: ref %i32 = bind_name A, %A.var // CHECK:STDOUT: %A.ref.loc29: ref %i32 = name_ref A, %A // CHECK:STDOUT: %.loc29: %i32 = bind_value %A.ref.loc29 +// CHECK:STDOUT: %impl.elem0.loc29: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc29_12.1: = bound_method %.loc29, %impl.elem0.loc29 +// CHECK:STDOUT: %specific_fn.loc29: = specific_function %impl.elem0.loc29, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc29_12.2: = bound_method %.loc29, %specific_fn.loc29 +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc29_12.2(%.loc29) // CHECK:STDOUT: %Int.as.Destroy.impl.Op.bound.loc26_5.1: = bound_method %A.var, constants.%Int.as.Destroy.impl.Op.054 // CHECK:STDOUT: %Int.as.Destroy.impl.Op.specific_fn.1: = specific_function constants.%Int.as.Destroy.impl.Op.054, @Int.as.Destroy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Destroy.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc26_5.3: = bound_method %A.var, %Int.as.Destroy.impl.Op.specific_fn.1 // CHECK:STDOUT: %addr.loc26_5.1: %ptr.235 = addr_of %A.var // CHECK:STDOUT: %Int.as.Destroy.impl.Op.call.loc26_5.1: init %empty_tuple.type = call %bound_method.loc26_5.3(%addr.loc26_5.1) -// CHECK:STDOUT: return %.loc29 +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: // CHECK:STDOUT: !if.else: // CHECK:STDOUT: %int_0.loc31: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6] @@ -160,13 +180,12 @@ fn N.M.B() -> i32 { // CHECK:STDOUT: %specific_fn.loc31: = specific_function %impl.elem0.loc31, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc31_11.2: = bound_method %int_0.loc31, %specific_fn.loc31 [concrete = constants.%bound_method] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc31: init %i32 = call %bound_method.loc31_11.2(%int_0.loc31) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc31_11.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc31 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc31_11.2: %i32 = converted %int_0.loc31, %.loc31_11.1 [concrete = constants.%int_0.6a9] +// CHECK:STDOUT: %.loc31: init %i32 = converted %int_0.loc31, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc31 [concrete = constants.%int_0.6a9] // CHECK:STDOUT: %Int.as.Destroy.impl.Op.bound.loc26_5.2: = bound_method %A.var, constants.%Int.as.Destroy.impl.Op.054 // CHECK:STDOUT: %Int.as.Destroy.impl.Op.specific_fn.2: = specific_function constants.%Int.as.Destroy.impl.Op.054, @Int.as.Destroy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Destroy.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc26_5.4: = bound_method %A.var, %Int.as.Destroy.impl.Op.specific_fn.2 // CHECK:STDOUT: %addr.loc26_5.2: %ptr.235 = addr_of %A.var // CHECK:STDOUT: %Int.as.Destroy.impl.Op.call.loc26_5.2: init %empty_tuple.type = call %bound_method.loc26_5.4(%addr.loc26_5.2) -// CHECK:STDOUT: return %.loc31_11.2 +// CHECK:STDOUT: return %.loc31 to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/builtin/and.carbon b/toolchain/check/testdata/operators/builtin/and.carbon index 9f31058b2f0e..9f45cb680d91 100644 --- a/toolchain/check/testdata/operators/builtin/and.carbon +++ b/toolchain/check/testdata/operators/builtin/and.carbon @@ -40,13 +40,6 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %true: bool = bool_literal true [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %And.type: type = fn_type @And [concrete] -// CHECK:STDOUT: %And: %And.type = struct_value () [concrete] -// CHECK:STDOUT: %false: bool = bool_literal false [concrete] -// CHECK:STDOUT: %Constant.type: type = fn_type @Constant [concrete] -// CHECK:STDOUT: %Constant: %Constant.type = struct_value () [concrete] // CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] // CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] // CHECK:STDOUT: %Copy.impl_witness.09f: = impl_witness imports.%Copy.impl_witness_table.47e [concrete] @@ -55,6 +48,13 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: %bool.as.Copy.impl.Op.type: type = fn_type @bool.as.Copy.impl.Op [concrete] // CHECK:STDOUT: %bool.as.Copy.impl.Op: %bool.as.Copy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: %bool.as.Copy.impl.Op.bound: = bound_method %true, %bool.as.Copy.impl.Op [concrete] +// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] +// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] +// CHECK:STDOUT: %And.type: type = fn_type @And [concrete] +// CHECK:STDOUT: %And: %And.type = struct_value () [concrete] +// CHECK:STDOUT: %false: bool = bool_literal false [concrete] +// CHECK:STDOUT: %Constant.type: type = fn_type @Constant [concrete] +// CHECK:STDOUT: %Constant: %Constant.type = struct_value () [concrete] // CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] // CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] @@ -80,7 +80,7 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Bool: %Bool.type = import_ref Core//prelude/parts/bool, Bool, loaded [concrete = constants.%Bool] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.297: %bool.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc16_31, loaded [concrete = constants.%bool.as.Copy.impl.Op] +// CHECK:STDOUT: %Core.import_ref.297: %bool.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc20_31, loaded [concrete = constants.%bool.as.Copy.impl.Op] // CHECK:STDOUT: %Copy.impl_witness_table.47e = impl_witness_table (%Core.import_ref.297), @bool.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } @@ -143,13 +143,19 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: fn @F() -> bool { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %true: bool = bool_literal true [concrete = constants.%true] -// CHECK:STDOUT: return %true +// CHECK:STDOUT: %impl.elem0: %.235 = impl_witness_access constants.%Copy.impl_witness.09f, element0 [concrete = constants.%bool.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %true, %impl.elem0 [concrete = constants.%bool.as.Copy.impl.Op.bound] +// CHECK:STDOUT: %bool.as.Copy.impl.Op.call: init bool = call %bound_method(%true) [concrete = constants.%true] +// CHECK:STDOUT: return %bool.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G() -> bool { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %true: bool = bool_literal true [concrete = constants.%true] -// CHECK:STDOUT: return %true +// CHECK:STDOUT: %impl.elem0: %.235 = impl_witness_access constants.%Copy.impl_witness.09f, element0 [concrete = constants.%bool.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %true, %impl.elem0 [concrete = constants.%bool.as.Copy.impl.Op.bound] +// CHECK:STDOUT: %bool.as.Copy.impl.Op.call: init bool = call %bound_method(%true) [concrete = constants.%true] +// CHECK:STDOUT: return %bool.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @And() -> bool { @@ -170,7 +176,10 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: // CHECK:STDOUT: !and.result: // CHECK:STDOUT: %.loc19_14.5: bool = block_arg !and.result -// CHECK:STDOUT: return %.loc19_14.5 +// CHECK:STDOUT: %impl.elem0: %.235 = impl_witness_access constants.%Copy.impl_witness.09f, element0 [concrete = constants.%bool.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %.loc19_14.5, %impl.elem0 +// CHECK:STDOUT: %bool.as.Copy.impl.Op.call: init bool = call %bound_method(%.loc19_14.5) +// CHECK:STDOUT: return %bool.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Constant() { diff --git a/toolchain/check/testdata/operators/builtin/assignment.carbon b/toolchain/check/testdata/operators/builtin/assignment.carbon index c7f20d1cb350..9899ca29059d 100644 --- a/toolchain/check/testdata/operators/builtin/assignment.carbon +++ b/toolchain/check/testdata/operators/builtin/assignment.carbon @@ -142,7 +142,7 @@ fn Main() { // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } diff --git a/toolchain/check/testdata/operators/builtin/fail_and_or_not_in_function.carbon b/toolchain/check/testdata/operators/builtin/fail_and_or_not_in_function.carbon index 99bbb81605f3..3ac594be3d0e 100644 --- a/toolchain/check/testdata/operators/builtin/fail_and_or_not_in_function.carbon +++ b/toolchain/check/testdata/operators/builtin/fail_and_or_not_in_function.carbon @@ -94,6 +94,13 @@ fn F() { // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %int_64: Core.IntLiteral = int_value 64 [concrete] // CHECK:STDOUT: %f64: type = class_type @Float, @Float(%int_64) [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.impl_witness.fde: = impl_witness .inst350 [concrete] +// CHECK:STDOUT: %Copy.facet.0af: %Copy.type = facet_value type, (%Copy.impl_witness.fde) [concrete] +// CHECK:STDOUT: %.130: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.0af [concrete] +// CHECK:STDOUT: %type.as.Copy.impl.Op.type: type = fn_type @type.as.Copy.impl.Op [concrete] +// CHECK:STDOUT: %type.as.Copy.impl.Op: %type.as.Copy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F(%b.param: bool) -> type { @@ -113,7 +120,10 @@ fn F() { // CHECK:STDOUT: // CHECK:STDOUT: !if.expr.result: // CHECK:STDOUT: %.loc6: type = block_arg !if.expr.result -// CHECK:STDOUT: return %.loc6 +// CHECK:STDOUT: %impl.elem0: %.130 = impl_witness_access constants.%Copy.impl_witness.fde, element0 [concrete = constants.%type.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %.loc6, %impl.elem0 +// CHECK:STDOUT: %type.as.Copy.impl.Op.call: init type = call %bound_method(%.loc6) +// CHECK:STDOUT: return %type.as.Copy.impl.Op.call to .inst36.loc5_15 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_and_val.carbon @@ -128,6 +138,13 @@ fn F() { // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %int_64: Core.IntLiteral = int_value 64 [concrete] // CHECK:STDOUT: %f64: type = class_type @Float, @Float(%int_64) [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.impl_witness.fde: = impl_witness .inst350 [concrete] +// CHECK:STDOUT: %Copy.facet.0af: %Copy.type = facet_value type, (%Copy.impl_witness.fde) [concrete] +// CHECK:STDOUT: %.130: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.0af [concrete] +// CHECK:STDOUT: %type.as.Copy.impl.Op.type: type = fn_type @type.as.Copy.impl.Op [concrete] +// CHECK:STDOUT: %type.as.Copy.impl.Op: %type.as.Copy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F(%b.param: bool) -> type { @@ -147,7 +164,10 @@ fn F() { // CHECK:STDOUT: // CHECK:STDOUT: !if.expr.result: // CHECK:STDOUT: %.loc6: type = block_arg !if.expr.result -// CHECK:STDOUT: return %.loc6 +// CHECK:STDOUT: %impl.elem0: %.130 = impl_witness_access constants.%Copy.impl_witness.fde, element0 [concrete = constants.%type.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %.loc6, %impl.elem0 +// CHECK:STDOUT: %type.as.Copy.impl.Op.call: init type = call %bound_method(%.loc6) +// CHECK:STDOUT: return %type.as.Copy.impl.Op.call to .inst36.loc5_15 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_or_val.carbon diff --git a/toolchain/check/testdata/operators/builtin/fail_assignment_to_non_assignable.carbon b/toolchain/check/testdata/operators/builtin/fail_assignment_to_non_assignable.carbon index 35fc6ab01c19..5aff78fa50d3 100644 --- a/toolchain/check/testdata/operators/builtin/fail_assignment_to_non_assignable.carbon +++ b/toolchain/check/testdata/operators/builtin/fail_assignment_to_non_assignable.carbon @@ -151,12 +151,12 @@ fn Main() { // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.cac: %Core.IntLiteral.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc28_31, loaded [concrete = constants.%Core.IntLiteral.as.Copy.impl.Op] +// CHECK:STDOUT: %Core.import_ref.cac: %Core.IntLiteral.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc32_31, loaded [concrete = constants.%Core.IntLiteral.as.Copy.impl.Op] // CHECK:STDOUT: %Copy.impl_witness_table.529 = impl_witness_table (%Core.import_ref.cac), @Core.IntLiteral.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] -// CHECK:STDOUT: %Core.import_ref.7bd: %type.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc36_31, loaded [concrete = constants.%type.as.Copy.impl.Op] +// CHECK:STDOUT: %Core.import_ref.7bd: %type.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc40_31, loaded [concrete = constants.%type.as.Copy.impl.Op] // CHECK:STDOUT: %Copy.impl_witness_table.095 = impl_witness_table (%Core.import_ref.7bd), @type.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } diff --git a/toolchain/check/testdata/operators/builtin/fail_redundant_compound_access.carbon b/toolchain/check/testdata/operators/builtin/fail_redundant_compound_access.carbon index ac214d4e1771..9f18d12785f6 100644 --- a/toolchain/check/testdata/operators/builtin/fail_redundant_compound_access.carbon +++ b/toolchain/check/testdata/operators/builtin/fail_redundant_compound_access.carbon @@ -126,9 +126,8 @@ fn Main() { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc15_25.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method.698] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc15_25.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc15_25.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc15_25.2: %i32 = converted %int_0, %.loc15_25.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: return %.loc15_25.2 +// CHECK:STDOUT: %.loc15: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] +// CHECK:STDOUT: return %.loc15 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() { diff --git a/toolchain/check/testdata/operators/builtin/fail_type_mismatch_once.carbon b/toolchain/check/testdata/operators/builtin/fail_type_mismatch_once.carbon index b1bcdb7b5379..e1f861cc16cf 100644 --- a/toolchain/check/testdata/operators/builtin/fail_type_mismatch_once.carbon +++ b/toolchain/check/testdata/operators/builtin/fail_type_mismatch_once.carbon @@ -73,6 +73,6 @@ fn Main() -> i32 { // CHECK:STDOUT: %float: Core.FloatLiteral = float_literal_value 34e-1 [concrete = constants.%float] // CHECK:STDOUT: %int_12: Core.IntLiteral = int_value 12 [concrete = constants.%int_12] // CHECK:STDOUT: %impl.elem1: = impl_witness_access , element1 [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/builtin/fail_unimplemented_op.carbon b/toolchain/check/testdata/operators/builtin/fail_unimplemented_op.carbon index 0ed2209ec42e..3167545d6e3f 100644 --- a/toolchain/check/testdata/operators/builtin/fail_unimplemented_op.carbon +++ b/toolchain/check/testdata/operators/builtin/fail_unimplemented_op.carbon @@ -68,6 +68,6 @@ fn Main() -> i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %.loc20: %empty_struct_type = struct_literal () // CHECK:STDOUT: %int_34: Core.IntLiteral = int_value 34 [concrete = constants.%int_34] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/builtin/or.carbon b/toolchain/check/testdata/operators/builtin/or.carbon index e33c79682453..acd5994f4faa 100644 --- a/toolchain/check/testdata/operators/builtin/or.carbon +++ b/toolchain/check/testdata/operators/builtin/or.carbon @@ -40,13 +40,6 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %true: bool = bool_literal true [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %Or.type: type = fn_type @Or [concrete] -// CHECK:STDOUT: %Or: %Or.type = struct_value () [concrete] -// CHECK:STDOUT: %Constant.type: type = fn_type @Constant [concrete] -// CHECK:STDOUT: %Constant: %Constant.type = struct_value () [concrete] -// CHECK:STDOUT: %false: bool = bool_literal false [concrete] // CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] // CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] // CHECK:STDOUT: %Copy.impl_witness.09f: = impl_witness imports.%Copy.impl_witness_table.47e [concrete] @@ -55,6 +48,13 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: %bool.as.Copy.impl.Op.type: type = fn_type @bool.as.Copy.impl.Op [concrete] // CHECK:STDOUT: %bool.as.Copy.impl.Op: %bool.as.Copy.impl.Op.type = struct_value () [concrete] // CHECK:STDOUT: %bool.as.Copy.impl.Op.bound: = bound_method %true, %bool.as.Copy.impl.Op [concrete] +// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] +// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] +// CHECK:STDOUT: %Or.type: type = fn_type @Or [concrete] +// CHECK:STDOUT: %Or: %Or.type = struct_value () [concrete] +// CHECK:STDOUT: %Constant.type: type = fn_type @Constant [concrete] +// CHECK:STDOUT: %Constant: %Constant.type = struct_value () [concrete] +// CHECK:STDOUT: %false: bool = bool_literal false [concrete] // CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] // CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] @@ -80,7 +80,7 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Bool: %Bool.type = import_ref Core//prelude/parts/bool, Bool, loaded [concrete = constants.%Bool] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.297: %bool.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc16_31, loaded [concrete = constants.%bool.as.Copy.impl.Op] +// CHECK:STDOUT: %Core.import_ref.297: %bool.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc20_31, loaded [concrete = constants.%bool.as.Copy.impl.Op] // CHECK:STDOUT: %Copy.impl_witness_table.47e = impl_witness_table (%Core.import_ref.297), @bool.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } @@ -143,13 +143,19 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: fn @F() -> bool { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %true: bool = bool_literal true [concrete = constants.%true] -// CHECK:STDOUT: return %true +// CHECK:STDOUT: %impl.elem0: %.235 = impl_witness_access constants.%Copy.impl_witness.09f, element0 [concrete = constants.%bool.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %true, %impl.elem0 [concrete = constants.%bool.as.Copy.impl.Op.bound] +// CHECK:STDOUT: %bool.as.Copy.impl.Op.call: init bool = call %bound_method(%true) [concrete = constants.%true] +// CHECK:STDOUT: return %bool.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G() -> bool { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %true: bool = bool_literal true [concrete = constants.%true] -// CHECK:STDOUT: return %true +// CHECK:STDOUT: %impl.elem0: %.235 = impl_witness_access constants.%Copy.impl_witness.09f, element0 [concrete = constants.%bool.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %true, %impl.elem0 [concrete = constants.%bool.as.Copy.impl.Op.bound] +// CHECK:STDOUT: %bool.as.Copy.impl.Op.call: init bool = call %bound_method(%true) [concrete = constants.%true] +// CHECK:STDOUT: return %bool.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Or() -> bool { @@ -171,7 +177,10 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: // CHECK:STDOUT: !or.result: // CHECK:STDOUT: %.loc19_14.6: bool = block_arg !or.result -// CHECK:STDOUT: return %.loc19_14.6 +// CHECK:STDOUT: %impl.elem0: %.235 = impl_witness_access constants.%Copy.impl_witness.09f, element0 [concrete = constants.%bool.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %.loc19_14.6, %impl.elem0 +// CHECK:STDOUT: %bool.as.Copy.impl.Op.call: init bool = call %bound_method(%.loc19_14.6) +// CHECK:STDOUT: return %bool.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Constant() { diff --git a/toolchain/check/testdata/operators/builtin/unary_op.carbon b/toolchain/check/testdata/operators/builtin/unary_op.carbon index 76ff3927dfeb..8d30c2899f40 100644 --- a/toolchain/check/testdata/operators/builtin/unary_op.carbon +++ b/toolchain/check/testdata/operators/builtin/unary_op.carbon @@ -33,12 +33,6 @@ fn Constant() { // CHECK:STDOUT: %Not.type: type = fn_type @Not [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Not: %Not.type = struct_value () [concrete] -// CHECK:STDOUT: %true: bool = bool_literal true [concrete] -// CHECK:STDOUT: %false: bool = bool_literal false [concrete] -// CHECK:STDOUT: %Constant.type: type = fn_type @Constant [concrete] -// CHECK:STDOUT: %Constant: %Constant.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] -// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] // CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] // CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] // CHECK:STDOUT: %Copy.impl_witness.09f: = impl_witness imports.%Copy.impl_witness_table.47e [concrete] @@ -46,6 +40,12 @@ fn Constant() { // CHECK:STDOUT: %.235: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.dcd [concrete] // CHECK:STDOUT: %bool.as.Copy.impl.Op.type: type = fn_type @bool.as.Copy.impl.Op [concrete] // CHECK:STDOUT: %bool.as.Copy.impl.Op: %bool.as.Copy.impl.Op.type = struct_value () [concrete] +// CHECK:STDOUT: %true: bool = bool_literal true [concrete] +// CHECK:STDOUT: %false: bool = bool_literal false [concrete] +// CHECK:STDOUT: %Constant.type: type = fn_type @Constant [concrete] +// CHECK:STDOUT: %Constant: %Constant.type = struct_value () [concrete] +// CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] // CHECK:STDOUT: %bool.as.Copy.impl.Op.bound: = bound_method %true, %bool.as.Copy.impl.Op [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.type.19a: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(bool) [concrete] @@ -68,7 +68,7 @@ fn Constant() { // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Bool: %Bool.type = import_ref Core//prelude/parts/bool, Bool, loaded [concrete = constants.%Bool] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.297: %bool.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc16_31, loaded [concrete = constants.%bool.as.Copy.impl.Op] +// CHECK:STDOUT: %Core.import_ref.297: %bool.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc20_31, loaded [concrete = constants.%bool.as.Copy.impl.Op] // CHECK:STDOUT: %Copy.impl_witness_table.47e = impl_witness_table (%Core.import_ref.297), @bool.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } @@ -126,7 +126,10 @@ fn Constant() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %b.ref: bool = name_ref b, %b // CHECK:STDOUT: %.loc16: bool = not %b.ref -// CHECK:STDOUT: return %.loc16 +// CHECK:STDOUT: %impl.elem0: %.235 = impl_witness_access constants.%Copy.impl_witness.09f, element0 [concrete = constants.%bool.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %.loc16, %impl.elem0 +// CHECK:STDOUT: %bool.as.Copy.impl.Op.call: init bool = call %bound_method(%.loc16) +// CHECK:STDOUT: return %bool.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Constant() { diff --git a/toolchain/check/testdata/operators/overloaded/eq.carbon b/toolchain/check/testdata/operators/overloaded/eq.carbon index 33d21a4c15a4..576df525ca6c 100644 --- a/toolchain/check/testdata/operators/overloaded/eq.carbon +++ b/toolchain/check/testdata/operators/overloaded/eq.carbon @@ -280,9 +280,7 @@ fn TestLhsBad(a: D, b: C) -> bool { // CHECK:STDOUT: %impl.elem0: %.4b8 = impl_witness_access constants.%EqWith.impl_witness, element0 [concrete = constants.%C.as.EqWith.impl.Equal] // CHECK:STDOUT: %bound_method: = bound_method %a.ref, %impl.elem0 // CHECK:STDOUT: %C.as.EqWith.impl.Equal.call: init bool = call %bound_method(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc12_16.1: bool = value_of_initializer %C.as.EqWith.impl.Equal.call -// CHECK:STDOUT: %.loc12_16.2: bool = converted %C.as.EqWith.impl.Equal.call, %.loc12_16.1 -// CHECK:STDOUT: return %.loc12_16.2 +// CHECK:STDOUT: return %C.as.EqWith.impl.Equal.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestNotEqual(%a.param: %C, %b.param: %C) -> bool { @@ -292,9 +290,7 @@ fn TestLhsBad(a: D, b: C) -> bool { // CHECK:STDOUT: %impl.elem1: %.433 = impl_witness_access constants.%EqWith.impl_witness, element1 [concrete = constants.%C.as.EqWith.impl.NotEqual] // CHECK:STDOUT: %bound_method: = bound_method %a.ref, %impl.elem1 // CHECK:STDOUT: %C.as.EqWith.impl.NotEqual.call: init bool = call %bound_method(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc16_16.1: bool = value_of_initializer %C.as.EqWith.impl.NotEqual.call -// CHECK:STDOUT: %.loc16_16.2: bool = converted %C.as.EqWith.impl.NotEqual.call, %.loc16_16.1 -// CHECK:STDOUT: return %.loc16_16.2 +// CHECK:STDOUT: return %C.as.EqWith.impl.NotEqual.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_no_impl.carbon @@ -420,14 +416,14 @@ fn TestLhsBad(a: D, b: C) -> bool { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %D = name_ref a, %a // CHECK:STDOUT: %b.ref: %D = name_ref b, %b -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestNotEqual(%a.param: %D, %b.param: %D) -> bool { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %D = name_ref a, %a // CHECK:STDOUT: %b.ref: %D = name_ref b, %b -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_no_impl_for_args.carbon @@ -660,13 +656,13 @@ fn TestLhsBad(a: D, b: C) -> bool { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %C = name_ref a, %a // CHECK:STDOUT: %b.ref: %D = name_ref b, %b -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestLhsBad(%a.param: %D, %b.param: %C) -> bool { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %D = name_ref a, %a // CHECK:STDOUT: %b.ref: %C = name_ref b, %b -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/fail_no_impl_for_arg.carbon b/toolchain/check/testdata/operators/overloaded/fail_no_impl_for_arg.carbon index 5a9714c9175e..0a3e4b115f3a 100644 --- a/toolchain/check/testdata/operators/overloaded/fail_no_impl_for_arg.carbon +++ b/toolchain/check/testdata/operators/overloaded/fail_no_impl_for_arg.carbon @@ -15,10 +15,10 @@ package User; class C {}; class D {}; -impl forall [T:! Core.ImplicitAs(C)] C as Core.AddWith(T) where .Result = C { +impl C as Core.AddWith(C) where .Result = C { fn Op[self: C](other: C) -> C { return {}; } } -impl forall [T:! Core.ImplicitAs(C)] C as Core.AddAssignWith(T) { +impl C as Core.AddAssignWith(C) { fn Op[addr self: C*](other: C) {} } diff --git a/toolchain/check/testdata/operators/overloaded/implicit_as.carbon b/toolchain/check/testdata/operators/overloaded/implicit_as.carbon index 54120ef81851..ec80cd73a4fd 100644 --- a/toolchain/check/testdata/operators/overloaded/implicit_as.carbon +++ b/toolchain/check/testdata/operators/overloaded/implicit_as.carbon @@ -287,7 +287,12 @@ fn Test() { // CHECK:STDOUT: %n.ref: %X.elem = name_ref n, @X.%.loc16 [concrete = @X.%.loc16] // CHECK:STDOUT: %.loc24_45.1: ref %i32 = class_element_access %self.ref, element0 // CHECK:STDOUT: %.loc24_45.2: %i32 = bind_value %.loc24_45.1 -// CHECK:STDOUT: return %.loc24_45.2 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc24_45.1: = bound_method %.loc24_45.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc24_45.2: = bound_method %.loc24_45.2, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc24_45.2(%.loc24_45.2) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Sink_i32(%n.param: %i32); @@ -308,9 +313,7 @@ fn Test() { // CHECK:STDOUT: %T.ref.loc31_42: type = name_ref T, %T.loc31_11.2 [symbolic = %T.loc31_11.1 (constants.%T.8b3)] // CHECK:STDOUT: %Source.specific_fn.loc31_35.1: = specific_function %Source.ref, @Source(constants.%T.8b3) [symbolic = %Source.specific_fn.loc31_35.2 (constants.%Source.specific_fn.ff0)] // CHECK:STDOUT: %Source.call: init @Source.%T.loc31_11.1 (%T.8b3) = call %Source.specific_fn.loc31_35.1() -// CHECK:STDOUT: %.loc31_44.1: @Source.%T.loc31_11.1 (%T.8b3) = value_of_initializer %Source.call -// CHECK:STDOUT: %.loc31_44.2: @Source.%T.loc31_11.1 (%T.8b3) = converted %Source.call, %.loc31_44.1 -// CHECK:STDOUT: return %.loc31_44.2 +// CHECK:STDOUT: return %Source.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/index.carbon b/toolchain/check/testdata/operators/overloaded/index.carbon index a469db53e27a..b8eec5e30482 100644 --- a/toolchain/check/testdata/operators/overloaded/index.carbon +++ b/toolchain/check/testdata/operators/overloaded/index.carbon @@ -394,10 +394,10 @@ fn F() { ()[()]; } // CHECK:STDOUT: // CHECK:STDOUT: fn @empty_tuple.type.as.IndexWith.impl.At(%self.param: %empty_tuple.type, %subscript.param: %empty_tuple.type) -> %empty_tuple.type { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc8_13: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc8_14: %empty_tuple.type = converted %.loc8_13, %empty_tuple [concrete = constants.%empty_tuple] -// CHECK:STDOUT: return %.loc8_14 +// CHECK:STDOUT: %.loc8_13.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc8_13.2: init %empty_tuple.type = tuple_init () to %return [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc8_14: init %empty_tuple.type = converted %.loc8_13.1, %.loc8_13.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc8_14 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() { diff --git a/toolchain/check/testdata/operators/overloaded/index_with_prelude.carbon b/toolchain/check/testdata/operators/overloaded/index_with_prelude.carbon index 016d05b6bd74..27134e227be1 100644 --- a/toolchain/check/testdata/operators/overloaded/index_with_prelude.carbon +++ b/toolchain/check/testdata/operators/overloaded/index_with_prelude.carbon @@ -331,6 +331,7 @@ let x: i32 = c[0]; // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %tuple.type.24b: type = tuple_type (type, type) [concrete] // CHECK:STDOUT: %tuple.type.d07: type = tuple_type (%i32, %i32) [concrete] @@ -345,6 +346,16 @@ let x: i32 = c[0]; // CHECK:STDOUT: %tuple.type.as.IndexWith.impl.At: %tuple.type.as.IndexWith.impl.At.type = struct_value () [concrete] // CHECK:STDOUT: %IndexWith.facet: %IndexWith.type.d1f = facet_value %tuple.type.d07, (%IndexWith.impl_witness) [concrete] // CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] // CHECK:STDOUT: %int_5.64b: Core.IntLiteral = int_value 5 [concrete] // CHECK:STDOUT: %tuple.type.f94: type = tuple_type (Core.IntLiteral, Core.IntLiteral) [concrete] @@ -378,12 +389,16 @@ let x: i32 = c[0]; // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .IndexWith = %Core.IndexWith +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %Core.IndexWith: %IndexWith.type.504 = import_ref Core//prelude/operators/index, IndexWith, loaded [concrete = constants.%IndexWith.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/types/int, loc21_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/types/int, loc27_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] @@ -487,7 +502,12 @@ let x: i32 = c[0]; // CHECK:STDOUT: %self.ref: %tuple.type.d07 = name_ref self, %self // CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6] // CHECK:STDOUT: %tuple.elem0: %i32 = tuple_access %self.ref, element0 -// CHECK:STDOUT: return %tuple.elem0 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc6_16.1: = bound_method %tuple.elem0, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc6_16.2: = bound_method %tuple.elem0, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc6_16.2(%tuple.elem0) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/operators/overloaded/ordered.carbon b/toolchain/check/testdata/operators/overloaded/ordered.carbon index 614342ea617e..846f42b7f3d0 100644 --- a/toolchain/check/testdata/operators/overloaded/ordered.carbon +++ b/toolchain/check/testdata/operators/overloaded/ordered.carbon @@ -378,9 +378,7 @@ fn TestGreaterEqual(a: D, b: D) -> bool { // CHECK:STDOUT: %impl.elem0: %.440 = impl_witness_access constants.%OrderedWith.impl_witness, element0 [concrete = constants.%C.as.OrderedWith.impl.Less] // CHECK:STDOUT: %bound_method: = bound_method %a.ref, %impl.elem0 // CHECK:STDOUT: %C.as.OrderedWith.impl.Less.call: init bool = call %bound_method(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc14_15.1: bool = value_of_initializer %C.as.OrderedWith.impl.Less.call -// CHECK:STDOUT: %.loc14_15.2: bool = converted %C.as.OrderedWith.impl.Less.call, %.loc14_15.1 -// CHECK:STDOUT: return %.loc14_15.2 +// CHECK:STDOUT: return %C.as.OrderedWith.impl.Less.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestLessEqual(%a.param: %C, %b.param: %C) -> bool { @@ -390,9 +388,7 @@ fn TestGreaterEqual(a: D, b: D) -> bool { // CHECK:STDOUT: %impl.elem1: %.7af = impl_witness_access constants.%OrderedWith.impl_witness, element1 [concrete = constants.%C.as.OrderedWith.impl.LessOrEquivalent] // CHECK:STDOUT: %bound_method: = bound_method %a.ref, %impl.elem1 // CHECK:STDOUT: %C.as.OrderedWith.impl.LessOrEquivalent.call: init bool = call %bound_method(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc18_16.1: bool = value_of_initializer %C.as.OrderedWith.impl.LessOrEquivalent.call -// CHECK:STDOUT: %.loc18_16.2: bool = converted %C.as.OrderedWith.impl.LessOrEquivalent.call, %.loc18_16.1 -// CHECK:STDOUT: return %.loc18_16.2 +// CHECK:STDOUT: return %C.as.OrderedWith.impl.LessOrEquivalent.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestGreater(%a.param: %C, %b.param: %C) -> bool { @@ -402,9 +398,7 @@ fn TestGreaterEqual(a: D, b: D) -> bool { // CHECK:STDOUT: %impl.elem2: %.3d4 = impl_witness_access constants.%OrderedWith.impl_witness, element2 [concrete = constants.%C.as.OrderedWith.impl.Greater] // CHECK:STDOUT: %bound_method: = bound_method %a.ref, %impl.elem2 // CHECK:STDOUT: %C.as.OrderedWith.impl.Greater.call: init bool = call %bound_method(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc22_15.1: bool = value_of_initializer %C.as.OrderedWith.impl.Greater.call -// CHECK:STDOUT: %.loc22_15.2: bool = converted %C.as.OrderedWith.impl.Greater.call, %.loc22_15.1 -// CHECK:STDOUT: return %.loc22_15.2 +// CHECK:STDOUT: return %C.as.OrderedWith.impl.Greater.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestGreaterEqual(%a.param: %C, %b.param: %C) -> bool { @@ -414,9 +408,7 @@ fn TestGreaterEqual(a: D, b: D) -> bool { // CHECK:STDOUT: %impl.elem3: %.3b1 = impl_witness_access constants.%OrderedWith.impl_witness, element3 [concrete = constants.%C.as.OrderedWith.impl.GreaterOrEquivalent] // CHECK:STDOUT: %bound_method: = bound_method %a.ref, %impl.elem3 // CHECK:STDOUT: %C.as.OrderedWith.impl.GreaterOrEquivalent.call: init bool = call %bound_method(%a.ref, %b.ref) -// CHECK:STDOUT: %.loc26_16.1: bool = value_of_initializer %C.as.OrderedWith.impl.GreaterOrEquivalent.call -// CHECK:STDOUT: %.loc26_16.2: bool = converted %C.as.OrderedWith.impl.GreaterOrEquivalent.call, %.loc26_16.1 -// CHECK:STDOUT: return %.loc26_16.2 +// CHECK:STDOUT: return %C.as.OrderedWith.impl.GreaterOrEquivalent.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_no_impl.carbon @@ -588,27 +580,27 @@ fn TestGreaterEqual(a: D, b: D) -> bool { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %D = name_ref a, %a // CHECK:STDOUT: %b.ref: %D = name_ref b, %b -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestLessEqual(%a.param: %D, %b.param: %D) -> bool { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %D = name_ref a, %a // CHECK:STDOUT: %b.ref: %D = name_ref b, %b -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestGreater(%a.param: %D, %b.param: %D) -> bool { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %D = name_ref a, %a // CHECK:STDOUT: %b.ref: %D = name_ref b, %b -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestGreaterEqual(%a.param: %D, %b.param: %D) -> bool { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %D = name_ref a, %a // CHECK:STDOUT: %b.ref: %D = name_ref b, %b -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/packages/missing_prelude.carbon b/toolchain/check/testdata/packages/missing_prelude.carbon index ce7ce63a3499..a1fb985570a0 100644 --- a/toolchain/check/testdata/packages/missing_prelude.carbon +++ b/toolchain/check/testdata/packages/missing_prelude.carbon @@ -206,10 +206,10 @@ var n: {} = i32; // CHECK:STDOUT: // CHECK:STDOUT: fn() -> %empty_struct_type { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc4_41: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] -// CHECK:STDOUT: %.loc4_42: %empty_struct_type = converted %.loc4_41, %empty_struct [concrete = constants.%empty_struct] -// CHECK:STDOUT: return %.loc4_42 +// CHECK:STDOUT: %.loc4_41.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc4_41.2: init %empty_struct_type = struct_init () to %return [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc4_42: init %empty_struct_type = converted %.loc4_41.1, %.loc4_41.2 [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc4_42 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -358,10 +358,10 @@ var n: {} = i32; // CHECK:STDOUT: // CHECK:STDOUT: fn() -> %empty_tuple.type { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc8_41: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc8_42: %empty_tuple.type = converted %.loc8_41, %empty_tuple [concrete = constants.%empty_tuple] -// CHECK:STDOUT: return %.loc8_42 +// CHECK:STDOUT: %.loc8_41.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc8_41.2: init %empty_tuple.type = tuple_init () to %return [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc8_42: init %empty_tuple.type = converted %.loc8_41.1, %.loc8_41.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc8_42 to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/address_of_deref.carbon b/toolchain/check/testdata/pointer/address_of_deref.carbon index e32125932200..ec4bc41cbc37 100644 --- a/toolchain/check/testdata/pointer/address_of_deref.carbon +++ b/toolchain/check/testdata/pointer/address_of_deref.carbon @@ -24,6 +24,7 @@ fn F() -> i32 { // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] @@ -46,6 +47,16 @@ fn F() -> i32 { // CHECK:STDOUT: %bound_method: = bound_method %int_0.5c6, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %int_0.6a9: %i32 = int_value 0 [concrete] // CHECK:STDOUT: %ptr.235: type = ptr_type %i32 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %Int.as.Destroy.impl.Op.type.11b: type = fn_type @Int.as.Destroy.impl.Op, @Int.as.Destroy.impl(%int_32) [concrete] // CHECK:STDOUT: %Int.as.Destroy.impl.Op.054: %Int.as.Destroy.impl.Op.type.11b = struct_value () [concrete] @@ -56,6 +67,7 @@ fn F() -> i32 { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int // CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... @@ -64,6 +76,9 @@ fn F() -> i32 { // CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -92,10 +107,10 @@ fn F() -> i32 { // 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] -// CHECK:STDOUT: %impl.elem0: %.7ea = impl_witness_access constants.%ImplicitAs.impl_witness.acc, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.592] -// CHECK:STDOUT: %bound_method.loc16_3.1: = bound_method %int_0, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc16_3.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method] +// CHECK:STDOUT: %impl.elem0.loc16: %.7ea = impl_witness_access constants.%ImplicitAs.impl_witness.acc, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.592] +// CHECK:STDOUT: %bound_method.loc16_3.1: = bound_method %int_0, %impl.elem0.loc16 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] +// CHECK:STDOUT: %specific_fn.loc16: = specific_function %impl.elem0.loc16, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] +// CHECK:STDOUT: %bound_method.loc16_3.2: = bound_method %int_0, %specific_fn.loc16 [concrete = constants.%bound_method] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc16_3.2(%int_0) [concrete = constants.%int_0.6a9] // CHECK:STDOUT: %.loc16_3: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] // CHECK:STDOUT: assign %n.var, %.loc16_3 @@ -110,11 +125,16 @@ fn F() -> i32 { // CHECK:STDOUT: %addr.loc17_11: %ptr.235 = addr_of %.loc17_12 // CHECK:STDOUT: %.loc17_10.1: ref %i32 = deref %addr.loc17_11 // CHECK:STDOUT: %.loc17_10.2: %i32 = bind_value %.loc17_10.1 +// CHECK:STDOUT: %impl.elem0.loc17: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc17_10.1: = bound_method %.loc17_10.2, %impl.elem0.loc17 +// CHECK:STDOUT: %specific_fn.loc17: = specific_function %impl.elem0.loc17, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc17_10.2: = bound_method %.loc17_10.2, %specific_fn.loc17 +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc17_10.2(%.loc17_10.2) // CHECK:STDOUT: %Int.as.Destroy.impl.Op.bound: = bound_method %n.var, constants.%Int.as.Destroy.impl.Op.054 // CHECK:STDOUT: %Int.as.Destroy.impl.Op.specific_fn: = specific_function constants.%Int.as.Destroy.impl.Op.054, @Int.as.Destroy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Destroy.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc16_3.3: = bound_method %n.var, %Int.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr.loc16: %ptr.235 = addr_of %n.var // CHECK:STDOUT: %Int.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc16_3.3(%addr.loc16) -// CHECK:STDOUT: return %.loc17_10.2 +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/address_of_lvalue.carbon b/toolchain/check/testdata/pointer/address_of_lvalue.carbon index 13c5f05cfcac..cd328d0e30a2 100644 --- a/toolchain/check/testdata/pointer/address_of_lvalue.carbon +++ b/toolchain/check/testdata/pointer/address_of_lvalue.carbon @@ -118,7 +118,7 @@ fn F() { // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } diff --git a/toolchain/check/testdata/pointer/basic.carbon b/toolchain/check/testdata/pointer/basic.carbon index 9940a52de8f8..f9f31a3853aa 100644 --- a/toolchain/check/testdata/pointer/basic.carbon +++ b/toolchain/check/testdata/pointer/basic.carbon @@ -26,6 +26,7 @@ fn F() -> i32 { // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] @@ -51,6 +52,8 @@ fn F() -> i32 { // CHECK:STDOUT: %pattern_type.fe8: type = pattern_type %ptr.235 [concrete] // CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] // CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] // CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] // CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf: %ptr.as.Copy.impl.Op.type.f23 = struct_value () [symbolic] @@ -60,6 +63,12 @@ fn F() -> i32 { // CHECK:STDOUT: %Copy.facet.bab: %Copy.type = facet_value %ptr.235, (%Copy.impl_witness.19c) [concrete] // CHECK:STDOUT: %.284: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.bab [concrete] // CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn: = specific_function %ptr.as.Copy.impl.Op.2f4, @ptr.as.Copy.impl.Op(%i32) [concrete] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.type.f2e: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%ptr.235) [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.fad: %T.as.Destroy.impl.Op.type.f2e = struct_value () [concrete] @@ -84,7 +93,9 @@ fn F() -> i32 { // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } @@ -149,6 +160,11 @@ fn F() -> i32 { // CHECK:STDOUT: %.loc19_11: %ptr.235 = bind_value %p.ref // CHECK:STDOUT: %.loc19_10.1: ref %i32 = deref %.loc19_11 // CHECK:STDOUT: %.loc19_10.2: %i32 = bind_value %.loc19_10.1 +// CHECK:STDOUT: %impl.elem0.loc19: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc19_10.1: = bound_method %.loc19_10.2, %impl.elem0.loc19 +// CHECK:STDOUT: %specific_fn.loc19: = specific_function %impl.elem0.loc19, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc19_10.2: = bound_method %.loc19_10.2, %specific_fn.loc19 +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc19_10.2(%.loc19_10.2) // CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %p.var, constants.%T.as.Destroy.impl.Op.fad // CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function constants.%T.as.Destroy.impl.Op.fad, @T.as.Destroy.impl.Op(constants.%ptr.235) [concrete = constants.%T.as.Destroy.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc17_3: = bound_method %p.var, %T.as.Destroy.impl.Op.specific_fn @@ -159,6 +175,6 @@ fn F() -> i32 { // CHECK:STDOUT: %bound_method.loc16_3.3: = bound_method %n.var, %Int.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr.loc16: %ptr.235 = addr_of %n.var // CHECK:STDOUT: %Int.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc16_3.3(%addr.loc16) -// CHECK:STDOUT: return %.loc19_10.2 +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/fail_type_mismatch.carbon b/toolchain/check/testdata/pointer/fail_type_mismatch.carbon index bc1202e537b4..d8ab5053d7a8 100644 --- a/toolchain/check/testdata/pointer/fail_type_mismatch.carbon +++ b/toolchain/check/testdata/pointer/fail_type_mismatch.carbon @@ -81,6 +81,6 @@ fn ConstMismatch(p: const {}*) -> const ({}*) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %p.ref: %ptr.bf9 = name_ref p, %p // CHECK:STDOUT: %.loc23: %const.987 = converted %p.ref, [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/import.carbon b/toolchain/check/testdata/pointer/import.carbon index 92657af29683..cc3d8a4820c1 100644 --- a/toolchain/check/testdata/pointer/import.carbon +++ b/toolchain/check/testdata/pointer/import.carbon @@ -81,7 +81,7 @@ var a: i32* = a_ref; // CHECK:STDOUT: %Core.import_ref.428: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.49e) = import_ref Core//prelude/parts/int, loc23_39, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f01)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.b6b = impl_witness_table (%Core.import_ref.428), @Core.IntLiteral.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc32_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] // CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -142,10 +142,10 @@ var a: i32* = a_ref; // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] // CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.782: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] // CHECK:STDOUT: %ptr.as.Copy.impl.Op.58c: %ptr.as.Copy.impl.Op.type.782 = struct_value () [symbolic] -// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %ptr.9e1: type = ptr_type %i32 [concrete] @@ -167,7 +167,7 @@ var a: i32* = a_ref; // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } -// CHECK:STDOUT: %Implicit.import_ref.e04: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.782) = import_ref Implicit//default, inst292 [indirect], loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.58c)] +// CHECK:STDOUT: %Implicit.import_ref.e04: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.782) = import_ref Implicit//default, inst339 [indirect], loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.58c)] // CHECK:STDOUT: %Copy.impl_witness_table.3e8 = impl_witness_table (%Implicit.import_ref.e04), @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.f6a = binding_pattern a_ref [concrete] diff --git a/toolchain/check/testdata/pointer/nested_const.carbon b/toolchain/check/testdata/pointer/nested_const.carbon index 1e1a7283ec10..dd5a476854c7 100644 --- a/toolchain/check/testdata/pointer/nested_const.carbon +++ b/toolchain/check/testdata/pointer/nested_const.carbon @@ -23,6 +23,7 @@ fn F(p: const (const (const i32*)*)) -> const i32 { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %const.20a: type = const_type %i32 [concrete] // CHECK:STDOUT: %ptr.36b: type = ptr_type %const.20a [concrete] @@ -33,15 +34,36 @@ fn F(p: const (const (const i32*)*)) -> const i32 { // CHECK:STDOUT: %pattern_type.a65: type = pattern_type %const.20a [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] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %T.578: %Copy.type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %const.as.Copy.impl.Op.type.906: type = fn_type @const.as.Copy.impl.Op, @const.as.Copy.impl(%T.578) [symbolic] +// CHECK:STDOUT: %const.as.Copy.impl.Op.62b: %const.as.Copy.impl.Op.type.906 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %Copy.impl_witness.b85: = impl_witness imports.%Copy.impl_witness_table.91e, @const.as.Copy.impl(%Copy.facet.26d) [concrete] +// CHECK:STDOUT: %const.as.Copy.impl.Op.type.f83: type = fn_type @const.as.Copy.impl.Op, @const.as.Copy.impl(%Copy.facet.26d) [concrete] +// CHECK:STDOUT: %const.as.Copy.impl.Op.fbf: %const.as.Copy.impl.Op.type.f83 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.541: %Copy.type = facet_value %const.20a, (%Copy.impl_witness.b85) [concrete] +// CHECK:STDOUT: %.b9e: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.541 [concrete] +// CHECK:STDOUT: %const.as.Copy.impl.Op.specific_fn: = specific_function %const.as.Copy.impl.Op.fbf, @const.as.Copy.impl.Op(%Copy.facet.26d) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] +// CHECK:STDOUT: %Core.import_ref.7d6: @const.as.Copy.impl.%const.as.Copy.impl.Op.type (%const.as.Copy.impl.Op.type.906) = import_ref Core//prelude/parts/copy, loc16_31, loaded [symbolic = @const.as.Copy.impl.%const.as.Copy.impl.Op (constants.%const.as.Copy.impl.Op.62b)] +// CHECK:STDOUT: %Copy.impl_witness_table.91e = impl_witness_table (%Core.import_ref.7d6), @const.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -82,6 +104,13 @@ fn F(p: const (const (const i32*)*)) -> const i32 { // CHECK:STDOUT: %.loc17_11.2: %const.58f = bind_value %.loc17_11.1 // CHECK:STDOUT: %.loc17_10.1: ref %const.20a = deref %.loc17_11.2 // CHECK:STDOUT: %.loc17_10.2: %const.20a = bind_value %.loc17_10.1 -// CHECK:STDOUT: return %.loc17_10.2 +// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value constants.%i32, (constants.%Copy.impl_witness.f0b) [concrete = constants.%Copy.facet.26d] +// CHECK:STDOUT: %.loc17_10.3: %Copy.type = converted constants.%i32, %Copy.facet [concrete = constants.%Copy.facet.26d] +// CHECK:STDOUT: %impl.elem0: %.b9e = impl_witness_access constants.%Copy.impl_witness.b85, element0 [concrete = constants.%const.as.Copy.impl.Op.fbf] +// CHECK:STDOUT: %bound_method.loc17_10.1: = bound_method %.loc17_10.2, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @const.as.Copy.impl.Op(constants.%Copy.facet.26d) [concrete = constants.%const.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc17_10.2: = bound_method %.loc17_10.2, %specific_fn +// CHECK:STDOUT: %const.as.Copy.impl.Op.call: init %const.20a = call %bound_method.loc17_10.2(%.loc17_10.2) +// CHECK:STDOUT: return %const.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/types.carbon b/toolchain/check/testdata/pointer/types.carbon index c20c8487490c..1674764f515e 100644 --- a/toolchain/check/testdata/pointer/types.carbon +++ b/toolchain/check/testdata/pointer/types.carbon @@ -31,20 +31,41 @@ fn ConstPtr(p: const i32*) -> (const i32)* { // CHECK:STDOUT: %pattern_type.fe8: type = pattern_type %ptr.235 [concrete] // CHECK:STDOUT: %Ptr.type: type = fn_type @Ptr [concrete] // CHECK:STDOUT: %Ptr: %Ptr.type = struct_value () [concrete] -// CHECK:STDOUT: %const: type = const_type %i32 [concrete] -// CHECK:STDOUT: %ptr.36b: type = ptr_type %const [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.f23: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.8b3) [symbolic] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.abf: %ptr.as.Copy.impl.Op.type.f23 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.19c: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%i32) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.3ea: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%i32) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.2f4: %ptr.as.Copy.impl.Op.type.3ea = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.bab: %Copy.type = facet_value %ptr.235, (%Copy.impl_witness.19c) [concrete] +// CHECK:STDOUT: %.284: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.bab [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn.582: = specific_function %ptr.as.Copy.impl.Op.2f4, @ptr.as.Copy.impl.Op(%i32) [concrete] +// CHECK:STDOUT: %const.20a: type = const_type %i32 [concrete] +// CHECK:STDOUT: %ptr.36b: type = ptr_type %const.20a [concrete] // CHECK:STDOUT: %pattern_type.bff: type = pattern_type %ptr.36b [concrete] // CHECK:STDOUT: %ConstPtr.type: type = fn_type @ConstPtr [concrete] // CHECK:STDOUT: %ConstPtr: %ConstPtr.type = struct_value () [concrete] +// CHECK:STDOUT: %Copy.impl_witness.aa0: = impl_witness imports.%Copy.impl_witness_table.a71, @ptr.as.Copy.impl(%const.20a) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.827: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%const.20a) [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.e0a: %ptr.as.Copy.impl.Op.type.827 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.1bd: %Copy.type = facet_value %ptr.36b, (%Copy.impl_witness.aa0) [concrete] +// CHECK:STDOUT: %.194: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.1bd [concrete] +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn.615: = specific_function %ptr.as.Copy.impl.Op.e0a, @ptr.as.Copy.impl.Op(%const.20a) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.de9: @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op.type (%ptr.as.Copy.impl.Op.type.f23) = import_ref Core//prelude/parts/copy, loc36_31, loaded [symbolic = @ptr.as.Copy.impl.%ptr.as.Copy.impl.Op (constants.%ptr.as.Copy.impl.Op.abf)] +// CHECK:STDOUT: %Copy.impl_witness_table.a71 = impl_witness_table (%Core.import_ref.de9), @ptr.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -81,13 +102,13 @@ fn ConstPtr(p: const i32*) -> (const i32)* { // CHECK:STDOUT: } { // CHECK:STDOUT: %int_32.loc19_38: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] // CHECK:STDOUT: %i32.loc19_38: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %const.loc19_32: type = const_type %i32.loc19_38 [concrete = constants.%const] +// CHECK:STDOUT: %const.loc19_32: type = const_type %i32.loc19_38 [concrete = constants.%const.20a] // CHECK:STDOUT: %ptr.loc19_42: type = ptr_type %const.loc19_32 [concrete = constants.%ptr.36b] // CHECK:STDOUT: %p.param: %ptr.36b = value_param call_param0 // CHECK:STDOUT: %.loc19: type = splice_block %ptr.loc19_25 [concrete = constants.%ptr.36b] { // CHECK:STDOUT: %int_32.loc19_22: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] // CHECK:STDOUT: %i32.loc19_22: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %const.loc19_16: type = const_type %i32.loc19_22 [concrete = constants.%const] +// CHECK:STDOUT: %const.loc19_16: type = const_type %i32.loc19_22 [concrete = constants.%const.20a] // CHECK:STDOUT: %ptr.loc19_25: type = ptr_type %const.loc19_16 [concrete = constants.%ptr.36b] // CHECK:STDOUT: } // CHECK:STDOUT: %p: %ptr.36b = bind_name p, %p.param @@ -99,12 +120,22 @@ fn ConstPtr(p: const i32*) -> (const i32)* { // CHECK:STDOUT: fn @Ptr(%p.param: %ptr.235) -> %ptr.235 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %p.ref: %ptr.235 = name_ref p, %p -// CHECK:STDOUT: return %p.ref +// CHECK:STDOUT: %impl.elem0: %.284 = impl_witness_access constants.%Copy.impl_witness.19c, element0 [concrete = constants.%ptr.as.Copy.impl.Op.2f4] +// CHECK:STDOUT: %bound_method.loc16_10.1: = bound_method %p.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @ptr.as.Copy.impl.Op(constants.%i32) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn.582] +// CHECK:STDOUT: %bound_method.loc16_10.2: = bound_method %p.ref, %specific_fn +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.235 = call %bound_method.loc16_10.2(%p.ref) +// CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConstPtr(%p.param: %ptr.36b) -> %ptr.36b { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %p.ref: %ptr.36b = name_ref p, %p -// CHECK:STDOUT: return %p.ref +// CHECK:STDOUT: %impl.elem0: %.194 = impl_witness_access constants.%Copy.impl_witness.aa0, element0 [concrete = constants.%ptr.as.Copy.impl.Op.e0a] +// CHECK:STDOUT: %bound_method.loc20_10.1: = bound_method %p.ref, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @ptr.as.Copy.impl.Op(constants.%const.20a) [concrete = constants.%ptr.as.Copy.impl.Op.specific_fn.615] +// CHECK:STDOUT: %bound_method.loc20_10.2: = bound_method %p.ref, %specific_fn +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.36b = call %bound_method.loc20_10.2(%p.ref) +// CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/primitives/import_symbolic.carbon b/toolchain/check/testdata/primitives/import_symbolic.carbon index d5b32401891b..ae6695c55d54 100644 --- a/toolchain/check/testdata/primitives/import_symbolic.carbon +++ b/toolchain/check/testdata/primitives/import_symbolic.carbon @@ -203,17 +203,27 @@ fn F() -> u32 { // CHECK:STDOUT: %I.impl_witness: = impl_witness imports.%I.impl_witness_table [concrete] // CHECK:STDOUT: %I.facet: %I.type = facet_value %C, (%I.impl_witness) [concrete] // CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.030 [concrete] +// CHECK:STDOUT: %assoc0.e13: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.030 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.impl_witness.09f: = impl_witness imports.%Copy.impl_witness_table.47e [concrete] +// CHECK:STDOUT: %Copy.facet.dcd: %Copy.type = facet_value bool, (%Copy.impl_witness.09f) [concrete] +// CHECK:STDOUT: %.235: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.dcd [concrete] +// CHECK:STDOUT: %bool.as.Copy.impl.Op.type: type = fn_type @bool.as.Copy.impl.Op [concrete] +// CHECK:STDOUT: %bool.as.Copy.impl.Op: %bool.as.Copy.impl.Op.type = struct_value () [concrete] +// CHECK:STDOUT: %bool.as.Copy.impl.Op.bound: = bound_method %false, %bool.as.Copy.impl.Op [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.I: type = import_ref Main//bool, I, loaded [concrete = constants.%I.type] // CHECK:STDOUT: %Main.C: type = import_ref Main//bool, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.8be: %I.assoc_type = import_ref Main//bool, loc5_10, loaded [concrete = constants.%assoc0] +// CHECK:STDOUT: %Main.import_ref.8be: %I.assoc_type = import_ref Main//bool, loc5_10, loaded [concrete = constants.%assoc0.e13] // CHECK:STDOUT: %Main.import_ref.d18: bool = import_ref Main//bool, loc9_32, loaded [concrete = constants.%false] // CHECK:STDOUT: %I.impl_witness_table = impl_witness_table (%Main.import_ref.d18), @C.as.I.impl [concrete] // CHECK:STDOUT: %Main.import_ref.030: bool = import_ref Main//bool, loc5_10, loaded [concrete = %val] // CHECK:STDOUT: %val: bool = assoc_const_decl @val [concrete] {} +// CHECK:STDOUT: %Core.import_ref.297: %bool.as.Copy.impl.Op.type = import_ref Core//prelude/copy, loc23_31, loaded [concrete = constants.%bool.as.Copy.impl.Op] +// CHECK:STDOUT: %Copy.impl_witness_table.47e = impl_witness_table (%Core.import_ref.297), @bool.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() -> bool { @@ -222,11 +232,14 @@ fn F() -> u32 { // CHECK:STDOUT: %I.ref: type = name_ref I, imports.%Main.I [concrete = constants.%I.type] // CHECK:STDOUT: %I.facet: %I.type = facet_value constants.%C, (constants.%I.impl_witness) [concrete = constants.%I.facet] // CHECK:STDOUT: %.loc7_13: %I.type = converted %C.ref, %I.facet [concrete = constants.%I.facet] -// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.8be [concrete = constants.%assoc0] +// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.8be [concrete = constants.%assoc0.e13] // CHECK:STDOUT: %as_type: type = facet_access_type %.loc7_13 [concrete = constants.%C] // CHECK:STDOUT: %.loc7_18: type = converted %.loc7_13, %as_type [concrete = constants.%C] -// CHECK:STDOUT: %impl.elem0: bool = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%false] -// CHECK:STDOUT: return %impl.elem0 +// CHECK:STDOUT: %impl.elem0.loc7_18.1: bool = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%false] +// CHECK:STDOUT: %impl.elem0.loc7_18.2: %.235 = impl_witness_access constants.%Copy.impl_witness.09f, element0 [concrete = constants.%bool.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %impl.elem0.loc7_18.1, %impl.elem0.loc7_18.2 [concrete = constants.%bool.as.Copy.impl.Op.bound] +// CHECK:STDOUT: %bool.as.Copy.impl.Op.call: init bool = call %bound_method(%impl.elem0.loc7_18.1) [concrete = constants.%false] +// CHECK:STDOUT: return %bool.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_char.carbon @@ -239,17 +252,27 @@ fn F() -> u32 { // CHECK:STDOUT: %I.impl_witness: = impl_witness imports.%I.impl_witness_table [concrete] // CHECK:STDOUT: %I.facet: %I.type = facet_value %C, (%I.impl_witness) [concrete] // CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.8e8 [concrete] +// CHECK:STDOUT: %assoc0.941: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.8e8 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.impl_witness.0c3: = impl_witness imports.%Copy.impl_witness_table.e5f [concrete] +// CHECK:STDOUT: %Copy.facet.2e3: %Copy.type = facet_value %Char, (%Copy.impl_witness.0c3) [concrete] +// CHECK:STDOUT: %.579: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.2e3 [concrete] +// CHECK:STDOUT: %Char.as.Copy.impl.Op.type: type = fn_type @Char.as.Copy.impl.Op [concrete] +// CHECK:STDOUT: %Char.as.Copy.impl.Op: %Char.as.Copy.impl.Op.type = struct_value () [concrete] +// CHECK:STDOUT: %Char.as.Copy.impl.Op.bound: = bound_method %int_97, %Char.as.Copy.impl.Op [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.I: type = import_ref Main//char, I, loaded [concrete = constants.%I.type] // CHECK:STDOUT: %Main.C: type = import_ref Main//char, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.da1: %I.assoc_type = import_ref Main//char, loc5_10, loaded [concrete = constants.%assoc0] +// CHECK:STDOUT: %Main.import_ref.da1: %I.assoc_type = import_ref Main//char, loc5_10, loaded [concrete = constants.%assoc0.941] // CHECK:STDOUT: %Main.import_ref.d0c: %Char = import_ref Main//char, loc10_30, loaded [concrete = constants.%int_97] // CHECK:STDOUT: %I.impl_witness_table = impl_witness_table (%Main.import_ref.d0c), @C.as.I.impl [concrete] // CHECK:STDOUT: %Main.import_ref.8e8: %Char = import_ref Main//char, loc5_10, loaded [concrete = %val] // CHECK:STDOUT: %val: %Char = assoc_const_decl @val [concrete] {} +// CHECK:STDOUT: %Core.import_ref.a11: %Char.as.Copy.impl.Op.type = import_ref Core//prelude/types/char, loc19_31, loaded [concrete = constants.%Char.as.Copy.impl.Op] +// CHECK:STDOUT: %Copy.impl_witness_table.e5f = impl_witness_table (%Core.import_ref.a11), @Char.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() -> %Char { @@ -258,11 +281,14 @@ fn F() -> u32 { // CHECK:STDOUT: %I.ref: type = name_ref I, imports.%Main.I [concrete = constants.%I.type] // CHECK:STDOUT: %I.facet: %I.type = facet_value constants.%C, (constants.%I.impl_witness) [concrete = constants.%I.facet] // CHECK:STDOUT: %.loc7_13: %I.type = converted %C.ref, %I.facet [concrete = constants.%I.facet] -// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.da1 [concrete = constants.%assoc0] +// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.da1 [concrete = constants.%assoc0.941] // CHECK:STDOUT: %as_type: type = facet_access_type %.loc7_13 [concrete = constants.%C] // CHECK:STDOUT: %.loc7_18: type = converted %.loc7_13, %as_type [concrete = constants.%C] -// CHECK:STDOUT: %impl.elem0: %Char = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%int_97] -// CHECK:STDOUT: return %impl.elem0 +// CHECK:STDOUT: %impl.elem0.loc7_18.1: %Char = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%int_97] +// CHECK:STDOUT: %impl.elem0.loc7_18.2: %.579 = impl_witness_access constants.%Copy.impl_witness.0c3, element0 [concrete = constants.%Char.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %impl.elem0.loc7_18.1, %impl.elem0.loc7_18.2 [concrete = constants.%Char.as.Copy.impl.Op.bound] +// CHECK:STDOUT: %Char.as.Copy.impl.Op.call: init %Char = call %bound_method(%impl.elem0.loc7_18.1) [concrete = constants.%int_97] +// CHECK:STDOUT: return %Char.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_char_literal.carbon @@ -274,17 +300,27 @@ fn F() -> u32 { // CHECK:STDOUT: %I.impl_witness: = impl_witness imports.%I.impl_witness_table [concrete] // CHECK:STDOUT: %I.facet: %I.type = facet_value %C, (%I.impl_witness) [concrete] // CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.dcc [concrete] +// CHECK:STDOUT: %assoc0.545: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.dcc [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.impl_witness.5b9: = impl_witness imports.%Copy.impl_witness_table.0e0 [concrete] +// CHECK:STDOUT: %Copy.facet.d06: %Copy.type = facet_value Core.CharLiteral, (%Copy.impl_witness.5b9) [concrete] +// CHECK:STDOUT: %.4f4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.d06 [concrete] +// CHECK:STDOUT: %Core.CharLiteral.as.Copy.impl.Op.type: type = fn_type @Core.CharLiteral.as.Copy.impl.Op [concrete] +// CHECK:STDOUT: %Core.CharLiteral.as.Copy.impl.Op: %Core.CharLiteral.as.Copy.impl.Op.type = struct_value () [concrete] +// CHECK:STDOUT: %Core.CharLiteral.as.Copy.impl.Op.bound: = bound_method %.54f, %Core.CharLiteral.as.Copy.impl.Op [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.I: type = import_ref Main//char_literal, I, loaded [concrete = constants.%I.type] // CHECK:STDOUT: %Main.C: type = import_ref Main//char_literal, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.696: %I.assoc_type = import_ref Main//char_literal, loc5_10, loaded [concrete = constants.%assoc0] +// CHECK:STDOUT: %Main.import_ref.696: %I.assoc_type = import_ref Main//char_literal, loc5_10, loaded [concrete = constants.%assoc0.545] // CHECK:STDOUT: %Main.import_ref.43e: Core.CharLiteral = import_ref Main//char_literal, loc10_30, loaded [concrete = constants.%.54f] // CHECK:STDOUT: %I.impl_witness_table = impl_witness_table (%Main.import_ref.43e), @C.as.I.impl [concrete] // CHECK:STDOUT: %Main.import_ref.dcc: Core.CharLiteral = import_ref Main//char_literal, loc5_10, loaded [concrete = %val] // CHECK:STDOUT: %val: Core.CharLiteral = assoc_const_decl @val [concrete] {} +// CHECK:STDOUT: %Core.import_ref.93c: %Core.CharLiteral.as.Copy.impl.Op.type = import_ref Core//prelude/copy, loc27_31, loaded [concrete = constants.%Core.CharLiteral.as.Copy.impl.Op] +// CHECK:STDOUT: %Copy.impl_witness_table.0e0 = impl_witness_table (%Core.import_ref.93c), @Core.CharLiteral.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() -> Core.CharLiteral { @@ -293,17 +329,21 @@ fn F() -> u32 { // CHECK:STDOUT: %I.ref: type = name_ref I, imports.%Main.I [concrete = constants.%I.type] // CHECK:STDOUT: %I.facet: %I.type = facet_value constants.%C, (constants.%I.impl_witness) [concrete = constants.%I.facet] // CHECK:STDOUT: %.loc7_13: %I.type = converted %C.ref, %I.facet [concrete = constants.%I.facet] -// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.696 [concrete = constants.%assoc0] +// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.696 [concrete = constants.%assoc0.545] // CHECK:STDOUT: %as_type: type = facet_access_type %.loc7_13 [concrete = constants.%C] // CHECK:STDOUT: %.loc7_18: type = converted %.loc7_13, %as_type [concrete = constants.%C] -// CHECK:STDOUT: %impl.elem0: Core.CharLiteral = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%.54f] -// CHECK:STDOUT: return %impl.elem0 +// CHECK:STDOUT: %impl.elem0.loc7_18.1: Core.CharLiteral = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%.54f] +// CHECK:STDOUT: %impl.elem0.loc7_18.2: %.4f4 = impl_witness_access constants.%Copy.impl_witness.5b9, element0 [concrete = constants.%Core.CharLiteral.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %impl.elem0.loc7_18.1, %impl.elem0.loc7_18.2 [concrete = constants.%Core.CharLiteral.as.Copy.impl.Op.bound] +// CHECK:STDOUT: %Core.CharLiteral.as.Copy.impl.Op.call: init Core.CharLiteral = call %bound_method(%impl.elem0.loc7_18.1) [concrete = constants.%.54f] +// CHECK:STDOUT: return %Core.CharLiteral.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_float.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %int_64: Core.IntLiteral = int_value 64 [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %f64.d77: type = class_type @Float, @Float(%int_64) [concrete] // CHECK:STDOUT: %C: type = class_type @C [concrete] // CHECK:STDOUT: %I.type: type = facet_type <@I> [concrete] @@ -311,17 +351,31 @@ fn F() -> u32 { // CHECK:STDOUT: %I.impl_witness: = impl_witness imports.%I.impl_witness_table [concrete] // CHECK:STDOUT: %I.facet: %I.type = facet_value %C, (%I.impl_witness) [concrete] // CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.267 [concrete] +// CHECK:STDOUT: %assoc0.ece: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.267 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Float.as.Copy.impl.Op.type.a25: type = fn_type @Float.as.Copy.impl.Op, @Float.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Float.as.Copy.impl.Op.623: %Float.as.Copy.impl.Op.type.a25 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.160: = impl_witness imports.%Copy.impl_witness_table.e1b, @Float.as.Copy.impl(%int_64) [concrete] +// CHECK:STDOUT: %Float.as.Copy.impl.Op.type.256: type = fn_type @Float.as.Copy.impl.Op, @Float.as.Copy.impl(%int_64) [concrete] +// CHECK:STDOUT: %Float.as.Copy.impl.Op.47e: %Float.as.Copy.impl.Op.type.256 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.2da: %Copy.type = facet_value %f64.d77, (%Copy.impl_witness.160) [concrete] +// CHECK:STDOUT: %.2ef: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.2da [concrete] +// CHECK:STDOUT: %Float.as.Copy.impl.Op.bound: = bound_method %float, %Float.as.Copy.impl.Op.47e [concrete] +// CHECK:STDOUT: %Float.as.Copy.impl.Op.specific_fn: = specific_function %Float.as.Copy.impl.Op.47e, @Float.as.Copy.impl.Op(%int_64) [concrete] +// CHECK:STDOUT: %bound_method: = bound_method %float, %Float.as.Copy.impl.Op.specific_fn [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.I: type = import_ref Main//float, I, loaded [concrete = constants.%I.type] // CHECK:STDOUT: %Main.C: type = import_ref Main//float, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.de3: %I.assoc_type = import_ref Main//float, loc5_10, loaded [concrete = constants.%assoc0] +// CHECK:STDOUT: %Main.import_ref.de3: %I.assoc_type = import_ref Main//float, loc5_10, loaded [concrete = constants.%assoc0.ece] // CHECK:STDOUT: %Main.import_ref.0d9: %f64.d77 = import_ref Main//float, loc10_30, loaded [concrete = constants.%float] // CHECK:STDOUT: %I.impl_witness_table = impl_witness_table (%Main.import_ref.0d9), @C.as.I.impl [concrete] // CHECK:STDOUT: %Main.import_ref.267: %f64.d77 = import_ref Main//float, loc5_10, loaded [concrete = %val] // CHECK:STDOUT: %val: %f64.d77 = assoc_const_decl @val [concrete] {} +// CHECK:STDOUT: %Core.import_ref.419: @Float.as.Copy.impl.%Float.as.Copy.impl.Op.type (%Float.as.Copy.impl.Op.type.a25) = import_ref Core//prelude/types/float, loc22_31, loaded [symbolic = @Float.as.Copy.impl.%Float.as.Copy.impl.Op (constants.%Float.as.Copy.impl.Op.623)] +// CHECK:STDOUT: %Copy.impl_witness_table.e1b = impl_witness_table (%Core.import_ref.419), @Float.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() -> %f64.d77 { @@ -330,11 +384,16 @@ fn F() -> u32 { // CHECK:STDOUT: %I.ref: type = name_ref I, imports.%Main.I [concrete = constants.%I.type] // CHECK:STDOUT: %I.facet: %I.type = facet_value constants.%C, (constants.%I.impl_witness) [concrete = constants.%I.facet] // CHECK:STDOUT: %.loc7_13: %I.type = converted %C.ref, %I.facet [concrete = constants.%I.facet] -// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.de3 [concrete = constants.%assoc0] +// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.de3 [concrete = constants.%assoc0.ece] // CHECK:STDOUT: %as_type: type = facet_access_type %.loc7_13 [concrete = constants.%C] // CHECK:STDOUT: %.loc7_18: type = converted %.loc7_13, %as_type [concrete = constants.%C] -// CHECK:STDOUT: %impl.elem0: %f64.d77 = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%float] -// CHECK:STDOUT: return %impl.elem0 +// CHECK:STDOUT: %impl.elem0.loc7_18.1: %f64.d77 = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%float] +// CHECK:STDOUT: %impl.elem0.loc7_18.2: %.2ef = impl_witness_access constants.%Copy.impl_witness.160, element0 [concrete = constants.%Float.as.Copy.impl.Op.47e] +// CHECK:STDOUT: %bound_method.loc7_18.1: = bound_method %impl.elem0.loc7_18.1, %impl.elem0.loc7_18.2 [concrete = constants.%Float.as.Copy.impl.Op.bound] +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0.loc7_18.2, @Float.as.Copy.impl.Op(constants.%int_64) [concrete = constants.%Float.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc7_18.2: = bound_method %impl.elem0.loc7_18.1, %specific_fn [concrete = constants.%bound_method] +// CHECK:STDOUT: %Float.as.Copy.impl.Op.call: init %f64.d77 = call %bound_method.loc7_18.2(%impl.elem0.loc7_18.1) [concrete = constants.%float] +// CHECK:STDOUT: return %Float.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_float_literal.carbon @@ -345,18 +404,28 @@ fn F() -> u32 { // CHECK:STDOUT: %I.impl_witness: = impl_witness imports.%I.impl_witness_table [concrete] // CHECK:STDOUT: %I.facet: %I.type = facet_value %C, (%I.impl_witness) [concrete] // CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.e01 [concrete] +// CHECK:STDOUT: %assoc0.6ce: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.e01 [concrete] // CHECK:STDOUT: %float.3fedf4.2: Core.FloatLiteral = float_literal_value 1e-1 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.impl_witness.e23: = impl_witness imports.%Copy.impl_witness_table.453 [concrete] +// CHECK:STDOUT: %Copy.facet.503: %Copy.type = facet_value Core.FloatLiteral, (%Copy.impl_witness.e23) [concrete] +// CHECK:STDOUT: %.e84: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.503 [concrete] +// CHECK:STDOUT: %Core.FloatLiteral.as.Copy.impl.Op.type: type = fn_type @Core.FloatLiteral.as.Copy.impl.Op [concrete] +// CHECK:STDOUT: %Core.FloatLiteral.as.Copy.impl.Op: %Core.FloatLiteral.as.Copy.impl.Op.type = struct_value () [concrete] +// CHECK:STDOUT: %Core.FloatLiteral.as.Copy.impl.Op.bound: = bound_method %float.3fedf4.2, %Core.FloatLiteral.as.Copy.impl.Op [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.I: type = import_ref Main//float_literal, I, loaded [concrete = constants.%I.type] // CHECK:STDOUT: %Main.C: type = import_ref Main//float_literal, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.730: %I.assoc_type = import_ref Main//float_literal, loc5_10, loaded [concrete = constants.%assoc0] +// CHECK:STDOUT: %Main.import_ref.730: %I.assoc_type = import_ref Main//float_literal, loc5_10, loaded [concrete = constants.%assoc0.6ce] // CHECK:STDOUT: %Main.import_ref.dec: Core.FloatLiteral = import_ref Main//float_literal, loc10_30, loaded [concrete = constants.%float.3fedf4.2] // CHECK:STDOUT: %I.impl_witness_table = impl_witness_table (%Main.import_ref.dec), @C.as.I.impl [concrete] // CHECK:STDOUT: %Main.import_ref.e01: Core.FloatLiteral = import_ref Main//float_literal, loc5_10, loaded [concrete = %val] // CHECK:STDOUT: %val: Core.FloatLiteral = assoc_const_decl @val [concrete] {} +// CHECK:STDOUT: %Core.import_ref.1bb: %Core.FloatLiteral.as.Copy.impl.Op.type = import_ref Core//prelude/copy, loc31_31, loaded [concrete = constants.%Core.FloatLiteral.as.Copy.impl.Op] +// CHECK:STDOUT: %Copy.impl_witness_table.453 = impl_witness_table (%Core.import_ref.1bb), @Core.FloatLiteral.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() -> Core.FloatLiteral { @@ -365,17 +434,21 @@ fn F() -> u32 { // CHECK:STDOUT: %I.ref: type = name_ref I, imports.%Main.I [concrete = constants.%I.type] // CHECK:STDOUT: %I.facet: %I.type = facet_value constants.%C, (constants.%I.impl_witness) [concrete = constants.%I.facet] // CHECK:STDOUT: %.loc7_13: %I.type = converted %C.ref, %I.facet [concrete = constants.%I.facet] -// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.730 [concrete = constants.%assoc0] +// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.730 [concrete = constants.%assoc0.6ce] // CHECK:STDOUT: %as_type: type = facet_access_type %.loc7_13 [concrete = constants.%C] // CHECK:STDOUT: %.loc7_18: type = converted %.loc7_13, %as_type [concrete = constants.%C] -// CHECK:STDOUT: %impl.elem0: Core.FloatLiteral = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%float.3fedf4.2] -// CHECK:STDOUT: return %impl.elem0 +// CHECK:STDOUT: %impl.elem0.loc7_18.1: Core.FloatLiteral = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%float.3fedf4.2] +// CHECK:STDOUT: %impl.elem0.loc7_18.2: %.e84 = impl_witness_access constants.%Copy.impl_witness.e23, element0 [concrete = constants.%Core.FloatLiteral.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %impl.elem0.loc7_18.1, %impl.elem0.loc7_18.2 [concrete = constants.%Core.FloatLiteral.as.Copy.impl.Op.bound] +// CHECK:STDOUT: %Core.FloatLiteral.as.Copy.impl.Op.call: init Core.FloatLiteral = call %bound_method(%impl.elem0.loc7_18.1) [concrete = constants.%float.3fedf4.2] +// CHECK:STDOUT: return %Core.FloatLiteral.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_int.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %C: type = class_type @C [concrete] // CHECK:STDOUT: %I.type: type = facet_type <@I> [concrete] @@ -383,17 +456,31 @@ fn F() -> u32 { // CHECK:STDOUT: %I.impl_witness: = impl_witness imports.%I.impl_witness_table [concrete] // CHECK:STDOUT: %I.facet: %I.type = facet_value %C, (%I.impl_witness) [concrete] // CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.05e [concrete] +// CHECK:STDOUT: %assoc0.aac: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.05e [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.bound: = bound_method %int_8, %Int.as.Copy.impl.Op.87e [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] +// CHECK:STDOUT: %bound_method: = bound_method %int_8, %Int.as.Copy.impl.Op.specific_fn [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.I: type = import_ref Main//int, I, loaded [concrete = constants.%I.type] // CHECK:STDOUT: %Main.C: type = import_ref Main//int, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.ba4: %I.assoc_type = import_ref Main//int, loc5_10, loaded [concrete = constants.%assoc0] +// CHECK:STDOUT: %Main.import_ref.ba4: %I.assoc_type = import_ref Main//int, loc5_10, loaded [concrete = constants.%assoc0.aac] // CHECK:STDOUT: %Main.import_ref.330: %i32 = import_ref Main//int, loc10_28, loaded [concrete = constants.%int_8] // CHECK:STDOUT: %I.impl_witness_table = impl_witness_table (%Main.import_ref.330), @C.as.I.impl [concrete] // CHECK:STDOUT: %Main.import_ref.05e: %i32 = import_ref Main//int, loc5_10, loaded [concrete = %val] // CHECK:STDOUT: %val: %i32 = assoc_const_decl @val [concrete] {} +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/types/int, loc21_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() -> %i32 { @@ -402,11 +489,16 @@ fn F() -> u32 { // CHECK:STDOUT: %I.ref: type = name_ref I, imports.%Main.I [concrete = constants.%I.type] // CHECK:STDOUT: %I.facet: %I.type = facet_value constants.%C, (constants.%I.impl_witness) [concrete = constants.%I.facet] // CHECK:STDOUT: %.loc7_13: %I.type = converted %C.ref, %I.facet [concrete = constants.%I.facet] -// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.ba4 [concrete = constants.%assoc0] +// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.ba4 [concrete = constants.%assoc0.aac] // CHECK:STDOUT: %as_type: type = facet_access_type %.loc7_13 [concrete = constants.%C] // CHECK:STDOUT: %.loc7_18: type = converted %.loc7_13, %as_type [concrete = constants.%C] -// CHECK:STDOUT: %impl.elem0: %i32 = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%int_8] -// CHECK:STDOUT: return %impl.elem0 +// CHECK:STDOUT: %impl.elem0.loc7_18.1: %i32 = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%int_8] +// CHECK:STDOUT: %impl.elem0.loc7_18.2: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc7_18.1: = bound_method %impl.elem0.loc7_18.1, %impl.elem0.loc7_18.2 [concrete = constants.%Int.as.Copy.impl.Op.bound] +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0.loc7_18.2, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc7_18.2: = bound_method %impl.elem0.loc7_18.1, %specific_fn [concrete = constants.%bound_method] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc7_18.2(%impl.elem0.loc7_18.1) [concrete = constants.%int_8] +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_int_literal.carbon @@ -418,17 +510,27 @@ fn F() -> u32 { // CHECK:STDOUT: %I.impl_witness: = impl_witness imports.%I.impl_witness_table [concrete] // CHECK:STDOUT: %I.facet: %I.type = facet_value %C, (%I.impl_witness) [concrete] // CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.d59 [concrete] +// CHECK:STDOUT: %assoc0.fd8: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.d59 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.impl_witness.9a8: = impl_witness imports.%Copy.impl_witness_table.529 [concrete] +// CHECK:STDOUT: %Copy.facet.c98: %Copy.type = facet_value Core.IntLiteral, (%Copy.impl_witness.9a8) [concrete] +// CHECK:STDOUT: %.f07: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.c98 [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op.type: type = fn_type @Core.IntLiteral.as.Copy.impl.Op [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op: %Core.IntLiteral.as.Copy.impl.Op.type = struct_value () [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op.bound: = bound_method %int_7, %Core.IntLiteral.as.Copy.impl.Op [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.I: type = import_ref Main//int_literal, I, loaded [concrete = constants.%I.type] // CHECK:STDOUT: %Main.C: type = import_ref Main//int_literal, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.bc2: %I.assoc_type = import_ref Main//int_literal, loc5_10, loaded [concrete = constants.%assoc0] +// CHECK:STDOUT: %Main.import_ref.bc2: %I.assoc_type = import_ref Main//int_literal, loc5_10, loaded [concrete = constants.%assoc0.fd8] // CHECK:STDOUT: %Main.import_ref.bc3: Core.IntLiteral = import_ref Main//int_literal, loc10_28, loaded [concrete = constants.%int_7] // CHECK:STDOUT: %I.impl_witness_table = impl_witness_table (%Main.import_ref.bc3), @C.as.I.impl [concrete] // CHECK:STDOUT: %Main.import_ref.d59: Core.IntLiteral = import_ref Main//int_literal, loc5_10, loaded [concrete = %val] // CHECK:STDOUT: %val: Core.IntLiteral = assoc_const_decl @val [concrete] {} +// CHECK:STDOUT: %Core.import_ref.cac: %Core.IntLiteral.as.Copy.impl.Op.type = import_ref Core//prelude/copy, loc35_31, loaded [concrete = constants.%Core.IntLiteral.as.Copy.impl.Op] +// CHECK:STDOUT: %Copy.impl_witness_table.529 = impl_witness_table (%Core.import_ref.cac), @Core.IntLiteral.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() -> Core.IntLiteral { @@ -437,17 +539,21 @@ fn F() -> u32 { // CHECK:STDOUT: %I.ref: type = name_ref I, imports.%Main.I [concrete = constants.%I.type] // CHECK:STDOUT: %I.facet: %I.type = facet_value constants.%C, (constants.%I.impl_witness) [concrete = constants.%I.facet] // CHECK:STDOUT: %.loc7_13: %I.type = converted %C.ref, %I.facet [concrete = constants.%I.facet] -// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.bc2 [concrete = constants.%assoc0] +// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.bc2 [concrete = constants.%assoc0.fd8] // CHECK:STDOUT: %as_type: type = facet_access_type %.loc7_13 [concrete = constants.%C] // CHECK:STDOUT: %.loc7_18: type = converted %.loc7_13, %as_type [concrete = constants.%C] -// CHECK:STDOUT: %impl.elem0: Core.IntLiteral = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%int_7] -// CHECK:STDOUT: return %impl.elem0 +// CHECK:STDOUT: %impl.elem0.loc7_18.1: Core.IntLiteral = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%int_7] +// CHECK:STDOUT: %impl.elem0.loc7_18.2: %.f07 = impl_witness_access constants.%Copy.impl_witness.9a8, element0 [concrete = constants.%Core.IntLiteral.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %impl.elem0.loc7_18.1, %impl.elem0.loc7_18.2 [concrete = constants.%Core.IntLiteral.as.Copy.impl.Op.bound] +// CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op.call: init Core.IntLiteral = call %bound_method(%impl.elem0.loc7_18.1) [concrete = constants.%int_7] +// CHECK:STDOUT: return %Core.IntLiteral.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- unsigned_uint.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %u32: type = class_type @UInt, @UInt(%int_32) [concrete] // CHECK:STDOUT: %C: type = class_type @C [concrete] // CHECK:STDOUT: %I.type: type = facet_type <@I> [concrete] @@ -455,17 +561,31 @@ fn F() -> u32 { // CHECK:STDOUT: %I.impl_witness: = impl_witness imports.%I.impl_witness_table [concrete] // CHECK:STDOUT: %I.facet: %I.type = facet_value %C, (%I.impl_witness) [concrete] // CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.830 [concrete] +// CHECK:STDOUT: %assoc0.633: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.830 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %UInt.as.Copy.impl.Op.type.464: type = fn_type @UInt.as.Copy.impl.Op, @UInt.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %UInt.as.Copy.impl.Op.be7: %UInt.as.Copy.impl.Op.type.464 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.bf5: = impl_witness imports.%Copy.impl_witness_table.70d, @UInt.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %UInt.as.Copy.impl.Op.type.480: type = fn_type @UInt.as.Copy.impl.Op, @UInt.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %UInt.as.Copy.impl.Op.019: %UInt.as.Copy.impl.Op.type.480 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.bbf: %Copy.type = facet_value %u32, (%Copy.impl_witness.bf5) [concrete] +// CHECK:STDOUT: %.8fb: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.bbf [concrete] +// CHECK:STDOUT: %UInt.as.Copy.impl.Op.bound: = bound_method %int_8, %UInt.as.Copy.impl.Op.019 [concrete] +// CHECK:STDOUT: %UInt.as.Copy.impl.Op.specific_fn: = specific_function %UInt.as.Copy.impl.Op.019, @UInt.as.Copy.impl.Op(%int_32) [concrete] +// CHECK:STDOUT: %bound_method: = bound_method %int_8, %UInt.as.Copy.impl.Op.specific_fn [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.I: type = import_ref Main//uint, I, loaded [concrete = constants.%I.type] // CHECK:STDOUT: %Main.C: type = import_ref Main//uint, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.d18: %I.assoc_type = import_ref Main//uint, loc5_10, loaded [concrete = constants.%assoc0] +// CHECK:STDOUT: %Main.import_ref.d18: %I.assoc_type = import_ref Main//uint, loc5_10, loaded [concrete = constants.%assoc0.633] // CHECK:STDOUT: %Main.import_ref.647: %u32 = import_ref Main//uint, loc10_28, loaded [concrete = constants.%int_8] // CHECK:STDOUT: %I.impl_witness_table = impl_witness_table (%Main.import_ref.647), @C.as.I.impl [concrete] // CHECK:STDOUT: %Main.import_ref.830: %u32 = import_ref Main//uint, loc5_10, loaded [concrete = %val] // CHECK:STDOUT: %val: %u32 = assoc_const_decl @val [concrete] {} +// CHECK:STDOUT: %Core.import_ref.46f: @UInt.as.Copy.impl.%UInt.as.Copy.impl.Op.type (%UInt.as.Copy.impl.Op.type.464) = import_ref Core//prelude/types/uint, loc22_31, loaded [symbolic = @UInt.as.Copy.impl.%UInt.as.Copy.impl.Op (constants.%UInt.as.Copy.impl.Op.be7)] +// CHECK:STDOUT: %Copy.impl_witness_table.70d = impl_witness_table (%Core.import_ref.46f), @UInt.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() -> %u32 { @@ -474,10 +594,15 @@ fn F() -> u32 { // CHECK:STDOUT: %I.ref: type = name_ref I, imports.%Main.I [concrete = constants.%I.type] // CHECK:STDOUT: %I.facet: %I.type = facet_value constants.%C, (constants.%I.impl_witness) [concrete = constants.%I.facet] // CHECK:STDOUT: %.loc7_13: %I.type = converted %C.ref, %I.facet [concrete = constants.%I.facet] -// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.d18 [concrete = constants.%assoc0] +// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.d18 [concrete = constants.%assoc0.633] // CHECK:STDOUT: %as_type: type = facet_access_type %.loc7_13 [concrete = constants.%C] // CHECK:STDOUT: %.loc7_18: type = converted %.loc7_13, %as_type [concrete = constants.%C] -// CHECK:STDOUT: %impl.elem0: %u32 = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%int_8] -// CHECK:STDOUT: return %impl.elem0 +// CHECK:STDOUT: %impl.elem0.loc7_18.1: %u32 = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%int_8] +// CHECK:STDOUT: %impl.elem0.loc7_18.2: %.8fb = impl_witness_access constants.%Copy.impl_witness.bf5, element0 [concrete = constants.%UInt.as.Copy.impl.Op.019] +// CHECK:STDOUT: %bound_method.loc7_18.1: = bound_method %impl.elem0.loc7_18.1, %impl.elem0.loc7_18.2 [concrete = constants.%UInt.as.Copy.impl.Op.bound] +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0.loc7_18.2, @UInt.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%UInt.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc7_18.2: = bound_method %impl.elem0.loc7_18.1, %specific_fn [concrete = constants.%bound_method] +// CHECK:STDOUT: %UInt.as.Copy.impl.Op.call: init %u32 = call %bound_method.loc7_18.2(%impl.elem0.loc7_18.1) [concrete = constants.%int_8] +// CHECK:STDOUT: return %UInt.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/primitives/type_literals.carbon b/toolchain/check/testdata/primitives/type_literals.carbon index 25e6012a25bd..2547674c8dcd 100644 --- a/toolchain/check/testdata/primitives/type_literals.carbon +++ b/toolchain/check/testdata/primitives/type_literals.carbon @@ -440,7 +440,7 @@ var x: type = 42; // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core.import_ref.7bd: %type.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc36_31, loaded [concrete = constants.%type.as.Copy.impl.Op] +// CHECK:STDOUT: %Core.import_ref.7bd: %type.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc40_31, loaded [concrete = constants.%type.as.Copy.impl.Op] // CHECK:STDOUT: %Copy.impl_witness_table.095 = impl_witness_table (%Core.import_ref.7bd), @type.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/code_after_return_value.carbon b/toolchain/check/testdata/return/code_after_return_value.carbon index 6843335e71f6..0f7c65b7cb41 100644 --- a/toolchain/check/testdata/return/code_after_return_value.carbon +++ b/toolchain/check/testdata/return/code_after_return_value.carbon @@ -108,8 +108,7 @@ fn F(b: bool) -> i32 { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc16_11.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method.698] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc16_11.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc16_11.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc16_11.2: %i32 = converted %int_0, %.loc16_11.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: return %.loc16_11.2 +// CHECK:STDOUT: %.loc16: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] +// CHECK:STDOUT: return %.loc16 to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/fail_call_in_type.carbon b/toolchain/check/testdata/return/fail_call_in_type.carbon index 4128c7da7275..fec696afcdee 100644 --- a/toolchain/check/testdata/return/fail_call_in_type.carbon +++ b/toolchain/check/testdata/return/fail_call_in_type.carbon @@ -31,6 +31,14 @@ fn Six() -> ReturnType() { return 6; } // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Copy.impl_witness.fde: = impl_witness imports.%Copy.impl_witness_table.095 [concrete] +// CHECK:STDOUT: %Copy.facet.0af: %Copy.type = facet_value type, (%Copy.impl_witness.fde) [concrete] +// CHECK:STDOUT: %.130: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.0af [concrete] +// CHECK:STDOUT: %type.as.Copy.impl.Op.type: type = fn_type @type.as.Copy.impl.Op [concrete] +// CHECK:STDOUT: %type.as.Copy.impl.Op: %type.as.Copy.impl.Op.type = struct_value () [concrete] +// CHECK:STDOUT: %type.as.Copy.impl.Op.bound: = bound_method %i32, %type.as.Copy.impl.Op [concrete] // CHECK:STDOUT: %Six.type: type = fn_type @Six [concrete] // CHECK:STDOUT: %Six: %Six.type = struct_value () [concrete] // CHECK:STDOUT: %int_6: Core.IntLiteral = int_value 6 [concrete] @@ -39,10 +47,14 @@ fn Six() -> ReturnType() { return 6; } // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.7bd: %type.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc40_31, loaded [concrete = constants.%type.as.Copy.impl.Op] +// CHECK:STDOUT: %Copy.impl_witness_table.095 = impl_witness_table (%Core.import_ref.7bd), @type.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -76,12 +88,15 @@ fn Six() -> ReturnType() { return 6; } // CHECK:STDOUT: !entry: // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: return %i32 +// CHECK:STDOUT: %impl.elem0: %.130 = impl_witness_access constants.%Copy.impl_witness.fde, element0 [concrete = constants.%type.as.Copy.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %i32, %impl.elem0 [concrete = constants.%type.as.Copy.impl.Op.bound] +// CHECK:STDOUT: %type.as.Copy.impl.Op.call: init type = call %bound_method(%i32) [concrete = constants.%i32] +// CHECK:STDOUT: return %type.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Six() -> { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %int_6: Core.IntLiteral = int_value 6 [concrete = constants.%int_6] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/fail_let_in_type.carbon b/toolchain/check/testdata/return/fail_let_in_type.carbon index 3e5f911966b6..d57d274a9610 100644 --- a/toolchain/check/testdata/return/fail_let_in_type.carbon +++ b/toolchain/check/testdata/return/fail_let_in_type.carbon @@ -125,19 +125,19 @@ fn FirstPerfectNumber() -> z { return 6; } // CHECK:STDOUT: fn @Six() -> { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %int_6: Core.IntLiteral = int_value 6 [concrete = constants.%int_6] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @HalfDozen() -> { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %int_6: Core.IntLiteral = int_value 6 [concrete = constants.%int_6] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @FirstPerfectNumber() -> { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %int_6: Core.IntLiteral = int_value 6 [concrete = constants.%int_6] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/return/fail_returned_var_shadow.carbon b/toolchain/check/testdata/return/fail_returned_var_shadow.carbon index 909ccdc937ac..5832f4da5c8a 100644 --- a/toolchain/check/testdata/return/fail_returned_var_shadow.carbon +++ b/toolchain/check/testdata/return/fail_returned_var_shadow.carbon @@ -179,8 +179,7 @@ fn DifferentScopes() -> i32 { // CHECK:STDOUT: %specific_fn.loc27: = specific_function %impl.elem0.loc27, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc27_11.2: = bound_method %int_0.loc27, %specific_fn.loc27 [concrete = constants.%bound_method.698] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc27: init %i32 = call %bound_method.loc27_11.2(%int_0.loc27) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc27_11.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc27 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc27_11.2: %i32 = converted %int_0.loc27, %.loc27_11.1 [concrete = constants.%int_0.6a9] +// CHECK:STDOUT: %.loc27: init %i32 = converted %int_0.loc27, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc27 [concrete = constants.%int_0.6a9] // CHECK:STDOUT: %Int.as.Destroy.impl.Op.bound.loc25: = bound_method %w.var, constants.%Int.as.Destroy.impl.Op.054 // CHECK:STDOUT: %Int.as.Destroy.impl.Op.specific_fn.1: = specific_function constants.%Int.as.Destroy.impl.Op.054, @Int.as.Destroy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Destroy.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc25_14.3: = bound_method %w.var, %Int.as.Destroy.impl.Op.specific_fn.1 @@ -191,7 +190,7 @@ fn DifferentScopes() -> i32 { // CHECK:STDOUT: %bound_method.loc17_14.3: = bound_method %v.var, %Int.as.Destroy.impl.Op.specific_fn.2 // CHECK:STDOUT: %addr.loc17: %ptr.235 = addr_of %v.var // CHECK:STDOUT: %Int.as.Destroy.impl.Op.call.loc17: init %empty_tuple.type = call %bound_method.loc17_14.3(%addr.loc17) -// CHECK:STDOUT: return %.loc27_11.2 +// CHECK:STDOUT: return %.loc27 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @DifferentScopes() -> %i32 { @@ -252,8 +251,7 @@ fn DifferentScopes() -> i32 { // CHECK:STDOUT: %specific_fn.loc44: = specific_function %impl.elem0.loc44, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc44_11.2: = bound_method %int_0.loc44, %specific_fn.loc44 [concrete = constants.%bound_method.698] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc44: init %i32 = call %bound_method.loc44_11.2(%int_0.loc44) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc44_11.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc44 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc44_11.2: %i32 = converted %int_0.loc44, %.loc44_11.1 [concrete = constants.%int_0.6a9] +// CHECK:STDOUT: %.loc44: init %i32 = converted %int_0.loc44, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc44 [concrete = constants.%int_0.6a9] // CHECK:STDOUT: %Int.as.Destroy.impl.Op.bound.loc41: = bound_method %w.var, constants.%Int.as.Destroy.impl.Op.054 // CHECK:STDOUT: %Int.as.Destroy.impl.Op.specific_fn.1: = specific_function constants.%Int.as.Destroy.impl.Op.054, @Int.as.Destroy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Destroy.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc41_16.3: = bound_method %w.var, %Int.as.Destroy.impl.Op.specific_fn.1 @@ -264,6 +262,6 @@ fn DifferentScopes() -> i32 { // CHECK:STDOUT: %bound_method.loc32_14.3: = bound_method %v.var, %Int.as.Destroy.impl.Op.specific_fn.2 // CHECK:STDOUT: %addr.loc32: %ptr.235 = addr_of %v.var // CHECK:STDOUT: %Int.as.Destroy.impl.Op.call.loc32: init %empty_tuple.type = call %bound_method.loc32_14.3(%addr.loc32) -// CHECK:STDOUT: return %.loc44_11.2 +// CHECK:STDOUT: return %.loc44 to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/fail_type_mismatch.carbon b/toolchain/check/testdata/return/fail_type_mismatch.carbon index 3dc6b1ba3a0c..1bb71b9efcc9 100644 --- a/toolchain/check/testdata/return/fail_type_mismatch.carbon +++ b/toolchain/check/testdata/return/fail_type_mismatch.carbon @@ -70,6 +70,6 @@ fn Main() -> i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %float: Core.FloatLiteral = float_literal_value 10e-1 [concrete = constants.%float] // CHECK:STDOUT: %.loc23: %i32 = converted %float, [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/fail_var_in_type.carbon b/toolchain/check/testdata/return/fail_var_in_type.carbon index 2e9df2532ccb..767c46ea13a8 100644 --- a/toolchain/check/testdata/return/fail_var_in_type.carbon +++ b/toolchain/check/testdata/return/fail_var_in_type.carbon @@ -49,7 +49,7 @@ fn Six() -> x { return 6; } // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] -// CHECK:STDOUT: %Core.import_ref.7bd: %type.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc36_31, loaded [concrete = constants.%type.as.Copy.impl.Op] +// CHECK:STDOUT: %Core.import_ref.7bd: %type.as.Copy.impl.Op.type = import_ref Core//prelude/parts/copy, loc40_31, loaded [concrete = constants.%type.as.Copy.impl.Op] // CHECK:STDOUT: %Copy.impl_witness_table.095 = impl_witness_table (%Core.import_ref.7bd), @type.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -80,7 +80,7 @@ fn Six() -> x { return 6; } // CHECK:STDOUT: fn @Six() -> { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %int_6: Core.IntLiteral = int_value 6 [concrete = constants.%int_6] -// CHECK:STDOUT: return +// CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { diff --git a/toolchain/check/testdata/return/returned_var_scope.carbon b/toolchain/check/testdata/return/returned_var_scope.carbon index 16ae5220d6f3..b64632f8ef14 100644 --- a/toolchain/check/testdata/return/returned_var_scope.carbon +++ b/toolchain/check/testdata/return/returned_var_scope.carbon @@ -187,8 +187,7 @@ fn EnclosingButAfter(b: bool) -> i32 { // CHECK:STDOUT: %specific_fn.loc22: = specific_function %impl.elem0.loc22, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc22_11.2: = bound_method %int_0.loc22, %specific_fn.loc22 [concrete = constants.%bound_method.698] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc22: init %i32 = call %bound_method.loc22_11.2(%int_0.loc22) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc22_11.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc22 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc22_11.2: %i32 = converted %int_0.loc22, %.loc22_11.1 [concrete = constants.%int_0.6a9] +// CHECK:STDOUT: %.loc22: init %i32 = converted %int_0.loc22, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc22 [concrete = constants.%int_0.6a9] // CHECK:STDOUT: %Int.as.Destroy.impl.Op.bound.loc20: = bound_method %w.var, constants.%Int.as.Destroy.impl.Op.054 // CHECK:STDOUT: %Int.as.Destroy.impl.Op.specific_fn.1: = specific_function constants.%Int.as.Destroy.impl.Op.054, @Int.as.Destroy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Destroy.impl.Op.specific_fn] // CHECK:STDOUT: %bound_method.loc20_14.3: = bound_method %w.var, %Int.as.Destroy.impl.Op.specific_fn.1 @@ -199,7 +198,7 @@ fn EnclosingButAfter(b: bool) -> i32 { // CHECK:STDOUT: %bound_method.loc17_14.3: = bound_method %v.var, %Int.as.Destroy.impl.Op.specific_fn.2 // CHECK:STDOUT: %addr.loc17: %ptr.235 = addr_of %v.var // CHECK:STDOUT: %Int.as.Destroy.impl.Op.call.loc17: init %empty_tuple.type = call %bound_method.loc17_14.3(%addr.loc17) -// CHECK:STDOUT: return %.loc22_11.2 +// CHECK:STDOUT: return %.loc22 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @EnclosingButAfter(%b.param: bool) -> %i32 { diff --git a/toolchain/check/testdata/return/struct.carbon b/toolchain/check/testdata/return/struct.carbon index 5198a8eadd2a..05d478ef7694 100644 --- a/toolchain/check/testdata/return/struct.carbon +++ b/toolchain/check/testdata/return/struct.carbon @@ -88,10 +88,9 @@ fn Main() -> {.a: i32} { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc16_17.2: = bound_method %int_3, %specific_fn [concrete = constants.%bound_method] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc16_17.2(%int_3) [concrete = constants.%int_3.822] -// CHECK:STDOUT: %.loc16_17.2: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_3.822] -// CHECK:STDOUT: %.loc16_17.3: %i32 = converted %int_3, %.loc16_17.2 [concrete = constants.%int_3.822] -// CHECK:STDOUT: %struct: %struct_type.a.ba9 = struct_value (%.loc16_17.3) [concrete = constants.%struct] -// CHECK:STDOUT: %.loc16_18: %struct_type.a.ba9 = converted %.loc16_17.1, %struct [concrete = constants.%struct] -// CHECK:STDOUT: return %.loc16_18 +// CHECK:STDOUT: %.loc16_17.2: init %i32 = converted %int_3, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_3.822] +// CHECK:STDOUT: %.loc16_17.3: init %struct_type.a.ba9 = struct_init (%.loc16_17.2) to %return [concrete = constants.%struct] +// CHECK:STDOUT: %.loc16_18: init %struct_type.a.ba9 = converted %.loc16_17.1, %.loc16_17.3 [concrete = constants.%struct] +// CHECK:STDOUT: return %.loc16_18 to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/value.carbon b/toolchain/check/testdata/return/value.carbon index 275da756d11f..96ca60008b1f 100644 --- a/toolchain/check/testdata/return/value.carbon +++ b/toolchain/check/testdata/return/value.carbon @@ -83,8 +83,7 @@ fn Main() -> i32 { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc16_11.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc16_11.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc16_11.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc16_11.2: %i32 = converted %int_0, %.loc16_11.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: return %.loc16_11.2 +// CHECK:STDOUT: %.loc16: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.6a9] +// CHECK:STDOUT: return %.loc16 to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/import.carbon b/toolchain/check/testdata/struct/import.carbon index 805f1ea9f143..22e9198479e0 100644 --- a/toolchain/check/testdata/struct/import.carbon +++ b/toolchain/check/testdata/struct/import.carbon @@ -282,6 +282,7 @@ fn F() -> {.x: i32} { // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %struct_type.x: type = struct_type {.x: %i32} [concrete] // CHECK:STDOUT: %C: type = class_type @C [concrete] @@ -291,17 +292,31 @@ fn F() -> {.x: i32} { // CHECK:STDOUT: %I.impl_witness: = impl_witness imports.%I.impl_witness_table [concrete] // CHECK:STDOUT: %I.facet: %I.type = facet_value %C, (%I.impl_witness) [concrete] // CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.380 [concrete] +// CHECK:STDOUT: %assoc0.862: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.380 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.bound: = bound_method %int_1, %Int.as.Copy.impl.Op.87e [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] +// CHECK:STDOUT: %bound_method: = bound_method %int_1, %Int.as.Copy.impl.Op.specific_fn [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.I: type = import_ref Main//symbolic_decl, I, loaded [concrete = constants.%I.type] // CHECK:STDOUT: %Main.C: type = import_ref Main//symbolic_decl, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.1fc: %I.assoc_type = import_ref Main//symbolic_decl, loc5_10, loaded [concrete = constants.%assoc0] +// CHECK:STDOUT: %Main.import_ref.1fc: %I.assoc_type = import_ref Main//symbolic_decl, loc5_10, loaded [concrete = constants.%assoc0.862] // CHECK:STDOUT: %Main.import_ref.1ec: %struct_type.x = import_ref Main//symbolic_decl, loc10_35, loaded [concrete = constants.%struct] // CHECK:STDOUT: %I.impl_witness_table = impl_witness_table (%Main.import_ref.1ec), @C.as.I.impl [concrete] // CHECK:STDOUT: %Main.import_ref.380: %struct_type.x = import_ref Main//symbolic_decl, loc5_10, loaded [concrete = %val] // CHECK:STDOUT: %val: %struct_type.x = assoc_const_decl @val [concrete] {} +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() -> %struct_type.x { @@ -310,10 +325,18 @@ fn F() -> {.x: i32} { // CHECK:STDOUT: %I.ref: type = name_ref I, imports.%Main.I [concrete = constants.%I.type] // CHECK:STDOUT: %I.facet: %I.type = facet_value constants.%C, (constants.%I.impl_witness) [concrete = constants.%I.facet] // CHECK:STDOUT: %.loc7_13: %I.type = converted %C.ref, %I.facet [concrete = constants.%I.facet] -// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.1fc [concrete = constants.%assoc0] +// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.1fc [concrete = constants.%assoc0.862] // CHECK:STDOUT: %as_type: type = facet_access_type %.loc7_13 [concrete = constants.%C] -// CHECK:STDOUT: %.loc7_18: type = converted %.loc7_13, %as_type [concrete = constants.%C] -// CHECK:STDOUT: %impl.elem0: %struct_type.x = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%struct] -// CHECK:STDOUT: return %impl.elem0 +// CHECK:STDOUT: %.loc7_18.1: type = converted %.loc7_13, %as_type [concrete = constants.%C] +// CHECK:STDOUT: %impl.elem0.loc7_18.1: %struct_type.x = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%struct] +// CHECK:STDOUT: %.loc7_18.2: %i32 = struct_access %impl.elem0.loc7_18.1, element0 [concrete = constants.%int_1] +// CHECK:STDOUT: %impl.elem0.loc7_18.2: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc7_18.1: = bound_method %.loc7_18.2, %impl.elem0.loc7_18.2 [concrete = constants.%Int.as.Copy.impl.Op.bound] +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0.loc7_18.2, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc7_18.2: = bound_method %.loc7_18.2, %specific_fn [concrete = constants.%bound_method] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc7_18.2(%.loc7_18.2) [concrete = constants.%int_1] +// CHECK:STDOUT: %.loc7_18.3: init %struct_type.x = struct_init (%Int.as.Copy.impl.Op.call) to %return [concrete = constants.%struct] +// CHECK:STDOUT: %.loc7_22: init %struct_type.x = converted %impl.elem0.loc7_18.1, %.loc7_18.3 [concrete = constants.%struct] +// CHECK:STDOUT: return %.loc7_22 to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/literal_member_access.carbon b/toolchain/check/testdata/struct/literal_member_access.carbon index f37f57f687cc..d281cf21dc04 100644 --- a/toolchain/check/testdata/struct/literal_member_access.carbon +++ b/toolchain/check/testdata/struct/literal_member_access.carbon @@ -25,6 +25,7 @@ fn F() -> i32 { // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %struct_type.x.y.z: type = struct_type {.x: %i32, .y: %i32, .z: %i32} [concrete] // CHECK:STDOUT: %pattern_type.c6b: type = pattern_type %struct_type.x.y.z [concrete] @@ -37,6 +38,16 @@ fn F() -> i32 { // CHECK:STDOUT: %ptr.6eb: type = ptr_type %struct_type.x.y.z [concrete] // CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete] // CHECK:STDOUT: %struct_type.a.b.c.4ca: type = struct_type {.a: Core.IntLiteral, .b: %struct_type.x.y.z, .c: Core.IntLiteral} [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.type.d3f: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%struct_type.x.y.z) [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.960: %T.as.Destroy.impl.Op.type.d3f = struct_value () [concrete] @@ -46,11 +57,15 @@ fn F() -> i32 { // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { // CHECK:STDOUT: .Int = %Core.Int +// CHECK:STDOUT: .Copy = %Core.Copy // CHECK:STDOUT: .Destroy = %Core.Destroy // CHECK:STDOUT: import Core//prelude // CHECK:STDOUT: import Core//prelude/... // CHECK:STDOUT: } // CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic] +// CHECK:STDOUT: %Core.Copy: type = import_ref Core//prelude/parts/copy, Copy, loaded [concrete = constants.%Copy.type] +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -109,11 +124,16 @@ fn F() -> i32 { // CHECK:STDOUT: %.loc18_35.3: %struct_type.a.b.c.4ca = converted %.loc18_35.1, %struct.loc18_35 // CHECK:STDOUT: %.loc18_36: %struct_type.x.y.z = struct_access %.loc18_35.3, element1 // CHECK:STDOUT: %.loc18_38: %i32 = struct_access %.loc18_36, element1 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc18_38.1: = bound_method %.loc18_38, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc18_38.2: = bound_method %.loc18_38, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc18_38.2(%.loc18_38) // CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %.loc18_26.2, constants.%T.as.Destroy.impl.Op.960 // CHECK:STDOUT: %T.as.Destroy.impl.Op.specific_fn: = specific_function constants.%T.as.Destroy.impl.Op.960, @T.as.Destroy.impl.Op(constants.%struct_type.x.y.z) [concrete = constants.%T.as.Destroy.impl.Op.specific_fn] -// CHECK:STDOUT: %bound_method: = bound_method %.loc18_26.2, %T.as.Destroy.impl.Op.specific_fn +// CHECK:STDOUT: %bound_method.loc18_26: = bound_method %.loc18_26.2, %T.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr: %ptr.6eb = addr_of %.loc18_26.2 -// CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method(%addr) -// CHECK:STDOUT: return %.loc18_38 +// CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc18_26(%addr) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/tuple/element_access.carbon b/toolchain/check/testdata/tuple/element_access.carbon index 3ea5b46cf881..921e74a4a22a 100644 --- a/toolchain/check/testdata/tuple/element_access.carbon +++ b/toolchain/check/testdata/tuple/element_access.carbon @@ -390,17 +390,30 @@ var b: i32 = a.({.index = 2}.index); // CHECK:STDOUT: constants { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %tuple.type.a1c: type = tuple_type (%i32) [concrete] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.type.68f: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%tuple.type.a1c) [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.976: %T.as.Destroy.impl.Op.type.68f = struct_value () [concrete] // CHECK:STDOUT: %ptr.0b7: type = ptr_type %tuple.type.a1c [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Run() -> %i32 { @@ -412,11 +425,16 @@ var b: i32 = a.({.index = 2}.index); // CHECK:STDOUT: %.loc7_12.2: ref %tuple.type.a1c = temporary %.loc7_12.1, %F.call // CHECK:STDOUT: %tuple.elem0: ref %i32 = tuple_access %.loc7_12.2, element0 // CHECK:STDOUT: %.loc7_13: %i32 = bind_value %tuple.elem0 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc7_13.1: = bound_method %.loc7_13, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc7_13.2: = bound_method %.loc7_13, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc7_13.2(%.loc7_13) // CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %.loc7_12.2, constants.%T.as.Destroy.impl.Op.976 // CHECK:STDOUT: -// CHECK:STDOUT: %bound_method: = bound_method %.loc7_12.2, %T.as.Destroy.impl.Op.specific_fn +// CHECK:STDOUT: %bound_method.loc7_12: = bound_method %.loc7_12.2, %T.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr: %ptr.0b7 = addr_of %.loc7_12.2 -// CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method(%addr) -// CHECK:STDOUT: return %.loc7_13 +// CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc7_12(%addr) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/tuple/import.carbon b/toolchain/check/testdata/tuple/import.carbon index 1655af493a9c..a13c54a41545 100644 --- a/toolchain/check/testdata/tuple/import.carbon +++ b/toolchain/check/testdata/tuple/import.carbon @@ -310,6 +310,7 @@ fn F() -> (i32,) { // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %tuple.type.a1c: type = tuple_type (%i32) [concrete] // CHECK:STDOUT: %C: type = class_type @C [concrete] @@ -319,17 +320,31 @@ fn F() -> (i32,) { // CHECK:STDOUT: %I.impl_witness: = impl_witness imports.%I.impl_witness_table [concrete] // CHECK:STDOUT: %I.facet: %I.type = facet_value %C, (%I.impl_witness) [concrete] // CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.23f [concrete] +// CHECK:STDOUT: %assoc0.2ff: %I.assoc_type = assoc_entity element0, imports.%Main.import_ref.23f [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.bound: = bound_method %int_1, %Int.as.Copy.impl.Op.87e [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] +// CHECK:STDOUT: %bound_method: = bound_method %int_1, %Int.as.Copy.impl.Op.specific_fn [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.I: type = import_ref Main//symbolic_decl, I, loaded [concrete = constants.%I.type] // CHECK:STDOUT: %Main.C: type = import_ref Main//symbolic_decl, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.c77: %I.assoc_type = import_ref Main//symbolic_decl, loc5_10, loaded [concrete = constants.%assoc0] +// CHECK:STDOUT: %Main.import_ref.c77: %I.assoc_type = import_ref Main//symbolic_decl, loc5_10, loaded [concrete = constants.%assoc0.2ff] // CHECK:STDOUT: %Main.import_ref.fd7: %tuple.type.a1c = import_ref Main//symbolic_decl, loc10_31, loaded [concrete = constants.%tuple] // CHECK:STDOUT: %I.impl_witness_table = impl_witness_table (%Main.import_ref.fd7), @C.as.I.impl [concrete] // CHECK:STDOUT: %Main.import_ref.23f: %tuple.type.a1c = import_ref Main//symbolic_decl, loc5_10, loaded [concrete = %val] // CHECK:STDOUT: %val: %tuple.type.a1c = assoc_const_decl @val [concrete] {} +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() -> %tuple.type.a1c { @@ -338,10 +353,18 @@ fn F() -> (i32,) { // CHECK:STDOUT: %I.ref: type = name_ref I, imports.%Main.I [concrete = constants.%I.type] // CHECK:STDOUT: %I.facet: %I.type = facet_value constants.%C, (constants.%I.impl_witness) [concrete = constants.%I.facet] // CHECK:STDOUT: %.loc7_13: %I.type = converted %C.ref, %I.facet [concrete = constants.%I.facet] -// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.c77 [concrete = constants.%assoc0] +// CHECK:STDOUT: %val.ref: %I.assoc_type = name_ref val, imports.%Main.import_ref.c77 [concrete = constants.%assoc0.2ff] // CHECK:STDOUT: %as_type: type = facet_access_type %.loc7_13 [concrete = constants.%C] -// CHECK:STDOUT: %.loc7_18: type = converted %.loc7_13, %as_type [concrete = constants.%C] -// CHECK:STDOUT: %impl.elem0: %tuple.type.a1c = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%tuple] -// CHECK:STDOUT: return %impl.elem0 +// CHECK:STDOUT: %.loc7_18.1: type = converted %.loc7_13, %as_type [concrete = constants.%C] +// CHECK:STDOUT: %impl.elem0.loc7_18.1: %tuple.type.a1c = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%tuple] +// CHECK:STDOUT: %tuple.elem0: %i32 = tuple_access %impl.elem0.loc7_18.1, element0 [concrete = constants.%int_1] +// CHECK:STDOUT: %impl.elem0.loc7_18.2: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc7_18.1: = bound_method %tuple.elem0, %impl.elem0.loc7_18.2 [concrete = constants.%Int.as.Copy.impl.Op.bound] +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0.loc7_18.2, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc7_18.2: = bound_method %tuple.elem0, %specific_fn [concrete = constants.%bound_method] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc7_18.2(%tuple.elem0) [concrete = constants.%int_1] +// CHECK:STDOUT: %.loc7_18.2: init %tuple.type.a1c = tuple_init (%Int.as.Copy.impl.Op.call) to %return [concrete = constants.%tuple] +// CHECK:STDOUT: %.loc7_22: init %tuple.type.a1c = converted %impl.elem0.loc7_18.1, %.loc7_18.2 [concrete = constants.%tuple] +// CHECK:STDOUT: return %.loc7_22 to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/tuple/in_place_tuple_init.carbon b/toolchain/check/testdata/tuple/in_place_tuple_init.carbon index 5d7cd4b99968..37b723719921 100644 --- a/toolchain/check/testdata/tuple/in_place_tuple_init.carbon +++ b/toolchain/check/testdata/tuple/in_place_tuple_init.carbon @@ -51,6 +51,7 @@ fn H() { // CHECK:STDOUT: constants { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %N: Core.IntLiteral = bind_symbolic_name N, 0 [symbolic] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %tuple.type.24b: type = tuple_type (type, type) [concrete] // CHECK:STDOUT: %tuple.type.d07: type = tuple_type (%i32, %i32) [concrete] @@ -63,9 +64,21 @@ fn H() { // CHECK:STDOUT: %T.as.Destroy.impl.Op.type.623: type = fn_type @T.as.Destroy.impl.Op, @T.as.Destroy.impl(%tuple.type.d07) [concrete] // CHECK:STDOUT: %T.as.Destroy.impl.Op.55d: %T.as.Destroy.impl.Op.type.623 = struct_value () [concrete] // CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete] +// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] +// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.857: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.6aa: %Int.as.Copy.impl.Op.type.857 = struct_value () [symbolic] +// CHECK:STDOUT: %Copy.impl_witness.f0b: = impl_witness imports.%Copy.impl_witness_table.f59, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.af5: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.87e: %Int.as.Copy.impl.Op.type.af5 = struct_value () [concrete] +// CHECK:STDOUT: %Copy.facet.26d: %Copy.type = facet_value %i32, (%Copy.impl_witness.f0b) [concrete] +// CHECK:STDOUT: %.3c4: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.26d [concrete] +// CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.87e, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core.import_ref.b3c: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.857) = import_ref Core//prelude/parts/int, loc17_31, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.6aa)] +// CHECK:STDOUT: %Copy.impl_witness_table.f59 = impl_witness_table (%Core.import_ref.b3c), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G() -> %return.param: %tuple.type.d07 { @@ -113,12 +126,17 @@ fn H() { // CHECK:STDOUT: %.loc15_12.2: ref %tuple.type.d07 = temporary %.loc15_12.1, %G.call // CHECK:STDOUT: %tuple.elem0: ref %i32 = tuple_access %.loc15_12.2, element0 // CHECK:STDOUT: %.loc15_13: %i32 = bind_value %tuple.elem0 +// CHECK:STDOUT: %impl.elem0: %.3c4 = impl_witness_access constants.%Copy.impl_witness.f0b, element0 [concrete = constants.%Int.as.Copy.impl.Op.87e] +// CHECK:STDOUT: %bound_method.loc15_13.1: = bound_method %.loc15_13, %impl.elem0 +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn] +// CHECK:STDOUT: %bound_method.loc15_13.2: = bound_method %.loc15_13, %specific_fn +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc15_13.2(%.loc15_13) // CHECK:STDOUT: %T.as.Destroy.impl.Op.bound: = bound_method %.loc15_12.2, constants.%T.as.Destroy.impl.Op.55d // CHECK:STDOUT: -// CHECK:STDOUT: %bound_method: = bound_method %.loc15_12.2, %T.as.Destroy.impl.Op.specific_fn +// CHECK:STDOUT: %bound_method.loc15_12: = bound_method %.loc15_12.2, %T.as.Destroy.impl.Op.specific_fn // CHECK:STDOUT: %addr: %ptr.261 = addr_of %.loc15_12.2 -// CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method(%addr) -// CHECK:STDOUT: return %.loc15_13 +// CHECK:STDOUT: %T.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method.loc15_12(%addr) +// CHECK:STDOUT: return %Int.as.Copy.impl.Op.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- nested_tuple_in_place.carbon diff --git a/toolchain/check/testdata/var/global_decl_import.carbon b/toolchain/check/testdata/var/global_decl_import.carbon index c8dce37a9c56..375740f9ada1 100644 --- a/toolchain/check/testdata/var/global_decl_import.carbon +++ b/toolchain/check/testdata/var/global_decl_import.carbon @@ -95,10 +95,11 @@ fn G() -> {.v: ()} { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %x.ref: ref %struct_type.v = name_ref x, imports.%Main.x [concrete = imports.%x.var] // CHECK:STDOUT: %.loc7_10.1: ref %empty_tuple.type = struct_access %x.ref, element0 [concrete = constants.%.01b] -// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc7_10.2: %empty_tuple.type = converted %.loc7_10.1, %tuple [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %struct: %struct_type.v = struct_value (%.loc7_10.2) [concrete = constants.%struct] -// CHECK:STDOUT: %.loc7_11: %struct_type.v = converted %x.ref, %struct [concrete = constants.%struct] -// CHECK:STDOUT: return %.loc7_11 +// CHECK:STDOUT: %.loc7_10.2: ref %empty_tuple.type = struct_access %return, element0 +// CHECK:STDOUT: %.loc7_10.3: init %empty_tuple.type = tuple_init () to %.loc7_10.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc7_10.4: init %empty_tuple.type = converted %.loc7_10.1, %.loc7_10.3 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc7_10.5: init %struct_type.v = struct_init (%.loc7_10.4) to %return [concrete = constants.%struct] +// CHECK:STDOUT: %.loc7_11: init %struct_type.v = converted %x.ref, %.loc7_10.5 [concrete = constants.%struct] +// CHECK:STDOUT: return %.loc7_11 to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/lower/testdata/array/iterate.carbon b/toolchain/lower/testdata/array/iterate.carbon index 902e556688b1..1773147f845b 100644 --- a/toolchain/lower/testdata/array/iterate.carbon +++ b/toolchain/lower/testdata/array/iterate.carbon @@ -102,7 +102,7 @@ fn F() { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: define linkonce_odr void @"_COp.Int.Core:Inc.Core.be1e879c1ad406d8"(ptr %self) !dbg !32 { -// CHECK:STDOUT: call void @"_COp:thunk.Int.Core:AddAssignWith.Core.f86036ee2cd10fd3"(ptr %self, i32 1), !dbg !34 +// CHECK:STDOUT: call void @"_COp:thunk.Int.Core:AddAssignWith.Core.4a5a226f8a6e3b2b"(ptr %self, i32 1), !dbg !34 // CHECK:STDOUT: ret void, !dbg !35 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -120,15 +120,15 @@ fn F() { // CHECK:STDOUT: ret void, !dbg !41 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.Core:AddAssignWith.Core.f86036ee2cd10fd3"(ptr %self, i32 %other) !dbg !42 { -// CHECK:STDOUT: %1 = call i32 @"_CConvert.8b3d5d6a6c17be04:ImplicitAs.Core.1abd39b699024258"(i32 %other), !dbg !43 +// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.Core:AddAssignWith.Core.4a5a226f8a6e3b2b"(ptr %self, i32 %other) !dbg !42 { +// CHECK:STDOUT: %1 = call i32 @"_CConvert.b231851fa37df4cd:ImplicitAs.Core.bdf1c23a2a8f93cd"(i32 %other), !dbg !43 // CHECK:STDOUT: %2 = load i32, ptr %self, align 4, !dbg !44 // CHECK:STDOUT: %3 = add i32 %2, %1, !dbg !44 // CHECK:STDOUT: store i32 %3, ptr %self, align 4, !dbg !44 // CHECK:STDOUT: ret void, !dbg !44 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.8b3d5d6a6c17be04:ImplicitAs.Core.1abd39b699024258"(i32 %self) !dbg !45 { +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.b231851fa37df4cd:ImplicitAs.Core.bdf1c23a2a8f93cd"(i32 %self) !dbg !45 { // CHECK:STDOUT: ret i32 %self, !dbg !47 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -183,9 +183,9 @@ fn F() { // CHECK:STDOUT: !39 = distinct !DISubprogram(name: "None", linkageName: "_CNone.Optional.Core.b7c8e4dff2adcdaa", scope: null, file: !26, line: 20, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !40 = !DILocation(line: 22, column: 5, scope: !39) // CHECK:STDOUT: !41 = !DILocation(line: 23, column: 5, scope: !39) -// CHECK:STDOUT: !42 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.Core:AddAssignWith.Core.f86036ee2cd10fd3", scope: null, file: !33, line: 275, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !42 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.Core:AddAssignWith.Core.4a5a226f8a6e3b2b", scope: null, file: !33, line: 275, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !43 = !DILocation(line: 4294967295, scope: !42) // CHECK:STDOUT: !44 = !DILocation(line: 275, column: 3, scope: !42) -// CHECK:STDOUT: !45 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.8b3d5d6a6c17be04:ImplicitAs.Core.1abd39b699024258", scope: null, file: !46, line: 23, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !45 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.b231851fa37df4cd:ImplicitAs.Core.bdf1c23a2a8f93cd", scope: null, file: !46, line: 24, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !46 = !DIFile(filename: "{{.*}}/prelude/operators/as.carbon", directory: "") -// CHECK:STDOUT: !47 = !DILocation(line: 23, column: 38, scope: !45) +// CHECK:STDOUT: !47 = !DILocation(line: 24, column: 38, scope: !45) diff --git a/toolchain/lower/testdata/builtins/bool.carbon b/toolchain/lower/testdata/builtins/bool.carbon index 9959c30133a6..4d89fbc6391b 100644 --- a/toolchain/lower/testdata/builtins/bool.carbon +++ b/toolchain/lower/testdata/builtins/bool.carbon @@ -2,7 +2,7 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // -// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/none.carbon +// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/convert.carbon // // AUTOUPDATE // TIP: To test this file alone, run: diff --git a/toolchain/lower/testdata/builtins/no_op.carbon b/toolchain/lower/testdata/builtins/no_op.carbon index 4772c457d3c0..99907f0430f3 100644 --- a/toolchain/lower/testdata/builtins/no_op.carbon +++ b/toolchain/lower/testdata/builtins/no_op.carbon @@ -50,26 +50,24 @@ fn J() { // CHECK:STDOUT: // CHECK:STDOUT: define void @_CH.Main() !dbg !11 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %.loc27_18.1.temp = alloca {}, align 8, !dbg !12 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc27_18.1.temp), !dbg !12 -// CHECK:STDOUT: ret void, !dbg !13 +// CHECK:STDOUT: ret void, !dbg !12 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: declare void @_CI.Main() // CHECK:STDOUT: -// CHECK:STDOUT: define void @_CJ.Main() !dbg !14 { +// CHECK:STDOUT: define void @_CJ.Main() !dbg !13 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %.loc33_11.1.temp = alloca {}, align 8, !dbg !15 -// CHECK:STDOUT: call void @_CI.Main(), !dbg !15 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc33_11.1.temp), !dbg !15 -// CHECK:STDOUT: ret void, !dbg !16 +// CHECK:STDOUT: %.loc33_11.1.temp = alloca {}, align 8, !dbg !14 +// CHECK:STDOUT: call void @_CI.Main(), !dbg !14 +// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc33_11.1.temp), !dbg !14 +// CHECK:STDOUT: ret void, !dbg !15 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) // CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #0 // CHECK:STDOUT: // CHECK:STDOUT: ; uselistorder directives -// CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 2, 1, 0 } +// CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 1, 0 } // CHECK:STDOUT: // CHECK:STDOUT: attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } // CHECK:STDOUT: @@ -88,8 +86,7 @@ fn J() { // CHECK:STDOUT: !9 = !DILocation(line: 22, column: 3, scope: !8) // CHECK:STDOUT: !10 = !DILocation(line: 23, column: 3, scope: !8) // CHECK:STDOUT: !11 = distinct !DISubprogram(name: "H", linkageName: "_CH.Main", scope: null, file: !3, line: 26, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !12 = !DILocation(line: 27, column: 10, scope: !11) -// CHECK:STDOUT: !13 = !DILocation(line: 27, column: 3, scope: !11) -// CHECK:STDOUT: !14 = distinct !DISubprogram(name: "J", linkageName: "_CJ.Main", scope: null, file: !3, line: 32, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !15 = !DILocation(line: 33, column: 9, scope: !14) -// CHECK:STDOUT: !16 = !DILocation(line: 32, column: 1, scope: !14) +// CHECK:STDOUT: !12 = !DILocation(line: 27, column: 3, scope: !11) +// CHECK:STDOUT: !13 = distinct !DISubprogram(name: "J", linkageName: "_CJ.Main", scope: null, file: !3, line: 32, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !14 = !DILocation(line: 33, column: 9, scope: !13) +// CHECK:STDOUT: !15 = !DILocation(line: 32, column: 1, scope: !13) diff --git a/toolchain/lower/testdata/class/adapt.carbon b/toolchain/lower/testdata/class/adapt.carbon index d5c678987701..3e450af9b847 100644 --- a/toolchain/lower/testdata/class/adapt.carbon +++ b/toolchain/lower/testdata/class/adapt.carbon @@ -47,6 +47,10 @@ library "[[@TEST_NAME]]"; class Int { adapt i32; + + impl as Core.Copy { + fn Op[self: Self]() -> Self { return (self as i32).(Core.Copy.Op)() as Int; } + } } fn DoStuff(a: Int) -> Int { @@ -123,9 +127,15 @@ fn DoStuff(a: Int) -> Int { // CHECK:STDOUT: ; ModuleID = 'adapt_int.carbon' // CHECK:STDOUT: source_filename = "adapt_int.carbon" // CHECK:STDOUT: -// CHECK:STDOUT: define i32 @_CDoStuff.Main(i32 %a) !dbg !4 { +// CHECK:STDOUT: define i32 @"_COp.Int.Main:Copy.Core"(i32 %self) !dbg !4 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: ret i32 %a, !dbg !7 +// CHECK:STDOUT: ret i32 %self, !dbg !7 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: define i32 @_CDoStuff.Main(i32 %a) !dbg !8 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call = call i32 @"_COp.Int.Main:Copy.Core"(i32 %a), !dbg !9 +// CHECK:STDOUT: ret i32 %Int.as.Copy.impl.Op.call, !dbg !10 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !llvm.module.flags = !{!0, !1} @@ -135,7 +145,10 @@ fn DoStuff(a: Int) -> Int { // CHECK:STDOUT: !1 = !{i32 2, !"Debug Info Version", i32 3} // CHECK:STDOUT: !2 = distinct !DICompileUnit(language: DW_LANG_C, file: !3, producer: "carbon", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug) // CHECK:STDOUT: !3 = !DIFile(filename: "adapt_int.carbon", directory: "") -// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "DoStuff", linkageName: "_CDoStuff.Main", scope: null, file: !3, line: 8, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.Main:Copy.Core", scope: null, file: !3, line: 8, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !5 = !DISubroutineType(types: !6) // CHECK:STDOUT: !6 = !{} -// CHECK:STDOUT: !7 = !DILocation(line: 9, column: 3, scope: !4) +// CHECK:STDOUT: !7 = !DILocation(line: 8, column: 35, scope: !4) +// CHECK:STDOUT: !8 = distinct !DISubprogram(name: "DoStuff", linkageName: "_CDoStuff.Main", scope: null, file: !3, line: 12, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !9 = !DILocation(line: 13, column: 10, scope: !8) +// CHECK:STDOUT: !10 = !DILocation(line: 13, column: 3, scope: !8) diff --git a/toolchain/lower/testdata/class/generic.carbon b/toolchain/lower/testdata/class/generic.carbon index 6d0b1d3cccb3..54a20aa640c8 100644 --- a/toolchain/lower/testdata/class/generic.carbon +++ b/toolchain/lower/testdata/class/generic.carbon @@ -76,13 +76,10 @@ fn Empty() -> A(()) { library "[[@TEST_NAME]]"; -class C(T:! type) { +class C(T:! Core.Copy) { fn GetBool[self: Self]() -> bool { return self.v; } - // TODO: This should probably require a `Copy` constraint on `T`. - // For now we avoid calling it in cases that would attempt to - // copy a non-copyable type, as that would probably crash. fn GetT[self: Self]() -> T { return self.w; } @@ -105,10 +102,18 @@ fn AccessEmpty() -> () { return c.GetT(); } -fn AccessTuple() -> (i32, i32, i32) { - var c: C((i32, i32, i32)) = {.v = true, .w = (1, 2, 3)}; - return c.GetT(); -} +// TODO: Reintroduce this once it doesn't crash. +// fn AccessTuple() -> (i32, i32, i32) { +// // CHECK:STDERR: access.carbon:[[@LINE+7]]:10: error: cannot convert type `(i32, i32, i32)` into type implementing `Core.Copy` [ConversionFailureTypeToFacet] +// // CHECK:STDERR: var c: C((i32, i32, i32)) = {.v = true, .w = (1, 2, 3)}; +// // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ +// // CHECK:STDERR: access.carbon:[[@LINE-30]]:9: note: initializing generic parameter `T` declared here [InitializingGenericParam] +// // CHECK:STDERR: class C(T:! Core.Copy) { +// // CHECK:STDERR: ^ +// // CHECK:STDERR: +// var c: C((i32, i32, i32)) = {.v = true, .w = (1, 2, 3)}; +// return c.GetT(); +// } // CHECK:STDOUT: ; ModuleID = 'classes.carbon' // CHECK:STDOUT: source_filename = "classes.carbon" @@ -216,18 +221,17 @@ fn AccessTuple() -> (i32, i32, i32) { // CHECK:STDOUT: ; ModuleID = 'access.carbon' // CHECK:STDOUT: source_filename = "access.carbon" // CHECK:STDOUT: -// CHECK:STDOUT: @C.val.98f.loc19_3 = internal constant { i1, i32 } { i1 true, i32 0 } -// CHECK:STDOUT: @C.val.dcc.loc29_3 = internal constant { i1, {} } { i1 true, {} zeroinitializer } -// CHECK:STDOUT: @C.val.08f.loc34_3 = internal constant { i1, { i32, i32, i32 } } { i1 true, { i32, i32, i32 } { i32 1, i32 2, i32 3 } } +// CHECK:STDOUT: @C.val.2d2.loc16_3 = internal constant { i1, i32 } { i1 true, i32 0 } +// CHECK:STDOUT: @C.val.e5c.loc26_3 = internal constant { i1, {} } { i1 true, {} zeroinitializer } // CHECK:STDOUT: // CHECK:STDOUT: define i1 @_CAccessBool.Main() !dbg !4 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %c.var = alloca { i1, i32 }, align 8, !dbg !7 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %c.var), !dbg !7 -// CHECK:STDOUT: %.loc19_37.2.v = getelementptr inbounds nuw { i1, i32 }, ptr %c.var, i32 0, i32 0, !dbg !8 -// CHECK:STDOUT: %.loc19_37.5.w = getelementptr inbounds nuw { i1, i32 }, ptr %c.var, i32 0, i32 1, !dbg !8 -// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %c.var, ptr align 4 @C.val.98f.loc19_3, i64 8, i1 false), !dbg !7 -// CHECK:STDOUT: %C.GetBool.call = call i1 @_CGetBool.C.Main.b88d1103f417c6d4(ptr %c.var), !dbg !9 +// CHECK:STDOUT: %.loc16_37.2.v = getelementptr inbounds nuw { i1, i32 }, ptr %c.var, i32 0, i32 0, !dbg !8 +// CHECK:STDOUT: %.loc16_37.5.w = getelementptr inbounds nuw { i1, i32 }, ptr %c.var, i32 0, i32 1, !dbg !8 +// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %c.var, ptr align 4 @C.val.2d2.loc16_3, i64 8, i1 false), !dbg !7 +// CHECK:STDOUT: %C.GetBool.call = call i1 @_CGetBool.C.Main.b7c8e4dff2adcdaa(ptr %c.var), !dbg !9 // CHECK:STDOUT: ret i1 %C.GetBool.call, !dbg !10 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -235,76 +239,54 @@ fn AccessTuple() -> (i32, i32, i32) { // CHECK:STDOUT: entry: // CHECK:STDOUT: %c.var = alloca { i1, i32 }, align 8, !dbg !12 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %c.var), !dbg !12 -// CHECK:STDOUT: %.loc24_37.2.v = getelementptr inbounds nuw { i1, i32 }, ptr %c.var, i32 0, i32 0, !dbg !13 -// CHECK:STDOUT: %.loc24_37.5.w = getelementptr inbounds nuw { i1, i32 }, ptr %c.var, i32 0, i32 1, !dbg !13 -// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %c.var, ptr align 4 @C.val.98f.loc19_3, i64 8, i1 false), !dbg !12 -// CHECK:STDOUT: %C.GetT.call = call i32 @_CGetT.C.Main.b88d1103f417c6d4(ptr %c.var), !dbg !14 +// CHECK:STDOUT: %.loc21_37.2.v = getelementptr inbounds nuw { i1, i32 }, ptr %c.var, i32 0, i32 0, !dbg !13 +// CHECK:STDOUT: %.loc21_37.5.w = getelementptr inbounds nuw { i1, i32 }, ptr %c.var, i32 0, i32 1, !dbg !13 +// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %c.var, ptr align 4 @C.val.2d2.loc16_3, i64 8, i1 false), !dbg !12 +// CHECK:STDOUT: %C.GetT.call = call i32 @_CGetT.C.Main.b7c8e4dff2adcdaa(ptr %c.var), !dbg !14 // CHECK:STDOUT: ret i32 %C.GetT.call, !dbg !15 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: define void @_CAccessEmpty.Main() !dbg !16 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %c.var = alloca { i1, {} }, align 8, !dbg !17 -// CHECK:STDOUT: %.loc30_17.1.temp = alloca {}, align 8, !dbg !18 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %c.var), !dbg !17 -// CHECK:STDOUT: %.loc29_37.2.v = getelementptr inbounds nuw { i1, {} }, ptr %c.var, i32 0, i32 0, !dbg !19 -// CHECK:STDOUT: %.loc29_37.4.w = getelementptr inbounds nuw { i1, {} }, ptr %c.var, i32 0, i32 1, !dbg !19 -// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %c.var, ptr align 1 @C.val.dcc.loc29_3, i64 1, i1 false), !dbg !17 -// CHECK:STDOUT: call void @_CGetT.C.Main.e43630e9a6c38c3f(ptr %c.var), !dbg !18 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc30_17.1.temp), !dbg !18 +// CHECK:STDOUT: %.loc26_37.2.v = getelementptr inbounds nuw { i1, {} }, ptr %c.var, i32 0, i32 0, !dbg !18 +// CHECK:STDOUT: %.loc26_37.4.w = getelementptr inbounds nuw { i1, {} }, ptr %c.var, i32 0, i32 1, !dbg !18 +// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %c.var, ptr align 1 @C.val.e5c.loc26_3, i64 1, i1 false), !dbg !17 +// CHECK:STDOUT: call void @_CGetT.C.Main.35292afa1b663913(ptr %c.var), !dbg !19 // CHECK:STDOUT: ret void, !dbg !20 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define void @_CAccessTuple.Main(ptr sret({ i32, i32, i32 }) %return) !dbg !21 { -// CHECK:STDOUT: entry: -// CHECK:STDOUT: %c.var = alloca { i1, { i32, i32, i32 } }, align 8, !dbg !22 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %c.var), !dbg !22 -// CHECK:STDOUT: %.loc34_57.2.v = getelementptr inbounds nuw { i1, { i32, i32, i32 } }, ptr %c.var, i32 0, i32 0, !dbg !23 -// CHECK:STDOUT: %.loc34_57.4.w = getelementptr inbounds nuw { i1, { i32, i32, i32 } }, ptr %c.var, i32 0, i32 1, !dbg !23 -// CHECK:STDOUT: %tuple.elem0.tuple.elem = getelementptr inbounds nuw { i32, i32, i32 }, ptr %.loc34_57.4.w, i32 0, i32 0, !dbg !24 -// CHECK:STDOUT: %tuple.elem1.tuple.elem = getelementptr inbounds nuw { i32, i32, i32 }, ptr %.loc34_57.4.w, i32 0, i32 1, !dbg !24 -// CHECK:STDOUT: %tuple.elem2.tuple.elem = getelementptr inbounds nuw { i32, i32, i32 }, ptr %.loc34_57.4.w, i32 0, i32 2, !dbg !24 -// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %c.var, ptr align 4 @C.val.08f.loc34_3, i64 16, i1 false), !dbg !22 -// CHECK:STDOUT: call void @_CGetT.C.Main.69a44aeea2e5c3f0(ptr %return, ptr %c.var), !dbg !25 -// CHECK:STDOUT: ret void, !dbg !26 -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) // CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #0 // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite) // CHECK:STDOUT: declare void @llvm.memcpy.p0.p0.i64(ptr noalias writeonly captures(none), ptr noalias readonly captures(none), i64, i1 immarg) #1 // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i1 @_CGetBool.C.Main.b88d1103f417c6d4(ptr %self) !dbg !27 { +// CHECK:STDOUT: define linkonce_odr i1 @_CGetBool.C.Main.b7c8e4dff2adcdaa(ptr %self) !dbg !21 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %.loc6_16.1.v = getelementptr inbounds nuw { i1, i32 }, ptr %self, i32 0, i32 0, !dbg !28 -// CHECK:STDOUT: %.loc6_16.2 = load i8, ptr %.loc6_16.1.v, align 1, !dbg !28 -// CHECK:STDOUT: %.loc6_16.21 = trunc i8 %.loc6_16.2 to i1, !dbg !28 -// CHECK:STDOUT: ret i1 %.loc6_16.21, !dbg !29 +// CHECK:STDOUT: %.loc6_16.1.v = getelementptr inbounds nuw { i1, i32 }, ptr %self, i32 0, i32 0, !dbg !22 +// CHECK:STDOUT: %.loc6_16.2 = load i8, ptr %.loc6_16.1.v, align 1, !dbg !22 +// CHECK:STDOUT: %.loc6_16.21 = trunc i8 %.loc6_16.2 to i1, !dbg !22 +// CHECK:STDOUT: ret i1 %.loc6_16.21, !dbg !23 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CGetT.C.Main.b88d1103f417c6d4(ptr %self) !dbg !30 { +// CHECK:STDOUT: define linkonce_odr i32 @_CGetT.C.Main.b7c8e4dff2adcdaa(ptr %self) !dbg !24 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %.loc12_16.1.w = getelementptr inbounds nuw { i1, i32 }, ptr %self, i32 0, i32 1, !dbg !31 -// CHECK:STDOUT: %.loc12_16.2 = load i32, ptr %.loc12_16.1.w, align 4, !dbg !31 -// CHECK:STDOUT: ret i32 %.loc12_16.2, !dbg !32 +// CHECK:STDOUT: %.loc9_16.1.w = getelementptr inbounds nuw { i1, i32 }, ptr %self, i32 0, i32 1, !dbg !25 +// CHECK:STDOUT: %.loc9_16.2 = load i32, ptr %.loc9_16.1.w, align 4, !dbg !25 +// CHECK:STDOUT: ret i32 %.loc9_16.2, !dbg !26 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CGetT.C.Main.e43630e9a6c38c3f(ptr %self) !dbg !33 { +// CHECK:STDOUT: define linkonce_odr void @_CGetT.C.Main.35292afa1b663913(ptr %self) !dbg !27 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %.loc12_16.1.w = getelementptr inbounds nuw { i1, {} }, ptr %self, i32 0, i32 1, !dbg !34 -// CHECK:STDOUT: ret void, !dbg !35 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CGetT.C.Main.69a44aeea2e5c3f0(ptr sret({ i32, i32, i32 }) %return, ptr %self) !dbg !36 { -// CHECK:STDOUT: entry: -// CHECK:STDOUT: %.loc12_16.1.w = getelementptr inbounds nuw { i1, { i32, i32, i32 } }, ptr %self, i32 0, i32 1, !dbg !37 -// CHECK:STDOUT: ret void, !dbg !38 +// CHECK:STDOUT: %.loc9_16.1.w = getelementptr inbounds nuw { i1, {} }, ptr %self, i32 0, i32 1, !dbg !28 +// CHECK:STDOUT: ret void, !dbg !29 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; uselistorder directives -// CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 4, 3, 2, 1, 0 } -// CHECK:STDOUT: uselistorder ptr @llvm.memcpy.p0.p0.i64, { 3, 2, 1, 0 } +// CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 2, 1, 0 } +// CHECK:STDOUT: uselistorder ptr @llvm.memcpy.p0.p0.i64, { 2, 1, 0 } // CHECK:STDOUT: // CHECK:STDOUT: attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } // CHECK:STDOUT: attributes #1 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) } @@ -316,38 +298,29 @@ fn AccessTuple() -> (i32, i32, i32) { // CHECK:STDOUT: !1 = !{i32 2, !"Debug Info Version", i32 3} // CHECK:STDOUT: !2 = distinct !DICompileUnit(language: DW_LANG_C, file: !3, producer: "carbon", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug) // CHECK:STDOUT: !3 = !DIFile(filename: "access.carbon", directory: "") -// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "AccessBool", linkageName: "_CAccessBool.Main", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "AccessBool", linkageName: "_CAccessBool.Main", scope: null, file: !3, line: 15, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !5 = !DISubroutineType(types: !6) // CHECK:STDOUT: !6 = !{} -// CHECK:STDOUT: !7 = !DILocation(line: 19, column: 3, scope: !4) -// CHECK:STDOUT: !8 = !DILocation(line: 19, column: 19, scope: !4) -// CHECK:STDOUT: !9 = !DILocation(line: 20, column: 10, scope: !4) -// CHECK:STDOUT: !10 = !DILocation(line: 20, column: 3, scope: !4) -// CHECK:STDOUT: !11 = distinct !DISubprogram(name: "AccessInt", linkageName: "_CAccessInt.Main", scope: null, file: !3, line: 23, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !12 = !DILocation(line: 24, column: 3, scope: !11) -// CHECK:STDOUT: !13 = !DILocation(line: 24, column: 19, scope: !11) -// CHECK:STDOUT: !14 = !DILocation(line: 25, column: 10, scope: !11) -// CHECK:STDOUT: !15 = !DILocation(line: 25, column: 3, scope: !11) -// CHECK:STDOUT: !16 = distinct !DISubprogram(name: "AccessEmpty", linkageName: "_CAccessEmpty.Main", scope: null, file: !3, line: 28, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !17 = !DILocation(line: 29, column: 3, scope: !16) -// CHECK:STDOUT: !18 = !DILocation(line: 30, column: 10, scope: !16) -// CHECK:STDOUT: !19 = !DILocation(line: 29, column: 18, scope: !16) -// CHECK:STDOUT: !20 = !DILocation(line: 30, column: 3, scope: !16) -// CHECK:STDOUT: !21 = distinct !DISubprogram(name: "AccessTuple", linkageName: "_CAccessTuple.Main", scope: null, file: !3, line: 33, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !22 = !DILocation(line: 34, column: 3, scope: !21) -// CHECK:STDOUT: !23 = !DILocation(line: 34, column: 31, scope: !21) -// CHECK:STDOUT: !24 = !DILocation(line: 34, column: 48, scope: !21) -// CHECK:STDOUT: !25 = !DILocation(line: 35, column: 10, scope: !21) -// CHECK:STDOUT: !26 = !DILocation(line: 35, column: 3, scope: !21) -// CHECK:STDOUT: !27 = distinct !DISubprogram(name: "GetBool", linkageName: "_CGetBool.C.Main.b88d1103f417c6d4", scope: null, file: !3, line: 5, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !28 = !DILocation(line: 6, column: 12, scope: !27) -// CHECK:STDOUT: !29 = !DILocation(line: 6, column: 5, scope: !27) -// CHECK:STDOUT: !30 = distinct !DISubprogram(name: "GetT", linkageName: "_CGetT.C.Main.b88d1103f417c6d4", scope: null, file: !3, line: 11, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !31 = !DILocation(line: 12, column: 12, scope: !30) -// CHECK:STDOUT: !32 = !DILocation(line: 12, column: 5, scope: !30) -// CHECK:STDOUT: !33 = distinct !DISubprogram(name: "GetT", linkageName: "_CGetT.C.Main.e43630e9a6c38c3f", scope: null, file: !3, line: 11, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !34 = !DILocation(line: 12, column: 12, scope: !33) -// CHECK:STDOUT: !35 = !DILocation(line: 12, column: 5, scope: !33) -// CHECK:STDOUT: !36 = distinct !DISubprogram(name: "GetT", linkageName: "_CGetT.C.Main.69a44aeea2e5c3f0", scope: null, file: !3, line: 11, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !37 = !DILocation(line: 12, column: 12, scope: !36) -// CHECK:STDOUT: !38 = !DILocation(line: 12, column: 5, scope: !36) +// CHECK:STDOUT: !7 = !DILocation(line: 16, column: 3, scope: !4) +// CHECK:STDOUT: !8 = !DILocation(line: 16, column: 19, scope: !4) +// CHECK:STDOUT: !9 = !DILocation(line: 17, column: 10, scope: !4) +// CHECK:STDOUT: !10 = !DILocation(line: 17, column: 3, scope: !4) +// CHECK:STDOUT: !11 = distinct !DISubprogram(name: "AccessInt", linkageName: "_CAccessInt.Main", scope: null, file: !3, line: 20, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !12 = !DILocation(line: 21, column: 3, scope: !11) +// CHECK:STDOUT: !13 = !DILocation(line: 21, column: 19, scope: !11) +// CHECK:STDOUT: !14 = !DILocation(line: 22, column: 10, scope: !11) +// CHECK:STDOUT: !15 = !DILocation(line: 22, column: 3, scope: !11) +// CHECK:STDOUT: !16 = distinct !DISubprogram(name: "AccessEmpty", linkageName: "_CAccessEmpty.Main", scope: null, file: !3, line: 25, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !17 = !DILocation(line: 26, column: 3, scope: !16) +// CHECK:STDOUT: !18 = !DILocation(line: 26, column: 18, scope: !16) +// CHECK:STDOUT: !19 = !DILocation(line: 27, column: 10, scope: !16) +// CHECK:STDOUT: !20 = !DILocation(line: 27, column: 3, scope: !16) +// CHECK:STDOUT: !21 = distinct !DISubprogram(name: "GetBool", linkageName: "_CGetBool.C.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 5, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !22 = !DILocation(line: 6, column: 12, scope: !21) +// CHECK:STDOUT: !23 = !DILocation(line: 6, column: 5, scope: !21) +// CHECK:STDOUT: !24 = distinct !DISubprogram(name: "GetT", linkageName: "_CGetT.C.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 8, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !25 = !DILocation(line: 9, column: 12, scope: !24) +// CHECK:STDOUT: !26 = !DILocation(line: 9, column: 5, scope: !24) +// CHECK:STDOUT: !27 = distinct !DISubprogram(name: "GetT", linkageName: "_CGetT.C.Main.35292afa1b663913", scope: null, file: !3, line: 8, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !28 = !DILocation(line: 9, column: 12, scope: !27) +// CHECK:STDOUT: !29 = !DILocation(line: 9, column: 5, scope: !27) diff --git a/toolchain/lower/testdata/for/bindings.carbon b/toolchain/lower/testdata/for/bindings.carbon index f66571656b3d..c08c4c344bf2 100644 --- a/toolchain/lower/testdata/for/bindings.carbon +++ b/toolchain/lower/testdata/for/bindings.carbon @@ -26,9 +26,10 @@ fn F(m: i32, n: i32*); fn For() { var r: EmptyRange((i32, i32)) = {}; - for ((m: i32, var n: i32) in r) { - F(m, &n); - } + // TODO: This causes a crash. + // for ((m: i32, var n: i32) in r) { + // F(m, &n); + // } } // CHECK:STDOUT: ; ModuleID = 'bindings.carbon' @@ -36,41 +37,14 @@ fn For() { // CHECK:STDOUT: // CHECK:STDOUT: @EmptyRange.val.loc27_3 = internal constant {} zeroinitializer // CHECK:STDOUT: -// CHECK:STDOUT: declare void @_CF.Main(i32, ptr) +// CHECK:STDOUT: declare void @_CF.Main() // CHECK:STDOUT: // CHECK:STDOUT: define void @_CFor.Main() !dbg !4 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %r.var = alloca {}, align 8, !dbg !7 -// CHECK:STDOUT: %var = alloca {}, align 8, !dbg !8 -// CHECK:STDOUT: %.loc29_33.1.temp = alloca { i1, { i32, i32 } }, align 8, !dbg !8 -// CHECK:STDOUT: %n.var = alloca i32, align 4, !dbg !9 -// CHECK:STDOUT: %.loc29_33.8.temp = alloca { i32, i32 }, align 8, !dbg !8 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %r.var), !dbg !7 // CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %r.var, ptr align 1 @EmptyRange.val.loc27_3, i64 0, i1 false), !dbg !7 -// CHECK:STDOUT: call void @"_CNewCursor.EmptyRange.Main:Iterate.Core.f45352a5f6977b6a"(ptr %r.var), !dbg !8 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %var), !dbg !8 -// CHECK:STDOUT: br label %for.next, !dbg !8 -// CHECK:STDOUT: -// CHECK:STDOUT: for.next: ; preds = %for.body, %entry -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc29_33.1.temp), !dbg !8 -// CHECK:STDOUT: call void @"_CNext.EmptyRange.Main:Iterate.Core.f45352a5f6977b6a"(ptr %.loc29_33.1.temp, ptr %r.var, ptr %var), !dbg !8 -// CHECK:STDOUT: %Optional.HasValue.call = call i1 @_CHasValue.Optional.Core.f45352a5f6977b6a(ptr %.loc29_33.1.temp), !dbg !8 -// CHECK:STDOUT: br i1 %Optional.HasValue.call, label %for.body, label %for.done, !dbg !8 -// CHECK:STDOUT: -// CHECK:STDOUT: for.body: ; preds = %for.next -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %n.var), !dbg !9 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc29_33.8.temp), !dbg !8 -// CHECK:STDOUT: call void @_CGet.Optional.Core.f45352a5f6977b6a(ptr %.loc29_33.8.temp, ptr %.loc29_33.1.temp), !dbg !8 -// CHECK:STDOUT: %tuple.elem0.tuple.elem = getelementptr inbounds nuw { i32, i32 }, ptr %.loc29_33.8.temp, i32 0, i32 0, !dbg !8 -// CHECK:STDOUT: %tuple.elem1.tuple.elem = getelementptr inbounds nuw { i32, i32 }, ptr %.loc29_33.8.temp, i32 0, i32 1, !dbg !8 -// CHECK:STDOUT: %.loc29_33.11 = load i32, ptr %tuple.elem0.tuple.elem, align 4, !dbg !8 -// CHECK:STDOUT: %.loc29_33.12 = load i32, ptr %tuple.elem1.tuple.elem, align 4, !dbg !8 -// CHECK:STDOUT: store i32 %.loc29_33.12, ptr %n.var, align 4, !dbg !9 -// CHECK:STDOUT: call void @_CF.Main(i32 %.loc29_33.11, ptr %n.var), !dbg !10 -// CHECK:STDOUT: br label %for.next, !dbg !11 -// CHECK:STDOUT: -// CHECK:STDOUT: for.done: ; preds = %for.next -// CHECK:STDOUT: ret void, !dbg !12 +// CHECK:STDOUT: ret void, !dbg !8 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) @@ -79,38 +53,6 @@ fn For() { // CHECK:STDOUT: ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite) // CHECK:STDOUT: declare void @llvm.memcpy.p0.p0.i64(ptr noalias writeonly captures(none), ptr noalias readonly captures(none), i64, i1 immarg) #1 // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @"_CNewCursor.EmptyRange.Main:Iterate.Core.f45352a5f6977b6a"(ptr %self) !dbg !13 { -// CHECK:STDOUT: entry: -// CHECK:STDOUT: ret void, !dbg !14 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @"_CNext.EmptyRange.Main:Iterate.Core.f45352a5f6977b6a"(ptr sret({ i1, { i32, i32 } }) %return, ptr %self, ptr %cursor) !dbg !15 { -// CHECK:STDOUT: entry: -// CHECK:STDOUT: call void @_CNone.Optional.Core.f45352a5f6977b6a(ptr %return), !dbg !16 -// CHECK:STDOUT: ret void, !dbg !17 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i1 @_CHasValue.Optional.Core.f45352a5f6977b6a(ptr %self) !dbg !18 { -// CHECK:STDOUT: %has_value = getelementptr inbounds nuw { i1, { i32, i32 } }, ptr %self, i32 0, i32 0, !dbg !20 -// CHECK:STDOUT: %1 = load i8, ptr %has_value, align 1, !dbg !20 -// CHECK:STDOUT: %2 = trunc i8 %1 to i1, !dbg !20 -// CHECK:STDOUT: ret i1 %2, !dbg !21 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CGet.Optional.Core.f45352a5f6977b6a(ptr sret({ i32, i32 }) %return, ptr %self) !dbg !22 { -// CHECK:STDOUT: %value = getelementptr inbounds nuw { i1, { i32, i32 } }, ptr %self, i32 0, i32 1, !dbg !23 -// CHECK:STDOUT: ret void, !dbg !24 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CNone.Optional.Core.f45352a5f6977b6a(ptr sret({ i1, { i32, i32 } }) %return) !dbg !25 { -// CHECK:STDOUT: %has_value = getelementptr inbounds nuw { i1, { i32, i32 } }, ptr %return, i32 0, i32 0, !dbg !26 -// CHECK:STDOUT: store i8 0, ptr %has_value, align 1, !dbg !26 -// CHECK:STDOUT: ret void, !dbg !27 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: ; uselistorder directives -// CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 4, 3, 2, 1, 0 } -// CHECK:STDOUT: // CHECK:STDOUT: attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } // CHECK:STDOUT: attributes #1 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) } // CHECK:STDOUT: @@ -125,23 +67,4 @@ fn For() { // CHECK:STDOUT: !5 = !DISubroutineType(types: !6) // CHECK:STDOUT: !6 = !{} // CHECK:STDOUT: !7 = !DILocation(line: 27, column: 3, scope: !4) -// CHECK:STDOUT: !8 = !DILocation(line: 29, column: 7, scope: !4) -// CHECK:STDOUT: !9 = !DILocation(line: 29, column: 17, scope: !4) -// CHECK:STDOUT: !10 = !DILocation(line: 30, column: 5, scope: !4) -// CHECK:STDOUT: !11 = !DILocation(line: 29, column: 3, scope: !4) -// CHECK:STDOUT: !12 = !DILocation(line: 26, column: 1, scope: !4) -// CHECK:STDOUT: !13 = distinct !DISubprogram(name: "NewCursor", linkageName: "_CNewCursor.EmptyRange.Main:Iterate.Core.f45352a5f6977b6a", scope: null, file: !3, line: 15, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !14 = !DILocation(line: 16, column: 7, scope: !13) -// CHECK:STDOUT: !15 = distinct !DISubprogram(name: "Next", linkageName: "_CNext.EmptyRange.Main:Iterate.Core.f45352a5f6977b6a", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !16 = !DILocation(line: 19, column: 14, scope: !15) -// CHECK:STDOUT: !17 = !DILocation(line: 19, column: 7, scope: !15) -// CHECK:STDOUT: !18 = distinct !DISubprogram(name: "HasValue", linkageName: "_CHasValue.Optional.Core.f45352a5f6977b6a", scope: null, file: !19, line: 30, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !19 = !DIFile(filename: "{{.*}}/prelude/types/optional.carbon", directory: "") -// CHECK:STDOUT: !20 = !DILocation(line: 30, column: 46, scope: !18) -// CHECK:STDOUT: !21 = !DILocation(line: 30, column: 39, scope: !18) -// CHECK:STDOUT: !22 = distinct !DISubprogram(name: "Get", linkageName: "_CGet.Optional.Core.f45352a5f6977b6a", scope: null, file: !19, line: 31, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !23 = !DILocation(line: 31, column: 38, scope: !22) -// CHECK:STDOUT: !24 = !DILocation(line: 31, column: 31, scope: !22) -// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "None", linkageName: "_CNone.Optional.Core.f45352a5f6977b6a", scope: null, file: !19, line: 20, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !26 = !DILocation(line: 22, column: 5, scope: !25) -// CHECK:STDOUT: !27 = !DILocation(line: 23, column: 5, scope: !25) +// CHECK:STDOUT: !8 = !DILocation(line: 26, column: 1, scope: !4) diff --git a/toolchain/lower/testdata/for/break_continue.carbon b/toolchain/lower/testdata/for/break_continue.carbon index 3909986ed5e8..37b272e5c845 100644 --- a/toolchain/lower/testdata/for/break_continue.carbon +++ b/toolchain/lower/testdata/for/break_continue.carbon @@ -123,7 +123,7 @@ fn For() { // CHECK:STDOUT: declare void @_CInclusiveRange.Core(ptr sret({ i32, i32 }), i32, i32) // CHECK:STDOUT: // CHECK:STDOUT: define linkonce_odr void @"_COp.Int.Core:Inc.Core.be1e879c1ad406d8"(ptr %self) !dbg !41 { -// CHECK:STDOUT: call void @"_COp:thunk.Int.Core:AddAssignWith.Core.81406e440463ef1d"(ptr %self, i32 1), !dbg !43 +// CHECK:STDOUT: call void @"_COp:thunk.Int.Core:AddAssignWith.Core.07c7d6b130c9b7ed"(ptr %self, i32 1), !dbg !43 // CHECK:STDOUT: ret void, !dbg !44 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -141,15 +141,15 @@ fn For() { // CHECK:STDOUT: ret void, !dbg !50 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.Core:AddAssignWith.Core.81406e440463ef1d"(ptr %self, i32 %other) !dbg !51 { -// CHECK:STDOUT: %1 = call i32 @"_CConvert.8b3d5d6a6c17be04:ImplicitAs.Core.b88d1103f417c6d4"(i32 %other), !dbg !52 +// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.Core:AddAssignWith.Core.07c7d6b130c9b7ed"(ptr %self, i32 %other) !dbg !51 { +// CHECK:STDOUT: %1 = call i32 @"_CConvert.565a24e863a374f5:ImplicitAs.Core.b7c8e4dff2adcdaa"(i32 %other), !dbg !52 // CHECK:STDOUT: %2 = load i32, ptr %self, align 4, !dbg !53 // CHECK:STDOUT: %3 = add i32 %2, %1, !dbg !53 // CHECK:STDOUT: store i32 %3, ptr %self, align 4, !dbg !53 // CHECK:STDOUT: ret void, !dbg !53 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.8b3d5d6a6c17be04:ImplicitAs.Core.b88d1103f417c6d4"(i32 %self) !dbg !54 { +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.565a24e863a374f5:ImplicitAs.Core.b7c8e4dff2adcdaa"(i32 %self) !dbg !54 { // CHECK:STDOUT: ret i32 %self, !dbg !56 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -212,9 +212,9 @@ fn For() { // CHECK:STDOUT: !48 = distinct !DISubprogram(name: "None", linkageName: "_CNone.Optional.Core.b7c8e4dff2adcdaa", scope: null, file: !35, line: 20, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !49 = !DILocation(line: 22, column: 5, scope: !48) // CHECK:STDOUT: !50 = !DILocation(line: 23, column: 5, scope: !48) -// CHECK:STDOUT: !51 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.Core:AddAssignWith.Core.81406e440463ef1d", scope: null, file: !42, line: 275, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !51 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.Core:AddAssignWith.Core.07c7d6b130c9b7ed", scope: null, file: !42, line: 275, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !52 = !DILocation(line: 4294967295, scope: !51) // CHECK:STDOUT: !53 = !DILocation(line: 275, column: 3, scope: !51) -// CHECK:STDOUT: !54 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.8b3d5d6a6c17be04:ImplicitAs.Core.b88d1103f417c6d4", scope: null, file: !55, line: 23, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !54 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.565a24e863a374f5:ImplicitAs.Core.b7c8e4dff2adcdaa", scope: null, file: !55, line: 24, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !55 = !DIFile(filename: "{{.*}}/prelude/operators/as.carbon", directory: "") -// CHECK:STDOUT: !56 = !DILocation(line: 23, column: 38, scope: !54) +// CHECK:STDOUT: !56 = !DILocation(line: 24, column: 38, scope: !54) diff --git a/toolchain/lower/testdata/for/for.carbon b/toolchain/lower/testdata/for/for.carbon index 415cfafe7525..b00cec68ce1a 100644 --- a/toolchain/lower/testdata/for/for.carbon +++ b/toolchain/lower/testdata/for/for.carbon @@ -111,7 +111,7 @@ fn For() { // CHECK:STDOUT: declare void @_CInclusiveRange.Core(ptr sret({ i32, i32 }), i32, i32) // CHECK:STDOUT: // CHECK:STDOUT: define linkonce_odr void @"_COp.Int.Core:Inc.Core.be1e879c1ad406d8"(ptr %self) !dbg !37 { -// CHECK:STDOUT: call void @"_COp:thunk.Int.Core:AddAssignWith.Core.81406e440463ef1d"(ptr %self, i32 1), !dbg !39 +// CHECK:STDOUT: call void @"_COp:thunk.Int.Core:AddAssignWith.Core.07c7d6b130c9b7ed"(ptr %self, i32 1), !dbg !39 // CHECK:STDOUT: ret void, !dbg !40 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -129,15 +129,15 @@ fn For() { // CHECK:STDOUT: ret void, !dbg !46 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.Core:AddAssignWith.Core.81406e440463ef1d"(ptr %self, i32 %other) !dbg !47 { -// CHECK:STDOUT: %1 = call i32 @"_CConvert.8b3d5d6a6c17be04:ImplicitAs.Core.b88d1103f417c6d4"(i32 %other), !dbg !48 +// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.Core:AddAssignWith.Core.07c7d6b130c9b7ed"(ptr %self, i32 %other) !dbg !47 { +// CHECK:STDOUT: %1 = call i32 @"_CConvert.565a24e863a374f5:ImplicitAs.Core.b7c8e4dff2adcdaa"(i32 %other), !dbg !48 // CHECK:STDOUT: %2 = load i32, ptr %self, align 4, !dbg !49 // CHECK:STDOUT: %3 = add i32 %2, %1, !dbg !49 // CHECK:STDOUT: store i32 %3, ptr %self, align 4, !dbg !49 // CHECK:STDOUT: ret void, !dbg !49 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.8b3d5d6a6c17be04:ImplicitAs.Core.b88d1103f417c6d4"(i32 %self) !dbg !50 { +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.565a24e863a374f5:ImplicitAs.Core.b7c8e4dff2adcdaa"(i32 %self) !dbg !50 { // CHECK:STDOUT: ret i32 %self, !dbg !52 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -196,9 +196,9 @@ fn For() { // CHECK:STDOUT: !44 = distinct !DISubprogram(name: "None", linkageName: "_CNone.Optional.Core.b7c8e4dff2adcdaa", scope: null, file: !31, line: 20, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !45 = !DILocation(line: 22, column: 5, scope: !44) // CHECK:STDOUT: !46 = !DILocation(line: 23, column: 5, scope: !44) -// CHECK:STDOUT: !47 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.Core:AddAssignWith.Core.81406e440463ef1d", scope: null, file: !38, line: 275, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !47 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.Core:AddAssignWith.Core.07c7d6b130c9b7ed", scope: null, file: !38, line: 275, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !48 = !DILocation(line: 4294967295, scope: !47) // CHECK:STDOUT: !49 = !DILocation(line: 275, column: 3, scope: !47) -// CHECK:STDOUT: !50 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.8b3d5d6a6c17be04:ImplicitAs.Core.b88d1103f417c6d4", scope: null, file: !51, line: 23, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !50 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.565a24e863a374f5:ImplicitAs.Core.b7c8e4dff2adcdaa", scope: null, file: !51, line: 24, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !51 = !DIFile(filename: "{{.*}}/prelude/operators/as.carbon", directory: "") -// CHECK:STDOUT: !52 = !DILocation(line: 23, column: 38, scope: !50) +// CHECK:STDOUT: !52 = !DILocation(line: 24, column: 38, scope: !50) diff --git a/toolchain/lower/testdata/function/generic/call_basic.carbon b/toolchain/lower/testdata/function/generic/call_basic.carbon index 0558bb7aa5fe..2368d6e93ed1 100644 --- a/toolchain/lower/testdata/function/generic/call_basic.carbon +++ b/toolchain/lower/testdata/function/generic/call_basic.carbon @@ -10,20 +10,23 @@ // TIP: To dump output, run: // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/lower/testdata/function/generic/call_basic.carbon -class C {} +class C { + impl as Core.Copy { + fn Op[self: Self]() -> Self { return {}; } + } +} fn F[T:! type](x: T) { } -fn H[T:! type](x: T) -> T { +fn H[T:! Core.Copy](x: T) -> T { return x; } // Simple stress test for single depth of calls with change in types. // Check definitions are emitted for each specific. -fn G[T:! type](x: T) -> T { +fn G[T:! Core.Copy](x: T) -> T { H(x); - H(T); H(i32); H(G(x)); @@ -37,7 +40,8 @@ fn G[T:! type](x: T) -> T { var ptr_i8 : i8*; H(ptr_i8); var c: C; - H(c); + // TODO: This causes a crash. + // H(c); return x; } @@ -59,67 +63,74 @@ fn M() { // CHECK:STDOUT: // CHECK:STDOUT: %type = type {} // CHECK:STDOUT: -// CHECK:STDOUT: define void @_CM.Main() !dbg !4 { +// CHECK:STDOUT: @C.val.loc15_44 = internal constant {} zeroinitializer +// CHECK:STDOUT: +// CHECK:STDOUT: define void @"_COp.C.Main:Copy.Core"(ptr sret({}) %return, ptr %self) !dbg !4 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %n.var = alloca i32, align 4, !dbg !7 -// CHECK:STDOUT: %m.var = alloca i32, align 4, !dbg !8 -// CHECK:STDOUT: %p.var = alloca double, align 8, !dbg !9 -// CHECK:STDOUT: %q.var = alloca double, align 8, !dbg !10 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %n.var), !dbg !7 -// CHECK:STDOUT: store i32 0, ptr %n.var, align 4, !dbg !7 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %m.var), !dbg !8 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %p.var), !dbg !9 -// CHECK:STDOUT: store double 1.000000e+00, ptr %p.var, align 8, !dbg !9 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %q.var), !dbg !10 -// CHECK:STDOUT: %.loc51 = load i32, ptr %n.var, align 4, !dbg !11 -// CHECK:STDOUT: call void @_CF.Main.b88d1103f417c6d4(i32 %.loc51), !dbg !12 -// CHECK:STDOUT: %.loc52 = load i32, ptr %n.var, align 4, !dbg !13 -// CHECK:STDOUT: %G.call.loc52 = call i32 @_CG.Main.b88d1103f417c6d4(i32 %.loc52), !dbg !14 -// CHECK:STDOUT: store i32 %G.call.loc52, ptr %m.var, align 4, !dbg !15 -// CHECK:STDOUT: %.loc53 = load double, ptr %p.var, align 8, !dbg !16 -// CHECK:STDOUT: call void @_CF.Main.d4b5665541d5d7a8(double %.loc53), !dbg !17 -// CHECK:STDOUT: %.loc54 = load double, ptr %p.var, align 8, !dbg !18 -// CHECK:STDOUT: %G.call.loc54 = call double @_CG.Main.d4b5665541d5d7a8(double %.loc54), !dbg !19 -// CHECK:STDOUT: store double %G.call.loc54, ptr %q.var, align 8, !dbg !20 -// CHECK:STDOUT: ret void, !dbg !21 +// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %return, ptr align 1 @C.val.loc15_44, i64 0, i1 false), !dbg !7 +// CHECK:STDOUT: ret void, !dbg !7 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) -// CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #0 -// CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CF.Main.b88d1103f417c6d4(i32 %x) !dbg !22 { +// CHECK:STDOUT: define void @_CM.Main() !dbg !8 { // CHECK:STDOUT: entry: +// CHECK:STDOUT: %n.var = alloca i32, align 4, !dbg !9 +// CHECK:STDOUT: %m.var = alloca i32, align 4, !dbg !10 +// CHECK:STDOUT: %p.var = alloca double, align 8, !dbg !11 +// CHECK:STDOUT: %q.var = alloca double, align 8, !dbg !12 +// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %n.var), !dbg !9 +// CHECK:STDOUT: store i32 0, ptr %n.var, align 4, !dbg !9 +// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %m.var), !dbg !10 +// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %p.var), !dbg !11 +// CHECK:STDOUT: store double 1.000000e+00, ptr %p.var, align 8, !dbg !11 +// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %q.var), !dbg !12 +// CHECK:STDOUT: %.loc55 = load i32, ptr %n.var, align 4, !dbg !13 +// CHECK:STDOUT: call void @_CF.Main.b88d1103f417c6d4(i32 %.loc55), !dbg !14 +// CHECK:STDOUT: %.loc56_9 = load i32, ptr %n.var, align 4, !dbg !15 +// CHECK:STDOUT: %G.call.loc56 = call i32 @_CG.Main.b7c8e4dff2adcdaa(i32 %.loc56_9), !dbg !16 +// CHECK:STDOUT: store i32 %G.call.loc56, ptr %m.var, align 4, !dbg !17 +// CHECK:STDOUT: %.loc57 = load double, ptr %p.var, align 8, !dbg !18 +// CHECK:STDOUT: call void @_CF.Main.d4b5665541d5d7a8(double %.loc57), !dbg !19 +// CHECK:STDOUT: %.loc58_9 = load double, ptr %p.var, align 8, !dbg !20 +// CHECK:STDOUT: %G.call.loc58 = call double @_CG.Main.274514a8254d0859(double %.loc58_9), !dbg !21 +// CHECK:STDOUT: store double %G.call.loc58, ptr %q.var, align 8, !dbg !22 // CHECK:STDOUT: ret void, !dbg !23 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CG.Main.b88d1103f417c6d4(i32 %x) !dbg !24 { +// CHECK:STDOUT: ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite) +// CHECK:STDOUT: declare void @llvm.memcpy.p0.p0.i64(ptr noalias writeonly captures(none), ptr noalias readonly captures(none), i64, i1 immarg) #0 +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) +// CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #1 +// CHECK:STDOUT: +// CHECK:STDOUT: define linkonce_odr void @_CF.Main.b88d1103f417c6d4(i32 %x) !dbg !24 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %var_f64.var = alloca double, align 8, !dbg !25 -// CHECK:STDOUT: %ptr_i32.var = alloca ptr, align 8, !dbg !26 -// CHECK:STDOUT: %ptr_f64.var = alloca ptr, align 8, !dbg !27 -// CHECK:STDOUT: %ptr_i8.var = alloca ptr, align 8, !dbg !28 -// CHECK:STDOUT: %c.var = alloca {}, align 8, !dbg !29 -// CHECK:STDOUT: %.loc40_6.1.temp = alloca {}, align 8, !dbg !30 -// CHECK:STDOUT: %H.call.loc25 = call i32 @_CH.Main.b88d1103f417c6d4(i32 %x), !dbg !31 -// CHECK:STDOUT: %H.call.loc26 = call %type @_CH.Main.5754c7a55c7cbe4a(%type zeroinitializer), !dbg !32 -// CHECK:STDOUT: %H.call.loc27 = call %type @_CH.Main.5754c7a55c7cbe4a(%type zeroinitializer), !dbg !33 -// CHECK:STDOUT: %G.call = call i32 @_CG.Main.b88d1103f417c6d4(i32 %x), !dbg !34 -// CHECK:STDOUT: %H.call.loc28 = call i32 @_CH.Main.b88d1103f417c6d4(i32 %G.call), !dbg !35 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %var_f64.var), !dbg !25 -// CHECK:STDOUT: %.loc32 = load double, ptr %var_f64.var, align 8, !dbg !36 -// CHECK:STDOUT: %H.call.loc32 = call double @_CH.Main.d4b5665541d5d7a8(double %.loc32), !dbg !37 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_i32.var), !dbg !26 -// CHECK:STDOUT: %.loc34 = load ptr, ptr %ptr_i32.var, align 8, !dbg !38 -// CHECK:STDOUT: %H.call.loc34 = call ptr @_CH.Main.e8193710fd35b608(ptr %.loc34), !dbg !39 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_f64.var), !dbg !27 -// CHECK:STDOUT: %.loc36 = load ptr, ptr %ptr_f64.var, align 8, !dbg !40 -// CHECK:STDOUT: %H.call.loc36 = call ptr @_CH.Main.e8193710fd35b608(ptr %.loc36), !dbg !41 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_i8.var), !dbg !28 -// CHECK:STDOUT: %.loc38 = load ptr, ptr %ptr_i8.var, align 8, !dbg !42 -// CHECK:STDOUT: %H.call.loc38 = call ptr @_CH.Main.e8193710fd35b608(ptr %.loc38), !dbg !43 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %c.var), !dbg !29 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc40_6.1.temp), !dbg !30 -// CHECK:STDOUT: call void @_CH.Main.15b1f98bd9cc0c5b(ptr %.loc40_6.1.temp, ptr %c.var), !dbg !30 +// CHECK:STDOUT: ret void, !dbg !25 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: define linkonce_odr i32 @_CG.Main.b7c8e4dff2adcdaa(i32 %x) !dbg !26 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: %var_f64.var = alloca double, align 8, !dbg !27 +// CHECK:STDOUT: %ptr_i32.var = alloca ptr, align 8, !dbg !28 +// CHECK:STDOUT: %ptr_f64.var = alloca ptr, align 8, !dbg !29 +// CHECK:STDOUT: %ptr_i8.var = alloca ptr, align 8, !dbg !30 +// CHECK:STDOUT: %c.var = alloca {}, align 8, !dbg !31 +// CHECK:STDOUT: %H.call.loc29 = call i32 @_CH.Main.b7c8e4dff2adcdaa(i32 %x), !dbg !32 +// CHECK:STDOUT: %H.call.loc30 = call %type @_CH.Main.08871b6f43862d33(%type zeroinitializer), !dbg !33 +// CHECK:STDOUT: %G.call = call i32 @_CG.Main.b7c8e4dff2adcdaa(i32 %x), !dbg !34 +// CHECK:STDOUT: %H.call.loc31 = call i32 @_CH.Main.b7c8e4dff2adcdaa(i32 %G.call), !dbg !35 +// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %var_f64.var), !dbg !27 +// CHECK:STDOUT: %.loc35_5 = load double, ptr %var_f64.var, align 8, !dbg !36 +// CHECK:STDOUT: %H.call.loc35 = call double @_CH.Main.274514a8254d0859(double %.loc35_5), !dbg !37 +// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_i32.var), !dbg !28 +// CHECK:STDOUT: %.loc37_5 = load ptr, ptr %ptr_i32.var, align 8, !dbg !38 +// CHECK:STDOUT: %H.call.loc37 = call ptr @_CH.Main.19c352736f719291(ptr %.loc37_5), !dbg !39 +// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_f64.var), !dbg !29 +// CHECK:STDOUT: %.loc39_5 = load ptr, ptr %ptr_f64.var, align 8, !dbg !40 +// CHECK:STDOUT: %H.call.loc39 = call ptr @_CH.Main.19c352736f719291(ptr %.loc39_5), !dbg !41 +// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_i8.var), !dbg !30 +// CHECK:STDOUT: %.loc41_5 = load ptr, ptr %ptr_i8.var, align 8, !dbg !42 +// CHECK:STDOUT: %H.call.loc41 = call ptr @_CH.Main.19c352736f719291(ptr %.loc41_5), !dbg !43 +// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %c.var), !dbg !31 // CHECK:STDOUT: ret i32 %x, !dbg !44 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -128,71 +139,62 @@ fn M() { // CHECK:STDOUT: ret void, !dbg !46 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr double @_CG.Main.d4b5665541d5d7a8(double %x) !dbg !47 { +// CHECK:STDOUT: define linkonce_odr double @_CG.Main.274514a8254d0859(double %x) !dbg !47 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %var_f64.var = alloca double, align 8, !dbg !48 // CHECK:STDOUT: %ptr_i32.var = alloca ptr, align 8, !dbg !49 // CHECK:STDOUT: %ptr_f64.var = alloca ptr, align 8, !dbg !50 // CHECK:STDOUT: %ptr_i8.var = alloca ptr, align 8, !dbg !51 // CHECK:STDOUT: %c.var = alloca {}, align 8, !dbg !52 -// CHECK:STDOUT: %.loc40_6.1.temp = alloca {}, align 8, !dbg !53 -// CHECK:STDOUT: %H.call.loc25 = call double @_CH.Main.d4b5665541d5d7a8(double %x), !dbg !54 -// CHECK:STDOUT: %H.call.loc26 = call %type @_CH.Main.5754c7a55c7cbe4a(%type zeroinitializer), !dbg !55 -// CHECK:STDOUT: %H.call.loc27 = call %type @_CH.Main.5754c7a55c7cbe4a(%type zeroinitializer), !dbg !56 -// CHECK:STDOUT: %G.call = call double @_CG.Main.d4b5665541d5d7a8(double %x), !dbg !57 -// CHECK:STDOUT: %H.call.loc28 = call double @_CH.Main.d4b5665541d5d7a8(double %G.call), !dbg !58 +// CHECK:STDOUT: %H.call.loc29 = call double @_CH.Main.274514a8254d0859(double %x), !dbg !53 +// CHECK:STDOUT: %H.call.loc30 = call %type @_CH.Main.08871b6f43862d33(%type zeroinitializer), !dbg !54 +// CHECK:STDOUT: %G.call = call double @_CG.Main.274514a8254d0859(double %x), !dbg !55 +// CHECK:STDOUT: %H.call.loc31 = call double @_CH.Main.274514a8254d0859(double %G.call), !dbg !56 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %var_f64.var), !dbg !48 -// CHECK:STDOUT: %.loc32 = load double, ptr %var_f64.var, align 8, !dbg !59 -// CHECK:STDOUT: %H.call.loc32 = call double @_CH.Main.d4b5665541d5d7a8(double %.loc32), !dbg !60 +// CHECK:STDOUT: %.loc35_5 = load double, ptr %var_f64.var, align 8, !dbg !57 +// CHECK:STDOUT: %H.call.loc35 = call double @_CH.Main.274514a8254d0859(double %.loc35_5), !dbg !58 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_i32.var), !dbg !49 -// CHECK:STDOUT: %.loc34 = load ptr, ptr %ptr_i32.var, align 8, !dbg !61 -// CHECK:STDOUT: %H.call.loc34 = call ptr @_CH.Main.e8193710fd35b608(ptr %.loc34), !dbg !62 +// CHECK:STDOUT: %.loc37_5 = load ptr, ptr %ptr_i32.var, align 8, !dbg !59 +// CHECK:STDOUT: %H.call.loc37 = call ptr @_CH.Main.19c352736f719291(ptr %.loc37_5), !dbg !60 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_f64.var), !dbg !50 -// CHECK:STDOUT: %.loc36 = load ptr, ptr %ptr_f64.var, align 8, !dbg !63 -// CHECK:STDOUT: %H.call.loc36 = call ptr @_CH.Main.e8193710fd35b608(ptr %.loc36), !dbg !64 +// CHECK:STDOUT: %.loc39_5 = load ptr, ptr %ptr_f64.var, align 8, !dbg !61 +// CHECK:STDOUT: %H.call.loc39 = call ptr @_CH.Main.19c352736f719291(ptr %.loc39_5), !dbg !62 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_i8.var), !dbg !51 -// CHECK:STDOUT: %.loc38 = load ptr, ptr %ptr_i8.var, align 8, !dbg !65 -// CHECK:STDOUT: %H.call.loc38 = call ptr @_CH.Main.e8193710fd35b608(ptr %.loc38), !dbg !66 +// CHECK:STDOUT: %.loc41_5 = load ptr, ptr %ptr_i8.var, align 8, !dbg !63 +// CHECK:STDOUT: %H.call.loc41 = call ptr @_CH.Main.19c352736f719291(ptr %.loc41_5), !dbg !64 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %c.var), !dbg !52 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc40_6.1.temp), !dbg !53 -// CHECK:STDOUT: call void @_CH.Main.15b1f98bd9cc0c5b(ptr %.loc40_6.1.temp, ptr %c.var), !dbg !53 -// CHECK:STDOUT: ret double %x, !dbg !67 +// CHECK:STDOUT: ret double %x, !dbg !65 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CH.Main.b88d1103f417c6d4(i32 %x) !dbg !68 { +// CHECK:STDOUT: define linkonce_odr i32 @_CH.Main.b7c8e4dff2adcdaa(i32 %x) !dbg !66 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: ret i32 %x, !dbg !69 +// CHECK:STDOUT: ret i32 %x, !dbg !67 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr %type @_CH.Main.5754c7a55c7cbe4a(%type %x) !dbg !70 { +// CHECK:STDOUT: define linkonce_odr %type @_CH.Main.08871b6f43862d33(%type %x) !dbg !68 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: ret %type %x, !dbg !71 +// CHECK:STDOUT: ret %type %x, !dbg !69 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr double @_CH.Main.d4b5665541d5d7a8(double %x) !dbg !72 { +// CHECK:STDOUT: define linkonce_odr double @_CH.Main.274514a8254d0859(double %x) !dbg !70 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: ret double %x, !dbg !73 +// CHECK:STDOUT: ret double %x, !dbg !71 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr ptr @_CH.Main.e8193710fd35b608(ptr %x) !dbg !74 { +// CHECK:STDOUT: define linkonce_odr ptr @_CH.Main.19c352736f719291(ptr %x) !dbg !72 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: ret ptr %x, !dbg !75 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CH.Main.15b1f98bd9cc0c5b(ptr sret({}) %return, ptr %x) !dbg !76 { -// CHECK:STDOUT: entry: -// CHECK:STDOUT: ret void, !dbg !77 +// CHECK:STDOUT: ret ptr %x, !dbg !73 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; uselistorder directives -// CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 15, 14, 13, 12 } -// CHECK:STDOUT: uselistorder ptr @_CH.Main.b88d1103f417c6d4, { 1, 0 } -// CHECK:STDOUT: uselistorder ptr @_CH.Main.5754c7a55c7cbe4a, { 3, 2, 1, 0 } -// CHECK:STDOUT: uselistorder ptr @_CH.Main.d4b5665541d5d7a8, { 3, 2, 1, 0 } -// CHECK:STDOUT: uselistorder ptr @_CH.Main.e8193710fd35b608, { 5, 2, 0, 4, 3, 1 } -// CHECK:STDOUT: uselistorder ptr @_CH.Main.15b1f98bd9cc0c5b, { 1, 0 } +// CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 12, 11, 10 } +// CHECK:STDOUT: uselistorder ptr @_CH.Main.b7c8e4dff2adcdaa, { 1, 0 } +// CHECK:STDOUT: uselistorder ptr @_CH.Main.08871b6f43862d33, { 1, 0 } +// CHECK:STDOUT: uselistorder ptr @_CH.Main.274514a8254d0859, { 3, 2, 1, 0 } +// CHECK:STDOUT: uselistorder ptr @_CH.Main.19c352736f719291, { 5, 2, 0, 4, 3, 1 } // CHECK:STDOUT: -// CHECK:STDOUT: attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } +// CHECK:STDOUT: attributes #0 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) } +// CHECK:STDOUT: attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } // CHECK:STDOUT: // CHECK:STDOUT: !llvm.module.flags = !{!0, !1} // CHECK:STDOUT: !llvm.dbg.cu = !{!2} @@ -201,77 +203,73 @@ fn M() { // CHECK:STDOUT: !1 = !{i32 2, !"Debug Info Version", i32 3} // CHECK:STDOUT: !2 = distinct !DICompileUnit(language: DW_LANG_C, file: !3, producer: "carbon", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug) // CHECK:STDOUT: !3 = !DIFile(filename: "call_basic.carbon", directory: "") -// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "M", linkageName: "_CM.Main", scope: null, file: !3, line: 45, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "Op", linkageName: "_COp.C.Main:Copy.Core", scope: null, file: !3, line: 15, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !5 = !DISubroutineType(types: !6) // CHECK:STDOUT: !6 = !{} -// CHECK:STDOUT: !7 = !DILocation(line: 46, column: 3, scope: !4) -// CHECK:STDOUT: !8 = !DILocation(line: 47, column: 3, scope: !4) -// CHECK:STDOUT: !9 = !DILocation(line: 48, column: 3, scope: !4) -// CHECK:STDOUT: !10 = !DILocation(line: 49, column: 3, scope: !4) -// CHECK:STDOUT: !11 = !DILocation(line: 51, column: 5, scope: !4) -// CHECK:STDOUT: !12 = !DILocation(line: 51, column: 3, scope: !4) -// CHECK:STDOUT: !13 = !DILocation(line: 52, column: 9, scope: !4) -// CHECK:STDOUT: !14 = !DILocation(line: 52, column: 7, scope: !4) -// CHECK:STDOUT: !15 = !DILocation(line: 52, column: 3, scope: !4) -// CHECK:STDOUT: !16 = !DILocation(line: 53, column: 5, scope: !4) -// CHECK:STDOUT: !17 = !DILocation(line: 53, column: 3, scope: !4) -// CHECK:STDOUT: !18 = !DILocation(line: 54, column: 9, scope: !4) -// CHECK:STDOUT: !19 = !DILocation(line: 54, column: 7, scope: !4) -// CHECK:STDOUT: !20 = !DILocation(line: 54, column: 3, scope: !4) -// CHECK:STDOUT: !21 = !DILocation(line: 45, column: 1, scope: !4) -// CHECK:STDOUT: !22 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.b88d1103f417c6d4", scope: null, file: !3, line: 15, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !23 = !DILocation(line: 15, column: 1, scope: !22) -// CHECK:STDOUT: !24 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.b88d1103f417c6d4", scope: null, file: !3, line: 24, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !25 = !DILocation(line: 31, column: 3, scope: !24) -// CHECK:STDOUT: !26 = !DILocation(line: 33, column: 3, scope: !24) -// CHECK:STDOUT: !27 = !DILocation(line: 35, column: 3, scope: !24) -// CHECK:STDOUT: !28 = !DILocation(line: 37, column: 3, scope: !24) -// CHECK:STDOUT: !29 = !DILocation(line: 39, column: 3, scope: !24) -// CHECK:STDOUT: !30 = !DILocation(line: 40, column: 3, scope: !24) -// CHECK:STDOUT: !31 = !DILocation(line: 25, column: 3, scope: !24) -// CHECK:STDOUT: !32 = !DILocation(line: 26, column: 3, scope: !24) -// CHECK:STDOUT: !33 = !DILocation(line: 27, column: 3, scope: !24) -// CHECK:STDOUT: !34 = !DILocation(line: 28, column: 5, scope: !24) -// CHECK:STDOUT: !35 = !DILocation(line: 28, column: 3, scope: !24) -// CHECK:STDOUT: !36 = !DILocation(line: 32, column: 5, scope: !24) -// CHECK:STDOUT: !37 = !DILocation(line: 32, column: 3, scope: !24) -// CHECK:STDOUT: !38 = !DILocation(line: 34, column: 5, scope: !24) -// CHECK:STDOUT: !39 = !DILocation(line: 34, column: 3, scope: !24) -// CHECK:STDOUT: !40 = !DILocation(line: 36, column: 5, scope: !24) -// CHECK:STDOUT: !41 = !DILocation(line: 36, column: 3, scope: !24) -// CHECK:STDOUT: !42 = !DILocation(line: 38, column: 5, scope: !24) -// CHECK:STDOUT: !43 = !DILocation(line: 38, column: 3, scope: !24) -// CHECK:STDOUT: !44 = !DILocation(line: 42, column: 3, scope: !24) -// CHECK:STDOUT: !45 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 15, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !46 = !DILocation(line: 15, column: 1, scope: !45) -// CHECK:STDOUT: !47 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 24, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !48 = !DILocation(line: 31, column: 3, scope: !47) -// CHECK:STDOUT: !49 = !DILocation(line: 33, column: 3, scope: !47) -// CHECK:STDOUT: !50 = !DILocation(line: 35, column: 3, scope: !47) -// CHECK:STDOUT: !51 = !DILocation(line: 37, column: 3, scope: !47) -// CHECK:STDOUT: !52 = !DILocation(line: 39, column: 3, scope: !47) -// CHECK:STDOUT: !53 = !DILocation(line: 40, column: 3, scope: !47) -// CHECK:STDOUT: !54 = !DILocation(line: 25, column: 3, scope: !47) -// CHECK:STDOUT: !55 = !DILocation(line: 26, column: 3, scope: !47) -// CHECK:STDOUT: !56 = !DILocation(line: 27, column: 3, scope: !47) -// CHECK:STDOUT: !57 = !DILocation(line: 28, column: 5, scope: !47) -// CHECK:STDOUT: !58 = !DILocation(line: 28, column: 3, scope: !47) -// CHECK:STDOUT: !59 = !DILocation(line: 32, column: 5, scope: !47) -// CHECK:STDOUT: !60 = !DILocation(line: 32, column: 3, scope: !47) -// CHECK:STDOUT: !61 = !DILocation(line: 34, column: 5, scope: !47) -// CHECK:STDOUT: !62 = !DILocation(line: 34, column: 3, scope: !47) -// CHECK:STDOUT: !63 = !DILocation(line: 36, column: 5, scope: !47) -// CHECK:STDOUT: !64 = !DILocation(line: 36, column: 3, scope: !47) -// CHECK:STDOUT: !65 = !DILocation(line: 38, column: 5, scope: !47) -// CHECK:STDOUT: !66 = !DILocation(line: 38, column: 3, scope: !47) -// CHECK:STDOUT: !67 = !DILocation(line: 42, column: 3, scope: !47) -// CHECK:STDOUT: !68 = distinct !DISubprogram(name: "H", linkageName: "_CH.Main.b88d1103f417c6d4", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !69 = !DILocation(line: 19, column: 3, scope: !68) -// CHECK:STDOUT: !70 = distinct !DISubprogram(name: "H", linkageName: "_CH.Main.5754c7a55c7cbe4a", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !71 = !DILocation(line: 19, column: 3, scope: !70) -// CHECK:STDOUT: !72 = distinct !DISubprogram(name: "H", linkageName: "_CH.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !73 = !DILocation(line: 19, column: 3, scope: !72) -// CHECK:STDOUT: !74 = distinct !DISubprogram(name: "H", linkageName: "_CH.Main.e8193710fd35b608", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !75 = !DILocation(line: 19, column: 3, scope: !74) -// CHECK:STDOUT: !76 = distinct !DISubprogram(name: "H", linkageName: "_CH.Main.15b1f98bd9cc0c5b", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !77 = !DILocation(line: 19, column: 3, scope: !76) +// CHECK:STDOUT: !7 = !DILocation(line: 15, column: 35, scope: !4) +// CHECK:STDOUT: !8 = distinct !DISubprogram(name: "M", linkageName: "_CM.Main", scope: null, file: !3, line: 49, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !9 = !DILocation(line: 50, column: 3, scope: !8) +// CHECK:STDOUT: !10 = !DILocation(line: 51, column: 3, scope: !8) +// CHECK:STDOUT: !11 = !DILocation(line: 52, column: 3, scope: !8) +// CHECK:STDOUT: !12 = !DILocation(line: 53, column: 3, scope: !8) +// CHECK:STDOUT: !13 = !DILocation(line: 55, column: 5, scope: !8) +// CHECK:STDOUT: !14 = !DILocation(line: 55, column: 3, scope: !8) +// CHECK:STDOUT: !15 = !DILocation(line: 56, column: 9, scope: !8) +// CHECK:STDOUT: !16 = !DILocation(line: 56, column: 7, scope: !8) +// CHECK:STDOUT: !17 = !DILocation(line: 56, column: 3, scope: !8) +// CHECK:STDOUT: !18 = !DILocation(line: 57, column: 5, scope: !8) +// CHECK:STDOUT: !19 = !DILocation(line: 57, column: 3, scope: !8) +// CHECK:STDOUT: !20 = !DILocation(line: 58, column: 9, scope: !8) +// CHECK:STDOUT: !21 = !DILocation(line: 58, column: 7, scope: !8) +// CHECK:STDOUT: !22 = !DILocation(line: 58, column: 3, scope: !8) +// CHECK:STDOUT: !23 = !DILocation(line: 49, column: 1, scope: !8) +// CHECK:STDOUT: !24 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.b88d1103f417c6d4", scope: null, file: !3, line: 19, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !25 = !DILocation(line: 19, column: 1, scope: !24) +// CHECK:STDOUT: !26 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 28, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !27 = !DILocation(line: 34, column: 3, scope: !26) +// CHECK:STDOUT: !28 = !DILocation(line: 36, column: 3, scope: !26) +// CHECK:STDOUT: !29 = !DILocation(line: 38, column: 3, scope: !26) +// CHECK:STDOUT: !30 = !DILocation(line: 40, column: 3, scope: !26) +// CHECK:STDOUT: !31 = !DILocation(line: 42, column: 3, scope: !26) +// CHECK:STDOUT: !32 = !DILocation(line: 29, column: 3, scope: !26) +// CHECK:STDOUT: !33 = !DILocation(line: 30, column: 3, scope: !26) +// CHECK:STDOUT: !34 = !DILocation(line: 31, column: 5, scope: !26) +// CHECK:STDOUT: !35 = !DILocation(line: 31, column: 3, scope: !26) +// CHECK:STDOUT: !36 = !DILocation(line: 35, column: 5, scope: !26) +// CHECK:STDOUT: !37 = !DILocation(line: 35, column: 3, scope: !26) +// CHECK:STDOUT: !38 = !DILocation(line: 37, column: 5, scope: !26) +// CHECK:STDOUT: !39 = !DILocation(line: 37, column: 3, scope: !26) +// CHECK:STDOUT: !40 = !DILocation(line: 39, column: 5, scope: !26) +// CHECK:STDOUT: !41 = !DILocation(line: 39, column: 3, scope: !26) +// CHECK:STDOUT: !42 = !DILocation(line: 41, column: 5, scope: !26) +// CHECK:STDOUT: !43 = !DILocation(line: 41, column: 3, scope: !26) +// CHECK:STDOUT: !44 = !DILocation(line: 46, column: 3, scope: !26) +// CHECK:STDOUT: !45 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 19, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !46 = !DILocation(line: 19, column: 1, scope: !45) +// CHECK:STDOUT: !47 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.274514a8254d0859", scope: null, file: !3, line: 28, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !48 = !DILocation(line: 34, column: 3, scope: !47) +// CHECK:STDOUT: !49 = !DILocation(line: 36, column: 3, scope: !47) +// CHECK:STDOUT: !50 = !DILocation(line: 38, column: 3, scope: !47) +// CHECK:STDOUT: !51 = !DILocation(line: 40, column: 3, scope: !47) +// CHECK:STDOUT: !52 = !DILocation(line: 42, column: 3, scope: !47) +// CHECK:STDOUT: !53 = !DILocation(line: 29, column: 3, scope: !47) +// CHECK:STDOUT: !54 = !DILocation(line: 30, column: 3, scope: !47) +// CHECK:STDOUT: !55 = !DILocation(line: 31, column: 5, scope: !47) +// CHECK:STDOUT: !56 = !DILocation(line: 31, column: 3, scope: !47) +// CHECK:STDOUT: !57 = !DILocation(line: 35, column: 5, scope: !47) +// CHECK:STDOUT: !58 = !DILocation(line: 35, column: 3, scope: !47) +// CHECK:STDOUT: !59 = !DILocation(line: 37, column: 5, scope: !47) +// CHECK:STDOUT: !60 = !DILocation(line: 37, column: 3, scope: !47) +// CHECK:STDOUT: !61 = !DILocation(line: 39, column: 5, scope: !47) +// CHECK:STDOUT: !62 = !DILocation(line: 39, column: 3, scope: !47) +// CHECK:STDOUT: !63 = !DILocation(line: 41, column: 5, scope: !47) +// CHECK:STDOUT: !64 = !DILocation(line: 41, column: 3, scope: !47) +// CHECK:STDOUT: !65 = !DILocation(line: 46, column: 3, scope: !47) +// CHECK:STDOUT: !66 = distinct !DISubprogram(name: "H", linkageName: "_CH.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 22, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !67 = !DILocation(line: 23, column: 3, scope: !66) +// CHECK:STDOUT: !68 = distinct !DISubprogram(name: "H", linkageName: "_CH.Main.08871b6f43862d33", scope: null, file: !3, line: 22, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !69 = !DILocation(line: 23, column: 3, scope: !68) +// CHECK:STDOUT: !70 = distinct !DISubprogram(name: "H", linkageName: "_CH.Main.274514a8254d0859", scope: null, file: !3, line: 22, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !71 = !DILocation(line: 23, column: 3, scope: !70) +// CHECK:STDOUT: !72 = distinct !DISubprogram(name: "H", linkageName: "_CH.Main.19c352736f719291", scope: null, file: !3, line: 22, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !73 = !DILocation(line: 23, column: 3, scope: !72) diff --git a/toolchain/lower/testdata/function/generic/call_basic_depth.carbon b/toolchain/lower/testdata/function/generic/call_basic_depth.carbon index 71ec02e4f3bc..694638873e71 100644 --- a/toolchain/lower/testdata/function/generic/call_basic_depth.carbon +++ b/toolchain/lower/testdata/function/generic/call_basic_depth.carbon @@ -16,12 +16,12 @@ fn F[T:! type](x: T) { } -fn H[T:! type](x: T) -> T { +fn H[T:! Core.Copy](x: T) -> T { F(x); return x; } -fn G[T:! type](x: T) -> T { +fn G[T:! Core.Copy](x: T) -> T { H(x); F(x); return x; @@ -47,8 +47,8 @@ fn M() { // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %m.var), !dbg !8 // CHECK:STDOUT: %.loc34 = load i32, ptr %n.var, align 4, !dbg !9 // CHECK:STDOUT: call void @_CF.Main.b88d1103f417c6d4(i32 %.loc34), !dbg !10 -// CHECK:STDOUT: %.loc35 = load i32, ptr %n.var, align 4, !dbg !11 -// CHECK:STDOUT: %G.call = call i32 @_CG.Main.b88d1103f417c6d4(i32 %.loc35), !dbg !12 +// CHECK:STDOUT: %.loc35_9 = load i32, ptr %n.var, align 4, !dbg !11 +// CHECK:STDOUT: %G.call = call i32 @_CG.Main.b7c8e4dff2adcdaa(i32 %.loc35_9), !dbg !12 // CHECK:STDOUT: store i32 %G.call, ptr %m.var, align 4, !dbg !13 // CHECK:STDOUT: ret void, !dbg !14 // CHECK:STDOUT: } @@ -61,14 +61,14 @@ fn M() { // CHECK:STDOUT: ret void, !dbg !16 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CG.Main.b88d1103f417c6d4(i32 %x) !dbg !17 { +// CHECK:STDOUT: define linkonce_odr i32 @_CG.Main.b7c8e4dff2adcdaa(i32 %x) !dbg !17 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %H.call = call i32 @_CH.Main.b88d1103f417c6d4(i32 %x), !dbg !18 +// CHECK:STDOUT: %H.call = call i32 @_CH.Main.b7c8e4dff2adcdaa(i32 %x), !dbg !18 // CHECK:STDOUT: call void @_CF.Main.b88d1103f417c6d4(i32 %x), !dbg !19 // CHECK:STDOUT: ret i32 %x, !dbg !20 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CH.Main.b88d1103f417c6d4(i32 %x) !dbg !21 { +// CHECK:STDOUT: define linkonce_odr i32 @_CH.Main.b7c8e4dff2adcdaa(i32 %x) !dbg !21 { // CHECK:STDOUT: entry: // CHECK:STDOUT: call void @_CF.Main.b88d1103f417c6d4(i32 %x), !dbg !22 // CHECK:STDOUT: ret i32 %x, !dbg !23 @@ -99,10 +99,10 @@ fn M() { // CHECK:STDOUT: !14 = !DILocation(line: 30, column: 1, scope: !4) // CHECK:STDOUT: !15 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.b88d1103f417c6d4", scope: null, file: !3, line: 16, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !16 = !DILocation(line: 16, column: 1, scope: !15) -// CHECK:STDOUT: !17 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.b88d1103f417c6d4", scope: null, file: !3, line: 24, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !17 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 24, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !18 = !DILocation(line: 25, column: 3, scope: !17) // CHECK:STDOUT: !19 = !DILocation(line: 26, column: 3, scope: !17) // CHECK:STDOUT: !20 = !DILocation(line: 27, column: 3, scope: !17) -// CHECK:STDOUT: !21 = distinct !DISubprogram(name: "H", linkageName: "_CH.Main.b88d1103f417c6d4", scope: null, file: !3, line: 19, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !21 = distinct !DISubprogram(name: "H", linkageName: "_CH.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 19, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !22 = !DILocation(line: 20, column: 3, scope: !21) // CHECK:STDOUT: !23 = !DILocation(line: 21, column: 3, scope: !21) diff --git a/toolchain/lower/testdata/function/generic/call_dedup_ptr.carbon b/toolchain/lower/testdata/function/generic/call_dedup_ptr.carbon index 4586dad06edd..33d606e8ec42 100644 --- a/toolchain/lower/testdata/function/generic/call_dedup_ptr.carbon +++ b/toolchain/lower/testdata/function/generic/call_dedup_ptr.carbon @@ -10,14 +10,11 @@ // TIP: To dump output, run: // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/lower/testdata/function/generic/call_dedup_ptr.carbon -fn F[T:! type](x: T) -> T { +fn F[T:! Core.Copy](x: T) -> T { return x; } fn M() { - // TODO: The definitions of F for these calls lower to different identical - // functions taking a pointer param and returning a pointer. The three - // specifics could be deduplicated. var ptr_i32 : i32*; F(ptr_i32); var ptr_f64 : f64*; @@ -35,28 +32,28 @@ fn M() { // CHECK:STDOUT: %ptr_f64.var = alloca ptr, align 8, !dbg !8 // CHECK:STDOUT: %ptr_i8.var = alloca ptr, align 8, !dbg !9 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_i32.var), !dbg !7 -// CHECK:STDOUT: %.loc22 = load ptr, ptr %ptr_i32.var, align 8, !dbg !10 -// CHECK:STDOUT: %F.call.loc22 = call ptr @_CF.Main.e8193710fd35b608(ptr %.loc22), !dbg !11 +// CHECK:STDOUT: %.loc19_5 = load ptr, ptr %ptr_i32.var, align 8, !dbg !10 +// CHECK:STDOUT: %F.call.loc19 = call ptr @_CF.Main.19c352736f719291(ptr %.loc19_5), !dbg !11 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_f64.var), !dbg !8 -// CHECK:STDOUT: %.loc24 = load ptr, ptr %ptr_f64.var, align 8, !dbg !12 -// CHECK:STDOUT: %F.call.loc24 = call ptr @_CF.Main.e8193710fd35b608(ptr %.loc24), !dbg !13 +// CHECK:STDOUT: %.loc21_5 = load ptr, ptr %ptr_f64.var, align 8, !dbg !12 +// CHECK:STDOUT: %F.call.loc21 = call ptr @_CF.Main.19c352736f719291(ptr %.loc21_5), !dbg !13 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_i8.var), !dbg !9 -// CHECK:STDOUT: %.loc26 = load ptr, ptr %ptr_i8.var, align 8, !dbg !14 -// CHECK:STDOUT: %F.call.loc26 = call ptr @_CF.Main.e8193710fd35b608(ptr %.loc26), !dbg !15 +// CHECK:STDOUT: %.loc23_5 = load ptr, ptr %ptr_i8.var, align 8, !dbg !14 +// CHECK:STDOUT: %F.call.loc23 = call ptr @_CF.Main.19c352736f719291(ptr %.loc23_5), !dbg !15 // CHECK:STDOUT: ret void, !dbg !16 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) // CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #0 // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr ptr @_CF.Main.e8193710fd35b608(ptr %x) !dbg !17 { +// CHECK:STDOUT: define linkonce_odr ptr @_CF.Main.19c352736f719291(ptr %x) !dbg !17 { // CHECK:STDOUT: entry: // CHECK:STDOUT: ret ptr %x, !dbg !18 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; uselistorder directives // CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 2, 1, 0 } -// CHECK:STDOUT: uselistorder ptr @_CF.Main.e8193710fd35b608, { 2, 1, 0 } +// CHECK:STDOUT: uselistorder ptr @_CF.Main.19c352736f719291, { 2, 1, 0 } // CHECK:STDOUT: // CHECK:STDOUT: attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } // CHECK:STDOUT: @@ -70,15 +67,15 @@ fn M() { // CHECK:STDOUT: !4 = distinct !DISubprogram(name: "M", linkageName: "_CM.Main", scope: null, file: !3, line: 17, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !5 = !DISubroutineType(types: !6) // CHECK:STDOUT: !6 = !{} -// CHECK:STDOUT: !7 = !DILocation(line: 21, column: 3, scope: !4) -// CHECK:STDOUT: !8 = !DILocation(line: 23, column: 3, scope: !4) -// CHECK:STDOUT: !9 = !DILocation(line: 25, column: 3, scope: !4) -// CHECK:STDOUT: !10 = !DILocation(line: 22, column: 5, scope: !4) -// CHECK:STDOUT: !11 = !DILocation(line: 22, column: 3, scope: !4) -// CHECK:STDOUT: !12 = !DILocation(line: 24, column: 5, scope: !4) -// CHECK:STDOUT: !13 = !DILocation(line: 24, column: 3, scope: !4) -// CHECK:STDOUT: !14 = !DILocation(line: 26, column: 5, scope: !4) -// CHECK:STDOUT: !15 = !DILocation(line: 26, column: 3, scope: !4) +// CHECK:STDOUT: !7 = !DILocation(line: 18, column: 3, scope: !4) +// CHECK:STDOUT: !8 = !DILocation(line: 20, column: 3, scope: !4) +// CHECK:STDOUT: !9 = !DILocation(line: 22, column: 3, scope: !4) +// CHECK:STDOUT: !10 = !DILocation(line: 19, column: 5, scope: !4) +// CHECK:STDOUT: !11 = !DILocation(line: 19, column: 3, scope: !4) +// CHECK:STDOUT: !12 = !DILocation(line: 21, column: 5, scope: !4) +// CHECK:STDOUT: !13 = !DILocation(line: 21, column: 3, scope: !4) +// CHECK:STDOUT: !14 = !DILocation(line: 23, column: 5, scope: !4) +// CHECK:STDOUT: !15 = !DILocation(line: 23, column: 3, scope: !4) // CHECK:STDOUT: !16 = !DILocation(line: 17, column: 1, scope: !4) -// CHECK:STDOUT: !17 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.e8193710fd35b608", scope: null, file: !3, line: 13, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !17 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.19c352736f719291", scope: null, file: !3, line: 13, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !18 = !DILocation(line: 14, column: 3, scope: !17) diff --git a/toolchain/lower/testdata/function/generic/call_deref_ptr.carbon b/toolchain/lower/testdata/function/generic/call_deref_ptr.carbon index d77acc7a245f..fb2511484af9 100644 --- a/toolchain/lower/testdata/function/generic/call_deref_ptr.carbon +++ b/toolchain/lower/testdata/function/generic/call_deref_ptr.carbon @@ -15,19 +15,19 @@ // conclude "equivalent" for all the call graph. This is to account for // switching to a work-queue from recursion. -fn A[U:! type](x: U) -> U { +fn A[U:! Core.Copy](x: U) -> U { return x; } -fn D[U:! type](x: U) -> U { +fn D[U:! Core.Copy](x: U) -> U { return x; } -fn B[U:! type](x: U*) { +fn B[U:! Core.Copy](x: U*) { D(*x); } -fn F[T:! type](x: T*) { +fn F[T:! Core.Copy](x: T*) { A(i32); B(x); } @@ -40,7 +40,6 @@ fn M() { F(ptr_f64); } - // CHECK:STDOUT: ; ModuleID = 'call_deref_ptr.carbon' // CHECK:STDOUT: source_filename = "call_deref_ptr.carbon" // CHECK:STDOUT: @@ -52,62 +51,62 @@ fn M() { // CHECK:STDOUT: %ptr_f64.var = alloca ptr, align 8, !dbg !8 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_i32.var), !dbg !7 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_f64.var), !dbg !8 -// CHECK:STDOUT: %.loc39 = load ptr, ptr %ptr_i32.var, align 8, !dbg !9 -// CHECK:STDOUT: call void @_CF.Main.b88d1103f417c6d4(ptr %.loc39), !dbg !10 -// CHECK:STDOUT: %.loc40 = load ptr, ptr %ptr_f64.var, align 8, !dbg !11 -// CHECK:STDOUT: call void @_CF.Main.d4b5665541d5d7a8(ptr %.loc40), !dbg !12 +// CHECK:STDOUT: %.loc39_5 = load ptr, ptr %ptr_i32.var, align 8, !dbg !9 +// CHECK:STDOUT: call void @_CF.Main.b7c8e4dff2adcdaa(ptr %.loc39_5), !dbg !10 +// CHECK:STDOUT: %.loc40_5 = load ptr, ptr %ptr_f64.var, align 8, !dbg !11 +// CHECK:STDOUT: call void @_CF.Main.274514a8254d0859(ptr %.loc40_5), !dbg !12 // CHECK:STDOUT: ret void, !dbg !13 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) // CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #0 // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CF.Main.b88d1103f417c6d4(ptr %x) !dbg !14 { +// CHECK:STDOUT: define linkonce_odr void @_CF.Main.b7c8e4dff2adcdaa(ptr %x) !dbg !14 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %A.call = call %type @_CA.Main.5754c7a55c7cbe4a(%type zeroinitializer), !dbg !15 -// CHECK:STDOUT: call void @_CB.Main.b88d1103f417c6d4(ptr %x), !dbg !16 +// CHECK:STDOUT: %A.call = call %type @_CA.Main.08871b6f43862d33(%type zeroinitializer), !dbg !15 +// CHECK:STDOUT: call void @_CB.Main.b7c8e4dff2adcdaa(ptr %x), !dbg !16 // CHECK:STDOUT: ret void, !dbg !17 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CF.Main.d4b5665541d5d7a8(ptr %x) !dbg !18 { +// CHECK:STDOUT: define linkonce_odr void @_CF.Main.274514a8254d0859(ptr %x) !dbg !18 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %A.call = call %type @_CA.Main.5754c7a55c7cbe4a(%type zeroinitializer), !dbg !19 -// CHECK:STDOUT: call void @_CB.Main.d4b5665541d5d7a8(ptr %x), !dbg !20 +// CHECK:STDOUT: %A.call = call %type @_CA.Main.08871b6f43862d33(%type zeroinitializer), !dbg !19 +// CHECK:STDOUT: call void @_CB.Main.274514a8254d0859(ptr %x), !dbg !20 // CHECK:STDOUT: ret void, !dbg !21 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr %type @_CA.Main.5754c7a55c7cbe4a(%type %x) !dbg !22 { +// CHECK:STDOUT: define linkonce_odr %type @_CA.Main.08871b6f43862d33(%type %x) !dbg !22 { // CHECK:STDOUT: entry: // CHECK:STDOUT: ret %type %x, !dbg !23 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CB.Main.b88d1103f417c6d4(ptr %x) !dbg !24 { +// CHECK:STDOUT: define linkonce_odr void @_CB.Main.b7c8e4dff2adcdaa(ptr %x) !dbg !24 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %.loc27_5.2 = load i32, ptr %x, align 4, !dbg !25 -// CHECK:STDOUT: %D.call = call i32 @_CD.Main.b88d1103f417c6d4(i32 %.loc27_5.2), !dbg !26 +// CHECK:STDOUT: %D.call = call i32 @_CD.Main.b7c8e4dff2adcdaa(i32 %.loc27_5.2), !dbg !26 // CHECK:STDOUT: ret void, !dbg !27 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CB.Main.d4b5665541d5d7a8(ptr %x) !dbg !28 { +// CHECK:STDOUT: define linkonce_odr void @_CB.Main.274514a8254d0859(ptr %x) !dbg !28 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %.loc27_5.2 = load double, ptr %x, align 8, !dbg !29 -// CHECK:STDOUT: %D.call = call double @_CD.Main.d4b5665541d5d7a8(double %.loc27_5.2), !dbg !30 +// CHECK:STDOUT: %D.call = call double @_CD.Main.274514a8254d0859(double %.loc27_5.2), !dbg !30 // CHECK:STDOUT: ret void, !dbg !31 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CD.Main.b88d1103f417c6d4(i32 %x) !dbg !32 { +// CHECK:STDOUT: define linkonce_odr i32 @_CD.Main.b7c8e4dff2adcdaa(i32 %x) !dbg !32 { // CHECK:STDOUT: entry: // CHECK:STDOUT: ret i32 %x, !dbg !33 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr double @_CD.Main.d4b5665541d5d7a8(double %x) !dbg !34 { +// CHECK:STDOUT: define linkonce_odr double @_CD.Main.274514a8254d0859(double %x) !dbg !34 { // CHECK:STDOUT: entry: // CHECK:STDOUT: ret double %x, !dbg !35 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; uselistorder directives // CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 1, 0 } -// CHECK:STDOUT: uselistorder ptr @_CA.Main.5754c7a55c7cbe4a, { 1, 0 } +// CHECK:STDOUT: uselistorder ptr @_CA.Main.08871b6f43862d33, { 1, 0 } // CHECK:STDOUT: // CHECK:STDOUT: attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } // CHECK:STDOUT: @@ -128,25 +127,25 @@ fn M() { // CHECK:STDOUT: !11 = !DILocation(line: 40, column: 5, scope: !4) // CHECK:STDOUT: !12 = !DILocation(line: 40, column: 3, scope: !4) // CHECK:STDOUT: !13 = !DILocation(line: 35, column: 1, scope: !4) -// CHECK:STDOUT: !14 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.b88d1103f417c6d4", scope: null, file: !3, line: 30, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !14 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 30, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !15 = !DILocation(line: 31, column: 3, scope: !14) // CHECK:STDOUT: !16 = !DILocation(line: 32, column: 3, scope: !14) // CHECK:STDOUT: !17 = !DILocation(line: 30, column: 1, scope: !14) -// CHECK:STDOUT: !18 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 30, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !18 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.274514a8254d0859", scope: null, file: !3, line: 30, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !19 = !DILocation(line: 31, column: 3, scope: !18) // CHECK:STDOUT: !20 = !DILocation(line: 32, column: 3, scope: !18) // CHECK:STDOUT: !21 = !DILocation(line: 30, column: 1, scope: !18) -// CHECK:STDOUT: !22 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.5754c7a55c7cbe4a", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !22 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.08871b6f43862d33", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !23 = !DILocation(line: 19, column: 3, scope: !22) -// CHECK:STDOUT: !24 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.b88d1103f417c6d4", scope: null, file: !3, line: 26, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !24 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 26, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !25 = !DILocation(line: 27, column: 5, scope: !24) // CHECK:STDOUT: !26 = !DILocation(line: 27, column: 3, scope: !24) // CHECK:STDOUT: !27 = !DILocation(line: 26, column: 1, scope: !24) -// CHECK:STDOUT: !28 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 26, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !28 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.274514a8254d0859", scope: null, file: !3, line: 26, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !29 = !DILocation(line: 27, column: 5, scope: !28) // CHECK:STDOUT: !30 = !DILocation(line: 27, column: 3, scope: !28) // CHECK:STDOUT: !31 = !DILocation(line: 26, column: 1, scope: !28) -// CHECK:STDOUT: !32 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.b88d1103f417c6d4", scope: null, file: !3, line: 22, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !32 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 22, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !33 = !DILocation(line: 23, column: 3, scope: !32) -// CHECK:STDOUT: !34 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 22, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !34 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.274514a8254d0859", scope: null, file: !3, line: 22, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !35 = !DILocation(line: 23, column: 3, scope: !34) diff --git a/toolchain/lower/testdata/function/generic/call_different_specific.carbon b/toolchain/lower/testdata/function/generic/call_different_specific.carbon index 3d754bc80026..8b3f848c3d25 100644 --- a/toolchain/lower/testdata/function/generic/call_different_specific.carbon +++ b/toolchain/lower/testdata/function/generic/call_different_specific.carbon @@ -22,19 +22,19 @@ // specifics, where the pointer values are different, and the calls to the // two D specifics are to functions with different function types. -fn A[U:! type](x: U) -> U { +fn A[U:! Core.Copy](x: U) -> U { return x; } -fn D[U:! type](x: U) -> U { +fn D[U:! Core.Copy](x: U) -> U { return x; } -fn B[U:! type](x: U*) { +fn B[U:! Core.Copy](x: U*) { D(*x); } -fn F[T:! type](x: T*) { +fn F[T:! Core.Copy](x: T*) { A(i32); B(x); } @@ -47,7 +47,6 @@ fn M() { F(ptr_f64); } - // CHECK:STDOUT: ; ModuleID = 'call_different_specific.carbon' // CHECK:STDOUT: source_filename = "call_different_specific.carbon" // CHECK:STDOUT: @@ -59,62 +58,62 @@ fn M() { // CHECK:STDOUT: %ptr_f64.var = alloca ptr, align 8, !dbg !8 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_i32.var), !dbg !7 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_f64.var), !dbg !8 -// CHECK:STDOUT: %.loc46 = load ptr, ptr %ptr_i32.var, align 8, !dbg !9 -// CHECK:STDOUT: call void @_CF.Main.b88d1103f417c6d4(ptr %.loc46), !dbg !10 -// CHECK:STDOUT: %.loc47 = load ptr, ptr %ptr_f64.var, align 8, !dbg !11 -// CHECK:STDOUT: call void @_CF.Main.d4b5665541d5d7a8(ptr %.loc47), !dbg !12 +// CHECK:STDOUT: %.loc46_5 = load ptr, ptr %ptr_i32.var, align 8, !dbg !9 +// CHECK:STDOUT: call void @_CF.Main.b7c8e4dff2adcdaa(ptr %.loc46_5), !dbg !10 +// CHECK:STDOUT: %.loc47_5 = load ptr, ptr %ptr_f64.var, align 8, !dbg !11 +// CHECK:STDOUT: call void @_CF.Main.274514a8254d0859(ptr %.loc47_5), !dbg !12 // CHECK:STDOUT: ret void, !dbg !13 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) // CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #0 // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CF.Main.b88d1103f417c6d4(ptr %x) !dbg !14 { +// CHECK:STDOUT: define linkonce_odr void @_CF.Main.b7c8e4dff2adcdaa(ptr %x) !dbg !14 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %A.call = call %type @_CA.Main.5754c7a55c7cbe4a(%type zeroinitializer), !dbg !15 -// CHECK:STDOUT: call void @_CB.Main.b88d1103f417c6d4(ptr %x), !dbg !16 +// CHECK:STDOUT: %A.call = call %type @_CA.Main.08871b6f43862d33(%type zeroinitializer), !dbg !15 +// CHECK:STDOUT: call void @_CB.Main.b7c8e4dff2adcdaa(ptr %x), !dbg !16 // CHECK:STDOUT: ret void, !dbg !17 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CF.Main.d4b5665541d5d7a8(ptr %x) !dbg !18 { +// CHECK:STDOUT: define linkonce_odr void @_CF.Main.274514a8254d0859(ptr %x) !dbg !18 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %A.call = call %type @_CA.Main.5754c7a55c7cbe4a(%type zeroinitializer), !dbg !19 -// CHECK:STDOUT: call void @_CB.Main.d4b5665541d5d7a8(ptr %x), !dbg !20 +// CHECK:STDOUT: %A.call = call %type @_CA.Main.08871b6f43862d33(%type zeroinitializer), !dbg !19 +// CHECK:STDOUT: call void @_CB.Main.274514a8254d0859(ptr %x), !dbg !20 // CHECK:STDOUT: ret void, !dbg !21 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr %type @_CA.Main.5754c7a55c7cbe4a(%type %x) !dbg !22 { +// CHECK:STDOUT: define linkonce_odr %type @_CA.Main.08871b6f43862d33(%type %x) !dbg !22 { // CHECK:STDOUT: entry: // CHECK:STDOUT: ret %type %x, !dbg !23 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CB.Main.b88d1103f417c6d4(ptr %x) !dbg !24 { +// CHECK:STDOUT: define linkonce_odr void @_CB.Main.b7c8e4dff2adcdaa(ptr %x) !dbg !24 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %.loc34_5.2 = load i32, ptr %x, align 4, !dbg !25 -// CHECK:STDOUT: %D.call = call i32 @_CD.Main.b88d1103f417c6d4(i32 %.loc34_5.2), !dbg !26 +// CHECK:STDOUT: %D.call = call i32 @_CD.Main.b7c8e4dff2adcdaa(i32 %.loc34_5.2), !dbg !26 // CHECK:STDOUT: ret void, !dbg !27 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CB.Main.d4b5665541d5d7a8(ptr %x) !dbg !28 { +// CHECK:STDOUT: define linkonce_odr void @_CB.Main.274514a8254d0859(ptr %x) !dbg !28 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %.loc34_5.2 = load double, ptr %x, align 8, !dbg !29 -// CHECK:STDOUT: %D.call = call double @_CD.Main.d4b5665541d5d7a8(double %.loc34_5.2), !dbg !30 +// CHECK:STDOUT: %D.call = call double @_CD.Main.274514a8254d0859(double %.loc34_5.2), !dbg !30 // CHECK:STDOUT: ret void, !dbg !31 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CD.Main.b88d1103f417c6d4(i32 %x) !dbg !32 { +// CHECK:STDOUT: define linkonce_odr i32 @_CD.Main.b7c8e4dff2adcdaa(i32 %x) !dbg !32 { // CHECK:STDOUT: entry: // CHECK:STDOUT: ret i32 %x, !dbg !33 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr double @_CD.Main.d4b5665541d5d7a8(double %x) !dbg !34 { +// CHECK:STDOUT: define linkonce_odr double @_CD.Main.274514a8254d0859(double %x) !dbg !34 { // CHECK:STDOUT: entry: // CHECK:STDOUT: ret double %x, !dbg !35 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; uselistorder directives // CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 1, 0 } -// CHECK:STDOUT: uselistorder ptr @_CA.Main.5754c7a55c7cbe4a, { 1, 0 } +// CHECK:STDOUT: uselistorder ptr @_CA.Main.08871b6f43862d33, { 1, 0 } // CHECK:STDOUT: // CHECK:STDOUT: attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } // CHECK:STDOUT: @@ -135,25 +134,25 @@ fn M() { // CHECK:STDOUT: !11 = !DILocation(line: 47, column: 5, scope: !4) // CHECK:STDOUT: !12 = !DILocation(line: 47, column: 3, scope: !4) // CHECK:STDOUT: !13 = !DILocation(line: 42, column: 1, scope: !4) -// CHECK:STDOUT: !14 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.b88d1103f417c6d4", scope: null, file: !3, line: 37, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !14 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 37, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !15 = !DILocation(line: 38, column: 3, scope: !14) // CHECK:STDOUT: !16 = !DILocation(line: 39, column: 3, scope: !14) // CHECK:STDOUT: !17 = !DILocation(line: 37, column: 1, scope: !14) -// CHECK:STDOUT: !18 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 37, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !18 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.274514a8254d0859", scope: null, file: !3, line: 37, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !19 = !DILocation(line: 38, column: 3, scope: !18) // CHECK:STDOUT: !20 = !DILocation(line: 39, column: 3, scope: !18) // CHECK:STDOUT: !21 = !DILocation(line: 37, column: 1, scope: !18) -// CHECK:STDOUT: !22 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.5754c7a55c7cbe4a", scope: null, file: !3, line: 25, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !22 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.08871b6f43862d33", scope: null, file: !3, line: 25, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !23 = !DILocation(line: 26, column: 3, scope: !22) -// CHECK:STDOUT: !24 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.b88d1103f417c6d4", scope: null, file: !3, line: 33, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !24 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 33, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !25 = !DILocation(line: 34, column: 5, scope: !24) // CHECK:STDOUT: !26 = !DILocation(line: 34, column: 3, scope: !24) // CHECK:STDOUT: !27 = !DILocation(line: 33, column: 1, scope: !24) -// CHECK:STDOUT: !28 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 33, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !28 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.274514a8254d0859", scope: null, file: !3, line: 33, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !29 = !DILocation(line: 34, column: 5, scope: !28) // CHECK:STDOUT: !30 = !DILocation(line: 34, column: 3, scope: !28) // CHECK:STDOUT: !31 = !DILocation(line: 33, column: 1, scope: !28) -// CHECK:STDOUT: !32 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.b88d1103f417c6d4", scope: null, file: !3, line: 29, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !32 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 29, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !33 = !DILocation(line: 30, column: 3, scope: !32) -// CHECK:STDOUT: !34 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 29, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !34 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.274514a8254d0859", scope: null, file: !3, line: 29, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !35 = !DILocation(line: 30, column: 3, scope: !34) diff --git a/toolchain/lower/testdata/function/generic/call_method.carbon b/toolchain/lower/testdata/function/generic/call_method.carbon index c138b2e09ff5..90756a44aaa3 100644 --- a/toolchain/lower/testdata/function/generic/call_method.carbon +++ b/toolchain/lower/testdata/function/generic/call_method.carbon @@ -11,7 +11,7 @@ // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/lower/testdata/function/generic/call_method.carbon class C { - fn F[self: Self, T:! type](x: T) -> T { + fn F[self: Self, T:! Core.Copy](x: T) -> T { return x; } } @@ -36,7 +36,7 @@ fn CallF() -> i32 { // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %n.var), !dbg !8 // CHECK:STDOUT: store i32 0, ptr %n.var, align 4, !dbg !8 // CHECK:STDOUT: %.loc22_14 = load i32, ptr %n.var, align 4, !dbg !9 -// CHECK:STDOUT: %C.F.call = call i32 @_CF.C.Main.b88d1103f417c6d4(ptr %c.var, i32 %.loc22_14), !dbg !10 +// CHECK:STDOUT: %C.F.call = call i32 @_CF.C.Main.b7c8e4dff2adcdaa(ptr %c.var, i32 %.loc22_14), !dbg !10 // CHECK:STDOUT: ret i32 %C.F.call, !dbg !11 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -46,7 +46,7 @@ fn CallF() -> i32 { // CHECK:STDOUT: ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite) // CHECK:STDOUT: declare void @llvm.memcpy.p0.p0.i64(ptr noalias writeonly captures(none), ptr noalias readonly captures(none), i64, i1 immarg) #1 // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CF.C.Main.b88d1103f417c6d4(ptr %self, i32 %x) !dbg !12 { +// CHECK:STDOUT: define linkonce_odr i32 @_CF.C.Main.b7c8e4dff2adcdaa(ptr %self, i32 %x) !dbg !12 { // CHECK:STDOUT: entry: // CHECK:STDOUT: ret i32 %x, !dbg !13 // CHECK:STDOUT: } @@ -72,5 +72,5 @@ fn CallF() -> i32 { // CHECK:STDOUT: !9 = !DILocation(line: 22, column: 14, scope: !4) // CHECK:STDOUT: !10 = !DILocation(line: 22, column: 10, scope: !4) // CHECK:STDOUT: !11 = !DILocation(line: 22, column: 3, scope: !4) -// CHECK:STDOUT: !12 = distinct !DISubprogram(name: "F", linkageName: "_CF.C.Main.b88d1103f417c6d4", scope: null, file: !3, line: 14, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !12 = distinct !DISubprogram(name: "F", linkageName: "_CF.C.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 14, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !13 = !DILocation(line: 15, column: 5, scope: !12) diff --git a/toolchain/lower/testdata/function/generic/call_recursive_basic.carbon b/toolchain/lower/testdata/function/generic/call_recursive_basic.carbon index 3f26ffa1ba9e..3c263eaab586 100644 --- a/toolchain/lower/testdata/function/generic/call_recursive_basic.carbon +++ b/toolchain/lower/testdata/function/generic/call_recursive_basic.carbon @@ -10,11 +10,15 @@ // TIP: To dump output, run: // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/lower/testdata/function/generic/call_recursive_basic.carbon -class C {} +class C { + impl as Core.Copy { + fn Op[self: Self]() -> Self { return {}; } + } +} // The two specifics for recursive function F, when T is a pointer, could be // deduplicated. -fn F[T:! type](x: T, count: i32) -> T { +fn F[T:! Core.Copy](x: T, count: i32) -> T { if (count > 0) { return x; } @@ -42,79 +46,91 @@ fn M() { // CHECK:STDOUT: ; ModuleID = 'call_recursive_basic.carbon' // CHECK:STDOUT: source_filename = "call_recursive_basic.carbon" // CHECK:STDOUT: -// CHECK:STDOUT: define void @_CM.Main() !dbg !4 { +// CHECK:STDOUT: @C.val.loc15_44 = internal constant {} zeroinitializer +// CHECK:STDOUT: +// CHECK:STDOUT: define void @"_COp.C.Main:Copy.Core"(ptr sret({}) %return, ptr %self) !dbg !4 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %n.var = alloca i32, align 4, !dbg !7 -// CHECK:STDOUT: %m.var = alloca double, align 8, !dbg !8 -// CHECK:STDOUT: %ptr_i32.var = alloca ptr, align 8, !dbg !9 -// CHECK:STDOUT: %ptr_f64.var = alloca ptr, align 8, !dbg !10 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %n.var), !dbg !7 -// CHECK:STDOUT: store i32 0, ptr %n.var, align 4, !dbg !7 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %m.var), !dbg !8 -// CHECK:STDOUT: store double 1.000000e+00, ptr %m.var, align 8, !dbg !8 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_i32.var), !dbg !9 -// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_f64.var), !dbg !10 -// CHECK:STDOUT: %.loc30_5 = load i32, ptr %n.var, align 4, !dbg !11 -// CHECK:STDOUT: %F.call.loc30 = call i32 @_CF.Main.b88d1103f417c6d4(i32 %.loc30_5, i32 0), !dbg !12 -// CHECK:STDOUT: %.loc31_5 = load double, ptr %m.var, align 8, !dbg !13 -// CHECK:STDOUT: %F.call.loc31 = call double @_CF.Main.d4b5665541d5d7a8(double %.loc31_5, i32 0), !dbg !14 -// CHECK:STDOUT: %.loc32_5 = load ptr, ptr %ptr_i32.var, align 8, !dbg !15 -// CHECK:STDOUT: %F.call.loc32 = call ptr @_CF.Main.e8193710fd35b608(ptr %.loc32_5, i32 0), !dbg !16 -// CHECK:STDOUT: %.loc33_5 = load ptr, ptr %ptr_f64.var, align 8, !dbg !17 -// CHECK:STDOUT: %F.call.loc33 = call ptr @_CF.Main.e8193710fd35b608(ptr %.loc33_5, i32 0), !dbg !18 -// CHECK:STDOUT: ret void, !dbg !19 +// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %return, ptr align 1 @C.val.loc15_44, i64 0, i1 false), !dbg !7 +// CHECK:STDOUT: ret void, !dbg !7 // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: define void @_CM.Main() !dbg !8 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: %n.var = alloca i32, align 4, !dbg !9 +// CHECK:STDOUT: %m.var = alloca double, align 8, !dbg !10 +// CHECK:STDOUT: %ptr_i32.var = alloca ptr, align 8, !dbg !11 +// CHECK:STDOUT: %ptr_f64.var = alloca ptr, align 8, !dbg !12 +// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %n.var), !dbg !9 +// CHECK:STDOUT: store i32 0, ptr %n.var, align 4, !dbg !9 +// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %m.var), !dbg !10 +// CHECK:STDOUT: store double 1.000000e+00, ptr %m.var, align 8, !dbg !10 +// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_i32.var), !dbg !11 +// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_f64.var), !dbg !12 +// CHECK:STDOUT: %.loc34_5 = load i32, ptr %n.var, align 4, !dbg !13 +// CHECK:STDOUT: %F.call.loc34 = call i32 @_CF.Main.b7c8e4dff2adcdaa(i32 %.loc34_5, i32 0), !dbg !14 +// CHECK:STDOUT: %.loc35_5 = load double, ptr %m.var, align 8, !dbg !15 +// CHECK:STDOUT: %F.call.loc35 = call double @_CF.Main.274514a8254d0859(double %.loc35_5, i32 0), !dbg !16 +// CHECK:STDOUT: %.loc36_5 = load ptr, ptr %ptr_i32.var, align 8, !dbg !17 +// CHECK:STDOUT: %F.call.loc36 = call ptr @_CF.Main.19c352736f719291(ptr %.loc36_5, i32 0), !dbg !18 +// CHECK:STDOUT: %.loc37_5 = load ptr, ptr %ptr_f64.var, align 8, !dbg !19 +// CHECK:STDOUT: %F.call.loc37 = call ptr @_CF.Main.19c352736f719291(ptr %.loc37_5, i32 0), !dbg !20 +// CHECK:STDOUT: ret void, !dbg !21 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite) +// CHECK:STDOUT: declare void @llvm.memcpy.p0.p0.i64(ptr noalias writeonly captures(none), ptr noalias readonly captures(none), i64, i1 immarg) #0 +// CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) -// CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #0 +// CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #1 // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CF.Main.b88d1103f417c6d4(i32 %x, i32 %count) !dbg !20 { +// CHECK:STDOUT: define linkonce_odr i32 @_CF.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count) !dbg !22 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 0, !dbg !21 -// CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then, label %if.else, !dbg !22 +// CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 0, !dbg !23 +// CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then, label %if.else, !dbg !24 // CHECK:STDOUT: // CHECK:STDOUT: if.then: ; preds = %entry -// CHECK:STDOUT: ret i32 %x, !dbg !23 +// CHECK:STDOUT: ret i32 %x, !dbg !25 // CHECK:STDOUT: // CHECK:STDOUT: if.else: ; preds = %entry -// CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !24 -// CHECK:STDOUT: %F.call = call i32 @_CF.Main.b88d1103f417c6d4(i32 %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !25 -// CHECK:STDOUT: ret i32 %F.call, !dbg !26 +// CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !26 +// CHECK:STDOUT: %F.call = call i32 @_CF.Main.b7c8e4dff2adcdaa(i32 %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !27 +// CHECK:STDOUT: ret i32 %F.call, !dbg !28 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr double @_CF.Main.d4b5665541d5d7a8(double %x, i32 %count) !dbg !27 { +// CHECK:STDOUT: define linkonce_odr double @_CF.Main.274514a8254d0859(double %x, i32 %count) !dbg !29 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 0, !dbg !28 -// CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then, label %if.else, !dbg !29 +// CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 0, !dbg !30 +// CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then, label %if.else, !dbg !31 // CHECK:STDOUT: // CHECK:STDOUT: if.then: ; preds = %entry -// CHECK:STDOUT: ret double %x, !dbg !30 +// CHECK:STDOUT: ret double %x, !dbg !32 // CHECK:STDOUT: // CHECK:STDOUT: if.else: ; preds = %entry -// CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !31 -// CHECK:STDOUT: %F.call = call double @_CF.Main.d4b5665541d5d7a8(double %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !32 -// CHECK:STDOUT: ret double %F.call, !dbg !33 +// CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !33 +// CHECK:STDOUT: %F.call = call double @_CF.Main.274514a8254d0859(double %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !34 +// CHECK:STDOUT: ret double %F.call, !dbg !35 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr ptr @_CF.Main.e8193710fd35b608(ptr %x, i32 %count) !dbg !34 { +// CHECK:STDOUT: define linkonce_odr ptr @_CF.Main.19c352736f719291(ptr %x, i32 %count) !dbg !36 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 0, !dbg !35 -// CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then, label %if.else, !dbg !36 +// CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 0, !dbg !37 +// CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then, label %if.else, !dbg !38 // CHECK:STDOUT: // CHECK:STDOUT: if.then: ; preds = %entry -// CHECK:STDOUT: ret ptr %x, !dbg !37 +// CHECK:STDOUT: ret ptr %x, !dbg !39 // CHECK:STDOUT: // CHECK:STDOUT: if.else: ; preds = %entry -// CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !38 -// CHECK:STDOUT: %F.call = call ptr @_CF.Main.e8193710fd35b608(ptr %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !39 -// CHECK:STDOUT: ret ptr %F.call, !dbg !40 +// CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !40 +// CHECK:STDOUT: %F.call = call ptr @_CF.Main.19c352736f719291(ptr %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !41 +// CHECK:STDOUT: ret ptr %F.call, !dbg !42 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; uselistorder directives // CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 3, 2, 1, 0 } -// CHECK:STDOUT: uselistorder ptr @_CF.Main.e8193710fd35b608, { 1, 2, 0 } +// CHECK:STDOUT: uselistorder ptr @_CF.Main.19c352736f719291, { 1, 2, 0 } // CHECK:STDOUT: -// CHECK:STDOUT: attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } +// CHECK:STDOUT: attributes #0 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) } +// CHECK:STDOUT: attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } // CHECK:STDOUT: // CHECK:STDOUT: !llvm.module.flags = !{!0, !1} // CHECK:STDOUT: !llvm.dbg.cu = !{!2} @@ -123,40 +139,42 @@ fn M() { // CHECK:STDOUT: !1 = !{i32 2, !"Debug Info Version", i32 3} // CHECK:STDOUT: !2 = distinct !DICompileUnit(language: DW_LANG_C, file: !3, producer: "carbon", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug) // CHECK:STDOUT: !3 = !DIFile(filename: "call_recursive_basic.carbon", directory: "") -// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "M", linkageName: "_CM.Main", scope: null, file: !3, line: 24, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "Op", linkageName: "_COp.C.Main:Copy.Core", scope: null, file: !3, line: 15, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !5 = !DISubroutineType(types: !6) // CHECK:STDOUT: !6 = !{} -// CHECK:STDOUT: !7 = !DILocation(line: 25, column: 3, scope: !4) -// CHECK:STDOUT: !8 = !DILocation(line: 26, column: 3, scope: !4) -// CHECK:STDOUT: !9 = !DILocation(line: 27, column: 3, scope: !4) -// CHECK:STDOUT: !10 = !DILocation(line: 28, column: 3, scope: !4) -// CHECK:STDOUT: !11 = !DILocation(line: 30, column: 5, scope: !4) -// CHECK:STDOUT: !12 = !DILocation(line: 30, column: 3, scope: !4) -// CHECK:STDOUT: !13 = !DILocation(line: 31, column: 5, scope: !4) -// CHECK:STDOUT: !14 = !DILocation(line: 31, column: 3, scope: !4) -// CHECK:STDOUT: !15 = !DILocation(line: 32, column: 5, scope: !4) -// CHECK:STDOUT: !16 = !DILocation(line: 32, column: 3, scope: !4) -// CHECK:STDOUT: !17 = !DILocation(line: 33, column: 5, scope: !4) -// CHECK:STDOUT: !18 = !DILocation(line: 33, column: 3, scope: !4) -// CHECK:STDOUT: !19 = !DILocation(line: 24, column: 1, scope: !4) -// CHECK:STDOUT: !20 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.b88d1103f417c6d4", scope: null, file: !3, line: 17, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !21 = !DILocation(line: 18, column: 7, scope: !20) -// CHECK:STDOUT: !22 = !DILocation(line: 18, column: 6, scope: !20) -// CHECK:STDOUT: !23 = !DILocation(line: 19, column: 5, scope: !20) -// CHECK:STDOUT: !24 = !DILocation(line: 21, column: 15, scope: !20) -// CHECK:STDOUT: !25 = !DILocation(line: 21, column: 10, scope: !20) -// CHECK:STDOUT: !26 = !DILocation(line: 21, column: 3, scope: !20) -// CHECK:STDOUT: !27 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 17, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !28 = !DILocation(line: 18, column: 7, scope: !27) -// CHECK:STDOUT: !29 = !DILocation(line: 18, column: 6, scope: !27) -// CHECK:STDOUT: !30 = !DILocation(line: 19, column: 5, scope: !27) -// CHECK:STDOUT: !31 = !DILocation(line: 21, column: 15, scope: !27) -// CHECK:STDOUT: !32 = !DILocation(line: 21, column: 10, scope: !27) -// CHECK:STDOUT: !33 = !DILocation(line: 21, column: 3, scope: !27) -// CHECK:STDOUT: !34 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.e8193710fd35b608", scope: null, file: !3, line: 17, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !35 = !DILocation(line: 18, column: 7, scope: !34) -// CHECK:STDOUT: !36 = !DILocation(line: 18, column: 6, scope: !34) -// CHECK:STDOUT: !37 = !DILocation(line: 19, column: 5, scope: !34) -// CHECK:STDOUT: !38 = !DILocation(line: 21, column: 15, scope: !34) -// CHECK:STDOUT: !39 = !DILocation(line: 21, column: 10, scope: !34) -// CHECK:STDOUT: !40 = !DILocation(line: 21, column: 3, scope: !34) +// CHECK:STDOUT: !7 = !DILocation(line: 15, column: 35, scope: !4) +// CHECK:STDOUT: !8 = distinct !DISubprogram(name: "M", linkageName: "_CM.Main", scope: null, file: !3, line: 28, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !9 = !DILocation(line: 29, column: 3, scope: !8) +// CHECK:STDOUT: !10 = !DILocation(line: 30, column: 3, scope: !8) +// CHECK:STDOUT: !11 = !DILocation(line: 31, column: 3, scope: !8) +// CHECK:STDOUT: !12 = !DILocation(line: 32, column: 3, scope: !8) +// CHECK:STDOUT: !13 = !DILocation(line: 34, column: 5, scope: !8) +// CHECK:STDOUT: !14 = !DILocation(line: 34, column: 3, scope: !8) +// CHECK:STDOUT: !15 = !DILocation(line: 35, column: 5, scope: !8) +// CHECK:STDOUT: !16 = !DILocation(line: 35, column: 3, scope: !8) +// CHECK:STDOUT: !17 = !DILocation(line: 36, column: 5, scope: !8) +// CHECK:STDOUT: !18 = !DILocation(line: 36, column: 3, scope: !8) +// CHECK:STDOUT: !19 = !DILocation(line: 37, column: 5, scope: !8) +// CHECK:STDOUT: !20 = !DILocation(line: 37, column: 3, scope: !8) +// CHECK:STDOUT: !21 = !DILocation(line: 28, column: 1, scope: !8) +// CHECK:STDOUT: !22 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 21, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !23 = !DILocation(line: 22, column: 7, scope: !22) +// CHECK:STDOUT: !24 = !DILocation(line: 22, column: 6, scope: !22) +// CHECK:STDOUT: !25 = !DILocation(line: 23, column: 5, scope: !22) +// CHECK:STDOUT: !26 = !DILocation(line: 25, column: 15, scope: !22) +// CHECK:STDOUT: !27 = !DILocation(line: 25, column: 10, scope: !22) +// CHECK:STDOUT: !28 = !DILocation(line: 25, column: 3, scope: !22) +// CHECK:STDOUT: !29 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.274514a8254d0859", scope: null, file: !3, line: 21, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !30 = !DILocation(line: 22, column: 7, scope: !29) +// CHECK:STDOUT: !31 = !DILocation(line: 22, column: 6, scope: !29) +// CHECK:STDOUT: !32 = !DILocation(line: 23, column: 5, scope: !29) +// CHECK:STDOUT: !33 = !DILocation(line: 25, column: 15, scope: !29) +// CHECK:STDOUT: !34 = !DILocation(line: 25, column: 10, scope: !29) +// CHECK:STDOUT: !35 = !DILocation(line: 25, column: 3, scope: !29) +// CHECK:STDOUT: !36 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.19c352736f719291", scope: null, file: !3, line: 21, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !37 = !DILocation(line: 22, column: 7, scope: !36) +// CHECK:STDOUT: !38 = !DILocation(line: 22, column: 6, scope: !36) +// CHECK:STDOUT: !39 = !DILocation(line: 23, column: 5, scope: !36) +// CHECK:STDOUT: !40 = !DILocation(line: 25, column: 15, scope: !36) +// CHECK:STDOUT: !41 = !DILocation(line: 25, column: 10, scope: !36) +// CHECK:STDOUT: !42 = !DILocation(line: 25, column: 3, scope: !36) diff --git a/toolchain/lower/testdata/function/generic/call_recursive_diamond.carbon b/toolchain/lower/testdata/function/generic/call_recursive_diamond.carbon index 37e233874b8d..11b14ce0474f 100644 --- a/toolchain/lower/testdata/function/generic/call_recursive_diamond.carbon +++ b/toolchain/lower/testdata/function/generic/call_recursive_diamond.carbon @@ -11,14 +11,14 @@ // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/lower/testdata/function/generic/call_recursive_diamond.carbon import Core library "io"; -fn A[T:! type](x: T, count: i32) -> T; -fn B[T:! type](x: T, count: i32) -> T; -fn C[T:! type](x: T, count: i32) -> T; -fn D[T:! type](x: T, count: i32) -> T; +fn A[T:! Core.Copy](x: T, count: i32) -> T; +fn B[T:! Core.Copy](x: T, count: i32) -> T; +fn C[T:! Core.Copy](x: T, count: i32) -> T; +fn D[T:! Core.Copy](x: T, count: i32) -> T; // Builds on `call_recursive_mutual.carbon`. The two specifics for each of: // A, B, C, D with a pointer type could be deduplicated. -fn A[T:! type](x: T, count: i32) -> T { +fn A[T:! Core.Copy](x: T, count: i32) -> T { if (count > 4) { return x; } @@ -30,17 +30,17 @@ fn A[T:! type](x: T, count: i32) -> T { } // B and C are not equivalent in the diamond: different generics and different function bodies. -fn B[T:! type](x: T, count: i32) -> T { +fn B[T:! Core.Copy](x: T, count: i32) -> T { Core.Print(1); return D(x, count); } -fn C[T:! type](x: T, count: i32) -> T { +fn C[T:! Core.Copy](x: T, count: i32) -> T { Core.Print(2); return D(x, count); } -fn D[T:! type](x: T, count: i32) -> T { +fn D[T:! Core.Copy](x: T, count: i32) -> T { return A(x, count + 1); } @@ -74,20 +74,20 @@ fn M() { // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_i32.var), !dbg !9 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_f64.var), !dbg !10 // CHECK:STDOUT: %.loc53_5 = load i32, ptr %n.var, align 4, !dbg !11 -// CHECK:STDOUT: %A.call.loc53 = call i32 @_CA.Main.b88d1103f417c6d4(i32 %.loc53_5, i32 0), !dbg !12 +// CHECK:STDOUT: %A.call.loc53 = call i32 @_CA.Main.b7c8e4dff2adcdaa(i32 %.loc53_5, i32 0), !dbg !12 // CHECK:STDOUT: %.loc54_5 = load double, ptr %m.var, align 8, !dbg !13 -// CHECK:STDOUT: %A.call.loc54 = call double @_CA.Main.d4b5665541d5d7a8(double %.loc54_5, i32 0), !dbg !14 +// CHECK:STDOUT: %A.call.loc54 = call double @_CA.Main.274514a8254d0859(double %.loc54_5, i32 0), !dbg !14 // CHECK:STDOUT: %.loc55_5 = load ptr, ptr %ptr_i32.var, align 8, !dbg !15 -// CHECK:STDOUT: %A.call.loc55 = call ptr @_CA.Main.e8193710fd35b608(ptr %.loc55_5, i32 0), !dbg !16 +// CHECK:STDOUT: %A.call.loc55 = call ptr @_CA.Main.19c352736f719291(ptr %.loc55_5, i32 0), !dbg !16 // CHECK:STDOUT: %.loc56_5 = load ptr, ptr %ptr_f64.var, align 8, !dbg !17 -// CHECK:STDOUT: %A.call.loc56 = call ptr @_CA.Main.e8193710fd35b608(ptr %.loc56_5, i32 0), !dbg !18 +// CHECK:STDOUT: %A.call.loc56 = call ptr @_CA.Main.19c352736f719291(ptr %.loc56_5, i32 0), !dbg !18 // CHECK:STDOUT: ret void, !dbg !19 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) // CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #0 // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CA.Main.b88d1103f417c6d4(i32 %x, i32 %count) !dbg !20 { +// CHECK:STDOUT: define linkonce_odr i32 @_CA.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count) !dbg !20 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 4, !dbg !21 // CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then.loc22, label %if.else.loc22, !dbg !22 @@ -101,15 +101,15 @@ fn M() { // CHECK:STDOUT: br i1 %Int.as.EqWith.impl.Equal.call, label %if.then.loc25, label %if.else.loc25, !dbg !25 // CHECK:STDOUT: // CHECK:STDOUT: if.then.loc25: ; preds = %if.else.loc22 -// CHECK:STDOUT: %B.call = call i32 @_CB.Main.b88d1103f417c6d4(i32 %x, i32 %count), !dbg !26 +// CHECK:STDOUT: %B.call = call i32 @_CB.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count), !dbg !26 // CHECK:STDOUT: ret i32 %B.call, !dbg !27 // CHECK:STDOUT: // CHECK:STDOUT: if.else.loc25: ; preds = %if.else.loc22 -// CHECK:STDOUT: %C.call = call i32 @_CC.Main.b88d1103f417c6d4(i32 %x, i32 %count), !dbg !28 +// CHECK:STDOUT: %C.call = call i32 @_CC.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count), !dbg !28 // CHECK:STDOUT: ret i32 %C.call, !dbg !29 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr double @_CA.Main.d4b5665541d5d7a8(double %x, i32 %count) !dbg !30 { +// CHECK:STDOUT: define linkonce_odr double @_CA.Main.274514a8254d0859(double %x, i32 %count) !dbg !30 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 4, !dbg !31 // CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then.loc22, label %if.else.loc22, !dbg !32 @@ -123,15 +123,15 @@ fn M() { // CHECK:STDOUT: br i1 %Int.as.EqWith.impl.Equal.call, label %if.then.loc25, label %if.else.loc25, !dbg !35 // CHECK:STDOUT: // CHECK:STDOUT: if.then.loc25: ; preds = %if.else.loc22 -// CHECK:STDOUT: %B.call = call double @_CB.Main.d4b5665541d5d7a8(double %x, i32 %count), !dbg !36 +// CHECK:STDOUT: %B.call = call double @_CB.Main.274514a8254d0859(double %x, i32 %count), !dbg !36 // CHECK:STDOUT: ret double %B.call, !dbg !37 // CHECK:STDOUT: // CHECK:STDOUT: if.else.loc25: ; preds = %if.else.loc22 -// CHECK:STDOUT: %C.call = call double @_CC.Main.d4b5665541d5d7a8(double %x, i32 %count), !dbg !38 +// CHECK:STDOUT: %C.call = call double @_CC.Main.274514a8254d0859(double %x, i32 %count), !dbg !38 // CHECK:STDOUT: ret double %C.call, !dbg !39 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr ptr @_CA.Main.e8193710fd35b608(ptr %x, i32 %count) !dbg !40 { +// CHECK:STDOUT: define linkonce_odr ptr @_CA.Main.19c352736f719291(ptr %x, i32 %count) !dbg !40 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 4, !dbg !41 // CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then.loc22, label %if.else.loc22, !dbg !42 @@ -145,86 +145,86 @@ fn M() { // CHECK:STDOUT: br i1 %Int.as.EqWith.impl.Equal.call, label %if.then.loc25, label %if.else.loc25, !dbg !45 // CHECK:STDOUT: // CHECK:STDOUT: if.then.loc25: ; preds = %if.else.loc22 -// CHECK:STDOUT: %B.call = call ptr @_CB.Main.e8193710fd35b608(ptr %x, i32 %count), !dbg !46 +// CHECK:STDOUT: %B.call = call ptr @_CB.Main.19c352736f719291(ptr %x, i32 %count), !dbg !46 // CHECK:STDOUT: ret ptr %B.call, !dbg !47 // CHECK:STDOUT: // CHECK:STDOUT: if.else.loc25: ; preds = %if.else.loc22 -// CHECK:STDOUT: %C.call = call ptr @_CC.Main.e8193710fd35b608(ptr %x, i32 %count), !dbg !48 +// CHECK:STDOUT: %C.call = call ptr @_CC.Main.19c352736f719291(ptr %x, i32 %count), !dbg !48 // CHECK:STDOUT: ret ptr %C.call, !dbg !49 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CB.Main.b88d1103f417c6d4(i32 %x, i32 %count) !dbg !50 { +// CHECK:STDOUT: define linkonce_odr i32 @_CB.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count) !dbg !50 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Print.call = call i32 (ptr, ...) @printf(ptr @printf.int.format, i32 1), !dbg !51 -// CHECK:STDOUT: %D.call = call i32 @_CD.Main.b88d1103f417c6d4(i32 %x, i32 %count), !dbg !52 +// CHECK:STDOUT: %D.call = call i32 @_CD.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count), !dbg !52 // CHECK:STDOUT: ret i32 %D.call, !dbg !53 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CC.Main.b88d1103f417c6d4(i32 %x, i32 %count) !dbg !54 { +// CHECK:STDOUT: define linkonce_odr i32 @_CC.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count) !dbg !54 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Print.call = call i32 (ptr, ...) @printf(ptr @printf.int.format, i32 2), !dbg !55 -// CHECK:STDOUT: %D.call = call i32 @_CD.Main.b88d1103f417c6d4(i32 %x, i32 %count), !dbg !56 +// CHECK:STDOUT: %D.call = call i32 @_CD.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count), !dbg !56 // CHECK:STDOUT: ret i32 %D.call, !dbg !57 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr double @_CB.Main.d4b5665541d5d7a8(double %x, i32 %count) !dbg !58 { +// CHECK:STDOUT: define linkonce_odr double @_CB.Main.274514a8254d0859(double %x, i32 %count) !dbg !58 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Print.call = call i32 (ptr, ...) @printf(ptr @printf.int.format, i32 1), !dbg !59 -// CHECK:STDOUT: %D.call = call double @_CD.Main.d4b5665541d5d7a8(double %x, i32 %count), !dbg !60 +// CHECK:STDOUT: %D.call = call double @_CD.Main.274514a8254d0859(double %x, i32 %count), !dbg !60 // CHECK:STDOUT: ret double %D.call, !dbg !61 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr double @_CC.Main.d4b5665541d5d7a8(double %x, i32 %count) !dbg !62 { +// CHECK:STDOUT: define linkonce_odr double @_CC.Main.274514a8254d0859(double %x, i32 %count) !dbg !62 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Print.call = call i32 (ptr, ...) @printf(ptr @printf.int.format, i32 2), !dbg !63 -// CHECK:STDOUT: %D.call = call double @_CD.Main.d4b5665541d5d7a8(double %x, i32 %count), !dbg !64 +// CHECK:STDOUT: %D.call = call double @_CD.Main.274514a8254d0859(double %x, i32 %count), !dbg !64 // CHECK:STDOUT: ret double %D.call, !dbg !65 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr ptr @_CB.Main.e8193710fd35b608(ptr %x, i32 %count) !dbg !66 { +// CHECK:STDOUT: define linkonce_odr ptr @_CB.Main.19c352736f719291(ptr %x, i32 %count) !dbg !66 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Print.call = call i32 (ptr, ...) @printf(ptr @printf.int.format, i32 1), !dbg !67 -// CHECK:STDOUT: %D.call = call ptr @_CD.Main.e8193710fd35b608(ptr %x, i32 %count), !dbg !68 +// CHECK:STDOUT: %D.call = call ptr @_CD.Main.19c352736f719291(ptr %x, i32 %count), !dbg !68 // CHECK:STDOUT: ret ptr %D.call, !dbg !69 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr ptr @_CC.Main.e8193710fd35b608(ptr %x, i32 %count) !dbg !70 { +// CHECK:STDOUT: define linkonce_odr ptr @_CC.Main.19c352736f719291(ptr %x, i32 %count) !dbg !70 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Print.call = call i32 (ptr, ...) @printf(ptr @printf.int.format, i32 2), !dbg !71 -// CHECK:STDOUT: %D.call = call ptr @_CD.Main.e8193710fd35b608(ptr %x, i32 %count), !dbg !72 +// CHECK:STDOUT: %D.call = call ptr @_CD.Main.19c352736f719291(ptr %x, i32 %count), !dbg !72 // CHECK:STDOUT: ret ptr %D.call, !dbg !73 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: declare i32 @printf(ptr, ...) // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CD.Main.b88d1103f417c6d4(i32 %x, i32 %count) !dbg !74 { +// CHECK:STDOUT: define linkonce_odr i32 @_CD.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count) !dbg !74 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !75 -// CHECK:STDOUT: %A.call = call i32 @_CA.Main.b88d1103f417c6d4(i32 %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !76 +// CHECK:STDOUT: %A.call = call i32 @_CA.Main.b7c8e4dff2adcdaa(i32 %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !76 // CHECK:STDOUT: ret i32 %A.call, !dbg !77 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr double @_CD.Main.d4b5665541d5d7a8(double %x, i32 %count) !dbg !78 { +// CHECK:STDOUT: define linkonce_odr double @_CD.Main.274514a8254d0859(double %x, i32 %count) !dbg !78 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !79 -// CHECK:STDOUT: %A.call = call double @_CA.Main.d4b5665541d5d7a8(double %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !80 +// CHECK:STDOUT: %A.call = call double @_CA.Main.274514a8254d0859(double %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !80 // CHECK:STDOUT: ret double %A.call, !dbg !81 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr ptr @_CD.Main.e8193710fd35b608(ptr %x, i32 %count) !dbg !82 { +// CHECK:STDOUT: define linkonce_odr ptr @_CD.Main.19c352736f719291(ptr %x, i32 %count) !dbg !82 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !83 -// CHECK:STDOUT: %A.call = call ptr @_CA.Main.e8193710fd35b608(ptr %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !84 +// CHECK:STDOUT: %A.call = call ptr @_CA.Main.19c352736f719291(ptr %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !84 // CHECK:STDOUT: ret ptr %A.call, !dbg !85 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; uselistorder directives // CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 3, 2, 1, 0 } -// CHECK:STDOUT: uselistorder ptr @_CA.Main.e8193710fd35b608, { 1, 2, 0 } +// CHECK:STDOUT: uselistorder ptr @_CA.Main.19c352736f719291, { 1, 2, 0 } // CHECK:STDOUT: uselistorder ptr @printf, { 5, 4, 3, 2, 1, 0 } -// CHECK:STDOUT: uselistorder ptr @_CD.Main.b88d1103f417c6d4, { 1, 0 } -// CHECK:STDOUT: uselistorder ptr @_CD.Main.d4b5665541d5d7a8, { 1, 0 } -// CHECK:STDOUT: uselistorder ptr @_CD.Main.e8193710fd35b608, { 1, 0 } +// CHECK:STDOUT: uselistorder ptr @_CD.Main.b7c8e4dff2adcdaa, { 1, 0 } +// CHECK:STDOUT: uselistorder ptr @_CD.Main.274514a8254d0859, { 1, 0 } +// CHECK:STDOUT: uselistorder ptr @_CD.Main.19c352736f719291, { 1, 0 } // CHECK:STDOUT: // CHECK:STDOUT: attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } // CHECK:STDOUT: @@ -251,7 +251,7 @@ fn M() { // CHECK:STDOUT: !17 = !DILocation(line: 56, column: 5, scope: !4) // CHECK:STDOUT: !18 = !DILocation(line: 56, column: 3, scope: !4) // CHECK:STDOUT: !19 = !DILocation(line: 47, column: 1, scope: !4) -// CHECK:STDOUT: !20 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.b88d1103f417c6d4", scope: null, file: !3, line: 21, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !20 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 21, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !21 = !DILocation(line: 22, column: 7, scope: !20) // CHECK:STDOUT: !22 = !DILocation(line: 22, column: 6, scope: !20) // CHECK:STDOUT: !23 = !DILocation(line: 23, column: 5, scope: !20) @@ -261,7 +261,7 @@ fn M() { // CHECK:STDOUT: !27 = !DILocation(line: 26, column: 5, scope: !20) // CHECK:STDOUT: !28 = !DILocation(line: 28, column: 12, scope: !20) // CHECK:STDOUT: !29 = !DILocation(line: 28, column: 5, scope: !20) -// CHECK:STDOUT: !30 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 21, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !30 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.274514a8254d0859", scope: null, file: !3, line: 21, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !31 = !DILocation(line: 22, column: 7, scope: !30) // CHECK:STDOUT: !32 = !DILocation(line: 22, column: 6, scope: !30) // CHECK:STDOUT: !33 = !DILocation(line: 23, column: 5, scope: !30) @@ -271,7 +271,7 @@ fn M() { // CHECK:STDOUT: !37 = !DILocation(line: 26, column: 5, scope: !30) // CHECK:STDOUT: !38 = !DILocation(line: 28, column: 12, scope: !30) // CHECK:STDOUT: !39 = !DILocation(line: 28, column: 5, scope: !30) -// CHECK:STDOUT: !40 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.e8193710fd35b608", scope: null, file: !3, line: 21, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !40 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.19c352736f719291", scope: null, file: !3, line: 21, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !41 = !DILocation(line: 22, column: 7, scope: !40) // CHECK:STDOUT: !42 = !DILocation(line: 22, column: 6, scope: !40) // CHECK:STDOUT: !43 = !DILocation(line: 23, column: 5, scope: !40) @@ -281,39 +281,39 @@ fn M() { // CHECK:STDOUT: !47 = !DILocation(line: 26, column: 5, scope: !40) // CHECK:STDOUT: !48 = !DILocation(line: 28, column: 12, scope: !40) // CHECK:STDOUT: !49 = !DILocation(line: 28, column: 5, scope: !40) -// CHECK:STDOUT: !50 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.b88d1103f417c6d4", scope: null, file: !3, line: 33, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !50 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 33, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !51 = !DILocation(line: 34, column: 3, scope: !50) // CHECK:STDOUT: !52 = !DILocation(line: 35, column: 10, scope: !50) // CHECK:STDOUT: !53 = !DILocation(line: 35, column: 3, scope: !50) -// CHECK:STDOUT: !54 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.b88d1103f417c6d4", scope: null, file: !3, line: 38, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !54 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 38, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !55 = !DILocation(line: 39, column: 3, scope: !54) // CHECK:STDOUT: !56 = !DILocation(line: 40, column: 10, scope: !54) // CHECK:STDOUT: !57 = !DILocation(line: 40, column: 3, scope: !54) -// CHECK:STDOUT: !58 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 33, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !58 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.274514a8254d0859", scope: null, file: !3, line: 33, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !59 = !DILocation(line: 34, column: 3, scope: !58) // CHECK:STDOUT: !60 = !DILocation(line: 35, column: 10, scope: !58) // CHECK:STDOUT: !61 = !DILocation(line: 35, column: 3, scope: !58) -// CHECK:STDOUT: !62 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 38, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !62 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.274514a8254d0859", scope: null, file: !3, line: 38, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !63 = !DILocation(line: 39, column: 3, scope: !62) // CHECK:STDOUT: !64 = !DILocation(line: 40, column: 10, scope: !62) // CHECK:STDOUT: !65 = !DILocation(line: 40, column: 3, scope: !62) -// CHECK:STDOUT: !66 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.e8193710fd35b608", scope: null, file: !3, line: 33, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !66 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.19c352736f719291", scope: null, file: !3, line: 33, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !67 = !DILocation(line: 34, column: 3, scope: !66) // CHECK:STDOUT: !68 = !DILocation(line: 35, column: 10, scope: !66) // CHECK:STDOUT: !69 = !DILocation(line: 35, column: 3, scope: !66) -// CHECK:STDOUT: !70 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.e8193710fd35b608", scope: null, file: !3, line: 38, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !70 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.19c352736f719291", scope: null, file: !3, line: 38, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !71 = !DILocation(line: 39, column: 3, scope: !70) // CHECK:STDOUT: !72 = !DILocation(line: 40, column: 10, scope: !70) // CHECK:STDOUT: !73 = !DILocation(line: 40, column: 3, scope: !70) -// CHECK:STDOUT: !74 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.b88d1103f417c6d4", scope: null, file: !3, line: 43, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !74 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 43, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !75 = !DILocation(line: 44, column: 15, scope: !74) // CHECK:STDOUT: !76 = !DILocation(line: 44, column: 10, scope: !74) // CHECK:STDOUT: !77 = !DILocation(line: 44, column: 3, scope: !74) -// CHECK:STDOUT: !78 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 43, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !78 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.274514a8254d0859", scope: null, file: !3, line: 43, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !79 = !DILocation(line: 44, column: 15, scope: !78) // CHECK:STDOUT: !80 = !DILocation(line: 44, column: 10, scope: !78) // CHECK:STDOUT: !81 = !DILocation(line: 44, column: 3, scope: !78) -// CHECK:STDOUT: !82 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.e8193710fd35b608", scope: null, file: !3, line: 43, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !82 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.19c352736f719291", scope: null, file: !3, line: 43, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !83 = !DILocation(line: 44, column: 15, scope: !82) // CHECK:STDOUT: !84 = !DILocation(line: 44, column: 10, scope: !82) // CHECK:STDOUT: !85 = !DILocation(line: 44, column: 3, scope: !82) diff --git a/toolchain/lower/testdata/function/generic/call_recursive_mutual.carbon b/toolchain/lower/testdata/function/generic/call_recursive_mutual.carbon index 3cc5eb6b1fc5..aa0aa9d42867 100644 --- a/toolchain/lower/testdata/function/generic/call_recursive_mutual.carbon +++ b/toolchain/lower/testdata/function/generic/call_recursive_mutual.carbon @@ -13,16 +13,16 @@ // Builds on `call_recursive_basic.carbon`. // The two specifics for mutual recursive functions F and G, // when T is a pointer, could be deduplicated. -fn G[T:! type](x: T, count: i32) -> T; +fn G[T:! Core.Copy](x: T, count: i32) -> T; -fn F[T:! type](x: T, count: i32) -> T { +fn F[T:! Core.Copy](x: T, count: i32) -> T { if (count > 3) { return x; } return G(x, count + 1); } -fn G[T:! type](x: T, count: i32) -> T { +fn G[T:! Core.Copy](x: T, count: i32) -> T { if (count > 4) { return x; } @@ -57,20 +57,20 @@ fn M() { // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_i32.var), !dbg !9 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_f64.var), !dbg !10 // CHECK:STDOUT: %.loc38_5 = load i32, ptr %n.var, align 4, !dbg !11 -// CHECK:STDOUT: %F.call.loc38 = call i32 @_CF.Main.b88d1103f417c6d4(i32 %.loc38_5, i32 0), !dbg !12 +// CHECK:STDOUT: %F.call.loc38 = call i32 @_CF.Main.b7c8e4dff2adcdaa(i32 %.loc38_5, i32 0), !dbg !12 // CHECK:STDOUT: %.loc39_5 = load double, ptr %m.var, align 8, !dbg !13 -// CHECK:STDOUT: %F.call.loc39 = call double @_CF.Main.d4b5665541d5d7a8(double %.loc39_5, i32 0), !dbg !14 +// CHECK:STDOUT: %F.call.loc39 = call double @_CF.Main.274514a8254d0859(double %.loc39_5, i32 0), !dbg !14 // CHECK:STDOUT: %.loc40_5 = load ptr, ptr %ptr_i32.var, align 8, !dbg !15 -// CHECK:STDOUT: %F.call.loc40 = call ptr @_CF.Main.e8193710fd35b608(ptr %.loc40_5, i32 0), !dbg !16 +// CHECK:STDOUT: %F.call.loc40 = call ptr @_CF.Main.19c352736f719291(ptr %.loc40_5, i32 0), !dbg !16 // CHECK:STDOUT: %.loc41_5 = load ptr, ptr %ptr_f64.var, align 8, !dbg !17 -// CHECK:STDOUT: %F.call.loc41 = call ptr @_CF.Main.e8193710fd35b608(ptr %.loc41_5, i32 0), !dbg !18 +// CHECK:STDOUT: %F.call.loc41 = call ptr @_CF.Main.19c352736f719291(ptr %.loc41_5, i32 0), !dbg !18 // CHECK:STDOUT: ret void, !dbg !19 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) // CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #0 // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CF.Main.b88d1103f417c6d4(i32 %x, i32 %count) !dbg !20 { +// CHECK:STDOUT: define linkonce_odr i32 @_CF.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count) !dbg !20 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 3, !dbg !21 // CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then, label %if.else, !dbg !22 @@ -80,11 +80,11 @@ fn M() { // CHECK:STDOUT: // CHECK:STDOUT: if.else: ; preds = %entry // CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !24 -// CHECK:STDOUT: %G.call = call i32 @_CG.Main.b88d1103f417c6d4(i32 %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !25 +// CHECK:STDOUT: %G.call = call i32 @_CG.Main.b7c8e4dff2adcdaa(i32 %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !25 // CHECK:STDOUT: ret i32 %G.call, !dbg !26 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr double @_CF.Main.d4b5665541d5d7a8(double %x, i32 %count) !dbg !27 { +// CHECK:STDOUT: define linkonce_odr double @_CF.Main.274514a8254d0859(double %x, i32 %count) !dbg !27 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 3, !dbg !28 // CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then, label %if.else, !dbg !29 @@ -94,11 +94,11 @@ fn M() { // CHECK:STDOUT: // CHECK:STDOUT: if.else: ; preds = %entry // CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !31 -// CHECK:STDOUT: %G.call = call double @_CG.Main.d4b5665541d5d7a8(double %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !32 +// CHECK:STDOUT: %G.call = call double @_CG.Main.274514a8254d0859(double %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !32 // CHECK:STDOUT: ret double %G.call, !dbg !33 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr ptr @_CF.Main.e8193710fd35b608(ptr %x, i32 %count) !dbg !34 { +// CHECK:STDOUT: define linkonce_odr ptr @_CF.Main.19c352736f719291(ptr %x, i32 %count) !dbg !34 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 3, !dbg !35 // CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then, label %if.else, !dbg !36 @@ -108,11 +108,11 @@ fn M() { // CHECK:STDOUT: // CHECK:STDOUT: if.else: ; preds = %entry // CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !38 -// CHECK:STDOUT: %G.call = call ptr @_CG.Main.e8193710fd35b608(ptr %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !39 +// CHECK:STDOUT: %G.call = call ptr @_CG.Main.19c352736f719291(ptr %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !39 // CHECK:STDOUT: ret ptr %G.call, !dbg !40 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CG.Main.b88d1103f417c6d4(i32 %x, i32 %count) !dbg !41 { +// CHECK:STDOUT: define linkonce_odr i32 @_CG.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count) !dbg !41 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 4, !dbg !42 // CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then, label %if.else, !dbg !43 @@ -122,11 +122,11 @@ fn M() { // CHECK:STDOUT: // CHECK:STDOUT: if.else: ; preds = %entry // CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !45 -// CHECK:STDOUT: %F.call = call i32 @_CF.Main.b88d1103f417c6d4(i32 %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !46 +// CHECK:STDOUT: %F.call = call i32 @_CF.Main.b7c8e4dff2adcdaa(i32 %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !46 // CHECK:STDOUT: ret i32 %F.call, !dbg !47 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr double @_CG.Main.d4b5665541d5d7a8(double %x, i32 %count) !dbg !48 { +// CHECK:STDOUT: define linkonce_odr double @_CG.Main.274514a8254d0859(double %x, i32 %count) !dbg !48 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 4, !dbg !49 // CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then, label %if.else, !dbg !50 @@ -136,11 +136,11 @@ fn M() { // CHECK:STDOUT: // CHECK:STDOUT: if.else: ; preds = %entry // CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !52 -// CHECK:STDOUT: %F.call = call double @_CF.Main.d4b5665541d5d7a8(double %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !53 +// CHECK:STDOUT: %F.call = call double @_CF.Main.274514a8254d0859(double %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !53 // CHECK:STDOUT: ret double %F.call, !dbg !54 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr ptr @_CG.Main.e8193710fd35b608(ptr %x, i32 %count) !dbg !55 { +// CHECK:STDOUT: define linkonce_odr ptr @_CG.Main.19c352736f719291(ptr %x, i32 %count) !dbg !55 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 4, !dbg !56 // CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then, label %if.else, !dbg !57 @@ -150,13 +150,13 @@ fn M() { // CHECK:STDOUT: // CHECK:STDOUT: if.else: ; preds = %entry // CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !59 -// CHECK:STDOUT: %F.call = call ptr @_CF.Main.e8193710fd35b608(ptr %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !60 +// CHECK:STDOUT: %F.call = call ptr @_CF.Main.19c352736f719291(ptr %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !60 // CHECK:STDOUT: ret ptr %F.call, !dbg !61 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; uselistorder directives // CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 3, 2, 1, 0 } -// CHECK:STDOUT: uselistorder ptr @_CF.Main.e8193710fd35b608, { 1, 2, 0 } +// CHECK:STDOUT: uselistorder ptr @_CF.Main.19c352736f719291, { 1, 2, 0 } // CHECK:STDOUT: // CHECK:STDOUT: attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } // CHECK:STDOUT: @@ -183,42 +183,42 @@ fn M() { // CHECK:STDOUT: !17 = !DILocation(line: 41, column: 5, scope: !4) // CHECK:STDOUT: !18 = !DILocation(line: 41, column: 3, scope: !4) // CHECK:STDOUT: !19 = !DILocation(line: 32, column: 1, scope: !4) -// CHECK:STDOUT: !20 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.b88d1103f417c6d4", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !20 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !21 = !DILocation(line: 19, column: 7, scope: !20) // CHECK:STDOUT: !22 = !DILocation(line: 19, column: 6, scope: !20) // CHECK:STDOUT: !23 = !DILocation(line: 20, column: 5, scope: !20) // CHECK:STDOUT: !24 = !DILocation(line: 22, column: 15, scope: !20) // CHECK:STDOUT: !25 = !DILocation(line: 22, column: 10, scope: !20) // CHECK:STDOUT: !26 = !DILocation(line: 22, column: 3, scope: !20) -// CHECK:STDOUT: !27 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !27 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.274514a8254d0859", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !28 = !DILocation(line: 19, column: 7, scope: !27) // CHECK:STDOUT: !29 = !DILocation(line: 19, column: 6, scope: !27) // CHECK:STDOUT: !30 = !DILocation(line: 20, column: 5, scope: !27) // CHECK:STDOUT: !31 = !DILocation(line: 22, column: 15, scope: !27) // CHECK:STDOUT: !32 = !DILocation(line: 22, column: 10, scope: !27) // CHECK:STDOUT: !33 = !DILocation(line: 22, column: 3, scope: !27) -// CHECK:STDOUT: !34 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.e8193710fd35b608", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !34 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.19c352736f719291", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !35 = !DILocation(line: 19, column: 7, scope: !34) // CHECK:STDOUT: !36 = !DILocation(line: 19, column: 6, scope: !34) // CHECK:STDOUT: !37 = !DILocation(line: 20, column: 5, scope: !34) // CHECK:STDOUT: !38 = !DILocation(line: 22, column: 15, scope: !34) // CHECK:STDOUT: !39 = !DILocation(line: 22, column: 10, scope: !34) // CHECK:STDOUT: !40 = !DILocation(line: 22, column: 3, scope: !34) -// CHECK:STDOUT: !41 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.b88d1103f417c6d4", scope: null, file: !3, line: 25, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !41 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 25, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !42 = !DILocation(line: 26, column: 7, scope: !41) // CHECK:STDOUT: !43 = !DILocation(line: 26, column: 6, scope: !41) // CHECK:STDOUT: !44 = !DILocation(line: 27, column: 5, scope: !41) // CHECK:STDOUT: !45 = !DILocation(line: 29, column: 15, scope: !41) // CHECK:STDOUT: !46 = !DILocation(line: 29, column: 10, scope: !41) // CHECK:STDOUT: !47 = !DILocation(line: 29, column: 3, scope: !41) -// CHECK:STDOUT: !48 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 25, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !48 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.274514a8254d0859", scope: null, file: !3, line: 25, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !49 = !DILocation(line: 26, column: 7, scope: !48) // CHECK:STDOUT: !50 = !DILocation(line: 26, column: 6, scope: !48) // CHECK:STDOUT: !51 = !DILocation(line: 27, column: 5, scope: !48) // CHECK:STDOUT: !52 = !DILocation(line: 29, column: 15, scope: !48) // CHECK:STDOUT: !53 = !DILocation(line: 29, column: 10, scope: !48) // CHECK:STDOUT: !54 = !DILocation(line: 29, column: 3, scope: !48) -// CHECK:STDOUT: !55 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.e8193710fd35b608", scope: null, file: !3, line: 25, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !55 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.19c352736f719291", scope: null, file: !3, line: 25, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !56 = !DILocation(line: 26, column: 7, scope: !55) // CHECK:STDOUT: !57 = !DILocation(line: 26, column: 6, scope: !55) // CHECK:STDOUT: !58 = !DILocation(line: 27, column: 5, scope: !55) diff --git a/toolchain/lower/testdata/function/generic/call_recursive_sccs_deep.carbon b/toolchain/lower/testdata/function/generic/call_recursive_sccs_deep.carbon index 20f2c2d074d1..83cc5f8dbfd1 100644 --- a/toolchain/lower/testdata/function/generic/call_recursive_sccs_deep.carbon +++ b/toolchain/lower/testdata/function/generic/call_recursive_sccs_deep.carbon @@ -11,12 +11,12 @@ // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/lower/testdata/function/generic/call_recursive_sccs_deep.carbon import Core library "io"; -fn A[T:! type](x: T, count: i32) -> T; -fn B[T:! type](x: T, count: i32); -fn C[T:! type](x: T, count: i32); -fn D[T:! type](x: T, count: i32) -> T; -fn E[T:! type](x: T, count: i32) -> T; -fn F[T:! type](x: T, count: i32) -> T; +fn A[T:! Core.Copy](x: T, count: i32) -> T; +fn B[T:! Core.Copy](x: T, count: i32); +fn C[T:! Core.Copy](x: T, count: i32); +fn D[T:! Core.Copy](x: T, count: i32) -> T; +fn E[T:! Core.Copy](x: T, count: i32) -> T; +fn F[T:! Core.Copy](x: T, count: i32) -> T; // Builds on `call_recursive_mutual.carbon` and `call_recursive_diamond.carbon` // B-C form a mutually recursive SCC (strongly connected component), D-E-F-G @@ -28,23 +28,23 @@ fn F[T:! type](x: T, count: i32) -> T; // optimization here, if the function fingerprint may infer deduplication // when not including the two different generic_ids. -fn A[T:! type](x: T, count: i32) -> T { +fn A[T:! Core.Copy](x: T, count: i32) -> T { B(x, count); return D(x, count); } -fn B[T:! type](x: T, count: i32) { +fn B[T:! Core.Copy](x: T, count: i32) { C(x, count); } -fn C[T:! type](x: T, count: i32) { +fn C[T:! Core.Copy](x: T, count: i32) { if (count <= 2) { Core.Print(count); B(x, count + 1); } } -fn D[T:! type](x: T, count: i32) -> T { +fn D[T:! Core.Copy](x: T, count: i32) -> T { if (count > 4) { return x; } @@ -55,17 +55,17 @@ fn D[T:! type](x: T, count: i32) -> T { } } -fn G[T:! type](x: T, count: i32) -> T; +fn G[T:! Core.Copy](x: T, count: i32) -> T; -fn E[T:! type](x: T, count: i32) -> T { +fn E[T:! Core.Copy](x: T, count: i32) -> T { return G(x, count); } -fn F[T:! type](x: T, count: i32) -> T { +fn F[T:! Core.Copy](x: T, count: i32) -> T { return G(x, count); } -fn G[T:! type](x: T, count: i32) -> T { +fn G[T:! Core.Copy](x: T, count: i32) -> T { return D(x, count + 1); } @@ -82,7 +82,6 @@ fn M() { A(ptr_f64, 0); } - // CHECK:STDOUT: ; ModuleID = 'call_recursive_sccs_deep.carbon' // CHECK:STDOUT: source_filename = "call_recursive_sccs_deep.carbon" // CHECK:STDOUT: @@ -101,47 +100,47 @@ fn M() { // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_i32.var), !dbg !9 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_f64.var), !dbg !10 // CHECK:STDOUT: %.loc79_5 = load i32, ptr %n.var, align 4, !dbg !11 -// CHECK:STDOUT: %A.call.loc79 = call i32 @_CA.Main.b88d1103f417c6d4(i32 %.loc79_5, i32 0), !dbg !12 +// CHECK:STDOUT: %A.call.loc79 = call i32 @_CA.Main.b7c8e4dff2adcdaa(i32 %.loc79_5, i32 0), !dbg !12 // CHECK:STDOUT: %.loc80_5 = load double, ptr %m.var, align 8, !dbg !13 -// CHECK:STDOUT: %A.call.loc80 = call double @_CA.Main.d4b5665541d5d7a8(double %.loc80_5, i32 0), !dbg !14 +// CHECK:STDOUT: %A.call.loc80 = call double @_CA.Main.274514a8254d0859(double %.loc80_5, i32 0), !dbg !14 // CHECK:STDOUT: %.loc81_5 = load ptr, ptr %ptr_i32.var, align 8, !dbg !15 -// CHECK:STDOUT: %A.call.loc81 = call ptr @_CA.Main.e8193710fd35b608(ptr %.loc81_5, i32 0), !dbg !16 +// CHECK:STDOUT: %A.call.loc81 = call ptr @_CA.Main.19c352736f719291(ptr %.loc81_5, i32 0), !dbg !16 // CHECK:STDOUT: %.loc82_5 = load ptr, ptr %ptr_f64.var, align 8, !dbg !17 -// CHECK:STDOUT: %A.call.loc82 = call ptr @_CA.Main.e8193710fd35b608(ptr %.loc82_5, i32 0), !dbg !18 +// CHECK:STDOUT: %A.call.loc82 = call ptr @_CA.Main.19c352736f719291(ptr %.loc82_5, i32 0), !dbg !18 // CHECK:STDOUT: ret void, !dbg !19 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) // CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #0 // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CA.Main.b88d1103f417c6d4(i32 %x, i32 %count) !dbg !20 { +// CHECK:STDOUT: define linkonce_odr i32 @_CA.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count) !dbg !20 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: call void @_CB.Main.b88d1103f417c6d4(i32 %x, i32 %count), !dbg !21 -// CHECK:STDOUT: %D.call = call i32 @_CD.Main.b88d1103f417c6d4(i32 %x, i32 %count), !dbg !22 +// CHECK:STDOUT: call void @_CB.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count), !dbg !21 +// CHECK:STDOUT: %D.call = call i32 @_CD.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count), !dbg !22 // CHECK:STDOUT: ret i32 %D.call, !dbg !23 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr double @_CA.Main.d4b5665541d5d7a8(double %x, i32 %count) !dbg !24 { +// CHECK:STDOUT: define linkonce_odr double @_CA.Main.274514a8254d0859(double %x, i32 %count) !dbg !24 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: call void @_CB.Main.d4b5665541d5d7a8(double %x, i32 %count), !dbg !25 -// CHECK:STDOUT: %D.call = call double @_CD.Main.d4b5665541d5d7a8(double %x, i32 %count), !dbg !26 +// CHECK:STDOUT: call void @_CB.Main.274514a8254d0859(double %x, i32 %count), !dbg !25 +// CHECK:STDOUT: %D.call = call double @_CD.Main.274514a8254d0859(double %x, i32 %count), !dbg !26 // CHECK:STDOUT: ret double %D.call, !dbg !27 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr ptr @_CA.Main.e8193710fd35b608(ptr %x, i32 %count) !dbg !28 { +// CHECK:STDOUT: define linkonce_odr ptr @_CA.Main.19c352736f719291(ptr %x, i32 %count) !dbg !28 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: call void @_CB.Main.e8193710fd35b608(ptr %x, i32 %count), !dbg !29 -// CHECK:STDOUT: %D.call = call ptr @_CD.Main.e8193710fd35b608(ptr %x, i32 %count), !dbg !30 +// CHECK:STDOUT: call void @_CB.Main.19c352736f719291(ptr %x, i32 %count), !dbg !29 +// CHECK:STDOUT: %D.call = call ptr @_CD.Main.19c352736f719291(ptr %x, i32 %count), !dbg !30 // CHECK:STDOUT: ret ptr %D.call, !dbg !31 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CB.Main.b88d1103f417c6d4(i32 %x, i32 %count) !dbg !32 { +// CHECK:STDOUT: define linkonce_odr void @_CB.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count) !dbg !32 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: call void @_CC.Main.b88d1103f417c6d4(i32 %x, i32 %count), !dbg !33 +// CHECK:STDOUT: call void @_CC.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count), !dbg !33 // CHECK:STDOUT: ret void, !dbg !34 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CD.Main.b88d1103f417c6d4(i32 %x, i32 %count) !dbg !35 { +// CHECK:STDOUT: define linkonce_odr i32 @_CD.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count) !dbg !35 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 4, !dbg !36 // CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then.loc48, label %if.else.loc48, !dbg !37 @@ -155,21 +154,21 @@ fn M() { // CHECK:STDOUT: br i1 %Int.as.EqWith.impl.Equal.call, label %if.then.loc51, label %if.else.loc51, !dbg !40 // CHECK:STDOUT: // CHECK:STDOUT: if.then.loc51: ; preds = %if.else.loc48 -// CHECK:STDOUT: %E.call = call i32 @_CE.Main.b88d1103f417c6d4(i32 %x, i32 %count), !dbg !41 +// CHECK:STDOUT: %E.call = call i32 @_CE.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count), !dbg !41 // CHECK:STDOUT: ret i32 %E.call, !dbg !42 // CHECK:STDOUT: // CHECK:STDOUT: if.else.loc51: ; preds = %if.else.loc48 -// CHECK:STDOUT: %F.call = call i32 @_CF.Main.b88d1103f417c6d4(i32 %x, i32 %count), !dbg !43 +// CHECK:STDOUT: %F.call = call i32 @_CF.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count), !dbg !43 // CHECK:STDOUT: ret i32 %F.call, !dbg !44 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CB.Main.d4b5665541d5d7a8(double %x, i32 %count) !dbg !45 { +// CHECK:STDOUT: define linkonce_odr void @_CB.Main.274514a8254d0859(double %x, i32 %count) !dbg !45 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: call void @_CC.Main.d4b5665541d5d7a8(double %x, i32 %count), !dbg !46 +// CHECK:STDOUT: call void @_CC.Main.274514a8254d0859(double %x, i32 %count), !dbg !46 // CHECK:STDOUT: ret void, !dbg !47 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr double @_CD.Main.d4b5665541d5d7a8(double %x, i32 %count) !dbg !48 { +// CHECK:STDOUT: define linkonce_odr double @_CD.Main.274514a8254d0859(double %x, i32 %count) !dbg !48 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 4, !dbg !49 // CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then.loc48, label %if.else.loc48, !dbg !50 @@ -183,21 +182,21 @@ fn M() { // CHECK:STDOUT: br i1 %Int.as.EqWith.impl.Equal.call, label %if.then.loc51, label %if.else.loc51, !dbg !53 // CHECK:STDOUT: // CHECK:STDOUT: if.then.loc51: ; preds = %if.else.loc48 -// CHECK:STDOUT: %E.call = call double @_CE.Main.d4b5665541d5d7a8(double %x, i32 %count), !dbg !54 +// CHECK:STDOUT: %E.call = call double @_CE.Main.274514a8254d0859(double %x, i32 %count), !dbg !54 // CHECK:STDOUT: ret double %E.call, !dbg !55 // CHECK:STDOUT: // CHECK:STDOUT: if.else.loc51: ; preds = %if.else.loc48 -// CHECK:STDOUT: %F.call = call double @_CF.Main.d4b5665541d5d7a8(double %x, i32 %count), !dbg !56 +// CHECK:STDOUT: %F.call = call double @_CF.Main.274514a8254d0859(double %x, i32 %count), !dbg !56 // CHECK:STDOUT: ret double %F.call, !dbg !57 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CB.Main.e8193710fd35b608(ptr %x, i32 %count) !dbg !58 { +// CHECK:STDOUT: define linkonce_odr void @_CB.Main.19c352736f719291(ptr %x, i32 %count) !dbg !58 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: call void @_CC.Main.e8193710fd35b608(ptr %x, i32 %count), !dbg !59 +// CHECK:STDOUT: call void @_CC.Main.19c352736f719291(ptr %x, i32 %count), !dbg !59 // CHECK:STDOUT: ret void, !dbg !60 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr ptr @_CD.Main.e8193710fd35b608(ptr %x, i32 %count) !dbg !61 { +// CHECK:STDOUT: define linkonce_odr ptr @_CD.Main.19c352736f719291(ptr %x, i32 %count) !dbg !61 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 4, !dbg !62 // CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then.loc48, label %if.else.loc48, !dbg !63 @@ -211,15 +210,15 @@ fn M() { // CHECK:STDOUT: br i1 %Int.as.EqWith.impl.Equal.call, label %if.then.loc51, label %if.else.loc51, !dbg !66 // CHECK:STDOUT: // CHECK:STDOUT: if.then.loc51: ; preds = %if.else.loc48 -// CHECK:STDOUT: %E.call = call ptr @_CE.Main.e8193710fd35b608(ptr %x, i32 %count), !dbg !67 +// CHECK:STDOUT: %E.call = call ptr @_CE.Main.19c352736f719291(ptr %x, i32 %count), !dbg !67 // CHECK:STDOUT: ret ptr %E.call, !dbg !68 // CHECK:STDOUT: // CHECK:STDOUT: if.else.loc51: ; preds = %if.else.loc48 -// CHECK:STDOUT: %F.call = call ptr @_CF.Main.e8193710fd35b608(ptr %x, i32 %count), !dbg !69 +// CHECK:STDOUT: %F.call = call ptr @_CF.Main.19c352736f719291(ptr %x, i32 %count), !dbg !69 // CHECK:STDOUT: ret ptr %F.call, !dbg !70 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CC.Main.b88d1103f417c6d4(i32 %x, i32 %count) !dbg !71 { +// CHECK:STDOUT: define linkonce_odr void @_CC.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count) !dbg !71 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.OrderedWith.impl.LessOrEquivalent.call = icmp sle i32 %count, 2, !dbg !72 // CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.LessOrEquivalent.call, label %if.then, label %if.else, !dbg !73 @@ -227,26 +226,26 @@ fn M() { // CHECK:STDOUT: if.then: ; preds = %entry // CHECK:STDOUT: %Print.call = call i32 (ptr, ...) @printf(ptr @printf.int.format, i32 %count), !dbg !74 // CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !75 -// CHECK:STDOUT: call void @_CB.Main.b88d1103f417c6d4(i32 %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !76 +// CHECK:STDOUT: call void @_CB.Main.b7c8e4dff2adcdaa(i32 %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !76 // CHECK:STDOUT: br label %if.else, !dbg !77 // CHECK:STDOUT: // CHECK:STDOUT: if.else: ; preds = %if.then, %entry // CHECK:STDOUT: ret void, !dbg !78 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CE.Main.b88d1103f417c6d4(i32 %x, i32 %count) !dbg !79 { +// CHECK:STDOUT: define linkonce_odr i32 @_CE.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count) !dbg !79 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %G.call = call i32 @_CG.Main.b88d1103f417c6d4(i32 %x, i32 %count), !dbg !80 +// CHECK:STDOUT: %G.call = call i32 @_CG.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count), !dbg !80 // CHECK:STDOUT: ret i32 %G.call, !dbg !81 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CF.Main.b88d1103f417c6d4(i32 %x, i32 %count) !dbg !82 { +// CHECK:STDOUT: define linkonce_odr i32 @_CF.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count) !dbg !82 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %G.call = call i32 @_CG.Main.b88d1103f417c6d4(i32 %x, i32 %count), !dbg !83 +// CHECK:STDOUT: %G.call = call i32 @_CG.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count), !dbg !83 // CHECK:STDOUT: ret i32 %G.call, !dbg !84 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CC.Main.d4b5665541d5d7a8(double %x, i32 %count) !dbg !85 { +// CHECK:STDOUT: define linkonce_odr void @_CC.Main.274514a8254d0859(double %x, i32 %count) !dbg !85 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.OrderedWith.impl.LessOrEquivalent.call = icmp sle i32 %count, 2, !dbg !86 // CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.LessOrEquivalent.call, label %if.then, label %if.else, !dbg !87 @@ -254,26 +253,26 @@ fn M() { // CHECK:STDOUT: if.then: ; preds = %entry // CHECK:STDOUT: %Print.call = call i32 (ptr, ...) @printf(ptr @printf.int.format, i32 %count), !dbg !88 // CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !89 -// CHECK:STDOUT: call void @_CB.Main.d4b5665541d5d7a8(double %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !90 +// CHECK:STDOUT: call void @_CB.Main.274514a8254d0859(double %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !90 // CHECK:STDOUT: br label %if.else, !dbg !91 // CHECK:STDOUT: // CHECK:STDOUT: if.else: ; preds = %if.then, %entry // CHECK:STDOUT: ret void, !dbg !92 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr double @_CE.Main.d4b5665541d5d7a8(double %x, i32 %count) !dbg !93 { +// CHECK:STDOUT: define linkonce_odr double @_CE.Main.274514a8254d0859(double %x, i32 %count) !dbg !93 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %G.call = call double @_CG.Main.d4b5665541d5d7a8(double %x, i32 %count), !dbg !94 +// CHECK:STDOUT: %G.call = call double @_CG.Main.274514a8254d0859(double %x, i32 %count), !dbg !94 // CHECK:STDOUT: ret double %G.call, !dbg !95 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr double @_CF.Main.d4b5665541d5d7a8(double %x, i32 %count) !dbg !96 { +// CHECK:STDOUT: define linkonce_odr double @_CF.Main.274514a8254d0859(double %x, i32 %count) !dbg !96 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %G.call = call double @_CG.Main.d4b5665541d5d7a8(double %x, i32 %count), !dbg !97 +// CHECK:STDOUT: %G.call = call double @_CG.Main.274514a8254d0859(double %x, i32 %count), !dbg !97 // CHECK:STDOUT: ret double %G.call, !dbg !98 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @_CC.Main.e8193710fd35b608(ptr %x, i32 %count) !dbg !99 { +// CHECK:STDOUT: define linkonce_odr void @_CC.Main.19c352736f719291(ptr %x, i32 %count) !dbg !99 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.OrderedWith.impl.LessOrEquivalent.call = icmp sle i32 %count, 2, !dbg !100 // CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.LessOrEquivalent.call, label %if.then, label %if.else, !dbg !101 @@ -281,55 +280,55 @@ fn M() { // CHECK:STDOUT: if.then: ; preds = %entry // CHECK:STDOUT: %Print.call = call i32 (ptr, ...) @printf(ptr @printf.int.format, i32 %count), !dbg !102 // CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !103 -// CHECK:STDOUT: call void @_CB.Main.e8193710fd35b608(ptr %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !104 +// CHECK:STDOUT: call void @_CB.Main.19c352736f719291(ptr %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !104 // CHECK:STDOUT: br label %if.else, !dbg !105 // CHECK:STDOUT: // CHECK:STDOUT: if.else: ; preds = %if.then, %entry // CHECK:STDOUT: ret void, !dbg !106 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr ptr @_CE.Main.e8193710fd35b608(ptr %x, i32 %count) !dbg !107 { +// CHECK:STDOUT: define linkonce_odr ptr @_CE.Main.19c352736f719291(ptr %x, i32 %count) !dbg !107 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %G.call = call ptr @_CG.Main.e8193710fd35b608(ptr %x, i32 %count), !dbg !108 +// CHECK:STDOUT: %G.call = call ptr @_CG.Main.19c352736f719291(ptr %x, i32 %count), !dbg !108 // CHECK:STDOUT: ret ptr %G.call, !dbg !109 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr ptr @_CF.Main.e8193710fd35b608(ptr %x, i32 %count) !dbg !110 { +// CHECK:STDOUT: define linkonce_odr ptr @_CF.Main.19c352736f719291(ptr %x, i32 %count) !dbg !110 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %G.call = call ptr @_CG.Main.e8193710fd35b608(ptr %x, i32 %count), !dbg !111 +// CHECK:STDOUT: %G.call = call ptr @_CG.Main.19c352736f719291(ptr %x, i32 %count), !dbg !111 // CHECK:STDOUT: ret ptr %G.call, !dbg !112 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: declare i32 @printf(ptr, ...) // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CG.Main.b88d1103f417c6d4(i32 %x, i32 %count) !dbg !113 { +// CHECK:STDOUT: define linkonce_odr i32 @_CG.Main.b7c8e4dff2adcdaa(i32 %x, i32 %count) !dbg !113 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !114 -// CHECK:STDOUT: %D.call = call i32 @_CD.Main.b88d1103f417c6d4(i32 %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !115 +// CHECK:STDOUT: %D.call = call i32 @_CD.Main.b7c8e4dff2adcdaa(i32 %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !115 // CHECK:STDOUT: ret i32 %D.call, !dbg !116 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr double @_CG.Main.d4b5665541d5d7a8(double %x, i32 %count) !dbg !117 { +// CHECK:STDOUT: define linkonce_odr double @_CG.Main.274514a8254d0859(double %x, i32 %count) !dbg !117 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !118 -// CHECK:STDOUT: %D.call = call double @_CD.Main.d4b5665541d5d7a8(double %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !119 +// CHECK:STDOUT: %D.call = call double @_CD.Main.274514a8254d0859(double %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !119 // CHECK:STDOUT: ret double %D.call, !dbg !120 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr ptr @_CG.Main.e8193710fd35b608(ptr %x, i32 %count) !dbg !121 { +// CHECK:STDOUT: define linkonce_odr ptr @_CG.Main.19c352736f719291(ptr %x, i32 %count) !dbg !121 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %count, 1, !dbg !122 -// CHECK:STDOUT: %D.call = call ptr @_CD.Main.e8193710fd35b608(ptr %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !123 +// CHECK:STDOUT: %D.call = call ptr @_CD.Main.19c352736f719291(ptr %x, i32 %Int.as.AddWith.impl.Op.call), !dbg !123 // CHECK:STDOUT: ret ptr %D.call, !dbg !124 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; uselistorder directives // CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 3, 2, 1, 0 } -// CHECK:STDOUT: uselistorder ptr @_CA.Main.e8193710fd35b608, { 1, 0 } +// CHECK:STDOUT: uselistorder ptr @_CA.Main.19c352736f719291, { 1, 0 } // CHECK:STDOUT: uselistorder ptr @printf, { 2, 1, 0 } -// CHECK:STDOUT: uselistorder ptr @_CG.Main.b88d1103f417c6d4, { 1, 0 } -// CHECK:STDOUT: uselistorder ptr @_CG.Main.d4b5665541d5d7a8, { 1, 0 } -// CHECK:STDOUT: uselistorder ptr @_CG.Main.e8193710fd35b608, { 1, 0 } +// CHECK:STDOUT: uselistorder ptr @_CG.Main.b7c8e4dff2adcdaa, { 1, 0 } +// CHECK:STDOUT: uselistorder ptr @_CG.Main.274514a8254d0859, { 1, 0 } +// CHECK:STDOUT: uselistorder ptr @_CG.Main.19c352736f719291, { 1, 0 } // CHECK:STDOUT: // CHECK:STDOUT: attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } // CHECK:STDOUT: @@ -356,22 +355,22 @@ fn M() { // CHECK:STDOUT: !17 = !DILocation(line: 82, column: 5, scope: !4) // CHECK:STDOUT: !18 = !DILocation(line: 82, column: 3, scope: !4) // CHECK:STDOUT: !19 = !DILocation(line: 73, column: 1, scope: !4) -// CHECK:STDOUT: !20 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.b88d1103f417c6d4", scope: null, file: !3, line: 31, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !20 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 31, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !21 = !DILocation(line: 32, column: 3, scope: !20) // CHECK:STDOUT: !22 = !DILocation(line: 33, column: 10, scope: !20) // CHECK:STDOUT: !23 = !DILocation(line: 33, column: 3, scope: !20) -// CHECK:STDOUT: !24 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 31, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !24 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.274514a8254d0859", scope: null, file: !3, line: 31, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !25 = !DILocation(line: 32, column: 3, scope: !24) // CHECK:STDOUT: !26 = !DILocation(line: 33, column: 10, scope: !24) // CHECK:STDOUT: !27 = !DILocation(line: 33, column: 3, scope: !24) -// CHECK:STDOUT: !28 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.e8193710fd35b608", scope: null, file: !3, line: 31, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !28 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.19c352736f719291", scope: null, file: !3, line: 31, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !29 = !DILocation(line: 32, column: 3, scope: !28) // CHECK:STDOUT: !30 = !DILocation(line: 33, column: 10, scope: !28) // CHECK:STDOUT: !31 = !DILocation(line: 33, column: 3, scope: !28) -// CHECK:STDOUT: !32 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.b88d1103f417c6d4", scope: null, file: !3, line: 36, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !32 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 36, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !33 = !DILocation(line: 37, column: 3, scope: !32) // CHECK:STDOUT: !34 = !DILocation(line: 36, column: 1, scope: !32) -// CHECK:STDOUT: !35 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.b88d1103f417c6d4", scope: null, file: !3, line: 47, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !35 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 47, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !36 = !DILocation(line: 48, column: 7, scope: !35) // CHECK:STDOUT: !37 = !DILocation(line: 48, column: 6, scope: !35) // CHECK:STDOUT: !38 = !DILocation(line: 49, column: 5, scope: !35) @@ -381,10 +380,10 @@ fn M() { // CHECK:STDOUT: !42 = !DILocation(line: 52, column: 5, scope: !35) // CHECK:STDOUT: !43 = !DILocation(line: 54, column: 12, scope: !35) // CHECK:STDOUT: !44 = !DILocation(line: 54, column: 5, scope: !35) -// CHECK:STDOUT: !45 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 36, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !45 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.274514a8254d0859", scope: null, file: !3, line: 36, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !46 = !DILocation(line: 37, column: 3, scope: !45) // CHECK:STDOUT: !47 = !DILocation(line: 36, column: 1, scope: !45) -// CHECK:STDOUT: !48 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 47, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !48 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.274514a8254d0859", scope: null, file: !3, line: 47, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !49 = !DILocation(line: 48, column: 7, scope: !48) // CHECK:STDOUT: !50 = !DILocation(line: 48, column: 6, scope: !48) // CHECK:STDOUT: !51 = !DILocation(line: 49, column: 5, scope: !48) @@ -394,10 +393,10 @@ fn M() { // CHECK:STDOUT: !55 = !DILocation(line: 52, column: 5, scope: !48) // CHECK:STDOUT: !56 = !DILocation(line: 54, column: 12, scope: !48) // CHECK:STDOUT: !57 = !DILocation(line: 54, column: 5, scope: !48) -// CHECK:STDOUT: !58 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.e8193710fd35b608", scope: null, file: !3, line: 36, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !58 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.19c352736f719291", scope: null, file: !3, line: 36, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !59 = !DILocation(line: 37, column: 3, scope: !58) // CHECK:STDOUT: !60 = !DILocation(line: 36, column: 1, scope: !58) -// CHECK:STDOUT: !61 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.e8193710fd35b608", scope: null, file: !3, line: 47, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !61 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.19c352736f719291", scope: null, file: !3, line: 47, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !62 = !DILocation(line: 48, column: 7, scope: !61) // CHECK:STDOUT: !63 = !DILocation(line: 48, column: 6, scope: !61) // CHECK:STDOUT: !64 = !DILocation(line: 49, column: 5, scope: !61) @@ -407,7 +406,7 @@ fn M() { // CHECK:STDOUT: !68 = !DILocation(line: 52, column: 5, scope: !61) // CHECK:STDOUT: !69 = !DILocation(line: 54, column: 12, scope: !61) // CHECK:STDOUT: !70 = !DILocation(line: 54, column: 5, scope: !61) -// CHECK:STDOUT: !71 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.b88d1103f417c6d4", scope: null, file: !3, line: 40, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !71 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 40, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !72 = !DILocation(line: 41, column: 7, scope: !71) // CHECK:STDOUT: !73 = !DILocation(line: 41, column: 6, scope: !71) // CHECK:STDOUT: !74 = !DILocation(line: 42, column: 5, scope: !71) @@ -415,13 +414,13 @@ fn M() { // CHECK:STDOUT: !76 = !DILocation(line: 43, column: 5, scope: !71) // CHECK:STDOUT: !77 = !DILocation(line: 41, column: 3, scope: !71) // CHECK:STDOUT: !78 = !DILocation(line: 40, column: 1, scope: !71) -// CHECK:STDOUT: !79 = distinct !DISubprogram(name: "E", linkageName: "_CE.Main.b88d1103f417c6d4", scope: null, file: !3, line: 60, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !79 = distinct !DISubprogram(name: "E", linkageName: "_CE.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 60, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !80 = !DILocation(line: 61, column: 10, scope: !79) // CHECK:STDOUT: !81 = !DILocation(line: 61, column: 3, scope: !79) -// CHECK:STDOUT: !82 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.b88d1103f417c6d4", scope: null, file: !3, line: 64, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !82 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 64, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !83 = !DILocation(line: 65, column: 10, scope: !82) // CHECK:STDOUT: !84 = !DILocation(line: 65, column: 3, scope: !82) -// CHECK:STDOUT: !85 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 40, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !85 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.274514a8254d0859", scope: null, file: !3, line: 40, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !86 = !DILocation(line: 41, column: 7, scope: !85) // CHECK:STDOUT: !87 = !DILocation(line: 41, column: 6, scope: !85) // CHECK:STDOUT: !88 = !DILocation(line: 42, column: 5, scope: !85) @@ -429,13 +428,13 @@ fn M() { // CHECK:STDOUT: !90 = !DILocation(line: 43, column: 5, scope: !85) // CHECK:STDOUT: !91 = !DILocation(line: 41, column: 3, scope: !85) // CHECK:STDOUT: !92 = !DILocation(line: 40, column: 1, scope: !85) -// CHECK:STDOUT: !93 = distinct !DISubprogram(name: "E", linkageName: "_CE.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 60, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !93 = distinct !DISubprogram(name: "E", linkageName: "_CE.Main.274514a8254d0859", scope: null, file: !3, line: 60, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !94 = !DILocation(line: 61, column: 10, scope: !93) // CHECK:STDOUT: !95 = !DILocation(line: 61, column: 3, scope: !93) -// CHECK:STDOUT: !96 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 64, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !96 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.274514a8254d0859", scope: null, file: !3, line: 64, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !97 = !DILocation(line: 65, column: 10, scope: !96) // CHECK:STDOUT: !98 = !DILocation(line: 65, column: 3, scope: !96) -// CHECK:STDOUT: !99 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.e8193710fd35b608", scope: null, file: !3, line: 40, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !99 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.19c352736f719291", scope: null, file: !3, line: 40, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !100 = !DILocation(line: 41, column: 7, scope: !99) // CHECK:STDOUT: !101 = !DILocation(line: 41, column: 6, scope: !99) // CHECK:STDOUT: !102 = !DILocation(line: 42, column: 5, scope: !99) @@ -443,21 +442,21 @@ fn M() { // CHECK:STDOUT: !104 = !DILocation(line: 43, column: 5, scope: !99) // CHECK:STDOUT: !105 = !DILocation(line: 41, column: 3, scope: !99) // CHECK:STDOUT: !106 = !DILocation(line: 40, column: 1, scope: !99) -// CHECK:STDOUT: !107 = distinct !DISubprogram(name: "E", linkageName: "_CE.Main.e8193710fd35b608", scope: null, file: !3, line: 60, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !107 = distinct !DISubprogram(name: "E", linkageName: "_CE.Main.19c352736f719291", scope: null, file: !3, line: 60, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !108 = !DILocation(line: 61, column: 10, scope: !107) // CHECK:STDOUT: !109 = !DILocation(line: 61, column: 3, scope: !107) -// CHECK:STDOUT: !110 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.e8193710fd35b608", scope: null, file: !3, line: 64, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !110 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.19c352736f719291", scope: null, file: !3, line: 64, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !111 = !DILocation(line: 65, column: 10, scope: !110) // CHECK:STDOUT: !112 = !DILocation(line: 65, column: 3, scope: !110) -// CHECK:STDOUT: !113 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.b88d1103f417c6d4", scope: null, file: !3, line: 68, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !113 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 68, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !114 = !DILocation(line: 69, column: 15, scope: !113) // CHECK:STDOUT: !115 = !DILocation(line: 69, column: 10, scope: !113) // CHECK:STDOUT: !116 = !DILocation(line: 69, column: 3, scope: !113) -// CHECK:STDOUT: !117 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 68, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !117 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.274514a8254d0859", scope: null, file: !3, line: 68, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !118 = !DILocation(line: 69, column: 15, scope: !117) // CHECK:STDOUT: !119 = !DILocation(line: 69, column: 10, scope: !117) // CHECK:STDOUT: !120 = !DILocation(line: 69, column: 3, scope: !117) -// CHECK:STDOUT: !121 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.e8193710fd35b608", scope: null, file: !3, line: 68, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !121 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.19c352736f719291", scope: null, file: !3, line: 68, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !122 = !DILocation(line: 69, column: 15, scope: !121) // CHECK:STDOUT: !123 = !DILocation(line: 69, column: 10, scope: !121) // CHECK:STDOUT: !124 = !DILocation(line: 69, column: 3, scope: !121) diff --git a/toolchain/lower/testdata/function/generic/call_specific_in_class.carbon b/toolchain/lower/testdata/function/generic/call_specific_in_class.carbon index 4bcda189fe9c..85af0bae63ba 100644 --- a/toolchain/lower/testdata/function/generic/call_specific_in_class.carbon +++ b/toolchain/lower/testdata/function/generic/call_specific_in_class.carbon @@ -15,17 +15,17 @@ // generic function for an object, from a generic context. // The specifics with a pointer type could be deduplicated here. class C { - fn Cfn[self: Self, T:! type](x: T) -> T { + fn Cfn[self: Self, T:! Core.Copy](x: T) -> T { return x; } } -fn G[T:! type](x: T) -> T { +fn G[T:! Core.Copy](x: T) -> T { var c: C; return c.Cfn(x); } -fn F[T:! type](x: T) -> T { +fn F[T:! Core.Copy](x: T) -> T { return G(x); } @@ -58,109 +58,109 @@ fn M() { // CHECK:STDOUT: %var_f64.var = alloca double, align 8, !dbg !11 // CHECK:STDOUT: %c.var = alloca {}, align 8, !dbg !12 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_i32.var), !dbg !7 -// CHECK:STDOUT: %.loc34 = load ptr, ptr %ptr_i32.var, align 8, !dbg !13 -// CHECK:STDOUT: %F.call.loc34 = call ptr @_CF.Main.e8193710fd35b608(ptr %.loc34), !dbg !14 +// CHECK:STDOUT: %.loc34_5 = load ptr, ptr %ptr_i32.var, align 8, !dbg !13 +// CHECK:STDOUT: %F.call.loc34 = call ptr @_CF.Main.19c352736f719291(ptr %.loc34_5), !dbg !14 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_f64.var), !dbg !8 -// CHECK:STDOUT: %.loc36 = load ptr, ptr %ptr_f64.var, align 8, !dbg !15 -// CHECK:STDOUT: %F.call.loc36 = call ptr @_CF.Main.e8193710fd35b608(ptr %.loc36), !dbg !16 +// CHECK:STDOUT: %.loc36_5 = load ptr, ptr %ptr_f64.var, align 8, !dbg !15 +// CHECK:STDOUT: %F.call.loc36 = call ptr @_CF.Main.19c352736f719291(ptr %.loc36_5), !dbg !16 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_i8.var), !dbg !9 -// CHECK:STDOUT: %.loc38 = load ptr, ptr %ptr_i8.var, align 8, !dbg !17 -// CHECK:STDOUT: %F.call.loc38 = call ptr @_CF.Main.e8193710fd35b608(ptr %.loc38), !dbg !18 +// CHECK:STDOUT: %.loc38_5 = load ptr, ptr %ptr_i8.var, align 8, !dbg !17 +// CHECK:STDOUT: %F.call.loc38 = call ptr @_CF.Main.19c352736f719291(ptr %.loc38_5), !dbg !18 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %var_i32.var), !dbg !10 // CHECK:STDOUT: store i32 0, ptr %var_i32.var, align 4, !dbg !10 -// CHECK:STDOUT: %.loc40 = load i32, ptr %var_i32.var, align 4, !dbg !19 -// CHECK:STDOUT: %F.call.loc40 = call i32 @_CF.Main.b88d1103f417c6d4(i32 %.loc40), !dbg !20 +// CHECK:STDOUT: %.loc40_5 = load i32, ptr %var_i32.var, align 4, !dbg !19 +// CHECK:STDOUT: %F.call.loc40 = call i32 @_CF.Main.b7c8e4dff2adcdaa(i32 %.loc40_5), !dbg !20 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %var_f64.var), !dbg !11 // CHECK:STDOUT: store double 0.000000e+00, ptr %var_f64.var, align 8, !dbg !11 -// CHECK:STDOUT: %.loc42 = load double, ptr %var_f64.var, align 8, !dbg !21 -// CHECK:STDOUT: %F.call.loc42 = call double @_CF.Main.d4b5665541d5d7a8(double %.loc42), !dbg !22 +// CHECK:STDOUT: %.loc42_5 = load double, ptr %var_f64.var, align 8, !dbg !21 +// CHECK:STDOUT: %F.call.loc42 = call double @_CF.Main.274514a8254d0859(double %.loc42_5), !dbg !22 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %c.var), !dbg !12 -// CHECK:STDOUT: %F.call.loc44 = call %type @_CF.Main.5754c7a55c7cbe4a(%type zeroinitializer), !dbg !23 +// CHECK:STDOUT: %F.call.loc44 = call %type @_CF.Main.08871b6f43862d33(%type zeroinitializer), !dbg !23 // CHECK:STDOUT: ret void, !dbg !24 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) // CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #0 // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr ptr @_CF.Main.e8193710fd35b608(ptr %x) !dbg !25 { +// CHECK:STDOUT: define linkonce_odr ptr @_CF.Main.19c352736f719291(ptr %x) !dbg !25 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %G.call = call ptr @_CG.Main.e8193710fd35b608(ptr %x), !dbg !26 +// CHECK:STDOUT: %G.call = call ptr @_CG.Main.19c352736f719291(ptr %x), !dbg !26 // CHECK:STDOUT: ret ptr %G.call, !dbg !27 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CF.Main.b88d1103f417c6d4(i32 %x) !dbg !28 { +// CHECK:STDOUT: define linkonce_odr i32 @_CF.Main.b7c8e4dff2adcdaa(i32 %x) !dbg !28 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %G.call = call i32 @_CG.Main.b88d1103f417c6d4(i32 %x), !dbg !29 +// CHECK:STDOUT: %G.call = call i32 @_CG.Main.b7c8e4dff2adcdaa(i32 %x), !dbg !29 // CHECK:STDOUT: ret i32 %G.call, !dbg !30 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr double @_CF.Main.d4b5665541d5d7a8(double %x) !dbg !31 { +// CHECK:STDOUT: define linkonce_odr double @_CF.Main.274514a8254d0859(double %x) !dbg !31 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %G.call = call double @_CG.Main.d4b5665541d5d7a8(double %x), !dbg !32 +// CHECK:STDOUT: %G.call = call double @_CG.Main.274514a8254d0859(double %x), !dbg !32 // CHECK:STDOUT: ret double %G.call, !dbg !33 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr %type @_CF.Main.5754c7a55c7cbe4a(%type %x) !dbg !34 { +// CHECK:STDOUT: define linkonce_odr %type @_CF.Main.08871b6f43862d33(%type %x) !dbg !34 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %G.call = call %type @_CG.Main.5754c7a55c7cbe4a(%type %x), !dbg !35 +// CHECK:STDOUT: %G.call = call %type @_CG.Main.08871b6f43862d33(%type %x), !dbg !35 // CHECK:STDOUT: ret %type %G.call, !dbg !36 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr ptr @_CG.Main.e8193710fd35b608(ptr %x) !dbg !37 { +// CHECK:STDOUT: define linkonce_odr ptr @_CG.Main.19c352736f719291(ptr %x) !dbg !37 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %c.var = alloca {}, align 8, !dbg !38 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %c.var), !dbg !38 -// CHECK:STDOUT: %C.Cfn.call = call ptr @_CCfn.C.Main.e8193710fd35b608(ptr %c.var, ptr %x), !dbg !39 +// CHECK:STDOUT: %C.Cfn.call = call ptr @_CCfn.C.Main.19c352736f719291(ptr %c.var, ptr %x), !dbg !39 // CHECK:STDOUT: ret ptr %C.Cfn.call, !dbg !40 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CG.Main.b88d1103f417c6d4(i32 %x) !dbg !41 { +// CHECK:STDOUT: define linkonce_odr i32 @_CG.Main.b7c8e4dff2adcdaa(i32 %x) !dbg !41 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %c.var = alloca {}, align 8, !dbg !42 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %c.var), !dbg !42 -// CHECK:STDOUT: %C.Cfn.call = call i32 @_CCfn.C.Main.b88d1103f417c6d4(ptr %c.var, i32 %x), !dbg !43 +// CHECK:STDOUT: %C.Cfn.call = call i32 @_CCfn.C.Main.b7c8e4dff2adcdaa(ptr %c.var, i32 %x), !dbg !43 // CHECK:STDOUT: ret i32 %C.Cfn.call, !dbg !44 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr double @_CG.Main.d4b5665541d5d7a8(double %x) !dbg !45 { +// CHECK:STDOUT: define linkonce_odr double @_CG.Main.274514a8254d0859(double %x) !dbg !45 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %c.var = alloca {}, align 8, !dbg !46 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %c.var), !dbg !46 -// CHECK:STDOUT: %C.Cfn.call = call double @_CCfn.C.Main.d4b5665541d5d7a8(ptr %c.var, double %x), !dbg !47 +// CHECK:STDOUT: %C.Cfn.call = call double @_CCfn.C.Main.274514a8254d0859(ptr %c.var, double %x), !dbg !47 // CHECK:STDOUT: ret double %C.Cfn.call, !dbg !48 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr %type @_CG.Main.5754c7a55c7cbe4a(%type %x) !dbg !49 { +// CHECK:STDOUT: define linkonce_odr %type @_CG.Main.08871b6f43862d33(%type %x) !dbg !49 { // CHECK:STDOUT: entry: // CHECK:STDOUT: %c.var = alloca {}, align 8, !dbg !50 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %c.var), !dbg !50 -// CHECK:STDOUT: %C.Cfn.call = call %type @_CCfn.C.Main.5754c7a55c7cbe4a(ptr %c.var, %type %x), !dbg !51 +// CHECK:STDOUT: %C.Cfn.call = call %type @_CCfn.C.Main.08871b6f43862d33(ptr %c.var, %type %x), !dbg !51 // CHECK:STDOUT: ret %type %C.Cfn.call, !dbg !52 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr ptr @_CCfn.C.Main.e8193710fd35b608(ptr %self, ptr %x) !dbg !53 { +// CHECK:STDOUT: define linkonce_odr ptr @_CCfn.C.Main.19c352736f719291(ptr %self, ptr %x) !dbg !53 { // CHECK:STDOUT: entry: // CHECK:STDOUT: ret ptr %x, !dbg !54 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CCfn.C.Main.b88d1103f417c6d4(ptr %self, i32 %x) !dbg !55 { +// CHECK:STDOUT: define linkonce_odr i32 @_CCfn.C.Main.b7c8e4dff2adcdaa(ptr %self, i32 %x) !dbg !55 { // CHECK:STDOUT: entry: // CHECK:STDOUT: ret i32 %x, !dbg !56 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr double @_CCfn.C.Main.d4b5665541d5d7a8(ptr %self, double %x) !dbg !57 { +// CHECK:STDOUT: define linkonce_odr double @_CCfn.C.Main.274514a8254d0859(ptr %self, double %x) !dbg !57 { // CHECK:STDOUT: entry: // CHECK:STDOUT: ret double %x, !dbg !58 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr %type @_CCfn.C.Main.5754c7a55c7cbe4a(ptr %self, %type %x) !dbg !59 { +// CHECK:STDOUT: define linkonce_odr %type @_CCfn.C.Main.08871b6f43862d33(ptr %self, %type %x) !dbg !59 { // CHECK:STDOUT: entry: // CHECK:STDOUT: ret %type %x, !dbg !60 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; uselistorder directives // CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 0, 1, 2, 3, 9, 8, 7, 6, 5, 4 } -// CHECK:STDOUT: uselistorder ptr @_CF.Main.e8193710fd35b608, { 2, 1, 0 } +// CHECK:STDOUT: uselistorder ptr @_CF.Main.19c352736f719291, { 2, 1, 0 } // CHECK:STDOUT: // CHECK:STDOUT: attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } // CHECK:STDOUT: @@ -192,39 +192,39 @@ fn M() { // CHECK:STDOUT: !22 = !DILocation(line: 42, column: 3, scope: !4) // CHECK:STDOUT: !23 = !DILocation(line: 44, column: 3, scope: !4) // CHECK:STDOUT: !24 = !DILocation(line: 32, column: 1, scope: !4) -// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.e8193710fd35b608", scope: null, file: !3, line: 28, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.19c352736f719291", scope: null, file: !3, line: 28, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !26 = !DILocation(line: 29, column: 10, scope: !25) // CHECK:STDOUT: !27 = !DILocation(line: 29, column: 3, scope: !25) -// CHECK:STDOUT: !28 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.b88d1103f417c6d4", scope: null, file: !3, line: 28, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !28 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 28, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !29 = !DILocation(line: 29, column: 10, scope: !28) // CHECK:STDOUT: !30 = !DILocation(line: 29, column: 3, scope: !28) -// CHECK:STDOUT: !31 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 28, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !31 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.274514a8254d0859", scope: null, file: !3, line: 28, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !32 = !DILocation(line: 29, column: 10, scope: !31) // CHECK:STDOUT: !33 = !DILocation(line: 29, column: 3, scope: !31) -// CHECK:STDOUT: !34 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.5754c7a55c7cbe4a", scope: null, file: !3, line: 28, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !34 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.08871b6f43862d33", scope: null, file: !3, line: 28, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !35 = !DILocation(line: 29, column: 10, scope: !34) // CHECK:STDOUT: !36 = !DILocation(line: 29, column: 3, scope: !34) -// CHECK:STDOUT: !37 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.e8193710fd35b608", scope: null, file: !3, line: 23, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !37 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.19c352736f719291", scope: null, file: !3, line: 23, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !38 = !DILocation(line: 24, column: 3, scope: !37) // CHECK:STDOUT: !39 = !DILocation(line: 25, column: 10, scope: !37) // CHECK:STDOUT: !40 = !DILocation(line: 25, column: 3, scope: !37) -// CHECK:STDOUT: !41 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.b88d1103f417c6d4", scope: null, file: !3, line: 23, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !41 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 23, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !42 = !DILocation(line: 24, column: 3, scope: !41) // CHECK:STDOUT: !43 = !DILocation(line: 25, column: 10, scope: !41) // CHECK:STDOUT: !44 = !DILocation(line: 25, column: 3, scope: !41) -// CHECK:STDOUT: !45 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 23, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !45 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.274514a8254d0859", scope: null, file: !3, line: 23, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !46 = !DILocation(line: 24, column: 3, scope: !45) // CHECK:STDOUT: !47 = !DILocation(line: 25, column: 10, scope: !45) // CHECK:STDOUT: !48 = !DILocation(line: 25, column: 3, scope: !45) -// CHECK:STDOUT: !49 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.5754c7a55c7cbe4a", scope: null, file: !3, line: 23, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !49 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.08871b6f43862d33", scope: null, file: !3, line: 23, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !50 = !DILocation(line: 24, column: 3, scope: !49) // CHECK:STDOUT: !51 = !DILocation(line: 25, column: 10, scope: !49) // CHECK:STDOUT: !52 = !DILocation(line: 25, column: 3, scope: !49) -// CHECK:STDOUT: !53 = distinct !DISubprogram(name: "Cfn", linkageName: "_CCfn.C.Main.e8193710fd35b608", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !53 = distinct !DISubprogram(name: "Cfn", linkageName: "_CCfn.C.Main.19c352736f719291", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !54 = !DILocation(line: 19, column: 5, scope: !53) -// CHECK:STDOUT: !55 = distinct !DISubprogram(name: "Cfn", linkageName: "_CCfn.C.Main.b88d1103f417c6d4", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !55 = distinct !DISubprogram(name: "Cfn", linkageName: "_CCfn.C.Main.b7c8e4dff2adcdaa", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !56 = !DILocation(line: 19, column: 5, scope: !55) -// CHECK:STDOUT: !57 = distinct !DISubprogram(name: "Cfn", linkageName: "_CCfn.C.Main.d4b5665541d5d7a8", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !57 = distinct !DISubprogram(name: "Cfn", linkageName: "_CCfn.C.Main.274514a8254d0859", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !58 = !DILocation(line: 19, column: 5, scope: !57) -// CHECK:STDOUT: !59 = distinct !DISubprogram(name: "Cfn", linkageName: "_CCfn.C.Main.5754c7a55c7cbe4a", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !59 = distinct !DISubprogram(name: "Cfn", linkageName: "_CCfn.C.Main.08871b6f43862d33", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !60 = !DILocation(line: 19, column: 5, scope: !59) diff --git a/toolchain/lower/testdata/function/generic/cross_library_name_collision_private.carbon b/toolchain/lower/testdata/function/generic/cross_library_name_collision_private.carbon index e36849f15cba..787f1f55355a 100644 --- a/toolchain/lower/testdata/function/generic/cross_library_name_collision_private.carbon +++ b/toolchain/lower/testdata/function/generic/cross_library_name_collision_private.carbon @@ -14,11 +14,11 @@ library "[[@TEST_NAME]]"; -private fn F[T:! type](a: T, b: T) -> T { +private fn F[T:! Core.Copy](a: T, b: T) -> T { return a; } -fn Lib1CallF[T:! type](a: T, b: T) -> T { +fn Lib1CallF[T:! Core.Copy](a: T, b: T) -> T { return F(a, b); } @@ -29,11 +29,11 @@ library "[[@TEST_NAME]]"; // Duplicate function name in different files. Shouldn't be a name conflict // because of `private`. However, we currently use the same mangling for both // functions. -private fn F[T:! type](a: T, b: T) -> T { +private fn F[T:! Core.Copy](a: T, b: T) -> T { return b; } -fn Lib2CallF[T:! type](a: T, b: T) -> T { +fn Lib2CallF[T:! Core.Copy](a: T, b: T) -> T { return F(a, b); } @@ -76,27 +76,27 @@ fn Run() { // CHECK:STDOUT: // CHECK:STDOUT: define void @main() !dbg !4 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %Lib1CallF.call = call i32 @_CLib1CallF.Main.b88d1103f417c6d4(i32 1, i32 2), !dbg !7 -// CHECK:STDOUT: %Lib2CallF.call = call i32 @_CLib2CallF.Main.b88d1103f417c6d4(i32 1, i32 2), !dbg !8 +// CHECK:STDOUT: %Lib1CallF.call = call i32 @_CLib1CallF.Main.fff9b6025d351f91(i32 1, i32 2), !dbg !7 +// CHECK:STDOUT: %Lib2CallF.call = call i32 @_CLib2CallF.Main.fff9b6025d351f91(i32 1, i32 2), !dbg !8 // CHECK:STDOUT: ret void, !dbg !9 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CLib1CallF.Main.b88d1103f417c6d4(i32 %a, i32 %b) !dbg !10 { -// CHECK:STDOUT: %1 = call i32 @_CF.Main.b88d1103f417c6d4(i32 %a, i32 %b), !dbg !12 +// CHECK:STDOUT: define linkonce_odr i32 @_CLib1CallF.Main.fff9b6025d351f91(i32 %a, i32 %b) !dbg !10 { +// CHECK:STDOUT: %1 = call i32 @_CF.Main.fff9b6025d351f91(i32 %a, i32 %b), !dbg !12 // CHECK:STDOUT: ret i32 %1, !dbg !13 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CLib2CallF.Main.b88d1103f417c6d4(i32 %a, i32 %b) !dbg !14 { -// CHECK:STDOUT: %1 = call i32 @_CF.Main.b88d1103f417c6d4(i32 %a, i32 %b), !dbg !16 +// CHECK:STDOUT: define linkonce_odr i32 @_CLib2CallF.Main.fff9b6025d351f91(i32 %a, i32 %b) !dbg !14 { +// CHECK:STDOUT: %1 = call i32 @_CF.Main.fff9b6025d351f91(i32 %a, i32 %b), !dbg !16 // CHECK:STDOUT: ret i32 %1, !dbg !17 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @_CF.Main.b88d1103f417c6d4(i32 %a, i32 %b) !dbg !18 { +// CHECK:STDOUT: define linkonce_odr i32 @_CF.Main.fff9b6025d351f91(i32 %a, i32 %b) !dbg !18 { // CHECK:STDOUT: ret i32 %a, !dbg !19 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; uselistorder directives -// CHECK:STDOUT: uselistorder ptr @_CF.Main.b88d1103f417c6d4, { 1, 0 } +// CHECK:STDOUT: uselistorder ptr @_CF.Main.fff9b6025d351f91, { 1, 0 } // CHECK:STDOUT: // CHECK:STDOUT: !llvm.module.flags = !{!0, !1} // CHECK:STDOUT: !llvm.dbg.cu = !{!2} @@ -111,13 +111,13 @@ fn Run() { // CHECK:STDOUT: !7 = !DILocation(line: 10, column: 16, scope: !4) // CHECK:STDOUT: !8 = !DILocation(line: 11, column: 16, scope: !4) // CHECK:STDOUT: !9 = !DILocation(line: 9, column: 1, scope: !4) -// CHECK:STDOUT: !10 = distinct !DISubprogram(name: "Lib1CallF", linkageName: "_CLib1CallF.Main.b88d1103f417c6d4", scope: null, file: !11, line: 8, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !10 = distinct !DISubprogram(name: "Lib1CallF", linkageName: "_CLib1CallF.Main.fff9b6025d351f91", scope: null, file: !11, line: 8, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !11 = !DIFile(filename: "lib1.carbon", directory: "") // CHECK:STDOUT: !12 = !DILocation(line: 9, column: 10, scope: !10) // CHECK:STDOUT: !13 = !DILocation(line: 9, column: 3, scope: !10) -// CHECK:STDOUT: !14 = distinct !DISubprogram(name: "Lib2CallF", linkageName: "_CLib2CallF.Main.b88d1103f417c6d4", scope: null, file: !15, line: 11, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !14 = distinct !DISubprogram(name: "Lib2CallF", linkageName: "_CLib2CallF.Main.fff9b6025d351f91", scope: null, file: !15, line: 11, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !15 = !DIFile(filename: "lib2.carbon", directory: "") // CHECK:STDOUT: !16 = !DILocation(line: 12, column: 10, scope: !14) // CHECK:STDOUT: !17 = !DILocation(line: 12, column: 3, scope: !14) -// CHECK:STDOUT: !18 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.b88d1103f417c6d4", scope: null, file: !11, line: 4, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !18 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.fff9b6025d351f91", scope: null, file: !11, line: 4, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !19 = !DILocation(line: 5, column: 3, scope: !18) diff --git a/toolchain/lower/testdata/interface/basic.carbon b/toolchain/lower/testdata/interface/basic.carbon index 3d818a1d1d44..304cef8efe39 100644 --- a/toolchain/lower/testdata/interface/basic.carbon +++ b/toolchain/lower/testdata/interface/basic.carbon @@ -16,14 +16,26 @@ interface I { // There are no interesting runtime operations here, but there's no rule saying // you can't pass a facet around at runtime, so make sure it works. -fn F(T: I) -> I { return T; } +fn F(T: I) {} + +fn G() -> I; + +fn H() -> I { return G(); } // CHECK:STDOUT: ; ModuleID = 'basic.carbon' // CHECK:STDOUT: source_filename = "basic.carbon" // CHECK:STDOUT: -// CHECK:STDOUT: define {} @_CF.Main({} %T) !dbg !4 { +// CHECK:STDOUT: define void @_CF.Main({} %T) !dbg !4 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: ret {} %T, !dbg !7 +// CHECK:STDOUT: ret void, !dbg !7 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: declare {} @_CG.Main() +// CHECK:STDOUT: +// CHECK:STDOUT: define {} @_CH.Main() !dbg !8 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: %G.call = call {} @_CG.Main(), !dbg !9 +// CHECK:STDOUT: ret {} %G.call, !dbg !10 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !llvm.module.flags = !{!0, !1} @@ -36,4 +48,7 @@ fn F(T: I) -> I { return T; } // CHECK:STDOUT: !4 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main", scope: null, file: !3, line: 19, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !5 = !DISubroutineType(types: !6) // CHECK:STDOUT: !6 = !{} -// CHECK:STDOUT: !7 = !DILocation(line: 19, column: 19, scope: !4) +// CHECK:STDOUT: !7 = !DILocation(line: 19, column: 1, scope: !4) +// CHECK:STDOUT: !8 = distinct !DISubprogram(name: "H", linkageName: "_CH.Main", scope: null, file: !3, line: 23, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !9 = !DILocation(line: 23, column: 22, scope: !8) +// CHECK:STDOUT: !10 = !DILocation(line: 23, column: 15, scope: !8) diff --git a/toolchain/lower/testdata/operators/increment.carbon b/toolchain/lower/testdata/operators/increment.carbon index de19399b9f1a..af943f4b5ee1 100644 --- a/toolchain/lower/testdata/operators/increment.carbon +++ b/toolchain/lower/testdata/operators/increment.carbon @@ -35,19 +35,19 @@ fn IncrSigned() { // CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #0 // CHECK:STDOUT: // CHECK:STDOUT: define linkonce_odr void @"_COp.Int.Core:Inc.Core.be1e879c1ad406d8"(ptr %self) !dbg !10 { -// CHECK:STDOUT: call void @"_COp:thunk.Int.Core:AddAssignWith.Core.81406e440463ef1d"(ptr %self, i32 1), !dbg !12 +// CHECK:STDOUT: call void @"_COp:thunk.Int.Core:AddAssignWith.Core.07c7d6b130c9b7ed"(ptr %self, i32 1), !dbg !12 // CHECK:STDOUT: ret void, !dbg !13 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.Core:AddAssignWith.Core.81406e440463ef1d"(ptr %self, i32 %other) !dbg !14 { -// CHECK:STDOUT: %1 = call i32 @"_CConvert.8b3d5d6a6c17be04:ImplicitAs.Core.b88d1103f417c6d4"(i32 %other), !dbg !15 +// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.Core:AddAssignWith.Core.07c7d6b130c9b7ed"(ptr %self, i32 %other) !dbg !14 { +// CHECK:STDOUT: %1 = call i32 @"_CConvert.565a24e863a374f5:ImplicitAs.Core.b7c8e4dff2adcdaa"(i32 %other), !dbg !15 // CHECK:STDOUT: %2 = load i32, ptr %self, align 4, !dbg !16 // CHECK:STDOUT: %3 = add i32 %2, %1, !dbg !16 // CHECK:STDOUT: store i32 %3, ptr %self, align 4, !dbg !16 // CHECK:STDOUT: ret void, !dbg !16 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.8b3d5d6a6c17be04:ImplicitAs.Core.b88d1103f417c6d4"(i32 %self) !dbg !17 { +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.565a24e863a374f5:ImplicitAs.Core.b7c8e4dff2adcdaa"(i32 %self) !dbg !17 { // CHECK:STDOUT: ret i32 %self, !dbg !19 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -70,9 +70,9 @@ fn IncrSigned() { // CHECK:STDOUT: !11 = !DIFile(filename: "{{.*}}/prelude/types/int.carbon", directory: "") // CHECK:STDOUT: !12 = !DILocation(line: 341, column: 5, scope: !10) // CHECK:STDOUT: !13 = !DILocation(line: 339, column: 3, scope: !10) -// CHECK:STDOUT: !14 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.Core:AddAssignWith.Core.81406e440463ef1d", scope: null, file: !11, line: 275, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !14 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.Core:AddAssignWith.Core.07c7d6b130c9b7ed", scope: null, file: !11, line: 275, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !15 = !DILocation(line: 4294967295, scope: !14) // CHECK:STDOUT: !16 = !DILocation(line: 275, column: 3, scope: !14) -// CHECK:STDOUT: !17 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.8b3d5d6a6c17be04:ImplicitAs.Core.b88d1103f417c6d4", scope: null, file: !18, line: 23, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !17 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.565a24e863a374f5:ImplicitAs.Core.b7c8e4dff2adcdaa", scope: null, file: !18, line: 24, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !18 = !DIFile(filename: "{{.*}}/prelude/operators/as.carbon", directory: "") -// CHECK:STDOUT: !19 = !DILocation(line: 23, column: 38, scope: !17) +// CHECK:STDOUT: !19 = !DILocation(line: 24, column: 38, scope: !17) diff --git a/toolchain/testing/testdata/min_prelude/parts/copy.carbon b/toolchain/testing/testdata/min_prelude/parts/copy.carbon index e17c75e68452..97cf02443b9f 100644 --- a/toolchain/testing/testdata/min_prelude/parts/copy.carbon +++ b/toolchain/testing/testdata/min_prelude/parts/copy.carbon @@ -17,6 +17,10 @@ private fn CharLiteral() -> type = "char_literal.make_type"; private fn FloatLiteral() -> type = "float_literal.make_type"; private fn IntLiteral() -> type = "int_literal.make_type"; +impl forall [T:! Copy] const T as Copy { + fn Op[self: Self]() -> Self { return (self as T).(Copy.Op)() as const T; } +} + impl Bool() as Copy { fn Op[self: Self]() -> Self = "primitive_copy"; } @@ -46,5 +50,13 @@ impl () as Copy { } impl forall [T:! Copy, U:! Copy] (T, U) as Copy { - fn Op[self: Self]() -> Self { return (self.0.Op(), self.1.Op()); } + fn Op[self: Self]() -> Self { + return (self.0.Op(), self.1.Op()); + } +} + +impl forall [T:! Copy, U:! Copy, V:! Copy] (T, U, V) as Copy { + fn Op[self: Self]() -> Self { + return (self.0.Op(), self.1.Op(), self.2.Op()); + } }