From 27849b385c349a0fe2b2ddf790513204e5d32b06 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Thu, 3 Sep 2026 17:45:47 +0000 Subject: [PATCH] Add TemplateInst and drop CallCppTemplateAction (#7689) `TemplateInst` wraps another inst. If that inst is symbolic, it is treated as a template by `OperandDependence`. Use this to replace `CallCppTemplateAction` with the more general `CallAction`. --- toolchain/check/action.cpp | 12 - toolchain/check/call.cpp | 48 ++- toolchain/check/cpp/call.cpp | 14 +- toolchain/check/eval.cpp | 9 + toolchain/check/eval_inst.cpp | 10 + toolchain/check/eval_inst.h | 2 + .../interop/cpp/class/import/template.carbon | 306 +++++++++--------- .../interop/cpp/template/generic_call.carbon | 220 ++++++------- toolchain/lower/constant.cpp | 4 +- toolchain/sem_ir/inst_kind.def | 2 +- toolchain/sem_ir/inst_kind.h | 3 + toolchain/sem_ir/typed_insts.h | 28 +- 12 files changed, 360 insertions(+), 298 deletions(-) diff --git a/toolchain/check/action.cpp b/toolchain/check/action.cpp index 134c82301dde..a60caecf21a7 100644 --- a/toolchain/check/action.cpp +++ b/toolchain/check/action.cpp @@ -126,18 +126,6 @@ static auto OperandDependence(Context& context, SemIR::IdAndKind arg) } auto ActionIsPerformable(Context& context, SemIR::Inst action_inst) -> bool { - if (auto action = action_inst.TryAs()) { - auto args = context.inst_blocks().Get(action->args_id); - for (auto arg : args) { - auto const_id = context.constant_values().Get(arg); - if (const_id.is_symbolic()) { - return false; - } - } - - return true; - } - if (auto refine_action = action_inst.TryAs()) { // `RefineTypeAction` can be performed whenever the type is not template- // dependent, even if we don't know the instruction yet. diff --git a/toolchain/check/call.cpp b/toolchain/check/call.cpp index 56cf74b04b93..b45195ee0021 100644 --- a/toolchain/check/call.cpp +++ b/toolchain/check/call.cpp @@ -307,6 +307,23 @@ auto PerformCallToFunction(Context& context, SemIR::LocId loc_id, } } +// Determines whether a C++ template call can be performed immediately +// (i.e. whether it is non-template-dependent). +static auto IsCppTemplateCallPerformable(Context& context, + SemIR::InstId callee_id, + llvm::ArrayRef arg_ids) + -> bool { + CARBON_CHECK(OperandDependence(context, callee_id) < + SemIR::ConstantDependence::Template); + + for (auto arg_id : arg_ids) { + if (context.constant_values().Get(arg_id).is_symbolic()) { + return false; + } + } + return true; +} + // Performs a call where the callee is a generic type. If it's not a generic // type, produces a diagnostic. static auto PerformCallToNonFunction(Context& context, SemIR::LocId loc_id, @@ -317,8 +334,35 @@ static auto PerformCallToNonFunction(Context& context, SemIR::LocId loc_id, context.types().GetAsInst(context.insts().Get(callee_id).type_id()); CARBON_KIND_SWITCH(type_inst) { case CARBON_KIND(SemIR::CppTemplateNameType template_name): { - return PerformCallToCppTemplateName(context, loc_id, - template_name.decl_id, arg_ids); + if (IsCppTemplateCallPerformable(context, callee_id, arg_ids)) { + return PerformCallToCppTemplateName(context, loc_id, + template_name.decl_id, arg_ids); + } + + llvm::SmallVector inst_ids; + inst_ids.push_back(callee_id); + // Wrap symbolic template args in a `TemplateInst` so that all symbolic + // arguments are treated as templates. + for (auto arg_id : arg_ids) { + if (context.constant_values().Get(arg_id).is_symbolic()) { + auto arg = context.insts().Get(arg_id); + inst_ids.push_back( + AddInst(context, SemIR::LocId(arg_id), + SemIR::TemplateInst{.type_id = arg.type_id(), + .inst_id = arg_id})); + } else { + inst_ids.push_back(arg_id); + } + } + + auto inst_block_id = context.inst_blocks().Add(inst_ids); + return AddDependentActionSplice( + context, loc_id, + SemIR::CallAction{.type_id = SemIR::InstType::TypeId, + .inst_block_id = inst_block_id, + // Unused for non-function calls. + .is_desugared = SemIR::BoolValue::From(false)}, + SemIR::TypeInstId::None); } case CARBON_KIND(SemIR::GenericClassType generic_class): { return PerformCallToGenericClass(context, loc_id, generic_class.class_id, diff --git a/toolchain/check/cpp/call.cpp b/toolchain/check/cpp/call.cpp index 433c32935f28..ae1c89d9ec20 100644 --- a/toolchain/check/cpp/call.cpp +++ b/toolchain/check/cpp/call.cpp @@ -346,22 +346,10 @@ auto PerformCallToCppTemplateName(Context& context, SemIR::LocId loc_id, SemIR::ClangDeclId template_decl_id, llvm::ArrayRef arg_ids) -> SemIR::InstId { - auto args_id = context.inst_blocks().Add(arg_ids); - return HandleAction( - context, loc_id, SemIR::TypeInstId::None, - {.type_id = SemIR::InstType::TypeId, - .template_decl_id = template_decl_id, - .args_id = args_id}); -} - -auto PerformAction(Context& context, SemIR::LocId loc_id, - SemIR::CallCppTemplateAction action) -> SemIR::InstId { auto* template_decl = dyn_cast( - context.clang_decls().Get(action.template_decl_id).decl()); + context.clang_decls().Get(template_decl_id).decl()); auto loc = GetCppLocation(context, loc_id); - auto arg_ids = context.inst_blocks().Get(action.args_id); - // Form a template argument list for this template. clang::TemplateArgumentListInfo arg_list(loc, loc); if (!ConvertArgsToTemplateArgs(context, template_decl, arg_ids, arg_list)) { diff --git a/toolchain/check/eval.cpp b/toolchain/check/eval.cpp index a2fde9b0eb1b..7e8ccbc91ca5 100644 --- a/toolchain/check/eval.cpp +++ b/toolchain/check/eval.cpp @@ -3039,6 +3039,8 @@ static auto ConvertEvalResultToConstantId(Context& context, if (result.is_new()) { auto is_symbolic_only = orig_inst_kind.constant_kind() == SemIR::InstConstantKind::SymbolicOnly; + auto is_template_only = + orig_inst_kind.constant_kind() == SemIR::InstConstantKind::TemplateOnly; auto new_phase = result.same_phase_as_inst() ? orig_phase : ComputeInstPhase(context, result.new_inst()); @@ -3046,6 +3048,13 @@ static auto ConvertEvalResultToConstantId(Context& context, result.new_inst().kind() != orig_inst_kind, "SymbolicOnly instruction `{0}` has a concrete value", orig_inst_kind); + CARBON_CHECK(!is_template_only || new_phase > Phase::Concrete || + result.new_inst().kind() != orig_inst_kind, + "TemplateOnly instruction `{0}` has a concrete value", + orig_inst_kind); + if (is_template_only && new_phase < Phase::TemplateSymbolic) { + new_phase = Phase::TemplateSymbolic; + } return MakeConstantResult(context, result.new_inst(), new_phase); } return result.existing(); diff --git a/toolchain/check/eval_inst.cpp b/toolchain/check/eval_inst.cpp index 27d649ca970a..46c09a156a07 100644 --- a/toolchain/check/eval_inst.cpp +++ b/toolchain/check/eval_inst.cpp @@ -793,6 +793,16 @@ auto EvalConstantInst(Context& /*context*/, SemIR::StructLiteral inst) .type_id = inst.type_id, .elements_id = inst.elements_id}); } +auto EvalConstantInst(Context& context, SemIR::TemplateInst inst) + -> ConstantEvalResult { + auto const_id = context.constant_values().Get(inst.inst_id); + if (const_id.is_concrete()) { + return ConstantEvalResult::Existing(const_id); + } + + return ConstantEvalResult::NewAnyPhase(inst); +} + auto EvalConstantInst(Context& context, SemIR::TupleAccess inst) -> ConstantEvalResult { return PerformAggregateAccess(context, inst); diff --git a/toolchain/check/eval_inst.h b/toolchain/check/eval_inst.h index c579a4cd62a1..9a029871a6d1 100644 --- a/toolchain/check/eval_inst.h +++ b/toolchain/check/eval_inst.h @@ -113,6 +113,7 @@ constexpr auto ConstantKindHasEvalConstantInst(SemIR::InstConstantKind kind) case SemIR::InstConstantKind::Indirect: case SemIR::InstConstantKind::SymbolicOnly: case SemIR::InstConstantKind::SymbolicOrReference: + case SemIR::InstConstantKind::TemplateOnly: case SemIR::InstConstantKind::Conditional: case SemIR::InstConstantKind::ConditionalUnique: return true; @@ -163,6 +164,7 @@ auto EvalConstantInst() -> void = delete; // - InstConstantKind::Indirect // - InstConstantKind::SymbolicOnly // - InstConstantKind::SymbolicOrReference +// - InstConstantKind::TemplateOnly // - InstConstantKind::Conditional // - InstConstantKind::ConditionalUnique // diff --git a/toolchain/check/testdata/interop/cpp/class/import/template.carbon b/toolchain/check/testdata/interop/cpp/class/import/template.carbon index 3e6fc0d92cda..c3adcb04b0fb 100644 --- a/toolchain/check/testdata/interop/cpp/class/import/template.carbon +++ b/toolchain/check/testdata/interop/cpp/class/import/template.carbon @@ -341,12 +341,13 @@ fn G() { // CHECK:STDOUT: %B.60e: type = class_type @B, @B(%T) [symbolic] // CHECK:STDOUT: %A.type: type = cpp_type_template_type A [concrete] // CHECK:STDOUT: %A.template: %A.type = struct_value () [concrete] -// CHECK:STDOUT: %.ae6: @B.%.loc12_17.4 (@B.%.loc12_17.4) = splice_inst @B.%.loc12_17.3 [template] -// CHECK:STDOUT: %.535: type = splice_inst @B.%.loc12_17.6 [template] -// CHECK:STDOUT: %require_complete.01e: = require_complete_type %.535 [template] -// CHECK:STDOUT: %B.elem.7af: type = unbound_element_type %B.60e, %.535 [template] -// CHECK:STDOUT: %struct_type.a.be9: type = struct_type {.a: %.535} [template] -// CHECK:STDOUT: %complete_type.7ab: = complete_type_witness %struct_type.a.be9 [template] +// CHECK:STDOUT: %.a92: type = template_inst %T [template] +// CHECK:STDOUT: %.8af: @B.%.loc12_17.4 (@B.%.loc12_17.4) = splice_inst @B.%.loc12_17.3 [template] +// CHECK:STDOUT: %.897: type = splice_inst @B.%.loc12_17.6 [template] +// CHECK:STDOUT: %require_complete.5f2: = require_complete_type %.897 [template] +// CHECK:STDOUT: %B.elem.a93: type = unbound_element_type %B.60e, %.897 [template] +// CHECK:STDOUT: %struct_type.a.33e: type = struct_type {.a: %.897} [template] +// CHECK:STDOUT: %complete_type.6a6: = complete_type_witness %struct_type.a.33e [template] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %B.bd8: type = class_type @B, @B(%i32) [concrete] @@ -425,26 +426,28 @@ fn G() { // CHECK:STDOUT: %T.loc11_10.1: type = symbolic_binding T, 0 [symbolic = %T.loc11_10.1 (constants.%T)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %.loc12_17.3: = call_template_action clang_decl_id4C000002, (%T.loc11_10.1) [template] +// CHECK:STDOUT: %.loc12_16.2: type = template_inst %T.loc11_10.1 [template = %.loc12_16.2 (constants.%.a92)] +// CHECK:STDOUT: %.loc12_17.3: = call_action (%A.ref, %.loc12_16.1), false [template] // CHECK:STDOUT: %.loc12_17.4: type = type_of_inst %.loc12_17.3 [template] -// CHECK:STDOUT: %.loc12_17.5: @B.%.loc12_17.4 (@B.%.loc12_17.4) = splice_inst %.loc12_17.3 [template = %.loc12_17.5 (constants.%.ae6)] +// CHECK:STDOUT: %.loc12_17.5: @B.%.loc12_17.4 (@B.%.loc12_17.4) = splice_inst %.loc12_17.3 [template = %.loc12_17.5 (constants.%.8af)] // CHECK:STDOUT: %.loc12_17.6: = convert_to_value_action %.loc12_17.1, type [template] -// CHECK:STDOUT: %.loc12_17.7: type = splice_inst %.loc12_17.6 [template = %.loc12_17.7 (constants.%.535)] -// CHECK:STDOUT: %require_complete: = require_complete_type %.loc12_17.7 [template = %require_complete (constants.%require_complete.01e)] +// CHECK:STDOUT: %.loc12_17.7: type = splice_inst %.loc12_17.6 [template = %.loc12_17.7 (constants.%.897)] +// CHECK:STDOUT: %require_complete: = require_complete_type %.loc12_17.7 [template = %require_complete (constants.%require_complete.5f2)] // CHECK:STDOUT: %B: type = class_type @B, @B(%T.loc11_10.1) [symbolic = %B (constants.%B.60e)] -// CHECK:STDOUT: %B.elem: type = unbound_element_type %B, %.loc12_17.7 [template = %B.elem (constants.%B.elem.7af)] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: @B.%.loc12_17.7 (%.535)} [template = %struct_type.a (constants.%struct_type.a.be9)] -// CHECK:STDOUT: %complete_type.loc13_1.2: = complete_type_witness %struct_type.a [template = %complete_type.loc13_1.2 (constants.%complete_type.7ab)] +// CHECK:STDOUT: %B.elem: type = unbound_element_type %B, %.loc12_17.7 [template = %B.elem (constants.%B.elem.a93)] +// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: @B.%.loc12_17.7 (%.897)} [template = %struct_type.a (constants.%struct_type.a.33e)] +// CHECK:STDOUT: %complete_type.loc13_1.2: = complete_type_witness %struct_type.a [template = %complete_type.loc13_1.2 (constants.%complete_type.6a6)] // CHECK:STDOUT: // CHECK:STDOUT: class { -// CHECK:STDOUT: %field_decl: @B.%B.elem (%B.elem.7af) = field_decl a, element0, %.loc12_17.2 in [concrete] { +// CHECK:STDOUT: %field_decl: @B.%B.elem (%B.elem.a93) = field_decl a, element0, %.loc12_17.2 in [concrete] { // CHECK:STDOUT: %Cpp.ref: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] // CHECK:STDOUT: %A.ref: %A.type = name_ref A, imports.%A.template [concrete = constants.%A.template] // CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc11_10.2 [symbolic = %T.loc11_10.1 (constants.%T)] -// CHECK:STDOUT: %.loc12_17.1: @B.%.loc12_17.4 (@B.%.loc12_17.4) = splice_inst %.loc12_17.3 [template = %.loc12_17.5 (constants.%.ae6)] -// CHECK:STDOUT: %.loc12_17.2: type = splice_inst %.loc12_17.6 [template = %.loc12_17.7 (constants.%.535)] +// CHECK:STDOUT: %.loc12_16.1: type = template_inst %T.ref [template = %.loc12_16.2 (constants.%.a92)] +// CHECK:STDOUT: %.loc12_17.1: @B.%.loc12_17.4 (@B.%.loc12_17.4) = splice_inst %.loc12_17.3 [template = %.loc12_17.5 (constants.%.8af)] +// CHECK:STDOUT: %.loc12_17.2: type = splice_inst %.loc12_17.6 [template = %.loc12_17.7 (constants.%.897)] // CHECK:STDOUT: } -// CHECK:STDOUT: %complete_type.loc13_1.1: = complete_type_witness constants.%struct_type.a.be9 [template = %complete_type.loc13_1.2 (constants.%complete_type.7ab)] +// CHECK:STDOUT: %complete_type.loc13_1.1: = complete_type_witness constants.%struct_type.a.33e [template = %complete_type.loc13_1.2 (constants.%complete_type.6a6)] // CHECK:STDOUT: complete_type_witness = %complete_type.loc13_1.1 // CHECK:STDOUT: // CHECK:STDOUT: !members: @@ -482,6 +485,7 @@ fn G() { // CHECK:STDOUT: %T.loc11_10.1 => constants.%i32 // CHECK:STDOUT: // CHECK:STDOUT: !definition: +// CHECK:STDOUT: %.loc12_16.2 => constants.%i32 // CHECK:STDOUT: %.loc12_17.3 => constants.%inst.splice_block.72d // CHECK:STDOUT: %.loc12_17.4 => type // CHECK:STDOUT: %.loc12_17.5 => constants.%A @@ -507,15 +511,16 @@ fn G() { // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %A.type: type = cpp_type_template_type A [concrete] // CHECK:STDOUT: %A.template: %A.type = struct_value () [concrete] -// CHECK:STDOUT: %.ae6cd7.1: @F.%.loc10_24.5 (@F.%.loc10_24.5) = splice_inst @F.%.loc10_24.4 [template] -// CHECK:STDOUT: %.535: type = splice_inst @F.%.loc10_24.7 [template] -// CHECK:STDOUT: %require_complete.01e: = require_complete_type %.535 [template] -// CHECK:STDOUT: %pattern_type.281: type = pattern_type %.535 [template] -// CHECK:STDOUT: %a.patt.4ab: %pattern_type.281 = value_binding_pattern a [template] -// CHECK:STDOUT: %.ae6cd7.2: @F.%.loc10_35.3 (@F.%.loc10_35.3) = splice_inst @F.%.loc10_35.2 [template] -// CHECK:STDOUT: %.4bf: @F.%.loc10_36.3 (@F.%.loc10_36.3) = splice_inst @F.%.loc10_36.2 [template] -// CHECK:STDOUT: %.7cc: @F.%.loc10_39.4 (@F.%.loc10_39.4) = splice_inst @F.%.loc10_39.3 [template] -// CHECK:STDOUT: %.14b: %.535 = splice_inst @F.%.loc10_39.6 [template] +// CHECK:STDOUT: %.a92: type = template_inst %T [template] +// CHECK:STDOUT: %.8af9c5.1: @F.%.loc10_24.5 (@F.%.loc10_24.5) = splice_inst @F.%.loc10_24.4 [template] +// CHECK:STDOUT: %.897: type = splice_inst @F.%.loc10_24.7 [template] +// CHECK:STDOUT: %require_complete.5f2: = require_complete_type %.897 [template] +// CHECK:STDOUT: %pattern_type.463: type = pattern_type %.897 [template] +// CHECK:STDOUT: %a.patt.d00: %pattern_type.463 = value_binding_pattern a [template] +// CHECK:STDOUT: %.8af9c5.2: @F.%.loc10_35.3 (@F.%.loc10_35.3) = splice_inst @F.%.loc10_35.2 [template] +// CHECK:STDOUT: %.c84: @F.%.loc10_36.3 (@F.%.loc10_36.3) = splice_inst @F.%.loc10_36.2 [template] +// CHECK:STDOUT: %.47d: @F.%.loc10_39.4 (@F.%.loc10_39.4) = splice_inst @F.%.loc10_39.3 [template] +// CHECK:STDOUT: %.bdb: %.897 = splice_inst @F.%.loc10_39.6 [template] // CHECK:STDOUT: %G.type: type = fn_type @G [concrete] // CHECK:STDOUT: %G: %G.type = struct_value () [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] @@ -592,45 +597,48 @@ fn G() { // CHECK:STDOUT: %T.loc9_15.1: type = symbolic_binding T, 0 [symbolic = %T.loc9_15.1 (constants.%T)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %.loc10_24.4: = call_template_action clang_decl_id6C000002, (%T.loc9_15.1) [template] +// CHECK:STDOUT: %.loc10_23.2: type = template_inst %T.loc9_15.1 [template = %.loc10_23.2 (constants.%.a92)] +// CHECK:STDOUT: %.loc10_24.4: = call_action (%A.ref.loc10_20, %.loc10_23.1), false [template] // CHECK:STDOUT: %.loc10_24.5: type = type_of_inst %.loc10_24.4 [template] -// CHECK:STDOUT: %.loc10_24.6: @F.%.loc10_24.5 (@F.%.loc10_24.5) = splice_inst %.loc10_24.4 [template = %.loc10_24.6 (constants.%.ae6cd7.1)] +// CHECK:STDOUT: %.loc10_24.6: @F.%.loc10_24.5 (@F.%.loc10_24.5) = splice_inst %.loc10_24.4 [template = %.loc10_24.6 (constants.%.8af9c5.1)] // CHECK:STDOUT: %.loc10_24.7: = convert_to_value_action %.loc10_24.2, type [template] -// CHECK:STDOUT: %.loc10_24.8: type = splice_inst %.loc10_24.7 [template = %.loc10_24.8 (constants.%.535)] -// CHECK:STDOUT: %require_complete: = require_complete_type %.loc10_24.8 [template = %require_complete (constants.%require_complete.01e)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %.loc10_24.8 [template = %pattern_type (constants.%pattern_type.281)] -// CHECK:STDOUT: %a.patt.loc10_15.2: @F.%pattern_type (%pattern_type.281) = value_binding_pattern a [template = %a.patt.loc10_15.2 (constants.%a.patt.4ab)] -// CHECK:STDOUT: %.loc10_35.2: = call_template_action clang_decl_id6C000002, (%T.loc9_15.1) [template] +// CHECK:STDOUT: %.loc10_24.8: type = splice_inst %.loc10_24.7 [template = %.loc10_24.8 (constants.%.897)] +// CHECK:STDOUT: %require_complete: = require_complete_type %.loc10_24.8 [template = %require_complete (constants.%require_complete.5f2)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %.loc10_24.8 [template = %pattern_type (constants.%pattern_type.463)] +// CHECK:STDOUT: %a.patt.loc10_15.2: @F.%pattern_type (%pattern_type.463) = value_binding_pattern a [template = %a.patt.loc10_15.2 (constants.%a.patt.d00)] +// CHECK:STDOUT: %.loc10_35.2: = call_action (%A.ref.loc10_31, %.loc10_34), false [template] // CHECK:STDOUT: %.loc10_35.3: type = type_of_inst %.loc10_35.2 [template] -// CHECK:STDOUT: %.loc10_35.4: @F.%.loc10_35.3 (@F.%.loc10_35.3) = splice_inst %.loc10_35.2 [template = %.loc10_35.4 (constants.%.ae6cd7.2)] +// CHECK:STDOUT: %.loc10_35.4: @F.%.loc10_35.3 (@F.%.loc10_35.3) = splice_inst %.loc10_35.2 [template = %.loc10_35.4 (constants.%.8af9c5.2)] // CHECK:STDOUT: %.loc10_36.2: = access_member_action %.loc10_35.1, A [template] // CHECK:STDOUT: %.loc10_36.3: type = type_of_inst %.loc10_36.2 [template] -// CHECK:STDOUT: %.loc10_36.4: @F.%.loc10_36.3 (@F.%.loc10_36.3) = splice_inst %.loc10_36.2 [template = %.loc10_36.4 (constants.%.4bf)] +// CHECK:STDOUT: %.loc10_36.4: @F.%.loc10_36.3 (@F.%.loc10_36.3) = splice_inst %.loc10_36.2 [template = %.loc10_36.4 (constants.%.c84)] // CHECK:STDOUT: %.loc10_39.3: = call_action (%.loc10_36.1), false [template] // CHECK:STDOUT: %.loc10_39.4: type = type_of_inst %.loc10_39.3 [template] -// CHECK:STDOUT: %.loc10_39.5: @F.%.loc10_39.4 (@F.%.loc10_39.4) = splice_inst %.loc10_39.3 [template = %.loc10_39.5 (constants.%.7cc)] +// CHECK:STDOUT: %.loc10_39.5: @F.%.loc10_39.4 (@F.%.loc10_39.4) = splice_inst %.loc10_39.3 [template = %.loc10_39.5 (constants.%.47d)] // CHECK:STDOUT: %.loc10_39.6: = convert_to_value_action %.loc10_39.1, %.loc10_24.8 [template] -// CHECK:STDOUT: %.loc10_39.7: @F.%.loc10_24.8 (%.535) = splice_inst %.loc10_39.6 [template = %.loc10_39.7 (constants.%.14b)] +// CHECK:STDOUT: %.loc10_39.7: @F.%.loc10_24.8 (%.897) = splice_inst %.loc10_39.6 [template = %.loc10_39.7 (constants.%.bdb)] // CHECK:STDOUT: // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %Cpp.ref.loc10_28: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] // CHECK:STDOUT: %A.ref.loc10_31: %A.type = name_ref A, imports.%A.template [concrete = constants.%A.template] // CHECK:STDOUT: %T.ref.loc10_34: type = name_ref T, %T.loc9_15.2 [symbolic = %T.loc9_15.1 (constants.%T)] -// CHECK:STDOUT: %.loc10_35.1: @F.%.loc10_35.3 (@F.%.loc10_35.3) = splice_inst %.loc10_35.2 [template = %.loc10_35.4 (constants.%.ae6cd7.2)] -// CHECK:STDOUT: %.loc10_36.1: @F.%.loc10_36.3 (@F.%.loc10_36.3) = splice_inst %.loc10_36.2 [template = %.loc10_36.4 (constants.%.4bf)] -// CHECK:STDOUT: %.loc10_39.1: @F.%.loc10_39.4 (@F.%.loc10_39.4) = splice_inst %.loc10_39.3 [template = %.loc10_39.5 (constants.%.7cc)] -// CHECK:STDOUT: %.loc10_39.2: @F.%.loc10_24.8 (%.535) = splice_inst %.loc10_39.6 [template = %.loc10_39.7 (constants.%.14b)] -// CHECK:STDOUT: %.loc10_24.1: type = splice_block %.loc10_24.3 [template = %.loc10_24.8 (constants.%.535)] { +// CHECK:STDOUT: %.loc10_34: type = template_inst %T.ref.loc10_34 [template = %.loc10_23.2 (constants.%.a92)] +// CHECK:STDOUT: %.loc10_35.1: @F.%.loc10_35.3 (@F.%.loc10_35.3) = splice_inst %.loc10_35.2 [template = %.loc10_35.4 (constants.%.8af9c5.2)] +// CHECK:STDOUT: %.loc10_36.1: @F.%.loc10_36.3 (@F.%.loc10_36.3) = splice_inst %.loc10_36.2 [template = %.loc10_36.4 (constants.%.c84)] +// CHECK:STDOUT: %.loc10_39.1: @F.%.loc10_39.4 (@F.%.loc10_39.4) = splice_inst %.loc10_39.3 [template = %.loc10_39.5 (constants.%.47d)] +// CHECK:STDOUT: %.loc10_39.2: @F.%.loc10_24.8 (%.897) = splice_inst %.loc10_39.6 [template = %.loc10_39.7 (constants.%.bdb)] +// CHECK:STDOUT: %.loc10_24.1: type = splice_block %.loc10_24.3 [template = %.loc10_24.8 (constants.%.897)] { // CHECK:STDOUT: %Cpp.ref.loc10_17: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] // CHECK:STDOUT: %A.ref.loc10_20: %A.type = name_ref A, imports.%A.template [concrete = constants.%A.template] // CHECK:STDOUT: %T.ref.loc10_23: type = name_ref T, %T.loc9_15.2 [symbolic = %T.loc9_15.1 (constants.%T)] -// CHECK:STDOUT: %.loc10_24.2: @F.%.loc10_24.5 (@F.%.loc10_24.5) = splice_inst %.loc10_24.4 [template = %.loc10_24.6 (constants.%.ae6cd7.1)] -// CHECK:STDOUT: %.loc10_24.3: type = splice_inst %.loc10_24.7 [template = %.loc10_24.8 (constants.%.535)] +// CHECK:STDOUT: %.loc10_23.1: type = template_inst %T.ref.loc10_23 [template = %.loc10_23.2 (constants.%.a92)] +// CHECK:STDOUT: %.loc10_24.2: @F.%.loc10_24.5 (@F.%.loc10_24.5) = splice_inst %.loc10_24.4 [template = %.loc10_24.6 (constants.%.8af9c5.1)] +// CHECK:STDOUT: %.loc10_24.3: type = splice_inst %.loc10_24.7 [template = %.loc10_24.8 (constants.%.897)] // CHECK:STDOUT: } -// CHECK:STDOUT: %a: @F.%.loc10_24.8 (%.535) = wrapper_binding a, %.loc10_39.2 +// CHECK:STDOUT: %a: @F.%.loc10_24.8 (%.897) = wrapper_binding a, %.loc10_39.2 // CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %a.patt.loc10_15.1: @F.%pattern_type (%pattern_type.281) = value_binding_pattern a [template = %a.patt.loc10_15.2 (constants.%a.patt.4ab)] +// CHECK:STDOUT: %a.patt.loc10_15.1: @F.%pattern_type (%pattern_type.463) = value_binding_pattern a [template = %a.patt.loc10_15.2 (constants.%a.patt.d00)] // CHECK:STDOUT: } // CHECK:STDOUT: return // CHECK:STDOUT: } @@ -655,6 +663,7 @@ fn G() { // CHECK:STDOUT: %T.loc9_15.1 => constants.%i32 // CHECK:STDOUT: // CHECK:STDOUT: !definition: +// CHECK:STDOUT: %.loc10_23.2 => constants.%i32 // CHECK:STDOUT: %.loc10_24.4 => constants.%inst.splice_block.72dff3.1 // CHECK:STDOUT: %.loc10_24.5 => type // CHECK:STDOUT: %.loc10_24.6 => constants.%A @@ -689,32 +698,33 @@ fn G() { // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %A.type: type = cpp_type_template_type A [concrete] // CHECK:STDOUT: %A.template: %A.type = struct_value () [concrete] -// CHECK:STDOUT: %.ae6cd7.1: @F.%.loc10_24.5 (@F.%.loc10_24.5) = splice_inst @F.%.loc10_24.4 [template] -// CHECK:STDOUT: %.535: type = splice_inst @F.%.loc10_24.7 [template] -// CHECK:STDOUT: %require_complete.01e: = require_complete_type %.535 [template] -// CHECK:STDOUT: %pattern_type.281: type = pattern_type %.535 [template] -// CHECK:STDOUT: %a.patt.44a: %pattern_type.281 = ref_binding_pattern a [template] -// CHECK:STDOUT: %a.var_patt.5fb: %pattern_type.281 = var_pattern %a.patt.44a [template] -// CHECK:STDOUT: %.ae6cd7.2: @F.%.loc10_35.3 (@F.%.loc10_35.3) = splice_inst @F.%.loc10_35.2 [template] -// CHECK:STDOUT: %.4bf: @F.%.loc10_36.3 (@F.%.loc10_36.3) = splice_inst @F.%.loc10_36.2 [template] -// CHECK:STDOUT: %.7cc: @F.%.loc10_39.3 (@F.%.loc10_39.3) = splice_inst @F.%.loc10_39.2 [template] +// CHECK:STDOUT: %.a92: type = template_inst %T [template] +// CHECK:STDOUT: %.8af9c5.1: @F.%.loc10_24.5 (@F.%.loc10_24.5) = splice_inst @F.%.loc10_24.4 [template] +// CHECK:STDOUT: %.897: type = splice_inst @F.%.loc10_24.7 [template] +// CHECK:STDOUT: %require_complete.5f2: = require_complete_type %.897 [template] +// CHECK:STDOUT: %pattern_type.463: type = pattern_type %.897 [template] +// CHECK:STDOUT: %a.patt.577: %pattern_type.463 = ref_binding_pattern a [template] +// CHECK:STDOUT: %a.var_patt.c6d: %pattern_type.463 = var_pattern %a.patt.577 [template] +// CHECK:STDOUT: %.8af9c5.2: @F.%.loc10_35.3 (@F.%.loc10_35.3) = splice_inst @F.%.loc10_35.2 [template] +// CHECK:STDOUT: %.c84: @F.%.loc10_36.3 (@F.%.loc10_36.3) = splice_inst @F.%.loc10_36.2 [template] +// CHECK:STDOUT: %.47d: @F.%.loc10_39.3 (@F.%.loc10_39.3) = splice_inst @F.%.loc10_39.2 [template] // CHECK:STDOUT: %ImplicitAs.type.0ff: type = generic_interface_type @ImplicitAs [concrete] // CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.0ff = struct_value () [concrete] -// CHECK:STDOUT: %.847f2c.1: @F.%.loc10_3.12 (@F.%.loc10_3.12) = splice_inst @F.%.loc10_3.11 [template] -// CHECK:STDOUT: %.7fa0c8.1: @F.%.loc10_3.15 (@F.%.loc10_3.15) = splice_inst @F.%.loc10_3.14 [template] -// CHECK:STDOUT: %.8da: @F.%.loc10_3.18 (@F.%.loc10_3.18) = splice_inst @F.%.loc10_3.17 [template] -// CHECK:STDOUT: %.9e9: @F.%.loc10_3.21 (@F.%.loc10_3.21) = splice_inst @F.%.loc10_3.20 [template] -// CHECK:STDOUT: %.9f8: %.535 = splice_inst @F.%.loc10_3.23 [template] -// CHECK:STDOUT: %.073: %.535 = splice_inst @F.%.loc10_3.25 [template] +// CHECK:STDOUT: %.20c9c2.1: @F.%.loc10_3.12 (@F.%.loc10_3.12) = splice_inst @F.%.loc10_3.11 [template] +// CHECK:STDOUT: %.c16b39.1: @F.%.loc10_3.15 (@F.%.loc10_3.15) = splice_inst @F.%.loc10_3.14 [template] +// CHECK:STDOUT: %.5f8: @F.%.loc10_3.18 (@F.%.loc10_3.18) = splice_inst @F.%.loc10_3.17 [template] +// CHECK:STDOUT: %.fde: @F.%.loc10_3.21 (@F.%.loc10_3.21) = splice_inst @F.%.loc10_3.20 [template] +// CHECK:STDOUT: %.0cf: %.897 = splice_inst @F.%.loc10_3.23 [template] +// CHECK:STDOUT: %.74f: %.897 = splice_inst @F.%.loc10_3.25 [template] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %Self.0e7: %Destroy.type = symbolic_binding Self, 0 [symbolic] // CHECK:STDOUT: %Destroy.WithSelf.Op.type.d3e: type = fn_type @Destroy.WithSelf.Op, @Destroy.WithSelf(%Self.0e7) [symbolic] // CHECK:STDOUT: %Destroy.WithSelf.Op.42b: %Destroy.WithSelf.Op.type.d3e = struct_value () [symbolic] // CHECK:STDOUT: %Destroy.assoc_type: type = assoc_entity_type @Destroy [concrete] // CHECK:STDOUT: %assoc0.ae8: %Destroy.assoc_type = assoc_entity element0, imports.%Core.import_ref.918 [concrete] -// CHECK:STDOUT: %.cb8: %.535 = splice_inst @F.%.loc10_3.27 [template] -// CHECK:STDOUT: %.495: @F.%.loc10_3.30 (@F.%.loc10_3.30) = splice_inst @F.%.loc10_3.29 [template] -// CHECK:STDOUT: %.013: @F.%.loc10_3.33 (@F.%.loc10_3.33) = splice_inst @F.%.loc10_3.32 [template] +// CHECK:STDOUT: %.de4: %.897 = splice_inst @F.%.loc10_3.27 [template] +// CHECK:STDOUT: %.040: @F.%.loc10_3.30 (@F.%.loc10_3.30) = splice_inst @F.%.loc10_3.29 [template] +// CHECK:STDOUT: %.b87: @F.%.loc10_3.33 (@F.%.loc10_3.33) = splice_inst @F.%.loc10_3.32 [template] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %A: type = class_type @A [concrete] @@ -748,26 +758,26 @@ fn G() { // CHECK:STDOUT: %.38d: init %A to %.3a8 = mark_in_place_init %A__carbon_thunk.call // CHECK:STDOUT: } // CHECK:STDOUT: } -// CHECK:STDOUT: %.04f: = call_action (%ImplicitAs.generic, %.535), false [template] -// CHECK:STDOUT: %.5a1: type = type_of_inst %.04f [template] -// CHECK:STDOUT: %.847f2c.2: %.5a1 = splice_inst %.04f [template] -// CHECK:STDOUT: %.5d9: = access_member_action %.847f2c.2, Convert [template] -// CHECK:STDOUT: %.831: type = type_of_inst %.5d9 [template] -// CHECK:STDOUT: %.7fa0c8.2: %.831 = splice_inst %.5d9 [template] -// CHECK:STDOUT: %.98e: = compound_member_access_action %.78f, %.7fa0c8.2 [template] -// CHECK:STDOUT: %.81d: type = type_of_inst %.98e [template] -// CHECK:STDOUT: %.472: %.81d = splice_inst %.98e [template] -// CHECK:STDOUT: %.6bc: = call_action (%.472), true [template] -// CHECK:STDOUT: %.133: type = type_of_inst %.6bc [template] -// CHECK:STDOUT: %.da3: %.133 = splice_inst %.6bc [template] -// CHECK:STDOUT: %.d73: %A = splice_inst %.6bc [template] -// CHECK:STDOUT: %inst.as_compatible.7b3: = inst_value [concrete] { -// CHECK:STDOUT: %.4c2: %A = as_compatible %.da3 [template = %.d73] +// CHECK:STDOUT: %.ca0: = call_action (%ImplicitAs.generic, %.897), false [template] +// CHECK:STDOUT: %.d2c: type = type_of_inst %.ca0 [template] +// CHECK:STDOUT: %.20c9c2.2: %.d2c = splice_inst %.ca0 [template] +// CHECK:STDOUT: %.da6: = access_member_action %.20c9c2.2, Convert [template] +// CHECK:STDOUT: %.aaf: type = type_of_inst %.da6 [template] +// CHECK:STDOUT: %.c16b39.2: %.aaf = splice_inst %.da6 [template] +// CHECK:STDOUT: %.ba2: = compound_member_access_action %.78f, %.c16b39.2 [template] +// CHECK:STDOUT: %.d40: type = type_of_inst %.ba2 [template] +// CHECK:STDOUT: %.5da: %.d40 = splice_inst %.ba2 [template] +// CHECK:STDOUT: %.117: = call_action (%.5da), true [template] +// CHECK:STDOUT: %.f91: type = type_of_inst %.117 [template] +// CHECK:STDOUT: %.519: %.f91 = splice_inst %.117 [template] +// CHECK:STDOUT: %.f0f: %A = splice_inst %.117 [template] +// CHECK:STDOUT: %inst.as_compatible.79b: = inst_value [concrete] { +// CHECK:STDOUT: %.c2b: %A = as_compatible %.519 [template = %.f0f] // CHECK:STDOUT: } -// CHECK:STDOUT: %.33e: = convert_to_category_action %.d73, element10 [template] -// CHECK:STDOUT: %.4ee: %A = splice_inst %.33e [template] -// CHECK:STDOUT: %inst.as_compatible.b4e: = inst_value [concrete] { -// CHECK:STDOUT: %.463: ref %A = as_compatible @F.%a.var +// CHECK:STDOUT: %.7b9: = convert_to_category_action %.f0f, element10 [template] +// CHECK:STDOUT: %.a12: %A = splice_inst %.7b9 [template] +// CHECK:STDOUT: %inst.as_compatible.e4d: = inst_value [concrete] { +// CHECK:STDOUT: %.568: ref %A = as_compatible @F.%a.var // CHECK:STDOUT: } // CHECK:STDOUT: %A.cpp_destructor.type: type = fn_type @A.cpp_destructor [concrete] // CHECK:STDOUT: %A.cpp_destructor: %A.cpp_destructor.type = struct_value () [concrete] @@ -775,14 +785,14 @@ fn G() { // CHECK:STDOUT: %Destroy.facet.bf5: %Destroy.type = facet_value %A, (%custom_witness.294) [concrete] // CHECK:STDOUT: %Destroy.WithSelf.Op.type.d24: type = fn_type @Destroy.WithSelf.Op, @Destroy.WithSelf(%Destroy.facet.bf5) [concrete] // CHECK:STDOUT: %.429: type = fn_type_with_self_type %Destroy.WithSelf.Op.type.d24, %Destroy.facet.bf5 [concrete] -// CHECK:STDOUT: %inst.splice_block.688: = inst_value [concrete] { -// CHECK:STDOUT: %.471: = splice_block %bound_method { +// CHECK:STDOUT: %inst.splice_block.b0b: = inst_value [concrete] { +// CHECK:STDOUT: %.4fc: = splice_block %bound_method { // CHECK:STDOUT: %impl.elem0: %.429 = impl_witness_access %custom_witness.294, element0 [concrete = %A.cpp_destructor] -// CHECK:STDOUT: %bound_method: = bound_method %.463, %impl.elem0 +// CHECK:STDOUT: %bound_method: = bound_method %.568, %impl.elem0 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: %inst.call: = inst_value [concrete] { -// CHECK:STDOUT: %A.cpp_destructor.call: init %empty_tuple.type = call %.471(%.463) +// CHECK:STDOUT: %A.cpp_destructor.call: init %empty_tuple.type = call %.4fc(%.568) // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -819,81 +829,84 @@ fn G() { // CHECK:STDOUT: %T.loc9_15.1: type = symbolic_binding T, 0 [symbolic = %T.loc9_15.1 (constants.%T)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %.loc10_24.4: = call_template_action clang_decl_id5C000002, (%T.loc9_15.1) [template] +// CHECK:STDOUT: %.loc10_23.2: type = template_inst %T.loc9_15.1 [template = %.loc10_23.2 (constants.%.a92)] +// CHECK:STDOUT: %.loc10_24.4: = call_action (%A.ref.loc10_20, %.loc10_23.1), false [template] // CHECK:STDOUT: %.loc10_24.5: type = type_of_inst %.loc10_24.4 [template] -// CHECK:STDOUT: %.loc10_24.6: @F.%.loc10_24.5 (@F.%.loc10_24.5) = splice_inst %.loc10_24.4 [template = %.loc10_24.6 (constants.%.ae6cd7.1)] +// CHECK:STDOUT: %.loc10_24.6: @F.%.loc10_24.5 (@F.%.loc10_24.5) = splice_inst %.loc10_24.4 [template = %.loc10_24.6 (constants.%.8af9c5.1)] // CHECK:STDOUT: %.loc10_24.7: = convert_to_value_action %.loc10_24.2, type [template] -// CHECK:STDOUT: %.loc10_24.8: type = splice_inst %.loc10_24.7 [template = %.loc10_24.8 (constants.%.535)] -// CHECK:STDOUT: %require_complete: = require_complete_type %.loc10_24.8 [template = %require_complete (constants.%require_complete.01e)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %.loc10_24.8 [template = %pattern_type (constants.%pattern_type.281)] -// CHECK:STDOUT: %a.patt.loc10_15.2: @F.%pattern_type (%pattern_type.281) = ref_binding_pattern a [template = %a.patt.loc10_15.2 (constants.%a.patt.44a)] -// CHECK:STDOUT: %a.var_patt.loc10_3.2: @F.%pattern_type (%pattern_type.281) = var_pattern %a.patt.loc10_15.2 [template = %a.var_patt.loc10_3.2 (constants.%a.var_patt.5fb)] -// CHECK:STDOUT: %.loc10_35.2: = call_template_action clang_decl_id5C000002, (%T.loc9_15.1) [template] +// CHECK:STDOUT: %.loc10_24.8: type = splice_inst %.loc10_24.7 [template = %.loc10_24.8 (constants.%.897)] +// CHECK:STDOUT: %require_complete: = require_complete_type %.loc10_24.8 [template = %require_complete (constants.%require_complete.5f2)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %.loc10_24.8 [template = %pattern_type (constants.%pattern_type.463)] +// CHECK:STDOUT: %a.patt.loc10_15.2: @F.%pattern_type (%pattern_type.463) = ref_binding_pattern a [template = %a.patt.loc10_15.2 (constants.%a.patt.577)] +// CHECK:STDOUT: %a.var_patt.loc10_3.2: @F.%pattern_type (%pattern_type.463) = var_pattern %a.patt.loc10_15.2 [template = %a.var_patt.loc10_3.2 (constants.%a.var_patt.c6d)] +// CHECK:STDOUT: %.loc10_35.2: = call_action (%A.ref.loc10_31, %.loc10_34), false [template] // CHECK:STDOUT: %.loc10_35.3: type = type_of_inst %.loc10_35.2 [template] -// CHECK:STDOUT: %.loc10_35.4: @F.%.loc10_35.3 (@F.%.loc10_35.3) = splice_inst %.loc10_35.2 [template = %.loc10_35.4 (constants.%.ae6cd7.2)] +// CHECK:STDOUT: %.loc10_35.4: @F.%.loc10_35.3 (@F.%.loc10_35.3) = splice_inst %.loc10_35.2 [template = %.loc10_35.4 (constants.%.8af9c5.2)] // CHECK:STDOUT: %.loc10_36.2: = access_member_action %.loc10_35.1, A [template] // CHECK:STDOUT: %.loc10_36.3: type = type_of_inst %.loc10_36.2 [template] -// CHECK:STDOUT: %.loc10_36.4: @F.%.loc10_36.3 (@F.%.loc10_36.3) = splice_inst %.loc10_36.2 [template = %.loc10_36.4 (constants.%.4bf)] +// CHECK:STDOUT: %.loc10_36.4: @F.%.loc10_36.3 (@F.%.loc10_36.3) = splice_inst %.loc10_36.2 [template = %.loc10_36.4 (constants.%.c84)] // CHECK:STDOUT: %.loc10_39.2: = call_action (%.loc10_36.1), false [template] // CHECK:STDOUT: %.loc10_39.3: type = type_of_inst %.loc10_39.2 [template] -// CHECK:STDOUT: %.loc10_39.4: @F.%.loc10_39.3 (@F.%.loc10_39.3) = splice_inst %.loc10_39.2 [template = %.loc10_39.4 (constants.%.7cc)] -// CHECK:STDOUT: %.loc10_3.11: = call_action (constants.%ImplicitAs.generic, constants.%.535), false [template] +// CHECK:STDOUT: %.loc10_39.4: @F.%.loc10_39.3 (@F.%.loc10_39.3) = splice_inst %.loc10_39.2 [template = %.loc10_39.4 (constants.%.47d)] +// CHECK:STDOUT: %.loc10_3.11: = call_action (constants.%ImplicitAs.generic, constants.%.897), false [template] // CHECK:STDOUT: %.loc10_3.12: type = type_of_inst %.loc10_3.11 [template] -// CHECK:STDOUT: %.loc10_3.13: @F.%.loc10_3.12 (@F.%.loc10_3.12) = splice_inst %.loc10_3.11 [template = %.loc10_3.13 (constants.%.847f2c.1)] +// CHECK:STDOUT: %.loc10_3.13: @F.%.loc10_3.12 (@F.%.loc10_3.12) = splice_inst %.loc10_3.11 [template = %.loc10_3.13 (constants.%.20c9c2.1)] // CHECK:STDOUT: %.loc10_3.14: = access_member_action %.loc10_3.1, Convert [template] // CHECK:STDOUT: %.loc10_3.15: type = type_of_inst %.loc10_3.14 [template] -// CHECK:STDOUT: %.loc10_3.16: @F.%.loc10_3.15 (@F.%.loc10_3.15) = splice_inst %.loc10_3.14 [template = %.loc10_3.16 (constants.%.7fa0c8.1)] +// CHECK:STDOUT: %.loc10_3.16: @F.%.loc10_3.15 (@F.%.loc10_3.15) = splice_inst %.loc10_3.14 [template = %.loc10_3.16 (constants.%.c16b39.1)] // CHECK:STDOUT: %.loc10_3.17: = compound_member_access_action %.loc10_39.1, %.loc10_3.2 [template] // CHECK:STDOUT: %.loc10_3.18: type = type_of_inst %.loc10_3.17 [template] -// CHECK:STDOUT: %.loc10_3.19: @F.%.loc10_3.18 (@F.%.loc10_3.18) = splice_inst %.loc10_3.17 [template = %.loc10_3.19 (constants.%.8da)] +// CHECK:STDOUT: %.loc10_3.19: @F.%.loc10_3.18 (@F.%.loc10_3.18) = splice_inst %.loc10_3.17 [template = %.loc10_3.19 (constants.%.5f8)] // CHECK:STDOUT: %.loc10_3.20: = call_action (%.loc10_3.3), true [template] // CHECK:STDOUT: %.loc10_3.21: type = type_of_inst %.loc10_3.20 [template] -// CHECK:STDOUT: %.loc10_3.22: @F.%.loc10_3.21 (@F.%.loc10_3.21) = splice_inst %.loc10_3.20 [template = %.loc10_3.22 (constants.%.9e9)] +// CHECK:STDOUT: %.loc10_3.22: @F.%.loc10_3.21 (@F.%.loc10_3.21) = splice_inst %.loc10_3.20 [template = %.loc10_3.22 (constants.%.fde)] // CHECK:STDOUT: %.loc10_3.23: = refine_type_action %.loc10_3.5, %.loc10_24.8 [template] -// CHECK:STDOUT: %.loc10_3.24: @F.%.loc10_24.8 (%.535) = splice_inst %.loc10_3.23 [template = %.loc10_3.24 (constants.%.9f8)] +// CHECK:STDOUT: %.loc10_3.24: @F.%.loc10_24.8 (%.897) = splice_inst %.loc10_3.23 [template = %.loc10_3.24 (constants.%.0cf)] // CHECK:STDOUT: %.loc10_3.25: = convert_to_category_action %.loc10_3.6, element10 [template] -// CHECK:STDOUT: %.loc10_3.26: @F.%.loc10_24.8 (%.535) = splice_inst %.loc10_3.25 [template = %.loc10_3.26 (constants.%.073)] +// CHECK:STDOUT: %.loc10_3.26: @F.%.loc10_24.8 (%.897) = splice_inst %.loc10_3.25 [template = %.loc10_3.26 (constants.%.74f)] // CHECK:STDOUT: %.loc10_3.27: = refine_type_action %a.var, %.loc10_24.8 [template] -// CHECK:STDOUT: %.loc10_3.28: @F.%.loc10_24.8 (%.535) = splice_inst %.loc10_3.27 [template = %.loc10_3.28 (constants.%.cb8)] +// CHECK:STDOUT: %.loc10_3.28: @F.%.loc10_24.8 (%.897) = splice_inst %.loc10_3.27 [template = %.loc10_3.28 (constants.%.de4)] // CHECK:STDOUT: %.loc10_3.29: = compound_member_access_action %.loc10_3.8, constants.%assoc0.ae8 [template] // CHECK:STDOUT: %.loc10_3.30: type = type_of_inst %.loc10_3.29 [template] -// CHECK:STDOUT: %.loc10_3.31: @F.%.loc10_3.30 (@F.%.loc10_3.30) = splice_inst %.loc10_3.29 [template = %.loc10_3.31 (constants.%.495)] +// CHECK:STDOUT: %.loc10_3.31: @F.%.loc10_3.30 (@F.%.loc10_3.30) = splice_inst %.loc10_3.29 [template = %.loc10_3.31 (constants.%.040)] // CHECK:STDOUT: %.loc10_3.32: = call_action (%.loc10_3.9), true [template] // CHECK:STDOUT: %.loc10_3.33: type = type_of_inst %.loc10_3.32 [template] -// CHECK:STDOUT: %.loc10_3.34: @F.%.loc10_3.33 (@F.%.loc10_3.33) = splice_inst %.loc10_3.32 [template = %.loc10_3.34 (constants.%.013)] +// CHECK:STDOUT: %.loc10_3.34: @F.%.loc10_3.33 (@F.%.loc10_3.33) = splice_inst %.loc10_3.32 [template = %.loc10_3.34 (constants.%.b87)] // CHECK:STDOUT: // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.var: ref @F.%.loc10_24.8 (%.535) = var_storage %a.var_patt.loc10_3.1 +// CHECK:STDOUT: %a.var: ref @F.%.loc10_24.8 (%.897) = var_storage %a.var_patt.loc10_3.1 // CHECK:STDOUT: %Cpp.ref.loc10_28: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] // CHECK:STDOUT: %A.ref.loc10_31: %A.type = name_ref A, imports.%A.template [concrete = constants.%A.template] // CHECK:STDOUT: %T.ref.loc10_34: type = name_ref T, %T.loc9_15.2 [symbolic = %T.loc9_15.1 (constants.%T)] -// CHECK:STDOUT: %.loc10_35.1: @F.%.loc10_35.3 (@F.%.loc10_35.3) = splice_inst %.loc10_35.2 [template = %.loc10_35.4 (constants.%.ae6cd7.2)] -// CHECK:STDOUT: %.loc10_36.1: @F.%.loc10_36.3 (@F.%.loc10_36.3) = splice_inst %.loc10_36.2 [template = %.loc10_36.4 (constants.%.4bf)] -// CHECK:STDOUT: %.loc10_39.1: @F.%.loc10_39.3 (@F.%.loc10_39.3) = splice_inst %.loc10_39.2 [template = %.loc10_39.4 (constants.%.7cc)] -// CHECK:STDOUT: %.loc10_3.1: @F.%.loc10_3.12 (@F.%.loc10_3.12) = splice_inst %.loc10_3.11 [template = %.loc10_3.13 (constants.%.847f2c.1)] -// CHECK:STDOUT: %.loc10_3.2: @F.%.loc10_3.15 (@F.%.loc10_3.15) = splice_inst %.loc10_3.14 [template = %.loc10_3.16 (constants.%.7fa0c8.1)] -// CHECK:STDOUT: %.loc10_3.3: @F.%.loc10_3.18 (@F.%.loc10_3.18) = splice_inst %.loc10_3.17 [template = %.loc10_3.19 (constants.%.8da)] -// CHECK:STDOUT: %.loc10_3.4: @F.%.loc10_3.21 (@F.%.loc10_3.21) = splice_inst %.loc10_3.20 [template = %.loc10_3.22 (constants.%.9e9)] -// CHECK:STDOUT: %.loc10_3.5: @F.%.loc10_24.8 (%.535) = converted %.loc10_39.1, %.loc10_3.4 [template = %.loc10_3.22 (constants.%.9e9)] -// CHECK:STDOUT: %.loc10_3.6: @F.%.loc10_24.8 (%.535) = splice_inst %.loc10_3.23 [template = %.loc10_3.24 (constants.%.9f8)] -// CHECK:STDOUT: %.loc10_3.7: @F.%.loc10_24.8 (%.535) = splice_inst %.loc10_3.25 [template = %.loc10_3.26 (constants.%.073)] +// CHECK:STDOUT: %.loc10_34: type = template_inst %T.ref.loc10_34 [template = %.loc10_23.2 (constants.%.a92)] +// CHECK:STDOUT: %.loc10_35.1: @F.%.loc10_35.3 (@F.%.loc10_35.3) = splice_inst %.loc10_35.2 [template = %.loc10_35.4 (constants.%.8af9c5.2)] +// CHECK:STDOUT: %.loc10_36.1: @F.%.loc10_36.3 (@F.%.loc10_36.3) = splice_inst %.loc10_36.2 [template = %.loc10_36.4 (constants.%.c84)] +// CHECK:STDOUT: %.loc10_39.1: @F.%.loc10_39.3 (@F.%.loc10_39.3) = splice_inst %.loc10_39.2 [template = %.loc10_39.4 (constants.%.47d)] +// CHECK:STDOUT: %.loc10_3.1: @F.%.loc10_3.12 (@F.%.loc10_3.12) = splice_inst %.loc10_3.11 [template = %.loc10_3.13 (constants.%.20c9c2.1)] +// CHECK:STDOUT: %.loc10_3.2: @F.%.loc10_3.15 (@F.%.loc10_3.15) = splice_inst %.loc10_3.14 [template = %.loc10_3.16 (constants.%.c16b39.1)] +// CHECK:STDOUT: %.loc10_3.3: @F.%.loc10_3.18 (@F.%.loc10_3.18) = splice_inst %.loc10_3.17 [template = %.loc10_3.19 (constants.%.5f8)] +// CHECK:STDOUT: %.loc10_3.4: @F.%.loc10_3.21 (@F.%.loc10_3.21) = splice_inst %.loc10_3.20 [template = %.loc10_3.22 (constants.%.fde)] +// CHECK:STDOUT: %.loc10_3.5: @F.%.loc10_24.8 (%.897) = converted %.loc10_39.1, %.loc10_3.4 [template = %.loc10_3.22 (constants.%.fde)] +// CHECK:STDOUT: %.loc10_3.6: @F.%.loc10_24.8 (%.897) = splice_inst %.loc10_3.23 [template = %.loc10_3.24 (constants.%.0cf)] +// CHECK:STDOUT: %.loc10_3.7: @F.%.loc10_24.8 (%.897) = splice_inst %.loc10_3.25 [template = %.loc10_3.26 (constants.%.74f)] // CHECK:STDOUT: assign %a.var, %.loc10_3.7 -// CHECK:STDOUT: %.loc10_24.1: type = splice_block %.loc10_24.3 [template = %.loc10_24.8 (constants.%.535)] { +// CHECK:STDOUT: %.loc10_24.1: type = splice_block %.loc10_24.3 [template = %.loc10_24.8 (constants.%.897)] { // CHECK:STDOUT: %Cpp.ref.loc10_17: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] // CHECK:STDOUT: %A.ref.loc10_20: %A.type = name_ref A, imports.%A.template [concrete = constants.%A.template] // CHECK:STDOUT: %T.ref.loc10_23: type = name_ref T, %T.loc9_15.2 [symbolic = %T.loc9_15.1 (constants.%T)] -// CHECK:STDOUT: %.loc10_24.2: @F.%.loc10_24.5 (@F.%.loc10_24.5) = splice_inst %.loc10_24.4 [template = %.loc10_24.6 (constants.%.ae6cd7.1)] -// CHECK:STDOUT: %.loc10_24.3: type = splice_inst %.loc10_24.7 [template = %.loc10_24.8 (constants.%.535)] +// CHECK:STDOUT: %.loc10_23.1: type = template_inst %T.ref.loc10_23 [template = %.loc10_23.2 (constants.%.a92)] +// CHECK:STDOUT: %.loc10_24.2: @F.%.loc10_24.5 (@F.%.loc10_24.5) = splice_inst %.loc10_24.4 [template = %.loc10_24.6 (constants.%.8af9c5.1)] +// CHECK:STDOUT: %.loc10_24.3: type = splice_inst %.loc10_24.7 [template = %.loc10_24.8 (constants.%.897)] // CHECK:STDOUT: } -// CHECK:STDOUT: %a: ref @F.%.loc10_24.8 (%.535) = wrapper_binding a, %a.var +// CHECK:STDOUT: %a: ref @F.%.loc10_24.8 (%.897) = wrapper_binding a, %a.var // CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %a.patt.loc10_15.1: @F.%pattern_type (%pattern_type.281) = ref_binding_pattern a [template = %a.patt.loc10_15.2 (constants.%a.patt.44a)] -// CHECK:STDOUT: %a.var_patt.loc10_3.1: @F.%pattern_type (%pattern_type.281) = var_pattern %a.patt.loc10_15.1 [template = %a.var_patt.loc10_3.2 (constants.%a.var_patt.5fb)] +// CHECK:STDOUT: %a.patt.loc10_15.1: @F.%pattern_type (%pattern_type.463) = ref_binding_pattern a [template = %a.patt.loc10_15.2 (constants.%a.patt.577)] +// CHECK:STDOUT: %a.var_patt.loc10_3.1: @F.%pattern_type (%pattern_type.463) = var_pattern %a.patt.loc10_15.1 [template = %a.var_patt.loc10_3.2 (constants.%a.var_patt.c6d)] // CHECK:STDOUT: } -// CHECK:STDOUT: %.loc10_3.8: @F.%.loc10_24.8 (%.535) = splice_inst %.loc10_3.27 [template = %.loc10_3.28 (constants.%.cb8)] -// CHECK:STDOUT: %.loc10_3.9: @F.%.loc10_3.30 (@F.%.loc10_3.30) = splice_inst %.loc10_3.29 [template = %.loc10_3.31 (constants.%.495)] -// CHECK:STDOUT: %.loc10_3.10: @F.%.loc10_3.33 (@F.%.loc10_3.33) = splice_inst %.loc10_3.32 [template = %.loc10_3.34 (constants.%.013)] +// CHECK:STDOUT: %.loc10_3.8: @F.%.loc10_24.8 (%.897) = splice_inst %.loc10_3.27 [template = %.loc10_3.28 (constants.%.de4)] +// CHECK:STDOUT: %.loc10_3.9: @F.%.loc10_3.30 (@F.%.loc10_3.30) = splice_inst %.loc10_3.29 [template = %.loc10_3.31 (constants.%.040)] +// CHECK:STDOUT: %.loc10_3.10: @F.%.loc10_3.33 (@F.%.loc10_3.33) = splice_inst %.loc10_3.32 [template = %.loc10_3.34 (constants.%.b87)] // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -908,6 +921,7 @@ fn G() { // CHECK:STDOUT: %T.loc9_15.1 => constants.%i32 // CHECK:STDOUT: // CHECK:STDOUT: !definition: +// CHECK:STDOUT: %.loc10_23.2 => constants.%i32 // CHECK:STDOUT: %.loc10_24.4 => constants.%inst.splice_block.72dff3.1 // CHECK:STDOUT: %.loc10_24.5 => type // CHECK:STDOUT: %.loc10_24.6 => constants.%A @@ -926,25 +940,25 @@ fn G() { // CHECK:STDOUT: %.loc10_39.2 => constants.%inst.splice_block.76c // CHECK:STDOUT: %.loc10_39.3 => constants.%A // CHECK:STDOUT: %.loc10_39.4 => invalid -// CHECK:STDOUT: %.loc10_3.11 => constants.%.04f -// CHECK:STDOUT: %.loc10_3.12 => constants.%.5a1 -// CHECK:STDOUT: %.loc10_3.13 => constants.%.847f2c.2 -// CHECK:STDOUT: %.loc10_3.14 => constants.%.5d9 -// CHECK:STDOUT: %.loc10_3.15 => constants.%.831 -// CHECK:STDOUT: %.loc10_3.16 => constants.%.7fa0c8.2 -// CHECK:STDOUT: %.loc10_3.17 => constants.%.98e -// CHECK:STDOUT: %.loc10_3.18 => constants.%.81d -// CHECK:STDOUT: %.loc10_3.19 => constants.%.472 -// CHECK:STDOUT: %.loc10_3.20 => constants.%.6bc -// CHECK:STDOUT: %.loc10_3.21 => constants.%.133 -// CHECK:STDOUT: %.loc10_3.22 => constants.%.da3 -// CHECK:STDOUT: %.loc10_3.23 => constants.%inst.as_compatible.7b3 -// CHECK:STDOUT: %.loc10_3.24 => constants.%.d73 -// CHECK:STDOUT: %.loc10_3.25 => constants.%.33e -// CHECK:STDOUT: %.loc10_3.26 => constants.%.4ee -// CHECK:STDOUT: %.loc10_3.27 => constants.%inst.as_compatible.b4e +// CHECK:STDOUT: %.loc10_3.11 => constants.%.ca0 +// CHECK:STDOUT: %.loc10_3.12 => constants.%.d2c +// CHECK:STDOUT: %.loc10_3.13 => constants.%.20c9c2.2 +// CHECK:STDOUT: %.loc10_3.14 => constants.%.da6 +// CHECK:STDOUT: %.loc10_3.15 => constants.%.aaf +// CHECK:STDOUT: %.loc10_3.16 => constants.%.c16b39.2 +// CHECK:STDOUT: %.loc10_3.17 => constants.%.ba2 +// CHECK:STDOUT: %.loc10_3.18 => constants.%.d40 +// CHECK:STDOUT: %.loc10_3.19 => constants.%.5da +// CHECK:STDOUT: %.loc10_3.20 => constants.%.117 +// CHECK:STDOUT: %.loc10_3.21 => constants.%.f91 +// CHECK:STDOUT: %.loc10_3.22 => constants.%.519 +// CHECK:STDOUT: %.loc10_3.23 => constants.%inst.as_compatible.79b +// CHECK:STDOUT: %.loc10_3.24 => constants.%.f0f +// CHECK:STDOUT: %.loc10_3.25 => constants.%.7b9 +// CHECK:STDOUT: %.loc10_3.26 => constants.%.a12 +// CHECK:STDOUT: %.loc10_3.27 => constants.%inst.as_compatible.e4d // CHECK:STDOUT: %.loc10_3.28 => invalid -// CHECK:STDOUT: %.loc10_3.29 => constants.%inst.splice_block.688 +// CHECK:STDOUT: %.loc10_3.29 => constants.%inst.splice_block.b0b // CHECK:STDOUT: %.loc10_3.30 => // CHECK:STDOUT: %.loc10_3.31 => invalid // CHECK:STDOUT: %.loc10_3.32 => constants.%inst.call diff --git a/toolchain/check/testdata/interop/cpp/template/generic_call.carbon b/toolchain/check/testdata/interop/cpp/template/generic_call.carbon index 8a5b09e61ae5..3b51d61475fa 100644 --- a/toolchain/check/testdata/interop/cpp/template/generic_call.carbon +++ b/toolchain/check/testdata/interop/cpp/template/generic_call.carbon @@ -50,12 +50,13 @@ fn G() { // CHECK:STDOUT: %require_complete.944: = require_complete_type %T.67d [symbolic] // CHECK:STDOUT: %S.type: type = cpp_type_template_type S [concrete] // CHECK:STDOUT: %S.template: %S.type = struct_value () [concrete] -// CHECK:STDOUT: %.ae6: @F.%.loc8_24.5 (@F.%.loc8_24.5) = splice_inst @F.%.loc8_24.4 [template] -// CHECK:STDOUT: %.535: type = splice_inst @F.%.loc8_24.7 [template] -// CHECK:STDOUT: %require_complete.01e: = require_complete_type %.535 [template] -// CHECK:STDOUT: %pattern_type.281: type = pattern_type %.535 [template] -// CHECK:STDOUT: %v.patt.1d5: %pattern_type.281 = ref_binding_pattern v [template] -// CHECK:STDOUT: %v.var_patt.367: %pattern_type.281 = var_pattern %v.patt.1d5 [template] +// CHECK:STDOUT: %.a92: type = template_inst %T.67d [template] +// CHECK:STDOUT: %.de1: @F.%.loc8_24.5 (@F.%.loc8_24.5) = splice_inst @F.%.loc8_24.4 [template] +// CHECK:STDOUT: %.bc2: type = splice_inst @F.%.loc8_24.7 [template] +// CHECK:STDOUT: %require_complete.e38: = require_complete_type %.bc2 [template] +// CHECK:STDOUT: %pattern_type.aa8: type = pattern_type %.bc2 [template] +// CHECK:STDOUT: %v.patt.295: %pattern_type.aa8 = ref_binding_pattern v [template] +// CHECK:STDOUT: %v.var_patt.ab7: %pattern_type.aa8 = var_pattern %v.patt.295 [template] // CHECK:STDOUT: %DefaultOrUnformed.type: type = facet_type <@DefaultOrUnformed> [concrete] // CHECK:STDOUT: %Self.935: %DefaultOrUnformed.type = symbolic_binding Self, 0 [symbolic] // CHECK:STDOUT: %DefaultOrUnformed.WithSelf.Op.type.8f1: type = fn_type @DefaultOrUnformed.WithSelf.Op, @DefaultOrUnformed.WithSelf(%Self.935) [symbolic] @@ -64,28 +65,28 @@ fn G() { // CHECK:STDOUT: %T.b09: %Default.type = symbolic_binding T, 0 [symbolic] // CHECK:STDOUT: %T.as_type.as.DefaultOrUnformed.impl.Op.type.0c9: type = fn_type @T.as_type.as.DefaultOrUnformed.impl.Op, @T.as_type.as.DefaultOrUnformed.impl(%T.b09) [symbolic] // CHECK:STDOUT: %T.as_type.as.DefaultOrUnformed.impl.Op.cfe: %T.as_type.as.DefaultOrUnformed.impl.Op.type.0c9 = struct_value () [symbolic] -// CHECK:STDOUT: %DefaultOrUnformed.lookup_impl_witness: = lookup_impl_witness %.535, @DefaultOrUnformed [template] -// CHECK:STDOUT: %.6b4: require_specific_def_type = require_specific_def @T.as.DefaultOrUnformed.impl(%.535) [template] -// CHECK:STDOUT: %DefaultOrUnformed.facet.45f: %DefaultOrUnformed.type = facet_value %.535, (%DefaultOrUnformed.lookup_impl_witness) [template] -// CHECK:STDOUT: %.bb0: @F.%.loc8_25.6 (@F.%.loc8_25.6) = splice_inst @F.%.loc8_25.5 [template] -// CHECK:STDOUT: %.cde: @F.%.loc8_25.9 (@F.%.loc8_25.9) = splice_inst @F.%.loc8_25.8 [template] +// CHECK:STDOUT: %DefaultOrUnformed.lookup_impl_witness: = lookup_impl_witness %.bc2, @DefaultOrUnformed [template] +// CHECK:STDOUT: %.c1c: require_specific_def_type = require_specific_def @T.as.DefaultOrUnformed.impl(%.bc2) [template] +// CHECK:STDOUT: %DefaultOrUnformed.facet.680: %DefaultOrUnformed.type = facet_value %.bc2, (%DefaultOrUnformed.lookup_impl_witness) [template] +// CHECK:STDOUT: %.b48: @F.%.loc8_25.6 (@F.%.loc8_25.6) = splice_inst @F.%.loc8_25.5 [template] +// CHECK:STDOUT: %.9fe: @F.%.loc8_25.9 (@F.%.loc8_25.9) = splice_inst @F.%.loc8_25.8 [template] // CHECK:STDOUT: %ImplicitAs.type.0ff: type = generic_interface_type @ImplicitAs [concrete] // CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.0ff = struct_value () [concrete] -// CHECK:STDOUT: %.847f2c.1: @F.%.loc8_3.12 (@F.%.loc8_3.12) = splice_inst @F.%.loc8_3.11 [template] -// CHECK:STDOUT: %.7fa0c8.1: @F.%.loc8_3.15 (@F.%.loc8_3.15) = splice_inst @F.%.loc8_3.14 [template] -// CHECK:STDOUT: %.178: @F.%.loc8_3.18 (@F.%.loc8_3.18) = splice_inst @F.%.loc8_3.17 [template] -// CHECK:STDOUT: %.852: @F.%.loc8_3.21 (@F.%.loc8_3.21) = splice_inst @F.%.loc8_3.20 [template] -// CHECK:STDOUT: %.7f5: %.535 = splice_inst @F.%.loc8_3.23 [template] -// CHECK:STDOUT: %.f22: %.535 = splice_inst @F.%.loc8_3.25 [template] +// CHECK:STDOUT: %.735308.1: @F.%.loc8_3.12 (@F.%.loc8_3.12) = splice_inst @F.%.loc8_3.11 [template] +// CHECK:STDOUT: %.cc0a4d.1: @F.%.loc8_3.15 (@F.%.loc8_3.15) = splice_inst @F.%.loc8_3.14 [template] +// CHECK:STDOUT: %.825: @F.%.loc8_3.18 (@F.%.loc8_3.18) = splice_inst @F.%.loc8_3.17 [template] +// CHECK:STDOUT: %.cd6: @F.%.loc8_3.21 (@F.%.loc8_3.21) = splice_inst @F.%.loc8_3.20 [template] +// CHECK:STDOUT: %.b28: %.bc2 = splice_inst @F.%.loc8_3.23 [template] +// CHECK:STDOUT: %.346: %.bc2 = splice_inst @F.%.loc8_3.25 [template] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %Self.0e7: %Destroy.type = symbolic_binding Self, 0 [symbolic] // CHECK:STDOUT: %Destroy.WithSelf.Op.type.d3e: type = fn_type @Destroy.WithSelf.Op, @Destroy.WithSelf(%Self.0e7) [symbolic] // CHECK:STDOUT: %Destroy.WithSelf.Op.42b: %Destroy.WithSelf.Op.type.d3e = struct_value () [symbolic] // CHECK:STDOUT: %Destroy.assoc_type: type = assoc_entity_type @Destroy [concrete] // CHECK:STDOUT: %assoc0.ae8: %Destroy.assoc_type = assoc_entity element0, imports.%Core.import_ref.918 [concrete] -// CHECK:STDOUT: %.131: %.535 = splice_inst @F.%.loc8_3.27 [template] -// CHECK:STDOUT: %.8f8: @F.%.loc8_3.30 (@F.%.loc8_3.30) = splice_inst @F.%.loc8_3.29 [template] -// CHECK:STDOUT: %.763: @F.%.loc8_3.33 (@F.%.loc8_3.33) = splice_inst @F.%.loc8_3.32 [template] +// CHECK:STDOUT: %.c8e: %.bc2 = splice_inst @F.%.loc8_3.27 [template] +// CHECK:STDOUT: %.589: @F.%.loc8_3.30 (@F.%.loc8_3.30) = splice_inst @F.%.loc8_3.29 [template] +// CHECK:STDOUT: %.08f: @F.%.loc8_3.33 (@F.%.loc8_3.33) = splice_inst @F.%.loc8_3.32 [template] // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] // CHECK:STDOUT: %X: type = class_type @X [concrete] // CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] @@ -118,7 +119,7 @@ fn G() { // CHECK:STDOUT: %inst.splice_block.9d9: = inst_value [concrete] { // CHECK:STDOUT: %.64e: %.805 = splice_block %impl.elem0.9ae [concrete = %T.as_type.as.DefaultOrUnformed.impl.Op.83d] { // CHECK:STDOUT: %as_type: type = facet_access_type %DefaultOrUnformed.facet.ba3 [concrete = %S] -// CHECK:STDOUT: %.bcbe: type = converted %DefaultOrUnformed.facet.ba3, %as_type [concrete = %S] +// CHECK:STDOUT: %.bcb: type = converted %DefaultOrUnformed.facet.ba3, %as_type [concrete = %S] // CHECK:STDOUT: %Op.ref.f8c: %DefaultOrUnformed.assoc_type = name_ref Op, imports.%Core.import_ref.6dc [concrete = %assoc0.b81] // CHECK:STDOUT: %impl.elem0.9ae: %.805 = impl_witness_access %DefaultOrUnformed.impl_witness.1ff, element0 [concrete = %T.as_type.as.DefaultOrUnformed.impl.Op.83d] // CHECK:STDOUT: } @@ -130,26 +131,26 @@ fn G() { // CHECK:STDOUT: %T.as_type.as.DefaultOrUnformed.impl.Op.call: init %S to %.746 = call %T.as_type.as.DefaultOrUnformed.impl.Op.specific_fn.e6b3f4.2() // CHECK:STDOUT: } // CHECK:STDOUT: } -// CHECK:STDOUT: %.04f: = call_action (%ImplicitAs.generic, %.535), false [template] -// CHECK:STDOUT: %.5a1a: type = type_of_inst %.04f [template] -// CHECK:STDOUT: %.847f2c.2: %.5a1a = splice_inst %.04f [template] -// CHECK:STDOUT: %.5d9: = access_member_action %.847f2c.2, Convert [template] -// CHECK:STDOUT: %.831: type = type_of_inst %.5d9 [template] -// CHECK:STDOUT: %.7fa0c8.2: %.831 = splice_inst %.5d9 [template] -// CHECK:STDOUT: %.fba: = compound_member_access_action %.cc7, %.7fa0c8.2 [template] -// CHECK:STDOUT: %.5a14: type = type_of_inst %.fba [template] -// CHECK:STDOUT: %.cb9: %.5a14 = splice_inst %.fba [template] -// CHECK:STDOUT: %.c0e: = call_action (%.cb9), true [template] -// CHECK:STDOUT: %.e96: type = type_of_inst %.c0e [template] -// CHECK:STDOUT: %.296: %.e96 = splice_inst %.c0e [template] -// CHECK:STDOUT: %.dd8: %S = splice_inst %.c0e [template] -// CHECK:STDOUT: %inst.as_compatible.276: = inst_value [concrete] { -// CHECK:STDOUT: %.dfb: %S = as_compatible %.296 [template = %.dd8] +// CHECK:STDOUT: %.d2b: = call_action (%ImplicitAs.generic, %.bc2), false [template] +// CHECK:STDOUT: %.770: type = type_of_inst %.d2b [template] +// CHECK:STDOUT: %.735308.2: %.770 = splice_inst %.d2b [template] +// CHECK:STDOUT: %.e6e: = access_member_action %.735308.2, Convert [template] +// CHECK:STDOUT: %.247: type = type_of_inst %.e6e [template] +// CHECK:STDOUT: %.cc0a4d.2: %.247 = splice_inst %.e6e [template] +// CHECK:STDOUT: %.f9f: = compound_member_access_action %.cc7, %.cc0a4d.2 [template] +// CHECK:STDOUT: %.828: type = type_of_inst %.f9f [template] +// CHECK:STDOUT: %.9e3: %.828 = splice_inst %.f9f [template] +// CHECK:STDOUT: %.497: = call_action (%.9e3), true [template] +// CHECK:STDOUT: %.30d: type = type_of_inst %.497 [template] +// CHECK:STDOUT: %.1ea: %.30d = splice_inst %.497 [template] +// CHECK:STDOUT: %.cd7: %S = splice_inst %.497 [template] +// CHECK:STDOUT: %inst.as_compatible.e16: = inst_value [concrete] { +// CHECK:STDOUT: %.f55: %S = as_compatible %.1ea [template = %.cd7] // CHECK:STDOUT: } -// CHECK:STDOUT: %.23d: = convert_to_category_action %.dd8, element10 [template] -// CHECK:STDOUT: %.a98: %S = splice_inst %.23d [template] -// CHECK:STDOUT: %inst.as_compatible.c08: = inst_value [concrete] { -// CHECK:STDOUT: %.37f: ref %S = as_compatible @F.%v.var +// CHECK:STDOUT: %.d55: = convert_to_category_action %.cd7, element10 [template] +// CHECK:STDOUT: %.61f: %S = splice_inst %.d55 [template] +// CHECK:STDOUT: %inst.as_compatible.313: = inst_value [concrete] { +// CHECK:STDOUT: %.419: ref %S = as_compatible @F.%v.var // CHECK:STDOUT: } // CHECK:STDOUT: %S.cpp_destructor.type: type = fn_type @S.cpp_destructor [concrete] // CHECK:STDOUT: %S.cpp_destructor: %S.cpp_destructor.type = struct_value () [concrete] @@ -159,18 +160,18 @@ fn G() { // CHECK:STDOUT: %Destroy.facet.2e5: %Destroy.type = facet_value %S, (%custom_witness.e7a31c.2) [concrete] // CHECK:STDOUT: %Destroy.WithSelf.Op.type.5df: type = fn_type @Destroy.WithSelf.Op, @Destroy.WithSelf(%Destroy.facet.2e5) [concrete] // CHECK:STDOUT: %.670: type = fn_type_with_self_type %Destroy.WithSelf.Op.type.5df, %Destroy.facet.2e5 [concrete] -// CHECK:STDOUT: %inst.splice_block.603: = inst_value [concrete] { -// CHECK:STDOUT: %.fe0: = splice_block %bound_method { +// CHECK:STDOUT: %inst.splice_block.478: = inst_value [concrete] { +// CHECK:STDOUT: %.90d: = splice_block %bound_method { // CHECK:STDOUT: // CHECK:STDOUT: %impl.elem0.c3e: %.670 = impl_witness_access %custom_witness.e7a31c.2, element0 [concrete = %S.Op.4dca31.2] -// CHECK:STDOUT: %bound_method: = bound_method %.37f, %impl.elem0.c3e +// CHECK:STDOUT: %bound_method: = bound_method %.419, %impl.elem0.c3e // CHECK:STDOUT: } // CHECK:STDOUT: } -// CHECK:STDOUT: %inst.splice_block.35a: = inst_value [concrete] { -// CHECK:STDOUT: %.f30: init %empty_tuple.type = splice_block %S.cpp_destructor.call { +// CHECK:STDOUT: %inst.splice_block.37a: = inst_value [concrete] { +// CHECK:STDOUT: %.084: init %empty_tuple.type = splice_block %S.cpp_destructor.call { // CHECK:STDOUT: %Op.ref.6a0: %S.cpp_destructor.type = name_ref Op, imports.%S.cpp_destructor.decl [concrete = %S.cpp_destructor] -// CHECK:STDOUT: %S.cpp_destructor.bound: = bound_method %.37f, %Op.ref.6a0 -// CHECK:STDOUT: %S.cpp_destructor.call: init %empty_tuple.type = call %S.cpp_destructor.bound(%.37f) +// CHECK:STDOUT: %S.cpp_destructor.bound: = bound_method %.419, %Op.ref.6a0 +// CHECK:STDOUT: %S.cpp_destructor.call: init %empty_tuple.type = call %S.cpp_destructor.bound(%.419) // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -222,79 +223,81 @@ fn G() { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete.loc7: = require_complete_type %T.loc7_7.1 [symbolic = %require_complete.loc7 (constants.%require_complete.944)] -// CHECK:STDOUT: %.loc8_24.4: = call_template_action clang_decl_id78000002, (%T.loc7_7.1) [template] +// CHECK:STDOUT: %.loc8_23.2: type = template_inst %T.loc7_7.1 [template = %.loc8_23.2 (constants.%.a92)] +// CHECK:STDOUT: %.loc8_24.4: = call_action (%S.ref, %.loc8_23.1), false [template] // CHECK:STDOUT: %.loc8_24.5: type = type_of_inst %.loc8_24.4 [template] -// CHECK:STDOUT: %.loc8_24.6: @F.%.loc8_24.5 (@F.%.loc8_24.5) = splice_inst %.loc8_24.4 [template = %.loc8_24.6 (constants.%.ae6)] +// CHECK:STDOUT: %.loc8_24.6: @F.%.loc8_24.5 (@F.%.loc8_24.5) = splice_inst %.loc8_24.4 [template = %.loc8_24.6 (constants.%.de1)] // CHECK:STDOUT: %.loc8_24.7: = convert_to_value_action %.loc8_24.2, type [template] -// CHECK:STDOUT: %.loc8_24.8: type = splice_inst %.loc8_24.7 [template = %.loc8_24.8 (constants.%.535)] -// CHECK:STDOUT: %require_complete.loc8: = require_complete_type %.loc8_24.8 [template = %require_complete.loc8 (constants.%require_complete.01e)] -// CHECK:STDOUT: %pattern_type.loc8: type = pattern_type %.loc8_24.8 [template = %pattern_type.loc8 (constants.%pattern_type.281)] -// CHECK:STDOUT: %v.patt.loc8_15.2: @F.%pattern_type.loc8 (%pattern_type.281) = ref_binding_pattern v [template = %v.patt.loc8_15.2 (constants.%v.patt.1d5)] -// CHECK:STDOUT: %v.var_patt.loc8_3.2: @F.%pattern_type.loc8 (%pattern_type.281) = var_pattern %v.patt.loc8_15.2 [template = %v.var_patt.loc8_3.2 (constants.%v.var_patt.367)] -// CHECK:STDOUT: %.loc8_25.4: require_specific_def_type = require_specific_def @T.as.DefaultOrUnformed.impl(%.loc8_24.8) [template = %.loc8_25.4 (constants.%.6b4)] +// CHECK:STDOUT: %.loc8_24.8: type = splice_inst %.loc8_24.7 [template = %.loc8_24.8 (constants.%.bc2)] +// CHECK:STDOUT: %require_complete.loc8: = require_complete_type %.loc8_24.8 [template = %require_complete.loc8 (constants.%require_complete.e38)] +// CHECK:STDOUT: %pattern_type.loc8: type = pattern_type %.loc8_24.8 [template = %pattern_type.loc8 (constants.%pattern_type.aa8)] +// CHECK:STDOUT: %v.patt.loc8_15.2: @F.%pattern_type.loc8 (%pattern_type.aa8) = ref_binding_pattern v [template = %v.patt.loc8_15.2 (constants.%v.patt.295)] +// CHECK:STDOUT: %v.var_patt.loc8_3.2: @F.%pattern_type.loc8 (%pattern_type.aa8) = var_pattern %v.patt.loc8_15.2 [template = %v.var_patt.loc8_3.2 (constants.%v.var_patt.ab7)] +// CHECK:STDOUT: %.loc8_25.4: require_specific_def_type = require_specific_def @T.as.DefaultOrUnformed.impl(%.loc8_24.8) [template = %.loc8_25.4 (constants.%.c1c)] // CHECK:STDOUT: %DefaultOrUnformed.lookup_impl_witness: = lookup_impl_witness %.loc8_24.8, @DefaultOrUnformed [template = %DefaultOrUnformed.lookup_impl_witness (constants.%DefaultOrUnformed.lookup_impl_witness)] -// CHECK:STDOUT: %DefaultOrUnformed.facet.loc8_25.2: %DefaultOrUnformed.type = facet_value %.loc8_24.8, (%DefaultOrUnformed.lookup_impl_witness) [template = %DefaultOrUnformed.facet.loc8_25.2 (constants.%DefaultOrUnformed.facet.45f)] +// CHECK:STDOUT: %DefaultOrUnformed.facet.loc8_25.2: %DefaultOrUnformed.type = facet_value %.loc8_24.8, (%DefaultOrUnformed.lookup_impl_witness) [template = %DefaultOrUnformed.facet.loc8_25.2 (constants.%DefaultOrUnformed.facet.680)] // CHECK:STDOUT: %.loc8_25.5: = access_member_action %.loc8_25.1, Op [template] // CHECK:STDOUT: %.loc8_25.6: type = type_of_inst %.loc8_25.5 [template] -// CHECK:STDOUT: %.loc8_25.7: @F.%.loc8_25.6 (@F.%.loc8_25.6) = splice_inst %.loc8_25.5 [template = %.loc8_25.7 (constants.%.bb0)] +// CHECK:STDOUT: %.loc8_25.7: @F.%.loc8_25.6 (@F.%.loc8_25.6) = splice_inst %.loc8_25.5 [template = %.loc8_25.7 (constants.%.b48)] // CHECK:STDOUT: %.loc8_25.8: = call_action (%.loc8_25.2), false [template] // CHECK:STDOUT: %.loc8_25.9: type = type_of_inst %.loc8_25.8 [template] -// CHECK:STDOUT: %.loc8_25.10: @F.%.loc8_25.9 (@F.%.loc8_25.9) = splice_inst %.loc8_25.8 [template = %.loc8_25.10 (constants.%.cde)] -// CHECK:STDOUT: %.loc8_3.11: = call_action (constants.%ImplicitAs.generic, constants.%.535), false [template] +// CHECK:STDOUT: %.loc8_25.10: @F.%.loc8_25.9 (@F.%.loc8_25.9) = splice_inst %.loc8_25.8 [template = %.loc8_25.10 (constants.%.9fe)] +// CHECK:STDOUT: %.loc8_3.11: = call_action (constants.%ImplicitAs.generic, constants.%.bc2), false [template] // CHECK:STDOUT: %.loc8_3.12: type = type_of_inst %.loc8_3.11 [template] -// CHECK:STDOUT: %.loc8_3.13: @F.%.loc8_3.12 (@F.%.loc8_3.12) = splice_inst %.loc8_3.11 [template = %.loc8_3.13 (constants.%.847f2c.1)] +// CHECK:STDOUT: %.loc8_3.13: @F.%.loc8_3.12 (@F.%.loc8_3.12) = splice_inst %.loc8_3.11 [template = %.loc8_3.13 (constants.%.735308.1)] // CHECK:STDOUT: %.loc8_3.14: = access_member_action %.loc8_3.1, Convert [template] // CHECK:STDOUT: %.loc8_3.15: type = type_of_inst %.loc8_3.14 [template] -// CHECK:STDOUT: %.loc8_3.16: @F.%.loc8_3.15 (@F.%.loc8_3.15) = splice_inst %.loc8_3.14 [template = %.loc8_3.16 (constants.%.7fa0c8.1)] +// CHECK:STDOUT: %.loc8_3.16: @F.%.loc8_3.15 (@F.%.loc8_3.15) = splice_inst %.loc8_3.14 [template = %.loc8_3.16 (constants.%.cc0a4d.1)] // CHECK:STDOUT: %.loc8_3.17: = compound_member_access_action %.loc8_25.3, %.loc8_3.2 [template] // CHECK:STDOUT: %.loc8_3.18: type = type_of_inst %.loc8_3.17 [template] -// CHECK:STDOUT: %.loc8_3.19: @F.%.loc8_3.18 (@F.%.loc8_3.18) = splice_inst %.loc8_3.17 [template = %.loc8_3.19 (constants.%.178)] +// CHECK:STDOUT: %.loc8_3.19: @F.%.loc8_3.18 (@F.%.loc8_3.18) = splice_inst %.loc8_3.17 [template = %.loc8_3.19 (constants.%.825)] // CHECK:STDOUT: %.loc8_3.20: = call_action (%.loc8_3.3), true [template] // CHECK:STDOUT: %.loc8_3.21: type = type_of_inst %.loc8_3.20 [template] -// CHECK:STDOUT: %.loc8_3.22: @F.%.loc8_3.21 (@F.%.loc8_3.21) = splice_inst %.loc8_3.20 [template = %.loc8_3.22 (constants.%.852)] +// CHECK:STDOUT: %.loc8_3.22: @F.%.loc8_3.21 (@F.%.loc8_3.21) = splice_inst %.loc8_3.20 [template = %.loc8_3.22 (constants.%.cd6)] // CHECK:STDOUT: %.loc8_3.23: = refine_type_action %.loc8_3.5, %.loc8_24.8 [template] -// CHECK:STDOUT: %.loc8_3.24: @F.%.loc8_24.8 (%.535) = splice_inst %.loc8_3.23 [template = %.loc8_3.24 (constants.%.7f5)] +// CHECK:STDOUT: %.loc8_3.24: @F.%.loc8_24.8 (%.bc2) = splice_inst %.loc8_3.23 [template = %.loc8_3.24 (constants.%.b28)] // CHECK:STDOUT: %.loc8_3.25: = convert_to_category_action %.loc8_3.6, element10 [template] -// CHECK:STDOUT: %.loc8_3.26: @F.%.loc8_24.8 (%.535) = splice_inst %.loc8_3.25 [template = %.loc8_3.26 (constants.%.f22)] +// CHECK:STDOUT: %.loc8_3.26: @F.%.loc8_24.8 (%.bc2) = splice_inst %.loc8_3.25 [template = %.loc8_3.26 (constants.%.346)] // CHECK:STDOUT: %.loc8_3.27: = refine_type_action %v.var, %.loc8_24.8 [template] -// CHECK:STDOUT: %.loc8_3.28: @F.%.loc8_24.8 (%.535) = splice_inst %.loc8_3.27 [template = %.loc8_3.28 (constants.%.131)] +// CHECK:STDOUT: %.loc8_3.28: @F.%.loc8_24.8 (%.bc2) = splice_inst %.loc8_3.27 [template = %.loc8_3.28 (constants.%.c8e)] // CHECK:STDOUT: %.loc8_3.29: = compound_member_access_action %.loc8_3.8, constants.%assoc0.ae8 [template] // CHECK:STDOUT: %.loc8_3.30: type = type_of_inst %.loc8_3.29 [template] -// CHECK:STDOUT: %.loc8_3.31: @F.%.loc8_3.30 (@F.%.loc8_3.30) = splice_inst %.loc8_3.29 [template = %.loc8_3.31 (constants.%.8f8)] +// CHECK:STDOUT: %.loc8_3.31: @F.%.loc8_3.30 (@F.%.loc8_3.30) = splice_inst %.loc8_3.29 [template = %.loc8_3.31 (constants.%.589)] // CHECK:STDOUT: %.loc8_3.32: = call_action (%.loc8_3.9), true [template] // CHECK:STDOUT: %.loc8_3.33: type = type_of_inst %.loc8_3.32 [template] -// CHECK:STDOUT: %.loc8_3.34: @F.%.loc8_3.33 (@F.%.loc8_3.33) = splice_inst %.loc8_3.32 [template = %.loc8_3.34 (constants.%.763)] +// CHECK:STDOUT: %.loc8_3.34: @F.%.loc8_3.33 (@F.%.loc8_3.33) = splice_inst %.loc8_3.32 [template = %.loc8_3.34 (constants.%.08f)] // CHECK:STDOUT: // CHECK:STDOUT: fn(%x.param: @F.%T.loc7_7.1 (%T.67d)) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %v.var: ref @F.%.loc8_24.8 (%.535) = var_storage %v.var_patt.loc8_3.1 -// CHECK:STDOUT: %DefaultOrUnformed.facet.loc8_25.1: %DefaultOrUnformed.type = facet_value constants.%.535, (constants.%DefaultOrUnformed.lookup_impl_witness) [template = %DefaultOrUnformed.facet.loc8_25.2 (constants.%DefaultOrUnformed.facet.45f)] -// CHECK:STDOUT: %.loc8_25.1: %DefaultOrUnformed.type = converted constants.%.535, %DefaultOrUnformed.facet.loc8_25.1 [template = %DefaultOrUnformed.facet.loc8_25.2 (constants.%DefaultOrUnformed.facet.45f)] -// CHECK:STDOUT: %.loc8_25.2: @F.%.loc8_25.6 (@F.%.loc8_25.6) = splice_inst %.loc8_25.5 [template = %.loc8_25.7 (constants.%.bb0)] -// CHECK:STDOUT: %.loc8_25.3: @F.%.loc8_25.9 (@F.%.loc8_25.9) = splice_inst %.loc8_25.8 [template = %.loc8_25.10 (constants.%.cde)] -// CHECK:STDOUT: %.loc8_3.1: @F.%.loc8_3.12 (@F.%.loc8_3.12) = splice_inst %.loc8_3.11 [template = %.loc8_3.13 (constants.%.847f2c.1)] -// CHECK:STDOUT: %.loc8_3.2: @F.%.loc8_3.15 (@F.%.loc8_3.15) = splice_inst %.loc8_3.14 [template = %.loc8_3.16 (constants.%.7fa0c8.1)] -// CHECK:STDOUT: %.loc8_3.3: @F.%.loc8_3.18 (@F.%.loc8_3.18) = splice_inst %.loc8_3.17 [template = %.loc8_3.19 (constants.%.178)] -// CHECK:STDOUT: %.loc8_3.4: @F.%.loc8_3.21 (@F.%.loc8_3.21) = splice_inst %.loc8_3.20 [template = %.loc8_3.22 (constants.%.852)] -// CHECK:STDOUT: %.loc8_3.5: @F.%.loc8_24.8 (%.535) = converted %.loc8_25.3, %.loc8_3.4 [template = %.loc8_3.22 (constants.%.852)] -// CHECK:STDOUT: %.loc8_3.6: @F.%.loc8_24.8 (%.535) = splice_inst %.loc8_3.23 [template = %.loc8_3.24 (constants.%.7f5)] -// CHECK:STDOUT: %.loc8_3.7: @F.%.loc8_24.8 (%.535) = splice_inst %.loc8_3.25 [template = %.loc8_3.26 (constants.%.f22)] +// CHECK:STDOUT: %v.var: ref @F.%.loc8_24.8 (%.bc2) = var_storage %v.var_patt.loc8_3.1 +// CHECK:STDOUT: %DefaultOrUnformed.facet.loc8_25.1: %DefaultOrUnformed.type = facet_value constants.%.bc2, (constants.%DefaultOrUnformed.lookup_impl_witness) [template = %DefaultOrUnformed.facet.loc8_25.2 (constants.%DefaultOrUnformed.facet.680)] +// CHECK:STDOUT: %.loc8_25.1: %DefaultOrUnformed.type = converted constants.%.bc2, %DefaultOrUnformed.facet.loc8_25.1 [template = %DefaultOrUnformed.facet.loc8_25.2 (constants.%DefaultOrUnformed.facet.680)] +// CHECK:STDOUT: %.loc8_25.2: @F.%.loc8_25.6 (@F.%.loc8_25.6) = splice_inst %.loc8_25.5 [template = %.loc8_25.7 (constants.%.b48)] +// CHECK:STDOUT: %.loc8_25.3: @F.%.loc8_25.9 (@F.%.loc8_25.9) = splice_inst %.loc8_25.8 [template = %.loc8_25.10 (constants.%.9fe)] +// CHECK:STDOUT: %.loc8_3.1: @F.%.loc8_3.12 (@F.%.loc8_3.12) = splice_inst %.loc8_3.11 [template = %.loc8_3.13 (constants.%.735308.1)] +// CHECK:STDOUT: %.loc8_3.2: @F.%.loc8_3.15 (@F.%.loc8_3.15) = splice_inst %.loc8_3.14 [template = %.loc8_3.16 (constants.%.cc0a4d.1)] +// CHECK:STDOUT: %.loc8_3.3: @F.%.loc8_3.18 (@F.%.loc8_3.18) = splice_inst %.loc8_3.17 [template = %.loc8_3.19 (constants.%.825)] +// CHECK:STDOUT: %.loc8_3.4: @F.%.loc8_3.21 (@F.%.loc8_3.21) = splice_inst %.loc8_3.20 [template = %.loc8_3.22 (constants.%.cd6)] +// CHECK:STDOUT: %.loc8_3.5: @F.%.loc8_24.8 (%.bc2) = converted %.loc8_25.3, %.loc8_3.4 [template = %.loc8_3.22 (constants.%.cd6)] +// CHECK:STDOUT: %.loc8_3.6: @F.%.loc8_24.8 (%.bc2) = splice_inst %.loc8_3.23 [template = %.loc8_3.24 (constants.%.b28)] +// CHECK:STDOUT: %.loc8_3.7: @F.%.loc8_24.8 (%.bc2) = splice_inst %.loc8_3.25 [template = %.loc8_3.26 (constants.%.346)] // CHECK:STDOUT: assign %v.var, %.loc8_3.7 -// CHECK:STDOUT: %.loc8_24.1: type = splice_block %.loc8_24.3 [template = %.loc8_24.8 (constants.%.535)] { +// CHECK:STDOUT: %.loc8_24.1: type = splice_block %.loc8_24.3 [template = %.loc8_24.8 (constants.%.bc2)] { // CHECK:STDOUT: %Cpp.ref: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] // CHECK:STDOUT: %S.ref: %S.type = name_ref S, imports.%S.template [concrete = constants.%S.template] // CHECK:STDOUT: %T.ref.loc8: type = name_ref T, %T.loc7_7.2 [symbolic = %T.loc7_7.1 (constants.%T.67d)] -// CHECK:STDOUT: %.loc8_24.2: @F.%.loc8_24.5 (@F.%.loc8_24.5) = splice_inst %.loc8_24.4 [template = %.loc8_24.6 (constants.%.ae6)] -// CHECK:STDOUT: %.loc8_24.3: type = splice_inst %.loc8_24.7 [template = %.loc8_24.8 (constants.%.535)] +// CHECK:STDOUT: %.loc8_23.1: type = template_inst %T.ref.loc8 [template = %.loc8_23.2 (constants.%.a92)] +// CHECK:STDOUT: %.loc8_24.2: @F.%.loc8_24.5 (@F.%.loc8_24.5) = splice_inst %.loc8_24.4 [template = %.loc8_24.6 (constants.%.de1)] +// CHECK:STDOUT: %.loc8_24.3: type = splice_inst %.loc8_24.7 [template = %.loc8_24.8 (constants.%.bc2)] // CHECK:STDOUT: } -// CHECK:STDOUT: %v: ref @F.%.loc8_24.8 (%.535) = wrapper_binding v, %v.var +// CHECK:STDOUT: %v: ref @F.%.loc8_24.8 (%.bc2) = wrapper_binding v, %v.var // CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v.patt.loc8_15.1: @F.%pattern_type.loc8 (%pattern_type.281) = ref_binding_pattern v [template = %v.patt.loc8_15.2 (constants.%v.patt.1d5)] -// CHECK:STDOUT: %v.var_patt.loc8_3.1: @F.%pattern_type.loc8 (%pattern_type.281) = var_pattern %v.patt.loc8_15.1 [template = %v.var_patt.loc8_3.2 (constants.%v.var_patt.367)] +// CHECK:STDOUT: %v.patt.loc8_15.1: @F.%pattern_type.loc8 (%pattern_type.aa8) = ref_binding_pattern v [template = %v.patt.loc8_15.2 (constants.%v.patt.295)] +// CHECK:STDOUT: %v.var_patt.loc8_3.1: @F.%pattern_type.loc8 (%pattern_type.aa8) = var_pattern %v.patt.loc8_15.1 [template = %v.var_patt.loc8_3.2 (constants.%v.var_patt.ab7)] // CHECK:STDOUT: } -// CHECK:STDOUT: %.loc8_3.8: @F.%.loc8_24.8 (%.535) = splice_inst %.loc8_3.27 [template = %.loc8_3.28 (constants.%.131)] -// CHECK:STDOUT: %.loc8_3.9: @F.%.loc8_3.30 (@F.%.loc8_3.30) = splice_inst %.loc8_3.29 [template = %.loc8_3.31 (constants.%.8f8)] -// CHECK:STDOUT: %.loc8_3.10: @F.%.loc8_3.33 (@F.%.loc8_3.33) = splice_inst %.loc8_3.32 [template = %.loc8_3.34 (constants.%.763)] +// CHECK:STDOUT: %.loc8_3.8: @F.%.loc8_24.8 (%.bc2) = splice_inst %.loc8_3.27 [template = %.loc8_3.28 (constants.%.c8e)] +// CHECK:STDOUT: %.loc8_3.9: @F.%.loc8_3.30 (@F.%.loc8_3.30) = splice_inst %.loc8_3.29 [template = %.loc8_3.31 (constants.%.589)] +// CHECK:STDOUT: %.loc8_3.10: @F.%.loc8_3.33 (@F.%.loc8_3.33) = splice_inst %.loc8_3.32 [template = %.loc8_3.34 (constants.%.08f)] // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -316,6 +319,7 @@ fn G() { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete.loc7 => constants.%complete_type +// CHECK:STDOUT: %.loc8_23.2 => constants.%X // CHECK:STDOUT: %.loc8_24.4 => constants.%inst.splice_block.5af // CHECK:STDOUT: %.loc8_24.5 => type // CHECK:STDOUT: %.loc8_24.6 => constants.%S @@ -334,28 +338,28 @@ fn G() { // CHECK:STDOUT: %.loc8_25.8 => constants.%inst.splice_block.7e5 // CHECK:STDOUT: %.loc8_25.9 => constants.%S // CHECK:STDOUT: %.loc8_25.10 => invalid -// CHECK:STDOUT: %.loc8_3.11 => constants.%.04f -// CHECK:STDOUT: %.loc8_3.12 => constants.%.5a1a -// CHECK:STDOUT: %.loc8_3.13 => constants.%.847f2c.2 -// CHECK:STDOUT: %.loc8_3.14 => constants.%.5d9 -// CHECK:STDOUT: %.loc8_3.15 => constants.%.831 -// CHECK:STDOUT: %.loc8_3.16 => constants.%.7fa0c8.2 -// CHECK:STDOUT: %.loc8_3.17 => constants.%.fba -// CHECK:STDOUT: %.loc8_3.18 => constants.%.5a14 -// CHECK:STDOUT: %.loc8_3.19 => constants.%.cb9 -// CHECK:STDOUT: %.loc8_3.20 => constants.%.c0e -// CHECK:STDOUT: %.loc8_3.21 => constants.%.e96 -// CHECK:STDOUT: %.loc8_3.22 => constants.%.296 -// CHECK:STDOUT: %.loc8_3.23 => constants.%inst.as_compatible.276 -// CHECK:STDOUT: %.loc8_3.24 => constants.%.dd8 -// CHECK:STDOUT: %.loc8_3.25 => constants.%.23d -// CHECK:STDOUT: %.loc8_3.26 => constants.%.a98 -// CHECK:STDOUT: %.loc8_3.27 => constants.%inst.as_compatible.c08 +// CHECK:STDOUT: %.loc8_3.11 => constants.%.d2b +// CHECK:STDOUT: %.loc8_3.12 => constants.%.770 +// CHECK:STDOUT: %.loc8_3.13 => constants.%.735308.2 +// CHECK:STDOUT: %.loc8_3.14 => constants.%.e6e +// CHECK:STDOUT: %.loc8_3.15 => constants.%.247 +// CHECK:STDOUT: %.loc8_3.16 => constants.%.cc0a4d.2 +// CHECK:STDOUT: %.loc8_3.17 => constants.%.f9f +// CHECK:STDOUT: %.loc8_3.18 => constants.%.828 +// CHECK:STDOUT: %.loc8_3.19 => constants.%.9e3 +// CHECK:STDOUT: %.loc8_3.20 => constants.%.497 +// CHECK:STDOUT: %.loc8_3.21 => constants.%.30d +// CHECK:STDOUT: %.loc8_3.22 => constants.%.1ea +// CHECK:STDOUT: %.loc8_3.23 => constants.%inst.as_compatible.e16 +// CHECK:STDOUT: %.loc8_3.24 => constants.%.cd7 +// CHECK:STDOUT: %.loc8_3.25 => constants.%.d55 +// CHECK:STDOUT: %.loc8_3.26 => constants.%.61f +// CHECK:STDOUT: %.loc8_3.27 => constants.%inst.as_compatible.313 // CHECK:STDOUT: %.loc8_3.28 => invalid -// CHECK:STDOUT: %.loc8_3.29 => constants.%inst.splice_block.603 +// CHECK:STDOUT: %.loc8_3.29 => constants.%inst.splice_block.478 // CHECK:STDOUT: %.loc8_3.30 => // CHECK:STDOUT: %.loc8_3.31 => invalid -// CHECK:STDOUT: %.loc8_3.32 => constants.%inst.splice_block.35a +// CHECK:STDOUT: %.loc8_3.32 => constants.%inst.splice_block.37a // CHECK:STDOUT: %.loc8_3.33 => constants.%empty_tuple.type // CHECK:STDOUT: %.loc8_3.34 => invalid // CHECK:STDOUT: } diff --git a/toolchain/lower/constant.cpp b/toolchain/lower/constant.cpp index cc17c4107fd2..c0dee609caed 100644 --- a/toolchain/lower/constant.cpp +++ b/toolchain/lower/constant.cpp @@ -373,7 +373,9 @@ static auto MaybeEmitAsConstant(ConstantContext& context, InstT inst) InstT::Kind.constant_kind() == SemIR::InstConstantKind::Indirect || InstT::Kind.constant_kind() == - SemIR::InstConstantKind::SymbolicOnly) { + SemIR::InstConstantKind::SymbolicOnly || + InstT::Kind.constant_kind() == + SemIR::InstConstantKind::TemplateOnly) { CARBON_FATAL("Unexpected constant instruction kind {0}", inst); } else if constexpr (!InstT::Kind.is_lowered()) { // This instruction has a constant value, but that constant value will never diff --git a/toolchain/sem_ir/inst_kind.def b/toolchain/sem_ir/inst_kind.def index 5648b7f741b1..6752c8eab0fe 100644 --- a/toolchain/sem_ir/inst_kind.def +++ b/toolchain/sem_ir/inst_kind.def @@ -44,7 +44,6 @@ CARBON_SEM_IR_INST_KIND(BranchIf) CARBON_SEM_IR_INST_KIND(BranchWithArg) CARBON_SEM_IR_INST_KIND(Call) CARBON_SEM_IR_INST_KIND(CallAction) -CARBON_SEM_IR_INST_KIND(CallCppTemplateAction) CARBON_SEM_IR_INST_KIND(CalleePatternMatchAction) CARBON_SEM_IR_INST_KIND(CallerPatternMatchAction) CARBON_SEM_IR_INST_KIND(CharLiteralType) @@ -161,6 +160,7 @@ CARBON_SEM_IR_INST_KIND(StructType) CARBON_SEM_IR_INST_KIND(StructValue) CARBON_SEM_IR_INST_KIND(SymbolicBinding) CARBON_SEM_IR_INST_KIND(SymbolicBindingPattern) +CARBON_SEM_IR_INST_KIND(TemplateInst) CARBON_SEM_IR_INST_KIND(Temporary) CARBON_SEM_IR_INST_KIND(TemporaryStorage) CARBON_SEM_IR_INST_KIND(TupleAccess) diff --git a/toolchain/sem_ir/inst_kind.h b/toolchain/sem_ir/inst_kind.h index 545af2c0911f..dd70b5a805bf 100644 --- a/toolchain/sem_ir/inst_kind.h +++ b/toolchain/sem_ir/inst_kind.h @@ -180,6 +180,9 @@ enum class InstConstantKind : int8_t { // symbolic constant inst when applied to a symbolic constant, and can be a // concrete reference constant inst when applied to a reference constant. SymbolicOrReference, + // This instruction can be a template constant inst, depending on its + // operands, but never a concrete constant inst. + TemplateOnly, // This instruction is a metaprogramming or template instantiation action that // generates an instruction. Like `SymbolicOnly`, it may be a symbolic // constant inst depending on its operands, but never a concrete constant diff --git a/toolchain/sem_ir/typed_insts.h b/toolchain/sem_ir/typed_insts.h index 993adf261a9b..f004b235263c 100644 --- a/toolchain/sem_ir/typed_insts.h +++ b/toolchain/sem_ir/typed_insts.h @@ -405,21 +405,6 @@ struct CallAction { BoolValue is_desugared; }; -// An action that performs a C++ template call. -struct CallCppTemplateAction { - static constexpr auto Kind = - InstKind::CallCppTemplateAction.Define( - {.ir_name = "call_template_action", - .expr_category = ActionExprCategory(ExprCategory::Value), - .constant_kind = InstConstantKind::InstAction, - .is_lowered = false}); - - TypeId type_id; - ClangDeclId template_decl_id; - // Template arguments. - InstBlockId args_id; -}; - // An action that performs callee-side pattern matching for a single syntactic // parameter. struct CalleePatternMatchAction { @@ -2139,6 +2124,19 @@ struct SymbolicBindingPattern { EntityNameId entity_name_id; }; +// Wraps an instruction and, if that instruction is symbolic, forces it to be +// evaluated as a template. +struct TemplateInst { + static constexpr auto Kind = InstKind::TemplateInst.Define( + {.ir_name = "template_inst", + .expr_category = ComputedExprCategory::SameAsFirstOperand, + .constant_kind = InstConstantKind::TemplateOnly, + .is_lowered = false}); + + TypeId type_id; + InstId inst_id; +}; + // Consumes the initializer `init_id`, uses it to initialize a temporary // object, and forms an ephemeral reference to it. If `init_id` has a // storage arg, it must be a `TemporaryStorage` inst.