diff --git a/toolchain/check/action.cpp b/toolchain/check/action.cpp index a60caecf21a7..319e9cc89368 100644 --- a/toolchain/check/action.cpp +++ b/toolchain/check/action.cpp @@ -11,19 +11,22 @@ #include "toolchain/check/type.h" #include "toolchain/sem_ir/constant.h" #include "toolchain/sem_ir/copy_on_write_block.h" +#include "toolchain/sem_ir/generic.h" #include "toolchain/sem_ir/id_kind.h" #include "toolchain/sem_ir/inst.h" #include "toolchain/sem_ir/typed_insts.h" namespace Carbon::Check { -auto PerformAction(Context& context, SemIR::LocId loc_id, - SemIR::RefineTypeAction action) -> SemIR::InstId { - return AddInst( +auto PerformAction(Context& context, SemIR::SpecificId specific_id, + SemIR::LocId loc_id, SemIR::RefineInstAction action) + -> SemIR::InstId { + return AddInst( context, loc_id, - {.type_id = - context.types().GetTypeIdForTypeInstId(action.inst_type_inst_id), - .source_id = action.inst_id}); + {.type_id = GetTypeOfInstInSpecific(context.sem_ir(), specific_id, + action.inst_id), + .inst_id = action.inst_id, + .specific_id = specific_id}); } static auto OperandDependence(Context& context, SemIR::ConstantId const_id) @@ -125,12 +128,19 @@ static auto OperandDependence(Context& context, SemIR::IdAndKind arg) [&](auto id) { return OperandDependence(context, id); }); } -auto ActionIsPerformable(Context& context, SemIR::Inst action_inst) -> bool { - 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. - return OperandDependence(context, refine_action->inst_type_inst_id) < - SemIR::ConstantDependence::Template; +auto ActionIsPerformable(Context& context, SemIR::Inst action_inst, + SemIR::SpecificId specific_id) -> bool { + if (auto refine_action = action_inst.TryAs()) { + // `RefineInstAction` is performable once the instruction's type and + // constant value are not template-dependent. + return OperandDependence( + context, GetTypeOfInstInSpecific(context.sem_ir(), specific_id, + refine_action->inst_id)) < + SemIR::ConstantDependence::Template && + OperandDependence(context, SemIR::GetConstantValueInSpecific( + context.sem_ir(), specific_id, + refine_action->inst_id)) < + SemIR::ConstantDependence::Template; } // A form-parameterized action is performable if we can see at least the top @@ -207,25 +217,26 @@ static auto RefineTypedOperand(Context& context, SemIR::LocId loc_id, // If the constant value of the instruction is template-dependent and // unattached, replace it with a corresponding attached constant value. - if (auto const_id = context.constant_values().GetAttached(inst_id); - const_id.is_symbolic() && + auto const_id = context.constant_values().GetAttached(inst_id); + if (const_id.is_symbolic() && !context.constant_values().IsAttached(const_id)) { return GetOrAddInstWithSpecificConstantValue(context, inst_id); } - // If the type of the action argument is dependent, refine to an instruction - // with a concrete type. + // If the type or constant value of the action argument is dependent, refine + // to an instruction with the type and value from the specific. if (OperandDependence(context, inst.type_id()) == - SemIR::ConstantDependence::Template) { + SemIR::ConstantDependence::Template || + OperandDependence(context, const_id) == + SemIR::ConstantDependence::Template) { auto type_inst_id = context.types().GetTypeInstId(inst.type_id()); inst_id = AddDependentActionSpliceImpl( context, SemIR::LocIdAndInst( loc_id, - SemIR::RefineTypeAction{.type_id = GetSingletonType( + SemIR::RefineInstAction{.type_id = GetSingletonType( context, SemIR::InstType::TypeInstId), - .inst_id = inst_id, - .inst_type_inst_id = type_inst_id}), + .inst_id = inst_id}), type_inst_id); } diff --git a/toolchain/check/action.h b/toolchain/check/action.h index aaef33d0afa1..a3aae6a26f14 100644 --- a/toolchain/check/action.h +++ b/toolchain/check/action.h @@ -15,12 +15,28 @@ namespace Carbon::Check { namespace Internal { -// Computes the function type to use for PerformAction for InstT. +// Computes the `SpecificId` parameters to use for PerformAction for InstT. template -using FunctionTypeForPerformAction = std::conditional_t< - InstT::Kind.constant_kind() == SemIR::InstConstantKind::InstAction, - auto(Context& context, SemIR::LocId loc_id, InstT inst)->SemIR::InstId, - auto()->void>; +using SpecificParamsForPerformAction = + std::conditional_tvoid, auto()->void>; + +// Computes the function type to use for PerformAction for InstT. +template > +struct FunctionTypeForPerformActionImpl { + // By default, no PerformAction function. + using Type = auto() -> void; +}; +template + requires(InstT::Kind.constant_kind() == SemIR::InstConstantKind::InstAction) +struct FunctionTypeForPerformActionImplvoid> { + using Type = auto(Context& context, SpecificParams..., SemIR::LocId loc_id, + InstT inst) -> SemIR::InstId; +}; +template +using FunctionTypeForPerformAction = + FunctionTypeForPerformActionImpl::Type; } // namespace Internal // Explicitly delete the overload generated for non-action instructions. These @@ -34,6 +50,13 @@ auto PerformAction() -> void = delete; // auto PerformAction(Context& context, SemIR::LocId loc_id, InstT inst) // -> SemIR::InstId; // +// or if action_needs_specific_id = true is specified when defining the +// instruction kind, the signature: +// +// auto PerformAction(Context& context, SemIR::SpecificId specific_id, +// SemIR::LocId loc_id, InstT inst) +// -> SemIR::InstId; +// // that returns the value that should be used as the result of evaluating the // instructions produced by the action. Any instructions generated during // `PerformAction` will be spliced into the code at the point where the action @@ -44,7 +67,8 @@ auto PerformAction() -> void = delete; // Determines whether the given action can be performed immediately (i.e. // whether it is non-template-dependent). -auto ActionIsPerformable(Context& context, SemIR::Inst action_inst) -> bool; +auto ActionIsPerformable(Context& context, SemIR::Inst action_inst, + SemIR::SpecificId specific_id) -> bool; // Returns the constant-dependence of `inst_id` (i.e. the maximum of the // constant-dependences of its type and its value). @@ -84,7 +108,7 @@ auto AddActionSpliceIfDependent(Context& context, LocIdT loc_id, SemIR::TypeInstId expected_result_type_inst_id, ActionT action_inst) -> SemIR::InstId { CARBON_CHECK(action_inst.type_id == SemIR::InstType::TypeId); - if (ActionIsPerformable(context, action_inst)) { + if (ActionIsPerformable(context, action_inst, SemIR::SpecificId::None)) { return SemIR::InstId::None; } return AddDependentActionSplice(context, @@ -136,13 +160,19 @@ auto EndPerformDelayedAction(Context& context, SemIR::InstId result_id) // Performs an action as a result of evaluation of a template's eval block. template -auto PerformDelayedAction(Context& context, SemIR::LocId loc_id, - ActionT action_inst) -> SemIR::InstId { - if (!ActionIsPerformable(context, action_inst)) { +auto PerformDelayedAction(Context& context, SemIR::SpecificId specific_id, + SemIR::LocId loc_id, ActionT action_inst) + -> SemIR::InstId { + if (!ActionIsPerformable(context, action_inst, specific_id)) { return SemIR::InstId::None; } Internal::BeginPerformDelayedAction(context); - auto inst_id = PerformAction(context, loc_id, action_inst); + auto inst_id = SemIR::InstId::None; + if constexpr (ActionT::Kind.action_needs_specific_id()) { + inst_id = PerformAction(context, specific_id, loc_id, action_inst); + } else { + inst_id = PerformAction(context, loc_id, action_inst); + } return Internal::EndPerformDelayedAction(context, inst_id); } diff --git a/toolchain/check/eval.cpp b/toolchain/check/eval.cpp index 7e8ccbc91ca5..2b6b9072704a 100644 --- a/toolchain/check/eval.cpp +++ b/toolchain/check/eval.cpp @@ -219,6 +219,8 @@ class EvalContext { auto sem_ir() -> SemIR::File& { return context().sem_ir(); } + auto specific_id() -> SemIR::SpecificId { return specific_id_; } + auto emitter() -> DiagnosticEmitterBase& { return context().emitter(); } protected: @@ -3116,7 +3118,8 @@ static auto TryEvalTypedInst(EvalContext& eval_context, SemIR::InstId inst_id, return MakeConstantResult(eval_context.context(), inst, phase); } else if constexpr (ConstantKind == SemIR::InstConstantKind::InstAction) { auto result_inst_id = PerformDelayedAction( - eval_context.context(), SemIR::LocId(inst_id), inst.As()); + eval_context.context(), eval_context.specific_id(), + SemIR::LocId(inst_id), inst.As()); if (result_inst_id.has_value()) { // The result is an instruction. return MakeConstantResult( diff --git a/toolchain/check/eval_inst.cpp b/toolchain/check/eval_inst.cpp index 46c09a156a07..dcffac3760db 100644 --- a/toolchain/check/eval_inst.cpp +++ b/toolchain/check/eval_inst.cpp @@ -736,6 +736,13 @@ auto EvalConstantInst(Context& context, SemIR::InstId inst_id, .specific_id = specific_id}); } +auto EvalConstantInst(Context& context, SemIR::SpecificInst inst) + -> ConstantEvalResult { + // Pull the constant value out of the specific. + return ConstantEvalResult::Existing(SemIR::GetConstantValueInSpecific( + context.sem_ir(), inst.specific_id, inst.inst_id)); +} + auto EvalConstantInst(Context& context, SemIR::InstId inst_id, SemIR::SpecificFunction inst) -> ConstantEvalResult { auto callee_function = diff --git a/toolchain/check/testdata/array/init_dependent_bound.carbon b/toolchain/check/testdata/array/init_dependent_bound.carbon index 90366e9d7dcc..7a7cff93f62d 100644 --- a/toolchain/check/testdata/array/init_dependent_bound.carbon +++ b/toolchain/check/testdata/array/init_dependent_bound.carbon @@ -176,12 +176,13 @@ fn H() { G(3); } // CHECK:STDOUT: %N.patt.38a: %pattern_type.6b6 = symbolic_binding_pattern N, 0, template [template] // CHECK:STDOUT: %N.37f: %i32 = symbolic_binding N, 0, template [template] // CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %.233: Core.IntLiteral = splice_inst @G.%.loc11_30.2 [template] -// CHECK:STDOUT: %array_type.3cc: type = array_type %.233, %i32 [template] -// CHECK:STDOUT: %require_complete.2bf: = require_complete_type %array_type.3cc [template] -// CHECK:STDOUT: %pattern_type.ed3: type = pattern_type %array_type.3cc [template] -// CHECK:STDOUT: %arr.patt.515: %pattern_type.ed3 = ref_binding_pattern arr [template] -// CHECK:STDOUT: %arr.var_patt.821: %pattern_type.ed3 = var_pattern %arr.patt.515 [template] +// CHECK:STDOUT: %.159: %i32 = splice_inst @G.%.loc11_30.3 [template] +// CHECK:STDOUT: %.a08: Core.IntLiteral = splice_inst @G.%.loc11_30.5 [template] +// CHECK:STDOUT: %array_type.cbf: type = array_type %.a08, %i32 [template] +// CHECK:STDOUT: %require_complete.f6a: = require_complete_type %array_type.cbf [template] +// CHECK:STDOUT: %pattern_type.fca: type = pattern_type %array_type.cbf [template] +// CHECK:STDOUT: %arr.patt.184: %pattern_type.fca = ref_binding_pattern arr [template] +// CHECK:STDOUT: %arr.var_patt.f2d: %pattern_type.fca = var_pattern %arr.patt.184 [template] // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete] // CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete] // CHECK:STDOUT: %int_3.1ba: Core.IntLiteral = int_value 3 [concrete] @@ -193,14 +194,17 @@ fn H() { G(3); } // 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: %.a09: %array_type.3cc = splice_inst @G.%.loc11_3.4 [template] -// CHECK:STDOUT: %.b71: @G.%.loc11_3.7 (@G.%.loc11_3.7) = splice_inst @G.%.loc11_3.6 [template] -// CHECK:STDOUT: %.098: @G.%.loc11_3.10 (@G.%.loc11_3.10) = splice_inst @G.%.loc11_3.9 [template] +// CHECK:STDOUT: %.61d: %array_type.cbf = splice_inst @G.%.loc11_3.4 [template] +// CHECK:STDOUT: %.dde: @G.%.loc11_3.7 (@G.%.loc11_3.7) = splice_inst @G.%.loc11_3.6 [template] +// CHECK:STDOUT: %.cfd: @G.%.loc11_3.10 (@G.%.loc11_3.10) = splice_inst @G.%.loc11_3.9 [template] // CHECK:STDOUT: %From: Core.IntLiteral = symbolic_binding From, 0 [symbolic] // CHECK:STDOUT: %ImplicitAs.type.7cb: type = facet_type <@ImplicitAs, @ImplicitAs(Core.IntLiteral)> [concrete] // CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.type.48d: type = fn_type @Int.as.ImplicitAs.impl.Convert, @Int.as.ImplicitAs.impl(%From) [symbolic] // CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.0f9: %Int.as.ImplicitAs.impl.Convert.type.48d = struct_value () [symbolic] // CHECK:STDOUT: %int_3.410: %i32 = int_value 3 [concrete] +// CHECK:STDOUT: %inst.specific_inst.923: = inst_value [concrete] { +// CHECK:STDOUT: %.dad: %i32 = specific_inst %int_3.410, @G(%int_3.410) [concrete = %int_3.410] +// CHECK:STDOUT: } // CHECK:STDOUT: %ImplicitAs.impl_witness.590: = impl_witness imports.%ImplicitAs.impl_witness_table.204, @Int.as.ImplicitAs.impl(%int_32) [concrete] // CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.type.683: type = fn_type @Int.as.ImplicitAs.impl.Convert, @Int.as.ImplicitAs.impl(%int_32) [concrete] // CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.69e: %Int.as.ImplicitAs.impl.Convert.type.683 = struct_value () [concrete] @@ -225,8 +229,8 @@ fn H() { G(3); } // CHECK:STDOUT: %pattern_type.771: type = pattern_type %array_type.dc7 [concrete] // CHECK:STDOUT: %arr.patt.316: %pattern_type.771 = ref_binding_pattern arr [concrete] // CHECK:STDOUT: %arr.var_patt.c63: %pattern_type.771 = var_pattern %arr.patt.316 [concrete] -// CHECK:STDOUT: %inst.as_compatible: = inst_value [concrete] { -// CHECK:STDOUT: %.723: ref %array_type.dc7 = as_compatible @G.%arr.var +// CHECK:STDOUT: %inst.specific_inst.d8f: = inst_value [concrete] { +// CHECK:STDOUT: %.ef0: ref %array_type.dc7 = specific_inst @G.%arr.var, @G(%int_3.410) // CHECK:STDOUT: } // CHECK:STDOUT: %Destroy.Op.type.1d8f74.3: type = fn_type @Destroy.Op.loc11_3.3 [concrete] // CHECK:STDOUT: %Destroy.Op.1a2547.3: %Destroy.Op.type.1d8f74.3 = struct_value () [concrete] @@ -234,14 +238,14 @@ fn H() { G(3); } // CHECK:STDOUT: %Destroy.facet.9a9: %Destroy.type = facet_value %array_type.dc7, (%custom_witness.df9cc1.3) [concrete] // CHECK:STDOUT: %Destroy.WithSelf.Op.type.642: type = fn_type @Destroy.WithSelf.Op, @Destroy.WithSelf(%Destroy.facet.9a9) [concrete] // CHECK:STDOUT: %.6cd: type = fn_type_with_self_type %Destroy.WithSelf.Op.type.642, %Destroy.facet.9a9 [concrete] -// CHECK:STDOUT: %inst.splice_block.adf: = inst_value [concrete] { -// CHECK:STDOUT: %.6fe: = splice_block %bound_method.69b { +// CHECK:STDOUT: %inst.splice_block.de7: = inst_value [concrete] { +// CHECK:STDOUT: %.d24: = splice_block %bound_method.6cc { // CHECK:STDOUT: %impl.elem0.ef2: %.6cd = impl_witness_access %custom_witness.df9cc1.3, element0 [concrete = %Destroy.Op.1a2547.3] -// CHECK:STDOUT: %bound_method.69b: = bound_method %.723, %impl.elem0.ef2 +// CHECK:STDOUT: %bound_method.6cc: = bound_method %.ef0, %impl.elem0.ef2 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: %inst.call: = inst_value [concrete] { -// CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %.6fe(%.723) +// CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %.d24(%.ef0) // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -255,44 +259,47 @@ fn H() { G(3); } // CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %.loc11_30.2: = convert_to_value_action %N.ref, Core.IntLiteral [template] -// CHECK:STDOUT: %.loc11_30.3: Core.IntLiteral = splice_inst %.loc11_30.2 [template = %.loc11_30.3 (constants.%.233)] -// CHECK:STDOUT: %array_type.loc11_31.2: type = array_type %.loc11_30.3, constants.%i32 [template = %array_type.loc11_31.2 (constants.%array_type.3cc)] -// CHECK:STDOUT: %require_complete: = require_complete_type %array_type.loc11_31.2 [template = %require_complete (constants.%require_complete.2bf)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %array_type.loc11_31.2 [template = %pattern_type (constants.%pattern_type.ed3)] -// CHECK:STDOUT: %arr.patt.loc11_17.2: @G.%pattern_type (%pattern_type.ed3) = ref_binding_pattern arr [template = %arr.patt.loc11_17.2 (constants.%arr.patt.515)] -// CHECK:STDOUT: %arr.var_patt.loc11_3.2: @G.%pattern_type (%pattern_type.ed3) = var_pattern %arr.patt.loc11_17.2 [template = %arr.var_patt.loc11_3.2 (constants.%arr.var_patt.821)] -// CHECK:STDOUT: %.loc11_3.4: = refine_type_action %arr.var, %array_type.loc11_31.2 [template] -// CHECK:STDOUT: %.loc11_3.5: @G.%array_type.loc11_31.2 (%array_type.3cc) = splice_inst %.loc11_3.4 [template = %.loc11_3.5 (constants.%.a09)] +// CHECK:STDOUT: %.loc11_30.3: = refine_inst_action %N.ref [template] +// CHECK:STDOUT: %.loc11_30.4: %i32 = splice_inst %.loc11_30.3 [template = %.loc11_30.4 (constants.%.159)] +// CHECK:STDOUT: %.loc11_30.5: = convert_to_value_action %.loc11_30.1, Core.IntLiteral [template] +// CHECK:STDOUT: %.loc11_30.6: Core.IntLiteral = splice_inst %.loc11_30.5 [template = %.loc11_30.6 (constants.%.a08)] +// CHECK:STDOUT: %array_type.loc11_31.2: type = array_type %.loc11_30.6, constants.%i32 [template = %array_type.loc11_31.2 (constants.%array_type.cbf)] +// CHECK:STDOUT: %require_complete: = require_complete_type %array_type.loc11_31.2 [template = %require_complete (constants.%require_complete.f6a)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %array_type.loc11_31.2 [template = %pattern_type (constants.%pattern_type.fca)] +// CHECK:STDOUT: %arr.patt.loc11_17.2: @G.%pattern_type (%pattern_type.fca) = ref_binding_pattern arr [template = %arr.patt.loc11_17.2 (constants.%arr.patt.184)] +// CHECK:STDOUT: %arr.var_patt.loc11_3.2: @G.%pattern_type (%pattern_type.fca) = var_pattern %arr.patt.loc11_17.2 [template = %arr.var_patt.loc11_3.2 (constants.%arr.var_patt.f2d)] +// CHECK:STDOUT: %.loc11_3.4: = refine_inst_action %arr.var [template] +// CHECK:STDOUT: %.loc11_3.5: @G.%array_type.loc11_31.2 (%array_type.cbf) = splice_inst %.loc11_3.4 [template = %.loc11_3.5 (constants.%.61d)] // CHECK:STDOUT: %.loc11_3.6: = compound_member_access_action %.loc11_3.1, constants.%assoc0.ae8 [template] // CHECK:STDOUT: %.loc11_3.7: type = type_of_inst %.loc11_3.6 [template] -// CHECK:STDOUT: %.loc11_3.8: @G.%.loc11_3.7 (@G.%.loc11_3.7) = splice_inst %.loc11_3.6 [template = %.loc11_3.8 (constants.%.b71)] +// CHECK:STDOUT: %.loc11_3.8: @G.%.loc11_3.7 (@G.%.loc11_3.7) = splice_inst %.loc11_3.6 [template = %.loc11_3.8 (constants.%.dde)] // CHECK:STDOUT: %.loc11_3.9: = call_action (%.loc11_3.2), true [template] // CHECK:STDOUT: %.loc11_3.10: type = type_of_inst %.loc11_3.9 [template] -// CHECK:STDOUT: %.loc11_3.11: @G.%.loc11_3.10 (@G.%.loc11_3.10) = splice_inst %.loc11_3.9 [template = %.loc11_3.11 (constants.%.098)] +// CHECK:STDOUT: %.loc11_3.11: @G.%.loc11_3.10 (@G.%.loc11_3.10) = splice_inst %.loc11_3.9 [template = %.loc11_3.11 (constants.%.cfd)] // CHECK:STDOUT: // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %arr.var: ref @G.%array_type.loc11_31.2 (%array_type.3cc) = var_storage %arr.var_patt.loc11_3.1 +// CHECK:STDOUT: %arr.var: ref @G.%array_type.loc11_31.2 (%array_type.cbf) = var_storage %arr.var_patt.loc11_3.1 // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1] // CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete = constants.%int_2] // CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete = constants.%int_3.1ba] // CHECK:STDOUT: %.loc11_43: %tuple.type = tuple_literal (%int_1, %int_2, %int_3) [concrete = constants.%tuple] // CHECK:STDOUT: assign %arr.var, -// CHECK:STDOUT: %.loc11_31: type = splice_block %array_type.loc11_31.1 [template = %array_type.loc11_31.2 (constants.%array_type.3cc)] { +// CHECK:STDOUT: %.loc11_31: type = splice_block %array_type.loc11_31.1 [template = %array_type.loc11_31.2 (constants.%array_type.cbf)] { // CHECK:STDOUT: %i32.loc11: type = type_literal constants.%i32 [concrete = constants.%i32] // CHECK:STDOUT: %N.ref: %i32 = name_ref N, %N.loc5_16.2 [template = %N.loc5_16.1 (constants.%N.37f)] -// CHECK:STDOUT: %.loc11_30.1: Core.IntLiteral = splice_inst %.loc11_30.2 [template = %.loc11_30.3 (constants.%.233)] -// CHECK:STDOUT: %array_type.loc11_31.1: type = array_type %.loc11_30.1, %i32.loc11 [template = %array_type.loc11_31.2 (constants.%array_type.3cc)] +// CHECK:STDOUT: %.loc11_30.1: %i32 = splice_inst %.loc11_30.3 [template = %.loc11_30.4 (constants.%.159)] +// CHECK:STDOUT: %.loc11_30.2: Core.IntLiteral = splice_inst %.loc11_30.5 [template = %.loc11_30.6 (constants.%.a08)] +// CHECK:STDOUT: %array_type.loc11_31.1: type = array_type %.loc11_30.2, %i32.loc11 [template = %array_type.loc11_31.2 (constants.%array_type.cbf)] // CHECK:STDOUT: } -// CHECK:STDOUT: %arr: ref @G.%array_type.loc11_31.2 (%array_type.3cc) = wrapper_binding arr, %arr.var +// CHECK:STDOUT: %arr: ref @G.%array_type.loc11_31.2 (%array_type.cbf) = wrapper_binding arr, %arr.var // CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %arr.patt.loc11_17.1: @G.%pattern_type (%pattern_type.ed3) = ref_binding_pattern arr [template = %arr.patt.loc11_17.2 (constants.%arr.patt.515)] -// CHECK:STDOUT: %arr.var_patt.loc11_3.1: @G.%pattern_type (%pattern_type.ed3) = var_pattern %arr.patt.loc11_17.1 [template = %arr.var_patt.loc11_3.2 (constants.%arr.var_patt.821)] +// CHECK:STDOUT: %arr.patt.loc11_17.1: @G.%pattern_type (%pattern_type.fca) = ref_binding_pattern arr [template = %arr.patt.loc11_17.2 (constants.%arr.patt.184)] +// CHECK:STDOUT: %arr.var_patt.loc11_3.1: @G.%pattern_type (%pattern_type.fca) = var_pattern %arr.patt.loc11_17.1 [template = %arr.var_patt.loc11_3.2 (constants.%arr.var_patt.f2d)] // CHECK:STDOUT: } -// CHECK:STDOUT: %.loc11_3.1: @G.%array_type.loc11_31.2 (%array_type.3cc) = splice_inst %.loc11_3.4 [template = %.loc11_3.5 (constants.%.a09)] -// CHECK:STDOUT: %.loc11_3.2: @G.%.loc11_3.7 (@G.%.loc11_3.7) = splice_inst %.loc11_3.6 [template = %.loc11_3.8 (constants.%.b71)] -// CHECK:STDOUT: %.loc11_3.3: @G.%.loc11_3.10 (@G.%.loc11_3.10) = splice_inst %.loc11_3.9 [template = %.loc11_3.11 (constants.%.098)] +// CHECK:STDOUT: %.loc11_3.1: @G.%array_type.loc11_31.2 (%array_type.cbf) = splice_inst %.loc11_3.4 [template = %.loc11_3.5 (constants.%.61d)] +// CHECK:STDOUT: %.loc11_3.2: @G.%.loc11_3.7 (@G.%.loc11_3.7) = splice_inst %.loc11_3.6 [template = %.loc11_3.8 (constants.%.dde)] +// CHECK:STDOUT: %.loc11_3.3: @G.%.loc11_3.10 (@G.%.loc11_3.10) = splice_inst %.loc11_3.9 [template = %.loc11_3.11 (constants.%.cfd)] // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -319,16 +326,18 @@ fn H() { G(3); } // CHECK:STDOUT: %N.loc5_16.1 => constants.%int_3.410 // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %.loc11_30.2 => constants.%inst.splice_block.ca0 -// CHECK:STDOUT: %.loc11_30.3 => constants.%int_3.1ba +// CHECK:STDOUT: %.loc11_30.3 => constants.%inst.specific_inst.923 +// CHECK:STDOUT: %.loc11_30.4 => constants.%int_3.410 +// CHECK:STDOUT: %.loc11_30.5 => constants.%inst.splice_block.ca0 +// CHECK:STDOUT: %.loc11_30.6 => constants.%int_3.1ba // CHECK:STDOUT: %array_type.loc11_31.2 => constants.%array_type.dc7 // CHECK:STDOUT: %require_complete => constants.%complete_type.b77 // CHECK:STDOUT: %pattern_type => constants.%pattern_type.771 // CHECK:STDOUT: %arr.patt.loc11_17.2 => constants.%arr.patt.316 // CHECK:STDOUT: %arr.var_patt.loc11_3.2 => constants.%arr.var_patt.c63 -// CHECK:STDOUT: %.loc11_3.4 => constants.%inst.as_compatible +// CHECK:STDOUT: %.loc11_3.4 => constants.%inst.specific_inst.d8f // CHECK:STDOUT: %.loc11_3.5 => invalid -// CHECK:STDOUT: %.loc11_3.6 => constants.%inst.splice_block.adf +// CHECK:STDOUT: %.loc11_3.6 => constants.%inst.splice_block.de7 // CHECK:STDOUT: %.loc11_3.7 => // CHECK:STDOUT: %.loc11_3.8 => invalid // CHECK:STDOUT: %.loc11_3.9 => constants.%inst.call diff --git a/toolchain/check/testdata/class/destroy_calls.carbon b/toolchain/check/testdata/class/destroy_calls.carbon index 2e464225119b..6b5ab26bd122 100644 --- a/toolchain/check/testdata/class/destroy_calls.carbon +++ b/toolchain/check/testdata/class/destroy_calls.carbon @@ -571,30 +571,34 @@ fn G() { F({}); } // CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %.d24: @F.%.loc7_20.5 (@F.%.loc7_20.5) = splice_inst @F.%.loc7_20.4 [template] -// CHECK:STDOUT: %.44c: type = splice_inst @F.%.loc7_20.7 [template] -// CHECK:STDOUT: %require_complete: = require_complete_type %.44c [template] -// CHECK:STDOUT: %pattern_type.c25: type = pattern_type %.44c [template] -// CHECK:STDOUT: %v.patt.0c8: %pattern_type.c25 = ref_binding_pattern v [template] -// CHECK:STDOUT: %v.var_patt.7d8: %pattern_type.c25 = var_pattern %v.patt.0c8 [template] +// CHECK:STDOUT: %.eec: type = splice_inst @F.%.loc7_20.5 [template] +// CHECK:STDOUT: %.195: @F.%.loc7_20.8 (@F.%.loc7_20.8) = splice_inst @F.%.loc7_20.7 [template] +// CHECK:STDOUT: %.53f: type = splice_inst @F.%.loc7_20.10 [template] +// CHECK:STDOUT: %require_complete: = require_complete_type %.53f [template] +// CHECK:STDOUT: %pattern_type.7d1: type = pattern_type %.53f [template] +// CHECK:STDOUT: %v.patt.7b6: %pattern_type.7d1 = ref_binding_pattern v [template] +// CHECK:STDOUT: %v.var_patt.067: %pattern_type.7d1 = var_pattern %v.patt.7b6 [template] // CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete] // CHECK:STDOUT: %ImplicitAs.type.0ff: type = generic_interface_type @ImplicitAs [concrete] // CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.0ff = struct_value () [concrete] -// CHECK:STDOUT: %.d189f7.1: @F.%.loc7_3.12 (@F.%.loc7_3.12) = splice_inst @F.%.loc7_3.11 [template] -// CHECK:STDOUT: %.269993.1: @F.%.loc7_3.15 (@F.%.loc7_3.15) = splice_inst @F.%.loc7_3.14 [template] -// CHECK:STDOUT: %.0e8: @F.%.loc7_3.18 (@F.%.loc7_3.18) = splice_inst @F.%.loc7_3.17 [template] -// CHECK:STDOUT: %.820: @F.%.loc7_3.21 (@F.%.loc7_3.21) = splice_inst @F.%.loc7_3.20 [template] -// CHECK:STDOUT: %.a9b: %.44c = splice_inst @F.%.loc7_3.23 [template] -// CHECK:STDOUT: %.65c: %.44c = splice_inst @F.%.loc7_3.25 [template] +// CHECK:STDOUT: %.88d2c8.1: @F.%.loc7_3.12 (@F.%.loc7_3.12) = splice_inst @F.%.loc7_3.11 [template] +// CHECK:STDOUT: %.45c659.1: @F.%.loc7_3.15 (@F.%.loc7_3.15) = splice_inst @F.%.loc7_3.14 [template] +// CHECK:STDOUT: %.fa1: @F.%.loc7_3.18 (@F.%.loc7_3.18) = splice_inst @F.%.loc7_3.17 [template] +// CHECK:STDOUT: %.e13: @F.%.loc7_3.21 (@F.%.loc7_3.21) = splice_inst @F.%.loc7_3.20 [template] +// CHECK:STDOUT: %.6ec: %.53f = splice_inst @F.%.loc7_3.23 [template] +// CHECK:STDOUT: %.817: %.53f = splice_inst @F.%.loc7_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: %.0d4: %.44c = splice_inst @F.%.loc7_3.27 [template] -// CHECK:STDOUT: %.e5e: @F.%.loc7_3.30 (@F.%.loc7_3.30) = splice_inst @F.%.loc7_3.29 [template] -// CHECK:STDOUT: %.d90: @F.%.loc7_3.33 (@F.%.loc7_3.33) = splice_inst @F.%.loc7_3.32 [template] +// CHECK:STDOUT: %.14f: %.53f = splice_inst @F.%.loc7_3.27 [template] +// CHECK:STDOUT: %.869: @F.%.loc7_3.30 (@F.%.loc7_3.30) = splice_inst @F.%.loc7_3.29 [template] +// CHECK:STDOUT: %.3d1: @F.%.loc7_3.33 (@F.%.loc7_3.33) = splice_inst @F.%.loc7_3.32 [template] +// CHECK:STDOUT: %inst.specific_inst.c72: = inst_value [concrete] { +// CHECK:STDOUT: %.62d: type = specific_inst %empty_struct_type, @F(%empty_struct_type) [concrete = %empty_struct_type] +// CHECK:STDOUT: } // CHECK:STDOUT: %C.d8efcc.1: type = class_type @C, @C(%empty_struct_type) [concrete] // CHECK:STDOUT: %inst.class_type: = inst_value [concrete] { // CHECK:STDOUT: %C.d8efcc.2: type = class_type @C, @C(%empty_struct_type) [concrete = %C.d8efcc.1] @@ -605,26 +609,24 @@ fn G() { F({}); } // CHECK:STDOUT: %pattern_type.2fd: type = pattern_type %C.d8efcc.1 [concrete] // CHECK:STDOUT: %v.patt.0e7: %pattern_type.2fd = ref_binding_pattern v [concrete] // CHECK:STDOUT: %v.var_patt.259: %pattern_type.2fd = var_pattern %v.patt.0e7 [concrete] -// CHECK:STDOUT: %.690: = call_action (%ImplicitAs.generic, %.44c), false [template] -// CHECK:STDOUT: %.816: type = type_of_inst %.690 [template] -// CHECK:STDOUT: %.d189f7.2: %.816 = splice_inst %.690 [template] -// CHECK:STDOUT: %.7f1: = access_member_action %.d189f7.2, Convert [template] -// CHECK:STDOUT: %.d9e: type = type_of_inst %.7f1 [template] -// CHECK:STDOUT: %.269993.2: %.d9e = splice_inst %.7f1 [template] -// CHECK:STDOUT: %.190: = compound_member_access_action %empty_struct, %.269993.2 [template] -// CHECK:STDOUT: %.46e: type = type_of_inst %.190 [template] -// CHECK:STDOUT: %.27f: %.46e = splice_inst %.190 [template] -// CHECK:STDOUT: %.f03: = call_action (%.27f), true [template] -// CHECK:STDOUT: %.c52: type = type_of_inst %.f03 [template] -// CHECK:STDOUT: %.94d: %.c52 = splice_inst %.f03 [template] -// CHECK:STDOUT: %.2ea: %C.d8efcc.1 = splice_inst %.f03 [template] -// CHECK:STDOUT: %inst.as_compatible.be6: = inst_value [concrete] { -// CHECK:STDOUT: %.cda: %C.d8efcc.1 = as_compatible %.94d [template = %.2ea] -// CHECK:STDOUT: } -// CHECK:STDOUT: %.610: = convert_to_category_action %.2ea, element10 [template] -// CHECK:STDOUT: %.47a: %C.d8efcc.1 = splice_inst %.610 [template] -// CHECK:STDOUT: %inst.as_compatible.6fd: = inst_value [concrete] { -// CHECK:STDOUT: %.36e: ref %C.d8efcc.1 = as_compatible @F.%v.var +// CHECK:STDOUT: %.0a6: = call_action (%ImplicitAs.generic, %.53f), false [template] +// CHECK:STDOUT: %.48a: type = type_of_inst %.0a6 [template] +// CHECK:STDOUT: %.88d2c8.2: %.48a = splice_inst %.0a6 [template] +// CHECK:STDOUT: %.53c: = access_member_action %.88d2c8.2, Convert [template] +// CHECK:STDOUT: %.ceb: type = type_of_inst %.53c [template] +// CHECK:STDOUT: %.45c659.2: %.ceb = splice_inst %.53c [template] +// CHECK:STDOUT: %.1e2: = compound_member_access_action %empty_struct, %.45c659.2 [template] +// CHECK:STDOUT: %.4f9: type = type_of_inst %.1e2 [template] +// CHECK:STDOUT: %.bc1: %.4f9 = splice_inst %.1e2 [template] +// CHECK:STDOUT: %.1ec: = call_action (%.bc1), true [template] +// CHECK:STDOUT: %.65e: type = type_of_inst %.1ec [template] +// CHECK:STDOUT: %.fc2: %.65e = splice_inst %.1ec [template] +// CHECK:STDOUT: %.e48: = refine_inst_action %.fc2 [template] +// CHECK:STDOUT: %.118: %C.d8efcc.1 = splice_inst %.e48 [template] +// CHECK:STDOUT: %.663: = convert_to_category_action %.118, element10 [template] +// CHECK:STDOUT: %.e51: %C.d8efcc.1 = splice_inst %.663 [template] +// CHECK:STDOUT: %inst.specific_inst.2e8: = inst_value [concrete] { +// CHECK:STDOUT: %.d94: ref %C.d8efcc.1 = specific_inst @F.%v.var, @F(%empty_struct_type) // CHECK:STDOUT: } // CHECK:STDOUT: %Destroy.Op.type.1d8f74.2: type = fn_type @Destroy.Op.loc7_3.2 [concrete] // CHECK:STDOUT: %Destroy.Op.1a2547.2: %Destroy.Op.type.1d8f74.2 = struct_value () [concrete] @@ -632,14 +634,14 @@ fn G() { F({}); } // CHECK:STDOUT: %Destroy.facet.da3: %Destroy.type = facet_value %C.d8efcc.1, (%custom_witness.df9cc1.2) [concrete] // CHECK:STDOUT: %Destroy.WithSelf.Op.type.294: type = fn_type @Destroy.WithSelf.Op, @Destroy.WithSelf(%Destroy.facet.da3) [concrete] // CHECK:STDOUT: %.98c: type = fn_type_with_self_type %Destroy.WithSelf.Op.type.294, %Destroy.facet.da3 [concrete] -// CHECK:STDOUT: %inst.splice_block.b81: = inst_value [concrete] { -// CHECK:STDOUT: %.99b: = splice_block %bound_method { +// CHECK:STDOUT: %inst.splice_block.5e8: = inst_value [concrete] { +// CHECK:STDOUT: %.b36: = splice_block %bound_method { // CHECK:STDOUT: %impl.elem0: %.98c = impl_witness_access %custom_witness.df9cc1.2, element0 [concrete = %Destroy.Op.1a2547.2] -// CHECK:STDOUT: %bound_method: = bound_method %.36e, %impl.elem0 +// CHECK:STDOUT: %bound_method: = bound_method %.d94, %impl.elem0 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: %inst.call: = inst_value [concrete] { -// CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %.99b(%.36e) +// CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %.b36(%.d94) // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -664,66 +666,69 @@ fn G() { F({}); } // CHECK:STDOUT: %T.loc6_16.1: type = symbolic_binding T, 0, template [template = %T.loc6_16.1 (constants.%T)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %.loc7_20.4: = call_action (%C.ref, %T.ref), false [template] -// CHECK:STDOUT: %.loc7_20.5: type = type_of_inst %.loc7_20.4 [template] -// CHECK:STDOUT: %.loc7_20.6: @F.%.loc7_20.5 (@F.%.loc7_20.5) = splice_inst %.loc7_20.4 [template = %.loc7_20.6 (constants.%.d24)] -// CHECK:STDOUT: %.loc7_20.7: = convert_to_value_action %.loc7_20.2, type [template] -// CHECK:STDOUT: %.loc7_20.8: type = splice_inst %.loc7_20.7 [template = %.loc7_20.8 (constants.%.44c)] -// CHECK:STDOUT: %require_complete: = require_complete_type %.loc7_20.8 [template = %require_complete (constants.%require_complete)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %.loc7_20.8 [template = %pattern_type (constants.%pattern_type.c25)] -// CHECK:STDOUT: %v.patt.loc7_15.2: @F.%pattern_type (%pattern_type.c25) = ref_binding_pattern v [template = %v.patt.loc7_15.2 (constants.%v.patt.0c8)] -// CHECK:STDOUT: %v.var_patt.loc7_3.2: @F.%pattern_type (%pattern_type.c25) = var_pattern %v.patt.loc7_15.2 [template = %v.var_patt.loc7_3.2 (constants.%v.var_patt.7d8)] -// CHECK:STDOUT: %.loc7_3.11: = call_action (constants.%ImplicitAs.generic, constants.%.44c), false [template] +// CHECK:STDOUT: %.loc7_20.5: = refine_inst_action %T.ref [template] +// CHECK:STDOUT: %.loc7_20.6: type = splice_inst %.loc7_20.5 [template = %.loc7_20.6 (constants.%.eec)] +// CHECK:STDOUT: %.loc7_20.7: = call_action (%C.ref, %.loc7_20.2), false [template] +// CHECK:STDOUT: %.loc7_20.8: type = type_of_inst %.loc7_20.7 [template] +// CHECK:STDOUT: %.loc7_20.9: @F.%.loc7_20.8 (@F.%.loc7_20.8) = splice_inst %.loc7_20.7 [template = %.loc7_20.9 (constants.%.195)] +// CHECK:STDOUT: %.loc7_20.10: = convert_to_value_action %.loc7_20.3, type [template] +// CHECK:STDOUT: %.loc7_20.11: type = splice_inst %.loc7_20.10 [template = %.loc7_20.11 (constants.%.53f)] +// CHECK:STDOUT: %require_complete: = require_complete_type %.loc7_20.11 [template = %require_complete (constants.%require_complete)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %.loc7_20.11 [template = %pattern_type (constants.%pattern_type.7d1)] +// CHECK:STDOUT: %v.patt.loc7_15.2: @F.%pattern_type (%pattern_type.7d1) = ref_binding_pattern v [template = %v.patt.loc7_15.2 (constants.%v.patt.7b6)] +// CHECK:STDOUT: %v.var_patt.loc7_3.2: @F.%pattern_type (%pattern_type.7d1) = var_pattern %v.patt.loc7_15.2 [template = %v.var_patt.loc7_3.2 (constants.%v.var_patt.067)] +// CHECK:STDOUT: %.loc7_3.11: = call_action (constants.%ImplicitAs.generic, constants.%.53f), false [template] // CHECK:STDOUT: %.loc7_3.12: type = type_of_inst %.loc7_3.11 [template] -// CHECK:STDOUT: %.loc7_3.13: @F.%.loc7_3.12 (@F.%.loc7_3.12) = splice_inst %.loc7_3.11 [template = %.loc7_3.13 (constants.%.d189f7.1)] +// CHECK:STDOUT: %.loc7_3.13: @F.%.loc7_3.12 (@F.%.loc7_3.12) = splice_inst %.loc7_3.11 [template = %.loc7_3.13 (constants.%.88d2c8.1)] // CHECK:STDOUT: %.loc7_3.14: = access_member_action %.loc7_3.1, Convert [template] // CHECK:STDOUT: %.loc7_3.15: type = type_of_inst %.loc7_3.14 [template] -// CHECK:STDOUT: %.loc7_3.16: @F.%.loc7_3.15 (@F.%.loc7_3.15) = splice_inst %.loc7_3.14 [template = %.loc7_3.16 (constants.%.269993.1)] +// CHECK:STDOUT: %.loc7_3.16: @F.%.loc7_3.15 (@F.%.loc7_3.15) = splice_inst %.loc7_3.14 [template = %.loc7_3.16 (constants.%.45c659.1)] // CHECK:STDOUT: %.loc7_3.17: = compound_member_access_action %.loc7_25, %.loc7_3.2 [template] // CHECK:STDOUT: %.loc7_3.18: type = type_of_inst %.loc7_3.17 [template] -// CHECK:STDOUT: %.loc7_3.19: @F.%.loc7_3.18 (@F.%.loc7_3.18) = splice_inst %.loc7_3.17 [template = %.loc7_3.19 (constants.%.0e8)] +// CHECK:STDOUT: %.loc7_3.19: @F.%.loc7_3.18 (@F.%.loc7_3.18) = splice_inst %.loc7_3.17 [template = %.loc7_3.19 (constants.%.fa1)] // CHECK:STDOUT: %.loc7_3.20: = call_action (%.loc7_3.3), true [template] // CHECK:STDOUT: %.loc7_3.21: type = type_of_inst %.loc7_3.20 [template] -// CHECK:STDOUT: %.loc7_3.22: @F.%.loc7_3.21 (@F.%.loc7_3.21) = splice_inst %.loc7_3.20 [template = %.loc7_3.22 (constants.%.820)] -// CHECK:STDOUT: %.loc7_3.23: = refine_type_action %.loc7_3.5, %.loc7_20.8 [template] -// CHECK:STDOUT: %.loc7_3.24: @F.%.loc7_20.8 (%.44c) = splice_inst %.loc7_3.23 [template = %.loc7_3.24 (constants.%.a9b)] +// CHECK:STDOUT: %.loc7_3.22: @F.%.loc7_3.21 (@F.%.loc7_3.21) = splice_inst %.loc7_3.20 [template = %.loc7_3.22 (constants.%.e13)] +// CHECK:STDOUT: %.loc7_3.23: = refine_inst_action %.loc7_3.5 [template] +// CHECK:STDOUT: %.loc7_3.24: @F.%.loc7_20.11 (%.53f) = splice_inst %.loc7_3.23 [template = %.loc7_3.24 (constants.%.6ec)] // CHECK:STDOUT: %.loc7_3.25: = convert_to_category_action %.loc7_3.6, element10 [template] -// CHECK:STDOUT: %.loc7_3.26: @F.%.loc7_20.8 (%.44c) = splice_inst %.loc7_3.25 [template = %.loc7_3.26 (constants.%.65c)] -// CHECK:STDOUT: %.loc7_3.27: = refine_type_action %v.var, %.loc7_20.8 [template] -// CHECK:STDOUT: %.loc7_3.28: @F.%.loc7_20.8 (%.44c) = splice_inst %.loc7_3.27 [template = %.loc7_3.28 (constants.%.0d4)] +// CHECK:STDOUT: %.loc7_3.26: @F.%.loc7_20.11 (%.53f) = splice_inst %.loc7_3.25 [template = %.loc7_3.26 (constants.%.817)] +// CHECK:STDOUT: %.loc7_3.27: = refine_inst_action %v.var [template] +// CHECK:STDOUT: %.loc7_3.28: @F.%.loc7_20.11 (%.53f) = splice_inst %.loc7_3.27 [template = %.loc7_3.28 (constants.%.14f)] // CHECK:STDOUT: %.loc7_3.29: = compound_member_access_action %.loc7_3.8, constants.%assoc0.ae8 [template] // CHECK:STDOUT: %.loc7_3.30: type = type_of_inst %.loc7_3.29 [template] -// CHECK:STDOUT: %.loc7_3.31: @F.%.loc7_3.30 (@F.%.loc7_3.30) = splice_inst %.loc7_3.29 [template = %.loc7_3.31 (constants.%.e5e)] +// CHECK:STDOUT: %.loc7_3.31: @F.%.loc7_3.30 (@F.%.loc7_3.30) = splice_inst %.loc7_3.29 [template = %.loc7_3.31 (constants.%.869)] // CHECK:STDOUT: %.loc7_3.32: = call_action (%.loc7_3.9), true [template] // CHECK:STDOUT: %.loc7_3.33: type = type_of_inst %.loc7_3.32 [template] -// CHECK:STDOUT: %.loc7_3.34: @F.%.loc7_3.33 (@F.%.loc7_3.33) = splice_inst %.loc7_3.32 [template = %.loc7_3.34 (constants.%.d90)] +// CHECK:STDOUT: %.loc7_3.34: @F.%.loc7_3.33 (@F.%.loc7_3.33) = splice_inst %.loc7_3.32 [template = %.loc7_3.34 (constants.%.3d1)] // CHECK:STDOUT: // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %v.var: ref @F.%.loc7_20.8 (%.44c) = var_storage %v.var_patt.loc7_3.1 +// CHECK:STDOUT: %v.var: ref @F.%.loc7_20.11 (%.53f) = var_storage %v.var_patt.loc7_3.1 // CHECK:STDOUT: %.loc7_25: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] -// CHECK:STDOUT: %.loc7_3.1: @F.%.loc7_3.12 (@F.%.loc7_3.12) = splice_inst %.loc7_3.11 [template = %.loc7_3.13 (constants.%.d189f7.1)] -// CHECK:STDOUT: %.loc7_3.2: @F.%.loc7_3.15 (@F.%.loc7_3.15) = splice_inst %.loc7_3.14 [template = %.loc7_3.16 (constants.%.269993.1)] -// CHECK:STDOUT: %.loc7_3.3: @F.%.loc7_3.18 (@F.%.loc7_3.18) = splice_inst %.loc7_3.17 [template = %.loc7_3.19 (constants.%.0e8)] -// CHECK:STDOUT: %.loc7_3.4: @F.%.loc7_3.21 (@F.%.loc7_3.21) = splice_inst %.loc7_3.20 [template = %.loc7_3.22 (constants.%.820)] -// CHECK:STDOUT: %.loc7_3.5: @F.%.loc7_20.8 (%.44c) = converted %.loc7_25, %.loc7_3.4 [template = %.loc7_3.22 (constants.%.820)] -// CHECK:STDOUT: %.loc7_3.6: @F.%.loc7_20.8 (%.44c) = splice_inst %.loc7_3.23 [template = %.loc7_3.24 (constants.%.a9b)] -// CHECK:STDOUT: %.loc7_3.7: @F.%.loc7_20.8 (%.44c) = splice_inst %.loc7_3.25 [template = %.loc7_3.26 (constants.%.65c)] +// CHECK:STDOUT: %.loc7_3.1: @F.%.loc7_3.12 (@F.%.loc7_3.12) = splice_inst %.loc7_3.11 [template = %.loc7_3.13 (constants.%.88d2c8.1)] +// CHECK:STDOUT: %.loc7_3.2: @F.%.loc7_3.15 (@F.%.loc7_3.15) = splice_inst %.loc7_3.14 [template = %.loc7_3.16 (constants.%.45c659.1)] +// CHECK:STDOUT: %.loc7_3.3: @F.%.loc7_3.18 (@F.%.loc7_3.18) = splice_inst %.loc7_3.17 [template = %.loc7_3.19 (constants.%.fa1)] +// CHECK:STDOUT: %.loc7_3.4: @F.%.loc7_3.21 (@F.%.loc7_3.21) = splice_inst %.loc7_3.20 [template = %.loc7_3.22 (constants.%.e13)] +// CHECK:STDOUT: %.loc7_3.5: @F.%.loc7_20.11 (%.53f) = converted %.loc7_25, %.loc7_3.4 [template = %.loc7_3.22 (constants.%.e13)] +// CHECK:STDOUT: %.loc7_3.6: @F.%.loc7_20.11 (%.53f) = splice_inst %.loc7_3.23 [template = %.loc7_3.24 (constants.%.6ec)] +// CHECK:STDOUT: %.loc7_3.7: @F.%.loc7_20.11 (%.53f) = splice_inst %.loc7_3.25 [template = %.loc7_3.26 (constants.%.817)] // CHECK:STDOUT: assign %v.var, %.loc7_3.7 -// CHECK:STDOUT: %.loc7_20.1: type = splice_block %.loc7_20.3 [template = %.loc7_20.8 (constants.%.44c)] { +// CHECK:STDOUT: %.loc7_20.1: type = splice_block %.loc7_20.4 [template = %.loc7_20.11 (constants.%.53f)] { // CHECK:STDOUT: %C.ref: %C.type = name_ref C, file.%C.decl [concrete = constants.%C.generic] // CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc6_16.2 [template = %T.loc6_16.1 (constants.%T)] -// CHECK:STDOUT: %.loc7_20.2: @F.%.loc7_20.5 (@F.%.loc7_20.5) = splice_inst %.loc7_20.4 [template = %.loc7_20.6 (constants.%.d24)] -// CHECK:STDOUT: %.loc7_20.3: type = splice_inst %.loc7_20.7 [template = %.loc7_20.8 (constants.%.44c)] +// CHECK:STDOUT: %.loc7_20.2: type = splice_inst %.loc7_20.5 [template = %.loc7_20.6 (constants.%.eec)] +// CHECK:STDOUT: %.loc7_20.3: @F.%.loc7_20.8 (@F.%.loc7_20.8) = splice_inst %.loc7_20.7 [template = %.loc7_20.9 (constants.%.195)] +// CHECK:STDOUT: %.loc7_20.4: type = splice_inst %.loc7_20.10 [template = %.loc7_20.11 (constants.%.53f)] // CHECK:STDOUT: } -// CHECK:STDOUT: %v: ref @F.%.loc7_20.8 (%.44c) = wrapper_binding v, %v.var +// CHECK:STDOUT: %v: ref @F.%.loc7_20.11 (%.53f) = wrapper_binding v, %v.var // CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v.patt.loc7_15.1: @F.%pattern_type (%pattern_type.c25) = ref_binding_pattern v [template = %v.patt.loc7_15.2 (constants.%v.patt.0c8)] -// CHECK:STDOUT: %v.var_patt.loc7_3.1: @F.%pattern_type (%pattern_type.c25) = var_pattern %v.patt.loc7_15.1 [template = %v.var_patt.loc7_3.2 (constants.%v.var_patt.7d8)] +// CHECK:STDOUT: %v.patt.loc7_15.1: @F.%pattern_type (%pattern_type.7d1) = ref_binding_pattern v [template = %v.patt.loc7_15.2 (constants.%v.patt.7b6)] +// CHECK:STDOUT: %v.var_patt.loc7_3.1: @F.%pattern_type (%pattern_type.7d1) = var_pattern %v.patt.loc7_15.1 [template = %v.var_patt.loc7_3.2 (constants.%v.var_patt.067)] // CHECK:STDOUT: } -// CHECK:STDOUT: %.loc7_3.8: @F.%.loc7_20.8 (%.44c) = splice_inst %.loc7_3.27 [template = %.loc7_3.28 (constants.%.0d4)] -// CHECK:STDOUT: %.loc7_3.9: @F.%.loc7_3.30 (@F.%.loc7_3.30) = splice_inst %.loc7_3.29 [template = %.loc7_3.31 (constants.%.e5e)] -// CHECK:STDOUT: %.loc7_3.10: @F.%.loc7_3.33 (@F.%.loc7_3.33) = splice_inst %.loc7_3.32 [template = %.loc7_3.34 (constants.%.d90)] +// CHECK:STDOUT: %.loc7_3.8: @F.%.loc7_20.11 (%.53f) = splice_inst %.loc7_3.27 [template = %.loc7_3.28 (constants.%.14f)] +// CHECK:STDOUT: %.loc7_3.9: @F.%.loc7_3.30 (@F.%.loc7_3.30) = splice_inst %.loc7_3.29 [template = %.loc7_3.31 (constants.%.869)] +// CHECK:STDOUT: %.loc7_3.10: @F.%.loc7_3.33 (@F.%.loc7_3.33) = splice_inst %.loc7_3.32 [template = %.loc7_3.34 (constants.%.3d1)] // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -745,34 +750,36 @@ fn G() { F({}); } // CHECK:STDOUT: %T.loc6_16.1 => constants.%empty_struct_type // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %.loc7_20.4 => constants.%inst.class_type -// CHECK:STDOUT: %.loc7_20.5 => type -// CHECK:STDOUT: %.loc7_20.6 => constants.%C.d8efcc.1 -// CHECK:STDOUT: %.loc7_20.7 => constants.%inst.splice_block.1b2 -// CHECK:STDOUT: %.loc7_20.8 => constants.%C.d8efcc.1 +// CHECK:STDOUT: %.loc7_20.5 => constants.%inst.specific_inst.c72 +// CHECK:STDOUT: %.loc7_20.6 => constants.%empty_struct_type +// CHECK:STDOUT: %.loc7_20.7 => constants.%inst.class_type +// CHECK:STDOUT: %.loc7_20.8 => type +// CHECK:STDOUT: %.loc7_20.9 => constants.%C.d8efcc.1 +// CHECK:STDOUT: %.loc7_20.10 => constants.%inst.splice_block.1b2 +// CHECK:STDOUT: %.loc7_20.11 => constants.%C.d8efcc.1 // CHECK:STDOUT: %require_complete => constants.%complete_type // CHECK:STDOUT: %pattern_type => constants.%pattern_type.2fd // CHECK:STDOUT: %v.patt.loc7_15.2 => constants.%v.patt.0e7 // CHECK:STDOUT: %v.var_patt.loc7_3.2 => constants.%v.var_patt.259 -// CHECK:STDOUT: %.loc7_3.11 => constants.%.690 -// CHECK:STDOUT: %.loc7_3.12 => constants.%.816 -// CHECK:STDOUT: %.loc7_3.13 => constants.%.d189f7.2 -// CHECK:STDOUT: %.loc7_3.14 => constants.%.7f1 -// CHECK:STDOUT: %.loc7_3.15 => constants.%.d9e -// CHECK:STDOUT: %.loc7_3.16 => constants.%.269993.2 -// CHECK:STDOUT: %.loc7_3.17 => constants.%.190 -// CHECK:STDOUT: %.loc7_3.18 => constants.%.46e -// CHECK:STDOUT: %.loc7_3.19 => constants.%.27f -// CHECK:STDOUT: %.loc7_3.20 => constants.%.f03 -// CHECK:STDOUT: %.loc7_3.21 => constants.%.c52 -// CHECK:STDOUT: %.loc7_3.22 => constants.%.94d -// CHECK:STDOUT: %.loc7_3.23 => constants.%inst.as_compatible.be6 -// CHECK:STDOUT: %.loc7_3.24 => constants.%.2ea -// CHECK:STDOUT: %.loc7_3.25 => constants.%.610 -// CHECK:STDOUT: %.loc7_3.26 => constants.%.47a -// CHECK:STDOUT: %.loc7_3.27 => constants.%inst.as_compatible.6fd +// CHECK:STDOUT: %.loc7_3.11 => constants.%.0a6 +// CHECK:STDOUT: %.loc7_3.12 => constants.%.48a +// CHECK:STDOUT: %.loc7_3.13 => constants.%.88d2c8.2 +// CHECK:STDOUT: %.loc7_3.14 => constants.%.53c +// CHECK:STDOUT: %.loc7_3.15 => constants.%.ceb +// CHECK:STDOUT: %.loc7_3.16 => constants.%.45c659.2 +// CHECK:STDOUT: %.loc7_3.17 => constants.%.1e2 +// CHECK:STDOUT: %.loc7_3.18 => constants.%.4f9 +// CHECK:STDOUT: %.loc7_3.19 => constants.%.bc1 +// CHECK:STDOUT: %.loc7_3.20 => constants.%.1ec +// CHECK:STDOUT: %.loc7_3.21 => constants.%.65e +// CHECK:STDOUT: %.loc7_3.22 => constants.%.fc2 +// CHECK:STDOUT: %.loc7_3.23 => constants.%.e48 +// CHECK:STDOUT: %.loc7_3.24 => constants.%.118 +// CHECK:STDOUT: %.loc7_3.25 => constants.%.663 +// CHECK:STDOUT: %.loc7_3.26 => constants.%.e51 +// CHECK:STDOUT: %.loc7_3.27 => constants.%inst.specific_inst.2e8 // CHECK:STDOUT: %.loc7_3.28 => invalid -// CHECK:STDOUT: %.loc7_3.29 => constants.%inst.splice_block.b81 +// CHECK:STDOUT: %.loc7_3.29 => constants.%inst.splice_block.5e8 // CHECK:STDOUT: %.loc7_3.30 => // CHECK:STDOUT: %.loc7_3.31 => invalid // CHECK:STDOUT: %.loc7_3.32 => constants.%inst.call diff --git a/toolchain/check/testdata/eval/call.carbon b/toolchain/check/testdata/eval/call.carbon index 020ca6190d21..4a7cc2a99130 100644 --- a/toolchain/check/testdata/eval/call.carbon +++ b/toolchain/check/testdata/eval/call.carbon @@ -205,17 +205,17 @@ fn H() { // CHECK:STDOUT: %.6c2: @UseFGenerically.%.loc11_3.15 (@UseFGenerically.%.loc11_3.15) = splice_inst @UseFGenerically.%.loc11_3.14 [template] // CHECK:STDOUT: %.031: @UseFGenerically.%.loc11_3.18 (@UseFGenerically.%.loc11_3.18) = splice_inst @UseFGenerically.%.loc11_3.17 [template] // CHECK:STDOUT: %.88d: @UseFGenerically.%.loc11_3.21 (@UseFGenerically.%.loc11_3.21) = splice_inst @UseFGenerically.%.loc11_3.20 [template] -// CHECK:STDOUT: %.1d7: %F.call = splice_inst @UseFGenerically.%.loc11_3.23 [template] -// CHECK:STDOUT: %.55e: %F.call = splice_inst @UseFGenerically.%.loc11_3.25 [template] +// CHECK:STDOUT: %.0ac: %F.call = splice_inst @UseFGenerically.%.loc11_3.23 [template] +// CHECK:STDOUT: %.d54: %F.call = splice_inst @UseFGenerically.%.loc11_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: %.885: %F.call = splice_inst @UseFGenerically.%.loc11_3.27 [template] -// CHECK:STDOUT: %.0c8: @UseFGenerically.%.loc11_3.30 (@UseFGenerically.%.loc11_3.30) = splice_inst @UseFGenerically.%.loc11_3.29 [template] -// CHECK:STDOUT: %.6cb: @UseFGenerically.%.loc11_3.33 (@UseFGenerically.%.loc11_3.33) = splice_inst @UseFGenerically.%.loc11_3.32 [template] +// CHECK:STDOUT: %.b53: %F.call = splice_inst @UseFGenerically.%.loc11_3.27 [template] +// CHECK:STDOUT: %.5eb: @UseFGenerically.%.loc11_3.30 (@UseFGenerically.%.loc11_3.30) = splice_inst @UseFGenerically.%.loc11_3.29 [template] +// CHECK:STDOUT: %.ace: @UseFGenerically.%.loc11_3.33 (@UseFGenerically.%.loc11_3.33) = splice_inst @UseFGenerically.%.loc11_3.32 [template] // CHECK:STDOUT: %assoc0.0ac: %ImplicitAs.assoc_type.fcc = assoc_entity element0, imports.%Core.import_ref.f9d [symbolic] // CHECK:STDOUT: %int_3.410: %i32 = int_value 3 [concrete] // CHECK:STDOUT: %pattern_type.98b: type = pattern_type %C [concrete] @@ -236,8 +236,8 @@ fn H() { // CHECK:STDOUT: %inst.splice_block.edd: = inst_value [concrete] { // CHECK:STDOUT: %.432: = splice_block [concrete = ] {} // CHECK:STDOUT: } -// CHECK:STDOUT: %inst.as_compatible: = inst_value [concrete] { -// CHECK:STDOUT: %.9fb: ref %C = as_compatible @UseFGenerically.%v.var +// CHECK:STDOUT: %inst.specific_inst: = inst_value [concrete] { +// CHECK:STDOUT: %.6ba: ref %C = specific_inst @UseFGenerically.%v.var, @UseFGenerically(%int_3.410) // CHECK:STDOUT: } // CHECK:STDOUT: %Destroy.Op.type.1d8f74.2: type = fn_type @Destroy.Op.loc11_3.2 [concrete] // CHECK:STDOUT: %Destroy.Op.1a2547.2: %Destroy.Op.type.1d8f74.2 = struct_value () [concrete] @@ -245,14 +245,14 @@ fn H() { // CHECK:STDOUT: %Destroy.facet.1a5: %Destroy.type = facet_value %C, (%custom_witness.df9cc1.2) [concrete] // CHECK:STDOUT: %Destroy.WithSelf.Op.type.7f2: type = fn_type @Destroy.WithSelf.Op, @Destroy.WithSelf(%Destroy.facet.1a5) [concrete] // CHECK:STDOUT: %.da8: type = fn_type_with_self_type %Destroy.WithSelf.Op.type.7f2, %Destroy.facet.1a5 [concrete] -// CHECK:STDOUT: %inst.splice_block.f67: = inst_value [concrete] { -// CHECK:STDOUT: %.7ba: = splice_block %bound_method.767 { +// CHECK:STDOUT: %inst.splice_block.8b0: = inst_value [concrete] { +// CHECK:STDOUT: %.0c7: = splice_block %bound_method.396 { // CHECK:STDOUT: %impl.elem0.96c: %.da8 = impl_witness_access %custom_witness.df9cc1.2, element0 [concrete = %Destroy.Op.1a2547.2] -// CHECK:STDOUT: %bound_method.767: = bound_method %.9fb, %impl.elem0.96c +// CHECK:STDOUT: %bound_method.396: = bound_method %.6ba, %impl.elem0.96c // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: %inst.call: = inst_value [concrete] { -// CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %.7ba(%.9fb) +// CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %.0c7(%.6ba) // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -297,18 +297,18 @@ fn H() { // CHECK:STDOUT: %.loc11_3.20: = call_action (%.loc11_3.3), true [template] // CHECK:STDOUT: %.loc11_3.21: type = type_of_inst %.loc11_3.20 [template] // CHECK:STDOUT: %.loc11_3.22: @UseFGenerically.%.loc11_3.21 (@UseFGenerically.%.loc11_3.21) = splice_inst %.loc11_3.20 [template = %.loc11_3.22 (constants.%.88d)] -// CHECK:STDOUT: %.loc11_3.23: = refine_type_action %.loc11_3.5, %F.call.loc11_20.2 [template] -// CHECK:STDOUT: %.loc11_3.24: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = splice_inst %.loc11_3.23 [template = %.loc11_3.24 (constants.%.1d7)] +// CHECK:STDOUT: %.loc11_3.23: = refine_inst_action %.loc11_3.5 [template] +// CHECK:STDOUT: %.loc11_3.24: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = splice_inst %.loc11_3.23 [template = %.loc11_3.24 (constants.%.0ac)] // CHECK:STDOUT: %.loc11_3.25: = convert_to_category_action %.loc11_3.6, element10 [template] -// CHECK:STDOUT: %.loc11_3.26: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = splice_inst %.loc11_3.25 [template = %.loc11_3.26 (constants.%.55e)] -// CHECK:STDOUT: %.loc11_3.27: = refine_type_action %v.var, %F.call.loc11_20.2 [template] -// CHECK:STDOUT: %.loc11_3.28: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = splice_inst %.loc11_3.27 [template = %.loc11_3.28 (constants.%.885)] +// CHECK:STDOUT: %.loc11_3.26: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = splice_inst %.loc11_3.25 [template = %.loc11_3.26 (constants.%.d54)] +// CHECK:STDOUT: %.loc11_3.27: = refine_inst_action %v.var [template] +// CHECK:STDOUT: %.loc11_3.28: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = splice_inst %.loc11_3.27 [template = %.loc11_3.28 (constants.%.b53)] // CHECK:STDOUT: %.loc11_3.29: = compound_member_access_action %.loc11_3.8, constants.%assoc0.ae8 [template] // CHECK:STDOUT: %.loc11_3.30: type = type_of_inst %.loc11_3.29 [template] -// CHECK:STDOUT: %.loc11_3.31: @UseFGenerically.%.loc11_3.30 (@UseFGenerically.%.loc11_3.30) = splice_inst %.loc11_3.29 [template = %.loc11_3.31 (constants.%.0c8)] +// CHECK:STDOUT: %.loc11_3.31: @UseFGenerically.%.loc11_3.30 (@UseFGenerically.%.loc11_3.30) = splice_inst %.loc11_3.29 [template = %.loc11_3.31 (constants.%.5eb)] // CHECK:STDOUT: %.loc11_3.32: = call_action (%.loc11_3.9), true [template] // CHECK:STDOUT: %.loc11_3.33: type = type_of_inst %.loc11_3.32 [template] -// CHECK:STDOUT: %.loc11_3.34: @UseFGenerically.%.loc11_3.33 (@UseFGenerically.%.loc11_3.33) = splice_inst %.loc11_3.32 [template = %.loc11_3.34 (constants.%.6cb)] +// CHECK:STDOUT: %.loc11_3.34: @UseFGenerically.%.loc11_3.33 (@UseFGenerically.%.loc11_3.33) = splice_inst %.loc11_3.32 [template = %.loc11_3.34 (constants.%.ace)] // CHECK:STDOUT: // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: @@ -319,8 +319,8 @@ fn H() { // CHECK:STDOUT: %.loc11_3.3: @UseFGenerically.%.loc11_3.18 (@UseFGenerically.%.loc11_3.18) = splice_inst %.loc11_3.17 [template = %.loc11_3.19 (constants.%.031)] // CHECK:STDOUT: %.loc11_3.4: @UseFGenerically.%.loc11_3.21 (@UseFGenerically.%.loc11_3.21) = splice_inst %.loc11_3.20 [template = %.loc11_3.22 (constants.%.88d)] // CHECK:STDOUT: %.loc11_3.5: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = converted %.loc11_25, %.loc11_3.4 [template = %.loc11_3.22 (constants.%.88d)] -// CHECK:STDOUT: %.loc11_3.6: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = splice_inst %.loc11_3.23 [template = %.loc11_3.24 (constants.%.1d7)] -// CHECK:STDOUT: %.loc11_3.7: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = splice_inst %.loc11_3.25 [template = %.loc11_3.26 (constants.%.55e)] +// CHECK:STDOUT: %.loc11_3.6: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = splice_inst %.loc11_3.23 [template = %.loc11_3.24 (constants.%.0ac)] +// CHECK:STDOUT: %.loc11_3.7: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = splice_inst %.loc11_3.25 [template = %.loc11_3.26 (constants.%.d54)] // CHECK:STDOUT: assign %v.var, %.loc11_3.7 // CHECK:STDOUT: %.loc11_20.1: type = splice_block %.loc11_20.3 [template = %F.call.loc11_20.2 (constants.%F.call)] { // CHECK:STDOUT: %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F] @@ -334,9 +334,9 @@ fn H() { // CHECK:STDOUT: %v.patt.loc11_15.1: @UseFGenerically.%pattern_type (%pattern_type.231) = ref_binding_pattern v [template = %v.patt.loc11_15.2 (constants.%v.patt.bcc)] // CHECK:STDOUT: %v.var_patt.loc11_3.1: @UseFGenerically.%pattern_type (%pattern_type.231) = var_pattern %v.patt.loc11_15.1 [template = %v.var_patt.loc11_3.2 (constants.%v.var_patt.53d)] // CHECK:STDOUT: } -// CHECK:STDOUT: %.loc11_3.8: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = splice_inst %.loc11_3.27 [template = %.loc11_3.28 (constants.%.885)] -// CHECK:STDOUT: %.loc11_3.9: @UseFGenerically.%.loc11_3.30 (@UseFGenerically.%.loc11_3.30) = splice_inst %.loc11_3.29 [template = %.loc11_3.31 (constants.%.0c8)] -// CHECK:STDOUT: %.loc11_3.10: @UseFGenerically.%.loc11_3.33 (@UseFGenerically.%.loc11_3.33) = splice_inst %.loc11_3.32 [template = %.loc11_3.34 (constants.%.6cb)] +// CHECK:STDOUT: %.loc11_3.8: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = splice_inst %.loc11_3.27 [template = %.loc11_3.28 (constants.%.b53)] +// CHECK:STDOUT: %.loc11_3.9: @UseFGenerically.%.loc11_3.30 (@UseFGenerically.%.loc11_3.30) = splice_inst %.loc11_3.29 [template = %.loc11_3.31 (constants.%.5eb)] +// CHECK:STDOUT: %.loc11_3.10: @UseFGenerically.%.loc11_3.33 (@UseFGenerically.%.loc11_3.33) = splice_inst %.loc11_3.32 [template = %.loc11_3.34 (constants.%.ace)] // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -379,9 +379,9 @@ fn H() { // CHECK:STDOUT: %.loc11_3.24 => // CHECK:STDOUT: %.loc11_3.25 => // CHECK:STDOUT: %.loc11_3.26 => -// CHECK:STDOUT: %.loc11_3.27 => constants.%inst.as_compatible +// CHECK:STDOUT: %.loc11_3.27 => constants.%inst.specific_inst // CHECK:STDOUT: %.loc11_3.28 => invalid -// CHECK:STDOUT: %.loc11_3.29 => constants.%inst.splice_block.f67 +// CHECK:STDOUT: %.loc11_3.29 => constants.%inst.splice_block.8b0 // CHECK:STDOUT: %.loc11_3.30 => // CHECK:STDOUT: %.loc11_3.31 => invalid // CHECK:STDOUT: %.loc11_3.32 => constants.%inst.call diff --git a/toolchain/check/testdata/generic/template/convert.carbon b/toolchain/check/testdata/generic/template/convert.carbon index 9c688ae6f3f1..8086bed8f421 100644 --- a/toolchain/check/testdata/generic/template/convert.carbon +++ b/toolchain/check/testdata/generic/template/convert.carbon @@ -183,8 +183,8 @@ fn Test(d: D) { // CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] // CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %n.patt.c48: %pattern_type.6b6 = value_binding_pattern n [concrete] -// CHECK:STDOUT: %.b3e: %T.67db0b.1 = splice_inst @F.%.loc6_16.3 [template] -// CHECK:STDOUT: %.b21: %i32 = splice_inst @F.%.loc6_16.5 [template] +// CHECK:STDOUT: %.098: %T.67db0b.1 = splice_inst @F.%.loc6_16.3 [template] +// CHECK:STDOUT: %.c85: %i32 = splice_inst @F.%.loc6_16.5 [template] // CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] // CHECK:STDOUT: %Int.as.Copy.impl.Op.type.ac8: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] // CHECK:STDOUT: %Int.as.Copy.impl.Op.5e0: %Int.as.Copy.impl.Op.type.ac8 = struct_value () [symbolic] @@ -209,22 +209,22 @@ fn Test(d: D) { // CHECK:STDOUT: %complete_type.cdf: = complete_type_witness %struct_type.n [concrete] // CHECK:STDOUT: %x.param_patt.0f9: %pattern_type.98b = value_param_pattern [concrete] // CHECK:STDOUT: %x.patt.953: %pattern_type.98b = wrapper_binding_pattern x, %x.param_patt.0f9 [concrete] -// CHECK:STDOUT: %inst.as_compatible.1ff: = inst_value [concrete] { -// CHECK:STDOUT: %.775: %i32 = as_compatible @F.%x.ref +// CHECK:STDOUT: %inst.specific_inst.0d5: = inst_value [concrete] { +// CHECK:STDOUT: %.3e2: %i32 = specific_inst @F.%x.ref, @F(%i32) // CHECK:STDOUT: } -// CHECK:STDOUT: %inst.splice_block.5e1: = inst_value [concrete] { -// CHECK:STDOUT: %.093: %i32 = splice_block %.775 {} +// CHECK:STDOUT: %inst.splice_block.e52: = inst_value [concrete] { +// CHECK:STDOUT: %.31c: %i32 = splice_block %.3e2 {} // CHECK:STDOUT: } -// CHECK:STDOUT: %inst.as_compatible.d98: = inst_value [concrete] { -// CHECK:STDOUT: %.f8c: %C = as_compatible @F.%x.ref +// CHECK:STDOUT: %inst.specific_inst.669: = inst_value [concrete] { +// CHECK:STDOUT: %.bfd: %C = specific_inst @F.%x.ref, @F(%C) // CHECK:STDOUT: } // CHECK:STDOUT: %.ddb: type = fn_type_with_self_type %ImplicitAs.WithSelf.Convert.type.5bd, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %inst.splice_block.a18: = inst_value [concrete] { -// CHECK:STDOUT: %.e81: %i32 = splice_block %.651 { +// CHECK:STDOUT: %inst.splice_block.cae: = inst_value [concrete] { +// CHECK:STDOUT: %.dbd: %i32 = splice_block %.3ff { // CHECK:STDOUT: %impl.elem0.a96: %.ddb = impl_witness_access %ImplicitAs.impl_witness.edb, element0 [concrete = %C.as.ImplicitAs.impl.Convert] -// CHECK:STDOUT: %bound_method: = bound_method %.f8c, %impl.elem0.a96 -// CHECK:STDOUT: %C.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method(%.f8c) -// CHECK:STDOUT: %.651: %i32 = value_of_initializer %C.as.ImplicitAs.impl.Convert.call +// CHECK:STDOUT: %bound_method: = bound_method %.bfd, %impl.elem0.a96 +// CHECK:STDOUT: %C.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method(%.bfd) +// CHECK:STDOUT: %.3ff: %i32 = value_of_initializer %C.as.ImplicitAs.impl.Convert.call // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -266,16 +266,16 @@ fn Test(d: D) { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %T.loc5_16.1 [template = %require_complete (constants.%require_complete.944)] -// CHECK:STDOUT: %.loc6_16.3: = refine_type_action %x.ref, %T.loc5_16.1 [template] -// CHECK:STDOUT: %.loc6_16.4: @F.%T.loc5_16.1 (%T.67db0b.1) = splice_inst %.loc6_16.3 [template = %.loc6_16.4 (constants.%.b3e)] +// CHECK:STDOUT: %.loc6_16.3: = refine_inst_action %x.ref [template] +// CHECK:STDOUT: %.loc6_16.4: @F.%T.loc5_16.1 (%T.67db0b.1) = splice_inst %.loc6_16.3 [template = %.loc6_16.4 (constants.%.098)] // CHECK:STDOUT: %.loc6_16.5: = convert_to_value_action %.loc6_16.1, constants.%i32 [template] -// CHECK:STDOUT: %.loc6_16.6: %i32 = splice_inst %.loc6_16.5 [template = %.loc6_16.6 (constants.%.b21)] +// CHECK:STDOUT: %.loc6_16.6: %i32 = splice_inst %.loc6_16.5 [template = %.loc6_16.6 (constants.%.c85)] // CHECK:STDOUT: // CHECK:STDOUT: fn(%x.param: @F.%T.loc5_16.1 (%T.67db0b.1)) -> out %return.param: %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %x.ref: @F.%T.loc5_16.1 (%T.67db0b.1) = name_ref x, %x -// CHECK:STDOUT: %.loc6_16.1: @F.%T.loc5_16.1 (%T.67db0b.1) = splice_inst %.loc6_16.3 [template = %.loc6_16.4 (constants.%.b3e)] -// CHECK:STDOUT: %.loc6_16.2: %i32 = splice_inst %.loc6_16.5 [template = %.loc6_16.6 (constants.%.b21)] +// CHECK:STDOUT: %.loc6_16.1: @F.%T.loc5_16.1 (%T.67db0b.1) = splice_inst %.loc6_16.3 [template = %.loc6_16.4 (constants.%.098)] +// CHECK:STDOUT: %.loc6_16.2: %i32 = splice_inst %.loc6_16.5 [template = %.loc6_16.6 (constants.%.c85)] // CHECK:STDOUT: %i32.loc6: type = type_literal constants.%i32 [concrete = constants.%i32] // CHECK:STDOUT: %n: %i32 = wrapper_binding n, %.loc6_16.2 // CHECK:STDOUT: name_binding_decl { @@ -308,9 +308,9 @@ fn Test(d: D) { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %.loc6_16.3 => constants.%inst.as_compatible.1ff +// CHECK:STDOUT: %.loc6_16.3 => constants.%inst.specific_inst.0d5 // CHECK:STDOUT: %.loc6_16.4 => invalid -// CHECK:STDOUT: %.loc6_16.5 => constants.%inst.splice_block.5e1 +// CHECK:STDOUT: %.loc6_16.5 => constants.%inst.splice_block.e52 // CHECK:STDOUT: %.loc6_16.6 => invalid // CHECK:STDOUT: } // CHECK:STDOUT: @@ -323,9 +323,9 @@ fn Test(d: D) { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.cdf -// CHECK:STDOUT: %.loc6_16.3 => constants.%inst.as_compatible.d98 +// CHECK:STDOUT: %.loc6_16.3 => constants.%inst.specific_inst.669 // CHECK:STDOUT: %.loc6_16.4 => invalid -// CHECK:STDOUT: %.loc6_16.5 => constants.%inst.splice_block.a18 +// CHECK:STDOUT: %.loc6_16.5 => constants.%inst.splice_block.cae // CHECK:STDOUT: %.loc6_16.6 => invalid // CHECK:STDOUT: } // CHECK:STDOUT: @@ -352,9 +352,9 @@ fn Test(d: D) { // CHECK:STDOUT: %require_complete.944: = require_complete_type %T.67db0b.1 [template] // CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] // CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] -// CHECK:STDOUT: %.b3e: %T.67db0b.1 = splice_inst @AsI32.%.loc6_12.3 [template] -// CHECK:STDOUT: %.94a: %i32 = splice_inst @AsI32.%.loc6_12.5 [template] -// CHECK:STDOUT: %.113: %i32 = splice_inst @AsI32.%.loc6_18.2 [template] +// CHECK:STDOUT: %.098: %T.67db0b.1 = splice_inst @AsI32.%.loc6_12.3 [template] +// CHECK:STDOUT: %.7f3: %i32 = splice_inst @AsI32.%.loc6_12.5 [template] +// CHECK:STDOUT: %.4f1: %i32 = splice_inst @AsI32.%.loc6_18.2 [template] // CHECK:STDOUT: %x.param_patt.cee: %pattern_type.6b6 = value_param_pattern [concrete] // CHECK:STDOUT: %x.patt.e3b: %pattern_type.6b6 = wrapper_binding_pattern x, %x.param_patt.cee [concrete] // CHECK:STDOUT: %C: type = class_type @C [concrete] @@ -379,40 +379,40 @@ fn Test(d: D) { // CHECK:STDOUT: %Int.as.Copy.impl.Op.specific_fn: = specific_function %Int.as.Copy.impl.Op.4f6, @Int.as.Copy.impl.Op(%int_32) [concrete] // CHECK:STDOUT: %x.param_patt.0f9: %pattern_type.98b = value_param_pattern [concrete] // CHECK:STDOUT: %x.patt.953: %pattern_type.98b = wrapper_binding_pattern x, %x.param_patt.0f9 [concrete] -// CHECK:STDOUT: %inst.as_compatible.1ff: = inst_value [concrete] { -// CHECK:STDOUT: %.775: %i32 = as_compatible @AsI32.%x.ref +// CHECK:STDOUT: %inst.specific_inst.615: = inst_value [concrete] { +// CHECK:STDOUT: %.2f4: %i32 = specific_inst @AsI32.%x.ref, @AsI32(%i32) // CHECK:STDOUT: } -// CHECK:STDOUT: %inst.splice_block.5e1: = inst_value [concrete] { -// CHECK:STDOUT: %.093: %i32 = splice_block %.775 {} +// CHECK:STDOUT: %inst.splice_block.1f8: = inst_value [concrete] { +// CHECK:STDOUT: %.727: %i32 = splice_block %.2f4 {} // CHECK:STDOUT: } -// CHECK:STDOUT: %inst.splice_block.c43: = inst_value [concrete] { -// CHECK:STDOUT: %.c52: init %i32 = splice_block %Int.as.Copy.impl.Op.call.7ab { +// CHECK:STDOUT: %inst.splice_block.a55: = inst_value [concrete] { +// CHECK:STDOUT: %.f08: init %i32 = splice_block %Int.as.Copy.impl.Op.call.a7e { // CHECK:STDOUT: %impl.elem0.88228e.2: %.737 = impl_witness_access %Copy.impl_witness.b51, element0 [concrete = %Int.as.Copy.impl.Op.4f6] -// CHECK:STDOUT: %bound_method.aca: = bound_method %.093, %impl.elem0.88228e.2 +// CHECK:STDOUT: %bound_method.5d3: = bound_method %.727, %impl.elem0.88228e.2 // CHECK:STDOUT: %specific_fn.96a233.2: = specific_function %impl.elem0.88228e.2, @Int.as.Copy.impl.Op(%int_32) [concrete = %Int.as.Copy.impl.Op.specific_fn] -// CHECK:STDOUT: %bound_method.d7f: = bound_method %.093, %specific_fn.96a233.2 -// CHECK:STDOUT: %Int.as.Copy.impl.Op.call.7ab: init %i32 = call %bound_method.d7f(%.093) +// CHECK:STDOUT: %bound_method.d8a: = bound_method %.727, %specific_fn.96a233.2 +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call.a7e: init %i32 = call %bound_method.d8a(%.727) // CHECK:STDOUT: } // CHECK:STDOUT: } -// CHECK:STDOUT: %inst.as_compatible.d98: = inst_value [concrete] { -// CHECK:STDOUT: %.f8c: %C = as_compatible @AsI32.%x.ref +// CHECK:STDOUT: %inst.specific_inst.281: = inst_value [concrete] { +// CHECK:STDOUT: %.71c: %C = specific_inst @AsI32.%x.ref, @AsI32(%C) // CHECK:STDOUT: } // CHECK:STDOUT: %.419: type = fn_type_with_self_type %As.WithSelf.Convert.type.087, %As.facet [concrete] -// CHECK:STDOUT: %inst.splice_block.550: = inst_value [concrete] { -// CHECK:STDOUT: %.24f: %i32 = splice_block %.0bd { +// CHECK:STDOUT: %inst.splice_block.734: = inst_value [concrete] { +// CHECK:STDOUT: %.fd9: %i32 = splice_block %.094 { // CHECK:STDOUT: %impl.elem0.47b: %.419 = impl_witness_access %As.impl_witness.80e, element0 [concrete = %C.as.As.impl.Convert] -// CHECK:STDOUT: %bound_method.7a7: = bound_method %.f8c, %impl.elem0.47b -// CHECK:STDOUT: %C.as.As.impl.Convert.call: init %i32 = call %bound_method.7a7(%.f8c) -// CHECK:STDOUT: %.0bd: %i32 = value_of_initializer %C.as.As.impl.Convert.call +// CHECK:STDOUT: %bound_method.739: = bound_method %.71c, %impl.elem0.47b +// CHECK:STDOUT: %C.as.As.impl.Convert.call: init %i32 = call %bound_method.739(%.71c) +// CHECK:STDOUT: %.094: %i32 = value_of_initializer %C.as.As.impl.Convert.call // CHECK:STDOUT: } // CHECK:STDOUT: } -// CHECK:STDOUT: %inst.splice_block.132: = inst_value [concrete] { -// CHECK:STDOUT: %.f64: init %i32 = splice_block %Int.as.Copy.impl.Op.call.0f4 { +// CHECK:STDOUT: %inst.splice_block.575: = inst_value [concrete] { +// CHECK:STDOUT: %.297: init %i32 = splice_block %Int.as.Copy.impl.Op.call.03b { // CHECK:STDOUT: %impl.elem0.88228e.1: %.737 = impl_witness_access %Copy.impl_witness.b51, element0 [concrete = %Int.as.Copy.impl.Op.4f6] -// CHECK:STDOUT: %bound_method.de6: = bound_method %.24f, %impl.elem0.88228e.1 +// CHECK:STDOUT: %bound_method.649: = bound_method %.fd9, %impl.elem0.88228e.1 // CHECK:STDOUT: %specific_fn.96a233.1: = specific_function %impl.elem0.88228e.1, @Int.as.Copy.impl.Op(%int_32) [concrete = %Int.as.Copy.impl.Op.specific_fn] -// CHECK:STDOUT: %bound_method.832: = bound_method %.24f, %specific_fn.96a233.1 -// CHECK:STDOUT: %Int.as.Copy.impl.Op.call.0f4: init %i32 = call %bound_method.832(%.24f) +// CHECK:STDOUT: %bound_method.5e5: = bound_method %.fd9, %specific_fn.96a233.1 +// CHECK:STDOUT: %Int.as.Copy.impl.Op.call.03b: init %i32 = call %bound_method.5e5(%.fd9) // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -454,20 +454,20 @@ fn Test(d: D) { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %T.loc5_20.1 [template = %require_complete (constants.%require_complete.944)] -// CHECK:STDOUT: %.loc6_12.3: = refine_type_action %x.ref, %T.loc5_20.1 [template] -// CHECK:STDOUT: %.loc6_12.4: @AsI32.%T.loc5_20.1 (%T.67db0b.1) = splice_inst %.loc6_12.3 [template = %.loc6_12.4 (constants.%.b3e)] +// CHECK:STDOUT: %.loc6_12.3: = refine_inst_action %x.ref [template] +// CHECK:STDOUT: %.loc6_12.4: @AsI32.%T.loc5_20.1 (%T.67db0b.1) = splice_inst %.loc6_12.3 [template = %.loc6_12.4 (constants.%.098)] // CHECK:STDOUT: %.loc6_12.5: = convert_action %.loc6_12.1, constants.%i32, element7 [template] -// CHECK:STDOUT: %.loc6_12.6: %i32 = splice_inst %.loc6_12.5 [template = %.loc6_12.6 (constants.%.94a)] +// CHECK:STDOUT: %.loc6_12.6: %i32 = splice_inst %.loc6_12.5 [template = %.loc6_12.6 (constants.%.7f3)] // CHECK:STDOUT: %.loc6_18.2: = convert_to_category_action %.loc6_12.2, element10 [template] -// CHECK:STDOUT: %.loc6_18.3: %i32 = splice_inst %.loc6_18.2 [template = %.loc6_18.3 (constants.%.113)] +// CHECK:STDOUT: %.loc6_18.3: %i32 = splice_inst %.loc6_18.2 [template = %.loc6_18.3 (constants.%.4f1)] // CHECK:STDOUT: // CHECK:STDOUT: fn(%x.param: @AsI32.%T.loc5_20.1 (%T.67db0b.1)) -> out %return.param: %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %x.ref: @AsI32.%T.loc5_20.1 (%T.67db0b.1) = name_ref x, %x // CHECK:STDOUT: %i32.loc6: type = type_literal constants.%i32 [concrete = constants.%i32] -// CHECK:STDOUT: %.loc6_12.1: @AsI32.%T.loc5_20.1 (%T.67db0b.1) = splice_inst %.loc6_12.3 [template = %.loc6_12.4 (constants.%.b3e)] -// CHECK:STDOUT: %.loc6_12.2: %i32 = splice_inst %.loc6_12.5 [template = %.loc6_12.6 (constants.%.94a)] -// CHECK:STDOUT: %.loc6_18.1: %i32 = splice_inst %.loc6_18.2 [template = %.loc6_18.3 (constants.%.113)] +// CHECK:STDOUT: %.loc6_12.1: @AsI32.%T.loc5_20.1 (%T.67db0b.1) = splice_inst %.loc6_12.3 [template = %.loc6_12.4 (constants.%.098)] +// CHECK:STDOUT: %.loc6_12.2: %i32 = splice_inst %.loc6_12.5 [template = %.loc6_12.6 (constants.%.7f3)] +// CHECK:STDOUT: %.loc6_18.1: %i32 = splice_inst %.loc6_18.2 [template = %.loc6_18.3 (constants.%.4f1)] // CHECK:STDOUT: return %.loc6_18.1 // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -489,11 +489,11 @@ fn Test(d: D) { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %.loc6_12.3 => constants.%inst.as_compatible.1ff +// CHECK:STDOUT: %.loc6_12.3 => constants.%inst.specific_inst.615 // CHECK:STDOUT: %.loc6_12.4 => invalid -// CHECK:STDOUT: %.loc6_12.5 => constants.%inst.splice_block.5e1 +// CHECK:STDOUT: %.loc6_12.5 => constants.%inst.splice_block.1f8 // CHECK:STDOUT: %.loc6_12.6 => invalid -// CHECK:STDOUT: %.loc6_18.2 => constants.%inst.splice_block.c43 +// CHECK:STDOUT: %.loc6_18.2 => constants.%inst.splice_block.a55 // CHECK:STDOUT: %.loc6_18.3 => invalid // CHECK:STDOUT: } // CHECK:STDOUT: @@ -506,11 +506,11 @@ fn Test(d: D) { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.cdf -// CHECK:STDOUT: %.loc6_12.3 => constants.%inst.as_compatible.d98 +// CHECK:STDOUT: %.loc6_12.3 => constants.%inst.specific_inst.281 // CHECK:STDOUT: %.loc6_12.4 => invalid -// CHECK:STDOUT: %.loc6_12.5 => constants.%inst.splice_block.550 +// CHECK:STDOUT: %.loc6_12.5 => constants.%inst.splice_block.734 // CHECK:STDOUT: %.loc6_12.6 => invalid -// CHECK:STDOUT: %.loc6_18.2 => constants.%inst.splice_block.132 +// CHECK:STDOUT: %.loc6_18.2 => constants.%inst.splice_block.575 // CHECK:STDOUT: %.loc6_18.3 => invalid // CHECK:STDOUT: } // CHECK:STDOUT: @@ -533,9 +533,9 @@ fn Test(d: D) { // CHECK:STDOUT: %require_complete.441: = require_complete_type %U.091 [template] // CHECK:STDOUT: %pattern_type.946: type = pattern_type %U.091 [template] // CHECK:STDOUT: %_.patt.972: %pattern_type.946 = value_binding_pattern _ [template] -// CHECK:STDOUT: %.b3e: %T.67db0b.1 = splice_inst @AsType.%.loc6_16.4 [template] -// CHECK:STDOUT: %.07c: %U.091 = splice_inst @AsType.%.loc6_16.6 [template] -// CHECK:STDOUT: %.687: %U.091 = splice_inst @AsType.%.loc6_16.8 [template] +// CHECK:STDOUT: %.098: %T.67db0b.1 = splice_inst @AsType.%.loc6_16.4 [template] +// CHECK:STDOUT: %.51e: %U.091 = splice_inst @AsType.%.loc6_16.6 [template] +// CHECK:STDOUT: %.f21: %U.091 = splice_inst @AsType.%.loc6_16.8 [template] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %pattern_type.6b6: type = pattern_type %i32 [concrete] @@ -556,29 +556,29 @@ fn Test(d: D) { // CHECK:STDOUT: %x.param_patt.0f9: %pattern_type.98b = value_param_pattern [concrete] // CHECK:STDOUT: %x.patt.953: %pattern_type.98b = wrapper_binding_pattern x, %x.param_patt.0f9 [concrete] // CHECK:STDOUT: %_.patt.bed: %pattern_type.6b6 = value_binding_pattern _ [concrete] -// CHECK:STDOUT: %inst.as_compatible.1ff: = inst_value [concrete] { -// CHECK:STDOUT: %.775: %i32 = as_compatible @AsType.%x.ref +// CHECK:STDOUT: %inst.specific_inst.fbf: = inst_value [concrete] { +// CHECK:STDOUT: %.5a5: %i32 = specific_inst @AsType.%x.ref, @AsType(%i32, %i32) // CHECK:STDOUT: } -// CHECK:STDOUT: %inst.splice_block.5e1: = inst_value [concrete] { -// CHECK:STDOUT: %.093: %i32 = splice_block %.775 {} +// CHECK:STDOUT: %inst.splice_block.6e4: = inst_value [concrete] { +// CHECK:STDOUT: %.f67: %i32 = splice_block %.5a5 {} // CHECK:STDOUT: } -// CHECK:STDOUT: %inst.splice_block.520: = inst_value [concrete] { -// CHECK:STDOUT: %.b12: %i32 = splice_block %.093 {} +// CHECK:STDOUT: %inst.splice_block.bce: = inst_value [concrete] { +// CHECK:STDOUT: %.5f4: %i32 = splice_block %.f67 {} // CHECK:STDOUT: } -// CHECK:STDOUT: %inst.as_compatible.d98: = inst_value [concrete] { -// CHECK:STDOUT: %.f8c: %C = as_compatible @AsType.%x.ref +// CHECK:STDOUT: %inst.specific_inst.842: = inst_value [concrete] { +// CHECK:STDOUT: %.c99: %C = specific_inst @AsType.%x.ref, @AsType(%C, %i32) // CHECK:STDOUT: } // CHECK:STDOUT: %.419: type = fn_type_with_self_type %As.WithSelf.Convert.type.087, %As.facet [concrete] -// CHECK:STDOUT: %inst.splice_block.550: = inst_value [concrete] { -// CHECK:STDOUT: %.24f: %i32 = splice_block %.0bd { +// CHECK:STDOUT: %inst.splice_block.a88: = inst_value [concrete] { +// CHECK:STDOUT: %.781: %i32 = splice_block %.160 { // CHECK:STDOUT: %impl.elem0.47b: %.419 = impl_witness_access %As.impl_witness.80e, element0 [concrete = %C.as.As.impl.Convert] -// CHECK:STDOUT: %bound_method: = bound_method %.f8c, %impl.elem0.47b -// CHECK:STDOUT: %C.as.As.impl.Convert.call: init %i32 = call %bound_method(%.f8c) -// CHECK:STDOUT: %.0bd: %i32 = value_of_initializer %C.as.As.impl.Convert.call +// CHECK:STDOUT: %bound_method: = bound_method %.c99, %impl.elem0.47b +// CHECK:STDOUT: %C.as.As.impl.Convert.call: init %i32 = call %bound_method(%.c99) +// CHECK:STDOUT: %.160: %i32 = value_of_initializer %C.as.As.impl.Convert.call // CHECK:STDOUT: } // CHECK:STDOUT: } -// CHECK:STDOUT: %inst.splice_block.022: = inst_value [concrete] { -// CHECK:STDOUT: %.77f: %i32 = splice_block %.24f {} +// CHECK:STDOUT: %inst.splice_block.055: = inst_value [concrete] { +// CHECK:STDOUT: %.950: %i32 = splice_block %.781 {} // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -619,20 +619,20 @@ fn Test(d: D) { // CHECK:STDOUT: %require_complete.loc6: = require_complete_type %U.loc5_45.1 [template = %require_complete.loc6 (constants.%require_complete.441)] // CHECK:STDOUT: %pattern_type.loc6: type = pattern_type %U.loc5_45.1 [template = %pattern_type.loc6 (constants.%pattern_type.946)] // CHECK:STDOUT: %_.patt.loc6_8.2: @AsType.%pattern_type.loc6 (%pattern_type.946) = value_binding_pattern _ [template = %_.patt.loc6_8.2 (constants.%_.patt.972)] -// CHECK:STDOUT: %.loc6_16.4: = refine_type_action %x.ref, %T.loc5_21.1 [template] -// CHECK:STDOUT: %.loc6_16.5: @AsType.%T.loc5_21.1 (%T.67db0b.1) = splice_inst %.loc6_16.4 [template = %.loc6_16.5 (constants.%.b3e)] +// CHECK:STDOUT: %.loc6_16.4: = refine_inst_action %x.ref [template] +// CHECK:STDOUT: %.loc6_16.5: @AsType.%T.loc5_21.1 (%T.67db0b.1) = splice_inst %.loc6_16.4 [template = %.loc6_16.5 (constants.%.098)] // CHECK:STDOUT: %.loc6_16.6: = convert_action %.loc6_16.1, %U.loc5_45.1, element7 [template] -// CHECK:STDOUT: %.loc6_16.7: @AsType.%U.loc5_45.1 (%U.091) = splice_inst %.loc6_16.6 [template = %.loc6_16.7 (constants.%.07c)] +// CHECK:STDOUT: %.loc6_16.7: @AsType.%U.loc5_45.1 (%U.091) = splice_inst %.loc6_16.6 [template = %.loc6_16.7 (constants.%.51e)] // CHECK:STDOUT: %.loc6_16.8: = convert_to_category_action %.loc6_16.2, element1 [template] -// CHECK:STDOUT: %.loc6_16.9: @AsType.%U.loc5_45.1 (%U.091) = splice_inst %.loc6_16.8 [template = %.loc6_16.9 (constants.%.687)] +// CHECK:STDOUT: %.loc6_16.9: @AsType.%U.loc5_45.1 (%U.091) = splice_inst %.loc6_16.8 [template = %.loc6_16.9 (constants.%.f21)] // CHECK:STDOUT: // CHECK:STDOUT: fn(%x.param: @AsType.%T.loc5_21.1 (%T.67db0b.1)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %x.ref: @AsType.%T.loc5_21.1 (%T.67db0b.1) = name_ref x, %x // CHECK:STDOUT: %U.ref.loc6_19: type = name_ref U, %U.loc5_45.2 [template = %U.loc5_45.1 (constants.%U.091)] -// CHECK:STDOUT: %.loc6_16.1: @AsType.%T.loc5_21.1 (%T.67db0b.1) = splice_inst %.loc6_16.4 [template = %.loc6_16.5 (constants.%.b3e)] -// CHECK:STDOUT: %.loc6_16.2: @AsType.%U.loc5_45.1 (%U.091) = splice_inst %.loc6_16.6 [template = %.loc6_16.7 (constants.%.07c)] -// CHECK:STDOUT: %.loc6_16.3: @AsType.%U.loc5_45.1 (%U.091) = splice_inst %.loc6_16.8 [template = %.loc6_16.9 (constants.%.687)] +// CHECK:STDOUT: %.loc6_16.1: @AsType.%T.loc5_21.1 (%T.67db0b.1) = splice_inst %.loc6_16.4 [template = %.loc6_16.5 (constants.%.098)] +// CHECK:STDOUT: %.loc6_16.2: @AsType.%U.loc5_45.1 (%U.091) = splice_inst %.loc6_16.6 [template = %.loc6_16.7 (constants.%.51e)] +// CHECK:STDOUT: %.loc6_16.3: @AsType.%U.loc5_45.1 (%U.091) = splice_inst %.loc6_16.8 [template = %.loc6_16.9 (constants.%.f21)] // CHECK:STDOUT: %U.ref.loc6_10: type = name_ref U, %U.loc5_45.2 [template = %U.loc5_45.1 (constants.%U.091)] // CHECK:STDOUT: %_: @AsType.%U.loc5_45.1 (%U.091) = wrapper_binding _, %.loc6_16.3 // CHECK:STDOUT: name_binding_decl { @@ -666,11 +666,11 @@ fn Test(d: D) { // CHECK:STDOUT: %require_complete.loc6 => constants.%complete_type.f8a // CHECK:STDOUT: %pattern_type.loc6 => constants.%pattern_type.6b6 // CHECK:STDOUT: %_.patt.loc6_8.2 => constants.%_.patt.bed -// CHECK:STDOUT: %.loc6_16.4 => constants.%inst.as_compatible.1ff +// CHECK:STDOUT: %.loc6_16.4 => constants.%inst.specific_inst.fbf // CHECK:STDOUT: %.loc6_16.5 => invalid -// CHECK:STDOUT: %.loc6_16.6 => constants.%inst.splice_block.5e1 +// CHECK:STDOUT: %.loc6_16.6 => constants.%inst.splice_block.6e4 // CHECK:STDOUT: %.loc6_16.7 => invalid -// CHECK:STDOUT: %.loc6_16.8 => constants.%inst.splice_block.520 +// CHECK:STDOUT: %.loc6_16.8 => constants.%inst.splice_block.bce // CHECK:STDOUT: %.loc6_16.9 => invalid // CHECK:STDOUT: } // CHECK:STDOUT: @@ -688,11 +688,11 @@ fn Test(d: D) { // CHECK:STDOUT: %require_complete.loc6 => constants.%complete_type.f8a // CHECK:STDOUT: %pattern_type.loc6 => constants.%pattern_type.6b6 // CHECK:STDOUT: %_.patt.loc6_8.2 => constants.%_.patt.bed -// CHECK:STDOUT: %.loc6_16.4 => constants.%inst.as_compatible.d98 +// CHECK:STDOUT: %.loc6_16.4 => constants.%inst.specific_inst.842 // CHECK:STDOUT: %.loc6_16.5 => invalid -// CHECK:STDOUT: %.loc6_16.6 => constants.%inst.splice_block.550 +// CHECK:STDOUT: %.loc6_16.6 => constants.%inst.splice_block.a88 // CHECK:STDOUT: %.loc6_16.7 => invalid -// CHECK:STDOUT: %.loc6_16.8 => constants.%inst.splice_block.022 +// CHECK:STDOUT: %.loc6_16.8 => constants.%inst.splice_block.055 // CHECK:STDOUT: %.loc6_16.9 => invalid // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/generic/template/member_access.carbon b/toolchain/check/testdata/generic/template/member_access.carbon index 15caf977ab08..dd394abd1482 100644 --- a/toolchain/check/testdata/generic/template/member_access.carbon +++ b/toolchain/check/testdata/generic/template/member_access.carbon @@ -136,9 +136,9 @@ fn G(d: D) -> i32 { // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete.944: = require_complete_type %T.67db0b.1 [template] // CHECK:STDOUT: %n.patt: %pattern_type.6b6 = value_binding_pattern n [concrete] -// CHECK:STDOUT: %.b3e: %T.67db0b.1 = splice_inst @F.%.loc6_17.4 [template] -// CHECK:STDOUT: %.432: @F.%.loc6_17.7 (@F.%.loc6_17.7) = splice_inst @F.%.loc6_17.6 [template] -// CHECK:STDOUT: %.43a: %i32 = splice_inst @F.%.loc6_17.9 [template] +// CHECK:STDOUT: %.098: %T.67db0b.1 = splice_inst @F.%.loc6_17.4 [template] +// CHECK:STDOUT: %.7a1: @F.%.loc6_17.7 (@F.%.loc6_17.7) = splice_inst @F.%.loc6_17.6 [template] +// CHECK:STDOUT: %.ae0: %i32 = splice_inst @F.%.loc6_17.9 [template] // CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] // CHECK:STDOUT: %Int.as.Copy.impl.Op.type.ac8: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic] // CHECK:STDOUT: %Int.as.Copy.impl.Op.5e0: %Int.as.Copy.impl.Op.type.ac8 = struct_value () [symbolic] @@ -160,28 +160,28 @@ fn G(d: D) -> i32 { // CHECK:STDOUT: %pattern_type.860: type = pattern_type %struct_type.m.n [concrete] // CHECK:STDOUT: %x.param_patt.c8a: %pattern_type.860 = value_param_pattern [concrete] // CHECK:STDOUT: %x.patt.3a7: %pattern_type.860 = wrapper_binding_pattern x, %x.param_patt.c8a [concrete] -// CHECK:STDOUT: %inst.as_compatible.d98: = inst_value [concrete] { -// CHECK:STDOUT: %.f8c: %C = as_compatible @F.%x.ref +// CHECK:STDOUT: %inst.specific_inst.669: = inst_value [concrete] { +// CHECK:STDOUT: %.bfd: %C = specific_inst @F.%x.ref, @F(%C) // CHECK:STDOUT: } -// CHECK:STDOUT: %inst.splice_block.1c3: = inst_value [concrete] { -// CHECK:STDOUT: %.ba1: %i32 = splice_block %.1e9 { +// CHECK:STDOUT: %inst.splice_block.62c: = inst_value [concrete] { +// CHECK:STDOUT: %.b57: %i32 = splice_block %.232 { // CHECK:STDOUT: %n.ref: %C.elem = name_ref n, @C.%field_decl [concrete = @C.%field_decl] -// CHECK:STDOUT: %.a48: ref %i32 = class_element_access %.f8c, element0 -// CHECK:STDOUT: %.1e9: %i32 = acquire_value %.a48 +// CHECK:STDOUT: %.d33: ref %i32 = class_element_access %.bfd, element0 +// CHECK:STDOUT: %.232: %i32 = acquire_value %.d33 // CHECK:STDOUT: } // CHECK:STDOUT: } -// CHECK:STDOUT: %inst.splice_block.4ec: = inst_value [concrete] { -// CHECK:STDOUT: %.0b7: %i32 = splice_block %.ba1 {} +// CHECK:STDOUT: %inst.splice_block.575: = inst_value [concrete] { +// CHECK:STDOUT: %.51a: %i32 = splice_block %.b57 {} // CHECK:STDOUT: } // CHECK:STDOUT: %complete_type.08f: = complete_type_witness %struct_type.m.n [concrete] -// CHECK:STDOUT: %inst.as_compatible.bba: = inst_value [concrete] { -// CHECK:STDOUT: %.a89: %struct_type.m.n = as_compatible @F.%x.ref +// CHECK:STDOUT: %inst.specific_inst.7c9: = inst_value [concrete] { +// CHECK:STDOUT: %.d1d: %struct_type.m.n = specific_inst @F.%x.ref, @F(%struct_type.m.n) // CHECK:STDOUT: } // CHECK:STDOUT: %inst.struct_access: = inst_value [concrete] { -// CHECK:STDOUT: %.ebd: %i32 = struct_access %.a89, element1 +// CHECK:STDOUT: %.465: %i32 = struct_access %.d1d, element1 // CHECK:STDOUT: } -// CHECK:STDOUT: %inst.splice_block.1b4: = inst_value [concrete] { -// CHECK:STDOUT: %.214: %i32 = splice_block %.ebd {} +// CHECK:STDOUT: %inst.splice_block.177: = inst_value [concrete] { +// CHECK:STDOUT: %.605: %i32 = splice_block %.465 {} // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -222,20 +222,20 @@ fn G(d: D) -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %T.loc5_16.1 [template = %require_complete (constants.%require_complete.944)] -// CHECK:STDOUT: %.loc6_17.4: = refine_type_action %x.ref, %T.loc5_16.1 [template] -// CHECK:STDOUT: %.loc6_17.5: @F.%T.loc5_16.1 (%T.67db0b.1) = splice_inst %.loc6_17.4 [template = %.loc6_17.5 (constants.%.b3e)] +// CHECK:STDOUT: %.loc6_17.4: = refine_inst_action %x.ref [template] +// CHECK:STDOUT: %.loc6_17.5: @F.%T.loc5_16.1 (%T.67db0b.1) = splice_inst %.loc6_17.4 [template = %.loc6_17.5 (constants.%.098)] // CHECK:STDOUT: %.loc6_17.6: = access_member_action %.loc6_17.1, n [template] // CHECK:STDOUT: %.loc6_17.7: type = type_of_inst %.loc6_17.6 [template] -// CHECK:STDOUT: %.loc6_17.8: @F.%.loc6_17.7 (@F.%.loc6_17.7) = splice_inst %.loc6_17.6 [template = %.loc6_17.8 (constants.%.432)] +// CHECK:STDOUT: %.loc6_17.8: @F.%.loc6_17.7 (@F.%.loc6_17.7) = splice_inst %.loc6_17.6 [template = %.loc6_17.8 (constants.%.7a1)] // CHECK:STDOUT: %.loc6_17.9: = convert_to_value_action %.loc6_17.2, constants.%i32 [template] -// CHECK:STDOUT: %.loc6_17.10: %i32 = splice_inst %.loc6_17.9 [template = %.loc6_17.10 (constants.%.43a)] +// CHECK:STDOUT: %.loc6_17.10: %i32 = splice_inst %.loc6_17.9 [template = %.loc6_17.10 (constants.%.ae0)] // CHECK:STDOUT: // CHECK:STDOUT: fn(%x.param: @F.%T.loc5_16.1 (%T.67db0b.1)) -> out %return.param: %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %x.ref: @F.%T.loc5_16.1 (%T.67db0b.1) = name_ref x, %x -// CHECK:STDOUT: %.loc6_17.1: @F.%T.loc5_16.1 (%T.67db0b.1) = splice_inst %.loc6_17.4 [template = %.loc6_17.5 (constants.%.b3e)] -// CHECK:STDOUT: %.loc6_17.2: @F.%.loc6_17.7 (@F.%.loc6_17.7) = splice_inst %.loc6_17.6 [template = %.loc6_17.8 (constants.%.432)] -// CHECK:STDOUT: %.loc6_17.3: %i32 = splice_inst %.loc6_17.9 [template = %.loc6_17.10 (constants.%.43a)] +// CHECK:STDOUT: %.loc6_17.1: @F.%T.loc5_16.1 (%T.67db0b.1) = splice_inst %.loc6_17.4 [template = %.loc6_17.5 (constants.%.098)] +// CHECK:STDOUT: %.loc6_17.2: @F.%.loc6_17.7 (@F.%.loc6_17.7) = splice_inst %.loc6_17.6 [template = %.loc6_17.8 (constants.%.7a1)] +// CHECK:STDOUT: %.loc6_17.3: %i32 = splice_inst %.loc6_17.9 [template = %.loc6_17.10 (constants.%.ae0)] // CHECK:STDOUT: %i32.loc6: type = type_literal constants.%i32 [concrete = constants.%i32] // CHECK:STDOUT: %n: %i32 = wrapper_binding n, %.loc6_17.3 // CHECK:STDOUT: name_binding_decl { @@ -268,12 +268,12 @@ fn G(d: D) -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.cdf -// CHECK:STDOUT: %.loc6_17.4 => constants.%inst.as_compatible.d98 +// CHECK:STDOUT: %.loc6_17.4 => constants.%inst.specific_inst.669 // CHECK:STDOUT: %.loc6_17.5 => invalid -// CHECK:STDOUT: %.loc6_17.6 => constants.%inst.splice_block.1c3 +// CHECK:STDOUT: %.loc6_17.6 => constants.%inst.splice_block.62c // CHECK:STDOUT: %.loc6_17.7 => constants.%i32 // CHECK:STDOUT: %.loc6_17.8 => invalid -// CHECK:STDOUT: %.loc6_17.9 => constants.%inst.splice_block.4ec +// CHECK:STDOUT: %.loc6_17.9 => constants.%inst.splice_block.575 // CHECK:STDOUT: %.loc6_17.10 => invalid // CHECK:STDOUT: } // CHECK:STDOUT: @@ -286,12 +286,12 @@ fn G(d: D) -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.08f -// CHECK:STDOUT: %.loc6_17.4 => constants.%inst.as_compatible.bba +// CHECK:STDOUT: %.loc6_17.4 => constants.%inst.specific_inst.7c9 // CHECK:STDOUT: %.loc6_17.5 => invalid // CHECK:STDOUT: %.loc6_17.6 => constants.%inst.struct_access // CHECK:STDOUT: %.loc6_17.7 => constants.%i32 // CHECK:STDOUT: %.loc6_17.8 => invalid -// CHECK:STDOUT: %.loc6_17.9 => constants.%inst.splice_block.1b4 +// CHECK:STDOUT: %.loc6_17.9 => constants.%inst.splice_block.177 // CHECK:STDOUT: %.loc6_17.10 => invalid // CHECK:STDOUT: } // CHECK:STDOUT: @@ -317,8 +317,8 @@ fn G(d: D) -> i32 { // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete.944: = require_complete_type %T [template] -// CHECK:STDOUT: %.b3e: %T = splice_inst @F.%.loc10_11.3 [template] -// CHECK:STDOUT: %.244: @F.%.loc10_11.6 (@F.%.loc10_11.6) = splice_inst @F.%.loc10_11.5 [template] +// CHECK:STDOUT: %.098: %T = splice_inst @F.%.loc10_11.3 [template] +// CHECK:STDOUT: %.942: @F.%.loc10_11.6 (@F.%.loc10_11.6) = splice_inst @F.%.loc10_11.5 [template] // CHECK:STDOUT: %Dest: type = symbolic_binding Dest, 0 [symbolic] // CHECK:STDOUT: %ImplicitAs.type.3aa: type = facet_type <@ImplicitAs, @ImplicitAs(%Dest)> [symbolic] // CHECK:STDOUT: %Self.294: %ImplicitAs.type.3aa = symbolic_binding Self, 1 [symbolic] @@ -326,24 +326,25 @@ fn G(d: D) -> i32 { // CHECK:STDOUT: %ImplicitAs.WithSelf.Convert.945: %ImplicitAs.WithSelf.Convert.type.97e = struct_value () [symbolic] // CHECK:STDOUT: %ImplicitAs.assoc_type.e23: type = assoc_entity_type @ImplicitAs, @ImplicitAs(%i32) [concrete] // CHECK:STDOUT: %assoc0.368: %ImplicitAs.assoc_type.e23 = assoc_entity element0, imports.%Core.import_ref.cb2 [concrete] -// CHECK:STDOUT: %.841: @F.%.loc10_17.6 (@F.%.loc10_17.6) = splice_inst @F.%.loc10_17.5 [template] -// CHECK:STDOUT: %.cbd: @F.%.loc10_17.9 (@F.%.loc10_17.9) = splice_inst @F.%.loc10_17.8 [template] -// CHECK:STDOUT: %.c63: %i32 = splice_inst @F.%.loc10_17.11 [template] +// CHECK:STDOUT: %.823: @F.%.loc10_17.7 (@F.%.loc10_17.7) = splice_inst @F.%.loc10_17.6 [template] +// CHECK:STDOUT: %.497: @F.%.loc10_17.10 (@F.%.loc10_17.10) = splice_inst @F.%.loc10_17.9 [template] +// CHECK:STDOUT: %.572: %i32 = splice_inst @F.%.loc10_17.12 [template] +// CHECK:STDOUT: %.829: %i32 = splice_inst @F.%.loc10_17.14 [template] // CHECK:STDOUT: %D: type = class_type @D [concrete] // CHECK:STDOUT: %struct_type.base.085: type = struct_type {.base: %C} [concrete] // CHECK:STDOUT: %complete_type.756: = complete_type_witness %struct_type.base.085 [concrete] // CHECK:STDOUT: %pattern_type.d8d: type = pattern_type %D [concrete] // CHECK:STDOUT: %x.param_patt.23b: %pattern_type.d8d = value_param_pattern [concrete] // CHECK:STDOUT: %x.patt.c51: %pattern_type.d8d = wrapper_binding_pattern x, %x.param_patt.23b [concrete] -// CHECK:STDOUT: %inst.as_compatible: = inst_value [concrete] { -// CHECK:STDOUT: %.602: %D = as_compatible @F.%x.ref +// CHECK:STDOUT: %inst.specific_inst: = inst_value [concrete] { +// CHECK:STDOUT: %.24c: %D = specific_inst @F.%x.ref, @F(%D) // CHECK:STDOUT: } -// CHECK:STDOUT: %inst.splice_block.08b: = inst_value [concrete] { -// CHECK:STDOUT: %.1843e: ref %i32 = splice_block %.a6d { -// CHECK:STDOUT: %.68a: %C = as_compatible %.602 -// CHECK:STDOUT: %.c3b: ref %C = class_element_access %.68a, element0 -// CHECK:STDOUT: %.59a: ref %C = converted %.602, %.c3b -// CHECK:STDOUT: %.a6d: ref %i32 = class_element_access %.59a, element0 +// CHECK:STDOUT: %inst.splice_block.edc: = inst_value [concrete] { +// CHECK:STDOUT: %.859: ref %i32 = splice_block %.b2f { +// CHECK:STDOUT: %.179: %C = as_compatible %.24c +// CHECK:STDOUT: %.8a5: ref %C = class_element_access %.179, element0 +// CHECK:STDOUT: %.313: ref %C = converted %.24c, %.8a5 +// CHECK:STDOUT: %.b2f: ref %i32 = class_element_access %.313, element0 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: %inst.splice_block.edd: = inst_value [concrete] { @@ -387,32 +388,35 @@ fn G(d: D) -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %T.loc9_16.1 [template = %require_complete (constants.%require_complete.944)] -// CHECK:STDOUT: %.loc10_11.3: = refine_type_action %x.ref, %T.loc9_16.1 [template] -// CHECK:STDOUT: %.loc10_11.4: @F.%T.loc9_16.1 (%T) = splice_inst %.loc10_11.3 [template = %.loc10_11.4 (constants.%.b3e)] +// CHECK:STDOUT: %.loc10_11.3: = refine_inst_action %x.ref [template] +// CHECK:STDOUT: %.loc10_11.4: @F.%T.loc9_16.1 (%T) = splice_inst %.loc10_11.3 [template = %.loc10_11.4 (constants.%.098)] // CHECK:STDOUT: %.loc10_11.5: = compound_member_access_action %.loc10_11.1, %n.ref [template] // CHECK:STDOUT: %.loc10_11.6: type = type_of_inst %.loc10_11.5 [template] -// CHECK:STDOUT: %.loc10_11.7: @F.%.loc10_11.6 (@F.%.loc10_11.6) = splice_inst %.loc10_11.5 [template = %.loc10_11.7 (constants.%.244)] -// CHECK:STDOUT: %.loc10_17.5: = compound_member_access_action %.loc10_11.2, constants.%assoc0.368 [template] -// CHECK:STDOUT: %.loc10_17.6: type = type_of_inst %.loc10_17.5 [template] -// CHECK:STDOUT: %.loc10_17.7: @F.%.loc10_17.6 (@F.%.loc10_17.6) = splice_inst %.loc10_17.5 [template = %.loc10_17.7 (constants.%.841)] -// CHECK:STDOUT: %.loc10_17.8: = call_action (%.loc10_17.1), true [template] -// CHECK:STDOUT: %.loc10_17.9: type = type_of_inst %.loc10_17.8 [template] -// CHECK:STDOUT: %.loc10_17.10: @F.%.loc10_17.9 (@F.%.loc10_17.9) = splice_inst %.loc10_17.8 [template = %.loc10_17.10 (constants.%.cbd)] -// CHECK:STDOUT: %.loc10_17.11: = convert_to_category_action %.loc10_17.3, element10 [template] -// CHECK:STDOUT: %.loc10_17.12: %i32 = splice_inst %.loc10_17.11 [template = %.loc10_17.12 (constants.%.c63)] +// CHECK:STDOUT: %.loc10_11.7: @F.%.loc10_11.6 (@F.%.loc10_11.6) = splice_inst %.loc10_11.5 [template = %.loc10_11.7 (constants.%.942)] +// CHECK:STDOUT: %.loc10_17.6: = compound_member_access_action %.loc10_11.2, constants.%assoc0.368 [template] +// CHECK:STDOUT: %.loc10_17.7: type = type_of_inst %.loc10_17.6 [template] +// CHECK:STDOUT: %.loc10_17.8: @F.%.loc10_17.7 (@F.%.loc10_17.7) = splice_inst %.loc10_17.6 [template = %.loc10_17.8 (constants.%.823)] +// CHECK:STDOUT: %.loc10_17.9: = call_action (%.loc10_17.1), true [template] +// CHECK:STDOUT: %.loc10_17.10: type = type_of_inst %.loc10_17.9 [template] +// CHECK:STDOUT: %.loc10_17.11: @F.%.loc10_17.10 (@F.%.loc10_17.10) = splice_inst %.loc10_17.9 [template = %.loc10_17.11 (constants.%.497)] +// CHECK:STDOUT: %.loc10_17.12: = refine_inst_action %.loc10_17.3 [template] +// CHECK:STDOUT: %.loc10_17.13: %i32 = splice_inst %.loc10_17.12 [template = %.loc10_17.13 (constants.%.572)] +// CHECK:STDOUT: %.loc10_17.14: = convert_to_category_action %.loc10_17.4, element10 [template] +// CHECK:STDOUT: %.loc10_17.15: %i32 = splice_inst %.loc10_17.14 [template = %.loc10_17.15 (constants.%.829)] // CHECK:STDOUT: // CHECK:STDOUT: fn(%x.param: @F.%T.loc9_16.1 (%T)) -> out %return.param: %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %x.ref: @F.%T.loc9_16.1 (%T) = name_ref x, %x // CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] // CHECK:STDOUT: %n.ref: %C.elem = name_ref n, @C.%field_decl [concrete = @C.%field_decl] -// CHECK:STDOUT: %.loc10_11.1: @F.%T.loc9_16.1 (%T) = splice_inst %.loc10_11.3 [template = %.loc10_11.4 (constants.%.b3e)] -// CHECK:STDOUT: %.loc10_11.2: @F.%.loc10_11.6 (@F.%.loc10_11.6) = splice_inst %.loc10_11.5 [template = %.loc10_11.7 (constants.%.244)] -// CHECK:STDOUT: %.loc10_17.1: @F.%.loc10_17.6 (@F.%.loc10_17.6) = splice_inst %.loc10_17.5 [template = %.loc10_17.7 (constants.%.841)] -// CHECK:STDOUT: %.loc10_17.2: @F.%.loc10_17.9 (@F.%.loc10_17.9) = splice_inst %.loc10_17.8 [template = %.loc10_17.10 (constants.%.cbd)] -// CHECK:STDOUT: %.loc10_17.3: %i32 = converted %.loc10_11.2, %.loc10_17.2 [template = %.loc10_17.10 (constants.%.cbd)] -// CHECK:STDOUT: %.loc10_17.4: %i32 = splice_inst %.loc10_17.11 [template = %.loc10_17.12 (constants.%.c63)] -// CHECK:STDOUT: return %.loc10_17.4 +// CHECK:STDOUT: %.loc10_11.1: @F.%T.loc9_16.1 (%T) = splice_inst %.loc10_11.3 [template = %.loc10_11.4 (constants.%.098)] +// CHECK:STDOUT: %.loc10_11.2: @F.%.loc10_11.6 (@F.%.loc10_11.6) = splice_inst %.loc10_11.5 [template = %.loc10_11.7 (constants.%.942)] +// CHECK:STDOUT: %.loc10_17.1: @F.%.loc10_17.7 (@F.%.loc10_17.7) = splice_inst %.loc10_17.6 [template = %.loc10_17.8 (constants.%.823)] +// CHECK:STDOUT: %.loc10_17.2: @F.%.loc10_17.10 (@F.%.loc10_17.10) = splice_inst %.loc10_17.9 [template = %.loc10_17.11 (constants.%.497)] +// CHECK:STDOUT: %.loc10_17.3: %i32 = converted %.loc10_11.2, %.loc10_17.2 [template = %.loc10_17.11 (constants.%.497)] +// CHECK:STDOUT: %.loc10_17.4: %i32 = splice_inst %.loc10_17.12 [template = %.loc10_17.13 (constants.%.572)] +// CHECK:STDOUT: %.loc10_17.5: %i32 = splice_inst %.loc10_17.14 [template = %.loc10_17.15 (constants.%.829)] +// CHECK:STDOUT: return %.loc10_17.5 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -433,18 +437,20 @@ fn G(d: D) -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.756 -// CHECK:STDOUT: %.loc10_11.3 => constants.%inst.as_compatible +// CHECK:STDOUT: %.loc10_11.3 => constants.%inst.specific_inst // CHECK:STDOUT: %.loc10_11.4 => invalid -// CHECK:STDOUT: %.loc10_11.5 => constants.%inst.splice_block.08b +// CHECK:STDOUT: %.loc10_11.5 => constants.%inst.splice_block.edc // CHECK:STDOUT: %.loc10_11.6 => constants.%i32 // CHECK:STDOUT: %.loc10_11.7 => invalid -// CHECK:STDOUT: %.loc10_17.5 => constants.%inst.splice_block.edd -// CHECK:STDOUT: %.loc10_17.6 => +// CHECK:STDOUT: %.loc10_17.6 => constants.%inst.splice_block.edd // CHECK:STDOUT: %.loc10_17.7 => // CHECK:STDOUT: %.loc10_17.8 => // CHECK:STDOUT: %.loc10_17.9 => // CHECK:STDOUT: %.loc10_17.10 => // CHECK:STDOUT: %.loc10_17.11 => // CHECK:STDOUT: %.loc10_17.12 => +// CHECK:STDOUT: %.loc10_17.13 => +// CHECK:STDOUT: %.loc10_17.14 => +// CHECK:STDOUT: %.loc10_17.15 => // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/generic/template/template_access_assoc_const.carbon b/toolchain/check/testdata/generic/template/template_access_assoc_const.carbon index 4c38649135c3..f4063817513a 100644 --- a/toolchain/check/testdata/generic/template/template_access_assoc_const.carbon +++ b/toolchain/check/testdata/generic/template/template_access_assoc_const.carbon @@ -34,22 +34,25 @@ interface I(template T: type, N: T.I1) { // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0, template [template] // CHECK:STDOUT: %T: type = symbolic_binding T, 0, template [template] -// CHECK:STDOUT: %.e63: @I.%.loc16_35.2 (@I.%.loc16_35.2) = splice_inst @I.%.loc16_35.1 [template] -// CHECK:STDOUT: %.c68: type = splice_inst @I.%.loc16_35.4 [template] -// CHECK:STDOUT: %pattern_type.6d1: type = pattern_type %.c68 [template] -// CHECK:STDOUT: %N.patt.718: %pattern_type.6d1 = symbolic_binding_pattern N, 1 [template] -// CHECK:STDOUT: %N: %.c68 = symbolic_binding N, 1 [template] -// CHECK:STDOUT: %.299: = access_member_action %T, I1 [template] -// CHECK:STDOUT: %.912: type = type_of_inst %.299 [template] -// CHECK:STDOUT: %.a7e: %.912 = splice_inst %.299 [template] -// CHECK:STDOUT: %.32e: = convert_to_value_action %.a7e, type [template] -// CHECK:STDOUT: %.408: type = splice_inst %.32e [template] -// CHECK:STDOUT: %pattern_type.d1e: type = pattern_type %.408 [template] -// CHECK:STDOUT: %N.patt.47e: %pattern_type.d1e = symbolic_binding_pattern N, 1 [template] +// CHECK:STDOUT: %.eec: type = splice_inst @I.%.loc16_35.1 [template] +// CHECK:STDOUT: %.e35: @I.%.loc16_35.4 (@I.%.loc16_35.4) = splice_inst @I.%.loc16_35.3 [template] +// CHECK:STDOUT: %.476: type = splice_inst @I.%.loc16_35.6 [template] +// CHECK:STDOUT: %pattern_type.8f9: type = pattern_type %.476 [template] +// CHECK:STDOUT: %N.patt.9e2: %pattern_type.8f9 = symbolic_binding_pattern N, 1 [template] +// CHECK:STDOUT: %N: %.476 = symbolic_binding N, 1 [template] +// CHECK:STDOUT: %.dc4: = refine_inst_action %T [template] +// CHECK:STDOUT: %.40e: type = splice_inst %.dc4 [template] +// CHECK:STDOUT: %.2e4: = access_member_action %.40e, I1 [template] +// CHECK:STDOUT: %.ffd: type = type_of_inst %.2e4 [template] +// CHECK:STDOUT: %.242: %.ffd = splice_inst %.2e4 [template] +// CHECK:STDOUT: %.626: = convert_to_value_action %.242, type [template] +// CHECK:STDOUT: %.e0e: type = splice_inst %.626 [template] +// CHECK:STDOUT: %pattern_type.55f: type = pattern_type %.e0e [template] +// CHECK:STDOUT: %N.patt.f4e: %pattern_type.55f = symbolic_binding_pattern N, 1 [template] // CHECK:STDOUT: %I.type.335: type = generic_interface_type @I [concrete] // CHECK:STDOUT: %I.generic: %I.type.335 = struct_value () [concrete] -// CHECK:STDOUT: %I.type.223: type = facet_type <@I, @I(%T, %N)> [template] -// CHECK:STDOUT: %Self: %I.type.223 = symbolic_binding Self, 2 [template] +// CHECK:STDOUT: %I.type.f82: type = facet_type <@I, @I(%T, %N)> [template] +// CHECK:STDOUT: %Self: %I.type.f82 = symbolic_binding Self, 2 [template] // CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I, @I(%T, %N) [template] // CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, @I.WithSelf.%I1 [template] // CHECK:STDOUT: } @@ -57,41 +60,44 @@ interface I(template T: type, N: T.I1) { // CHECK:STDOUT: file { // CHECK:STDOUT: %I.decl: %I.type.335 = interface_decl @I [concrete = constants.%I.generic] { // CHECK:STDOUT: %T.patt.loc16_23.1: %pattern_type.98f = symbolic_binding_pattern T, 0, template [template = %T.patt.loc16_23.2 (constants.%T.patt)] -// CHECK:STDOUT: %N.patt.loc16_32.1: @I.%pattern_type (%pattern_type.6d1) = symbolic_binding_pattern N, 1 [template = %N.patt.loc16_32.2 (constants.%N.patt.718)] +// CHECK:STDOUT: %N.patt.loc16_32.1: @I.%pattern_type (%pattern_type.8f9) = symbolic_binding_pattern N, 1 [template = %N.patt.loc16_32.2 (constants.%N.patt.9e2)] // CHECK:STDOUT: } { // CHECK:STDOUT: %.loc16_25.1: type = splice_block %.loc16_25.2 [concrete = type] { // CHECK:STDOUT: %.Self.frozen.loc16_23: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.frozen] // CHECK:STDOUT: %.loc16_25.2: type = type_literal type [concrete = type] // CHECK:STDOUT: } // CHECK:STDOUT: %T.loc16_23.2: type = symbolic_binding T, 0, template [template = %T.loc16_23.1 (constants.%T)] -// CHECK:STDOUT: %.loc16_35.6: type = splice_block %.loc16_35.8 [template = %.loc16_35.5 (constants.%.c68)] { +// CHECK:STDOUT: %.loc16_35.8: type = splice_block %.loc16_35.11 [template = %.loc16_35.7 (constants.%.476)] { // CHECK:STDOUT: %.Self.frozen.loc16_32: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.frozen] // CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc16_23.2 [template = %T.loc16_23.1 (constants.%T)] -// CHECK:STDOUT: %.loc16_35.7: @I.%.loc16_35.2 (@I.%.loc16_35.2) = splice_inst %.loc16_35.1 [template = %.loc16_35.3 (constants.%.e63)] -// CHECK:STDOUT: %.loc16_35.8: type = splice_inst %.loc16_35.4 [template = %.loc16_35.5 (constants.%.c68)] +// CHECK:STDOUT: %.loc16_35.9: type = splice_inst %.loc16_35.1 [template = %.loc16_35.2 (constants.%.eec)] +// CHECK:STDOUT: %.loc16_35.10: @I.%.loc16_35.4 (@I.%.loc16_35.4) = splice_inst %.loc16_35.3 [template = %.loc16_35.5 (constants.%.e35)] +// CHECK:STDOUT: %.loc16_35.11: type = splice_inst %.loc16_35.6 [template = %.loc16_35.7 (constants.%.476)] // CHECK:STDOUT: } -// CHECK:STDOUT: %N.loc16_32.2: @I.%.loc16_35.5 (%.c68) = symbolic_binding N, 1 [template = %N.loc16_32.1 (constants.%N)] +// CHECK:STDOUT: %N.loc16_32.2: @I.%.loc16_35.7 (%.476) = symbolic_binding N, 1 [template = %N.loc16_32.1 (constants.%N)] // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic interface @I(%T.loc16_23.2: type, %N.loc16_32.2: @I.%.loc16_35.5 (%.c68)) { +// CHECK:STDOUT: generic interface @I(%T.loc16_23.2: type, %N.loc16_32.2: @I.%.loc16_35.7 (%.476)) { // CHECK:STDOUT: %T.patt.loc16_23.2: %pattern_type.98f = symbolic_binding_pattern T, 0, template [template = %T.patt.loc16_23.2 (constants.%T.patt)] // CHECK:STDOUT: %T.loc16_23.1: type = symbolic_binding T, 0, template [template = %T.loc16_23.1 (constants.%T)] -// CHECK:STDOUT: %.loc16_35.1: = access_member_action %T.ref, I1 [template] -// CHECK:STDOUT: %.loc16_35.2: type = type_of_inst %.loc16_35.1 [template] -// CHECK:STDOUT: %.loc16_35.3: @I.%.loc16_35.2 (@I.%.loc16_35.2) = splice_inst %.loc16_35.1 [template = %.loc16_35.3 (constants.%.e63)] -// CHECK:STDOUT: %.loc16_35.4: = convert_to_value_action %.loc16_35.7, type [template] -// CHECK:STDOUT: %.loc16_35.5: type = splice_inst %.loc16_35.4 [template = %.loc16_35.5 (constants.%.c68)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %.loc16_35.5 [template = %pattern_type (constants.%pattern_type.6d1)] -// CHECK:STDOUT: %N.patt.loc16_32.2: @I.%pattern_type (%pattern_type.6d1) = symbolic_binding_pattern N, 1 [template = %N.patt.loc16_32.2 (constants.%N.patt.718)] -// CHECK:STDOUT: %N.loc16_32.1: @I.%.loc16_35.5 (%.c68) = symbolic_binding N, 1 [template = %N.loc16_32.1 (constants.%N)] +// CHECK:STDOUT: %.loc16_35.1: = refine_inst_action %T.ref [template] +// CHECK:STDOUT: %.loc16_35.2: type = splice_inst %.loc16_35.1 [template = %.loc16_35.2 (constants.%.eec)] +// CHECK:STDOUT: %.loc16_35.3: = access_member_action %.loc16_35.9, I1 [template] +// CHECK:STDOUT: %.loc16_35.4: type = type_of_inst %.loc16_35.3 [template] +// CHECK:STDOUT: %.loc16_35.5: @I.%.loc16_35.4 (@I.%.loc16_35.4) = splice_inst %.loc16_35.3 [template = %.loc16_35.5 (constants.%.e35)] +// CHECK:STDOUT: %.loc16_35.6: = convert_to_value_action %.loc16_35.10, type [template] +// CHECK:STDOUT: %.loc16_35.7: type = splice_inst %.loc16_35.6 [template = %.loc16_35.7 (constants.%.476)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %.loc16_35.7 [template = %pattern_type (constants.%pattern_type.8f9)] +// CHECK:STDOUT: %N.patt.loc16_32.2: @I.%pattern_type (%pattern_type.8f9) = symbolic_binding_pattern N, 1 [template = %N.patt.loc16_32.2 (constants.%N.patt.9e2)] +// CHECK:STDOUT: %N.loc16_32.1: @I.%.loc16_35.7 (%.476) = symbolic_binding N, 1 [template = %N.loc16_32.1 (constants.%N)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %I.type: type = facet_type <@I, @I(%T.loc16_23.1, %N.loc16_32.1)> [template = %I.type (constants.%I.type.223)] -// CHECK:STDOUT: %Self.loc16_40.2: @I.%I.type (%I.type.223) = symbolic_binding Self, 2 [template = %Self.loc16_40.2 (constants.%Self)] +// CHECK:STDOUT: %I.type: type = facet_type <@I, @I(%T.loc16_23.1, %N.loc16_32.1)> [template = %I.type (constants.%I.type.f82)] +// CHECK:STDOUT: %Self.loc16_40.2: @I.%I.type (%I.type.f82) = symbolic_binding Self, 2 [template = %Self.loc16_40.2 (constants.%Self)] // CHECK:STDOUT: // CHECK:STDOUT: interface { -// CHECK:STDOUT: %Self.loc16_40.1: @I.%I.type (%I.type.223) = symbolic_binding Self, 2 [template = %Self.loc16_40.2 (constants.%Self)] +// CHECK:STDOUT: %Self.loc16_40.1: @I.%I.type (%I.type.f82) = symbolic_binding Self, 2 [template = %Self.loc16_40.2 (constants.%Self)] // CHECK:STDOUT: %I.WithSelf.decl = interface_with_self_decl @I [concrete] // CHECK:STDOUT: // CHECK:STDOUT: !with Self: @@ -111,13 +117,15 @@ interface I(template T: type, N: T.I1) { // CHECK:STDOUT: specific @I(constants.%T, constants.%N) { // CHECK:STDOUT: %T.patt.loc16_23.2 => constants.%T.patt // CHECK:STDOUT: %T.loc16_23.1 => constants.%T -// CHECK:STDOUT: %.loc16_35.1 => constants.%.299 -// CHECK:STDOUT: %.loc16_35.2 => constants.%.912 -// CHECK:STDOUT: %.loc16_35.3 => constants.%.a7e -// CHECK:STDOUT: %.loc16_35.4 => constants.%.32e -// CHECK:STDOUT: %.loc16_35.5 => constants.%.408 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.d1e -// CHECK:STDOUT: %N.patt.loc16_32.2 => constants.%N.patt.47e +// CHECK:STDOUT: %.loc16_35.1 => constants.%.dc4 +// CHECK:STDOUT: %.loc16_35.2 => constants.%.40e +// CHECK:STDOUT: %.loc16_35.3 => constants.%.2e4 +// CHECK:STDOUT: %.loc16_35.4 => constants.%.ffd +// CHECK:STDOUT: %.loc16_35.5 => constants.%.242 +// CHECK:STDOUT: %.loc16_35.6 => constants.%.626 +// CHECK:STDOUT: %.loc16_35.7 => constants.%.e0e +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.55f +// CHECK:STDOUT: %N.patt.loc16_32.2 => constants.%N.patt.f4e // CHECK:STDOUT: %N.loc16_32.1 => constants.%N // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/generic/template/unimplemented.carbon b/toolchain/check/testdata/generic/template/unimplemented.carbon index 9d6b9592f855..de731351184f 100644 --- a/toolchain/check/testdata/generic/template/unimplemented.carbon +++ b/toolchain/check/testdata/generic/template/unimplemented.carbon @@ -59,10 +59,10 @@ fn F(template c: C) { // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete.944: = require_complete_type %T [template] -// CHECK:STDOUT: %.b3e: %T = splice_inst @F.%.loc11_5.4 [template] -// CHECK:STDOUT: %.432: @F.%.loc11_5.7 (@F.%.loc11_5.7) = splice_inst @F.%.loc11_5.6 [template] -// CHECK:STDOUT: %require_complete.681: = require_complete_type @F.%.loc11_5.7 [template] -// CHECK:STDOUT: %.263: @F.%.loc11_5.7 (@F.%.loc11_5.7) = splice_inst @F.%.loc11_5.9 [template] +// CHECK:STDOUT: %.098: %T = splice_inst @F.%.loc11_5.4 [template] +// CHECK:STDOUT: %.7a1: @F.%.loc11_5.7 (@F.%.loc11_5.7) = splice_inst @F.%.loc11_5.6 [template] +// CHECK:STDOUT: %require_complete.052: = require_complete_type @F.%.loc11_5.7 [template] +// CHECK:STDOUT: %.899: @F.%.loc11_5.7 (@F.%.loc11_5.7) = splice_inst @F.%.loc11_5.9 [template] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -103,21 +103,21 @@ fn F(template c: C) { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete.loc6: = require_complete_type %T.loc6_16.1 [template = %require_complete.loc6 (constants.%require_complete.944)] -// CHECK:STDOUT: %.loc11_5.4: = refine_type_action %x.ref, %T.loc6_16.1 [template] -// CHECK:STDOUT: %.loc11_5.5: @F.%T.loc6_16.1 (%T) = splice_inst %.loc11_5.4 [template = %.loc11_5.5 (constants.%.b3e)] +// CHECK:STDOUT: %.loc11_5.4: = refine_inst_action %x.ref [template] +// CHECK:STDOUT: %.loc11_5.5: @F.%T.loc6_16.1 (%T) = splice_inst %.loc11_5.4 [template = %.loc11_5.5 (constants.%.098)] // CHECK:STDOUT: %.loc11_5.6: = access_member_action %.loc11_5.1, n [template] // CHECK:STDOUT: %.loc11_5.7: type = type_of_inst %.loc11_5.6 [template] -// CHECK:STDOUT: %.loc11_5.8: @F.%.loc11_5.7 (@F.%.loc11_5.7) = splice_inst %.loc11_5.6 [template = %.loc11_5.8 (constants.%.432)] -// CHECK:STDOUT: %require_complete.loc11: = require_complete_type %.loc11_5.7 [template = %require_complete.loc11 (constants.%require_complete.681)] +// CHECK:STDOUT: %.loc11_5.8: @F.%.loc11_5.7 (@F.%.loc11_5.7) = splice_inst %.loc11_5.6 [template = %.loc11_5.8 (constants.%.7a1)] +// CHECK:STDOUT: %require_complete.loc11: = require_complete_type %.loc11_5.7 [template = %require_complete.loc11 (constants.%require_complete.052)] // CHECK:STDOUT: %.loc11_5.9: = convert_to_category_action %.loc11_5.2, element1 [template] -// CHECK:STDOUT: %.loc11_5.10: @F.%.loc11_5.7 (@F.%.loc11_5.7) = splice_inst %.loc11_5.9 [template = %.loc11_5.10 (constants.%.263)] +// CHECK:STDOUT: %.loc11_5.10: @F.%.loc11_5.7 (@F.%.loc11_5.7) = splice_inst %.loc11_5.9 [template = %.loc11_5.10 (constants.%.899)] // CHECK:STDOUT: // CHECK:STDOUT: fn(%x.param: @F.%T.loc6_16.1 (%T)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %x.ref: @F.%T.loc6_16.1 (%T) = name_ref x, %x -// CHECK:STDOUT: %.loc11_5.1: @F.%T.loc6_16.1 (%T) = splice_inst %.loc11_5.4 [template = %.loc11_5.5 (constants.%.b3e)] -// CHECK:STDOUT: %.loc11_5.2: @F.%.loc11_5.7 (@F.%.loc11_5.7) = splice_inst %.loc11_5.6 [template = %.loc11_5.8 (constants.%.432)] -// CHECK:STDOUT: %.loc11_5.3: @F.%.loc11_5.7 (@F.%.loc11_5.7) = splice_inst %.loc11_5.9 [template = %.loc11_5.10 (constants.%.263)] +// CHECK:STDOUT: %.loc11_5.1: @F.%T.loc6_16.1 (%T) = splice_inst %.loc11_5.4 [template = %.loc11_5.5 (constants.%.098)] +// CHECK:STDOUT: %.loc11_5.2: @F.%.loc11_5.7 (@F.%.loc11_5.7) = splice_inst %.loc11_5.6 [template = %.loc11_5.8 (constants.%.7a1)] +// CHECK:STDOUT: %.loc11_5.3: @F.%.loc11_5.7 (@F.%.loc11_5.7) = splice_inst %.loc11_5.9 [template = %.loc11_5.10 (constants.%.899)] // CHECK:STDOUT: %.loc11_3: ref = deref %.loc11_5.3 [concrete = ] // CHECK:STDOUT: return // CHECK:STDOUT: } @@ -149,9 +149,10 @@ fn F(template c: C) { // CHECK:STDOUT: %c: %C = symbolic_binding c, 0, template [template] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %.26f: @F.%.loc16_5.4 (@F.%.loc16_5.4) = splice_inst @F.%.loc16_5.3 [template] -// CHECK:STDOUT: %require_complete.519: = require_complete_type @F.%.loc16_5.4 [template] -// CHECK:STDOUT: %.2d8: @F.%.loc16_5.4 (@F.%.loc16_5.4) = splice_inst @F.%.loc16_5.6 [template] +// CHECK:STDOUT: %.1dc: %C = splice_inst @F.%.loc16_5.4 [template] +// CHECK:STDOUT: %.fb4: @F.%.loc16_5.7 (@F.%.loc16_5.7) = splice_inst @F.%.loc16_5.6 [template] +// CHECK:STDOUT: %require_complete.d99: = require_complete_type @F.%.loc16_5.7 [template] +// CHECK:STDOUT: %.458: @F.%.loc16_5.7 (@F.%.loc16_5.7) = splice_inst @F.%.loc16_5.9 [template] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -199,19 +200,22 @@ fn F(template c: C) { // CHECK:STDOUT: %c.loc11_16.1: %C = symbolic_binding c, 0, template [template = %c.loc11_16.1 (constants.%c)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %.loc16_5.3: = access_member_action %c.ref, n [template] -// CHECK:STDOUT: %.loc16_5.4: type = type_of_inst %.loc16_5.3 [template] -// CHECK:STDOUT: %.loc16_5.5: @F.%.loc16_5.4 (@F.%.loc16_5.4) = splice_inst %.loc16_5.3 [template = %.loc16_5.5 (constants.%.26f)] -// CHECK:STDOUT: %require_complete: = require_complete_type %.loc16_5.4 [template = %require_complete (constants.%require_complete.519)] -// CHECK:STDOUT: %.loc16_5.6: = convert_to_category_action %.loc16_5.1, element1 [template] -// CHECK:STDOUT: %.loc16_5.7: @F.%.loc16_5.4 (@F.%.loc16_5.4) = splice_inst %.loc16_5.6 [template = %.loc16_5.7 (constants.%.2d8)] +// CHECK:STDOUT: %.loc16_5.4: = refine_inst_action %c.ref [template] +// CHECK:STDOUT: %.loc16_5.5: %C = splice_inst %.loc16_5.4 [template = %.loc16_5.5 (constants.%.1dc)] +// CHECK:STDOUT: %.loc16_5.6: = access_member_action %.loc16_5.1, n [template] +// CHECK:STDOUT: %.loc16_5.7: type = type_of_inst %.loc16_5.6 [template] +// CHECK:STDOUT: %.loc16_5.8: @F.%.loc16_5.7 (@F.%.loc16_5.7) = splice_inst %.loc16_5.6 [template = %.loc16_5.8 (constants.%.fb4)] +// CHECK:STDOUT: %require_complete: = require_complete_type %.loc16_5.7 [template = %require_complete (constants.%require_complete.d99)] +// CHECK:STDOUT: %.loc16_5.9: = convert_to_category_action %.loc16_5.2, element1 [template] +// CHECK:STDOUT: %.loc16_5.10: @F.%.loc16_5.7 (@F.%.loc16_5.7) = splice_inst %.loc16_5.9 [template = %.loc16_5.10 (constants.%.458)] // CHECK:STDOUT: // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %c.ref: %C = name_ref c, %c.loc11_16.2 [template = %c.loc11_16.1 (constants.%c)] -// CHECK:STDOUT: %.loc16_5.1: @F.%.loc16_5.4 (@F.%.loc16_5.4) = splice_inst %.loc16_5.3 [template = %.loc16_5.5 (constants.%.26f)] -// CHECK:STDOUT: %.loc16_5.2: @F.%.loc16_5.4 (@F.%.loc16_5.4) = splice_inst %.loc16_5.6 [template = %.loc16_5.7 (constants.%.2d8)] -// CHECK:STDOUT: %.loc16_3: ref = deref %.loc16_5.2 [concrete = ] +// CHECK:STDOUT: %.loc16_5.1: %C = splice_inst %.loc16_5.4 [template = %.loc16_5.5 (constants.%.1dc)] +// CHECK:STDOUT: %.loc16_5.2: @F.%.loc16_5.7 (@F.%.loc16_5.7) = splice_inst %.loc16_5.6 [template = %.loc16_5.8 (constants.%.fb4)] +// CHECK:STDOUT: %.loc16_5.3: @F.%.loc16_5.7 (@F.%.loc16_5.7) = splice_inst %.loc16_5.9 [template = %.loc16_5.10 (constants.%.458)] +// CHECK:STDOUT: %.loc16_3: ref = deref %.loc16_5.3 [concrete = ] // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: } diff --git a/toolchain/check/testdata/generic/template_dependence.carbon b/toolchain/check/testdata/generic/template_dependence.carbon index 075b78d2749b..cd57c4cf6dad 100644 --- a/toolchain/check/testdata/generic/template_dependence.carbon +++ b/toolchain/check/testdata/generic/template_dependence.carbon @@ -63,10 +63,10 @@ fn F(template T: type, generic U: type) -> (T, U) { // CHECK:STDOUT: %Copy.WithSelf.Op.b85212.1: %Copy.WithSelf.Op.type.c85f21.1 = struct_value () [symbolic] // CHECK:STDOUT: %Copy.assoc_type: type = assoc_entity_type @Copy [concrete] // CHECK:STDOUT: %assoc0: %Copy.assoc_type = assoc_entity element0, imports.%Core.import_ref.b5f [concrete] -// CHECK:STDOUT: %.f57: %ptr.e8f8f9.1 = splice_inst @F.%.loc6_10.6 [template] -// CHECK:STDOUT: %.5d1: @F.%.loc6_10.9 (@F.%.loc6_10.9) = splice_inst @F.%.loc6_10.8 [template] -// CHECK:STDOUT: %.c4d: @F.%.loc6_10.12 (@F.%.loc6_10.12) = splice_inst @F.%.loc6_10.11 [template] -// CHECK:STDOUT: %.993: @F.%.loc6_10.12 (@F.%.loc6_10.12) = splice_inst @F.%.loc6_12.2 [template] +// CHECK:STDOUT: %.e87: %ptr.e8f8f9.1 = splice_inst @F.%.loc6_10.6 [template] +// CHECK:STDOUT: %.655: @F.%.loc6_10.9 (@F.%.loc6_10.9) = splice_inst @F.%.loc6_10.8 [template] +// CHECK:STDOUT: %.d36: @F.%.loc6_10.12 (@F.%.loc6_10.12) = splice_inst @F.%.loc6_10.11 [template] +// CHECK:STDOUT: %.e48: @F.%.loc6_10.12 (@F.%.loc6_10.12) = splice_inst @F.%.loc6_12.2 [template] // CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] // CHECK:STDOUT: %ptr.843: type = ptr_type %empty_tuple.type [concrete] // CHECK:STDOUT: %ptr.74f: type = ptr_type %ptr.843 [concrete] @@ -82,8 +82,8 @@ fn F(template T: type, generic U: type) -> (T, U) { // CHECK:STDOUT: %F.specific_fn: = specific_function %F, @F(%empty_tuple.type) [concrete] // CHECK:STDOUT: %complete_type.2f1: = complete_type_witness %ptr.74f [concrete] // CHECK:STDOUT: %complete_type.2ab: = complete_type_witness %ptr.843 [concrete] -// CHECK:STDOUT: %inst.as_compatible: = inst_value [concrete] { -// CHECK:STDOUT: %.34a: %ptr.843 = as_compatible @F.%.loc6_10.2 +// CHECK:STDOUT: %inst.specific_inst: = inst_value [concrete] { +// CHECK:STDOUT: %.091: %ptr.843 = specific_inst @F.%.loc6_10.2, @F(%empty_tuple.type) // CHECK:STDOUT: } // CHECK:STDOUT: %T.67db0b.2: type = symbolic_binding T, 0 [symbolic] // CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.ff5: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.67db0b.2) [symbolic] @@ -94,22 +94,22 @@ fn F(template T: type, generic U: type) -> (T, U) { // CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %ptr.843, (%Copy.impl_witness.5e7) [concrete] // CHECK:STDOUT: %Copy.WithSelf.Op.type.9ea: type = fn_type @Copy.WithSelf.Op, @Copy.WithSelf(%Copy.facet) [concrete] // CHECK:STDOUT: %.b77: type = fn_type_with_self_type %Copy.WithSelf.Op.type.9ea, %Copy.facet [concrete] -// CHECK:STDOUT: %inst.splice_block.64f: = inst_value [concrete] { -// CHECK:STDOUT: %.aaa: = splice_block %bound_method.661 { +// CHECK:STDOUT: %inst.splice_block.85c: = inst_value [concrete] { +// CHECK:STDOUT: %.8fa: = splice_block %bound_method.d03 { // CHECK:STDOUT: %impl.elem0.227: %.b77 = impl_witness_access %Copy.impl_witness.5e7, element0 [concrete = %ptr.as.Copy.impl.Op.ee1] -// CHECK:STDOUT: %bound_method.661: = bound_method %.34a, %impl.elem0.227 +// CHECK:STDOUT: %bound_method.d03: = bound_method %.091, %impl.elem0.227 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: %ptr.as.Copy.impl.Op.specific_fn: = specific_function %ptr.as.Copy.impl.Op.ee1, @ptr.as.Copy.impl.Op(%empty_tuple.type) [concrete] -// CHECK:STDOUT: %inst.splice_block.a80: = inst_value [concrete] { -// CHECK:STDOUT: %.e72: init %ptr.843 = splice_block %ptr.as.Copy.impl.Op.call { +// CHECK:STDOUT: %inst.splice_block.61d: = inst_value [concrete] { +// CHECK:STDOUT: %.d08: init %ptr.843 = splice_block %ptr.as.Copy.impl.Op.call { // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0.227, @ptr.as.Copy.impl.Op(%empty_tuple.type) [concrete = %ptr.as.Copy.impl.Op.specific_fn] -// CHECK:STDOUT: %bound_method.b01: = bound_method %.34a, %specific_fn -// CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.843 = call %bound_method.b01(%.34a) +// CHECK:STDOUT: %bound_method.733: = bound_method %.091, %specific_fn +// CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.843 = call %bound_method.733(%.091) // CHECK:STDOUT: } // CHECK:STDOUT: } -// CHECK:STDOUT: %inst.splice_block.333: = inst_value [concrete] { -// CHECK:STDOUT: %.932: init %ptr.843 = splice_block %.e72 {} +// CHECK:STDOUT: %inst.splice_block.97e: = inst_value [concrete] { +// CHECK:STDOUT: %.db1: init %ptr.843 = splice_block %.d08 {} // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -184,26 +184,26 @@ fn F(template T: type, generic U: type) -> (T, U) { // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete.loc5_25: = require_complete_type %ptr.loc5_29.1 [template = %require_complete.loc5_25 (constants.%require_complete.fbe)] // CHECK:STDOUT: %require_complete.loc5_32: = require_complete_type %ptr.loc5_28.1 [template = %require_complete.loc5_32 (constants.%require_complete.ef162c.1)] -// CHECK:STDOUT: %.loc6_10.6: = refine_type_action %.loc6_10.2, %ptr.loc5_28.1 [template] -// CHECK:STDOUT: %.loc6_10.7: @F.%ptr.loc5_28.1 (%ptr.e8f8f9.1) = splice_inst %.loc6_10.6 [template = %.loc6_10.7 (constants.%.f57)] +// CHECK:STDOUT: %.loc6_10.6: = refine_inst_action %.loc6_10.2 [template] +// CHECK:STDOUT: %.loc6_10.7: @F.%ptr.loc5_28.1 (%ptr.e8f8f9.1) = splice_inst %.loc6_10.6 [template = %.loc6_10.7 (constants.%.e87)] // CHECK:STDOUT: %.loc6_10.8: = compound_member_access_action %.loc6_10.3, constants.%assoc0 [template] // CHECK:STDOUT: %.loc6_10.9: type = type_of_inst %.loc6_10.8 [template] -// CHECK:STDOUT: %.loc6_10.10: @F.%.loc6_10.9 (@F.%.loc6_10.9) = splice_inst %.loc6_10.8 [template = %.loc6_10.10 (constants.%.5d1)] +// CHECK:STDOUT: %.loc6_10.10: @F.%.loc6_10.9 (@F.%.loc6_10.9) = splice_inst %.loc6_10.8 [template = %.loc6_10.10 (constants.%.655)] // CHECK:STDOUT: %.loc6_10.11: = call_action (%.loc6_10.4), true [template] // CHECK:STDOUT: %.loc6_10.12: type = type_of_inst %.loc6_10.11 [template] -// CHECK:STDOUT: %.loc6_10.13: @F.%.loc6_10.12 (@F.%.loc6_10.12) = splice_inst %.loc6_10.11 [template = %.loc6_10.13 (constants.%.c4d)] +// CHECK:STDOUT: %.loc6_10.13: @F.%.loc6_10.12 (@F.%.loc6_10.12) = splice_inst %.loc6_10.11 [template = %.loc6_10.13 (constants.%.d36)] // CHECK:STDOUT: %.loc6_12.2: = convert_to_category_action %.loc6_10.5, element10 [template] -// CHECK:STDOUT: %.loc6_12.3: @F.%.loc6_10.12 (@F.%.loc6_10.12) = splice_inst %.loc6_12.2 [template = %.loc6_12.3 (constants.%.993)] +// CHECK:STDOUT: %.loc6_12.3: @F.%.loc6_10.12 (@F.%.loc6_10.12) = splice_inst %.loc6_12.2 [template = %.loc6_12.3 (constants.%.e48)] // CHECK:STDOUT: // CHECK:STDOUT: fn(%x.param: @F.%ptr.loc5_29.1 (%ptr.125)) -> out %return.param: @F.%ptr.loc5_28.1 (%ptr.e8f8f9.1) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %x.ref: @F.%ptr.loc5_29.1 (%ptr.125) = name_ref x, %x // CHECK:STDOUT: %.loc6_10.1: ref @F.%ptr.loc5_28.1 (%ptr.e8f8f9.1) = deref %x.ref // CHECK:STDOUT: %.loc6_10.2: @F.%ptr.loc5_28.1 (%ptr.e8f8f9.1) = acquire_value %.loc6_10.1 -// CHECK:STDOUT: %.loc6_10.3: @F.%ptr.loc5_28.1 (%ptr.e8f8f9.1) = splice_inst %.loc6_10.6 [template = %.loc6_10.7 (constants.%.f57)] -// CHECK:STDOUT: %.loc6_10.4: @F.%.loc6_10.9 (@F.%.loc6_10.9) = splice_inst %.loc6_10.8 [template = %.loc6_10.10 (constants.%.5d1)] -// CHECK:STDOUT: %.loc6_10.5: @F.%.loc6_10.12 (@F.%.loc6_10.12) = splice_inst %.loc6_10.11 [template = %.loc6_10.13 (constants.%.c4d)] -// CHECK:STDOUT: %.loc6_12.1: @F.%.loc6_10.12 (@F.%.loc6_10.12) = splice_inst %.loc6_12.2 [template = %.loc6_12.3 (constants.%.993)] +// CHECK:STDOUT: %.loc6_10.3: @F.%ptr.loc5_28.1 (%ptr.e8f8f9.1) = splice_inst %.loc6_10.6 [template = %.loc6_10.7 (constants.%.e87)] +// CHECK:STDOUT: %.loc6_10.4: @F.%.loc6_10.9 (@F.%.loc6_10.9) = splice_inst %.loc6_10.8 [template = %.loc6_10.10 (constants.%.655)] +// CHECK:STDOUT: %.loc6_10.5: @F.%.loc6_10.12 (@F.%.loc6_10.12) = splice_inst %.loc6_10.11 [template = %.loc6_10.13 (constants.%.d36)] +// CHECK:STDOUT: %.loc6_12.1: @F.%.loc6_10.12 (@F.%.loc6_10.12) = splice_inst %.loc6_12.2 [template = %.loc6_12.3 (constants.%.e48)] // CHECK:STDOUT: return %.loc6_12.1 // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -247,15 +247,15 @@ fn F(template T: type, generic U: type) -> (T, U) { // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete.loc5_25 => constants.%complete_type.2f1 // CHECK:STDOUT: %require_complete.loc5_32 => constants.%complete_type.2ab -// CHECK:STDOUT: %.loc6_10.6 => constants.%inst.as_compatible +// CHECK:STDOUT: %.loc6_10.6 => constants.%inst.specific_inst // CHECK:STDOUT: %.loc6_10.7 => invalid -// CHECK:STDOUT: %.loc6_10.8 => constants.%inst.splice_block.64f +// CHECK:STDOUT: %.loc6_10.8 => constants.%inst.splice_block.85c // CHECK:STDOUT: %.loc6_10.9 => // CHECK:STDOUT: %.loc6_10.10 => invalid -// CHECK:STDOUT: %.loc6_10.11 => constants.%inst.splice_block.a80 +// CHECK:STDOUT: %.loc6_10.11 => constants.%inst.splice_block.61d // CHECK:STDOUT: %.loc6_10.12 => constants.%ptr.843 // CHECK:STDOUT: %.loc6_10.13 => invalid -// CHECK:STDOUT: %.loc6_12.2 => constants.%inst.splice_block.333 +// CHECK:STDOUT: %.loc6_12.2 => constants.%inst.splice_block.97e // CHECK:STDOUT: %.loc6_12.3 => invalid // CHECK:STDOUT: } // CHECK:STDOUT: @@ -279,15 +279,16 @@ fn F(template T: type, generic U: type) -> (T, U) { // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete: = require_complete_type %tuple.type.a5e [template] -// CHECK:STDOUT: %.dca: @F.%.loc6_16.3 (@F.%.loc6_16.3) = splice_inst @F.%.loc6_16.2 [template] +// CHECK:STDOUT: %.eec: type = splice_inst @F.%.loc6_16.3 [template] +// CHECK:STDOUT: %.733: @F.%.loc6_16.6 (@F.%.loc6_16.6) = splice_inst @F.%.loc6_16.5 [template] // CHECK:STDOUT: %ImplicitAs.type.0ff: type = generic_interface_type @ImplicitAs [concrete] // CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.0ff = struct_value () [concrete] // CHECK:STDOUT: %.6c2: @F.%.loc6_17.9 (@F.%.loc6_17.9) = splice_inst @F.%.loc6_17.8 [template] // CHECK:STDOUT: %.201: @F.%.loc6_17.12 (@F.%.loc6_17.12) = splice_inst @F.%.loc6_17.11 [template] -// CHECK:STDOUT: %.7f3: @F.%.loc6_17.15 (@F.%.loc6_17.15) = splice_inst @F.%.loc6_17.14 [template] -// CHECK:STDOUT: %.e78: @F.%.loc6_17.18 (@F.%.loc6_17.18) = splice_inst @F.%.loc6_17.17 [template] -// CHECK:STDOUT: %.a48: %tuple.type.a5e = splice_inst @F.%.loc6_17.20 [template] -// CHECK:STDOUT: %.c7e: %tuple.type.a5e = splice_inst @F.%.loc6_17.22 [template] +// CHECK:STDOUT: %.a93: @F.%.loc6_17.15 (@F.%.loc6_17.15) = splice_inst @F.%.loc6_17.14 [template] +// CHECK:STDOUT: %.d9a: @F.%.loc6_17.18 (@F.%.loc6_17.18) = splice_inst @F.%.loc6_17.17 [template] +// CHECK:STDOUT: %.13d: %tuple.type.a5e = splice_inst @F.%.loc6_17.20 [template] +// CHECK:STDOUT: %.8c9: %tuple.type.a5e = splice_inst @F.%.loc6_17.22 [template] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -331,39 +332,42 @@ fn F(template T: type, generic U: type) -> (T, U) { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %tuple.type [template = %require_complete (constants.%require_complete)] -// CHECK:STDOUT: %.loc6_16.2: = call_action (%F.ref, %T.ref.loc6, %U.ref.loc6), false [template] -// CHECK:STDOUT: %.loc6_16.3: type = type_of_inst %.loc6_16.2 [template] -// CHECK:STDOUT: %.loc6_16.4: @F.%.loc6_16.3 (@F.%.loc6_16.3) = splice_inst %.loc6_16.2 [template = %.loc6_16.4 (constants.%.dca)] +// CHECK:STDOUT: %.loc6_16.3: = refine_inst_action %T.ref.loc6 [template] +// CHECK:STDOUT: %.loc6_16.4: type = splice_inst %.loc6_16.3 [template = %.loc6_16.4 (constants.%.eec)] +// CHECK:STDOUT: %.loc6_16.5: = call_action (%F.ref, %.loc6_16.1, %U.ref.loc6), false [template] +// CHECK:STDOUT: %.loc6_16.6: type = type_of_inst %.loc6_16.5 [template] +// CHECK:STDOUT: %.loc6_16.7: @F.%.loc6_16.6 (@F.%.loc6_16.6) = splice_inst %.loc6_16.5 [template = %.loc6_16.7 (constants.%.733)] // CHECK:STDOUT: %.loc6_17.8: = call_action (constants.%ImplicitAs.generic, %tuple.type), false [template] // CHECK:STDOUT: %.loc6_17.9: type = type_of_inst %.loc6_17.8 [template] // CHECK:STDOUT: %.loc6_17.10: @F.%.loc6_17.9 (@F.%.loc6_17.9) = splice_inst %.loc6_17.8 [template = %.loc6_17.10 (constants.%.6c2)] // CHECK:STDOUT: %.loc6_17.11: = access_member_action %.loc6_17.1, Convert [template] // CHECK:STDOUT: %.loc6_17.12: type = type_of_inst %.loc6_17.11 [template] // CHECK:STDOUT: %.loc6_17.13: @F.%.loc6_17.12 (@F.%.loc6_17.12) = splice_inst %.loc6_17.11 [template = %.loc6_17.13 (constants.%.201)] -// CHECK:STDOUT: %.loc6_17.14: = compound_member_access_action %.loc6_16.1, %.loc6_17.2 [template] +// CHECK:STDOUT: %.loc6_17.14: = compound_member_access_action %.loc6_16.2, %.loc6_17.2 [template] // CHECK:STDOUT: %.loc6_17.15: type = type_of_inst %.loc6_17.14 [template] -// CHECK:STDOUT: %.loc6_17.16: @F.%.loc6_17.15 (@F.%.loc6_17.15) = splice_inst %.loc6_17.14 [template = %.loc6_17.16 (constants.%.7f3)] +// CHECK:STDOUT: %.loc6_17.16: @F.%.loc6_17.15 (@F.%.loc6_17.15) = splice_inst %.loc6_17.14 [template = %.loc6_17.16 (constants.%.a93)] // CHECK:STDOUT: %.loc6_17.17: = call_action (%.loc6_17.3), true [template] // CHECK:STDOUT: %.loc6_17.18: type = type_of_inst %.loc6_17.17 [template] -// CHECK:STDOUT: %.loc6_17.19: @F.%.loc6_17.18 (@F.%.loc6_17.18) = splice_inst %.loc6_17.17 [template = %.loc6_17.19 (constants.%.e78)] -// CHECK:STDOUT: %.loc6_17.20: = refine_type_action %.loc6_17.5, %tuple.type [template] -// CHECK:STDOUT: %.loc6_17.21: @F.%tuple.type (%tuple.type.a5e) = splice_inst %.loc6_17.20 [template = %.loc6_17.21 (constants.%.a48)] +// CHECK:STDOUT: %.loc6_17.19: @F.%.loc6_17.18 (@F.%.loc6_17.18) = splice_inst %.loc6_17.17 [template = %.loc6_17.19 (constants.%.d9a)] +// CHECK:STDOUT: %.loc6_17.20: = refine_inst_action %.loc6_17.5 [template] +// CHECK:STDOUT: %.loc6_17.21: @F.%tuple.type (%tuple.type.a5e) = splice_inst %.loc6_17.20 [template = %.loc6_17.21 (constants.%.13d)] // CHECK:STDOUT: %.loc6_17.22: = convert_to_category_action %.loc6_17.6, element10 [template] -// CHECK:STDOUT: %.loc6_17.23: @F.%tuple.type (%tuple.type.a5e) = splice_inst %.loc6_17.22 [template = %.loc6_17.23 (constants.%.c7e)] +// CHECK:STDOUT: %.loc6_17.23: @F.%tuple.type (%tuple.type.a5e) = splice_inst %.loc6_17.22 [template = %.loc6_17.23 (constants.%.8c9)] // CHECK:STDOUT: // CHECK:STDOUT: fn() -> out %return.param: @F.%tuple.type (%tuple.type.a5e) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F] // CHECK:STDOUT: %T.ref.loc6: type = name_ref T, %T.loc5_16.2 [template = %T.loc5_16.1 (constants.%T)] // CHECK:STDOUT: %U.ref.loc6: type = name_ref U, %U.loc5_33.2 [symbolic = %U.loc5_33.1 (constants.%U)] -// CHECK:STDOUT: %.loc6_16.1: @F.%.loc6_16.3 (@F.%.loc6_16.3) = splice_inst %.loc6_16.2 [template = %.loc6_16.4 (constants.%.dca)] +// CHECK:STDOUT: %.loc6_16.1: type = splice_inst %.loc6_16.3 [template = %.loc6_16.4 (constants.%.eec)] +// CHECK:STDOUT: %.loc6_16.2: @F.%.loc6_16.6 (@F.%.loc6_16.6) = splice_inst %.loc6_16.5 [template = %.loc6_16.7 (constants.%.733)] // CHECK:STDOUT: %.loc6_17.1: @F.%.loc6_17.9 (@F.%.loc6_17.9) = splice_inst %.loc6_17.8 [template = %.loc6_17.10 (constants.%.6c2)] // CHECK:STDOUT: %.loc6_17.2: @F.%.loc6_17.12 (@F.%.loc6_17.12) = splice_inst %.loc6_17.11 [template = %.loc6_17.13 (constants.%.201)] -// CHECK:STDOUT: %.loc6_17.3: @F.%.loc6_17.15 (@F.%.loc6_17.15) = splice_inst %.loc6_17.14 [template = %.loc6_17.16 (constants.%.7f3)] -// CHECK:STDOUT: %.loc6_17.4: @F.%.loc6_17.18 (@F.%.loc6_17.18) = splice_inst %.loc6_17.17 [template = %.loc6_17.19 (constants.%.e78)] -// CHECK:STDOUT: %.loc6_17.5: @F.%tuple.type (%tuple.type.a5e) = converted %.loc6_16.1, %.loc6_17.4 [template = %.loc6_17.19 (constants.%.e78)] -// CHECK:STDOUT: %.loc6_17.6: @F.%tuple.type (%tuple.type.a5e) = splice_inst %.loc6_17.20 [template = %.loc6_17.21 (constants.%.a48)] -// CHECK:STDOUT: %.loc6_17.7: @F.%tuple.type (%tuple.type.a5e) = splice_inst %.loc6_17.22 [template = %.loc6_17.23 (constants.%.c7e)] +// CHECK:STDOUT: %.loc6_17.3: @F.%.loc6_17.15 (@F.%.loc6_17.15) = splice_inst %.loc6_17.14 [template = %.loc6_17.16 (constants.%.a93)] +// CHECK:STDOUT: %.loc6_17.4: @F.%.loc6_17.18 (@F.%.loc6_17.18) = splice_inst %.loc6_17.17 [template = %.loc6_17.19 (constants.%.d9a)] +// CHECK:STDOUT: %.loc6_17.5: @F.%tuple.type (%tuple.type.a5e) = converted %.loc6_16.2, %.loc6_17.4 [template = %.loc6_17.19 (constants.%.d9a)] +// CHECK:STDOUT: %.loc6_17.6: @F.%tuple.type (%tuple.type.a5e) = splice_inst %.loc6_17.20 [template = %.loc6_17.21 (constants.%.13d)] +// CHECK:STDOUT: %.loc6_17.7: @F.%tuple.type (%tuple.type.a5e) = splice_inst %.loc6_17.22 [template = %.loc6_17.23 (constants.%.8c9)] // CHECK:STDOUT: return %.loc6_17.7 to %return.param // CHECK:STDOUT: } // CHECK:STDOUT: } diff --git a/toolchain/check/testdata/interop/cpp/class/import/template.carbon b/toolchain/check/testdata/interop/cpp/class/import/template.carbon index c3adcb04b0fb..119ac85ee172 100644 --- a/toolchain/check/testdata/interop/cpp/class/import/template.carbon +++ b/toolchain/check/testdata/interop/cpp/class/import/template.carbon @@ -342,12 +342,13 @@ fn G() { // CHECK:STDOUT: %A.type: type = cpp_type_template_type A [concrete] // CHECK:STDOUT: %A.template: %A.type = struct_value () [concrete] // 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: %.4a6: type = splice_inst @B.%.loc12_17.4 [template] +// CHECK:STDOUT: %.dcc: @B.%.loc12_17.7 (@B.%.loc12_17.7) = splice_inst @B.%.loc12_17.6 [template] +// CHECK:STDOUT: %.d48: type = splice_inst @B.%.loc12_17.9 [template] +// CHECK:STDOUT: %require_complete.979: = require_complete_type %.d48 [template] +// CHECK:STDOUT: %B.elem.ebc: type = unbound_element_type %B.60e, %.d48 [template] +// CHECK:STDOUT: %struct_type.a.767: type = struct_type {.a: %.d48} [template] +// CHECK:STDOUT: %complete_type.1ad: = complete_type_witness %struct_type.a.767 [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] @@ -356,6 +357,9 @@ fn G() { // CHECK:STDOUT: %b.patt: %pattern_type.fdc = wrapper_binding_pattern b, %b.param_patt [concrete] // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %inst.specific_inst: = inst_value [concrete] { +// CHECK:STDOUT: %.d84: type = specific_inst %i32, @B(%i32) [concrete = %i32] +// CHECK:STDOUT: } // CHECK:STDOUT: %A: type = class_type @A [concrete] // CHECK:STDOUT: %inst.splice_block.72d: = inst_value [concrete] { // CHECK:STDOUT: %.22e: type = splice_block imports.%A.decl [concrete = %A] {} @@ -427,27 +431,30 @@ fn G() { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // 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.%.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.%.897)] -// CHECK:STDOUT: %require_complete: = require_complete_type %.loc12_17.7 [template = %require_complete (constants.%require_complete.5f2)] +// CHECK:STDOUT: %.loc12_17.4: = refine_inst_action %.loc12_16.1 [template] +// CHECK:STDOUT: %.loc12_17.5: type = splice_inst %.loc12_17.4 [template = %.loc12_17.5 (constants.%.4a6)] +// CHECK:STDOUT: %.loc12_17.6: = call_action (%A.ref, %.loc12_17.1), false [template] +// CHECK:STDOUT: %.loc12_17.7: type = type_of_inst %.loc12_17.6 [template] +// CHECK:STDOUT: %.loc12_17.8: @B.%.loc12_17.7 (@B.%.loc12_17.7) = splice_inst %.loc12_17.6 [template = %.loc12_17.8 (constants.%.dcc)] +// CHECK:STDOUT: %.loc12_17.9: = convert_to_value_action %.loc12_17.2, type [template] +// CHECK:STDOUT: %.loc12_17.10: type = splice_inst %.loc12_17.9 [template = %.loc12_17.10 (constants.%.d48)] +// CHECK:STDOUT: %require_complete: = require_complete_type %.loc12_17.10 [template = %require_complete (constants.%require_complete.979)] // 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.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: %B.elem: type = unbound_element_type %B, %.loc12_17.10 [template = %B.elem (constants.%B.elem.ebc)] +// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: @B.%.loc12_17.10 (%.d48)} [template = %struct_type.a (constants.%struct_type.a.767)] +// CHECK:STDOUT: %complete_type.loc13_1.2: = complete_type_witness %struct_type.a [template = %complete_type.loc13_1.2 (constants.%complete_type.1ad)] // CHECK:STDOUT: // CHECK:STDOUT: class { -// CHECK:STDOUT: %field_decl: @B.%B.elem (%B.elem.a93) = field_decl a, element0, %.loc12_17.2 in [concrete] { +// CHECK:STDOUT: %field_decl: @B.%B.elem (%B.elem.ebc) = field_decl a, element0, %.loc12_17.3 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_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: %.loc12_17.1: type = splice_inst %.loc12_17.4 [template = %.loc12_17.5 (constants.%.4a6)] +// CHECK:STDOUT: %.loc12_17.2: @B.%.loc12_17.7 (@B.%.loc12_17.7) = splice_inst %.loc12_17.6 [template = %.loc12_17.8 (constants.%.dcc)] +// CHECK:STDOUT: %.loc12_17.3: type = splice_inst %.loc12_17.9 [template = %.loc12_17.10 (constants.%.d48)] // CHECK:STDOUT: } -// 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.loc13_1.1: = complete_type_witness constants.%struct_type.a.767 [template = %complete_type.loc13_1.2 (constants.%complete_type.1ad)] // CHECK:STDOUT: complete_type_witness = %complete_type.loc13_1.1 // CHECK:STDOUT: // CHECK:STDOUT: !members: @@ -486,11 +493,13 @@ fn G() { // 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 -// CHECK:STDOUT: %.loc12_17.6 => constants.%inst.splice_block.c26 -// CHECK:STDOUT: %.loc12_17.7 => constants.%A +// CHECK:STDOUT: %.loc12_17.4 => constants.%inst.specific_inst +// CHECK:STDOUT: %.loc12_17.5 => constants.%i32 +// CHECK:STDOUT: %.loc12_17.6 => constants.%inst.splice_block.72d +// CHECK:STDOUT: %.loc12_17.7 => type +// CHECK:STDOUT: %.loc12_17.8 => constants.%A +// CHECK:STDOUT: %.loc12_17.9 => constants.%inst.splice_block.c26 +// CHECK:STDOUT: %.loc12_17.10 => constants.%A // CHECK:STDOUT: %require_complete => constants.%complete_type.ece // CHECK:STDOUT: %B => constants.%B.bd8 // CHECK:STDOUT: %B.elem => constants.%B.elem.1e0 @@ -512,20 +521,25 @@ fn G() { // CHECK:STDOUT: %A.type: type = cpp_type_template_type A [concrete] // CHECK:STDOUT: %A.template: %A.type = struct_value () [concrete] // 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: %.4a6fd8.1: type = splice_inst @F.%.loc10_24.5 [template] +// CHECK:STDOUT: %.dcc61d.1: @F.%.loc10_24.8 (@F.%.loc10_24.8) = splice_inst @F.%.loc10_24.7 [template] +// CHECK:STDOUT: %.d48: type = splice_inst @F.%.loc10_24.10 [template] +// CHECK:STDOUT: %require_complete.979: = require_complete_type %.d48 [template] +// CHECK:STDOUT: %pattern_type.d94: type = pattern_type %.d48 [template] +// CHECK:STDOUT: %a.patt.662: %pattern_type.d94 = value_binding_pattern a [template] +// CHECK:STDOUT: %.4a6fd8.2: type = splice_inst @F.%.loc10_35.3 [template] +// CHECK:STDOUT: %.dcc61d.2: @F.%.loc10_35.6 (@F.%.loc10_35.6) = splice_inst @F.%.loc10_35.5 [template] +// CHECK:STDOUT: %.883: @F.%.loc10_36.3 (@F.%.loc10_36.3) = splice_inst @F.%.loc10_36.2 [template] +// CHECK:STDOUT: %.ef0: @F.%.loc10_39.4 (@F.%.loc10_39.4) = splice_inst @F.%.loc10_39.3 [template] +// CHECK:STDOUT: %.4ad: %.d48 = 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] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %F.specific_fn: = specific_function %F, @F(%i32) [concrete] +// CHECK:STDOUT: %inst.specific_inst.9dc364.1: = inst_value [concrete] { +// CHECK:STDOUT: %.ab8b6e.1: type = specific_inst %i32, @F(%i32) [concrete = %i32] +// CHECK:STDOUT: } // CHECK:STDOUT: %A: type = class_type @A [concrete] // CHECK:STDOUT: %inst.splice_block.72dff3.1: = inst_value [concrete] { // CHECK:STDOUT: %.22ed96.1: type = splice_block imports.%A.decl [concrete = %A] {} @@ -537,6 +551,9 @@ fn G() { // CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %pattern_type.b78: type = pattern_type %A [concrete] // CHECK:STDOUT: %a.patt.117: %pattern_type.b78 = value_binding_pattern a [concrete] +// CHECK:STDOUT: %inst.specific_inst.9dc364.2: = inst_value [concrete] { +// CHECK:STDOUT: %.ab8b6e.2: type = specific_inst %i32, @F(%i32) [concrete = %i32] +// CHECK:STDOUT: } // CHECK:STDOUT: %inst.splice_block.72dff3.2: = inst_value [concrete] { // CHECK:STDOUT: %.22ed96.2: type = splice_block imports.%A.decl [concrete = %A] {} // CHECK:STDOUT: } @@ -598,25 +615,29 @@ fn G() { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // 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.%.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.%.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.%.8af9c5.2)] -// CHECK:STDOUT: %.loc10_36.2: = access_member_action %.loc10_35.1, A [template] +// CHECK:STDOUT: %.loc10_24.5: = refine_inst_action %.loc10_23.1 [template] +// CHECK:STDOUT: %.loc10_24.6: type = splice_inst %.loc10_24.5 [template = %.loc10_24.6 (constants.%.4a6fd8.1)] +// CHECK:STDOUT: %.loc10_24.7: = call_action (%A.ref.loc10_20, %.loc10_24.2), false [template] +// CHECK:STDOUT: %.loc10_24.8: type = type_of_inst %.loc10_24.7 [template] +// CHECK:STDOUT: %.loc10_24.9: @F.%.loc10_24.8 (@F.%.loc10_24.8) = splice_inst %.loc10_24.7 [template = %.loc10_24.9 (constants.%.dcc61d.1)] +// CHECK:STDOUT: %.loc10_24.10: = convert_to_value_action %.loc10_24.3, type [template] +// CHECK:STDOUT: %.loc10_24.11: type = splice_inst %.loc10_24.10 [template = %.loc10_24.11 (constants.%.d48)] +// CHECK:STDOUT: %require_complete: = require_complete_type %.loc10_24.11 [template = %require_complete (constants.%require_complete.979)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %.loc10_24.11 [template = %pattern_type (constants.%pattern_type.d94)] +// CHECK:STDOUT: %a.patt.loc10_15.2: @F.%pattern_type (%pattern_type.d94) = value_binding_pattern a [template = %a.patt.loc10_15.2 (constants.%a.patt.662)] +// CHECK:STDOUT: %.loc10_35.3: = refine_inst_action %.loc10_34 [template] +// CHECK:STDOUT: %.loc10_35.4: type = splice_inst %.loc10_35.3 [template = %.loc10_35.4 (constants.%.4a6fd8.2)] +// CHECK:STDOUT: %.loc10_35.5: = call_action (%A.ref.loc10_31, %.loc10_35.1), false [template] +// CHECK:STDOUT: %.loc10_35.6: type = type_of_inst %.loc10_35.5 [template] +// CHECK:STDOUT: %.loc10_35.7: @F.%.loc10_35.6 (@F.%.loc10_35.6) = splice_inst %.loc10_35.5 [template = %.loc10_35.7 (constants.%.dcc61d.2)] +// CHECK:STDOUT: %.loc10_36.2: = access_member_action %.loc10_35.2, 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.%.c84)] +// CHECK:STDOUT: %.loc10_36.4: @F.%.loc10_36.3 (@F.%.loc10_36.3) = splice_inst %.loc10_36.2 [template = %.loc10_36.4 (constants.%.883)] // 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.%.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 (%.897) = splice_inst %.loc10_39.6 [template = %.loc10_39.7 (constants.%.bdb)] +// CHECK:STDOUT: %.loc10_39.5: @F.%.loc10_39.4 (@F.%.loc10_39.4) = splice_inst %.loc10_39.3 [template = %.loc10_39.5 (constants.%.ef0)] +// CHECK:STDOUT: %.loc10_39.6: = convert_to_value_action %.loc10_39.1, %.loc10_24.11 [template] +// CHECK:STDOUT: %.loc10_39.7: @F.%.loc10_24.11 (%.d48) = splice_inst %.loc10_39.6 [template = %.loc10_39.7 (constants.%.4ad)] // CHECK:STDOUT: // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: @@ -624,21 +645,23 @@ fn G() { // 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_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: %.loc10_35.1: type = splice_inst %.loc10_35.3 [template = %.loc10_35.4 (constants.%.4a6fd8.2)] +// CHECK:STDOUT: %.loc10_35.2: @F.%.loc10_35.6 (@F.%.loc10_35.6) = splice_inst %.loc10_35.5 [template = %.loc10_35.7 (constants.%.dcc61d.2)] +// CHECK:STDOUT: %.loc10_36.1: @F.%.loc10_36.3 (@F.%.loc10_36.3) = splice_inst %.loc10_36.2 [template = %.loc10_36.4 (constants.%.883)] +// CHECK:STDOUT: %.loc10_39.1: @F.%.loc10_39.4 (@F.%.loc10_39.4) = splice_inst %.loc10_39.3 [template = %.loc10_39.5 (constants.%.ef0)] +// CHECK:STDOUT: %.loc10_39.2: @F.%.loc10_24.11 (%.d48) = splice_inst %.loc10_39.6 [template = %.loc10_39.7 (constants.%.4ad)] +// CHECK:STDOUT: %.loc10_24.1: type = splice_block %.loc10_24.4 [template = %.loc10_24.11 (constants.%.d48)] { // 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_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: %.loc10_24.2: type = splice_inst %.loc10_24.5 [template = %.loc10_24.6 (constants.%.4a6fd8.1)] +// CHECK:STDOUT: %.loc10_24.3: @F.%.loc10_24.8 (@F.%.loc10_24.8) = splice_inst %.loc10_24.7 [template = %.loc10_24.9 (constants.%.dcc61d.1)] +// CHECK:STDOUT: %.loc10_24.4: type = splice_inst %.loc10_24.10 [template = %.loc10_24.11 (constants.%.d48)] // CHECK:STDOUT: } -// CHECK:STDOUT: %a: @F.%.loc10_24.8 (%.897) = wrapper_binding a, %.loc10_39.2 +// CHECK:STDOUT: %a: @F.%.loc10_24.11 (%.d48) = wrapper_binding a, %.loc10_39.2 // CHECK:STDOUT: name_binding_decl { -// 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: %a.patt.loc10_15.1: @F.%pattern_type (%pattern_type.d94) = value_binding_pattern a [template = %a.patt.loc10_15.2 (constants.%a.patt.662)] // CHECK:STDOUT: } // CHECK:STDOUT: return // CHECK:STDOUT: } @@ -664,17 +687,21 @@ fn G() { // 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 -// CHECK:STDOUT: %.loc10_24.7 => constants.%inst.splice_block.c26 -// CHECK:STDOUT: %.loc10_24.8 => constants.%A +// CHECK:STDOUT: %.loc10_24.5 => constants.%inst.specific_inst.9dc364.1 +// CHECK:STDOUT: %.loc10_24.6 => constants.%i32 +// CHECK:STDOUT: %.loc10_24.7 => constants.%inst.splice_block.72dff3.1 +// CHECK:STDOUT: %.loc10_24.8 => type +// CHECK:STDOUT: %.loc10_24.9 => constants.%A +// CHECK:STDOUT: %.loc10_24.10 => constants.%inst.splice_block.c26 +// CHECK:STDOUT: %.loc10_24.11 => constants.%A // CHECK:STDOUT: %require_complete => constants.%complete_type.357 // CHECK:STDOUT: %pattern_type => constants.%pattern_type.b78 // CHECK:STDOUT: %a.patt.loc10_15.2 => constants.%a.patt.117 -// CHECK:STDOUT: %.loc10_35.2 => constants.%inst.splice_block.72dff3.2 -// CHECK:STDOUT: %.loc10_35.3 => type -// CHECK:STDOUT: %.loc10_35.4 => constants.%A +// CHECK:STDOUT: %.loc10_35.3 => constants.%inst.specific_inst.9dc364.2 +// CHECK:STDOUT: %.loc10_35.4 => constants.%i32 +// CHECK:STDOUT: %.loc10_35.5 => constants.%inst.splice_block.72dff3.2 +// CHECK:STDOUT: %.loc10_35.6 => type +// CHECK:STDOUT: %.loc10_35.7 => constants.%A // CHECK:STDOUT: %.loc10_36.2 => constants.%inst.name_ref // CHECK:STDOUT: %.loc10_36.3 => constants.%A.A.cpp_overload_set.type // CHECK:STDOUT: %.loc10_36.4 => constants.%A.A.cpp_overload_set.value @@ -699,34 +726,39 @@ fn G() { // CHECK:STDOUT: %A.type: type = cpp_type_template_type A [concrete] // CHECK:STDOUT: %A.template: %A.type = struct_value () [concrete] // 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: %.4a6fd8.1: type = splice_inst @F.%.loc10_24.5 [template] +// CHECK:STDOUT: %.dcc61d.1: @F.%.loc10_24.8 (@F.%.loc10_24.8) = splice_inst @F.%.loc10_24.7 [template] +// CHECK:STDOUT: %.d48: type = splice_inst @F.%.loc10_24.10 [template] +// CHECK:STDOUT: %require_complete.979: = require_complete_type %.d48 [template] +// CHECK:STDOUT: %pattern_type.d94: type = pattern_type %.d48 [template] +// CHECK:STDOUT: %a.patt.59d: %pattern_type.d94 = ref_binding_pattern a [template] +// CHECK:STDOUT: %a.var_patt.717: %pattern_type.d94 = var_pattern %a.patt.59d [template] +// CHECK:STDOUT: %.4a6fd8.2: type = splice_inst @F.%.loc10_35.3 [template] +// CHECK:STDOUT: %.dcc61d.2: @F.%.loc10_35.6 (@F.%.loc10_35.6) = splice_inst @F.%.loc10_35.5 [template] +// CHECK:STDOUT: %.883: @F.%.loc10_36.3 (@F.%.loc10_36.3) = splice_inst @F.%.loc10_36.2 [template] +// CHECK:STDOUT: %.ef0: @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: %.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: %.cd85d6.1: @F.%.loc10_3.12 (@F.%.loc10_3.12) = splice_inst @F.%.loc10_3.11 [template] +// CHECK:STDOUT: %.a7b35a.1: @F.%.loc10_3.15 (@F.%.loc10_3.15) = splice_inst @F.%.loc10_3.14 [template] +// CHECK:STDOUT: %.b64: @F.%.loc10_3.18 (@F.%.loc10_3.18) = splice_inst @F.%.loc10_3.17 [template] +// CHECK:STDOUT: %.de5: @F.%.loc10_3.21 (@F.%.loc10_3.21) = splice_inst @F.%.loc10_3.20 [template] +// CHECK:STDOUT: %.7c8: %.d48 = splice_inst @F.%.loc10_3.23 [template] +// CHECK:STDOUT: %.8f8: %.d48 = 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: %.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: %.821: %.d48 = splice_inst @F.%.loc10_3.27 [template] +// CHECK:STDOUT: %.9a3a: @F.%.loc10_3.30 (@F.%.loc10_3.30) = splice_inst @F.%.loc10_3.29 [template] +// CHECK:STDOUT: %.595: @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: %inst.specific_inst.9dc364.1: = inst_value [concrete] { +// CHECK:STDOUT: %.ab8b6e.1: type = specific_inst %i32, @F(%i32) [concrete = %i32] +// CHECK:STDOUT: } // CHECK:STDOUT: %A: type = class_type @A [concrete] // CHECK:STDOUT: %inst.splice_block.72dff3.1: = inst_value [concrete] { // CHECK:STDOUT: %.22ed96.1: type = splice_block imports.%A.decl [concrete = %A] {} @@ -739,6 +771,9 @@ fn G() { // CHECK:STDOUT: %pattern_type.b78: type = pattern_type %A [concrete] // CHECK:STDOUT: %a.patt.198: %pattern_type.b78 = ref_binding_pattern a [concrete] // CHECK:STDOUT: %a.var_patt.47b: %pattern_type.b78 = var_pattern %a.patt.198 [concrete] +// CHECK:STDOUT: %inst.specific_inst.9dc364.2: = inst_value [concrete] { +// CHECK:STDOUT: %.ab8b6e.2: type = specific_inst %i32, @F(%i32) [concrete = %i32] +// CHECK:STDOUT: } // CHECK:STDOUT: %inst.splice_block.72dff3.2: = inst_value [concrete] { // CHECK:STDOUT: %.22ed96.2: type = splice_block imports.%A.decl [concrete = %A] {} // CHECK:STDOUT: } @@ -758,26 +793,24 @@ fn G() { // CHECK:STDOUT: %.38d: init %A to %.3a8 = mark_in_place_init %A__carbon_thunk.call // CHECK:STDOUT: } // CHECK:STDOUT: } -// 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: %.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: %.514: = call_action (%ImplicitAs.generic, %.d48), false [template] +// CHECK:STDOUT: %.bf5: type = type_of_inst %.514 [template] +// CHECK:STDOUT: %.cd85d6.2: %.bf5 = splice_inst %.514 [template] +// CHECK:STDOUT: %.a4e: = access_member_action %.cd85d6.2, Convert [template] +// CHECK:STDOUT: %.087: type = type_of_inst %.a4e [template] +// CHECK:STDOUT: %.a7b35a.2: %.087 = splice_inst %.a4e [template] +// CHECK:STDOUT: %.0c2: = compound_member_access_action %.78f, %.a7b35a.2 [template] +// CHECK:STDOUT: %.4bb: type = type_of_inst %.0c2 [template] +// CHECK:STDOUT: %.9a31: %.4bb = splice_inst %.0c2 [template] +// CHECK:STDOUT: %.97a: = call_action (%.9a31), true [template] +// CHECK:STDOUT: %.f1e: type = type_of_inst %.97a [template] +// CHECK:STDOUT: %.b1f: %.f1e = splice_inst %.97a [template] +// CHECK:STDOUT: %.215: = refine_inst_action %.b1f [template] +// CHECK:STDOUT: %.6cb: %A = splice_inst %.215 [template] +// CHECK:STDOUT: %.297: = convert_to_category_action %.6cb, element10 [template] +// CHECK:STDOUT: %.3d9: %A = splice_inst %.297 [template] +// CHECK:STDOUT: %inst.specific_inst.cb7: = inst_value [concrete] { +// CHECK:STDOUT: %.e5e: ref %A = specific_inst @F.%a.var, @F(%i32) // 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] @@ -785,14 +818,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.b0b: = inst_value [concrete] { -// CHECK:STDOUT: %.4fc: = splice_block %bound_method { +// CHECK:STDOUT: %inst.splice_block.863: = inst_value [concrete] { +// CHECK:STDOUT: %.fef: = 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 %.568, %impl.elem0 +// CHECK:STDOUT: %bound_method: = bound_method %.e5e, %impl.elem0 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: %inst.call: = inst_value [concrete] { -// CHECK:STDOUT: %A.cpp_destructor.call: init %empty_tuple.type = call %.4fc(%.568) +// CHECK:STDOUT: %A.cpp_destructor.call: init %empty_tuple.type = call %.fef(%.e5e) // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -830,83 +863,89 @@ fn G() { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // 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.%.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.%.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.%.8af9c5.2)] -// CHECK:STDOUT: %.loc10_36.2: = access_member_action %.loc10_35.1, A [template] +// CHECK:STDOUT: %.loc10_24.5: = refine_inst_action %.loc10_23.1 [template] +// CHECK:STDOUT: %.loc10_24.6: type = splice_inst %.loc10_24.5 [template = %.loc10_24.6 (constants.%.4a6fd8.1)] +// CHECK:STDOUT: %.loc10_24.7: = call_action (%A.ref.loc10_20, %.loc10_24.2), false [template] +// CHECK:STDOUT: %.loc10_24.8: type = type_of_inst %.loc10_24.7 [template] +// CHECK:STDOUT: %.loc10_24.9: @F.%.loc10_24.8 (@F.%.loc10_24.8) = splice_inst %.loc10_24.7 [template = %.loc10_24.9 (constants.%.dcc61d.1)] +// CHECK:STDOUT: %.loc10_24.10: = convert_to_value_action %.loc10_24.3, type [template] +// CHECK:STDOUT: %.loc10_24.11: type = splice_inst %.loc10_24.10 [template = %.loc10_24.11 (constants.%.d48)] +// CHECK:STDOUT: %require_complete: = require_complete_type %.loc10_24.11 [template = %require_complete (constants.%require_complete.979)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %.loc10_24.11 [template = %pattern_type (constants.%pattern_type.d94)] +// CHECK:STDOUT: %a.patt.loc10_15.2: @F.%pattern_type (%pattern_type.d94) = ref_binding_pattern a [template = %a.patt.loc10_15.2 (constants.%a.patt.59d)] +// CHECK:STDOUT: %a.var_patt.loc10_3.2: @F.%pattern_type (%pattern_type.d94) = var_pattern %a.patt.loc10_15.2 [template = %a.var_patt.loc10_3.2 (constants.%a.var_patt.717)] +// CHECK:STDOUT: %.loc10_35.3: = refine_inst_action %.loc10_34 [template] +// CHECK:STDOUT: %.loc10_35.4: type = splice_inst %.loc10_35.3 [template = %.loc10_35.4 (constants.%.4a6fd8.2)] +// CHECK:STDOUT: %.loc10_35.5: = call_action (%A.ref.loc10_31, %.loc10_35.1), false [template] +// CHECK:STDOUT: %.loc10_35.6: type = type_of_inst %.loc10_35.5 [template] +// CHECK:STDOUT: %.loc10_35.7: @F.%.loc10_35.6 (@F.%.loc10_35.6) = splice_inst %.loc10_35.5 [template = %.loc10_35.7 (constants.%.dcc61d.2)] +// CHECK:STDOUT: %.loc10_36.2: = access_member_action %.loc10_35.2, 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.%.c84)] +// CHECK:STDOUT: %.loc10_36.4: @F.%.loc10_36.3 (@F.%.loc10_36.3) = splice_inst %.loc10_36.2 [template = %.loc10_36.4 (constants.%.883)] // 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.%.47d)] -// CHECK:STDOUT: %.loc10_3.11: = call_action (constants.%ImplicitAs.generic, constants.%.897), 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.%.ef0)] +// CHECK:STDOUT: %.loc10_3.11: = call_action (constants.%ImplicitAs.generic, constants.%.d48), 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.%.20c9c2.1)] +// CHECK:STDOUT: %.loc10_3.13: @F.%.loc10_3.12 (@F.%.loc10_3.12) = splice_inst %.loc10_3.11 [template = %.loc10_3.13 (constants.%.cd85d6.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.%.c16b39.1)] +// CHECK:STDOUT: %.loc10_3.16: @F.%.loc10_3.15 (@F.%.loc10_3.15) = splice_inst %.loc10_3.14 [template = %.loc10_3.16 (constants.%.a7b35a.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.%.5f8)] +// CHECK:STDOUT: %.loc10_3.19: @F.%.loc10_3.18 (@F.%.loc10_3.18) = splice_inst %.loc10_3.17 [template = %.loc10_3.19 (constants.%.b64)] // 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.%.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 (%.897) = splice_inst %.loc10_3.23 [template = %.loc10_3.24 (constants.%.0cf)] +// CHECK:STDOUT: %.loc10_3.22: @F.%.loc10_3.21 (@F.%.loc10_3.21) = splice_inst %.loc10_3.20 [template = %.loc10_3.22 (constants.%.de5)] +// CHECK:STDOUT: %.loc10_3.23: = refine_inst_action %.loc10_3.5 [template] +// CHECK:STDOUT: %.loc10_3.24: @F.%.loc10_24.11 (%.d48) = splice_inst %.loc10_3.23 [template = %.loc10_3.24 (constants.%.7c8)] // CHECK:STDOUT: %.loc10_3.25: = convert_to_category_action %.loc10_3.6, element10 [template] -// 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 (%.897) = splice_inst %.loc10_3.27 [template = %.loc10_3.28 (constants.%.de4)] +// CHECK:STDOUT: %.loc10_3.26: @F.%.loc10_24.11 (%.d48) = splice_inst %.loc10_3.25 [template = %.loc10_3.26 (constants.%.8f8)] +// CHECK:STDOUT: %.loc10_3.27: = refine_inst_action %a.var [template] +// CHECK:STDOUT: %.loc10_3.28: @F.%.loc10_24.11 (%.d48) = splice_inst %.loc10_3.27 [template = %.loc10_3.28 (constants.%.821)] // 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.%.040)] +// CHECK:STDOUT: %.loc10_3.31: @F.%.loc10_3.30 (@F.%.loc10_3.30) = splice_inst %.loc10_3.29 [template = %.loc10_3.31 (constants.%.9a3a)] // 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.%.b87)] +// CHECK:STDOUT: %.loc10_3.34: @F.%.loc10_3.33 (@F.%.loc10_3.33) = splice_inst %.loc10_3.32 [template = %.loc10_3.34 (constants.%.595)] // CHECK:STDOUT: // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.var: ref @F.%.loc10_24.8 (%.897) = var_storage %a.var_patt.loc10_3.1 +// CHECK:STDOUT: %a.var: ref @F.%.loc10_24.11 (%.d48) = 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_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: %.loc10_35.1: type = splice_inst %.loc10_35.3 [template = %.loc10_35.4 (constants.%.4a6fd8.2)] +// CHECK:STDOUT: %.loc10_35.2: @F.%.loc10_35.6 (@F.%.loc10_35.6) = splice_inst %.loc10_35.5 [template = %.loc10_35.7 (constants.%.dcc61d.2)] +// CHECK:STDOUT: %.loc10_36.1: @F.%.loc10_36.3 (@F.%.loc10_36.3) = splice_inst %.loc10_36.2 [template = %.loc10_36.4 (constants.%.883)] +// CHECK:STDOUT: %.loc10_39.1: @F.%.loc10_39.3 (@F.%.loc10_39.3) = splice_inst %.loc10_39.2 [template = %.loc10_39.4 (constants.%.ef0)] +// CHECK:STDOUT: %.loc10_3.1: @F.%.loc10_3.12 (@F.%.loc10_3.12) = splice_inst %.loc10_3.11 [template = %.loc10_3.13 (constants.%.cd85d6.1)] +// CHECK:STDOUT: %.loc10_3.2: @F.%.loc10_3.15 (@F.%.loc10_3.15) = splice_inst %.loc10_3.14 [template = %.loc10_3.16 (constants.%.a7b35a.1)] +// CHECK:STDOUT: %.loc10_3.3: @F.%.loc10_3.18 (@F.%.loc10_3.18) = splice_inst %.loc10_3.17 [template = %.loc10_3.19 (constants.%.b64)] +// CHECK:STDOUT: %.loc10_3.4: @F.%.loc10_3.21 (@F.%.loc10_3.21) = splice_inst %.loc10_3.20 [template = %.loc10_3.22 (constants.%.de5)] +// CHECK:STDOUT: %.loc10_3.5: @F.%.loc10_24.11 (%.d48) = converted %.loc10_39.1, %.loc10_3.4 [template = %.loc10_3.22 (constants.%.de5)] +// CHECK:STDOUT: %.loc10_3.6: @F.%.loc10_24.11 (%.d48) = splice_inst %.loc10_3.23 [template = %.loc10_3.24 (constants.%.7c8)] +// CHECK:STDOUT: %.loc10_3.7: @F.%.loc10_24.11 (%.d48) = splice_inst %.loc10_3.25 [template = %.loc10_3.26 (constants.%.8f8)] // CHECK:STDOUT: assign %a.var, %.loc10_3.7 -// CHECK:STDOUT: %.loc10_24.1: type = splice_block %.loc10_24.3 [template = %.loc10_24.8 (constants.%.897)] { +// CHECK:STDOUT: %.loc10_24.1: type = splice_block %.loc10_24.4 [template = %.loc10_24.11 (constants.%.d48)] { // 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_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: %.loc10_24.2: type = splice_inst %.loc10_24.5 [template = %.loc10_24.6 (constants.%.4a6fd8.1)] +// CHECK:STDOUT: %.loc10_24.3: @F.%.loc10_24.8 (@F.%.loc10_24.8) = splice_inst %.loc10_24.7 [template = %.loc10_24.9 (constants.%.dcc61d.1)] +// CHECK:STDOUT: %.loc10_24.4: type = splice_inst %.loc10_24.10 [template = %.loc10_24.11 (constants.%.d48)] // CHECK:STDOUT: } -// CHECK:STDOUT: %a: ref @F.%.loc10_24.8 (%.897) = wrapper_binding a, %a.var +// CHECK:STDOUT: %a: ref @F.%.loc10_24.11 (%.d48) = wrapper_binding a, %a.var // CHECK:STDOUT: name_binding_decl { -// 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: %a.patt.loc10_15.1: @F.%pattern_type (%pattern_type.d94) = ref_binding_pattern a [template = %a.patt.loc10_15.2 (constants.%a.patt.59d)] +// CHECK:STDOUT: %a.var_patt.loc10_3.1: @F.%pattern_type (%pattern_type.d94) = var_pattern %a.patt.loc10_15.1 [template = %a.var_patt.loc10_3.2 (constants.%a.var_patt.717)] // CHECK:STDOUT: } -// 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: %.loc10_3.8: @F.%.loc10_24.11 (%.d48) = splice_inst %.loc10_3.27 [template = %.loc10_3.28 (constants.%.821)] +// CHECK:STDOUT: %.loc10_3.9: @F.%.loc10_3.30 (@F.%.loc10_3.30) = splice_inst %.loc10_3.29 [template = %.loc10_3.31 (constants.%.9a3a)] +// CHECK:STDOUT: %.loc10_3.10: @F.%.loc10_3.33 (@F.%.loc10_3.33) = splice_inst %.loc10_3.32 [template = %.loc10_3.34 (constants.%.595)] // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -922,43 +961,47 @@ fn G() { // 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 -// CHECK:STDOUT: %.loc10_24.7 => constants.%inst.splice_block.c26 -// CHECK:STDOUT: %.loc10_24.8 => constants.%A +// CHECK:STDOUT: %.loc10_24.5 => constants.%inst.specific_inst.9dc364.1 +// CHECK:STDOUT: %.loc10_24.6 => constants.%i32 +// CHECK:STDOUT: %.loc10_24.7 => constants.%inst.splice_block.72dff3.1 +// CHECK:STDOUT: %.loc10_24.8 => type +// CHECK:STDOUT: %.loc10_24.9 => constants.%A +// CHECK:STDOUT: %.loc10_24.10 => constants.%inst.splice_block.c26 +// CHECK:STDOUT: %.loc10_24.11 => constants.%A // CHECK:STDOUT: %require_complete => constants.%complete_type.357 // CHECK:STDOUT: %pattern_type => constants.%pattern_type.b78 // CHECK:STDOUT: %a.patt.loc10_15.2 => constants.%a.patt.198 // CHECK:STDOUT: %a.var_patt.loc10_3.2 => constants.%a.var_patt.47b -// CHECK:STDOUT: %.loc10_35.2 => constants.%inst.splice_block.72dff3.2 -// CHECK:STDOUT: %.loc10_35.3 => type -// CHECK:STDOUT: %.loc10_35.4 => constants.%A +// CHECK:STDOUT: %.loc10_35.3 => constants.%inst.specific_inst.9dc364.2 +// CHECK:STDOUT: %.loc10_35.4 => constants.%i32 +// CHECK:STDOUT: %.loc10_35.5 => constants.%inst.splice_block.72dff3.2 +// CHECK:STDOUT: %.loc10_35.6 => type +// CHECK:STDOUT: %.loc10_35.7 => constants.%A // CHECK:STDOUT: %.loc10_36.2 => constants.%inst.name_ref // CHECK:STDOUT: %.loc10_36.3 => constants.%A.A.cpp_overload_set.type // CHECK:STDOUT: %.loc10_36.4 => constants.%A.A.cpp_overload_set.value // 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.%.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.11 => constants.%.514 +// CHECK:STDOUT: %.loc10_3.12 => constants.%.bf5 +// CHECK:STDOUT: %.loc10_3.13 => constants.%.cd85d6.2 +// CHECK:STDOUT: %.loc10_3.14 => constants.%.a4e +// CHECK:STDOUT: %.loc10_3.15 => constants.%.087 +// CHECK:STDOUT: %.loc10_3.16 => constants.%.a7b35a.2 +// CHECK:STDOUT: %.loc10_3.17 => constants.%.0c2 +// CHECK:STDOUT: %.loc10_3.18 => constants.%.4bb +// CHECK:STDOUT: %.loc10_3.19 => constants.%.9a31 +// CHECK:STDOUT: %.loc10_3.20 => constants.%.97a +// CHECK:STDOUT: %.loc10_3.21 => constants.%.f1e +// CHECK:STDOUT: %.loc10_3.22 => constants.%.b1f +// CHECK:STDOUT: %.loc10_3.23 => constants.%.215 +// CHECK:STDOUT: %.loc10_3.24 => constants.%.6cb +// CHECK:STDOUT: %.loc10_3.25 => constants.%.297 +// CHECK:STDOUT: %.loc10_3.26 => constants.%.3d9 +// CHECK:STDOUT: %.loc10_3.27 => constants.%inst.specific_inst.cb7 // CHECK:STDOUT: %.loc10_3.28 => invalid -// CHECK:STDOUT: %.loc10_3.29 => constants.%inst.splice_block.b0b +// CHECK:STDOUT: %.loc10_3.29 => constants.%inst.splice_block.863 // 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 3b51d61475fa..175fc86c9083 100644 --- a/toolchain/check/testdata/interop/cpp/template/generic_call.carbon +++ b/toolchain/check/testdata/interop/cpp/template/generic_call.carbon @@ -51,12 +51,13 @@ fn G() { // CHECK:STDOUT: %S.type: type = cpp_type_template_type S [concrete] // CHECK:STDOUT: %S.template: %S.type = struct_value () [concrete] // 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: %.4a6: type = splice_inst @F.%.loc8_24.5 [template] +// CHECK:STDOUT: %.2a3: @F.%.loc8_24.8 (@F.%.loc8_24.8) = splice_inst @F.%.loc8_24.7 [template] +// CHECK:STDOUT: %.8bd: type = splice_inst @F.%.loc8_24.10 [template] +// CHECK:STDOUT: %require_complete.cfd: = require_complete_type %.8bd [template] +// CHECK:STDOUT: %pattern_type.0fb: type = pattern_type %.8bd [template] +// CHECK:STDOUT: %v.patt.5bf: %pattern_type.0fb = ref_binding_pattern v [template] +// CHECK:STDOUT: %v.var_patt.2d3: %pattern_type.0fb = var_pattern %v.patt.5bf [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] @@ -65,34 +66,38 @@ 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 %.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: %DefaultOrUnformed.lookup_impl_witness: = lookup_impl_witness %.8bd, @DefaultOrUnformed [template] +// CHECK:STDOUT: %.892: require_specific_def_type = require_specific_def @T.as.DefaultOrUnformed.impl(%.8bd) [template] +// CHECK:STDOUT: %DefaultOrUnformed.facet.77c: %DefaultOrUnformed.type = facet_value %.8bd, (%DefaultOrUnformed.lookup_impl_witness) [template] +// CHECK:STDOUT: %.92d: %DefaultOrUnformed.type = splice_inst @F.%.loc8_25.6 [template] +// CHECK:STDOUT: %.f6b: @F.%.loc8_25.9 (@F.%.loc8_25.9) = splice_inst @F.%.loc8_25.8 [template] +// CHECK:STDOUT: %.82c5: @F.%.loc8_25.12 (@F.%.loc8_25.12) = splice_inst @F.%.loc8_25.11 [template] // CHECK:STDOUT: %ImplicitAs.type.0ff: type = generic_interface_type @ImplicitAs [concrete] // CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.0ff = struct_value () [concrete] -// 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: %.42a05f.1: @F.%.loc8_3.12 (@F.%.loc8_3.12) = splice_inst @F.%.loc8_3.11 [template] +// CHECK:STDOUT: %.f8b3eb.1: @F.%.loc8_3.15 (@F.%.loc8_3.15) = splice_inst @F.%.loc8_3.14 [template] +// CHECK:STDOUT: %.ebe: @F.%.loc8_3.18 (@F.%.loc8_3.18) = splice_inst @F.%.loc8_3.17 [template] +// CHECK:STDOUT: %.9de: @F.%.loc8_3.21 (@F.%.loc8_3.21) = splice_inst @F.%.loc8_3.20 [template] +// CHECK:STDOUT: %.aee: %.8bd = splice_inst @F.%.loc8_3.23 [template] +// CHECK:STDOUT: %.d37: %.8bd = 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: %.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: %.200: %.8bd = splice_inst @F.%.loc8_3.27 [template] +// CHECK:STDOUT: %.cdc: @F.%.loc8_3.30 (@F.%.loc8_3.30) = splice_inst @F.%.loc8_3.29 [template] +// CHECK:STDOUT: %.993: @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] // CHECK:STDOUT: %pattern_type.fa7: type = pattern_type %X [concrete] // CHECK:STDOUT: %x.param_patt.468: %pattern_type.fa7 = value_param_pattern [concrete] // CHECK:STDOUT: %x.patt.af8: %pattern_type.fa7 = wrapper_binding_pattern x, %x.param_patt.468 [concrete] +// CHECK:STDOUT: %inst.specific_inst.94c: = inst_value [concrete] { +// CHECK:STDOUT: %.fe6: type = specific_inst %X, @F(%X) [concrete = %X] +// CHECK:STDOUT: } // CHECK:STDOUT: %S: type = class_type @S [concrete] // CHECK:STDOUT: %inst.splice_block.5af: = inst_value [concrete] { // CHECK:STDOUT: %.788: type = splice_block imports.%S.decl [concrete = %S] {} @@ -112,6 +117,9 @@ fn G() { // CHECK:STDOUT: %T.as_type.as.DefaultOrUnformed.impl.Op.type.c7b: type = fn_type @T.as_type.as.DefaultOrUnformed.impl.Op, @T.as_type.as.DefaultOrUnformed.impl(%Default.facet.602) [concrete] // CHECK:STDOUT: %T.as_type.as.DefaultOrUnformed.impl.Op.83d: %T.as_type.as.DefaultOrUnformed.impl.Op.type.c7b = struct_value () [concrete] // CHECK:STDOUT: %DefaultOrUnformed.facet.ba3: %DefaultOrUnformed.type = facet_value %S, (%DefaultOrUnformed.impl_witness.1ff) [concrete] +// CHECK:STDOUT: %inst.specific_inst.15d: = inst_value [concrete] { +// CHECK:STDOUT: %.3a2: %DefaultOrUnformed.type = specific_inst %DefaultOrUnformed.facet.ba3, @F(%X) [concrete = %DefaultOrUnformed.facet.ba3] +// CHECK:STDOUT: } // CHECK:STDOUT: %DefaultOrUnformed.WithSelf.Op.type.483: type = fn_type @DefaultOrUnformed.WithSelf.Op, @DefaultOrUnformed.WithSelf(%DefaultOrUnformed.facet.ba3) [concrete] // CHECK:STDOUT: %DefaultOrUnformed.assoc_type: type = assoc_entity_type @DefaultOrUnformed [concrete] // CHECK:STDOUT: %assoc0.b81: %DefaultOrUnformed.assoc_type = assoc_entity element0, imports.%Core.import_ref.d14 [concrete] @@ -131,26 +139,24 @@ 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: %.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: %.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: %.d80: = call_action (%ImplicitAs.generic, %.8bd), false [template] +// CHECK:STDOUT: %.fb0: type = type_of_inst %.d80 [template] +// CHECK:STDOUT: %.42a05f.2: %.fb0 = splice_inst %.d80 [template] +// CHECK:STDOUT: %.126: = access_member_action %.42a05f.2, Convert [template] +// CHECK:STDOUT: %.dcf: type = type_of_inst %.126 [template] +// CHECK:STDOUT: %.f8b3eb.2: %.dcf = splice_inst %.126 [template] +// CHECK:STDOUT: %.609: = compound_member_access_action %.cc7, %.f8b3eb.2 [template] +// CHECK:STDOUT: %.b7f: type = type_of_inst %.609 [template] +// CHECK:STDOUT: %.c5b: %.b7f = splice_inst %.609 [template] +// CHECK:STDOUT: %.ee1: = call_action (%.c5b), true [template] +// CHECK:STDOUT: %.fb6: type = type_of_inst %.ee1 [template] +// CHECK:STDOUT: %.904: %.fb6 = splice_inst %.ee1 [template] +// CHECK:STDOUT: %.3aa: = refine_inst_action %.904 [template] +// CHECK:STDOUT: %.443: %S = splice_inst %.3aa [template] +// CHECK:STDOUT: %.00d: = convert_to_category_action %.443, element10 [template] +// CHECK:STDOUT: %.9c0: %S = splice_inst %.00d [template] +// CHECK:STDOUT: %inst.specific_inst.54a: = inst_value [concrete] { +// CHECK:STDOUT: %.b44: ref %S = specific_inst @F.%v.var, @F(%X) // 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] @@ -160,18 +166,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.478: = inst_value [concrete] { -// CHECK:STDOUT: %.90d: = splice_block %bound_method { +// CHECK:STDOUT: %inst.splice_block.57b: = inst_value [concrete] { +// CHECK:STDOUT: %.39a: = 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 %.419, %impl.elem0.c3e +// CHECK:STDOUT: %bound_method: = bound_method %.b44, %impl.elem0.c3e // CHECK:STDOUT: } // CHECK:STDOUT: } -// CHECK:STDOUT: %inst.splice_block.37a: = inst_value [concrete] { -// CHECK:STDOUT: %.084: init %empty_tuple.type = splice_block %S.cpp_destructor.call { +// CHECK:STDOUT: %inst.splice_block.8eb: = inst_value [concrete] { +// CHECK:STDOUT: %.a23: 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 %.419, %Op.ref.6a0 -// CHECK:STDOUT: %S.cpp_destructor.call: init %empty_tuple.type = call %S.cpp_destructor.bound(%.419) +// CHECK:STDOUT: %S.cpp_destructor.bound: = bound_method %.b44, %Op.ref.6a0 +// CHECK:STDOUT: %S.cpp_destructor.call: init %empty_tuple.type = call %S.cpp_destructor.bound(%.b44) // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -224,80 +230,86 @@ fn G() { // 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_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.%.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.%.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.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.%.b48)] -// CHECK:STDOUT: %.loc8_25.8: = call_action (%.loc8_25.2), false [template] +// CHECK:STDOUT: %.loc8_24.5: = refine_inst_action %.loc8_23.1 [template] +// CHECK:STDOUT: %.loc8_24.6: type = splice_inst %.loc8_24.5 [template = %.loc8_24.6 (constants.%.4a6)] +// CHECK:STDOUT: %.loc8_24.7: = call_action (%S.ref, %.loc8_24.2), false [template] +// CHECK:STDOUT: %.loc8_24.8: type = type_of_inst %.loc8_24.7 [template] +// CHECK:STDOUT: %.loc8_24.9: @F.%.loc8_24.8 (@F.%.loc8_24.8) = splice_inst %.loc8_24.7 [template = %.loc8_24.9 (constants.%.2a3)] +// CHECK:STDOUT: %.loc8_24.10: = convert_to_value_action %.loc8_24.3, type [template] +// CHECK:STDOUT: %.loc8_24.11: type = splice_inst %.loc8_24.10 [template = %.loc8_24.11 (constants.%.8bd)] +// CHECK:STDOUT: %require_complete.loc8: = require_complete_type %.loc8_24.11 [template = %require_complete.loc8 (constants.%require_complete.cfd)] +// CHECK:STDOUT: %pattern_type.loc8: type = pattern_type %.loc8_24.11 [template = %pattern_type.loc8 (constants.%pattern_type.0fb)] +// CHECK:STDOUT: %v.patt.loc8_15.2: @F.%pattern_type.loc8 (%pattern_type.0fb) = ref_binding_pattern v [template = %v.patt.loc8_15.2 (constants.%v.patt.5bf)] +// CHECK:STDOUT: %v.var_patt.loc8_3.2: @F.%pattern_type.loc8 (%pattern_type.0fb) = var_pattern %v.patt.loc8_15.2 [template = %v.var_patt.loc8_3.2 (constants.%v.var_patt.2d3)] +// CHECK:STDOUT: %.loc8_25.5: require_specific_def_type = require_specific_def @T.as.DefaultOrUnformed.impl(%.loc8_24.11) [template = %.loc8_25.5 (constants.%.892)] +// CHECK:STDOUT: %DefaultOrUnformed.lookup_impl_witness: = lookup_impl_witness %.loc8_24.11, @DefaultOrUnformed [template = %DefaultOrUnformed.lookup_impl_witness (constants.%DefaultOrUnformed.lookup_impl_witness)] +// CHECK:STDOUT: %DefaultOrUnformed.facet.loc8_25.2: %DefaultOrUnformed.type = facet_value %.loc8_24.11, (%DefaultOrUnformed.lookup_impl_witness) [template = %DefaultOrUnformed.facet.loc8_25.2 (constants.%DefaultOrUnformed.facet.77c)] +// CHECK:STDOUT: %.loc8_25.6: = refine_inst_action %.loc8_25.1 [template] +// CHECK:STDOUT: %.loc8_25.7: %DefaultOrUnformed.type = splice_inst %.loc8_25.6 [template = %.loc8_25.7 (constants.%.92d)] +// CHECK:STDOUT: %.loc8_25.8: = access_member_action %.loc8_25.2, Op [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.%.9fe)] -// CHECK:STDOUT: %.loc8_3.11: = call_action (constants.%ImplicitAs.generic, constants.%.bc2), 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.%.f6b)] +// CHECK:STDOUT: %.loc8_25.11: = call_action (%.loc8_25.3), false [template] +// CHECK:STDOUT: %.loc8_25.12: type = type_of_inst %.loc8_25.11 [template] +// CHECK:STDOUT: %.loc8_25.13: @F.%.loc8_25.12 (@F.%.loc8_25.12) = splice_inst %.loc8_25.11 [template = %.loc8_25.13 (constants.%.82c5)] +// CHECK:STDOUT: %.loc8_3.11: = call_action (constants.%ImplicitAs.generic, constants.%.8bd), 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.%.735308.1)] +// CHECK:STDOUT: %.loc8_3.13: @F.%.loc8_3.12 (@F.%.loc8_3.12) = splice_inst %.loc8_3.11 [template = %.loc8_3.13 (constants.%.42a05f.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.%.cc0a4d.1)] -// CHECK:STDOUT: %.loc8_3.17: = compound_member_access_action %.loc8_25.3, %.loc8_3.2 [template] +// CHECK:STDOUT: %.loc8_3.16: @F.%.loc8_3.15 (@F.%.loc8_3.15) = splice_inst %.loc8_3.14 [template = %.loc8_3.16 (constants.%.f8b3eb.1)] +// CHECK:STDOUT: %.loc8_3.17: = compound_member_access_action %.loc8_25.4, %.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.%.825)] +// CHECK:STDOUT: %.loc8_3.19: @F.%.loc8_3.18 (@F.%.loc8_3.18) = splice_inst %.loc8_3.17 [template = %.loc8_3.19 (constants.%.ebe)] // 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.%.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 (%.bc2) = splice_inst %.loc8_3.23 [template = %.loc8_3.24 (constants.%.b28)] +// CHECK:STDOUT: %.loc8_3.22: @F.%.loc8_3.21 (@F.%.loc8_3.21) = splice_inst %.loc8_3.20 [template = %.loc8_3.22 (constants.%.9de)] +// CHECK:STDOUT: %.loc8_3.23: = refine_inst_action %.loc8_3.5 [template] +// CHECK:STDOUT: %.loc8_3.24: @F.%.loc8_24.11 (%.8bd) = splice_inst %.loc8_3.23 [template = %.loc8_3.24 (constants.%.aee)] // CHECK:STDOUT: %.loc8_3.25: = convert_to_category_action %.loc8_3.6, element10 [template] -// 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 (%.bc2) = splice_inst %.loc8_3.27 [template = %.loc8_3.28 (constants.%.c8e)] +// CHECK:STDOUT: %.loc8_3.26: @F.%.loc8_24.11 (%.8bd) = splice_inst %.loc8_3.25 [template = %.loc8_3.26 (constants.%.d37)] +// CHECK:STDOUT: %.loc8_3.27: = refine_inst_action %v.var [template] +// CHECK:STDOUT: %.loc8_3.28: @F.%.loc8_24.11 (%.8bd) = splice_inst %.loc8_3.27 [template = %.loc8_3.28 (constants.%.200)] // 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.%.589)] +// CHECK:STDOUT: %.loc8_3.31: @F.%.loc8_3.30 (@F.%.loc8_3.30) = splice_inst %.loc8_3.29 [template = %.loc8_3.31 (constants.%.cdc)] // 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.%.08f)] +// CHECK:STDOUT: %.loc8_3.34: @F.%.loc8_3.33 (@F.%.loc8_3.33) = splice_inst %.loc8_3.32 [template = %.loc8_3.34 (constants.%.993)] // 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 (%.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: %v.var: ref @F.%.loc8_24.11 (%.8bd) = var_storage %v.var_patt.loc8_3.1 +// CHECK:STDOUT: %DefaultOrUnformed.facet.loc8_25.1: %DefaultOrUnformed.type = facet_value constants.%.8bd, (constants.%DefaultOrUnformed.lookup_impl_witness) [template = %DefaultOrUnformed.facet.loc8_25.2 (constants.%DefaultOrUnformed.facet.77c)] +// CHECK:STDOUT: %.loc8_25.1: %DefaultOrUnformed.type = converted constants.%.8bd, %DefaultOrUnformed.facet.loc8_25.1 [template = %DefaultOrUnformed.facet.loc8_25.2 (constants.%DefaultOrUnformed.facet.77c)] +// CHECK:STDOUT: %.loc8_25.2: %DefaultOrUnformed.type = splice_inst %.loc8_25.6 [template = %.loc8_25.7 (constants.%.92d)] +// CHECK:STDOUT: %.loc8_25.3: @F.%.loc8_25.9 (@F.%.loc8_25.9) = splice_inst %.loc8_25.8 [template = %.loc8_25.10 (constants.%.f6b)] +// CHECK:STDOUT: %.loc8_25.4: @F.%.loc8_25.12 (@F.%.loc8_25.12) = splice_inst %.loc8_25.11 [template = %.loc8_25.13 (constants.%.82c5)] +// CHECK:STDOUT: %.loc8_3.1: @F.%.loc8_3.12 (@F.%.loc8_3.12) = splice_inst %.loc8_3.11 [template = %.loc8_3.13 (constants.%.42a05f.1)] +// CHECK:STDOUT: %.loc8_3.2: @F.%.loc8_3.15 (@F.%.loc8_3.15) = splice_inst %.loc8_3.14 [template = %.loc8_3.16 (constants.%.f8b3eb.1)] +// CHECK:STDOUT: %.loc8_3.3: @F.%.loc8_3.18 (@F.%.loc8_3.18) = splice_inst %.loc8_3.17 [template = %.loc8_3.19 (constants.%.ebe)] +// CHECK:STDOUT: %.loc8_3.4: @F.%.loc8_3.21 (@F.%.loc8_3.21) = splice_inst %.loc8_3.20 [template = %.loc8_3.22 (constants.%.9de)] +// CHECK:STDOUT: %.loc8_3.5: @F.%.loc8_24.11 (%.8bd) = converted %.loc8_25.4, %.loc8_3.4 [template = %.loc8_3.22 (constants.%.9de)] +// CHECK:STDOUT: %.loc8_3.6: @F.%.loc8_24.11 (%.8bd) = splice_inst %.loc8_3.23 [template = %.loc8_3.24 (constants.%.aee)] +// CHECK:STDOUT: %.loc8_3.7: @F.%.loc8_24.11 (%.8bd) = splice_inst %.loc8_3.25 [template = %.loc8_3.26 (constants.%.d37)] // CHECK:STDOUT: assign %v.var, %.loc8_3.7 -// CHECK:STDOUT: %.loc8_24.1: type = splice_block %.loc8_24.3 [template = %.loc8_24.8 (constants.%.bc2)] { +// CHECK:STDOUT: %.loc8_24.1: type = splice_block %.loc8_24.4 [template = %.loc8_24.11 (constants.%.8bd)] { // 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_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: %.loc8_24.2: type = splice_inst %.loc8_24.5 [template = %.loc8_24.6 (constants.%.4a6)] +// CHECK:STDOUT: %.loc8_24.3: @F.%.loc8_24.8 (@F.%.loc8_24.8) = splice_inst %.loc8_24.7 [template = %.loc8_24.9 (constants.%.2a3)] +// CHECK:STDOUT: %.loc8_24.4: type = splice_inst %.loc8_24.10 [template = %.loc8_24.11 (constants.%.8bd)] // CHECK:STDOUT: } -// CHECK:STDOUT: %v: ref @F.%.loc8_24.8 (%.bc2) = wrapper_binding v, %v.var +// CHECK:STDOUT: %v: ref @F.%.loc8_24.11 (%.8bd) = wrapper_binding v, %v.var // CHECK:STDOUT: name_binding_decl { -// 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: %v.patt.loc8_15.1: @F.%pattern_type.loc8 (%pattern_type.0fb) = ref_binding_pattern v [template = %v.patt.loc8_15.2 (constants.%v.patt.5bf)] +// CHECK:STDOUT: %v.var_patt.loc8_3.1: @F.%pattern_type.loc8 (%pattern_type.0fb) = var_pattern %v.patt.loc8_15.1 [template = %v.var_patt.loc8_3.2 (constants.%v.var_patt.2d3)] // CHECK:STDOUT: } -// 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: %.loc8_3.8: @F.%.loc8_24.11 (%.8bd) = splice_inst %.loc8_3.27 [template = %.loc8_3.28 (constants.%.200)] +// CHECK:STDOUT: %.loc8_3.9: @F.%.loc8_3.30 (@F.%.loc8_3.30) = splice_inst %.loc8_3.29 [template = %.loc8_3.31 (constants.%.cdc)] +// CHECK:STDOUT: %.loc8_3.10: @F.%.loc8_3.33 (@F.%.loc8_3.33) = splice_inst %.loc8_3.32 [template = %.loc8_3.34 (constants.%.993)] // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -320,46 +332,50 @@ fn G() { // 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 -// CHECK:STDOUT: %.loc8_24.7 => constants.%inst.splice_block.c1e -// CHECK:STDOUT: %.loc8_24.8 => constants.%S +// CHECK:STDOUT: %.loc8_24.5 => constants.%inst.specific_inst.94c +// CHECK:STDOUT: %.loc8_24.6 => constants.%X +// CHECK:STDOUT: %.loc8_24.7 => constants.%inst.splice_block.5af +// CHECK:STDOUT: %.loc8_24.8 => type +// CHECK:STDOUT: %.loc8_24.9 => constants.%S +// CHECK:STDOUT: %.loc8_24.10 => constants.%inst.splice_block.c1e +// CHECK:STDOUT: %.loc8_24.11 => constants.%S // CHECK:STDOUT: %require_complete.loc8 => constants.%complete_type // CHECK:STDOUT: %pattern_type.loc8 => constants.%pattern_type.981 // CHECK:STDOUT: %v.patt.loc8_15.2 => constants.%v.patt.5fa // CHECK:STDOUT: %v.var_patt.loc8_3.2 => constants.%v.var_patt.e69 -// CHECK:STDOUT: %.loc8_25.4 => constants.%.e53 +// CHECK:STDOUT: %.loc8_25.5 => constants.%.e53 // CHECK:STDOUT: %DefaultOrUnformed.lookup_impl_witness => constants.%DefaultOrUnformed.impl_witness.1ff // CHECK:STDOUT: %DefaultOrUnformed.facet.loc8_25.2 => constants.%DefaultOrUnformed.facet.ba3 -// CHECK:STDOUT: %.loc8_25.5 => constants.%inst.splice_block.9d9 -// CHECK:STDOUT: %.loc8_25.6 => constants.%.805 -// CHECK:STDOUT: %.loc8_25.7 => constants.%T.as_type.as.DefaultOrUnformed.impl.Op.83d -// 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.%.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_25.6 => constants.%inst.specific_inst.15d +// CHECK:STDOUT: %.loc8_25.7 => constants.%DefaultOrUnformed.facet.ba3 +// CHECK:STDOUT: %.loc8_25.8 => constants.%inst.splice_block.9d9 +// CHECK:STDOUT: %.loc8_25.9 => constants.%.805 +// CHECK:STDOUT: %.loc8_25.10 => constants.%T.as_type.as.DefaultOrUnformed.impl.Op.83d +// CHECK:STDOUT: %.loc8_25.11 => constants.%inst.splice_block.7e5 +// CHECK:STDOUT: %.loc8_25.12 => constants.%S +// CHECK:STDOUT: %.loc8_25.13 => invalid +// CHECK:STDOUT: %.loc8_3.11 => constants.%.d80 +// CHECK:STDOUT: %.loc8_3.12 => constants.%.fb0 +// CHECK:STDOUT: %.loc8_3.13 => constants.%.42a05f.2 +// CHECK:STDOUT: %.loc8_3.14 => constants.%.126 +// CHECK:STDOUT: %.loc8_3.15 => constants.%.dcf +// CHECK:STDOUT: %.loc8_3.16 => constants.%.f8b3eb.2 +// CHECK:STDOUT: %.loc8_3.17 => constants.%.609 +// CHECK:STDOUT: %.loc8_3.18 => constants.%.b7f +// CHECK:STDOUT: %.loc8_3.19 => constants.%.c5b +// CHECK:STDOUT: %.loc8_3.20 => constants.%.ee1 +// CHECK:STDOUT: %.loc8_3.21 => constants.%.fb6 +// CHECK:STDOUT: %.loc8_3.22 => constants.%.904 +// CHECK:STDOUT: %.loc8_3.23 => constants.%.3aa +// CHECK:STDOUT: %.loc8_3.24 => constants.%.443 +// CHECK:STDOUT: %.loc8_3.25 => constants.%.00d +// CHECK:STDOUT: %.loc8_3.26 => constants.%.9c0 +// CHECK:STDOUT: %.loc8_3.27 => constants.%inst.specific_inst.54a // CHECK:STDOUT: %.loc8_3.28 => invalid -// CHECK:STDOUT: %.loc8_3.29 => constants.%inst.splice_block.478 +// CHECK:STDOUT: %.loc8_3.29 => constants.%inst.splice_block.57b // CHECK:STDOUT: %.loc8_3.30 => // CHECK:STDOUT: %.loc8_3.31 => invalid -// CHECK:STDOUT: %.loc8_3.32 => constants.%inst.splice_block.37a +// CHECK:STDOUT: %.loc8_3.32 => constants.%inst.splice_block.8eb // CHECK:STDOUT: %.loc8_3.33 => constants.%empty_tuple.type // CHECK:STDOUT: %.loc8_3.34 => invalid // CHECK:STDOUT: } diff --git a/toolchain/lower/handle.cpp b/toolchain/lower/handle.cpp index 59921946fe9d..a6b6ec8b77db 100644 --- a/toolchain/lower/handle.cpp +++ b/toolchain/lower/handle.cpp @@ -345,6 +345,17 @@ auto HandleInst(FunctionContext& /*context*/, SemIR::InstId /*inst_id*/, // Nothing to do. This value should never be consumed. } +auto HandleInst(FunctionContext& context, SemIR::InstId inst_id, + SemIR::SpecificInst inst) -> void { + // If it's valid to refer to inst.inst_id at runtime and it's not constant, it + // must be within this function, and hence in the same specific that we're + // lowering. + CARBON_CHECK(&context.sem_ir() == &context.specific_sem_ir() && + context.specific_id() == inst.specific_id, + "Runtime specific_inst refers to a different specific"); + context.SetLocal(inst_id, context.GetValue(inst.inst_id)); +} + auto HandleInst(FunctionContext& context, SemIR::InstId inst_id, SemIR::SpliceBlock inst) -> void { context.LowerBlockContents(inst.block_id); diff --git a/toolchain/sem_ir/expr_info.cpp b/toolchain/sem_ir/expr_info.cpp index 88d2aeabe05e..c3362f816c5b 100644 --- a/toolchain/sem_ir/expr_info.cpp +++ b/toolchain/sem_ir/expr_info.cpp @@ -94,6 +94,11 @@ static auto GetExprCategoryImpl(const File* ir, InstId inst_id) return ExprCategory::ReprInitializing; } } + } else if constexpr (std::same_as) { + inst_id = inst.inst_id; + // TODO: Track `inst.specific_id` as our current specific, and use that + // when determining the category of the inner instruction. + return std::nullopt; } else if constexpr (std::same_as) { auto action = ir->insts().Get(inst.inst_id); if (auto* action_category = std::get_if( diff --git a/toolchain/sem_ir/inst_kind.def b/toolchain/sem_ir/inst_kind.def index 6752c8eab0fe..671484fa6783 100644 --- a/toolchain/sem_ir/inst_kind.def +++ b/toolchain/sem_ir/inst_kind.def @@ -133,7 +133,7 @@ CARBON_SEM_IR_INST_KIND(RefParamPattern) CARBON_SEM_IR_INST_KIND(RefReturn) CARBON_SEM_IR_INST_KIND(RefReturnPattern) CARBON_SEM_IR_INST_KIND(RefTagExpr) -CARBON_SEM_IR_INST_KIND(RefineTypeAction) +CARBON_SEM_IR_INST_KIND(RefineInstAction) CARBON_SEM_IR_INST_KIND(RequireCompleteType) CARBON_SEM_IR_INST_KIND(RequireImplsDecl) CARBON_SEM_IR_INST_KIND(RequireSpecificDefinition) @@ -150,6 +150,7 @@ CARBON_SEM_IR_INST_KIND(SpecificConstant) CARBON_SEM_IR_INST_KIND(SpecificFunction) CARBON_SEM_IR_INST_KIND(SpecificFunctionType) CARBON_SEM_IR_INST_KIND(SpecificImplFunction) +CARBON_SEM_IR_INST_KIND(SpecificInst) CARBON_SEM_IR_INST_KIND(SpliceBlock) CARBON_SEM_IR_INST_KIND(SpliceInst) CARBON_SEM_IR_INST_KIND(StringLiteral) diff --git a/toolchain/sem_ir/inst_kind.h b/toolchain/sem_ir/inst_kind.h index dd70b5a805bf..594fcfcb5e0f 100644 --- a/toolchain/sem_ir/inst_kind.h +++ b/toolchain/sem_ir/inst_kind.h @@ -277,6 +277,7 @@ class InstKind : public CARBON_ENUM_BASE(InstKind) { constant_kind == InstConstantKind::AlwaysUnique ? InstConstantNeedsInstIdKind::Permanent : InstConstantNeedsInstIdKind::No; + bool action_needs_specific_id = false; TerminatorKind terminator_kind = TerminatorKind::NotTerminator; bool is_lowered = true; bool deduce_through = false; @@ -342,6 +343,12 @@ class InstKind : public CARBON_ENUM_BASE(InstKind) { return definition_info(*this).constant_needs_inst_id; } + // Returns whether this is an action whose `PerformAction` function needs the + // `SpecificId` for the specific that is being generated. + auto action_needs_specific_id() const -> bool { + return definition_info(*this).action_needs_specific_id; + } + // Returns whether this instruction kind is a code block terminator, such as // an unconditional branch instruction, or part of the termination sequence, // such as a conditional branch instruction. The termination sequence of a @@ -441,6 +448,11 @@ class InstKind::Definition : public InstKind { return info_.constant_needs_inst_id; } + // Returns whether this is an action whose `PerformAction` needs a SpecificId. + constexpr auto action_needs_specific_id() const -> bool { + return info_.action_needs_specific_id; + } + // Returns whether this instruction kind is a code block terminator. See // InstKind::terminator_kind(). constexpr auto terminator_kind() const -> TerminatorKind { diff --git a/toolchain/sem_ir/typed_insts.h b/toolchain/sem_ir/typed_insts.h index f004b235263c..0d4455bf8ad9 100644 --- a/toolchain/sem_ir/typed_insts.h +++ b/toolchain/sem_ir/typed_insts.h @@ -1574,18 +1574,19 @@ struct PointerType { TypeInstId pointee_id; }; -// An action that performs type refinement for an instruction, by creating an -// instruction that converts from a template symbolic type to a concrete type. -struct RefineTypeAction { - static constexpr auto Kind = InstKind::RefineTypeAction.Define( - {.ir_name = "refine_type_action", +// An action that performs refinement for an instruction, by creating an +// instruction that has the same semantics but the specific type and constant +// value. +struct RefineInstAction { + static constexpr auto Kind = InstKind::RefineInstAction.Define( + {.ir_name = "refine_inst_action", .expr_category = ActionExprCategory(ExprCategory::Dependent), .constant_kind = InstConstantKind::InstAction, + .action_needs_specific_id = true, .is_lowered = false}); TypeId type_id; MetaInstId inst_id; - TypeInstId inst_type_inst_id; }; // Represents a reference binding pattern that is not a parameter. See @@ -1994,6 +1995,29 @@ struct SpecificImplFunction { SpecificId specific_id; }; +// Given an instruction within a generic, represents a corresponding instruction +// within a specific. Like `SpecificConstant`, this will have the type and +// constant value of the instruction from the specific, but unlike +// `SpecificConstant`, there is no implication that the instruction is constant. +// +// This does not permit references to instructions from other scopes if they +// would not otherwise be permitted. Typically, this means that it can only be +// used to refer to constants and to instructions from the same scope (and hence +// the same specific) that this instruction occupies. +// +// This is used as a convenience during action evaluation to allow an action to +// refer to its `MetaInstId` operands from the generic with their specific types +// and constant values. +struct SpecificInst { + static constexpr auto Kind = InstKind::SpecificInst.Define( + {.ir_name = "specific_inst", + .expr_category = ComputedExprCategory::DependsOnOperands}); + + TypeId type_id; + AbsoluteInstId inst_id; + SpecificId specific_id; +}; + // Splices a block into the location where this appears. This may be an // expression, producing a result with a given type. For example, when // constructing from aggregates we may figure out which conversions are required