diff --git a/toolchain/check/BUILD b/toolchain/check/BUILD index d4a1e20fe9eb..d084e57a7794 100644 --- a/toolchain/check/BUILD +++ b/toolchain/check/BUILD @@ -44,6 +44,7 @@ cc_library( "modifiers.cpp", "name_component.cpp", "name_lookup.cpp", + "name_ref.cpp", "operator.cpp", "pattern.cpp", "pattern_match.cpp", @@ -89,6 +90,7 @@ cc_library( "modifiers.h", "name_component.h", "name_lookup.h", + "name_ref.h", "operator.h", "param_and_arg_refs_stack.h", "pattern.h", diff --git a/toolchain/check/handle_name.cpp b/toolchain/check/handle_name.cpp index fab3affce77f..4570bf3cf863 100644 --- a/toolchain/check/handle_name.cpp +++ b/toolchain/check/handle_name.cpp @@ -9,6 +9,7 @@ #include "toolchain/check/member_access.h" #include "toolchain/check/name_component.h" #include "toolchain/check/name_lookup.h" +#include "toolchain/check/name_ref.h" #include "toolchain/check/pointer_dereference.h" #include "toolchain/check/type.h" #include "toolchain/lex/token_kind.h" @@ -109,26 +110,8 @@ static auto GetIdentifierAsNameId( static auto HandleNameAsExpr(Context& context, Parse::NodeId node_id, SemIR::NameId name_id) -> SemIR::InstId { auto result = LookupUnqualifiedName(context, node_id, name_id); - SemIR::InstId inst_id = result.scope_result.target_inst_id(); - auto type_id = SemIR::GetTypeOfInstInSpecific(context.sem_ir(), - result.specific_id, inst_id); - CARBON_CHECK(type_id.has_value(), "Missing type for {0}", - context.insts().Get(inst_id)); - - // If the named entity has a constant value that depends on its specific, - // store the specific too. - if (result.specific_id.has_value() && - context.constant_values().Get(inst_id).is_symbolic()) { - inst_id = - AddInst(context, node_id, - {.type_id = type_id, - .inst_id = inst_id, - .specific_id = result.specific_id}); - } - - return AddInst( - context, node_id, - {.type_id = type_id, .name_id = name_id, .value_id = inst_id}); + return BuildNameRef(context, node_id, name_id, + result.scope_result.target_inst_id(), result.specific_id); } auto HandleParseNode(Context& context, diff --git a/toolchain/check/name_ref.cpp b/toolchain/check/name_ref.cpp new file mode 100644 index 000000000000..741e2d82d100 --- /dev/null +++ b/toolchain/check/name_ref.cpp @@ -0,0 +1,33 @@ +// 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 "toolchain/check/name_ref.h" + +#include "toolchain/check/inst.h" + +namespace Carbon::Check { + +auto BuildNameRef(Context& context, SemIR::LocId loc_id, SemIR::NameId name_id, + SemIR::InstId inst_id, SemIR::SpecificId specific_id) + -> SemIR::InstId { + auto type_id = + SemIR::GetTypeOfInstInSpecific(context.sem_ir(), specific_id, inst_id); + CARBON_CHECK(type_id.has_value(), "Missing type for {0}", + context.insts().Get(inst_id)); + + // If the named entity has a constant value that depends on its specific, + // store the specific too. + if (specific_id.has_value() && + context.constant_values().Get(inst_id).is_symbolic()) { + inst_id = AddInst( + context, loc_id, + {.type_id = type_id, .inst_id = inst_id, .specific_id = specific_id}); + } + + return AddInst( + context, loc_id, + {.type_id = type_id, .name_id = name_id, .value_id = inst_id}); +} + +} // namespace Carbon::Check diff --git a/toolchain/check/name_ref.h b/toolchain/check/name_ref.h new file mode 100644 index 000000000000..1063ec19440e --- /dev/null +++ b/toolchain/check/name_ref.h @@ -0,0 +1,21 @@ +// 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 + +#ifndef CARBON_TOOLCHAIN_CHECK_NAME_REF_H_ +#define CARBON_TOOLCHAIN_CHECK_NAME_REF_H_ + +#include "toolchain/check/context.h" +#include "toolchain/sem_ir/ids.h" + +namespace Carbon::Check { + +// Builds a reference to the given name, which has already been resolved to +// `inst_id` within `specific_id`. +auto BuildNameRef(Context& context, SemIR::LocId loc_id, SemIR::NameId name_id, + SemIR::InstId inst_id, SemIR::SpecificId specific_id) + -> SemIR::InstId; + +} // namespace Carbon::Check + +#endif // CARBON_TOOLCHAIN_CHECK_NAME_REF_H_ diff --git a/toolchain/check/testdata/impl/fail_call_invalid.carbon b/toolchain/check/testdata/impl/fail_call_invalid.carbon index a6382e217938..9d946b2a697e 100644 --- a/toolchain/check/testdata/impl/fail_call_invalid.carbon +++ b/toolchain/check/testdata/impl/fail_call_invalid.carbon @@ -150,8 +150,9 @@ fn InstanceCall(n: i32) { // CHECK:STDOUT: // CHECK:STDOUT: fn @G.3(%self.param: %i32) { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: %G.ref: %G.type.c9825d.1 = name_ref G, @impl.006.%G.decl.loc23_27.1 [concrete = constants.%G.e73e91.1] // CHECK:STDOUT: %self.ref: %i32 = name_ref self, %self.param -// CHECK:STDOUT: %G.bound: = bound_method %self.ref, @impl.006.%G.decl.loc23_27.1 +// CHECK:STDOUT: %G.bound: = bound_method %self.ref, %G.ref // CHECK:STDOUT: %G.call: init %empty_tuple.type = call %G.bound() // CHECK:STDOUT: return // 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 20877298d482..df3e6eab2625 100644 --- a/toolchain/check/testdata/impl/fail_impl_bad_assoc_fn.carbon +++ b/toolchain/check/testdata/impl/fail_impl_bad_assoc_fn.carbon @@ -1201,6 +1201,7 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: // CHECK:STDOUT: fn @F.3() { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type.44ef8c.1 = name_ref F, @impl.ddd.%F.decl.loc68_18.1 [concrete = constants.%F.424e9e.1] // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1208,7 +1209,8 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: // CHECK:STDOUT: fn @F.5() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call @impl.698.%F.decl.loc84_23.1() +// CHECK:STDOUT: %F.ref: %F.type.e1abdd.1 = name_ref F, @impl.698.%F.decl.loc84_23.1 [concrete = constants.%F.6ff574.1] +// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1222,8 +1224,9 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: // CHECK:STDOUT: fn @F.9(%self.param: bool, %b.param: bool) -> bool { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type.69596c.1 = name_ref F, @impl.5cf.%F.decl.loc116_31.1 [concrete = constants.%F.738f31.1] // CHECK:STDOUT: %self.ref: bool = name_ref self, %self.param -// CHECK:STDOUT: %F.bound: = bound_method %self.ref, @impl.5cf.%F.decl.loc116_31.1 +// CHECK:STDOUT: %F.bound: = bound_method %self.ref, %F.ref // CHECK:STDOUT: %b.ref: bool = name_ref b, %b.param // CHECK:STDOUT: return // CHECK:STDOUT: } @@ -1232,9 +1235,10 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: // CHECK:STDOUT: fn @F.11(%self.param: bool, %b.param: bool) -> bool { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type.d97cef.1 = name_ref F, @impl.bac.%F.decl.loc129_26.1 [concrete = constants.%F.01de92.1] // CHECK:STDOUT: %self.ref: bool = name_ref self, %self.param // CHECK:STDOUT: %b.ref: bool = name_ref b, %b.param -// CHECK:STDOUT: %F.call: init bool = call @impl.bac.%F.decl.loc129_26.1(%b.ref) +// CHECK:STDOUT: %F.call: init bool = call %F.ref(%b.ref) // CHECK:STDOUT: %.loc129_26.1: bool = value_of_initializer %F.call // CHECK:STDOUT: %.loc129_26.2: bool = converted %F.call, %.loc129_26.1 // CHECK:STDOUT: return %.loc129_26.2 @@ -1244,8 +1248,9 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: // CHECK:STDOUT: fn @F.13(%self.param: bool, %b.param: bool) -> bool { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type.123d7a.1 = name_ref F, @impl.1a7.%F.decl.loc151_30.1 [concrete = constants.%F.c7d02d.1] // CHECK:STDOUT: %self.ref: bool = name_ref self, %self.param -// CHECK:STDOUT: %F.bound: = bound_method %self.ref, @impl.1a7.%F.decl.loc151_30.1 +// CHECK:STDOUT: %F.bound: = bound_method %self.ref, %F.ref // CHECK:STDOUT: %b.ref: bool = name_ref b, %b.param // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.bound(%self.ref, %b.ref) // CHECK:STDOUT: %.loc151: bool = converted %F.call, [concrete = ] @@ -1256,8 +1261,9 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: // CHECK:STDOUT: fn @F.15(%self.param: bool, %b.param: bool) -> bool { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type.6b537d.1 = name_ref F, @impl.f2b.%F.decl.loc170_38.1 [concrete = constants.%F.04313a.1] // CHECK:STDOUT: %self.ref: bool = name_ref self, %self.param -// CHECK:STDOUT: %F.bound: = bound_method %self.ref, @impl.f2b.%F.decl.loc170_38.1 +// CHECK:STDOUT: %F.bound: = bound_method %self.ref, %F.ref // CHECK:STDOUT: %b.ref: bool = name_ref b, %b.param // CHECK:STDOUT: %.loc102: %FDifferentParamType = converted %b.ref, [concrete = ] // CHECK:STDOUT: %F.call: init bool = call %F.bound(%self.ref, ) @@ -1270,8 +1276,9 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: // CHECK:STDOUT: fn @F.17(%self.param: bool, %b.param: bool) -> bool { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type.d6232a.1 = name_ref F, @impl.db4.%F.decl.loc183_38.1 [concrete = constants.%F.886f70.1] // CHECK:STDOUT: %self.ref: bool = name_ref self, %self.param -// CHECK:STDOUT: %F.bound: = bound_method %self.ref, @impl.db4.%F.decl.loc183_38.1 +// CHECK:STDOUT: %F.bound: = bound_method %self.ref, %F.ref // CHECK:STDOUT: %b.ref: bool = name_ref b, %b.param // CHECK:STDOUT: %.loc102: %FDifferentImplicitParamType = converted %self.ref, [concrete = ] // CHECK:STDOUT: %F.call: init bool = call %F.bound(, %b.ref) @@ -1284,8 +1291,9 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: // CHECK:STDOUT: fn @F.19(%self.param: bool, %b.param: bool) -> bool { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type.d3b58f.1 = name_ref F, @impl.fcc.%F.decl.loc199_38.1 [concrete = constants.%F.be86c9.1] // CHECK:STDOUT: %self.ref: bool = name_ref self, %self.param -// CHECK:STDOUT: %F.bound: = bound_method %self.ref, @impl.fcc.%F.decl.loc199_38.1 +// CHECK:STDOUT: %F.bound: = bound_method %self.ref, %F.ref // CHECK:STDOUT: %b.ref: bool = name_ref b, %b.param // CHECK:STDOUT: %.loc199_38.1: ref %FDifferentReturnType = temporary_storage // CHECK:STDOUT: %F.call: init %FDifferentReturnType = call %F.bound(%self.ref, %b.ref) to %.loc199_38.1 @@ -1310,13 +1318,14 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: // CHECK:STDOUT: fn @F.22(%x.param: %tuple.type.9c9) -> %return.param: %array_type.a41 { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type.f90165.1 = name_ref F, @impl.6a5.%F.decl.loc222_87.1 [concrete = constants.%F.fa8d04.1] // CHECK:STDOUT: %x.ref: %tuple.type.9c9 = name_ref x, %x.param // CHECK:STDOUT: %.loc210_41: ref %array_type.a41 = splice_block %return {} // CHECK:STDOUT: %tuple.elem0: %ptr.4cd = tuple_access %x.ref, element0 // CHECK:STDOUT: %tuple.elem1: %struct_type.x.y.a89 = tuple_access %x.ref, element1 // CHECK:STDOUT: %.loc210_9.1: %SelfNestedBadParam = struct_access %tuple.elem1, element0 // CHECK:STDOUT: %.loc210_9.2: %i32 = converted %.loc210_9.1, [concrete = ] -// CHECK:STDOUT: %F.call: init %array_type.a41 = call @impl.6a5.%F.decl.loc222_87.1() to %.loc210_41 +// CHECK:STDOUT: %F.call: init %array_type.a41 = call %F.ref() to %.loc210_41 // CHECK:STDOUT: return %F.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1324,9 +1333,10 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: // CHECK:STDOUT: fn @F.24(%x.param: %tuple.type.eb9) -> %return.param: %array_type.126 { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type.0e7d1d.1 = name_ref F, @impl.bfc.%F.decl.loc238_112.1 [concrete = constants.%F.0bc78a.1] // CHECK:STDOUT: %x.ref: %tuple.type.eb9 = name_ref x, %x.param // CHECK:STDOUT: %.loc238_112.1: ref %array_type.a41 = temporary_storage -// CHECK:STDOUT: %F.call: init %array_type.a41 = call @impl.bfc.%F.decl.loc238_112.1(%x.ref) to %.loc238_112.1 +// CHECK:STDOUT: %F.call: init %array_type.a41 = call %F.ref(%x.ref) to %.loc238_112.1 // CHECK:STDOUT: %.loc238_112.2: %array_type.126 = converted %F.call, [concrete = ] // CHECK:STDOUT: return to %return // CHECK:STDOUT: } diff --git a/toolchain/check/testdata/impl/fail_self_type_mismatch.carbon b/toolchain/check/testdata/impl/fail_self_type_mismatch.carbon index d7c4009d4af2..d6408b09ae42 100644 --- a/toolchain/check/testdata/impl/fail_self_type_mismatch.carbon +++ b/toolchain/check/testdata/impl/fail_self_type_mismatch.carbon @@ -242,9 +242,10 @@ impl i32 as I { // CHECK:STDOUT: // CHECK:STDOUT: fn @F.4(%c.param: %C.d88) { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type.066a53.1 = name_ref F, @impl.a9a.%F.decl.loc42_18.1 [concrete = constants.%F.9ec58f.1] // CHECK:STDOUT: %c.ref: %C.d88 = name_ref c, %c.param // CHECK:STDOUT: %.loc24: %C.6fb = converted %c.ref, [concrete = ] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call @impl.a9a.%F.decl.loc42_18.1() +// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/impl_thunk.carbon b/toolchain/check/testdata/impl/impl_thunk.carbon index c55d172252c4..12e635bd8c22 100644 --- a/toolchain/check/testdata/impl/impl_thunk.carbon +++ b/toolchain/check/testdata/impl/impl_thunk.carbon @@ -2,8 +2,7 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // -// TODO: Add ranges and switch to "--dump-sem-ir-ranges=only". -// EXTRA-ARGS: --no-prelude-import --dump-sem-ir-ranges=if-present +// EXTRA-ARGS: --no-prelude-import // // AUTOUPDATE // TIP: To test this file alone, run: @@ -33,7 +32,9 @@ interface I { } impl () as I { + //@dump-sem-ir-begin fn F(y: {.b: {}, .a: ()}) -> {.d: {}, .c: ()}; + //@dump-sem-ir-end } // --- inheritance_conversion.carbon @@ -49,7 +50,9 @@ interface X { } impl B as X { + //@dump-sem-ir-begin fn F[addr self: A*](other: A*) -> C*; + //@dump-sem-ir-end } // --- inheritance_value_conversion.carbon @@ -64,7 +67,9 @@ interface X { } impl B as X { + //@dump-sem-ir-begin fn F[self: A](other: A); + //@dump-sem-ir-end } // --- inheritance_value_conversion_pointer.carbon @@ -80,7 +85,9 @@ interface X { } impl B as X { + //@dump-sem-ir-begin fn F[addr self: A*](other: A*) -> C*; + //@dump-sem-ir-end } // --- fail_inheritance_value_conversion_copy_return.carbon @@ -95,14 +102,16 @@ interface X { } impl A as X { + //@dump-sem-ir-begin // CHECK:STDERR: fail_inheritance_value_conversion_copy_return.carbon:[[@LINE+7]]:3: error: cannot copy value of type `A` [CopyOfUncopyableType] // CHECK:STDERR: fn F() -> B; // CHECK:STDERR: ^~~~~~~~~~~~ - // CHECK:STDERR: fail_inheritance_value_conversion_copy_return.carbon:[[@LINE-7]]:3: note: while building thunk to match the signature of this function [ThunkSignature] + // CHECK:STDERR: fail_inheritance_value_conversion_copy_return.carbon:[[@LINE-8]]:3: note: while building thunk to match the signature of this function [ThunkSignature] // CHECK:STDERR: fn F() -> Self; // CHECK:STDERR: ^~~~~~~~~~~~~~~ // CHECK:STDERR: fn F() -> B; + //@dump-sem-ir-end } // --- fail_param_type_mismatch.carbon @@ -242,136 +251,70 @@ class C { } } -// CHECK:STDOUT: --- no_thunk_param_name_differs.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %I.type: type = facet_type <@I> [concrete] -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic] -// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic] -// CHECK:STDOUT: %pattern_type.6de: type = pattern_type %Self.as_type [symbolic] -// CHECK:STDOUT: %F.type.cf0: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.bc6: %F.type.cf0 = struct_value () [concrete] -// CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, @I.%F.decl [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %I.impl_witness: = impl_witness @C.%I.impl_witness_table [concrete] -// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] -// CHECK:STDOUT: %F.type.f36: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.4c3: %F.type.f36 = struct_value () [concrete] -// CHECK:STDOUT: %I.facet: %I.type = facet_value %C, (%I.impl_witness) [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .I = %I.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %I.decl: type = interface_decl @I [concrete = constants.%I.type] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: interface @I { -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self] -// CHECK:STDOUT: %F.decl: %F.type.cf0 = fn_decl @F.1 [concrete = constants.%F.bc6] { -// CHECK:STDOUT: %x.patt: @F.1.%pattern_type (%pattern_type.6de) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @F.1.%pattern_type (%pattern_type.6de) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %x.param: @F.1.%Self.as_type.loc4_23.1 (%Self.as_type) = value_param call_param0 -// CHECK:STDOUT: %.loc4_23.1: type = splice_block %.loc4_23.2 [symbolic = %Self.as_type.loc4_23.1 (constants.%Self.as_type)] { -// CHECK:STDOUT: %Self.ref: %I.type = name_ref Self, @I.%Self [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc4_23.2: type = facet_access_type %Self.ref [symbolic = %Self.as_type.loc4_23.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %.loc4_23.2: type = converted %Self.ref, %Self.as_type.loc4_23.2 [symbolic = %Self.as_type.loc4_23.1 (constants.%Self.as_type)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: @F.1.%Self.as_type.loc4_23.1 (%Self.as_type) = bind_name x, %x.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, %F.decl [concrete = constants.%assoc0] -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self -// CHECK:STDOUT: .F = %assoc0 -// CHECK:STDOUT: witness = (%F.decl) -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: impl @impl: %Self.ref as %I.ref { -// CHECK:STDOUT: %F.decl: %F.type.f36 = fn_decl @F.2 [concrete = constants.%F.4c3] { -// CHECK:STDOUT: %not_x.patt: %pattern_type.c48 = binding_pattern not_x [concrete] -// CHECK:STDOUT: %not_x.param_patt: %pattern_type.c48 = value_param_pattern %not_x.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %not_x.param: %C = value_param call_param0 -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %not_x: %C = bind_name not_x, %not_x.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .C = -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: witness = @C.%I.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: impl_decl @impl [concrete] {} { -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] -// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [concrete = constants.%I.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: %I.impl_witness_table = impl_witness_table (@impl.%F.decl), @impl [concrete] -// CHECK:STDOUT: %I.impl_witness: = impl_witness %I.impl_witness_table [concrete = constants.%I.impl_witness] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %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: .I = -// CHECK:STDOUT: .C = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F.1(@I.%Self: %I.type) { -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc4_23.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc4_23.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type.loc4_23.1 [symbolic = %pattern_type (constants.%pattern_type.6de)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @F.1.%Self.as_type.loc4_23.1 (%Self.as_type)); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2(%not_x.param: %C); -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%Self) { -// CHECK:STDOUT: %Self => constants.%Self -// CHECK:STDOUT: %Self.as_type.loc4_23.1 => constants.%Self.as_type -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.6de -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%I.facet) { -// CHECK:STDOUT: %Self => constants.%I.facet -// CHECK:STDOUT: %Self.as_type.loc4_23.1 => constants.%C -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.c48 -// CHECK:STDOUT: } -// CHECK:STDOUT: +// --- generic_function.carbon + +library "[[@TEST_NAME]]"; + +interface I { + fn F[T:! type](x: T*) -> T*; +} + +impl () as I { + //@dump-sem-ir-begin + fn F[U:! type](x: U) -> U { return x; } + //@dump-sem-ir-end +} + +// --- fail_todo_generic_method.carbon + +library "[[@TEST_NAME]]"; + +interface I { + fn F[self: Self, T:! type](x: T*) -> T*; +} + +// TODO: This fails because `x.(y)`, where `y` is a generic method, fails with +// an "expression cannot be used as a value" error. +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: 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; } + //@dump-sem-ir-end +} + +// --- generic_interface.carbon + +library "[[@TEST_NAME]]"; + +interface I(T:! type) { + fn F() -> {.a: T, .b: T}; +} + +impl () as I({}) { + //@dump-sem-ir-begin + fn F() -> {.b: {}, .a: {}}; + //@dump-sem-ir-end +} + // CHECK:STDOUT: --- struct_conversion.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %I.type: type = facet_type <@I> [concrete] -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] // CHECK:STDOUT: %struct_type.a.b.391: type = struct_type {.a: %empty_tuple.type, .b: %empty_struct_type} [concrete] -// CHECK:STDOUT: %pattern_type.bec: type = pattern_type %struct_type.a.b.391 [concrete] // CHECK:STDOUT: %struct_type.c.d.15a: type = struct_type {.c: %empty_tuple.type, .d: %empty_struct_type} [concrete] -// CHECK:STDOUT: %pattern_type.d63: type = pattern_type %struct_type.c.d.15a [concrete] -// CHECK:STDOUT: %F.type.cf0: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.bc6: %F.type.cf0 = struct_value () [concrete] -// CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, @I.%F.decl [concrete] -// CHECK:STDOUT: %I.impl_witness: = impl_witness file.%I.impl_witness_table [concrete] // CHECK:STDOUT: %struct_type.b.a.40c: type = struct_type {.b: %empty_struct_type, .a: %empty_tuple.type} [concrete] // CHECK:STDOUT: %pattern_type.231: type = pattern_type %struct_type.b.a.40c [concrete] // CHECK:STDOUT: %struct_type.d.c.b36: type = struct_type {.d: %empty_struct_type, .c: %empty_tuple.type} [concrete] // CHECK:STDOUT: %pattern_type.844: type = pattern_type %struct_type.d.c.b36 [concrete] // CHECK:STDOUT: %F.type.39e918.1: type = fn_type @F.2 [concrete] // CHECK:STDOUT: %F.c04b92.1: %F.type.39e918.1 = struct_value () [concrete] -// CHECK:STDOUT: %I.facet: %I.type = facet_value %empty_tuple.type, (%I.impl_witness) [concrete] // CHECK:STDOUT: %F.type.39e918.2: type = fn_type @F.3 [concrete] // CHECK:STDOUT: %F.c04b92.2: %F.type.39e918.2 = struct_value () [concrete] // CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] @@ -379,837 +322,281 @@ class C { // CHECK:STDOUT: %struct: %struct_type.c.d.15a = struct_value (%empty_tuple, %empty_struct) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .I = %I.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %I.decl: type = interface_decl @I [concrete = constants.%I.type] {} {} -// CHECK:STDOUT: impl_decl @impl [concrete] {} { -// CHECK:STDOUT: %.loc8_7.1: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc8_7.2: type = converted %.loc8_7.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [concrete = constants.%I.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: %I.impl_witness_table = impl_witness_table (@impl.%F.decl.loc9_48.2), @impl [concrete] -// CHECK:STDOUT: %I.impl_witness: = impl_witness %I.impl_witness_table [concrete = constants.%I.impl_witness] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: interface @I { -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self] -// CHECK:STDOUT: %F.decl: %F.type.cf0 = fn_decl @F.1 [concrete = constants.%F.bc6] { -// CHECK:STDOUT: %x.patt: %pattern_type.bec = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: %pattern_type.bec = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.d63 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.d63 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc5_38.1: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc5_38.2: type = converted %.loc5_38.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: %.loc5_46.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc5_46.2: type = converted %.loc5_46.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %struct_type.c.d: type = struct_type {.c: %empty_tuple.type, .d: %empty_struct_type} [concrete = constants.%struct_type.c.d.15a] -// CHECK:STDOUT: %x.param: %struct_type.a.b.391 = value_param call_param0 -// CHECK:STDOUT: %.loc5_26: type = splice_block %struct_type.a.b [concrete = constants.%struct_type.a.b.391] { -// CHECK:STDOUT: %.loc5_17.1: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc5_17.2: type = converted %.loc5_17.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: %.loc5_25.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc5_25.2: type = converted %.loc5_25.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %empty_tuple.type, .b: %empty_struct_type} [concrete = constants.%struct_type.a.b.391] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: %struct_type.a.b.391 = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref %struct_type.c.d.15a = out_param call_param1 -// CHECK:STDOUT: %return: ref %struct_type.c.d.15a = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, %F.decl [concrete = constants.%assoc0] -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self -// CHECK:STDOUT: .F = %assoc0 -// CHECK:STDOUT: witness = (%F.decl) -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: impl @impl: %.loc8_7.2 as %I.ref { -// CHECK:STDOUT: %F.decl.loc9_48.1: %F.type.39e918.1 = fn_decl @F.2 [concrete = constants.%F.c04b92.1] { +// CHECK:STDOUT: %F.decl.loc10_48.1: %F.type.39e918.1 = fn_decl @F.2 [concrete = constants.%F.c04b92.1] { // CHECK:STDOUT: %y.patt: %pattern_type.231 = binding_pattern y [concrete] // CHECK:STDOUT: %y.param_patt: %pattern_type.231 = value_param_pattern %y.patt, call_param0 [concrete] // CHECK:STDOUT: %return.patt: %pattern_type.844 = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: %pattern_type.844 = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc9_38.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc9_38.2: type = converted %.loc9_38.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %.loc9_46.1: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc9_46.2: type = converted %.loc9_46.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: %.loc10_38.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc10_38.2: type = converted %.loc10_38.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %.loc10_46.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc10_46.2: type = converted %.loc10_46.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] // CHECK:STDOUT: %struct_type.d.c: type = struct_type {.d: %empty_struct_type, .c: %empty_tuple.type} [concrete = constants.%struct_type.d.c.b36] // CHECK:STDOUT: %y.param: %struct_type.b.a.40c = value_param call_param0 -// CHECK:STDOUT: %.loc9_26: type = splice_block %struct_type.b.a [concrete = constants.%struct_type.b.a.40c] { -// CHECK:STDOUT: %.loc9_17.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc9_17.2: type = converted %.loc9_17.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %.loc9_25.1: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc9_25.2: type = converted %.loc9_25.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: %.loc10_26: type = splice_block %struct_type.b.a [concrete = constants.%struct_type.b.a.40c] { +// CHECK:STDOUT: %.loc10_17.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc10_17.2: type = converted %.loc10_17.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %.loc10_25.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc10_25.2: type = converted %.loc10_25.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] // CHECK:STDOUT: %struct_type.b.a: type = struct_type {.b: %empty_struct_type, .a: %empty_tuple.type} [concrete = constants.%struct_type.b.a.40c] // CHECK:STDOUT: } // CHECK:STDOUT: %y: %struct_type.b.a.40c = bind_name y, %y.param // CHECK:STDOUT: %return.param: ref %struct_type.d.c.b36 = out_param call_param1 // CHECK:STDOUT: %return: ref %struct_type.d.c.b36 = return_slot %return.param // CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl.loc9_48.2: %F.type.39e918.2 = fn_decl @F.3 [concrete = constants.%F.c04b92.2] { -// CHECK:STDOUT: %x.patt: %pattern_type.bec = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: %pattern_type.bec = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.d63 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.d63 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %F.decl.loc10_48.2: %F.type.39e918.2 = fn_decl @F.3 [concrete = constants.%F.c04b92.2] { +// CHECK:STDOUT: // CHECK:STDOUT: } { -// CHECK:STDOUT: %x.param: %struct_type.a.b.391 = value_param call_param0 -// CHECK:STDOUT: %x: %struct_type.a.b.391 = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref %struct_type.c.d.15a = out_param call_param1 -// CHECK:STDOUT: %return: ref %struct_type.c.d.15a = return_slot %return.param +// CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !members: -// CHECK:STDOUT: .F = %F.decl.loc9_48.1 +// CHECK:STDOUT: .F = %F.decl.loc10_48.1 // CHECK:STDOUT: witness = file.%I.impl_witness // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F.1(@I.%Self: %I.type) { -// CHECK:STDOUT: fn(%x.param: %struct_type.a.b.391) -> %return.param: %struct_type.c.d.15a; -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: fn @F.2(%y.param: %struct_type.b.a.40c) -> %return.param: %struct_type.d.c.b36; // CHECK:STDOUT: // CHECK:STDOUT: fn @F.3(%x.param: %struct_type.a.b.391) -> %return.param: %struct_type.c.d.15a { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: %struct_type.a.b.391 = name_ref x, %x.param -// CHECK:STDOUT: %.loc9_48.1: ref %struct_type.d.c.b36 = temporary_storage -// CHECK:STDOUT: %.loc5_9.1: %empty_struct_type = struct_access %x.ref, element1 -// CHECK:STDOUT: %.loc5_9.2: %empty_tuple.type = struct_access %x.ref, element0 -// CHECK:STDOUT: %struct: %struct_type.b.a.40c = struct_value (%.loc5_9.1, %.loc5_9.2) -// CHECK:STDOUT: %.loc5_9.3: %struct_type.b.a.40c = converted %x.ref, %struct -// CHECK:STDOUT: %F.call: init %struct_type.d.c.b36 = call @impl.%F.decl.loc9_48.1(%.loc5_9.3) to %.loc9_48.1 -// CHECK:STDOUT: %.loc9_48.2: ref %struct_type.d.c.b36 = temporary %.loc9_48.1, %F.call -// CHECK:STDOUT: %.loc9_48.3: ref %empty_tuple.type = struct_access %.loc9_48.2, element1 -// CHECK:STDOUT: %.loc9_48.4: ref %empty_tuple.type = struct_access %return, element1 -// CHECK:STDOUT: %.loc9_48.5: init %empty_tuple.type = tuple_init () to %.loc9_48.4 [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc9_48.6: init %empty_tuple.type = converted %.loc9_48.3, %.loc9_48.5 [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc9_48.7: ref %empty_struct_type = struct_access %.loc9_48.2, element0 -// CHECK:STDOUT: %.loc9_48.8: ref %empty_struct_type = struct_access %return, element0 -// CHECK:STDOUT: %.loc9_48.9: init %empty_struct_type = struct_init () to %.loc9_48.8 [concrete = constants.%empty_struct] -// CHECK:STDOUT: %.loc9_48.10: init %empty_struct_type = converted %.loc9_48.7, %.loc9_48.9 [concrete = constants.%empty_struct] -// CHECK:STDOUT: %.loc9_48.11: init %struct_type.c.d.15a = struct_init (%.loc9_48.6, %.loc9_48.10) to %return [concrete = constants.%struct] -// CHECK:STDOUT: %.loc9_48.12: init %struct_type.c.d.15a = converted %F.call, %.loc9_48.11 [concrete = constants.%struct] -// CHECK:STDOUT: return %.loc9_48.12 to %return +// CHECK:STDOUT: %F.ref: %F.type.39e918.1 = name_ref F, @impl.%F.decl.loc10_48.1 [concrete = constants.%F.c04b92.1] +// CHECK:STDOUT: +// CHECK:STDOUT: %.loc10_48.1: ref %struct_type.d.c.b36 = temporary_storage +// CHECK:STDOUT: +// CHECK:STDOUT: %F.call: init %struct_type.d.c.b36 = call %F.ref(%.loc5_9.3) to %.loc10_48.1 +// CHECK:STDOUT: %.loc10_48.2: ref %struct_type.d.c.b36 = temporary %.loc10_48.1, %F.call +// CHECK:STDOUT: %.loc10_48.3: ref %empty_tuple.type = struct_access %.loc10_48.2, element1 +// CHECK:STDOUT: %.loc10_48.4: ref %empty_tuple.type = struct_access %return, element1 +// CHECK:STDOUT: %.loc10_48.5: init %empty_tuple.type = tuple_init () to %.loc10_48.4 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc10_48.6: init %empty_tuple.type = converted %.loc10_48.3, %.loc10_48.5 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc10_48.7: ref %empty_struct_type = struct_access %.loc10_48.2, element0 +// CHECK:STDOUT: %.loc10_48.8: ref %empty_struct_type = struct_access %return, element0 +// CHECK:STDOUT: %.loc10_48.9: init %empty_struct_type = struct_init () to %.loc10_48.8 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc10_48.10: init %empty_struct_type = converted %.loc10_48.7, %.loc10_48.9 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc10_48.11: init %struct_type.c.d.15a = struct_init (%.loc10_48.6, %.loc10_48.10) to %return [concrete = constants.%struct] +// CHECK:STDOUT: %.loc10_48.12: init %struct_type.c.d.15a = converted %F.call, %.loc10_48.11 [concrete = constants.%struct] +// CHECK:STDOUT: return %.loc10_48.12 to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%Self) {} -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%I.facet) {} -// CHECK:STDOUT: // CHECK:STDOUT: --- inheritance_conversion.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %B.elem: type = unbound_element_type %B, %A [concrete] -// CHECK:STDOUT: %struct_type.base.953: type = struct_type {.base: %A} [concrete] -// CHECK:STDOUT: %complete_type.020: = complete_type_witness %struct_type.base.953 [concrete] // CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %B [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: %X.type: type = facet_type <@X> [concrete] -// CHECK:STDOUT: %Self: %X.type = bind_symbolic_name Self, 0 [symbolic] -// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic] -// CHECK:STDOUT: %ptr.d06: type = ptr_type %Self.as_type [symbolic] -// CHECK:STDOUT: %pattern_type.4c5: type = pattern_type %ptr.d06 [symbolic] // CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %F.type.594: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.b69: %F.type.594 = struct_value () [concrete] -// CHECK:STDOUT: %X.assoc_type: type = assoc_entity_type @X [concrete] -// CHECK:STDOUT: %assoc0: %X.assoc_type = assoc_entity element0, @X.%F.decl [concrete] -// CHECK:STDOUT: %X.impl_witness: = impl_witness file.%X.impl_witness_table [concrete] // CHECK:STDOUT: %ptr.6db: type = ptr_type %A [concrete] // CHECK:STDOUT: %pattern_type.5f8: type = pattern_type %ptr.6db [concrete] // CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] // CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr.019 [concrete] // CHECK:STDOUT: %F.type.f1b0b1.1: type = fn_type @F.2 [concrete] // CHECK:STDOUT: %F.5161e9.1: %F.type.f1b0b1.1 = struct_value () [concrete] -// CHECK:STDOUT: %X.facet: %X.type = facet_value %B, (%X.impl_witness) [concrete] // CHECK:STDOUT: %ptr.e79: type = ptr_type %B [concrete] -// CHECK:STDOUT: %pattern_type.960: type = pattern_type %ptr.e79 [concrete] // CHECK:STDOUT: %F.type.f1b0b1.2: type = fn_type @F.3 [concrete] // CHECK:STDOUT: %F.5161e9.2: %F.type.f1b0b1.2 = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .X = %X.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %X.decl: type = interface_decl @X [concrete = constants.%X.type] {} {} -// CHECK:STDOUT: impl_decl @impl [concrete] {} { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %X.ref: type = name_ref X, file.%X.decl [concrete = constants.%X.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: %X.impl_witness_table = impl_witness_table (@impl.%F.decl.loc13_39.2), @impl [concrete] -// CHECK:STDOUT: %X.impl_witness: = impl_witness %X.impl_witness_table [concrete = constants.%X.impl_witness] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: interface @X { -// CHECK:STDOUT: %Self: %X.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self] -// CHECK:STDOUT: %F.decl: %F.type.594 = fn_decl @F.1 [concrete = constants.%F.b69] { -// CHECK:STDOUT: %self.patt: @F.1.%pattern_type (%pattern_type.4c5) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @F.1.%pattern_type (%pattern_type.4c5) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc9_8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: %other.patt: @F.1.%pattern_type (%pattern_type.4c5) = binding_pattern other [concrete] -// CHECK:STDOUT: %other.param_patt: @F.1.%pattern_type (%pattern_type.4c5) = value_param_pattern %other.patt, call_param1 [concrete] -// CHECK:STDOUT: %return.patt: @F.1.%pattern_type (%pattern_type.4c5) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @F.1.%pattern_type (%pattern_type.4c5) = out_param_pattern %return.patt, call_param2 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Self.ref.loc9_43: %X.type = name_ref Self, @X.%Self [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc9_47: type = facet_access_type %Self.ref.loc9_43 [symbolic = %Self.as_type.loc9_23.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %.loc9_47: type = converted %Self.ref.loc9_43, %Self.as_type.loc9_47 [symbolic = %Self.as_type.loc9_23.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %ptr.loc9_47: type = ptr_type %.loc9_47 [symbolic = %ptr.loc9_23.1 (constants.%ptr.d06)] -// CHECK:STDOUT: %self.param: @F.1.%ptr.loc9_23.1 (%ptr.d06) = value_param call_param0 -// CHECK:STDOUT: %.loc9_23.1: type = splice_block %ptr.loc9_23.2 [symbolic = %ptr.loc9_23.1 (constants.%ptr.d06)] { -// CHECK:STDOUT: %Self.ref.loc9_19: %X.type = name_ref Self, @X.%Self [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc9_23.2: type = facet_access_type %Self.ref.loc9_19 [symbolic = %Self.as_type.loc9_23.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %.loc9_23.2: type = converted %Self.ref.loc9_19, %Self.as_type.loc9_23.2 [symbolic = %Self.as_type.loc9_23.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %ptr.loc9_23.2: type = ptr_type %.loc9_23.2 [symbolic = %ptr.loc9_23.1 (constants.%ptr.d06)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @F.1.%ptr.loc9_23.1 (%ptr.d06) = bind_name self, %self.param -// CHECK:STDOUT: %other.param: @F.1.%ptr.loc9_23.1 (%ptr.d06) = value_param call_param1 -// CHECK:STDOUT: %.loc9_37.1: type = splice_block %ptr.loc9_37 [symbolic = %ptr.loc9_23.1 (constants.%ptr.d06)] { -// CHECK:STDOUT: %Self.ref.loc9_33: %X.type = name_ref Self, @X.%Self [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc9_37: type = facet_access_type %Self.ref.loc9_33 [symbolic = %Self.as_type.loc9_23.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %.loc9_37.2: type = converted %Self.ref.loc9_33, %Self.as_type.loc9_37 [symbolic = %Self.as_type.loc9_23.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %ptr.loc9_37: type = ptr_type %.loc9_37.2 [symbolic = %ptr.loc9_23.1 (constants.%ptr.d06)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %other: @F.1.%ptr.loc9_23.1 (%ptr.d06) = bind_name other, %other.param -// CHECK:STDOUT: %return.param: ref @F.1.%ptr.loc9_23.1 (%ptr.d06) = out_param call_param2 -// CHECK:STDOUT: %return: ref @F.1.%ptr.loc9_23.1 (%ptr.d06) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %assoc0: %X.assoc_type = assoc_entity element0, %F.decl [concrete = constants.%assoc0] -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self -// CHECK:STDOUT: .F = %assoc0 -// CHECK:STDOUT: witness = (%F.decl) -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: impl @impl: %B.ref as %X.ref { -// CHECK:STDOUT: %F.decl.loc13_39.1: %F.type.f1b0b1.1 = fn_decl @F.2 [concrete = constants.%F.5161e9.1] { +// CHECK:STDOUT: %F.decl.loc14_39.1: %F.type.f1b0b1.1 = fn_decl @F.2 [concrete = constants.%F.5161e9.1] { // CHECK:STDOUT: %self.patt: %pattern_type.5f8 = binding_pattern self [concrete] // CHECK:STDOUT: %self.param_patt: %pattern_type.5f8 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc13_8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: %.loc14_8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] // CHECK:STDOUT: %other.patt: %pattern_type.5f8 = binding_pattern other [concrete] // CHECK:STDOUT: %other.param_patt: %pattern_type.5f8 = value_param_pattern %other.patt, call_param1 [concrete] // CHECK:STDOUT: %return.patt: %pattern_type.44a = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: %pattern_type.44a = out_param_pattern %return.patt, call_param2 [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %ptr.loc13_38: type = ptr_type %C.ref [concrete = constants.%ptr.019] +// CHECK:STDOUT: %ptr.loc14_38: type = ptr_type %C.ref [concrete = constants.%ptr.019] // CHECK:STDOUT: %self.param: %ptr.6db = value_param call_param0 -// CHECK:STDOUT: %.loc13_20: type = splice_block %ptr.loc13_20 [concrete = constants.%ptr.6db] { -// CHECK:STDOUT: %A.ref.loc13_19: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %ptr.loc13_20: type = ptr_type %A.ref.loc13_19 [concrete = constants.%ptr.6db] +// CHECK:STDOUT: %.loc14_20: type = splice_block %ptr.loc14_20 [concrete = constants.%ptr.6db] { +// CHECK:STDOUT: %A.ref.loc14_19: type = name_ref A, file.%A.decl [concrete = constants.%A] +// CHECK:STDOUT: %ptr.loc14_20: type = ptr_type %A.ref.loc14_19 [concrete = constants.%ptr.6db] // CHECK:STDOUT: } // CHECK:STDOUT: %self: %ptr.6db = bind_name self, %self.param // CHECK:STDOUT: %other.param: %ptr.6db = value_param call_param1 -// CHECK:STDOUT: %.loc13_31: type = splice_block %ptr.loc13_31 [concrete = constants.%ptr.6db] { -// CHECK:STDOUT: %A.ref.loc13_30: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %ptr.loc13_31: type = ptr_type %A.ref.loc13_30 [concrete = constants.%ptr.6db] +// CHECK:STDOUT: %.loc14_31: type = splice_block %ptr.loc14_31 [concrete = constants.%ptr.6db] { +// CHECK:STDOUT: %A.ref.loc14_30: type = name_ref A, file.%A.decl [concrete = constants.%A] +// CHECK:STDOUT: %ptr.loc14_31: type = ptr_type %A.ref.loc14_30 [concrete = constants.%ptr.6db] // CHECK:STDOUT: } // CHECK:STDOUT: %other: %ptr.6db = bind_name other, %other.param // CHECK:STDOUT: %return.param: ref %ptr.019 = out_param call_param2 // CHECK:STDOUT: %return: ref %ptr.019 = return_slot %return.param // CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl.loc13_39.2: %F.type.f1b0b1.2 = fn_decl @F.3 [concrete = constants.%F.5161e9.2] { -// CHECK:STDOUT: %self.patt: %pattern_type.960 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.960 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc9_8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: %other.patt: %pattern_type.960 = binding_pattern other [concrete] -// CHECK:STDOUT: %other.param_patt: %pattern_type.960 = value_param_pattern %other.patt, call_param1 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.960 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.960 = out_param_pattern %return.patt, call_param2 [concrete] +// CHECK:STDOUT: %F.decl.loc14_39.2: %F.type.f1b0b1.2 = fn_decl @F.3 [concrete = constants.%F.5161e9.2] { +// CHECK:STDOUT: // CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %ptr.e79 = value_param call_param0 -// CHECK:STDOUT: %self: %ptr.e79 = bind_name self, %self.param -// CHECK:STDOUT: %other.param: %ptr.e79 = value_param call_param1 -// CHECK:STDOUT: %other: %ptr.e79 = bind_name other, %other.param -// CHECK:STDOUT: %return.param: ref %ptr.e79 = out_param call_param2 -// CHECK:STDOUT: %return: ref %ptr.e79 = return_slot %return.param +// CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .A = // CHECK:STDOUT: .C = -// CHECK:STDOUT: .F = %F.decl.loc13_39.1 +// CHECK:STDOUT: .F = %F.decl.loc14_39.1 // CHECK:STDOUT: witness = file.%X.impl_witness // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %.loc5: %B.elem = base_decl %A.ref, element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %A} [concrete = constants.%struct_type.base.953] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.020] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .A = -// CHECK:STDOUT: .base = %.loc5 -// CHECK:STDOUT: extend %A.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %.loc6: %C.elem = base_decl %B.ref, element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %B} [concrete = constants.%struct_type.base.0ff] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.98e] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .B = -// CHECK:STDOUT: .base = %.loc6 -// CHECK:STDOUT: extend %B.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F.1(@X.%Self: %X.type) { -// CHECK:STDOUT: %Self: %X.type = bind_symbolic_name Self, 0 [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc9_23.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc9_23.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %ptr.loc9_23.1: type = ptr_type %Self.as_type.loc9_23.1 [symbolic = %ptr.loc9_23.1 (constants.%ptr.d06)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr.loc9_23.1 [symbolic = %pattern_type (constants.%pattern_type.4c5)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @F.1.%ptr.loc9_23.1 (%ptr.d06), %other.param: @F.1.%ptr.loc9_23.1 (%ptr.d06)) -> @F.1.%ptr.loc9_23.1 (%ptr.d06); -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: fn @F.2(%self.param: %ptr.6db, %other.param: %ptr.6db) -> %ptr.019; // CHECK:STDOUT: // CHECK:STDOUT: fn @F.3(%self.param: %ptr.e79, %other.param: %ptr.e79) -> %ptr.e79 { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: %ptr.e79 = name_ref self, %self.param -// CHECK:STDOUT: %.loc9_17.1: ref %B = deref %self.ref -// CHECK:STDOUT: %F.bound: = bound_method %.loc9_17.1, @impl.%F.decl.loc13_39.1 -// CHECK:STDOUT: %other.ref: %ptr.e79 = name_ref other, %other.param -// CHECK:STDOUT: %addr.loc9_17.1: %ptr.e79 = addr_of %.loc9_17.1 -// CHECK:STDOUT: %.loc9_17.2: ref %B = deref %addr.loc9_17.1 -// CHECK:STDOUT: %.loc9_17.3: ref %A = class_element_access %.loc9_17.2, element0 -// CHECK:STDOUT: %addr.loc9_17.2: %ptr.6db = addr_of %.loc9_17.3 -// CHECK:STDOUT: %.loc9_17.4: %ptr.6db = converted %addr.loc9_17.1, %addr.loc9_17.2 -// CHECK:STDOUT: %.loc9_31.1: ref %B = deref %other.ref -// CHECK:STDOUT: %.loc9_31.2: ref %A = class_element_access %.loc9_31.1, element0 -// CHECK:STDOUT: %addr.loc9_31: %ptr.6db = addr_of %.loc9_31.2 -// CHECK:STDOUT: %.loc9_31.3: %ptr.6db = converted %other.ref, %addr.loc9_31 +// CHECK:STDOUT: %F.ref: %F.type.f1b0b1.1 = name_ref F, @impl.%F.decl.loc14_39.1 [concrete = constants.%F.5161e9.1] +// CHECK:STDOUT: +// CHECK:STDOUT: %F.bound: = bound_method %.loc9_17.1, %F.ref +// CHECK:STDOUT: // CHECK:STDOUT: %F.call: init %ptr.019 = call %F.bound(%.loc9_17.4, %.loc9_31.3) -// CHECK:STDOUT: %.loc13_39.1: %ptr.019 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc13_39.2: %ptr.019 = converted %F.call, %.loc13_39.1 -// CHECK:STDOUT: %.loc13_39.3: ref %C = deref %.loc13_39.2 -// CHECK:STDOUT: %.loc13_39.4: ref %B = class_element_access %.loc13_39.3, element0 -// CHECK:STDOUT: %addr.loc13: %ptr.e79 = addr_of %.loc13_39.4 -// CHECK:STDOUT: %.loc13_39.5: %ptr.e79 = converted %F.call, %addr.loc13 -// CHECK:STDOUT: return %.loc13_39.5 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%Self) { -// CHECK:STDOUT: %Self => constants.%Self -// CHECK:STDOUT: %Self.as_type.loc9_23.1 => constants.%Self.as_type -// CHECK:STDOUT: %ptr.loc9_23.1 => constants.%ptr.d06 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.4c5 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%X.facet) { -// CHECK:STDOUT: %Self => constants.%X.facet -// CHECK:STDOUT: %Self.as_type.loc9_23.1 => constants.%B -// CHECK:STDOUT: %ptr.loc9_23.1 => constants.%ptr.e79 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.960 +// CHECK:STDOUT: %.loc14_39.1: %ptr.019 = value_of_initializer %F.call +// CHECK:STDOUT: %.loc14_39.2: %ptr.019 = converted %F.call, %.loc14_39.1 +// CHECK:STDOUT: %.loc14_39.3: ref %C = deref %.loc14_39.2 +// 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 %F.call, %addr.loc14 +// CHECK:STDOUT: return %.loc14_39.5 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- inheritance_value_conversion.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %B: type = class_type @B [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %B.elem: type = unbound_element_type %B, %A [concrete] -// CHECK:STDOUT: %struct_type.base.953: type = struct_type {.base: %A} [concrete] -// CHECK:STDOUT: %complete_type.020: = complete_type_witness %struct_type.base.953 [concrete] -// CHECK:STDOUT: %X.type: type = facet_type <@X> [concrete] -// CHECK:STDOUT: %Self: %X.type = bind_symbolic_name Self, 0 [symbolic] -// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic] -// CHECK:STDOUT: %pattern_type.331: type = pattern_type %Self.as_type [symbolic] -// CHECK:STDOUT: %F.type.594: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.b69: %F.type.594 = struct_value () [concrete] -// CHECK:STDOUT: %X.assoc_type: type = assoc_entity_type @X [concrete] -// CHECK:STDOUT: %assoc0: %X.assoc_type = assoc_entity element0, @X.%F.decl [concrete] -// CHECK:STDOUT: %X.impl_witness: = impl_witness file.%X.impl_witness_table [concrete] // CHECK:STDOUT: %pattern_type.c10: type = pattern_type %A [concrete] // CHECK:STDOUT: %F.type.f1b0b1.1: type = fn_type @F.2 [concrete] // CHECK:STDOUT: %F.5161e9.1: %F.type.f1b0b1.1 = struct_value () [concrete] -// CHECK:STDOUT: %X.facet: %X.type = facet_value %B, (%X.impl_witness) [concrete] -// CHECK:STDOUT: %pattern_type.049: type = pattern_type %B [concrete] // CHECK:STDOUT: %F.type.f1b0b1.2: type = fn_type @F.3 [concrete] // CHECK:STDOUT: %F.5161e9.2: %F.type.f1b0b1.2 = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .X = %X.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %X.decl: type = interface_decl @X [concrete = constants.%X.type] {} {} -// CHECK:STDOUT: impl_decl @impl [concrete] {} { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %X.ref: type = name_ref X, file.%X.decl [concrete = constants.%X.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: %X.impl_witness_table = impl_witness_table (@impl.%F.decl.loc12_26.2), @impl [concrete] -// CHECK:STDOUT: %X.impl_witness: = impl_witness %X.impl_witness_table [concrete = constants.%X.impl_witness] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: interface @X { -// CHECK:STDOUT: %Self: %X.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self] -// CHECK:STDOUT: %F.decl: %F.type.594 = fn_decl @F.1 [concrete = constants.%F.b69] { -// CHECK:STDOUT: %self.patt: @F.1.%pattern_type (%pattern_type.331) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @F.1.%pattern_type (%pattern_type.331) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %other.patt: @F.1.%pattern_type (%pattern_type.331) = binding_pattern other [concrete] -// CHECK:STDOUT: %other.param_patt: @F.1.%pattern_type (%pattern_type.331) = value_param_pattern %other.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @F.1.%Self.as_type.loc8_14.1 (%Self.as_type) = value_param call_param0 -// CHECK:STDOUT: %.loc8_14.1: type = splice_block %.loc8_14.2 [symbolic = %Self.as_type.loc8_14.1 (constants.%Self.as_type)] { -// CHECK:STDOUT: %Self.ref.loc8_14: %X.type = name_ref Self, @X.%Self [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc8_14.2: type = facet_access_type %Self.ref.loc8_14 [symbolic = %Self.as_type.loc8_14.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %.loc8_14.2: type = converted %Self.ref.loc8_14, %Self.as_type.loc8_14.2 [symbolic = %Self.as_type.loc8_14.1 (constants.%Self.as_type)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @F.1.%Self.as_type.loc8_14.1 (%Self.as_type) = bind_name self, %self.param -// CHECK:STDOUT: %other.param: @F.1.%Self.as_type.loc8_14.1 (%Self.as_type) = value_param call_param1 -// CHECK:STDOUT: %.loc8_27.1: type = splice_block %.loc8_27.2 [symbolic = %Self.as_type.loc8_14.1 (constants.%Self.as_type)] { -// CHECK:STDOUT: %Self.ref.loc8_27: %X.type = name_ref Self, @X.%Self [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc8_27: type = facet_access_type %Self.ref.loc8_27 [symbolic = %Self.as_type.loc8_14.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %.loc8_27.2: type = converted %Self.ref.loc8_27, %Self.as_type.loc8_27 [symbolic = %Self.as_type.loc8_14.1 (constants.%Self.as_type)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %other: @F.1.%Self.as_type.loc8_14.1 (%Self.as_type) = bind_name other, %other.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %assoc0: %X.assoc_type = assoc_entity element0, %F.decl [concrete = constants.%assoc0] -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self -// CHECK:STDOUT: .F = %assoc0 -// CHECK:STDOUT: witness = (%F.decl) -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: impl @impl: %B.ref as %X.ref { -// CHECK:STDOUT: %F.decl.loc12_26.1: %F.type.f1b0b1.1 = fn_decl @F.2 [concrete = constants.%F.5161e9.1] { +// CHECK:STDOUT: %F.decl.loc13_26.1: %F.type.f1b0b1.1 = fn_decl @F.2 [concrete = constants.%F.5161e9.1] { // CHECK:STDOUT: %self.patt: %pattern_type.c10 = binding_pattern self [concrete] // CHECK:STDOUT: %self.param_patt: %pattern_type.c10 = value_param_pattern %self.patt, call_param0 [concrete] // CHECK:STDOUT: %other.patt: %pattern_type.c10 = binding_pattern other [concrete] // CHECK:STDOUT: %other.param_patt: %pattern_type.c10 = value_param_pattern %other.patt, call_param1 [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %self.param: %A = value_param call_param0 -// CHECK:STDOUT: %A.ref.loc12_14: type = name_ref A, file.%A.decl [concrete = constants.%A] +// CHECK:STDOUT: %A.ref.loc13_14: type = name_ref A, file.%A.decl [concrete = constants.%A] // CHECK:STDOUT: %self: %A = bind_name self, %self.param // CHECK:STDOUT: %other.param: %A = value_param call_param1 -// CHECK:STDOUT: %A.ref.loc12_24: type = name_ref A, file.%A.decl [concrete = constants.%A] +// CHECK:STDOUT: %A.ref.loc13_24: type = name_ref A, file.%A.decl [concrete = constants.%A] // CHECK:STDOUT: %other: %A = bind_name other, %other.param // CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl.loc12_26.2: %F.type.f1b0b1.2 = fn_decl @F.3 [concrete = constants.%F.5161e9.2] { -// CHECK:STDOUT: %self.patt: %pattern_type.049 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.049 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %other.patt: %pattern_type.049 = binding_pattern other [concrete] -// CHECK:STDOUT: %other.param_patt: %pattern_type.049 = value_param_pattern %other.patt, call_param1 [concrete] +// CHECK:STDOUT: %F.decl.loc13_26.2: %F.type.f1b0b1.2 = fn_decl @F.3 [concrete = constants.%F.5161e9.2] { +// CHECK:STDOUT: // CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %B = value_param call_param0 -// CHECK:STDOUT: %self: %B = bind_name self, %self.param -// CHECK:STDOUT: %other.param: %B = value_param call_param1 -// CHECK:STDOUT: %other: %B = bind_name other, %other.param +// CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .A = -// CHECK:STDOUT: .F = %F.decl.loc12_26.1 +// CHECK:STDOUT: .F = %F.decl.loc13_26.1 // CHECK:STDOUT: witness = file.%X.impl_witness // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %.loc5: %B.elem = base_decl %A.ref, element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %A} [concrete = constants.%struct_type.base.953] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.020] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .A = -// CHECK:STDOUT: .base = %.loc5 -// CHECK:STDOUT: extend %A.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F.1(@X.%Self: %X.type) { -// CHECK:STDOUT: %Self: %X.type = bind_symbolic_name Self, 0 [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc8_14.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc8_14.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type.loc8_14.1 [symbolic = %pattern_type (constants.%pattern_type.331)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @F.1.%Self.as_type.loc8_14.1 (%Self.as_type), %other.param: @F.1.%Self.as_type.loc8_14.1 (%Self.as_type)); -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: fn @F.2(%self.param: %A, %other.param: %A); // CHECK:STDOUT: // CHECK:STDOUT: fn @F.3(%self.param: %B, %other.param: %B) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: %B = name_ref self, %self.param -// CHECK:STDOUT: %F.bound: = bound_method %self.ref, @impl.%F.decl.loc12_26.1 -// CHECK:STDOUT: %other.ref: %B = name_ref other, %other.param -// CHECK:STDOUT: %.loc8_12.1: ref %A = class_element_access %self.ref, element0 -// CHECK:STDOUT: %.loc8_12.2: ref %A = converted %self.ref, %.loc8_12.1 -// CHECK:STDOUT: %.loc8_12.3: %A = bind_value %.loc8_12.2 -// CHECK:STDOUT: %.loc8_25.1: ref %A = class_element_access %other.ref, element0 -// CHECK:STDOUT: %.loc8_25.2: ref %A = converted %other.ref, %.loc8_25.1 -// CHECK:STDOUT: %.loc8_25.3: %A = bind_value %.loc8_25.2 +// CHECK:STDOUT: %F.ref: %F.type.f1b0b1.1 = name_ref F, @impl.%F.decl.loc13_26.1 [concrete = constants.%F.5161e9.1] +// CHECK:STDOUT: +// CHECK:STDOUT: %F.bound: = bound_method %self.ref, %F.ref +// CHECK:STDOUT: // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.bound(%.loc8_12.3, %.loc8_25.3) // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%Self) { -// CHECK:STDOUT: %Self => constants.%Self -// CHECK:STDOUT: %Self.as_type.loc8_14.1 => constants.%Self.as_type -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.331 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%X.facet) { -// CHECK:STDOUT: %Self => constants.%X.facet -// CHECK:STDOUT: %Self.as_type.loc8_14.1 => constants.%B -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.049 -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: --- inheritance_value_conversion_pointer.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %B.elem: type = unbound_element_type %B, %A [concrete] -// CHECK:STDOUT: %struct_type.base.953: type = struct_type {.base: %A} [concrete] -// CHECK:STDOUT: %complete_type.020: = complete_type_witness %struct_type.base.953 [concrete] // CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %B [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: %X.type: type = facet_type <@X> [concrete] -// CHECK:STDOUT: %Self: %X.type = bind_symbolic_name Self, 0 [symbolic] -// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic] -// CHECK:STDOUT: %ptr.d06: type = ptr_type %Self.as_type [symbolic] -// CHECK:STDOUT: %pattern_type.4c5: type = pattern_type %ptr.d06 [symbolic] // CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %F.type.594: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.b69: %F.type.594 = struct_value () [concrete] -// CHECK:STDOUT: %X.assoc_type: type = assoc_entity_type @X [concrete] -// CHECK:STDOUT: %assoc0: %X.assoc_type = assoc_entity element0, @X.%F.decl [concrete] -// CHECK:STDOUT: %X.impl_witness: = impl_witness file.%X.impl_witness_table [concrete] // CHECK:STDOUT: %ptr.6db: type = ptr_type %A [concrete] // CHECK:STDOUT: %pattern_type.5f8: type = pattern_type %ptr.6db [concrete] // CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] // CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr.019 [concrete] // CHECK:STDOUT: %F.type.f1b0b1.1: type = fn_type @F.2 [concrete] // CHECK:STDOUT: %F.5161e9.1: %F.type.f1b0b1.1 = struct_value () [concrete] -// CHECK:STDOUT: %X.facet: %X.type = facet_value %B, (%X.impl_witness) [concrete] // CHECK:STDOUT: %ptr.e79: type = ptr_type %B [concrete] -// CHECK:STDOUT: %pattern_type.960: type = pattern_type %ptr.e79 [concrete] // CHECK:STDOUT: %F.type.f1b0b1.2: type = fn_type @F.3 [concrete] // CHECK:STDOUT: %F.5161e9.2: %F.type.f1b0b1.2 = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .X = %X.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %X.decl: type = interface_decl @X [concrete = constants.%X.type] {} {} -// CHECK:STDOUT: impl_decl @impl [concrete] {} { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %X.ref: type = name_ref X, file.%X.decl [concrete = constants.%X.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: %X.impl_witness_table = impl_witness_table (@impl.%F.decl.loc13_39.2), @impl [concrete] -// CHECK:STDOUT: %X.impl_witness: = impl_witness %X.impl_witness_table [concrete = constants.%X.impl_witness] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: interface @X { -// CHECK:STDOUT: %Self: %X.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self] -// CHECK:STDOUT: %F.decl: %F.type.594 = fn_decl @F.1 [concrete = constants.%F.b69] { -// CHECK:STDOUT: %self.patt: @F.1.%pattern_type (%pattern_type.4c5) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @F.1.%pattern_type (%pattern_type.4c5) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc9_8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: %other.patt: @F.1.%pattern_type (%pattern_type.4c5) = binding_pattern other [concrete] -// CHECK:STDOUT: %other.param_patt: @F.1.%pattern_type (%pattern_type.4c5) = value_param_pattern %other.patt, call_param1 [concrete] -// CHECK:STDOUT: %return.patt: @F.1.%pattern_type (%pattern_type.4c5) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @F.1.%pattern_type (%pattern_type.4c5) = out_param_pattern %return.patt, call_param2 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Self.ref.loc9_43: %X.type = name_ref Self, @X.%Self [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc9_47: type = facet_access_type %Self.ref.loc9_43 [symbolic = %Self.as_type.loc9_23.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %.loc9_47: type = converted %Self.ref.loc9_43, %Self.as_type.loc9_47 [symbolic = %Self.as_type.loc9_23.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %ptr.loc9_47: type = ptr_type %.loc9_47 [symbolic = %ptr.loc9_23.1 (constants.%ptr.d06)] -// CHECK:STDOUT: %self.param: @F.1.%ptr.loc9_23.1 (%ptr.d06) = value_param call_param0 -// CHECK:STDOUT: %.loc9_23.1: type = splice_block %ptr.loc9_23.2 [symbolic = %ptr.loc9_23.1 (constants.%ptr.d06)] { -// CHECK:STDOUT: %Self.ref.loc9_19: %X.type = name_ref Self, @X.%Self [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc9_23.2: type = facet_access_type %Self.ref.loc9_19 [symbolic = %Self.as_type.loc9_23.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %.loc9_23.2: type = converted %Self.ref.loc9_19, %Self.as_type.loc9_23.2 [symbolic = %Self.as_type.loc9_23.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %ptr.loc9_23.2: type = ptr_type %.loc9_23.2 [symbolic = %ptr.loc9_23.1 (constants.%ptr.d06)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @F.1.%ptr.loc9_23.1 (%ptr.d06) = bind_name self, %self.param -// CHECK:STDOUT: %other.param: @F.1.%ptr.loc9_23.1 (%ptr.d06) = value_param call_param1 -// CHECK:STDOUT: %.loc9_37.1: type = splice_block %ptr.loc9_37 [symbolic = %ptr.loc9_23.1 (constants.%ptr.d06)] { -// CHECK:STDOUT: %Self.ref.loc9_33: %X.type = name_ref Self, @X.%Self [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc9_37: type = facet_access_type %Self.ref.loc9_33 [symbolic = %Self.as_type.loc9_23.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %.loc9_37.2: type = converted %Self.ref.loc9_33, %Self.as_type.loc9_37 [symbolic = %Self.as_type.loc9_23.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %ptr.loc9_37: type = ptr_type %.loc9_37.2 [symbolic = %ptr.loc9_23.1 (constants.%ptr.d06)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %other: @F.1.%ptr.loc9_23.1 (%ptr.d06) = bind_name other, %other.param -// CHECK:STDOUT: %return.param: ref @F.1.%ptr.loc9_23.1 (%ptr.d06) = out_param call_param2 -// CHECK:STDOUT: %return: ref @F.1.%ptr.loc9_23.1 (%ptr.d06) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %assoc0: %X.assoc_type = assoc_entity element0, %F.decl [concrete = constants.%assoc0] -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self -// CHECK:STDOUT: .F = %assoc0 -// CHECK:STDOUT: witness = (%F.decl) -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: impl @impl: %B.ref as %X.ref { -// CHECK:STDOUT: %F.decl.loc13_39.1: %F.type.f1b0b1.1 = fn_decl @F.2 [concrete = constants.%F.5161e9.1] { +// CHECK:STDOUT: %F.decl.loc14_39.1: %F.type.f1b0b1.1 = fn_decl @F.2 [concrete = constants.%F.5161e9.1] { // CHECK:STDOUT: %self.patt: %pattern_type.5f8 = binding_pattern self [concrete] // CHECK:STDOUT: %self.param_patt: %pattern_type.5f8 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc13_8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: %.loc14_8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] // CHECK:STDOUT: %other.patt: %pattern_type.5f8 = binding_pattern other [concrete] // CHECK:STDOUT: %other.param_patt: %pattern_type.5f8 = value_param_pattern %other.patt, call_param1 [concrete] // CHECK:STDOUT: %return.patt: %pattern_type.44a = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: %pattern_type.44a = out_param_pattern %return.patt, call_param2 [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %ptr.loc13_38: type = ptr_type %C.ref [concrete = constants.%ptr.019] +// CHECK:STDOUT: %ptr.loc14_38: type = ptr_type %C.ref [concrete = constants.%ptr.019] // CHECK:STDOUT: %self.param: %ptr.6db = value_param call_param0 -// CHECK:STDOUT: %.loc13_20: type = splice_block %ptr.loc13_20 [concrete = constants.%ptr.6db] { -// CHECK:STDOUT: %A.ref.loc13_19: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %ptr.loc13_20: type = ptr_type %A.ref.loc13_19 [concrete = constants.%ptr.6db] +// CHECK:STDOUT: %.loc14_20: type = splice_block %ptr.loc14_20 [concrete = constants.%ptr.6db] { +// CHECK:STDOUT: %A.ref.loc14_19: type = name_ref A, file.%A.decl [concrete = constants.%A] +// CHECK:STDOUT: %ptr.loc14_20: type = ptr_type %A.ref.loc14_19 [concrete = constants.%ptr.6db] // CHECK:STDOUT: } // CHECK:STDOUT: %self: %ptr.6db = bind_name self, %self.param // CHECK:STDOUT: %other.param: %ptr.6db = value_param call_param1 -// CHECK:STDOUT: %.loc13_31: type = splice_block %ptr.loc13_31 [concrete = constants.%ptr.6db] { -// CHECK:STDOUT: %A.ref.loc13_30: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %ptr.loc13_31: type = ptr_type %A.ref.loc13_30 [concrete = constants.%ptr.6db] +// CHECK:STDOUT: %.loc14_31: type = splice_block %ptr.loc14_31 [concrete = constants.%ptr.6db] { +// CHECK:STDOUT: %A.ref.loc14_30: type = name_ref A, file.%A.decl [concrete = constants.%A] +// CHECK:STDOUT: %ptr.loc14_31: type = ptr_type %A.ref.loc14_30 [concrete = constants.%ptr.6db] // CHECK:STDOUT: } // CHECK:STDOUT: %other: %ptr.6db = bind_name other, %other.param // CHECK:STDOUT: %return.param: ref %ptr.019 = out_param call_param2 // CHECK:STDOUT: %return: ref %ptr.019 = return_slot %return.param // CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl.loc13_39.2: %F.type.f1b0b1.2 = fn_decl @F.3 [concrete = constants.%F.5161e9.2] { -// CHECK:STDOUT: %self.patt: %pattern_type.960 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.960 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc9_8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: %other.patt: %pattern_type.960 = binding_pattern other [concrete] -// CHECK:STDOUT: %other.param_patt: %pattern_type.960 = value_param_pattern %other.patt, call_param1 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.960 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.960 = out_param_pattern %return.patt, call_param2 [concrete] +// CHECK:STDOUT: %F.decl.loc14_39.2: %F.type.f1b0b1.2 = fn_decl @F.3 [concrete = constants.%F.5161e9.2] { +// CHECK:STDOUT: // CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %ptr.e79 = value_param call_param0 -// CHECK:STDOUT: %self: %ptr.e79 = bind_name self, %self.param -// CHECK:STDOUT: %other.param: %ptr.e79 = value_param call_param1 -// CHECK:STDOUT: %other: %ptr.e79 = bind_name other, %other.param -// CHECK:STDOUT: %return.param: ref %ptr.e79 = out_param call_param2 -// CHECK:STDOUT: %return: ref %ptr.e79 = return_slot %return.param +// CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .A = // CHECK:STDOUT: .C = -// CHECK:STDOUT: .F = %F.decl.loc13_39.1 +// CHECK:STDOUT: .F = %F.decl.loc14_39.1 // CHECK:STDOUT: witness = file.%X.impl_witness // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %.loc5: %B.elem = base_decl %A.ref, element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %A} [concrete = constants.%struct_type.base.953] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.020] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .A = -// CHECK:STDOUT: .base = %.loc5 -// CHECK:STDOUT: extend %A.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %.loc6: %C.elem = base_decl %B.ref, element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %B} [concrete = constants.%struct_type.base.0ff] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.98e] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .B = -// CHECK:STDOUT: .base = %.loc6 -// CHECK:STDOUT: extend %B.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F.1(@X.%Self: %X.type) { -// CHECK:STDOUT: %Self: %X.type = bind_symbolic_name Self, 0 [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc9_23.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc9_23.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %ptr.loc9_23.1: type = ptr_type %Self.as_type.loc9_23.1 [symbolic = %ptr.loc9_23.1 (constants.%ptr.d06)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr.loc9_23.1 [symbolic = %pattern_type (constants.%pattern_type.4c5)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @F.1.%ptr.loc9_23.1 (%ptr.d06), %other.param: @F.1.%ptr.loc9_23.1 (%ptr.d06)) -> @F.1.%ptr.loc9_23.1 (%ptr.d06); -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: fn @F.2(%self.param: %ptr.6db, %other.param: %ptr.6db) -> %ptr.019; // CHECK:STDOUT: // CHECK:STDOUT: fn @F.3(%self.param: %ptr.e79, %other.param: %ptr.e79) -> %ptr.e79 { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: %ptr.e79 = name_ref self, %self.param -// CHECK:STDOUT: %.loc9_17.1: ref %B = deref %self.ref -// CHECK:STDOUT: %F.bound: = bound_method %.loc9_17.1, @impl.%F.decl.loc13_39.1 -// CHECK:STDOUT: %other.ref: %ptr.e79 = name_ref other, %other.param -// CHECK:STDOUT: %addr.loc9_17.1: %ptr.e79 = addr_of %.loc9_17.1 -// CHECK:STDOUT: %.loc9_17.2: ref %B = deref %addr.loc9_17.1 -// CHECK:STDOUT: %.loc9_17.3: ref %A = class_element_access %.loc9_17.2, element0 -// CHECK:STDOUT: %addr.loc9_17.2: %ptr.6db = addr_of %.loc9_17.3 -// CHECK:STDOUT: %.loc9_17.4: %ptr.6db = converted %addr.loc9_17.1, %addr.loc9_17.2 -// CHECK:STDOUT: %.loc9_31.1: ref %B = deref %other.ref -// CHECK:STDOUT: %.loc9_31.2: ref %A = class_element_access %.loc9_31.1, element0 -// CHECK:STDOUT: %addr.loc9_31: %ptr.6db = addr_of %.loc9_31.2 -// CHECK:STDOUT: %.loc9_31.3: %ptr.6db = converted %other.ref, %addr.loc9_31 +// CHECK:STDOUT: %F.ref: %F.type.f1b0b1.1 = name_ref F, @impl.%F.decl.loc14_39.1 [concrete = constants.%F.5161e9.1] +// CHECK:STDOUT: +// CHECK:STDOUT: %F.bound: = bound_method %.loc9_17.1, %F.ref +// CHECK:STDOUT: // CHECK:STDOUT: %F.call: init %ptr.019 = call %F.bound(%.loc9_17.4, %.loc9_31.3) -// CHECK:STDOUT: %.loc13_39.1: %ptr.019 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc13_39.2: %ptr.019 = converted %F.call, %.loc13_39.1 -// CHECK:STDOUT: %.loc13_39.3: ref %C = deref %.loc13_39.2 -// CHECK:STDOUT: %.loc13_39.4: ref %B = class_element_access %.loc13_39.3, element0 -// CHECK:STDOUT: %addr.loc13: %ptr.e79 = addr_of %.loc13_39.4 -// CHECK:STDOUT: %.loc13_39.5: %ptr.e79 = converted %F.call, %addr.loc13 -// CHECK:STDOUT: return %.loc13_39.5 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%Self) { -// CHECK:STDOUT: %Self => constants.%Self -// CHECK:STDOUT: %Self.as_type.loc9_23.1 => constants.%Self.as_type -// CHECK:STDOUT: %ptr.loc9_23.1 => constants.%ptr.d06 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.4c5 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%X.facet) { -// CHECK:STDOUT: %Self => constants.%X.facet -// CHECK:STDOUT: %Self.as_type.loc9_23.1 => constants.%B -// CHECK:STDOUT: %ptr.loc9_23.1 => constants.%ptr.e79 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.960 +// CHECK:STDOUT: %.loc14_39.1: %ptr.019 = value_of_initializer %F.call +// CHECK:STDOUT: %.loc14_39.2: %ptr.019 = converted %F.call, %.loc14_39.1 +// CHECK:STDOUT: %.loc14_39.3: ref %C = deref %.loc14_39.2 +// 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 %F.call, %addr.loc14 +// CHECK:STDOUT: return %.loc14_39.5 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_inheritance_value_conversion_copy_return.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %B.elem: type = unbound_element_type %B, %A [concrete] -// CHECK:STDOUT: %struct_type.base.953: type = struct_type {.base: %A} [concrete] -// CHECK:STDOUT: %complete_type.020: = complete_type_witness %struct_type.base.953 [concrete] -// CHECK:STDOUT: %X.type: type = facet_type <@X> [concrete] -// CHECK:STDOUT: %Self: %X.type = bind_symbolic_name Self, 0 [symbolic] -// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic] -// CHECK:STDOUT: %pattern_type.331: type = pattern_type %Self.as_type [symbolic] -// CHECK:STDOUT: %F.type.594: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.b69: %F.type.594 = struct_value () [concrete] -// CHECK:STDOUT: %X.assoc_type: type = assoc_entity_type @X [concrete] -// CHECK:STDOUT: %assoc0: %X.assoc_type = assoc_entity element0, @X.%F.decl [concrete] -// CHECK:STDOUT: %X.impl_witness: = impl_witness file.%X.impl_witness_table [concrete] // CHECK:STDOUT: %pattern_type.049: type = pattern_type %B [concrete] // CHECK:STDOUT: %F.type.b24d6f.1: type = fn_type @F.2 [concrete] // CHECK:STDOUT: %F.77e9d5.1: %F.type.b24d6f.1 = struct_value () [concrete] -// CHECK:STDOUT: %X.facet: %X.type = facet_value %A, (%X.impl_witness) [concrete] -// CHECK:STDOUT: %pattern_type.c10: type = pattern_type %A [concrete] // CHECK:STDOUT: %F.type.b24d6f.2: type = fn_type @F.3 [concrete] // CHECK:STDOUT: %F.77e9d5.2: %F.type.b24d6f.2 = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .X = %X.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %X.decl: type = interface_decl @X [concrete = constants.%X.type] {} {} -// CHECK:STDOUT: impl_decl @impl [concrete] {} { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %X.ref: type = name_ref X, file.%X.decl [concrete = constants.%X.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: %X.impl_witness_table = impl_witness_table (@impl.%F.decl.loc19_14.2), @impl [concrete] -// CHECK:STDOUT: %X.impl_witness: = impl_witness %X.impl_witness_table [concrete = constants.%X.impl_witness] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: interface @X { -// CHECK:STDOUT: %Self: %X.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self] -// CHECK:STDOUT: %F.decl: %F.type.594 = fn_decl @F.1 [concrete = constants.%F.b69] { -// CHECK:STDOUT: %return.patt: @F.1.%pattern_type (%pattern_type.331) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @F.1.%pattern_type (%pattern_type.331) = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Self.ref: %X.type = name_ref Self, @X.%Self [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc8_13.2: type = facet_access_type %Self.ref [symbolic = %Self.as_type.loc8_13.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %.loc8: type = converted %Self.ref, %Self.as_type.loc8_13.2 [symbolic = %Self.as_type.loc8_13.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %return.param: ref @F.1.%Self.as_type.loc8_13.1 (%Self.as_type) = out_param call_param0 -// CHECK:STDOUT: %return: ref @F.1.%Self.as_type.loc8_13.1 (%Self.as_type) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %assoc0: %X.assoc_type = assoc_entity element0, %F.decl [concrete = constants.%assoc0] -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self -// CHECK:STDOUT: .F = %assoc0 -// CHECK:STDOUT: witness = (%F.decl) -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: impl @impl: %A.ref as %X.ref { -// CHECK:STDOUT: %F.decl.loc19_14.1: %F.type.b24d6f.1 = fn_decl @F.2 [concrete = constants.%F.77e9d5.1] { +// CHECK:STDOUT: %F.decl.loc20_14.1: %F.type.b24d6f.1 = fn_decl @F.2 [concrete = constants.%F.77e9d5.1] { // CHECK:STDOUT: %return.patt: %pattern_type.049 = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: %pattern_type.049 = out_param_pattern %return.patt, call_param0 [concrete] // CHECK:STDOUT: } { @@ -1217,794 +604,277 @@ class C { // CHECK:STDOUT: %return.param: ref %B = out_param call_param0 // CHECK:STDOUT: %return: ref %B = return_slot %return.param // CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl.loc19_14.2: %F.type.b24d6f.2 = fn_decl @F.3 [concrete = constants.%F.77e9d5.2] { -// CHECK:STDOUT: %return.patt: %pattern_type.c10 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.c10 = out_param_pattern %return.patt, call_param0 [concrete] +// CHECK:STDOUT: %F.decl.loc20_14.2: %F.type.b24d6f.2 = fn_decl @F.3 [concrete = constants.%F.77e9d5.2] { +// CHECK:STDOUT: // CHECK:STDOUT: } { -// CHECK:STDOUT: %return.param: ref %A = out_param call_param0 -// CHECK:STDOUT: %return: ref %A = return_slot %return.param +// CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .B = -// CHECK:STDOUT: .F = %F.decl.loc19_14.1 +// CHECK:STDOUT: .F = %F.decl.loc20_14.1 // CHECK:STDOUT: witness = file.%X.impl_witness // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %.loc5: %B.elem = base_decl %A.ref, element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %A} [concrete = constants.%struct_type.base.953] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.020] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .A = -// CHECK:STDOUT: .base = %.loc5 -// CHECK:STDOUT: extend %A.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F.1(@X.%Self: %X.type) { -// CHECK:STDOUT: %Self: %X.type = bind_symbolic_name Self, 0 [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc8_13.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc8_13.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type.loc8_13.1 [symbolic = %pattern_type (constants.%pattern_type.331)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn() -> @F.1.%Self.as_type.loc8_13.1 (%Self.as_type); -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: fn @F.2() -> %return.param: %B; // CHECK:STDOUT: // CHECK:STDOUT: fn @F.3() -> %return.param: %A { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc19_14.1: ref %B = temporary_storage -// CHECK:STDOUT: %F.call: init %B = call @impl.%F.decl.loc19_14.1() to %.loc19_14.1 -// CHECK:STDOUT: %.loc19_14.2: ref %B = temporary %.loc19_14.1, %F.call -// CHECK:STDOUT: %.loc19_14.3: ref %A = class_element_access %.loc19_14.2, element0 -// CHECK:STDOUT: %.loc19_14.4: ref %A = converted %F.call, %.loc19_14.3 -// CHECK:STDOUT: %.loc19_14.5: %A = bind_value %.loc19_14.4 +// CHECK:STDOUT: %F.ref: %F.type.b24d6f.1 = name_ref F, @impl.%F.decl.loc20_14.1 [concrete = constants.%F.77e9d5.1] +// CHECK:STDOUT: %.loc20_14.1: ref %B = temporary_storage +// CHECK:STDOUT: %F.call: init %B = call %F.ref() to %.loc20_14.1 +// CHECK:STDOUT: %.loc20_14.2: ref %B = temporary %.loc20_14.1, %F.call +// CHECK:STDOUT: %.loc20_14.3: ref %A = class_element_access %.loc20_14.2, element0 +// CHECK:STDOUT: %.loc20_14.4: ref %A = converted %F.call, %.loc20_14.3 +// CHECK:STDOUT: %.loc20_14.5: %A = bind_value %.loc20_14.4 // CHECK:STDOUT: return to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%Self) { -// CHECK:STDOUT: %Self => constants.%Self -// CHECK:STDOUT: %Self.as_type.loc8_13.1 => constants.%Self.as_type -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.331 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%X.facet) { -// CHECK:STDOUT: %Self => constants.%X.facet -// CHECK:STDOUT: %Self.as_type.loc8_13.1 => constants.%A -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.c10 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_param_type_mismatch.carbon +// CHECK:STDOUT: --- generic_function.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %I.type: type = facet_type <@I> [concrete] -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic] -// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic] -// CHECK:STDOUT: %pattern_type.6de: type = pattern_type %Self.as_type [symbolic] -// CHECK:STDOUT: %F.type.cf0: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %F.bc6: %F.type.cf0 = struct_value () [concrete] -// CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, @I.%F.decl [concrete] -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %I.impl_witness: = impl_witness file.%I.impl_witness_table [concrete] -// CHECK:STDOUT: %pattern_type.049: type = pattern_type %B [concrete] -// CHECK:STDOUT: %F.type.2ae1ef.1: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.2a7aab.1: %F.type.2ae1ef.1 = struct_value () [concrete] -// CHECK:STDOUT: %I.facet: %I.type = facet_value %A, (%I.impl_witness) [concrete] -// CHECK:STDOUT: %pattern_type.c10: type = pattern_type %A [concrete] -// CHECK:STDOUT: %F.type.2ae1ef.2: type = fn_type @F.3 [concrete] -// CHECK:STDOUT: %F.2a7aab.2: %F.type.2ae1ef.2 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .I = %I.decl -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %I.decl: type = interface_decl @I [concrete = constants.%I.type] {} {} -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: impl_decl @impl [concrete] {} { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [concrete = constants.%I.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: %I.impl_witness_table = impl_witness_table (@impl.%F.decl.loc22_13.2), @impl [concrete] -// CHECK:STDOUT: %I.impl_witness: = impl_witness %I.impl_witness_table [concrete = constants.%I.impl_witness] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: interface @I { -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self] -// CHECK:STDOUT: %F.decl: %F.type.cf0 = fn_decl @F.1 [concrete = constants.%F.bc6] { -// CHECK:STDOUT: %a.patt: @F.1.%pattern_type (%pattern_type.6de) = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: @F.1.%pattern_type (%pattern_type.6de) = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %a.param: @F.1.%Self.as_type.loc8_11.1 (%Self.as_type) = value_param call_param0 -// CHECK:STDOUT: %.loc8_11.1: type = splice_block %.loc8_11.2 [symbolic = %Self.as_type.loc8_11.1 (constants.%Self.as_type)] { -// CHECK:STDOUT: %Self.ref: %I.type = name_ref Self, @I.%Self [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc8_11.2: type = facet_access_type %Self.ref [symbolic = %Self.as_type.loc8_11.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %.loc8_11.2: type = converted %Self.ref, %Self.as_type.loc8_11.2 [symbolic = %Self.as_type.loc8_11.1 (constants.%Self.as_type)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a: @F.1.%Self.as_type.loc8_11.1 (%Self.as_type) = bind_name a, %a.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, %F.decl [concrete = constants.%assoc0] -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self -// CHECK:STDOUT: .F = %assoc0 -// CHECK:STDOUT: witness = (%F.decl) -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: impl @impl: %A.ref as %I.ref { -// CHECK:STDOUT: %F.decl.loc22_13.1: %F.type.2ae1ef.1 = fn_decl @F.2 [concrete = constants.%F.2a7aab.1] { -// CHECK:STDOUT: %a.patt: %pattern_type.049 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.049 = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %a.param: %B = value_param call_param0 -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %a: %B = bind_name a, %a.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl.loc22_13.2: %F.type.2ae1ef.2 = fn_decl @F.3 [concrete = constants.%F.2a7aab.2] { -// CHECK:STDOUT: %a.patt: %pattern_type.c10 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.c10 = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %a.param: %A = value_param call_param0 -// CHECK:STDOUT: %a: %A = bind_name a, %a.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .B = -// CHECK:STDOUT: .F = %F.decl.loc22_13.1 -// CHECK:STDOUT: witness = file.%I.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F.1(@I.%Self: %I.type) { -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc8_11.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc8_11.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type.loc8_11.1 [symbolic = %pattern_type (constants.%pattern_type.6de)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%a.param: @F.1.%Self.as_type.loc8_11.1 (%Self.as_type)); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2(%a.param: %B); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.3(%a.param: %A) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.ref: %A = name_ref a, %a.param -// CHECK:STDOUT: %.loc8: %B = converted %a.ref, [concrete = ] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call @impl.%F.decl.loc22_13.1() -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%Self) { -// CHECK:STDOUT: %Self => constants.%Self -// CHECK:STDOUT: %Self.as_type.loc8_11.1 => constants.%Self.as_type -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.6de -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%I.facet) { -// CHECK:STDOUT: %Self => constants.%I.facet -// CHECK:STDOUT: %Self.as_type.loc8_11.1 => constants.%A -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.c10 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_return_mismatch.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %I.type: type = facet_type <@I> [concrete] -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic] -// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic] -// CHECK:STDOUT: %pattern_type.6de: type = pattern_type %Self.as_type [symbolic] -// CHECK:STDOUT: %F.type.cf0: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.bc6: %F.type.cf0 = struct_value () [concrete] -// CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, @I.%F.decl [concrete] -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %I.impl_witness: = impl_witness file.%I.impl_witness_table [concrete] -// CHECK:STDOUT: %pattern_type.049: type = pattern_type %B [concrete] -// CHECK:STDOUT: %F.type.2ae1ef.1: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.2a7aab.1: %F.type.2ae1ef.1 = struct_value () [concrete] -// CHECK:STDOUT: %I.facet: %I.type = facet_value %A, (%I.impl_witness) [concrete] -// CHECK:STDOUT: %pattern_type.c10: type = pattern_type %A [concrete] -// CHECK:STDOUT: %F.type.2ae1ef.2: type = fn_type @F.3 [concrete] -// CHECK:STDOUT: %F.2a7aab.2: %F.type.2ae1ef.2 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .I = %I.decl -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %I.decl: type = interface_decl @I [concrete = constants.%I.type] {} {} -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: impl_decl @impl [concrete] {} { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [concrete = constants.%I.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: %I.impl_witness_table = impl_witness_table (@impl.%F.decl.loc19_14.2), @impl [concrete] -// CHECK:STDOUT: %I.impl_witness: = impl_witness %I.impl_witness_table [concrete = constants.%I.impl_witness] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: interface @I { -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self] -// CHECK:STDOUT: %F.decl: %F.type.cf0 = fn_decl @F.1 [concrete = constants.%F.bc6] { -// CHECK:STDOUT: %return.patt: @F.1.%pattern_type (%pattern_type.6de) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @F.1.%pattern_type (%pattern_type.6de) = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Self.ref: %I.type = name_ref Self, @I.%Self [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc5_13.2: type = facet_access_type %Self.ref [symbolic = %Self.as_type.loc5_13.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %.loc5: type = converted %Self.ref, %Self.as_type.loc5_13.2 [symbolic = %Self.as_type.loc5_13.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %return.param: ref @F.1.%Self.as_type.loc5_13.1 (%Self.as_type) = out_param call_param0 -// CHECK:STDOUT: %return: ref @F.1.%Self.as_type.loc5_13.1 (%Self.as_type) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, %F.decl [concrete = constants.%assoc0] -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self -// CHECK:STDOUT: .F = %assoc0 -// CHECK:STDOUT: witness = (%F.decl) -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: impl @impl: %A.ref as %I.ref { -// CHECK:STDOUT: %F.decl.loc19_14.1: %F.type.2ae1ef.1 = fn_decl @F.2 [concrete = constants.%F.2a7aab.1] { -// CHECK:STDOUT: %return.patt: %pattern_type.049 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.049 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %return.param: ref %B = out_param call_param0 -// CHECK:STDOUT: %return: ref %B = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl.loc19_14.2: %F.type.2ae1ef.2 = fn_decl @F.3 [concrete = constants.%F.2a7aab.2] { -// CHECK:STDOUT: %return.patt: %pattern_type.c10 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.c10 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %return.param: ref %A = out_param call_param0 -// CHECK:STDOUT: %return: ref %A = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .B = -// CHECK:STDOUT: .F = %F.decl.loc19_14.1 -// CHECK:STDOUT: witness = file.%I.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F.1(@I.%Self: %I.type) { -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc5_13.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc5_13.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type.loc5_13.1 [symbolic = %pattern_type (constants.%pattern_type.6de)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn() -> @F.1.%Self.as_type.loc5_13.1 (%Self.as_type); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2() -> %return.param: %B; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.3() -> %return.param: %A { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc19_14.1: ref %B = temporary_storage -// CHECK:STDOUT: %F.call: init %B = call @impl.%F.decl.loc19_14.1() to %.loc19_14.1 -// CHECK:STDOUT: %.loc19_14.2: %A = converted %F.call, [concrete = ] -// CHECK:STDOUT: return to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%Self) { -// CHECK:STDOUT: %Self => constants.%Self -// CHECK:STDOUT: %Self.as_type.loc5_13.1 => constants.%Self.as_type -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.6de -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%I.facet) { -// CHECK:STDOUT: %Self => constants.%I.facet -// CHECK:STDOUT: %Self.as_type.loc5_13.1 => constants.%A -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.c10 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- return_empty_tuple_mismatch_allowed.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %I.type: type = facet_type <@I> [concrete] -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic] -// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic] -// CHECK:STDOUT: %pattern_type.6de: type = pattern_type %Self.as_type [symbolic] -// CHECK:STDOUT: %HasReturn.type.bf9: type = fn_type @HasReturn.1 [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %HasReturn.dcf: %HasReturn.type.bf9 = struct_value () [concrete] -// CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, @I.%HasReturn.decl [concrete] -// CHECK:STDOUT: %NoReturn.type.7ff: type = fn_type @NoReturn.1 [concrete] -// CHECK:STDOUT: %NoReturn.7fd: %NoReturn.type.7ff = struct_value () [concrete] -// CHECK:STDOUT: %assoc1: %I.assoc_type = assoc_entity element1, @I.%NoReturn.decl [concrete] -// CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] -// CHECK:STDOUT: %EmptyTupleReturn.type.1cb: type = fn_type @EmptyTupleReturn.1 [concrete] -// CHECK:STDOUT: %EmptyTupleReturn.c56: %EmptyTupleReturn.type.1cb = struct_value () [concrete] -// CHECK:STDOUT: %assoc2: %I.assoc_type = assoc_entity element2, @I.%EmptyTupleReturn.decl [concrete] -// CHECK:STDOUT: %I.impl_witness: = impl_witness file.%I.impl_witness_table [concrete] -// CHECK:STDOUT: %HasReturn.type.c73908.1: type = fn_type @HasReturn.2 [concrete] -// CHECK:STDOUT: %HasReturn.424378.1: %HasReturn.type.c73908.1 = struct_value () [concrete] -// CHECK:STDOUT: %NoReturn.type.948: type = fn_type @NoReturn.2 [concrete] -// CHECK:STDOUT: %NoReturn.9fa: %NoReturn.type.948 = struct_value () [concrete] -// CHECK:STDOUT: %EmptyTupleReturn.type.9ea74f.1: type = fn_type @EmptyTupleReturn.2 [concrete] -// CHECK:STDOUT: %EmptyTupleReturn.282179.1: %EmptyTupleReturn.type.9ea74f.1 = struct_value () [concrete] -// CHECK:STDOUT: %I.facet: %I.type = facet_value %empty_tuple.type, (%I.impl_witness) [concrete] -// CHECK:STDOUT: %HasReturn.type.c73908.2: type = fn_type @HasReturn.3 [concrete] -// CHECK:STDOUT: %HasReturn.424378.2: %HasReturn.type.c73908.2 = struct_value () [concrete] -// CHECK:STDOUT: %EmptyTupleReturn.type.9ea74f.2: type = fn_type @EmptyTupleReturn.3 [concrete] -// CHECK:STDOUT: %EmptyTupleReturn.282179.2: %EmptyTupleReturn.type.9ea74f.2 = struct_value () [concrete] -// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .I = %I.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %I.decl: type = interface_decl @I [concrete = constants.%I.type] {} {} -// CHECK:STDOUT: impl_decl @impl [concrete] {} { -// CHECK:STDOUT: %.loc10_7.1: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc10_7.2: type = converted %.loc10_7.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [concrete = constants.%I.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: %I.impl_witness_table = impl_witness_table (@impl.%HasReturn.decl.loc12_17.2, @impl.%NoReturn.decl, @impl.%EmptyTupleReturn.decl.loc18_24.2), @impl [concrete] -// CHECK:STDOUT: %I.impl_witness: = impl_witness %I.impl_witness_table [concrete = constants.%I.impl_witness] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: interface @I { -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self] -// CHECK:STDOUT: %HasReturn.decl: %HasReturn.type.bf9 = fn_decl @HasReturn.1 [concrete = constants.%HasReturn.dcf] { -// CHECK:STDOUT: %return.patt: @HasReturn.1.%pattern_type (%pattern_type.6de) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @HasReturn.1.%pattern_type (%pattern_type.6de) = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Self.ref: %I.type = name_ref Self, @I.%Self [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc5_21.2: type = facet_access_type %Self.ref [symbolic = %Self.as_type.loc5_21.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %.loc5: type = converted %Self.ref, %Self.as_type.loc5_21.2 [symbolic = %Self.as_type.loc5_21.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %return.param: ref @HasReturn.1.%Self.as_type.loc5_21.1 (%Self.as_type) = out_param call_param0 -// CHECK:STDOUT: %return: ref @HasReturn.1.%Self.as_type.loc5_21.1 (%Self.as_type) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, %HasReturn.decl [concrete = constants.%assoc0] -// CHECK:STDOUT: %NoReturn.decl: %NoReturn.type.7ff = fn_decl @NoReturn.1 [concrete = constants.%NoReturn.7fd] {} {} -// CHECK:STDOUT: %assoc1: %I.assoc_type = assoc_entity element1, %NoReturn.decl [concrete = constants.%assoc1] -// CHECK:STDOUT: %EmptyTupleReturn.decl: %EmptyTupleReturn.type.1cb = fn_decl @EmptyTupleReturn.1 [concrete = constants.%EmptyTupleReturn.c56] { -// CHECK:STDOUT: %return.patt: %pattern_type.cb1 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.cb1 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc7_29.1: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc7_29.2: type = converted %.loc7_29.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: %return.param: ref %empty_tuple.type = out_param call_param0 -// CHECK:STDOUT: %return: ref %empty_tuple.type = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %assoc2: %I.assoc_type = assoc_entity element2, %EmptyTupleReturn.decl [concrete = constants.%assoc2] -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self -// CHECK:STDOUT: .HasReturn = %assoc0 -// CHECK:STDOUT: .NoReturn = %assoc1 -// CHECK:STDOUT: .EmptyTupleReturn = %assoc2 -// CHECK:STDOUT: witness = (%HasReturn.decl, %NoReturn.decl, %EmptyTupleReturn.decl) -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: impl @impl: %.loc10_7.2 as %I.ref { -// CHECK:STDOUT: %HasReturn.decl.loc12_17.1: %HasReturn.type.c73908.1 = fn_decl @HasReturn.2 [concrete = constants.%HasReturn.424378.1] {} {} -// CHECK:STDOUT: %NoReturn.decl: %NoReturn.type.948 = fn_decl @NoReturn.2 [concrete = constants.%NoReturn.9fa] {} {} -// CHECK:STDOUT: %EmptyTupleReturn.decl.loc18_24.1: %EmptyTupleReturn.type.9ea74f.1 = fn_decl @EmptyTupleReturn.2 [concrete = constants.%EmptyTupleReturn.282179.1] {} {} -// CHECK:STDOUT: %HasReturn.decl.loc12_17.2: %HasReturn.type.c73908.2 = fn_decl @HasReturn.3 [concrete = constants.%HasReturn.424378.2] { -// CHECK:STDOUT: %return.patt: %pattern_type.cb1 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.cb1 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %return.param: ref %empty_tuple.type = out_param call_param0 -// CHECK:STDOUT: %return: ref %empty_tuple.type = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %EmptyTupleReturn.decl.loc18_24.2: %EmptyTupleReturn.type.9ea74f.2 = fn_decl @EmptyTupleReturn.3 [concrete = constants.%EmptyTupleReturn.282179.2] { -// CHECK:STDOUT: %return.patt: %pattern_type.cb1 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.cb1 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %return.param: ref %empty_tuple.type = out_param call_param0 -// CHECK:STDOUT: %return: ref %empty_tuple.type = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .HasReturn = %HasReturn.decl.loc12_17.1 -// CHECK:STDOUT: .NoReturn = %NoReturn.decl -// CHECK:STDOUT: .EmptyTupleReturn = %EmptyTupleReturn.decl.loc18_24.1 -// CHECK:STDOUT: witness = file.%I.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @HasReturn.1(@I.%Self: %I.type) { -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic = %Self (constants.%Self)] -// CHECK:STDOUT: %Self.as_type.loc5_21.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc5_21.1 (constants.%Self.as_type)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type.loc5_21.1 [symbolic = %pattern_type (constants.%pattern_type.6de)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn() -> @HasReturn.1.%Self.as_type.loc5_21.1 (%Self.as_type); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @NoReturn.1(@I.%Self: %I.type) { -// CHECK:STDOUT: fn(); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @EmptyTupleReturn.1(@I.%Self: %I.type) { -// CHECK:STDOUT: fn() -> %empty_tuple.type; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @HasReturn.2(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @NoReturn.2(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @EmptyTupleReturn.2(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @HasReturn.3() -> %empty_tuple.type { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %HasReturn.call: init %empty_tuple.type = call @impl.%HasReturn.decl.loc12_17.1() -// CHECK:STDOUT: %.loc12_17.1: ref %empty_tuple.type = temporary_storage -// CHECK:STDOUT: %.loc12_17.2: ref %empty_tuple.type = temporary %.loc12_17.1, %HasReturn.call -// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc12_17.3: %empty_tuple.type = converted %HasReturn.call, %tuple [concrete = constants.%empty_tuple] -// CHECK:STDOUT: return %.loc12_17.3 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @EmptyTupleReturn.3() -> %empty_tuple.type { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %EmptyTupleReturn.call: init %empty_tuple.type = call @impl.%EmptyTupleReturn.decl.loc18_24.1() -// CHECK:STDOUT: %.loc18_24.1: ref %empty_tuple.type = temporary_storage -// CHECK:STDOUT: %.loc18_24.2: ref %empty_tuple.type = temporary %.loc18_24.1, %EmptyTupleReturn.call -// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc18_24.3: %empty_tuple.type = converted %EmptyTupleReturn.call, %tuple [concrete = constants.%empty_tuple] -// CHECK:STDOUT: return %.loc18_24.3 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @HasReturn.1(constants.%Self) { -// CHECK:STDOUT: %Self => constants.%Self -// CHECK:STDOUT: %Self.as_type.loc5_21.1 => constants.%Self.as_type -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.6de -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @NoReturn.1(constants.%Self) {} -// CHECK:STDOUT: -// CHECK:STDOUT: specific @EmptyTupleReturn.1(constants.%Self) {} -// CHECK:STDOUT: -// CHECK:STDOUT: specific @HasReturn.1(constants.%I.facet) { -// CHECK:STDOUT: %Self => constants.%I.facet -// CHECK:STDOUT: %Self.as_type.loc5_21.1 => constants.%empty_tuple.type -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.cb1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @NoReturn.1(constants.%I.facet) {} -// CHECK:STDOUT: -// CHECK:STDOUT: specific @EmptyTupleReturn.1(constants.%I.facet) {} -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_return_empty_tuple_mismatch.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %I.type: type = facet_type <@I> [concrete] -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic] -// CHECK:STDOUT: %NoReturn.type.7ff: type = fn_type @NoReturn.1 [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %NoReturn.7fd: %NoReturn.type.7ff = struct_value () [concrete] -// CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, @I.%NoReturn.decl [concrete] -// CHECK:STDOUT: %I.impl_witness.c4e: = impl_witness file.%I.impl_witness_table.loc8 [concrete] -// CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] -// CHECK:STDOUT: %NoReturn.type.948: type = fn_type @NoReturn.2 [concrete] -// CHECK:STDOUT: %NoReturn.9fa: %NoReturn.type.948 = struct_value () [concrete] -// CHECK:STDOUT: %I.facet.372: %I.type = facet_value %empty_tuple.type, (%I.impl_witness.c4e) [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %I.impl_witness.464: = impl_witness file.%I.impl_witness_table.loc22 [concrete] -// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] -// CHECK:STDOUT: %NoReturn.type.930: type = fn_type @NoReturn.3 [concrete] -// CHECK:STDOUT: %NoReturn.ac0: %NoReturn.type.930 = struct_value () [concrete] -// CHECK:STDOUT: %I.facet.be9: %I.type = facet_value %C, (%I.impl_witness.464) [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .I = %I.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %I.decl: type = interface_decl @I [concrete = constants.%I.type] {} {} -// CHECK:STDOUT: impl_decl @impl.4ab [concrete] {} { -// CHECK:STDOUT: %.loc8_7.1: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc8_7.2: type = converted %.loc8_7.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [concrete = constants.%I.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: %I.impl_witness_table.loc8 = impl_witness_table (), @impl.4ab [concrete] -// CHECK:STDOUT: %I.impl_witness.loc8: = impl_witness %I.impl_witness_table.loc8 [concrete = constants.%I.impl_witness.c4e] -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: impl_decl @impl.770 [concrete] {} { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [concrete = constants.%I.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: %I.impl_witness_table.loc22 = impl_witness_table (), @impl.770 [concrete] -// CHECK:STDOUT: %I.impl_witness.loc22: = impl_witness %I.impl_witness_table.loc22 [concrete = constants.%I.impl_witness.464] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: interface @I { -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self] -// CHECK:STDOUT: %NoReturn.decl: %NoReturn.type.7ff = fn_decl @NoReturn.1 [concrete = constants.%NoReturn.7fd] {} {} -// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, %NoReturn.decl [concrete = constants.%assoc0] -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self -// CHECK:STDOUT: .NoReturn = %assoc0 -// CHECK:STDOUT: witness = (%NoReturn.decl) -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: impl @impl.4ab: %.loc8_7.2 as %I.ref { -// CHECK:STDOUT: %NoReturn.decl: %NoReturn.type.948 = fn_decl @NoReturn.2 [concrete = constants.%NoReturn.9fa] { -// CHECK:STDOUT: %return.patt: %pattern_type.cb1 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.cb1 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc17_21.1: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc17_21.2: type = converted %.loc17_21.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: %return.param: ref %empty_tuple.type = out_param call_param0 -// CHECK:STDOUT: %return: ref %empty_tuple.type = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .NoReturn = %NoReturn.decl -// CHECK:STDOUT: witness = file.%I.impl_witness.loc8 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: impl @impl.770: %C.ref as %I.ref { -// CHECK:STDOUT: %NoReturn.decl: %NoReturn.type.930 = fn_decl @NoReturn.3 [concrete = constants.%NoReturn.ac0] { -// 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_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %return.param: ref %C = out_param call_param0 -// CHECK:STDOUT: %return: ref %C = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .C = -// CHECK:STDOUT: .NoReturn = %NoReturn.decl -// CHECK:STDOUT: witness = file.%I.impl_witness.loc22 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %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 @NoReturn.1(@I.%Self: %I.type) { -// CHECK:STDOUT: fn(); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @NoReturn.2() -> %empty_tuple.type; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @NoReturn.3() -> %C; -// CHECK:STDOUT: -// CHECK:STDOUT: specific @NoReturn.1(constants.%Self) {} -// CHECK:STDOUT: -// CHECK:STDOUT: specific @NoReturn.1(constants.%I.facet.372) {} -// CHECK:STDOUT: -// CHECK:STDOUT: specific @NoReturn.1(constants.%I.facet.be9) {} -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_param_type_incomplete.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// 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: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %I.generic: %I.type.dac = struct_value () [concrete] -// CHECK:STDOUT: %I.type.325: type = facet_type <@I, @I(%T)> [symbolic] -// CHECK:STDOUT: %Self.209: %I.type.325 = bind_symbolic_name Self, 1 [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %F.type.2ae: type = fn_type @F.1, @I(%T) [symbolic] -// CHECK:STDOUT: %F.bb2: %F.type.2ae = struct_value () [symbolic] -// CHECK:STDOUT: %I.assoc_type.1e5: type = assoc_entity_type @I, @I(%T) [symbolic] -// CHECK:STDOUT: %assoc0.8f0: %I.assoc_type.1e5 = assoc_entity element0, @I.%F.decl [symbolic] -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %I.type.a79: type = facet_type <@I, @I(%B)> [concrete] -// CHECK:STDOUT: %Self.fe1: %I.type.a79 = bind_symbolic_name Self, 1 [symbolic] -// CHECK:STDOUT: %F.type.7f2: type = fn_type @F.1, @I(%B) [concrete] -// CHECK:STDOUT: %F.e0a: %F.type.7f2 = struct_value () [concrete] -// CHECK:STDOUT: %I.assoc_type.5ff: type = assoc_entity_type @I, @I(%B) [concrete] -// CHECK:STDOUT: %assoc0.470: %I.assoc_type.5ff = assoc_entity element0, @I.%F.decl [concrete] -// CHECK:STDOUT: %I.impl_witness: = impl_witness @C.%I.impl_witness_table [concrete] -// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] -// CHECK:STDOUT: %F.type.17e183.1: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.4f1533.1: %F.type.17e183.1 = struct_value () [concrete] -// CHECK:STDOUT: %I.facet: %I.type.a79 = facet_value %C, (%I.impl_witness) [concrete] -// CHECK:STDOUT: %pattern_type.049: type = pattern_type %B [concrete] -// CHECK:STDOUT: %F.type.17e183.2: type = fn_type @F.3 [concrete] -// CHECK:STDOUT: %F.4f1533.2: %F.type.17e183.2 = 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: %U: type = bind_symbolic_name U, 0 [symbolic] +// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %U [symbolic] +// CHECK:STDOUT: %F.type.39e918.1: type = fn_type @F.2 [concrete] +// CHECK:STDOUT: %F.c04b92.1: %F.type.39e918.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: %F.type.39e918.2: type = fn_type @F.3 [concrete] +// CHECK:STDOUT: %F.c04b92.2: %F.type.39e918.2 = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.6e5: = require_complete_type %ptr.79f [symbolic] +// CHECK:STDOUT: %F.specific_fn: = specific_function %F.c04b92.1, @F.2(%ptr.79f) [symbolic] +// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %U [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .I = %I.decl -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .C = %C.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: impl @impl: %.loc8_7.2 as %I.ref { +// CHECK:STDOUT: %F.decl.loc10_29.1: %F.type.39e918.1 = fn_decl @F.2 [concrete = constants.%F.c04b92.1] { +// CHECK:STDOUT: %U.patt: %pattern_type.98f = symbolic_binding_pattern U, 0 [concrete] +// CHECK:STDOUT: %x.patt: @F.2.%pattern_type (%pattern_type.7dc) = binding_pattern x [concrete] +// CHECK:STDOUT: %x.param_patt: @F.2.%pattern_type (%pattern_type.7dc) = value_param_pattern %x.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @F.2.%pattern_type (%pattern_type.7dc) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @F.2.%pattern_type (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] +// CHECK:STDOUT: %U.ref.loc10_27: type = name_ref U, %U.loc10_8.2 [symbolic = %U.loc10_8.1 (constants.%U)] +// CHECK:STDOUT: %U.loc10_8.2: type = bind_symbolic_name U, 0 [symbolic = %U.loc10_8.1 (constants.%U)] +// CHECK:STDOUT: %x.param: @F.2.%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: @F.2.%U.loc10_8.1 (%U) = bind_name x, %x.param +// CHECK:STDOUT: %return.param: ref @F.2.%U.loc10_8.1 (%U) = out_param call_param1 +// CHECK:STDOUT: %return: ref @F.2.%U.loc10_8.1 (%U) = return_slot %return.param // CHECK:STDOUT: } -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} +// CHECK:STDOUT: %F.decl.loc10_29.2: %F.type.39e918.2 = fn_decl @F.3 [concrete = constants.%F.c04b92.2] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .F = %F.decl.loc10_29.1 +// CHECK:STDOUT: witness = file.%I.impl_witness // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic interface @I(%T.loc4_13.1: type) { -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] +// CHECK:STDOUT: generic fn @F.2(%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: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %I.type: type = facet_type <@I, @I(%T.loc4_13.2)> [symbolic = %I.type (constants.%I.type.325)] -// CHECK:STDOUT: %Self.2: @I.%I.type (%I.type.325) = bind_symbolic_name Self, 1 [symbolic = %Self.2 (constants.%Self.209)] -// CHECK:STDOUT: %F.type: type = fn_type @F.1, @I(%T.loc4_13.2) [symbolic = %F.type (constants.%F.type.2ae)] -// CHECK:STDOUT: %F: @I.%F.type (%F.type.2ae) = struct_value () [symbolic = %F (constants.%F.bb2)] -// CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I, @I(%T.loc4_13.2) [symbolic = %I.assoc_type (constants.%I.assoc_type.1e5)] -// CHECK:STDOUT: %assoc0.loc8_13.2: @I.%I.assoc_type (%I.assoc_type.1e5) = assoc_entity element0, %F.decl [symbolic = %assoc0.loc8_13.2 (constants.%assoc0.8f0)] +// CHECK:STDOUT: %require_complete: = require_complete_type %U.loc10_8.1 [symbolic = %require_complete (constants.%require_complete.4ae)] // CHECK:STDOUT: -// CHECK:STDOUT: interface { -// CHECK:STDOUT: %Self.1: @I.%I.type (%I.type.325) = bind_symbolic_name Self, 1 [symbolic = %Self.2 (constants.%Self.209)] -// CHECK:STDOUT: %F.decl: @I.%F.type (%F.type.2ae) = fn_decl @F.1 [symbolic = @I.%F (constants.%F.bb2)] { -// CHECK:STDOUT: %a.patt: @F.1.%pattern_type (%pattern_type.7dc) = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: @F.1.%pattern_type (%pattern_type.7dc) = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %a.param: @F.1.%T (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref: type = name_ref T, @I.%T.loc4_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %a: @F.1.%T (%T) = bind_name a, %a.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %assoc0.loc8_13.1: @I.%I.assoc_type (%I.assoc_type.1e5) = assoc_entity element0, %F.decl [symbolic = %assoc0.loc8_13.2 (constants.%assoc0.8f0)] -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self.1 -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .F = %assoc0.loc8_13.1 -// CHECK:STDOUT: witness = (%F.decl) +// CHECK:STDOUT: fn(%x.param: @F.2.%U.loc10_8.1 (%U)) -> @F.2.%U.loc10_8.1 (%U) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %x.ref: @F.2.%U.loc10_8.1 (%U) = name_ref x, %x +// CHECK:STDOUT: return %x.ref // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: impl @impl: %Self.ref as %I.type { -// CHECK:STDOUT: %F.decl.loc32_15.1: %F.type.17e183.1 = fn_decl @F.2 [concrete = constants.%F.4f1533.1] { -// CHECK:STDOUT: %c.patt: %pattern_type.c48 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.c48 = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %c.param: %C = value_param call_param0 -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %c: %C = bind_name c, %c.param +// CHECK:STDOUT: generic fn @F.3(%T.loc5_8.2: type) { +// CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %F.specific_fn.loc10_29.2: = specific_function constants.%F.c04b92.1, @F.2(%ptr) [symbolic = %F.specific_fn.loc10_29.2 (constants.%F.specific_fn)] +// CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%x.param: @F.3.%ptr (%ptr.79f)) -> @F.3.%ptr (%ptr.79f) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type.39e918.1 = name_ref F, @impl.%F.decl.loc10_29.1 [concrete = constants.%F.c04b92.1] +// CHECK:STDOUT: +// CHECK:STDOUT: %F.specific_fn.loc10_29.1: = specific_function %F.ref, @F.2(constants.%ptr.79f) [symbolic = %F.specific_fn.loc10_29.2 (constants.%F.specific_fn)] +// CHECK:STDOUT: %F.call: init @F.3.%ptr (%ptr.79f) = call %F.specific_fn.loc10_29.1(%x.ref) +// CHECK:STDOUT: %.loc10_29.1: @F.3.%ptr (%ptr.79f) = value_of_initializer %F.call +// CHECK:STDOUT: %.loc10_29.2: @F.3.%ptr (%ptr.79f) = converted %F.call, %.loc10_29.1 +// CHECK:STDOUT: return %.loc10_29.2 // CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl.loc32_15.2: %F.type.17e183.2 = fn_decl @F.3 [concrete = constants.%F.4f1533.2] { -// CHECK:STDOUT: %a.patt: %pattern_type.049 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.049 = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %a.param: %B = value_param call_param0 -// CHECK:STDOUT: %a: %B = bind_name a, %a.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .C = -// CHECK:STDOUT: .F = %F.decl.loc32_15.1 -// CHECK:STDOUT: witness = @C.%I.impl_witness // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: class @B; -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: impl_decl @impl [concrete] {} { -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] -// CHECK:STDOUT: %I.ref: %I.type.dac = name_ref I, file.%I.decl [concrete = constants.%I.generic] -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %I.type: type = facet_type <@I, @I(constants.%B)> [concrete = constants.%I.type.a79] -// CHECK:STDOUT: } -// CHECK:STDOUT: %I.impl_witness_table = impl_witness_table (@impl.%F.decl.loc32_15.2), @impl [concrete] -// CHECK:STDOUT: %I.impl_witness: = impl_witness %I.impl_witness_table [concrete = constants.%I.impl_witness] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %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: .I = -// CHECK:STDOUT: .B = -// CHECK:STDOUT: .C = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F.1(@I.%T.loc4_13.1: type, @I.%Self.1: @I.%I.type (%I.type.325)) { -// 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: -// CHECK:STDOUT: fn(%a.param: @F.1.%T (%T)); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2(%c.param: %C); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.3(%a.param: %B) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.ref: %B = name_ref a, %a.param -// CHECK:STDOUT: %.loc8: %C = converted %a.ref, [concrete = ] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call @impl.%F.decl.loc32_15.1() -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @I(constants.%T) { -// CHECK:STDOUT: %T.loc4_13.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%T, constants.%Self.209) { -// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: specific @F.2(constants.%U) { +// CHECK:STDOUT: %U.loc10_8.1 => constants.%U // CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @I(constants.%B) { -// CHECK:STDOUT: %T.loc4_13.2 => constants.%B +// CHECK:STDOUT: specific @F.3(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 @F.2(constants.%ptr.79f) { +// CHECK:STDOUT: %U.loc10_8.1 => constants.%ptr.79f +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.afe // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %I.type => constants.%I.type.a79 -// CHECK:STDOUT: %Self.2 => constants.%Self.fe1 -// CHECK:STDOUT: %F.type => constants.%F.type.7f2 -// CHECK:STDOUT: %F => constants.%F.e0a -// CHECK:STDOUT: %I.assoc_type => constants.%I.assoc_type.5ff -// CHECK:STDOUT: %assoc0.loc8_13.2 => constants.%assoc0.470 +// CHECK:STDOUT: %require_complete => constants.%require_complete.6e5 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%B, constants.%I.facet) { -// CHECK:STDOUT: %T => constants.%B -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.049 +// 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: %F.type.39e918.1: type = fn_type @F.2 [concrete] +// CHECK:STDOUT: %F.c04b92.1: %F.type.39e918.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: %F.type.39e918.2: type = fn_type @F.3 [concrete] +// CHECK:STDOUT: %F.c04b92.2: %F.type.39e918.2 = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %U [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: impl @impl: %.loc10_7.2 as %I.ref { +// CHECK:STDOUT: %F.decl.loc19_39.1: %F.type.39e918.1 = fn_decl @F.2 [concrete = constants.%F.c04b92.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: @F.2.%pattern_type (%pattern_type.7dc) = binding_pattern x [concrete] +// CHECK:STDOUT: %x.param_patt: @F.2.%pattern_type (%pattern_type.7dc) = value_param_pattern %x.patt, call_param1 [concrete] +// CHECK:STDOUT: %return.patt: @F.2.%pattern_type (%pattern_type.7dc) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @F.2.%pattern_type (%pattern_type.7dc) = 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: %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: %U.loc19_18.2: type = bind_symbolic_name U, 0 [symbolic = %U.loc19_18.1 (constants.%U)] +// CHECK:STDOUT: %x.param: @F.2.%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: @F.2.%U.loc19_18.1 (%U) = bind_name x, %x.param +// CHECK:STDOUT: %return.param: ref @F.2.%U.loc19_18.1 (%U) = out_param call_param2 +// CHECK:STDOUT: %return: ref @F.2.%U.loc19_18.1 (%U) = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %F.decl.loc19_39.2: %F.type.39e918.2 = fn_decl @F.3 [concrete = constants.%F.c04b92.2] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .F = %F.decl.loc19_39.1 +// CHECK:STDOUT: witness = file.%I.impl_witness +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @F.2(%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: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %U.loc19_18.1 [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%self.param: %empty_tuple.type, %x.param: @F.2.%U.loc19_18.1 (%U)) -> @F.2.%U.loc19_18.1 (%U) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %x.ref: @F.2.%U.loc19_18.1 (%U) = name_ref x, %x +// CHECK:STDOUT: return %x.ref +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @F.3(%T.loc5_20.2: type) { +// CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%self.param: %empty_tuple.type, %x.param: @F.3.%ptr (%ptr.79f)) -> @F.3.%ptr (%ptr.79f) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type.39e918.1 = name_ref F, @impl.%F.decl.loc19_39.1 [concrete = constants.%F.c04b92.1] +// CHECK:STDOUT: +// CHECK:STDOUT: return +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @F.2(constants.%U) { +// CHECK:STDOUT: %U.loc19_18.1 => constants.%U +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @F.3(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 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- generic_interface.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %struct_type.b.a.1b0: type = struct_type {.b: %empty_struct_type, .a: %empty_struct_type} [concrete] +// CHECK:STDOUT: %pattern_type.914: type = pattern_type %struct_type.b.a.1b0 [concrete] +// CHECK:STDOUT: %F.type.29ab63.1: type = fn_type @F.2 [concrete] +// CHECK:STDOUT: %F.975709.1: %F.type.29ab63.1 = struct_value () [concrete] +// CHECK:STDOUT: %struct_type.a.b.f95: type = struct_type {.a: %empty_struct_type, .b: %empty_struct_type} [concrete] +// CHECK:STDOUT: %F.type.29ab63.2: type = fn_type @F.3 [concrete] +// CHECK:STDOUT: %F.975709.2: %F.type.29ab63.2 = struct_value () [concrete] +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete] +// CHECK:STDOUT: %struct: %struct_type.a.b.f95 = struct_value (%empty_struct, %empty_struct) [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: impl @impl: %.loc8_7.2 as %I.type { +// CHECK:STDOUT: %F.decl.loc10_29.1: %F.type.29ab63.1 = fn_decl @F.2 [concrete = constants.%F.975709.1] { +// CHECK:STDOUT: %return.patt: %pattern_type.914 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.914 = out_param_pattern %return.patt, call_param0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc10_19.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc10_19.2: type = converted %.loc10_19.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %.loc10_27.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc10_27.2: type = converted %.loc10_27.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %struct_type.b.a: type = struct_type {.b: %empty_struct_type, .a: %empty_struct_type} [concrete = constants.%struct_type.b.a.1b0] +// CHECK:STDOUT: %return.param: ref %struct_type.b.a.1b0 = out_param call_param0 +// CHECK:STDOUT: %return: ref %struct_type.b.a.1b0 = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %F.decl.loc10_29.2: %F.type.29ab63.2 = fn_decl @F.3 [concrete = constants.%F.975709.2] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .F = %F.decl.loc10_29.1 +// CHECK:STDOUT: witness = file.%I.impl_witness +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F.2() -> %return.param: %struct_type.b.a.1b0; +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F.3() -> %return.param: %struct_type.a.b.f95 { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type.29ab63.1 = name_ref F, @impl.%F.decl.loc10_29.1 [concrete = constants.%F.975709.1] +// CHECK:STDOUT: %.loc10_29.1: ref %struct_type.b.a.1b0 = temporary_storage +// CHECK:STDOUT: %F.call: init %struct_type.b.a.1b0 = call %F.ref() to %.loc10_29.1 +// CHECK:STDOUT: %.loc10_29.2: ref %struct_type.b.a.1b0 = temporary %.loc10_29.1, %F.call +// CHECK:STDOUT: %.loc10_29.3: ref %empty_struct_type = struct_access %.loc10_29.2, element1 +// CHECK:STDOUT: %.loc10_29.4: ref %empty_struct_type = struct_access %return, element1 +// CHECK:STDOUT: %.loc10_29.5: init %empty_struct_type = struct_init () to %.loc10_29.4 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc10_29.6: init %empty_struct_type = converted %.loc10_29.3, %.loc10_29.5 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc10_29.7: ref %empty_struct_type = struct_access %.loc10_29.2, element0 +// CHECK:STDOUT: %.loc10_29.8: ref %empty_struct_type = struct_access %return, element0 +// CHECK:STDOUT: %.loc10_29.9: init %empty_struct_type = struct_init () to %.loc10_29.8 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc10_29.10: init %empty_struct_type = converted %.loc10_29.7, %.loc10_29.9 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc10_29.11: init %struct_type.a.b.f95 = struct_init (%.loc10_29.6, %.loc10_29.10) to %return [concrete = constants.%struct] +// CHECK:STDOUT: %.loc10_29.12: init %struct_type.a.b.f95 = converted %F.call, %.loc10_29.11 [concrete = constants.%struct] +// CHECK:STDOUT: return %.loc10_29.12 to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/import_thunk.carbon b/toolchain/check/testdata/impl/import_thunk.carbon index 57253aaafc03..525083ae19a1 100644 --- a/toolchain/check/testdata/impl/import_thunk.carbon +++ b/toolchain/check/testdata/impl/import_thunk.carbon @@ -249,8 +249,10 @@ fn G() { // CHECK:STDOUT: // CHECK:STDOUT: fn(%x.param: %empty_struct_type) { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: %.loc8: @F.3.%F.type (%F.type.0daaa1.1) = specific_constant @impl.%F.decl.loc8_17.1, @impl(constants.%Y) [symbolic = %F (constants.%F.49c1ac.1)] +// CHECK:STDOUT: %F.ref: @F.3.%F.type (%F.type.0daaa1.1) = name_ref F, %.loc8 [symbolic = %F (constants.%F.49c1ac.1)] // CHECK:STDOUT: %x.ref: %empty_struct_type = name_ref x, %x.param -// CHECK:STDOUT: %F.specific_fn.loc8_17.1: = specific_function @impl.%F.decl.loc8_17.1, @F.2(constants.%Y) [symbolic = %F.specific_fn.loc8_17.2 (constants.%F.specific_fn)] +// CHECK:STDOUT: %F.specific_fn.loc8_17.1: = specific_function %F.ref, @F.2(constants.%Y) [symbolic = %F.specific_fn.loc8_17.2 (constants.%F.specific_fn)] // CHECK:STDOUT: %.1: ref @F.3.%C (%C.13320f.2) = temporary_storage // CHECK:STDOUT: %.2: init @F.3.%C (%C.13320f.2) = class_init (), %.1 [symbolic = %C.val (constants.%C.val)] // CHECK:STDOUT: %.3: ref @F.3.%C (%C.13320f.2) = temporary %.1, %.2 diff --git a/toolchain/check/testdata/impl/use_assoc_const.carbon b/toolchain/check/testdata/impl/use_assoc_const.carbon index f5ece126b32a..7d1f18b6278c 100644 --- a/toolchain/check/testdata/impl/use_assoc_const.carbon +++ b/toolchain/check/testdata/impl/use_assoc_const.carbon @@ -2422,8 +2422,9 @@ fn F() { // CHECK:STDOUT: // CHECK:STDOUT: fn @F.3(%u.param: %i32) -> %i32 { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type.b842fd.1 = name_ref F, @impl.%F.decl.loc24_21.1 [concrete = constants.%F.b07d12.1] // CHECK:STDOUT: %u.ref: %i32 = name_ref u, %u.param -// CHECK:STDOUT: %F.call: init = call @impl.%F.decl.loc24_21.1() +// CHECK:STDOUT: %F.call: init = call %F.ref() // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: @@ -2689,6 +2690,7 @@ fn F() { // CHECK:STDOUT: // CHECK:STDOUT: fn @F.3(%self.param: %empty_tuple.type, %.param: ) -> { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type.f405c5.1 = name_ref F, @impl.4e9.%F.decl.loc30_33.1 [concrete = constants.%F.214a71.1] // CHECK:STDOUT: %self.ref: %empty_tuple.type = name_ref self, %self.param // CHECK:STDOUT: %.ref: = name_ref , %.param [concrete = ] // CHECK:STDOUT: return @@ -2702,8 +2704,9 @@ fn F() { // CHECK:STDOUT: // CHECK:STDOUT: fn @F.5(%self.param: %C2, %.param: ) -> { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type.05d6a0.1 = name_ref F, @impl.8b3.%F.decl.loc39_33.1 [concrete = constants.%F.bfa759.1] // CHECK:STDOUT: %self.ref: %C2 = name_ref self, %self.param -// CHECK:STDOUT: %F.bound: = bound_method %self.ref, @impl.8b3.%F.decl.loc39_33.1 +// CHECK:STDOUT: %F.bound: = bound_method %self.ref, %F.ref // CHECK:STDOUT: %.ref: = name_ref , %.param [concrete = ] // CHECK:STDOUT: %F.call: init %C2 = call %F.bound(%self.ref, ) // CHECK:STDOUT: return @@ -2912,6 +2915,7 @@ fn F() { // CHECK:STDOUT: // CHECK:STDOUT: fn @F.3(%self.param: %empty_tuple.type, %v.param: %struct_type.a) -> %struct_type.a { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type.c5249c.1 = name_ref F, @impl.%F.decl.loc16_45.1 [concrete = constants.%F.5eb4dd.1] // 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 diff --git a/toolchain/check/thunk.cpp b/toolchain/check/thunk.cpp index e46d0dcc56d6..0dd89c103f69 100644 --- a/toolchain/check/thunk.cpp +++ b/toolchain/check/thunk.cpp @@ -15,6 +15,7 @@ #include "toolchain/check/generic.h" #include "toolchain/check/inst.h" #include "toolchain/check/member_access.h" +#include "toolchain/check/name_ref.h" #include "toolchain/check/pattern.h" #include "toolchain/check/pattern_match.h" #include "toolchain/check/pointer_dereference.h" @@ -333,6 +334,12 @@ static auto BuildThunkCall(Context& context, SemIR::FunctionId function_id, auto loc_id = SemIR::LocId(callee_id); auto& function = context.functions().Get(function_id); + // Build a `NameRef` naming the callee, and a `SpecificConstant` if needed. + auto callee_type = context.types().GetAs( + context.insts().Get(callee_id).type_id()); + callee_id = BuildNameRef(context, loc_id, function.name_id, callee_id, + callee_type.specific_id); + // If we have a self parameter, form `self.`. if (function.self_param_id.has_value()) { callee_id = PerformCompoundMemberAccess( diff --git a/toolchain/lower/testdata/impl/thunk.carbon b/toolchain/lower/testdata/impl/thunk.carbon index 571ab7632417..91dd78a3ff42 100644 --- a/toolchain/lower/testdata/impl/thunk.carbon +++ b/toolchain/lower/testdata/impl/thunk.carbon @@ -8,6 +8,10 @@ // TIP: To dump output, run: // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/lower/testdata/impl/thunk.carbon +// --- thunk.carbon + +library "[[@TEST_NAME]]"; + class A { var a: i32; } class B { var b: i32; } class C { var c: i32; } @@ -31,44 +35,77 @@ fn Test(a: A) -> C { return ().(I.F)(a); } +// --- generic_thunk.carbon + +library "[[@TEST_NAME]]"; + +class A {} +class B { + impl as Core.ImplicitAs(A) { + fn Convert[self: Self]() -> A { return {}; } + } +} + +interface I(T:! type) { + fn F[self: Self](x: B) -> A; +} + +class C(U:! type) {} + +impl forall [V:! type] C(V) as I(V) { + fn F[self: Self](x: A) -> B { return {}; } +} + +fn Call(c: C(()), b: B) -> A { + return c.(I(()).F)(b); +} + +fn CallGeneric[T:! I(())](c: T, b: B) -> A { + return c.F(b); +} + +fn CallCallGeneric(c: C(()), b: B) -> A { + return CallGeneric(c, b); +} + // CHECK:STDOUT: ; ModuleID = 'thunk.carbon' // CHECK:STDOUT: source_filename = "thunk.carbon" // CHECK:STDOUT: // CHECK:STDOUT: define void @"_CConvert.A.Main:ImplicitAs.Core"(ptr sret({ i32 }) %return, ptr %self) !dbg !4 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %.loc16_49.1.a = getelementptr inbounds nuw { i32 }, ptr %self, i32 0, i32 0, !dbg !7 -// CHECK:STDOUT: %.loc16_49.2 = load i32, ptr %.loc16_49.1.a, align 4, !dbg !7 -// CHECK:STDOUT: %.loc16_51.2.b = getelementptr inbounds nuw { i32 }, ptr %return, i32 0, i32 0, !dbg !8 -// CHECK:STDOUT: store i32 %.loc16_49.2, ptr %.loc16_51.2.b, align 4, !dbg !8 +// CHECK:STDOUT: %.loc9_49.1.a = getelementptr inbounds nuw { i32 }, ptr %self, i32 0, i32 0, !dbg !7 +// CHECK:STDOUT: %.loc9_49.2 = load i32, ptr %.loc9_49.1.a, align 4, !dbg !7 +// CHECK:STDOUT: %.loc9_51.2.b = getelementptr inbounds nuw { i32 }, ptr %return, i32 0, i32 0, !dbg !8 +// CHECK:STDOUT: store i32 %.loc9_49.2, ptr %.loc9_51.2.b, align 4, !dbg !8 // CHECK:STDOUT: ret void, !dbg !9 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: define void @"_CConvert.B.Main:ImplicitAs.Core"(ptr sret({ i32 }) %return, ptr %self) !dbg !10 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %.loc19_49.1.b = getelementptr inbounds nuw { i32 }, ptr %self, i32 0, i32 0, !dbg !11 -// CHECK:STDOUT: %.loc19_49.2 = load i32, ptr %.loc19_49.1.b, align 4, !dbg !11 -// CHECK:STDOUT: %.loc19_51.2.c = getelementptr inbounds nuw { i32 }, ptr %return, i32 0, i32 0, !dbg !12 -// CHECK:STDOUT: store i32 %.loc19_49.2, ptr %.loc19_51.2.c, align 4, !dbg !12 +// CHECK:STDOUT: %.loc12_49.1.b = getelementptr inbounds nuw { i32 }, ptr %self, i32 0, i32 0, !dbg !11 +// CHECK:STDOUT: %.loc12_49.2 = load i32, ptr %.loc12_49.1.b, align 4, !dbg !11 +// CHECK:STDOUT: %.loc12_51.2.c = getelementptr inbounds nuw { i32 }, ptr %return, i32 0, i32 0, !dbg !12 +// CHECK:STDOUT: store i32 %.loc12_49.2, ptr %.loc12_51.2.c, align 4, !dbg !12 // CHECK:STDOUT: ret void, !dbg !13 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: define void @"_CF.61ea2aba74ab3bf1:I.Main"(ptr sret({ i32 }) %return, ptr %b) !dbg !14 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %.loc27_35.1.b = getelementptr inbounds nuw { i32 }, ptr %b, i32 0, i32 0, !dbg !15 -// CHECK:STDOUT: %.loc27_35.2 = load i32, ptr %.loc27_35.1.b, align 4, !dbg !15 -// CHECK:STDOUT: %.loc27_37.2.b = getelementptr inbounds nuw { i32 }, ptr %return, i32 0, i32 0, !dbg !16 -// CHECK:STDOUT: store i32 %.loc27_35.2, ptr %.loc27_37.2.b, align 4, !dbg !16 +// CHECK:STDOUT: %.loc20_35.1.b = getelementptr inbounds nuw { i32 }, ptr %b, i32 0, i32 0, !dbg !15 +// CHECK:STDOUT: %.loc20_35.2 = load i32, ptr %.loc20_35.1.b, align 4, !dbg !15 +// CHECK:STDOUT: %.loc20_37.2.b = getelementptr inbounds nuw { i32 }, ptr %return, i32 0, i32 0, !dbg !16 +// CHECK:STDOUT: store i32 %.loc20_35.2, ptr %.loc20_37.2.b, align 4, !dbg !16 // CHECK:STDOUT: ret void, !dbg !17 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: define void @"_CF:thunk.61ea2aba74ab3bf1:I.Main"(ptr sret({ i32 }) %return, ptr %a) !dbg !18 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %.loc27_19.1.temp = alloca { i32 }, align 8, !dbg !19 -// CHECK:STDOUT: %.loc23_9.1.temp = alloca { i32 }, align 8, !dbg !20 -// CHECK:STDOUT: call void @"_CConvert.A.Main:ImplicitAs.Core"(ptr %.loc23_9.1.temp, ptr %a), !dbg !20 -// CHECK:STDOUT: call void @"_CF.61ea2aba74ab3bf1:I.Main"(ptr %.loc27_19.1.temp, ptr %.loc23_9.1.temp), !dbg !19 -// CHECK:STDOUT: %.loc27_19.2.temp = alloca { i32 }, align 8, !dbg !19 -// CHECK:STDOUT: call void @"_CConvert.B.Main:ImplicitAs.Core"(ptr %.loc27_19.2.temp, ptr %.loc27_19.1.temp), !dbg !19 +// CHECK:STDOUT: %.loc20_19.1.temp = alloca { i32 }, align 8, !dbg !19 +// CHECK:STDOUT: %.loc16_9.1.temp = alloca { i32 }, align 8, !dbg !20 +// CHECK:STDOUT: call void @"_CConvert.A.Main:ImplicitAs.Core"(ptr %.loc16_9.1.temp, ptr %a), !dbg !20 +// CHECK:STDOUT: call void @"_CF.61ea2aba74ab3bf1:I.Main"(ptr %.loc20_19.1.temp, ptr %.loc16_9.1.temp), !dbg !19 +// CHECK:STDOUT: %.loc20_19.2.temp = alloca { i32 }, align 8, !dbg !19 +// CHECK:STDOUT: call void @"_CConvert.B.Main:ImplicitAs.Core"(ptr %.loc20_19.2.temp, ptr %.loc20_19.1.temp), !dbg !19 // CHECK:STDOUT: ret void, !dbg !19 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -85,23 +122,102 @@ fn Test(a: A) -> C { // 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: "thunk.carbon", directory: "") -// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.A.Main:ImplicitAs.Core", scope: null, file: !3, line: 16, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.A.Main:ImplicitAs.Core", scope: null, file: !3, line: 9, type: !5, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !5 = !DISubroutineType(types: !6) // CHECK:STDOUT: !6 = !{} -// CHECK:STDOUT: !7 = !DILocation(line: 16, column: 45, scope: !4) -// CHECK:STDOUT: !8 = !DILocation(line: 16, column: 39, scope: !4) -// CHECK:STDOUT: !9 = !DILocation(line: 16, column: 32, scope: !4) -// CHECK:STDOUT: !10 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.B.Main:ImplicitAs.Core", scope: null, file: !3, line: 19, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !11 = !DILocation(line: 19, column: 45, scope: !10) -// CHECK:STDOUT: !12 = !DILocation(line: 19, column: 39, scope: !10) -// CHECK:STDOUT: !13 = !DILocation(line: 19, column: 32, scope: !10) -// CHECK:STDOUT: !14 = distinct !DISubprogram(name: "F", linkageName: "_CF.61ea2aba74ab3bf1:I.Main", scope: null, file: !3, line: 27, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !15 = !DILocation(line: 27, column: 34, scope: !14) -// CHECK:STDOUT: !16 = !DILocation(line: 27, column: 28, scope: !14) -// CHECK:STDOUT: !17 = !DILocation(line: 27, column: 21, scope: !14) -// CHECK:STDOUT: !18 = distinct !DISubprogram(name: "F", linkageName: "_CF:thunk.61ea2aba74ab3bf1:I.Main", scope: null, file: !3, line: 27, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !19 = !DILocation(line: 27, column: 3, scope: !18) -// CHECK:STDOUT: !20 = !DILocation(line: 23, column: 8, scope: !18) -// CHECK:STDOUT: !21 = distinct !DISubprogram(name: "Test", linkageName: "_CTest.Main", scope: null, file: !3, line: 30, type: !5, spFlags: DISPFlagDefinition, unit: !2) -// CHECK:STDOUT: !22 = !DILocation(line: 31, column: 10, scope: !21) -// CHECK:STDOUT: !23 = !DILocation(line: 31, column: 3, scope: !21) +// CHECK:STDOUT: !7 = !DILocation(line: 9, column: 45, scope: !4) +// CHECK:STDOUT: !8 = !DILocation(line: 9, column: 39, scope: !4) +// CHECK:STDOUT: !9 = !DILocation(line: 9, column: 32, scope: !4) +// CHECK:STDOUT: !10 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.B.Main:ImplicitAs.Core", scope: null, file: !3, line: 12, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !11 = !DILocation(line: 12, column: 45, scope: !10) +// CHECK:STDOUT: !12 = !DILocation(line: 12, column: 39, scope: !10) +// CHECK:STDOUT: !13 = !DILocation(line: 12, column: 32, scope: !10) +// CHECK:STDOUT: !14 = distinct !DISubprogram(name: "F", linkageName: "_CF.61ea2aba74ab3bf1:I.Main", scope: null, file: !3, line: 20, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !15 = !DILocation(line: 20, column: 34, scope: !14) +// CHECK:STDOUT: !16 = !DILocation(line: 20, column: 28, scope: !14) +// CHECK:STDOUT: !17 = !DILocation(line: 20, column: 21, scope: !14) +// CHECK:STDOUT: !18 = distinct !DISubprogram(name: "F", linkageName: "_CF:thunk.61ea2aba74ab3bf1:I.Main", scope: null, file: !3, line: 20, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !19 = !DILocation(line: 20, column: 3, scope: !18) +// CHECK:STDOUT: !20 = !DILocation(line: 16, column: 8, scope: !18) +// CHECK:STDOUT: !21 = distinct !DISubprogram(name: "Test", linkageName: "_CTest.Main", scope: null, file: !3, line: 23, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !22 = !DILocation(line: 24, column: 10, scope: !21) +// CHECK:STDOUT: !23 = !DILocation(line: 24, column: 3, scope: !21) +// CHECK:STDOUT: ; ModuleID = 'generic_thunk.carbon' +// CHECK:STDOUT: source_filename = "generic_thunk.carbon" +// CHECK:STDOUT: +// CHECK:STDOUT: @A.val.loc7_46 = internal constant {} zeroinitializer +// CHECK:STDOUT: @B.val.loc18_42 = internal constant {} zeroinitializer +// CHECK:STDOUT: +// CHECK:STDOUT: define void @"_CConvert.B.Main:ImplicitAs.Core"(ptr sret({}) %return, ptr %self) !dbg !4 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %return, ptr align 1 @A.val.loc7_46, i64 0, i1 false), !dbg !7 +// CHECK:STDOUT: ret void, !dbg !7 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: define void @_CCall.Main(ptr sret({}) %return, ptr %c, ptr %b) !dbg !8 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: call void @"_CF:thunk.C.Main:I.Main.e43630e9a6c38c3f"(ptr %return, ptr %c, ptr %b), !dbg !9 +// CHECK:STDOUT: ret void, !dbg !10 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: define void @_CCallCallGeneric.Main(ptr sret({}) %return, ptr %c, ptr %b) !dbg !11 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: call void @_CCallGeneric.Main.9ef6968dffa77413(ptr %return, ptr %c, ptr %b), !dbg !12 +// CHECK:STDOUT: ret void, !dbg !13 +// 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: define linkonce_odr void @"_CF:thunk.C.Main:I.Main.e43630e9a6c38c3f"(ptr sret({}) %return, ptr %self, ptr %x) !dbg !14 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: %.loc18_31.2.temp = alloca {}, align 8, !dbg !15 +// CHECK:STDOUT: call void @"_CConvert.B.Main:ImplicitAs.Core"(ptr %.loc18_31.2.temp, ptr %x), !dbg !15 +// CHECK:STDOUT: %.loc18_31.6.temp = alloca {}, align 8, !dbg !15 +// CHECK:STDOUT: %.loc12_21.1.temp = alloca {}, align 8, !dbg !16 +// CHECK:STDOUT: call void @"_CConvert.B.Main:ImplicitAs.Core"(ptr %.loc12_21.1.temp, ptr %x), !dbg !16 +// CHECK:STDOUT: call void @"_CF.C.Main:I.Main.e43630e9a6c38c3f"(ptr %.loc18_31.6.temp, ptr %self, ptr %.loc12_21.1.temp), !dbg !15 +// CHECK:STDOUT: %.loc18_31.7.temp = alloca {}, align 8, !dbg !15 +// CHECK:STDOUT: call void @"_CConvert.B.Main:ImplicitAs.Core"(ptr %.loc18_31.7.temp, ptr %.loc18_31.6.temp), !dbg !15 +// CHECK:STDOUT: ret void, !dbg !15 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: define linkonce_odr void @_CCallGeneric.Main.9ef6968dffa77413(ptr sret({}) %return, ptr %c, ptr %b) !dbg !17 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: call void @"_CF:thunk.C.Main:I.Main.e43630e9a6c38c3f"(ptr %return, ptr %c, ptr %b), !dbg !18 +// CHECK:STDOUT: ret void, !dbg !19 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: define linkonce_odr void @"_CF.C.Main:I.Main.e43630e9a6c38c3f"(ptr sret({}) %return, ptr %self, ptr %x) !dbg !20 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %return, ptr align 1 @B.val.loc18_42, i64 0, i1 false), !dbg !21 +// CHECK:STDOUT: ret void, !dbg !21 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: attributes #0 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) } +// CHECK:STDOUT: +// CHECK:STDOUT: !llvm.module.flags = !{!0, !1} +// CHECK:STDOUT: !llvm.dbg.cu = !{!2} +// CHECK:STDOUT: +// CHECK:STDOUT: !0 = !{i32 7, !"Dwarf Version", i32 5} +// 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: "generic_thunk.carbon", directory: "") +// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.B.Main:ImplicitAs.Core", scope: null, file: !3, line: 7, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !5 = !DISubroutineType(types: !6) +// CHECK:STDOUT: !6 = !{} +// CHECK:STDOUT: !7 = !DILocation(line: 7, column: 37, scope: !4) +// CHECK:STDOUT: !8 = distinct !DISubprogram(name: "Call", linkageName: "_CCall.Main", scope: null, file: !3, line: 21, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !9 = !DILocation(line: 22, column: 10, scope: !8) +// CHECK:STDOUT: !10 = !DILocation(line: 22, column: 3, scope: !8) +// CHECK:STDOUT: !11 = distinct !DISubprogram(name: "CallCallGeneric", linkageName: "_CCallCallGeneric.Main", scope: null, file: !3, line: 29, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !12 = !DILocation(line: 30, column: 10, scope: !11) +// CHECK:STDOUT: !13 = !DILocation(line: 30, column: 3, scope: !11) +// CHECK:STDOUT: !14 = distinct !DISubprogram(name: "F", linkageName: "_CF:thunk.C.Main:I.Main.e43630e9a6c38c3f", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !15 = !DILocation(line: 18, column: 3, scope: !14) +// CHECK:STDOUT: !16 = !DILocation(line: 12, column: 20, scope: !14) +// CHECK:STDOUT: !17 = distinct !DISubprogram(name: "CallGeneric", linkageName: "_CCallGeneric.Main.9ef6968dffa77413", scope: null, file: !3, line: 25, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !18 = !DILocation(line: 26, column: 10, scope: !17) +// CHECK:STDOUT: !19 = !DILocation(line: 26, column: 3, scope: !17) +// CHECK:STDOUT: !20 = distinct !DISubprogram(name: "F", linkageName: "_CF.C.Main:I.Main.e43630e9a6c38c3f", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2) +// CHECK:STDOUT: !21 = !DILocation(line: 18, column: 33, scope: !20)