From 5a07a14fe908390932f29958b5195619787ae01c Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Tue, 8 Sep 2026 18:39:57 +0000 Subject: [PATCH] Support for lowering templates (#7727) Add basic support for lowering templates: we can now lower `SpliceInst` in the case where the generic and specific are from the same file (and we don't support importing templates from other files yet in general). In order for this to work, lowering needs to be able to query the expression category, and to handle instructions that appear to be (template) constants in the generic but turn out to be non-constant in the specific, so support for that is added. Switch `type_of_inst` from being added as an action inst to being added as a normal inst, since it's not an action and the old approach led to a crash in lowering. --- toolchain/check/action.cpp | 8 +- .../array/init_dependent_bound.carbon | 48 +- .../check/testdata/class/destroy_calls.carbon | 206 ++++---- toolchain/check/testdata/eval/call.carbon | 140 +++--- .../generic/template/member_access.carbon | 138 +++--- .../template_access_assoc_const.carbon | 16 +- .../generic/template/unimplemented.carbon | 68 +-- .../generic/template_dependence.carbon | 144 +++--- .../interop/cpp/class/import/template.carbon | 450 ++++++++++-------- .../interop/cpp/template/generic_call.carbon | 262 +++++----- toolchain/lower/function_context.cpp | 10 +- toolchain/lower/function_context.h | 6 + toolchain/lower/handle.cpp | 33 +- toolchain/lower/handle_call.cpp | 8 +- .../lower/testdata/template/operator.carbon | 237 +++++++++ toolchain/sem_ir/expr_info.cpp | 52 +- toolchain/sem_ir/expr_info.h | 9 +- 17 files changed, 1127 insertions(+), 708 deletions(-) create mode 100644 toolchain/lower/testdata/template/operator.carbon diff --git a/toolchain/check/action.cpp b/toolchain/check/action.cpp index 319e9cc89368..fd38714757e5 100644 --- a/toolchain/check/action.cpp +++ b/toolchain/check/action.cpp @@ -181,10 +181,10 @@ static auto AddDependentActionSpliceImpl(Context& context, -> SemIR::InstId { auto inst_id = AddDependentActionInst(context, action); if (!result_type_inst_id.has_value()) { - result_type_inst_id = AddDependentActionTypeInst( - context, action.loc_id, - SemIR::TypeOfInst{.type_id = SemIR::TypeType::TypeId, - .inst_id = inst_id}); + result_type_inst_id = + AddTypeInst(context, action.loc_id, + SemIR::TypeOfInst{.type_id = SemIR::TypeType::TypeId, + .inst_id = inst_id}); } return AddInst( context, action.loc_id, diff --git a/toolchain/check/testdata/array/init_dependent_bound.carbon b/toolchain/check/testdata/array/init_dependent_bound.carbon index 7a7cff93f62d..e2dd8d691e8c 100644 --- a/toolchain/check/testdata/array/init_dependent_bound.carbon +++ b/toolchain/check/testdata/array/init_dependent_bound.carbon @@ -194,9 +194,11 @@ 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: %.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: %.61d: %array_type.cbf = splice_inst @G.%.loc11_3.6 [template] +// CHECK:STDOUT: %.5a2: type = type_of_inst @G.%.loc11_3.8 [template] +// CHECK:STDOUT: %.dde: %.5a2 = splice_inst @G.%.loc11_3.8 [template] +// CHECK:STDOUT: %.af2: type = type_of_inst @G.%.loc11_3.11 [template] +// CHECK:STDOUT: %.cfd: %.af2 = splice_inst @G.%.loc11_3.11 [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] @@ -268,14 +270,14 @@ fn H() { G(3); } // 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.%.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.%.cfd)] +// CHECK:STDOUT: %.loc11_3.6: = refine_inst_action %arr.var [template] +// CHECK:STDOUT: %.loc11_3.7: @G.%array_type.loc11_31.2 (%array_type.cbf) = splice_inst %.loc11_3.6 [template = %.loc11_3.7 (constants.%.61d)] +// CHECK:STDOUT: %.loc11_3.8: = compound_member_access_action %.loc11_3.1, constants.%assoc0.ae8 [template] +// CHECK:STDOUT: %.loc11_3.9: type = type_of_inst %.loc11_3.8 [template = %.loc11_3.9 (constants.%.5a2)] +// CHECK:STDOUT: %.loc11_3.10: @G.%.loc11_3.9 (%.5a2) = splice_inst %.loc11_3.8 [template = %.loc11_3.10 (constants.%.dde)] +// CHECK:STDOUT: %.loc11_3.11: = call_action (%.loc11_3.3), true [template] +// CHECK:STDOUT: %.loc11_3.12: type = type_of_inst %.loc11_3.11 [template = %.loc11_3.12 (constants.%.af2)] +// CHECK:STDOUT: %.loc11_3.13: @G.%.loc11_3.12 (%.af2) = splice_inst %.loc11_3.11 [template = %.loc11_3.13 (constants.%.cfd)] // CHECK:STDOUT: // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: @@ -297,9 +299,11 @@ fn H() { G(3); } // 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.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: %.loc11_3.1: @G.%array_type.loc11_31.2 (%array_type.cbf) = splice_inst %.loc11_3.6 [template = %.loc11_3.7 (constants.%.61d)] +// CHECK:STDOUT: %.loc11_3.2: type = type_of_inst %.loc11_3.8 [template = %.loc11_3.9 (constants.%.5a2)] +// CHECK:STDOUT: %.loc11_3.3: @G.%.loc11_3.9 (%.5a2) = splice_inst %.loc11_3.8 [template = %.loc11_3.10 (constants.%.dde)] +// CHECK:STDOUT: %.loc11_3.4: type = type_of_inst %.loc11_3.11 [template = %.loc11_3.12 (constants.%.af2)] +// CHECK:STDOUT: %.loc11_3.5: @G.%.loc11_3.12 (%.af2) = splice_inst %.loc11_3.11 [template = %.loc11_3.13 (constants.%.cfd)] // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -335,13 +339,13 @@ fn H() { G(3); } // 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.specific_inst.d8f -// CHECK:STDOUT: %.loc11_3.5 => invalid -// 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 -// CHECK:STDOUT: %.loc11_3.10 => constants.%empty_tuple.type -// CHECK:STDOUT: %.loc11_3.11 => invalid +// CHECK:STDOUT: %.loc11_3.6 => constants.%inst.specific_inst.d8f +// CHECK:STDOUT: %.loc11_3.7 => invalid +// CHECK:STDOUT: %.loc11_3.8 => constants.%inst.splice_block.de7 +// CHECK:STDOUT: %.loc11_3.9 => +// CHECK:STDOUT: %.loc11_3.10 => invalid +// CHECK:STDOUT: %.loc11_3.11 => constants.%inst.call +// CHECK:STDOUT: %.loc11_3.12 => constants.%empty_tuple.type +// CHECK:STDOUT: %.loc11_3.13 => invalid // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/destroy_calls.carbon b/toolchain/check/testdata/class/destroy_calls.carbon index 6b5ab26bd122..16cc03628388 100644 --- a/toolchain/check/testdata/class/destroy_calls.carbon +++ b/toolchain/check/testdata/class/destroy_calls.carbon @@ -571,9 +571,10 @@ 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: %.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: %.eec: type = splice_inst @F.%.loc7_20.6 [template] +// CHECK:STDOUT: %.b01: type = type_of_inst @F.%.loc7_20.8 [template] +// CHECK:STDOUT: %.195: %.b01 = splice_inst @F.%.loc7_20.8 [template] +// CHECK:STDOUT: %.53f: type = splice_inst @F.%.loc7_20.11 [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] @@ -581,21 +582,27 @@ fn G() { F({}); } // 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: %.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: %.48a6b8.1: type = type_of_inst @F.%.loc7_3.17 [template] +// CHECK:STDOUT: %.88d2c8.1: %.48a6b8.1 = splice_inst @F.%.loc7_3.17 [template] +// CHECK:STDOUT: %.ceb5a2.1: type = type_of_inst @F.%.loc7_3.20 [template] +// CHECK:STDOUT: %.45c659.1: %.ceb5a2.1 = splice_inst @F.%.loc7_3.20 [template] +// CHECK:STDOUT: %.40e: type = type_of_inst @F.%.loc7_3.23 [template] +// CHECK:STDOUT: %.fa1: %.40e = splice_inst @F.%.loc7_3.23 [template] +// CHECK:STDOUT: %.1fa: type = type_of_inst @F.%.loc7_3.26 [template] +// CHECK:STDOUT: %.e13: %.1fa = splice_inst @F.%.loc7_3.26 [template] +// CHECK:STDOUT: %.6ec: %.53f = splice_inst @F.%.loc7_3.29 [template] +// CHECK:STDOUT: %.817: %.53f = splice_inst @F.%.loc7_3.31 [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: %.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: %.14f: %.53f = splice_inst @F.%.loc7_3.33 [template] +// CHECK:STDOUT: %.c4e: type = type_of_inst @F.%.loc7_3.35 [template] +// CHECK:STDOUT: %.869: %.c4e = splice_inst @F.%.loc7_3.35 [template] +// CHECK:STDOUT: %.a78: type = type_of_inst @F.%.loc7_3.38 [template] +// CHECK:STDOUT: %.3d1: %.a78 = splice_inst @F.%.loc7_3.38 [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: } @@ -610,11 +617,11 @@ fn G() { F({}); } // 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: %.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: %.48a6b8.2: type = type_of_inst %.0a6 [template] +// CHECK:STDOUT: %.88d2c8.2: %.48a6b8.2 = 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: %.ceb5a2.2: type = type_of_inst %.53c [template] +// CHECK:STDOUT: %.45c659.2: %.ceb5a2.2 = 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] @@ -666,69 +673,76 @@ 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.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: %.loc7_20.6: = refine_inst_action %T.ref [template] +// CHECK:STDOUT: %.loc7_20.7: type = splice_inst %.loc7_20.6 [template = %.loc7_20.7 (constants.%.eec)] +// CHECK:STDOUT: %.loc7_20.8: = call_action (%C.ref, %.loc7_20.2), false [template] +// CHECK:STDOUT: %.loc7_20.9: type = type_of_inst %.loc7_20.8 [template = %.loc7_20.9 (constants.%.b01)] +// CHECK:STDOUT: %.loc7_20.10: @F.%.loc7_20.9 (%.b01) = splice_inst %.loc7_20.8 [template = %.loc7_20.10 (constants.%.195)] +// CHECK:STDOUT: %.loc7_20.11: = convert_to_value_action %.loc7_20.4, type [template] +// CHECK:STDOUT: %.loc7_20.12: type = splice_inst %.loc7_20.11 [template = %.loc7_20.12 (constants.%.53f)] +// CHECK:STDOUT: %require_complete: = require_complete_type %.loc7_20.12 [template = %require_complete (constants.%require_complete)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %.loc7_20.12 [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.%.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.%.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.%.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.%.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.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.%.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.%.3d1)] +// CHECK:STDOUT: %.loc7_3.17: = call_action (constants.%ImplicitAs.generic, constants.%.53f), false [template] +// CHECK:STDOUT: %.loc7_3.18: type = type_of_inst %.loc7_3.17 [template = %.loc7_3.18 (constants.%.48a6b8.1)] +// CHECK:STDOUT: %.loc7_3.19: @F.%.loc7_3.18 (%.48a6b8.1) = splice_inst %.loc7_3.17 [template = %.loc7_3.19 (constants.%.88d2c8.1)] +// CHECK:STDOUT: %.loc7_3.20: = access_member_action %.loc7_3.2, Convert [template] +// CHECK:STDOUT: %.loc7_3.21: type = type_of_inst %.loc7_3.20 [template = %.loc7_3.21 (constants.%.ceb5a2.1)] +// CHECK:STDOUT: %.loc7_3.22: @F.%.loc7_3.21 (%.ceb5a2.1) = splice_inst %.loc7_3.20 [template = %.loc7_3.22 (constants.%.45c659.1)] +// CHECK:STDOUT: %.loc7_3.23: = compound_member_access_action %.loc7_25, %.loc7_3.4 [template] +// CHECK:STDOUT: %.loc7_3.24: type = type_of_inst %.loc7_3.23 [template = %.loc7_3.24 (constants.%.40e)] +// CHECK:STDOUT: %.loc7_3.25: @F.%.loc7_3.24 (%.40e) = splice_inst %.loc7_3.23 [template = %.loc7_3.25 (constants.%.fa1)] +// CHECK:STDOUT: %.loc7_3.26: = call_action (%.loc7_3.6), true [template] +// CHECK:STDOUT: %.loc7_3.27: type = type_of_inst %.loc7_3.26 [template = %.loc7_3.27 (constants.%.1fa)] +// CHECK:STDOUT: %.loc7_3.28: @F.%.loc7_3.27 (%.1fa) = splice_inst %.loc7_3.26 [template = %.loc7_3.28 (constants.%.e13)] +// CHECK:STDOUT: %.loc7_3.29: = refine_inst_action %.loc7_3.9 [template] +// CHECK:STDOUT: %.loc7_3.30: @F.%.loc7_20.12 (%.53f) = splice_inst %.loc7_3.29 [template = %.loc7_3.30 (constants.%.6ec)] +// CHECK:STDOUT: %.loc7_3.31: = convert_to_category_action %.loc7_3.10, element10 [template] +// CHECK:STDOUT: %.loc7_3.32: @F.%.loc7_20.12 (%.53f) = splice_inst %.loc7_3.31 [template = %.loc7_3.32 (constants.%.817)] +// CHECK:STDOUT: %.loc7_3.33: = refine_inst_action %v.var [template] +// CHECK:STDOUT: %.loc7_3.34: @F.%.loc7_20.12 (%.53f) = splice_inst %.loc7_3.33 [template = %.loc7_3.34 (constants.%.14f)] +// CHECK:STDOUT: %.loc7_3.35: = compound_member_access_action %.loc7_3.12, constants.%assoc0.ae8 [template] +// CHECK:STDOUT: %.loc7_3.36: type = type_of_inst %.loc7_3.35 [template = %.loc7_3.36 (constants.%.c4e)] +// CHECK:STDOUT: %.loc7_3.37: @F.%.loc7_3.36 (%.c4e) = splice_inst %.loc7_3.35 [template = %.loc7_3.37 (constants.%.869)] +// CHECK:STDOUT: %.loc7_3.38: = call_action (%.loc7_3.14), true [template] +// CHECK:STDOUT: %.loc7_3.39: type = type_of_inst %.loc7_3.38 [template = %.loc7_3.39 (constants.%.a78)] +// CHECK:STDOUT: %.loc7_3.40: @F.%.loc7_3.39 (%.a78) = splice_inst %.loc7_3.38 [template = %.loc7_3.40 (constants.%.3d1)] // CHECK:STDOUT: // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %v.var: ref @F.%.loc7_20.11 (%.53f) = var_storage %v.var_patt.loc7_3.1 +// CHECK:STDOUT: %v.var: ref @F.%.loc7_20.12 (%.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.%.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.4 [template = %.loc7_20.11 (constants.%.53f)] { +// CHECK:STDOUT: %.loc7_3.1: type = type_of_inst %.loc7_3.17 [template = %.loc7_3.18 (constants.%.48a6b8.1)] +// CHECK:STDOUT: %.loc7_3.2: @F.%.loc7_3.18 (%.48a6b8.1) = splice_inst %.loc7_3.17 [template = %.loc7_3.19 (constants.%.88d2c8.1)] +// CHECK:STDOUT: %.loc7_3.3: type = type_of_inst %.loc7_3.20 [template = %.loc7_3.21 (constants.%.ceb5a2.1)] +// CHECK:STDOUT: %.loc7_3.4: @F.%.loc7_3.21 (%.ceb5a2.1) = splice_inst %.loc7_3.20 [template = %.loc7_3.22 (constants.%.45c659.1)] +// CHECK:STDOUT: %.loc7_3.5: type = type_of_inst %.loc7_3.23 [template = %.loc7_3.24 (constants.%.40e)] +// CHECK:STDOUT: %.loc7_3.6: @F.%.loc7_3.24 (%.40e) = splice_inst %.loc7_3.23 [template = %.loc7_3.25 (constants.%.fa1)] +// CHECK:STDOUT: %.loc7_3.7: type = type_of_inst %.loc7_3.26 [template = %.loc7_3.27 (constants.%.1fa)] +// CHECK:STDOUT: %.loc7_3.8: @F.%.loc7_3.27 (%.1fa) = splice_inst %.loc7_3.26 [template = %.loc7_3.28 (constants.%.e13)] +// CHECK:STDOUT: %.loc7_3.9: @F.%.loc7_20.12 (%.53f) = converted %.loc7_25, %.loc7_3.8 [template = %.loc7_3.28 (constants.%.e13)] +// CHECK:STDOUT: %.loc7_3.10: @F.%.loc7_20.12 (%.53f) = splice_inst %.loc7_3.29 [template = %.loc7_3.30 (constants.%.6ec)] +// CHECK:STDOUT: %.loc7_3.11: @F.%.loc7_20.12 (%.53f) = splice_inst %.loc7_3.31 [template = %.loc7_3.32 (constants.%.817)] +// CHECK:STDOUT: assign %v.var, %.loc7_3.11 +// CHECK:STDOUT: %.loc7_20.1: type = splice_block %.loc7_20.5 [template = %.loc7_20.12 (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: 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: %.loc7_20.2: type = splice_inst %.loc7_20.6 [template = %.loc7_20.7 (constants.%.eec)] +// CHECK:STDOUT: %.loc7_20.3: type = type_of_inst %.loc7_20.8 [template = %.loc7_20.9 (constants.%.b01)] +// CHECK:STDOUT: %.loc7_20.4: @F.%.loc7_20.9 (%.b01) = splice_inst %.loc7_20.8 [template = %.loc7_20.10 (constants.%.195)] +// CHECK:STDOUT: %.loc7_20.5: type = splice_inst %.loc7_20.11 [template = %.loc7_20.12 (constants.%.53f)] // CHECK:STDOUT: } -// CHECK:STDOUT: %v: ref @F.%.loc7_20.11 (%.53f) = wrapper_binding v, %v.var +// CHECK:STDOUT: %v: ref @F.%.loc7_20.12 (%.53f) = wrapper_binding v, %v.var // CHECK:STDOUT: name_binding_decl { // 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.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: %.loc7_3.12: @F.%.loc7_20.12 (%.53f) = splice_inst %.loc7_3.33 [template = %.loc7_3.34 (constants.%.14f)] +// CHECK:STDOUT: %.loc7_3.13: type = type_of_inst %.loc7_3.35 [template = %.loc7_3.36 (constants.%.c4e)] +// CHECK:STDOUT: %.loc7_3.14: @F.%.loc7_3.36 (%.c4e) = splice_inst %.loc7_3.35 [template = %.loc7_3.37 (constants.%.869)] +// CHECK:STDOUT: %.loc7_3.15: type = type_of_inst %.loc7_3.38 [template = %.loc7_3.39 (constants.%.a78)] +// CHECK:STDOUT: %.loc7_3.16: @F.%.loc7_3.39 (%.a78) = splice_inst %.loc7_3.38 [template = %.loc7_3.40 (constants.%.3d1)] // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -750,40 +764,40 @@ fn G() { F({}); } // CHECK:STDOUT: %T.loc6_16.1 => constants.%empty_struct_type // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// 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: %.loc7_20.6 => constants.%inst.specific_inst.c72 +// CHECK:STDOUT: %.loc7_20.7 => constants.%empty_struct_type +// CHECK:STDOUT: %.loc7_20.8 => constants.%inst.class_type +// CHECK:STDOUT: %.loc7_20.9 => type +// CHECK:STDOUT: %.loc7_20.10 => constants.%C.d8efcc.1 +// CHECK:STDOUT: %.loc7_20.11 => constants.%inst.splice_block.1b2 +// CHECK:STDOUT: %.loc7_20.12 => 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.%.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.5e8 -// CHECK:STDOUT: %.loc7_3.30 => -// CHECK:STDOUT: %.loc7_3.31 => invalid -// CHECK:STDOUT: %.loc7_3.32 => constants.%inst.call -// CHECK:STDOUT: %.loc7_3.33 => constants.%empty_tuple.type +// CHECK:STDOUT: %.loc7_3.17 => constants.%.0a6 +// CHECK:STDOUT: %.loc7_3.18 => constants.%.48a6b8.2 +// CHECK:STDOUT: %.loc7_3.19 => constants.%.88d2c8.2 +// CHECK:STDOUT: %.loc7_3.20 => constants.%.53c +// CHECK:STDOUT: %.loc7_3.21 => constants.%.ceb5a2.2 +// CHECK:STDOUT: %.loc7_3.22 => constants.%.45c659.2 +// CHECK:STDOUT: %.loc7_3.23 => constants.%.1e2 +// CHECK:STDOUT: %.loc7_3.24 => constants.%.4f9 +// CHECK:STDOUT: %.loc7_3.25 => constants.%.bc1 +// CHECK:STDOUT: %.loc7_3.26 => constants.%.1ec +// CHECK:STDOUT: %.loc7_3.27 => constants.%.65e +// CHECK:STDOUT: %.loc7_3.28 => constants.%.fc2 +// CHECK:STDOUT: %.loc7_3.29 => constants.%.e48 +// CHECK:STDOUT: %.loc7_3.30 => constants.%.118 +// CHECK:STDOUT: %.loc7_3.31 => constants.%.663 +// CHECK:STDOUT: %.loc7_3.32 => constants.%.e51 +// CHECK:STDOUT: %.loc7_3.33 => constants.%inst.specific_inst.2e8 // CHECK:STDOUT: %.loc7_3.34 => invalid +// CHECK:STDOUT: %.loc7_3.35 => constants.%inst.splice_block.5e8 +// CHECK:STDOUT: %.loc7_3.36 => +// CHECK:STDOUT: %.loc7_3.37 => invalid +// CHECK:STDOUT: %.loc7_3.38 => constants.%inst.call +// CHECK:STDOUT: %.loc7_3.39 => constants.%empty_tuple.type +// CHECK:STDOUT: %.loc7_3.40 => invalid // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/eval/call.carbon b/toolchain/check/testdata/eval/call.carbon index 4a7cc2a99130..c284115b2bfc 100644 --- a/toolchain/check/testdata/eval/call.carbon +++ b/toolchain/check/testdata/eval/call.carbon @@ -201,21 +201,27 @@ fn H() { // CHECK:STDOUT: %ImplicitAs.assoc_type.fcc: type = assoc_entity_type @ImplicitAs, @ImplicitAs(%Dest) [symbolic] // CHECK:STDOUT: %ImplicitAs.WithSelf.Convert.type.97e: type = fn_type @ImplicitAs.WithSelf.Convert, @ImplicitAs.WithSelf(%Dest, %Self.294) [symbolic] // CHECK:STDOUT: %ImplicitAs.WithSelf.Convert.945: %ImplicitAs.WithSelf.Convert.type.97e = struct_value () [symbolic] -// CHECK:STDOUT: %.4e4: @UseFGenerically.%.loc11_3.12 (@UseFGenerically.%.loc11_3.12) = splice_inst @UseFGenerically.%.loc11_3.11 [template] -// 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: %.0ac: %F.call = splice_inst @UseFGenerically.%.loc11_3.23 [template] -// CHECK:STDOUT: %.d54: %F.call = splice_inst @UseFGenerically.%.loc11_3.25 [template] +// CHECK:STDOUT: %.53a: type = type_of_inst @UseFGenerically.%.loc11_3.17 [template] +// CHECK:STDOUT: %.4e4: %.53a = splice_inst @UseFGenerically.%.loc11_3.17 [template] +// CHECK:STDOUT: %.7df: type = type_of_inst @UseFGenerically.%.loc11_3.20 [template] +// CHECK:STDOUT: %.6c2: %.7df = splice_inst @UseFGenerically.%.loc11_3.20 [template] +// CHECK:STDOUT: %.abc: type = type_of_inst @UseFGenerically.%.loc11_3.23 [template] +// CHECK:STDOUT: %.031: %.abc = splice_inst @UseFGenerically.%.loc11_3.23 [template] +// CHECK:STDOUT: %.649: type = type_of_inst @UseFGenerically.%.loc11_3.26 [template] +// CHECK:STDOUT: %.88d: %.649 = splice_inst @UseFGenerically.%.loc11_3.26 [template] +// CHECK:STDOUT: %.0ac: %F.call = splice_inst @UseFGenerically.%.loc11_3.29 [template] +// CHECK:STDOUT: %.d54: %F.call = splice_inst @UseFGenerically.%.loc11_3.31 [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: %.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: %.b53: %F.call = splice_inst @UseFGenerically.%.loc11_3.33 [template] +// CHECK:STDOUT: %.a74: type = type_of_inst @UseFGenerically.%.loc11_3.35 [template] +// CHECK:STDOUT: %.5eb: %.a74 = splice_inst @UseFGenerically.%.loc11_3.35 [template] +// CHECK:STDOUT: %.8ed: type = type_of_inst @UseFGenerically.%.loc11_3.38 [template] +// CHECK:STDOUT: %.ace: %.8ed = splice_inst @UseFGenerically.%.loc11_3.38 [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] @@ -285,43 +291,47 @@ fn H() { // CHECK:STDOUT: %pattern_type: type = pattern_type %F.call.loc11_20.2 [template = %pattern_type (constants.%pattern_type.231)] // CHECK:STDOUT: %v.patt.loc11_15.2: @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.2: @UseFGenerically.%pattern_type (%pattern_type.231) = var_pattern %v.patt.loc11_15.2 [template = %v.var_patt.loc11_3.2 (constants.%v.var_patt.53d)] -// CHECK:STDOUT: %.loc11_3.11: = call_action (constants.%ImplicitAs.generic, %F.call.loc11_20.2), false [template] -// CHECK:STDOUT: %.loc11_3.12: type = type_of_inst %.loc11_3.11 [template] -// CHECK:STDOUT: %.loc11_3.13: @UseFGenerically.%.loc11_3.12 (@UseFGenerically.%.loc11_3.12) = splice_inst %.loc11_3.11 [template = %.loc11_3.13 (constants.%.4e4)] -// CHECK:STDOUT: %.loc11_3.14: = access_member_action %.loc11_3.1, Convert [template] -// CHECK:STDOUT: %.loc11_3.15: type = type_of_inst %.loc11_3.14 [template] -// CHECK:STDOUT: %.loc11_3.16: @UseFGenerically.%.loc11_3.15 (@UseFGenerically.%.loc11_3.15) = splice_inst %.loc11_3.14 [template = %.loc11_3.16 (constants.%.6c2)] -// CHECK:STDOUT: %.loc11_3.17: = compound_member_access_action %.loc11_25, %.loc11_3.2 [template] -// CHECK:STDOUT: %.loc11_3.18: type = type_of_inst %.loc11_3.17 [template] -// CHECK:STDOUT: %.loc11_3.19: @UseFGenerically.%.loc11_3.18 (@UseFGenerically.%.loc11_3.18) = splice_inst %.loc11_3.17 [template = %.loc11_3.19 (constants.%.031)] -// 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_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.%.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.%.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.%.ace)] +// CHECK:STDOUT: %.loc11_3.17: = call_action (constants.%ImplicitAs.generic, %F.call.loc11_20.2), false [template] +// CHECK:STDOUT: %.loc11_3.18: type = type_of_inst %.loc11_3.17 [template = %.loc11_3.18 (constants.%.53a)] +// CHECK:STDOUT: %.loc11_3.19: @UseFGenerically.%.loc11_3.18 (%.53a) = splice_inst %.loc11_3.17 [template = %.loc11_3.19 (constants.%.4e4)] +// CHECK:STDOUT: %.loc11_3.20: = access_member_action %.loc11_3.2, Convert [template] +// CHECK:STDOUT: %.loc11_3.21: type = type_of_inst %.loc11_3.20 [template = %.loc11_3.21 (constants.%.7df)] +// CHECK:STDOUT: %.loc11_3.22: @UseFGenerically.%.loc11_3.21 (%.7df) = splice_inst %.loc11_3.20 [template = %.loc11_3.22 (constants.%.6c2)] +// CHECK:STDOUT: %.loc11_3.23: = compound_member_access_action %.loc11_25, %.loc11_3.4 [template] +// CHECK:STDOUT: %.loc11_3.24: type = type_of_inst %.loc11_3.23 [template = %.loc11_3.24 (constants.%.abc)] +// CHECK:STDOUT: %.loc11_3.25: @UseFGenerically.%.loc11_3.24 (%.abc) = splice_inst %.loc11_3.23 [template = %.loc11_3.25 (constants.%.031)] +// CHECK:STDOUT: %.loc11_3.26: = call_action (%.loc11_3.6), true [template] +// CHECK:STDOUT: %.loc11_3.27: type = type_of_inst %.loc11_3.26 [template = %.loc11_3.27 (constants.%.649)] +// CHECK:STDOUT: %.loc11_3.28: @UseFGenerically.%.loc11_3.27 (%.649) = splice_inst %.loc11_3.26 [template = %.loc11_3.28 (constants.%.88d)] +// CHECK:STDOUT: %.loc11_3.29: = refine_inst_action %.loc11_3.9 [template] +// CHECK:STDOUT: %.loc11_3.30: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = splice_inst %.loc11_3.29 [template = %.loc11_3.30 (constants.%.0ac)] +// CHECK:STDOUT: %.loc11_3.31: = convert_to_category_action %.loc11_3.10, element10 [template] +// CHECK:STDOUT: %.loc11_3.32: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = splice_inst %.loc11_3.31 [template = %.loc11_3.32 (constants.%.d54)] +// CHECK:STDOUT: %.loc11_3.33: = refine_inst_action %v.var [template] +// CHECK:STDOUT: %.loc11_3.34: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = splice_inst %.loc11_3.33 [template = %.loc11_3.34 (constants.%.b53)] +// CHECK:STDOUT: %.loc11_3.35: = compound_member_access_action %.loc11_3.12, constants.%assoc0.ae8 [template] +// CHECK:STDOUT: %.loc11_3.36: type = type_of_inst %.loc11_3.35 [template = %.loc11_3.36 (constants.%.a74)] +// CHECK:STDOUT: %.loc11_3.37: @UseFGenerically.%.loc11_3.36 (%.a74) = splice_inst %.loc11_3.35 [template = %.loc11_3.37 (constants.%.5eb)] +// CHECK:STDOUT: %.loc11_3.38: = call_action (%.loc11_3.14), true [template] +// CHECK:STDOUT: %.loc11_3.39: type = type_of_inst %.loc11_3.38 [template = %.loc11_3.39 (constants.%.8ed)] +// CHECK:STDOUT: %.loc11_3.40: @UseFGenerically.%.loc11_3.39 (%.8ed) = splice_inst %.loc11_3.38 [template = %.loc11_3.40 (constants.%.ace)] // CHECK:STDOUT: // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %v.var: ref @UseFGenerically.%F.call.loc11_20.2 (%F.call) = var_storage %v.var_patt.loc11_3.1 // CHECK:STDOUT: %.loc11_25: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] -// CHECK:STDOUT: %.loc11_3.1: @UseFGenerically.%.loc11_3.12 (@UseFGenerically.%.loc11_3.12) = splice_inst %.loc11_3.11 [template = %.loc11_3.13 (constants.%.4e4)] -// CHECK:STDOUT: %.loc11_3.2: @UseFGenerically.%.loc11_3.15 (@UseFGenerically.%.loc11_3.15) = splice_inst %.loc11_3.14 [template = %.loc11_3.16 (constants.%.6c2)] -// 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.%.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_3.1: type = type_of_inst %.loc11_3.17 [template = %.loc11_3.18 (constants.%.53a)] +// CHECK:STDOUT: %.loc11_3.2: @UseFGenerically.%.loc11_3.18 (%.53a) = splice_inst %.loc11_3.17 [template = %.loc11_3.19 (constants.%.4e4)] +// CHECK:STDOUT: %.loc11_3.3: type = type_of_inst %.loc11_3.20 [template = %.loc11_3.21 (constants.%.7df)] +// CHECK:STDOUT: %.loc11_3.4: @UseFGenerically.%.loc11_3.21 (%.7df) = splice_inst %.loc11_3.20 [template = %.loc11_3.22 (constants.%.6c2)] +// CHECK:STDOUT: %.loc11_3.5: type = type_of_inst %.loc11_3.23 [template = %.loc11_3.24 (constants.%.abc)] +// CHECK:STDOUT: %.loc11_3.6: @UseFGenerically.%.loc11_3.24 (%.abc) = splice_inst %.loc11_3.23 [template = %.loc11_3.25 (constants.%.031)] +// CHECK:STDOUT: %.loc11_3.7: type = type_of_inst %.loc11_3.26 [template = %.loc11_3.27 (constants.%.649)] +// CHECK:STDOUT: %.loc11_3.8: @UseFGenerically.%.loc11_3.27 (%.649) = splice_inst %.loc11_3.26 [template = %.loc11_3.28 (constants.%.88d)] +// CHECK:STDOUT: %.loc11_3.9: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = converted %.loc11_25, %.loc11_3.8 [template = %.loc11_3.28 (constants.%.88d)] +// CHECK:STDOUT: %.loc11_3.10: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = splice_inst %.loc11_3.29 [template = %.loc11_3.30 (constants.%.0ac)] +// CHECK:STDOUT: %.loc11_3.11: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = splice_inst %.loc11_3.31 [template = %.loc11_3.32 (constants.%.d54)] +// CHECK:STDOUT: assign %v.var, %.loc11_3.11 // 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] // CHECK:STDOUT: %X.ref: %i32 = name_ref X, %X.loc10_29.2 [symbolic = %X.loc10_29.1 (constants.%X)] @@ -334,9 +344,11 @@ 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.%.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: %.loc11_3.12: @UseFGenerically.%F.call.loc11_20.2 (%F.call) = splice_inst %.loc11_3.33 [template = %.loc11_3.34 (constants.%.b53)] +// CHECK:STDOUT: %.loc11_3.13: type = type_of_inst %.loc11_3.35 [template = %.loc11_3.36 (constants.%.a74)] +// CHECK:STDOUT: %.loc11_3.14: @UseFGenerically.%.loc11_3.36 (%.a74) = splice_inst %.loc11_3.35 [template = %.loc11_3.37 (constants.%.5eb)] +// CHECK:STDOUT: %.loc11_3.15: type = type_of_inst %.loc11_3.38 [template = %.loc11_3.39 (constants.%.8ed)] +// CHECK:STDOUT: %.loc11_3.16: @UseFGenerically.%.loc11_3.39 (%.8ed) = splice_inst %.loc11_3.38 [template = %.loc11_3.40 (constants.%.ace)] // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -363,30 +375,30 @@ fn H() { // CHECK:STDOUT: %pattern_type => constants.%pattern_type.98b // CHECK:STDOUT: %v.patt.loc11_15.2 => constants.%v.patt.5c6 // CHECK:STDOUT: %v.var_patt.loc11_3.2 => constants.%v.var_patt.a6f -// CHECK:STDOUT: %.loc11_3.11 => constants.%inst.facet_type -// CHECK:STDOUT: %.loc11_3.12 => type -// CHECK:STDOUT: %.loc11_3.13 => constants.%ImplicitAs.type.dee0b8.1 -// CHECK:STDOUT: %.loc11_3.14 => constants.%inst.splice_block.369 -// CHECK:STDOUT: %.loc11_3.15 => constants.%ImplicitAs.assoc_type.cf6 -// CHECK:STDOUT: %.loc11_3.16 => constants.%assoc0.6c9 -// CHECK:STDOUT: %.loc11_3.17 => constants.%inst.splice_block.edd -// CHECK:STDOUT: %.loc11_3.18 => -// CHECK:STDOUT: %.loc11_3.19 => -// CHECK:STDOUT: %.loc11_3.20 => -// CHECK:STDOUT: %.loc11_3.21 => -// CHECK:STDOUT: %.loc11_3.22 => -// CHECK:STDOUT: %.loc11_3.23 => +// CHECK:STDOUT: %.loc11_3.17 => constants.%inst.facet_type +// CHECK:STDOUT: %.loc11_3.18 => type +// CHECK:STDOUT: %.loc11_3.19 => constants.%ImplicitAs.type.dee0b8.1 +// CHECK:STDOUT: %.loc11_3.20 => constants.%inst.splice_block.369 +// CHECK:STDOUT: %.loc11_3.21 => constants.%ImplicitAs.assoc_type.cf6 +// CHECK:STDOUT: %.loc11_3.22 => constants.%assoc0.6c9 +// CHECK:STDOUT: %.loc11_3.23 => constants.%inst.splice_block.edd // CHECK:STDOUT: %.loc11_3.24 => // CHECK:STDOUT: %.loc11_3.25 => // CHECK:STDOUT: %.loc11_3.26 => -// CHECK:STDOUT: %.loc11_3.27 => constants.%inst.specific_inst -// CHECK:STDOUT: %.loc11_3.28 => invalid -// 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 -// CHECK:STDOUT: %.loc11_3.33 => constants.%empty_tuple.type +// CHECK:STDOUT: %.loc11_3.27 => +// CHECK:STDOUT: %.loc11_3.28 => +// CHECK:STDOUT: %.loc11_3.29 => +// CHECK:STDOUT: %.loc11_3.30 => +// CHECK:STDOUT: %.loc11_3.31 => +// CHECK:STDOUT: %.loc11_3.32 => +// CHECK:STDOUT: %.loc11_3.33 => constants.%inst.specific_inst // CHECK:STDOUT: %.loc11_3.34 => invalid +// CHECK:STDOUT: %.loc11_3.35 => constants.%inst.splice_block.8b0 +// CHECK:STDOUT: %.loc11_3.36 => +// CHECK:STDOUT: %.loc11_3.37 => invalid +// CHECK:STDOUT: %.loc11_3.38 => constants.%inst.call +// CHECK:STDOUT: %.loc11_3.39 => constants.%empty_tuple.type +// CHECK:STDOUT: %.loc11_3.40 => invalid // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- return_in_place_discarded.carbon diff --git a/toolchain/check/testdata/generic/template/member_access.carbon b/toolchain/check/testdata/generic/template/member_access.carbon index dd394abd1482..7fdac0bdc924 100644 --- a/toolchain/check/testdata/generic/template/member_access.carbon +++ b/toolchain/check/testdata/generic/template/member_access.carbon @@ -136,9 +136,10 @@ 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: %.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: %.098: %T.67db0b.1 = splice_inst @F.%.loc6_17.5 [template] +// CHECK:STDOUT: %.250: type = type_of_inst @F.%.loc6_17.7 [template] +// CHECK:STDOUT: %.7a1: %.250 = splice_inst @F.%.loc6_17.7 [template] +// CHECK:STDOUT: %.ae0: %i32 = splice_inst @F.%.loc6_17.10 [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] @@ -222,22 +223,23 @@ 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_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.%.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.%.ae0)] +// CHECK:STDOUT: %.loc6_17.5: = refine_inst_action %x.ref [template] +// CHECK:STDOUT: %.loc6_17.6: @F.%T.loc5_16.1 (%T.67db0b.1) = splice_inst %.loc6_17.5 [template = %.loc6_17.6 (constants.%.098)] +// CHECK:STDOUT: %.loc6_17.7: = access_member_action %.loc6_17.1, n [template] +// CHECK:STDOUT: %.loc6_17.8: type = type_of_inst %.loc6_17.7 [template = %.loc6_17.8 (constants.%.250)] +// CHECK:STDOUT: %.loc6_17.9: @F.%.loc6_17.8 (%.250) = splice_inst %.loc6_17.7 [template = %.loc6_17.9 (constants.%.7a1)] +// CHECK:STDOUT: %.loc6_17.10: = convert_to_value_action %.loc6_17.3, constants.%i32 [template] +// CHECK:STDOUT: %.loc6_17.11: %i32 = splice_inst %.loc6_17.10 [template = %.loc6_17.11 (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.%.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: %.loc6_17.1: @F.%T.loc5_16.1 (%T.67db0b.1) = splice_inst %.loc6_17.5 [template = %.loc6_17.6 (constants.%.098)] +// CHECK:STDOUT: %.loc6_17.2: type = type_of_inst %.loc6_17.7 [template = %.loc6_17.8 (constants.%.250)] +// CHECK:STDOUT: %.loc6_17.3: @F.%.loc6_17.8 (%.250) = splice_inst %.loc6_17.7 [template = %.loc6_17.9 (constants.%.7a1)] +// CHECK:STDOUT: %.loc6_17.4: %i32 = splice_inst %.loc6_17.10 [template = %.loc6_17.11 (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: %n: %i32 = wrapper_binding n, %.loc6_17.4 // CHECK:STDOUT: name_binding_decl { // CHECK:STDOUT: %n.patt: %pattern_type.6b6 = value_binding_pattern n [concrete = constants.%n.patt] // CHECK:STDOUT: } @@ -268,13 +270,13 @@ 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.specific_inst.669 -// CHECK:STDOUT: %.loc6_17.5 => invalid -// 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.575 -// CHECK:STDOUT: %.loc6_17.10 => invalid +// CHECK:STDOUT: %.loc6_17.5 => constants.%inst.specific_inst.669 +// CHECK:STDOUT: %.loc6_17.6 => invalid +// CHECK:STDOUT: %.loc6_17.7 => constants.%inst.splice_block.62c +// CHECK:STDOUT: %.loc6_17.8 => constants.%i32 +// CHECK:STDOUT: %.loc6_17.9 => invalid +// CHECK:STDOUT: %.loc6_17.10 => constants.%inst.splice_block.575 +// CHECK:STDOUT: %.loc6_17.11 => invalid // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%struct_type.m.n) { @@ -286,13 +288,13 @@ 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.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.177 -// CHECK:STDOUT: %.loc6_17.10 => invalid +// CHECK:STDOUT: %.loc6_17.5 => constants.%inst.specific_inst.7c9 +// CHECK:STDOUT: %.loc6_17.6 => invalid +// CHECK:STDOUT: %.loc6_17.7 => constants.%inst.struct_access +// CHECK:STDOUT: %.loc6_17.8 => constants.%i32 +// CHECK:STDOUT: %.loc6_17.9 => invalid +// CHECK:STDOUT: %.loc6_17.10 => constants.%inst.splice_block.177 +// CHECK:STDOUT: %.loc6_17.11 => invalid // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_compound_member_access.carbon @@ -317,8 +319,9 @@ 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: %.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: %.098: %T = splice_inst @F.%.loc10_11.4 [template] +// CHECK:STDOUT: %.862: type = type_of_inst @F.%.loc10_11.6 [template] +// CHECK:STDOUT: %.942: %.862 = splice_inst @F.%.loc10_11.6 [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,10 +329,12 @@ 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: %.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: %.da7: type = type_of_inst @F.%.loc10_17.8 [template] +// CHECK:STDOUT: %.823: %.da7 = splice_inst @F.%.loc10_17.8 [template] +// CHECK:STDOUT: %.45b: type = type_of_inst @F.%.loc10_17.11 [template] +// CHECK:STDOUT: %.497: %.45b = splice_inst @F.%.loc10_17.11 [template] +// CHECK:STDOUT: %.572: %i32 = splice_inst @F.%.loc10_17.14 [template] +// CHECK:STDOUT: %.829: %i32 = splice_inst @F.%.loc10_17.16 [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] @@ -388,35 +393,38 @@ 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_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.%.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: %.loc10_11.4: = refine_inst_action %x.ref [template] +// CHECK:STDOUT: %.loc10_11.5: @F.%T.loc9_16.1 (%T) = splice_inst %.loc10_11.4 [template = %.loc10_11.5 (constants.%.098)] +// CHECK:STDOUT: %.loc10_11.6: = compound_member_access_action %.loc10_11.1, %n.ref [template] +// CHECK:STDOUT: %.loc10_11.7: type = type_of_inst %.loc10_11.6 [template = %.loc10_11.7 (constants.%.862)] +// CHECK:STDOUT: %.loc10_11.8: @F.%.loc10_11.7 (%.862) = splice_inst %.loc10_11.6 [template = %.loc10_11.8 (constants.%.942)] +// CHECK:STDOUT: %.loc10_17.8: = compound_member_access_action %.loc10_11.3, constants.%assoc0.368 [template] +// CHECK:STDOUT: %.loc10_17.9: type = type_of_inst %.loc10_17.8 [template = %.loc10_17.9 (constants.%.da7)] +// CHECK:STDOUT: %.loc10_17.10: @F.%.loc10_17.9 (%.da7) = splice_inst %.loc10_17.8 [template = %.loc10_17.10 (constants.%.823)] +// CHECK:STDOUT: %.loc10_17.11: = call_action (%.loc10_17.2), true [template] +// CHECK:STDOUT: %.loc10_17.12: type = type_of_inst %.loc10_17.11 [template = %.loc10_17.12 (constants.%.45b)] +// CHECK:STDOUT: %.loc10_17.13: @F.%.loc10_17.12 (%.45b) = splice_inst %.loc10_17.11 [template = %.loc10_17.13 (constants.%.497)] +// CHECK:STDOUT: %.loc10_17.14: = refine_inst_action %.loc10_17.5 [template] +// CHECK:STDOUT: %.loc10_17.15: %i32 = splice_inst %.loc10_17.14 [template = %.loc10_17.15 (constants.%.572)] +// CHECK:STDOUT: %.loc10_17.16: = convert_to_category_action %.loc10_17.6, element10 [template] +// CHECK:STDOUT: %.loc10_17.17: %i32 = splice_inst %.loc10_17.16 [template = %.loc10_17.17 (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.%.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: %.loc10_11.1: @F.%T.loc9_16.1 (%T) = splice_inst %.loc10_11.4 [template = %.loc10_11.5 (constants.%.098)] +// CHECK:STDOUT: %.loc10_11.2: type = type_of_inst %.loc10_11.6 [template = %.loc10_11.7 (constants.%.862)] +// CHECK:STDOUT: %.loc10_11.3: @F.%.loc10_11.7 (%.862) = splice_inst %.loc10_11.6 [template = %.loc10_11.8 (constants.%.942)] +// CHECK:STDOUT: %.loc10_17.1: type = type_of_inst %.loc10_17.8 [template = %.loc10_17.9 (constants.%.da7)] +// CHECK:STDOUT: %.loc10_17.2: @F.%.loc10_17.9 (%.da7) = splice_inst %.loc10_17.8 [template = %.loc10_17.10 (constants.%.823)] +// CHECK:STDOUT: %.loc10_17.3: type = type_of_inst %.loc10_17.11 [template = %.loc10_17.12 (constants.%.45b)] +// CHECK:STDOUT: %.loc10_17.4: @F.%.loc10_17.12 (%.45b) = splice_inst %.loc10_17.11 [template = %.loc10_17.13 (constants.%.497)] +// CHECK:STDOUT: %.loc10_17.5: %i32 = converted %.loc10_11.3, %.loc10_17.4 [template = %.loc10_17.13 (constants.%.497)] +// CHECK:STDOUT: %.loc10_17.6: %i32 = splice_inst %.loc10_17.14 [template = %.loc10_17.15 (constants.%.572)] +// CHECK:STDOUT: %.loc10_17.7: %i32 = splice_inst %.loc10_17.16 [template = %.loc10_17.17 (constants.%.829)] +// CHECK:STDOUT: return %.loc10_17.7 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -437,14 +445,12 @@ 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.specific_inst -// CHECK:STDOUT: %.loc10_11.4 => invalid -// 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.6 => constants.%inst.splice_block.edd -// CHECK:STDOUT: %.loc10_17.7 => -// CHECK:STDOUT: %.loc10_17.8 => +// CHECK:STDOUT: %.loc10_11.4 => constants.%inst.specific_inst +// CHECK:STDOUT: %.loc10_11.5 => invalid +// CHECK:STDOUT: %.loc10_11.6 => constants.%inst.splice_block.edc +// CHECK:STDOUT: %.loc10_11.7 => constants.%i32 +// CHECK:STDOUT: %.loc10_11.8 => invalid +// CHECK:STDOUT: %.loc10_17.8 => constants.%inst.splice_block.edd // CHECK:STDOUT: %.loc10_17.9 => // CHECK:STDOUT: %.loc10_17.10 => // CHECK:STDOUT: %.loc10_17.11 => @@ -452,5 +458,7 @@ fn G(d: D) -> i32 { // CHECK:STDOUT: %.loc10_17.13 => // CHECK:STDOUT: %.loc10_17.14 => // CHECK:STDOUT: %.loc10_17.15 => +// CHECK:STDOUT: %.loc10_17.16 => +// CHECK:STDOUT: %.loc10_17.17 => // 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 f4063817513a..d081cdee6ab6 100644 --- a/toolchain/check/testdata/generic/template/template_access_assoc_const.carbon +++ b/toolchain/check/testdata/generic/template/template_access_assoc_const.carbon @@ -35,7 +35,8 @@ interface I(template T: type, N: T.I1) { // 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: %.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: %.4a7: type = type_of_inst @I.%.loc16_35.3 [template] +// CHECK:STDOUT: %.e35: %.4a7 = 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] @@ -67,12 +68,13 @@ interface I(template T: type, N: T.I1) { // 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.8: type = splice_block %.loc16_35.11 [template = %.loc16_35.7 (constants.%.476)] { +// CHECK:STDOUT: %.loc16_35.8: type = splice_block %.loc16_35.12 [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.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: %.loc16_35.10: type = type_of_inst %.loc16_35.3 [template = %.loc16_35.4 (constants.%.4a7)] +// CHECK:STDOUT: %.loc16_35.11: @I.%.loc16_35.4 (%.4a7) = splice_inst %.loc16_35.3 [template = %.loc16_35.5 (constants.%.e35)] +// CHECK:STDOUT: %.loc16_35.12: type = splice_inst %.loc16_35.6 [template = %.loc16_35.7 (constants.%.476)] // CHECK:STDOUT: } // CHECK:STDOUT: %N.loc16_32.2: @I.%.loc16_35.7 (%.476) = symbolic_binding N, 1 [template = %N.loc16_32.1 (constants.%N)] // CHECK:STDOUT: } @@ -84,9 +86,9 @@ interface I(template T: type, N: T.I1) { // 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.4: type = type_of_inst %.loc16_35.3 [template = %.loc16_35.4 (constants.%.4a7)] +// CHECK:STDOUT: %.loc16_35.5: @I.%.loc16_35.4 (%.4a7) = splice_inst %.loc16_35.3 [template = %.loc16_35.5 (constants.%.e35)] +// CHECK:STDOUT: %.loc16_35.6: = convert_to_value_action %.loc16_35.11, 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)] diff --git a/toolchain/check/testdata/generic/template/unimplemented.carbon b/toolchain/check/testdata/generic/template/unimplemented.carbon index de731351184f..9b516bc0e72c 100644 --- a/toolchain/check/testdata/generic/template/unimplemented.carbon +++ b/toolchain/check/testdata/generic/template/unimplemented.carbon @@ -59,10 +59,11 @@ 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: %.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: %.098: %T = splice_inst @F.%.loc11_5.5 [template] +// CHECK:STDOUT: %.250: type = type_of_inst @F.%.loc11_5.7 [template] +// CHECK:STDOUT: %.7a1: %.250 = splice_inst @F.%.loc11_5.7 [template] +// CHECK:STDOUT: %require_complete.052: = require_complete_type %.250 [template] +// CHECK:STDOUT: %.899: %.250 = splice_inst @F.%.loc11_5.10 [template] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -103,22 +104,23 @@ 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_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.%.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.%.899)] +// CHECK:STDOUT: %.loc11_5.5: = refine_inst_action %x.ref [template] +// CHECK:STDOUT: %.loc11_5.6: @F.%T.loc6_16.1 (%T) = splice_inst %.loc11_5.5 [template = %.loc11_5.6 (constants.%.098)] +// CHECK:STDOUT: %.loc11_5.7: = access_member_action %.loc11_5.1, n [template] +// CHECK:STDOUT: %.loc11_5.8: type = type_of_inst %.loc11_5.7 [template = %.loc11_5.8 (constants.%.250)] +// CHECK:STDOUT: %.loc11_5.9: @F.%.loc11_5.8 (%.250) = splice_inst %.loc11_5.7 [template = %.loc11_5.9 (constants.%.7a1)] +// CHECK:STDOUT: %require_complete.loc11: = require_complete_type %.loc11_5.8 [template = %require_complete.loc11 (constants.%require_complete.052)] +// CHECK:STDOUT: %.loc11_5.10: = convert_to_category_action %.loc11_5.3, element1 [template] +// CHECK:STDOUT: %.loc11_5.11: @F.%.loc11_5.8 (%.250) = splice_inst %.loc11_5.10 [template = %.loc11_5.11 (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.%.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: %.loc11_5.1: @F.%T.loc6_16.1 (%T) = splice_inst %.loc11_5.5 [template = %.loc11_5.6 (constants.%.098)] +// CHECK:STDOUT: %.loc11_5.2: type = type_of_inst %.loc11_5.7 [template = %.loc11_5.8 (constants.%.250)] +// CHECK:STDOUT: %.loc11_5.3: @F.%.loc11_5.8 (%.250) = splice_inst %.loc11_5.7 [template = %.loc11_5.9 (constants.%.7a1)] +// CHECK:STDOUT: %.loc11_5.4: @F.%.loc11_5.8 (%.250) = splice_inst %.loc11_5.10 [template = %.loc11_5.11 (constants.%.899)] +// CHECK:STDOUT: %.loc11_3: ref = deref %.loc11_5.4 [concrete = ] // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -149,10 +151,11 @@ 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: %.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: %.1dc: %C = splice_inst @F.%.loc16_5.5 [template] +// CHECK:STDOUT: %.df9: type = type_of_inst @F.%.loc16_5.7 [template] +// CHECK:STDOUT: %.fb4: %.df9 = splice_inst @F.%.loc16_5.7 [template] +// CHECK:STDOUT: %require_complete.d99: = require_complete_type %.df9 [template] +// CHECK:STDOUT: %.458: %.df9 = splice_inst @F.%.loc16_5.10 [template] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -200,22 +203,23 @@ 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.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: %.loc16_5.5: = refine_inst_action %c.ref [template] +// CHECK:STDOUT: %.loc16_5.6: %C = splice_inst %.loc16_5.5 [template = %.loc16_5.6 (constants.%.1dc)] +// CHECK:STDOUT: %.loc16_5.7: = access_member_action %.loc16_5.1, n [template] +// CHECK:STDOUT: %.loc16_5.8: type = type_of_inst %.loc16_5.7 [template = %.loc16_5.8 (constants.%.df9)] +// CHECK:STDOUT: %.loc16_5.9: @F.%.loc16_5.8 (%.df9) = splice_inst %.loc16_5.7 [template = %.loc16_5.9 (constants.%.fb4)] +// CHECK:STDOUT: %require_complete: = require_complete_type %.loc16_5.8 [template = %require_complete (constants.%require_complete.d99)] +// CHECK:STDOUT: %.loc16_5.10: = convert_to_category_action %.loc16_5.3, element1 [template] +// CHECK:STDOUT: %.loc16_5.11: @F.%.loc16_5.8 (%.df9) = splice_inst %.loc16_5.10 [template = %.loc16_5.11 (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: %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: %.loc16_5.1: %C = splice_inst %.loc16_5.5 [template = %.loc16_5.6 (constants.%.1dc)] +// CHECK:STDOUT: %.loc16_5.2: type = type_of_inst %.loc16_5.7 [template = %.loc16_5.8 (constants.%.df9)] +// CHECK:STDOUT: %.loc16_5.3: @F.%.loc16_5.8 (%.df9) = splice_inst %.loc16_5.7 [template = %.loc16_5.9 (constants.%.fb4)] +// CHECK:STDOUT: %.loc16_5.4: @F.%.loc16_5.8 (%.df9) = splice_inst %.loc16_5.10 [template = %.loc16_5.11 (constants.%.458)] +// CHECK:STDOUT: %.loc16_3: ref = deref %.loc16_5.4 [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 cd57c4cf6dad..919564b57a4b 100644 --- a/toolchain/check/testdata/generic/template_dependence.carbon +++ b/toolchain/check/testdata/generic/template_dependence.carbon @@ -63,10 +63,12 @@ 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: %.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: %.e87: %ptr.e8f8f9.1 = splice_inst @F.%.loc6_10.8 [template] +// CHECK:STDOUT: %.938: type = type_of_inst @F.%.loc6_10.10 [template] +// CHECK:STDOUT: %.655: %.938 = splice_inst @F.%.loc6_10.10 [template] +// CHECK:STDOUT: %.e7b: type = type_of_inst @F.%.loc6_10.13 [template] +// CHECK:STDOUT: %.d36: %.e7b = splice_inst @F.%.loc6_10.13 [template] +// CHECK:STDOUT: %.e48: %.e7b = 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] @@ -184,26 +186,28 @@ 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_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.%.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.%.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.%.e48)] +// CHECK:STDOUT: %.loc6_10.8: = refine_inst_action %.loc6_10.2 [template] +// CHECK:STDOUT: %.loc6_10.9: @F.%ptr.loc5_28.1 (%ptr.e8f8f9.1) = splice_inst %.loc6_10.8 [template = %.loc6_10.9 (constants.%.e87)] +// CHECK:STDOUT: %.loc6_10.10: = compound_member_access_action %.loc6_10.3, constants.%assoc0 [template] +// CHECK:STDOUT: %.loc6_10.11: type = type_of_inst %.loc6_10.10 [template = %.loc6_10.11 (constants.%.938)] +// CHECK:STDOUT: %.loc6_10.12: @F.%.loc6_10.11 (%.938) = splice_inst %.loc6_10.10 [template = %.loc6_10.12 (constants.%.655)] +// CHECK:STDOUT: %.loc6_10.13: = call_action (%.loc6_10.5), true [template] +// CHECK:STDOUT: %.loc6_10.14: type = type_of_inst %.loc6_10.13 [template = %.loc6_10.14 (constants.%.e7b)] +// CHECK:STDOUT: %.loc6_10.15: @F.%.loc6_10.14 (%.e7b) = splice_inst %.loc6_10.13 [template = %.loc6_10.15 (constants.%.d36)] +// CHECK:STDOUT: %.loc6_12.2: = convert_to_category_action %.loc6_10.7, element10 [template] +// CHECK:STDOUT: %.loc6_12.3: @F.%.loc6_10.14 (%.e7b) = 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.%.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: %.loc6_10.3: @F.%ptr.loc5_28.1 (%ptr.e8f8f9.1) = splice_inst %.loc6_10.8 [template = %.loc6_10.9 (constants.%.e87)] +// CHECK:STDOUT: %.loc6_10.4: type = type_of_inst %.loc6_10.10 [template = %.loc6_10.11 (constants.%.938)] +// CHECK:STDOUT: %.loc6_10.5: @F.%.loc6_10.11 (%.938) = splice_inst %.loc6_10.10 [template = %.loc6_10.12 (constants.%.655)] +// CHECK:STDOUT: %.loc6_10.6: type = type_of_inst %.loc6_10.13 [template = %.loc6_10.14 (constants.%.e7b)] +// CHECK:STDOUT: %.loc6_10.7: @F.%.loc6_10.14 (%.e7b) = splice_inst %.loc6_10.13 [template = %.loc6_10.15 (constants.%.d36)] +// CHECK:STDOUT: %.loc6_12.1: @F.%.loc6_10.14 (%.e7b) = splice_inst %.loc6_12.2 [template = %.loc6_12.3 (constants.%.e48)] // CHECK:STDOUT: return %.loc6_12.1 // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -247,14 +251,14 @@ 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.specific_inst -// CHECK:STDOUT: %.loc6_10.7 => invalid -// 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.61d -// CHECK:STDOUT: %.loc6_10.12 => constants.%ptr.843 -// CHECK:STDOUT: %.loc6_10.13 => invalid +// CHECK:STDOUT: %.loc6_10.8 => constants.%inst.specific_inst +// CHECK:STDOUT: %.loc6_10.9 => invalid +// CHECK:STDOUT: %.loc6_10.10 => constants.%inst.splice_block.85c +// CHECK:STDOUT: %.loc6_10.11 => +// CHECK:STDOUT: %.loc6_10.12 => invalid +// CHECK:STDOUT: %.loc6_10.13 => constants.%inst.splice_block.61d +// CHECK:STDOUT: %.loc6_10.14 => constants.%ptr.843 +// CHECK:STDOUT: %.loc6_10.15 => invalid // CHECK:STDOUT: %.loc6_12.2 => constants.%inst.splice_block.97e // CHECK:STDOUT: %.loc6_12.3 => invalid // CHECK:STDOUT: } @@ -279,16 +283,21 @@ 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: %.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: %.eec: type = splice_inst @F.%.loc6_16.4 [template] +// CHECK:STDOUT: %.ddf: type = type_of_inst @F.%.loc6_16.6 [template] +// CHECK:STDOUT: %.733: %.ddf = splice_inst @F.%.loc6_16.6 [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: %.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: %.180: type = type_of_inst @F.%.loc6_17.12 [template] +// CHECK:STDOUT: %.6c2: %.180 = splice_inst @F.%.loc6_17.12 [template] +// CHECK:STDOUT: %.17f: type = type_of_inst @F.%.loc6_17.15 [template] +// CHECK:STDOUT: %.201: %.17f = splice_inst @F.%.loc6_17.15 [template] +// CHECK:STDOUT: %.742: type = type_of_inst @F.%.loc6_17.18 [template] +// CHECK:STDOUT: %.a93: %.742 = splice_inst @F.%.loc6_17.18 [template] +// CHECK:STDOUT: %.2a5: type = type_of_inst @F.%.loc6_17.21 [template] +// CHECK:STDOUT: %.d9a: %.2a5 = splice_inst @F.%.loc6_17.21 [template] +// CHECK:STDOUT: %.13d: %tuple.type.a5e = splice_inst @F.%.loc6_17.24 [template] +// CHECK:STDOUT: %.8c9: %tuple.type.a5e = splice_inst @F.%.loc6_17.26 [template] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -332,43 +341,48 @@ 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.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.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.%.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.%.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.%.8c9)] +// CHECK:STDOUT: %.loc6_16.4: = refine_inst_action %T.ref.loc6 [template] +// CHECK:STDOUT: %.loc6_16.5: type = splice_inst %.loc6_16.4 [template = %.loc6_16.5 (constants.%.eec)] +// CHECK:STDOUT: %.loc6_16.6: = call_action (%F.ref, %.loc6_16.1, %U.ref.loc6), false [template] +// CHECK:STDOUT: %.loc6_16.7: type = type_of_inst %.loc6_16.6 [template = %.loc6_16.7 (constants.%.ddf)] +// CHECK:STDOUT: %.loc6_16.8: @F.%.loc6_16.7 (%.ddf) = splice_inst %.loc6_16.6 [template = %.loc6_16.8 (constants.%.733)] +// CHECK:STDOUT: %.loc6_17.12: = call_action (constants.%ImplicitAs.generic, %tuple.type), false [template] +// CHECK:STDOUT: %.loc6_17.13: type = type_of_inst %.loc6_17.12 [template = %.loc6_17.13 (constants.%.180)] +// CHECK:STDOUT: %.loc6_17.14: @F.%.loc6_17.13 (%.180) = splice_inst %.loc6_17.12 [template = %.loc6_17.14 (constants.%.6c2)] +// CHECK:STDOUT: %.loc6_17.15: = access_member_action %.loc6_17.2, Convert [template] +// CHECK:STDOUT: %.loc6_17.16: type = type_of_inst %.loc6_17.15 [template = %.loc6_17.16 (constants.%.17f)] +// CHECK:STDOUT: %.loc6_17.17: @F.%.loc6_17.16 (%.17f) = splice_inst %.loc6_17.15 [template = %.loc6_17.17 (constants.%.201)] +// CHECK:STDOUT: %.loc6_17.18: = compound_member_access_action %.loc6_16.3, %.loc6_17.4 [template] +// CHECK:STDOUT: %.loc6_17.19: type = type_of_inst %.loc6_17.18 [template = %.loc6_17.19 (constants.%.742)] +// CHECK:STDOUT: %.loc6_17.20: @F.%.loc6_17.19 (%.742) = splice_inst %.loc6_17.18 [template = %.loc6_17.20 (constants.%.a93)] +// CHECK:STDOUT: %.loc6_17.21: = call_action (%.loc6_17.6), true [template] +// CHECK:STDOUT: %.loc6_17.22: type = type_of_inst %.loc6_17.21 [template = %.loc6_17.22 (constants.%.2a5)] +// CHECK:STDOUT: %.loc6_17.23: @F.%.loc6_17.22 (%.2a5) = splice_inst %.loc6_17.21 [template = %.loc6_17.23 (constants.%.d9a)] +// CHECK:STDOUT: %.loc6_17.24: = refine_inst_action %.loc6_17.9 [template] +// CHECK:STDOUT: %.loc6_17.25: @F.%tuple.type (%tuple.type.a5e) = splice_inst %.loc6_17.24 [template = %.loc6_17.25 (constants.%.13d)] +// CHECK:STDOUT: %.loc6_17.26: = convert_to_category_action %.loc6_17.10, element10 [template] +// CHECK:STDOUT: %.loc6_17.27: @F.%tuple.type (%tuple.type.a5e) = splice_inst %.loc6_17.26 [template = %.loc6_17.27 (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: 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.%.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: %.loc6_16.1: type = splice_inst %.loc6_16.4 [template = %.loc6_16.5 (constants.%.eec)] +// CHECK:STDOUT: %.loc6_16.2: type = type_of_inst %.loc6_16.6 [template = %.loc6_16.7 (constants.%.ddf)] +// CHECK:STDOUT: %.loc6_16.3: @F.%.loc6_16.7 (%.ddf) = splice_inst %.loc6_16.6 [template = %.loc6_16.8 (constants.%.733)] +// CHECK:STDOUT: %.loc6_17.1: type = type_of_inst %.loc6_17.12 [template = %.loc6_17.13 (constants.%.180)] +// CHECK:STDOUT: %.loc6_17.2: @F.%.loc6_17.13 (%.180) = splice_inst %.loc6_17.12 [template = %.loc6_17.14 (constants.%.6c2)] +// CHECK:STDOUT: %.loc6_17.3: type = type_of_inst %.loc6_17.15 [template = %.loc6_17.16 (constants.%.17f)] +// CHECK:STDOUT: %.loc6_17.4: @F.%.loc6_17.16 (%.17f) = splice_inst %.loc6_17.15 [template = %.loc6_17.17 (constants.%.201)] +// CHECK:STDOUT: %.loc6_17.5: type = type_of_inst %.loc6_17.18 [template = %.loc6_17.19 (constants.%.742)] +// CHECK:STDOUT: %.loc6_17.6: @F.%.loc6_17.19 (%.742) = splice_inst %.loc6_17.18 [template = %.loc6_17.20 (constants.%.a93)] +// CHECK:STDOUT: %.loc6_17.7: type = type_of_inst %.loc6_17.21 [template = %.loc6_17.22 (constants.%.2a5)] +// CHECK:STDOUT: %.loc6_17.8: @F.%.loc6_17.22 (%.2a5) = splice_inst %.loc6_17.21 [template = %.loc6_17.23 (constants.%.d9a)] +// CHECK:STDOUT: %.loc6_17.9: @F.%tuple.type (%tuple.type.a5e) = converted %.loc6_16.3, %.loc6_17.8 [template = %.loc6_17.23 (constants.%.d9a)] +// CHECK:STDOUT: %.loc6_17.10: @F.%tuple.type (%tuple.type.a5e) = splice_inst %.loc6_17.24 [template = %.loc6_17.25 (constants.%.13d)] +// CHECK:STDOUT: %.loc6_17.11: @F.%tuple.type (%tuple.type.a5e) = splice_inst %.loc6_17.26 [template = %.loc6_17.27 (constants.%.8c9)] +// CHECK:STDOUT: return %.loc6_17.11 to %return.param // CHECK:STDOUT: } // 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 119ac85ee172..7e9b976cc818 100644 --- a/toolchain/check/testdata/interop/cpp/class/import/template.carbon +++ b/toolchain/check/testdata/interop/cpp/class/import/template.carbon @@ -342,9 +342,10 @@ 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: %.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: %.4a6: type = splice_inst @B.%.loc12_17.5 [template] +// CHECK:STDOUT: %.69a: type = type_of_inst @B.%.loc12_17.7 [template] +// CHECK:STDOUT: %.dcc: %.69a = splice_inst @B.%.loc12_17.7 [template] +// CHECK:STDOUT: %.d48: type = splice_inst @B.%.loc12_17.10 [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] @@ -431,28 +432,29 @@ 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.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: %.loc12_17.5: = refine_inst_action %.loc12_16.1 [template] +// CHECK:STDOUT: %.loc12_17.6: type = splice_inst %.loc12_17.5 [template = %.loc12_17.6 (constants.%.4a6)] +// CHECK:STDOUT: %.loc12_17.7: = call_action (%A.ref, %.loc12_17.1), false [template] +// CHECK:STDOUT: %.loc12_17.8: type = type_of_inst %.loc12_17.7 [template = %.loc12_17.8 (constants.%.69a)] +// CHECK:STDOUT: %.loc12_17.9: @B.%.loc12_17.8 (%.69a) = splice_inst %.loc12_17.7 [template = %.loc12_17.9 (constants.%.dcc)] +// CHECK:STDOUT: %.loc12_17.10: = convert_to_value_action %.loc12_17.3, type [template] +// CHECK:STDOUT: %.loc12_17.11: type = splice_inst %.loc12_17.10 [template = %.loc12_17.11 (constants.%.d48)] +// CHECK:STDOUT: %require_complete: = require_complete_type %.loc12_17.11 [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.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: %B.elem: type = unbound_element_type %B, %.loc12_17.11 [template = %B.elem (constants.%B.elem.ebc)] +// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: @B.%.loc12_17.11 (%.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.ebc) = field_decl a, element0, %.loc12_17.3 in [concrete] { +// CHECK:STDOUT: %field_decl: @B.%B.elem (%B.elem.ebc) = field_decl a, element0, %.loc12_17.4 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: 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: %.loc12_17.1: type = splice_inst %.loc12_17.5 [template = %.loc12_17.6 (constants.%.4a6)] +// CHECK:STDOUT: %.loc12_17.2: type = type_of_inst %.loc12_17.7 [template = %.loc12_17.8 (constants.%.69a)] +// CHECK:STDOUT: %.loc12_17.3: @B.%.loc12_17.8 (%.69a) = splice_inst %.loc12_17.7 [template = %.loc12_17.9 (constants.%.dcc)] +// CHECK:STDOUT: %.loc12_17.4: type = splice_inst %.loc12_17.10 [template = %.loc12_17.11 (constants.%.d48)] // CHECK:STDOUT: } // 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 @@ -493,13 +495,13 @@ fn G() { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %.loc12_16.2 => constants.%i32 -// 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: %.loc12_17.5 => constants.%inst.specific_inst +// CHECK:STDOUT: %.loc12_17.6 => constants.%i32 +// CHECK:STDOUT: %.loc12_17.7 => constants.%inst.splice_block.72d +// CHECK:STDOUT: %.loc12_17.8 => type +// CHECK:STDOUT: %.loc12_17.9 => constants.%A +// CHECK:STDOUT: %.loc12_17.10 => constants.%inst.splice_block.c26 +// CHECK:STDOUT: %.loc12_17.11 => constants.%A // CHECK:STDOUT: %require_complete => constants.%complete_type.ece // CHECK:STDOUT: %B => constants.%B.bd8 // CHECK:STDOUT: %B.elem => constants.%B.elem.1e0 @@ -521,17 +523,21 @@ 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: %.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: %.4a6fd8.1: type = splice_inst @F.%.loc10_24.6 [template] +// CHECK:STDOUT: %.69a7c9.1: type = type_of_inst @F.%.loc10_24.8 [template] +// CHECK:STDOUT: %.dcc61d.1: %.69a7c9.1 = splice_inst @F.%.loc10_24.8 [template] +// CHECK:STDOUT: %.d48: type = splice_inst @F.%.loc10_24.11 [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: %.4a6fd8.2: type = splice_inst @F.%.loc10_35.4 [template] +// CHECK:STDOUT: %.69a7c9.2: type = type_of_inst @F.%.loc10_35.6 [template] +// CHECK:STDOUT: %.dcc61d.2: %.69a7c9.2 = splice_inst @F.%.loc10_35.6 [template] +// CHECK:STDOUT: %.91b: type = type_of_inst @F.%.loc10_36.3 [template] +// CHECK:STDOUT: %.883: %.91b = splice_inst @F.%.loc10_36.3 [template] +// CHECK:STDOUT: %.af2: type = type_of_inst @F.%.loc10_39.4 [template] +// CHECK:STDOUT: %.ef0: %.af2 = splice_inst @F.%.loc10_39.4 [template] +// CHECK:STDOUT: %.4ad: %.d48 = splice_inst @F.%.loc10_39.7 [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] @@ -615,29 +621,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.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: %.loc10_24.6: = refine_inst_action %.loc10_23.1 [template] +// CHECK:STDOUT: %.loc10_24.7: type = splice_inst %.loc10_24.6 [template = %.loc10_24.7 (constants.%.4a6fd8.1)] +// CHECK:STDOUT: %.loc10_24.8: = call_action (%A.ref.loc10_20, %.loc10_24.2), false [template] +// CHECK:STDOUT: %.loc10_24.9: type = type_of_inst %.loc10_24.8 [template = %.loc10_24.9 (constants.%.69a7c9.1)] +// CHECK:STDOUT: %.loc10_24.10: @F.%.loc10_24.9 (%.69a7c9.1) = splice_inst %.loc10_24.8 [template = %.loc10_24.10 (constants.%.dcc61d.1)] +// CHECK:STDOUT: %.loc10_24.11: = convert_to_value_action %.loc10_24.4, type [template] +// CHECK:STDOUT: %.loc10_24.12: type = splice_inst %.loc10_24.11 [template = %.loc10_24.12 (constants.%.d48)] +// CHECK:STDOUT: %require_complete: = require_complete_type %.loc10_24.12 [template = %require_complete (constants.%require_complete.979)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %.loc10_24.12 [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.%.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.%.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: %.loc10_35.4: = refine_inst_action %.loc10_34 [template] +// CHECK:STDOUT: %.loc10_35.5: type = splice_inst %.loc10_35.4 [template = %.loc10_35.5 (constants.%.4a6fd8.2)] +// CHECK:STDOUT: %.loc10_35.6: = call_action (%A.ref.loc10_31, %.loc10_35.1), false [template] +// CHECK:STDOUT: %.loc10_35.7: type = type_of_inst %.loc10_35.6 [template = %.loc10_35.7 (constants.%.69a7c9.2)] +// CHECK:STDOUT: %.loc10_35.8: @F.%.loc10_35.7 (%.69a7c9.2) = splice_inst %.loc10_35.6 [template = %.loc10_35.8 (constants.%.dcc61d.2)] +// CHECK:STDOUT: %.loc10_36.3: = access_member_action %.loc10_35.3, A [template] +// CHECK:STDOUT: %.loc10_36.4: type = type_of_inst %.loc10_36.3 [template = %.loc10_36.4 (constants.%.91b)] +// CHECK:STDOUT: %.loc10_36.5: @F.%.loc10_36.4 (%.91b) = splice_inst %.loc10_36.3 [template = %.loc10_36.5 (constants.%.883)] +// CHECK:STDOUT: %.loc10_39.4: = call_action (%.loc10_36.2), false [template] +// CHECK:STDOUT: %.loc10_39.5: type = type_of_inst %.loc10_39.4 [template = %.loc10_39.5 (constants.%.af2)] +// CHECK:STDOUT: %.loc10_39.6: @F.%.loc10_39.5 (%.af2) = splice_inst %.loc10_39.4 [template = %.loc10_39.6 (constants.%.ef0)] +// CHECK:STDOUT: %.loc10_39.7: = convert_to_value_action %.loc10_39.2, %.loc10_24.12 [template] +// CHECK:STDOUT: %.loc10_39.8: @F.%.loc10_24.12 (%.d48) = splice_inst %.loc10_39.7 [template = %.loc10_39.8 (constants.%.4ad)] // CHECK:STDOUT: // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: @@ -645,21 +651,25 @@ 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: 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: %.loc10_35.1: type = splice_inst %.loc10_35.4 [template = %.loc10_35.5 (constants.%.4a6fd8.2)] +// CHECK:STDOUT: %.loc10_35.2: type = type_of_inst %.loc10_35.6 [template = %.loc10_35.7 (constants.%.69a7c9.2)] +// CHECK:STDOUT: %.loc10_35.3: @F.%.loc10_35.7 (%.69a7c9.2) = splice_inst %.loc10_35.6 [template = %.loc10_35.8 (constants.%.dcc61d.2)] +// CHECK:STDOUT: %.loc10_36.1: type = type_of_inst %.loc10_36.3 [template = %.loc10_36.4 (constants.%.91b)] +// CHECK:STDOUT: %.loc10_36.2: @F.%.loc10_36.4 (%.91b) = splice_inst %.loc10_36.3 [template = %.loc10_36.5 (constants.%.883)] +// CHECK:STDOUT: %.loc10_39.1: type = type_of_inst %.loc10_39.4 [template = %.loc10_39.5 (constants.%.af2)] +// CHECK:STDOUT: %.loc10_39.2: @F.%.loc10_39.5 (%.af2) = splice_inst %.loc10_39.4 [template = %.loc10_39.6 (constants.%.ef0)] +// CHECK:STDOUT: %.loc10_39.3: @F.%.loc10_24.12 (%.d48) = splice_inst %.loc10_39.7 [template = %.loc10_39.8 (constants.%.4ad)] +// CHECK:STDOUT: %.loc10_24.1: type = splice_block %.loc10_24.5 [template = %.loc10_24.12 (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: 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: %.loc10_24.2: type = splice_inst %.loc10_24.6 [template = %.loc10_24.7 (constants.%.4a6fd8.1)] +// CHECK:STDOUT: %.loc10_24.3: type = type_of_inst %.loc10_24.8 [template = %.loc10_24.9 (constants.%.69a7c9.1)] +// CHECK:STDOUT: %.loc10_24.4: @F.%.loc10_24.9 (%.69a7c9.1) = splice_inst %.loc10_24.8 [template = %.loc10_24.10 (constants.%.dcc61d.1)] +// CHECK:STDOUT: %.loc10_24.5: type = splice_inst %.loc10_24.11 [template = %.loc10_24.12 (constants.%.d48)] // CHECK:STDOUT: } -// CHECK:STDOUT: %a: @F.%.loc10_24.11 (%.d48) = wrapper_binding a, %.loc10_39.2 +// CHECK:STDOUT: %a: @F.%.loc10_24.12 (%.d48) = wrapper_binding a, %.loc10_39.3 // CHECK:STDOUT: name_binding_decl { // 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: } @@ -687,29 +697,29 @@ fn G() { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %.loc10_23.2 => constants.%i32 -// 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: %.loc10_24.6 => constants.%inst.specific_inst.9dc364.1 +// CHECK:STDOUT: %.loc10_24.7 => constants.%i32 +// CHECK:STDOUT: %.loc10_24.8 => constants.%inst.splice_block.72dff3.1 +// CHECK:STDOUT: %.loc10_24.9 => type +// CHECK:STDOUT: %.loc10_24.10 => constants.%A +// CHECK:STDOUT: %.loc10_24.11 => constants.%inst.splice_block.c26 +// CHECK:STDOUT: %.loc10_24.12 => 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.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.3 => constants.%inst.splice_block.76c -// CHECK:STDOUT: %.loc10_39.4 => constants.%A -// CHECK:STDOUT: %.loc10_39.5 => invalid -// CHECK:STDOUT: %.loc10_39.6 => constants.%inst.splice_block.b90 -// CHECK:STDOUT: %.loc10_39.7 => invalid +// CHECK:STDOUT: %.loc10_35.4 => constants.%inst.specific_inst.9dc364.2 +// CHECK:STDOUT: %.loc10_35.5 => constants.%i32 +// CHECK:STDOUT: %.loc10_35.6 => constants.%inst.splice_block.72dff3.2 +// CHECK:STDOUT: %.loc10_35.7 => type +// CHECK:STDOUT: %.loc10_35.8 => constants.%A +// CHECK:STDOUT: %.loc10_36.3 => constants.%inst.name_ref +// CHECK:STDOUT: %.loc10_36.4 => constants.%A.A.cpp_overload_set.type +// CHECK:STDOUT: %.loc10_36.5 => constants.%A.A.cpp_overload_set.value +// CHECK:STDOUT: %.loc10_39.4 => constants.%inst.splice_block.76c +// CHECK:STDOUT: %.loc10_39.5 => constants.%A +// CHECK:STDOUT: %.loc10_39.6 => invalid +// CHECK:STDOUT: %.loc10_39.7 => constants.%inst.splice_block.b90 +// CHECK:STDOUT: %.loc10_39.8 => invalid // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- var_cpp_template_constructor.carbon @@ -726,34 +736,44 @@ 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: %.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: %.4a6fd8.1: type = splice_inst @F.%.loc10_24.6 [template] +// CHECK:STDOUT: %.69a7c9.1: type = type_of_inst @F.%.loc10_24.8 [template] +// CHECK:STDOUT: %.dcc61d.1: %.69a7c9.1 = splice_inst @F.%.loc10_24.8 [template] +// CHECK:STDOUT: %.d48: type = splice_inst @F.%.loc10_24.11 [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: %.4a6fd8.2: type = splice_inst @F.%.loc10_35.4 [template] +// CHECK:STDOUT: %.69a7c9.2: type = type_of_inst @F.%.loc10_35.6 [template] +// CHECK:STDOUT: %.dcc61d.2: %.69a7c9.2 = splice_inst @F.%.loc10_35.6 [template] +// CHECK:STDOUT: %.91b: type = type_of_inst @F.%.loc10_36.3 [template] +// CHECK:STDOUT: %.883: %.91b = splice_inst @F.%.loc10_36.3 [template] +// CHECK:STDOUT: %.af2: type = type_of_inst @F.%.loc10_39.3 [template] +// CHECK:STDOUT: %.ef0: %.af2 = splice_inst @F.%.loc10_39.3 [template] // CHECK:STDOUT: %ImplicitAs.type.0ff: type = generic_interface_type @ImplicitAs [concrete] // CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.0ff = struct_value () [concrete] -// 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: %.bf5e2c.1: type = type_of_inst @F.%.loc10_3.17 [template] +// CHECK:STDOUT: %.cd85d6.1: %.bf5e2c.1 = splice_inst @F.%.loc10_3.17 [template] +// CHECK:STDOUT: %.087f70.1: type = type_of_inst @F.%.loc10_3.20 [template] +// CHECK:STDOUT: %.a7b35a.1: %.087f70.1 = splice_inst @F.%.loc10_3.20 [template] +// CHECK:STDOUT: %.39b: type = type_of_inst @F.%.loc10_3.23 [template] +// CHECK:STDOUT: %.b64: %.39b = splice_inst @F.%.loc10_3.23 [template] +// CHECK:STDOUT: %.bad: type = type_of_inst @F.%.loc10_3.26 [template] +// CHECK:STDOUT: %.de5: %.bad = splice_inst @F.%.loc10_3.26 [template] +// CHECK:STDOUT: %.7c8: %.d48 = splice_inst @F.%.loc10_3.29 [template] +// CHECK:STDOUT: %.8f8: %.d48 = splice_inst @F.%.loc10_3.31 [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: %.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: %.821: %.d48 = splice_inst @F.%.loc10_3.33 [template] +// CHECK:STDOUT: %.a6c: type = type_of_inst @F.%.loc10_3.35 [template] +// CHECK:STDOUT: %.9a3a: %.a6c = splice_inst @F.%.loc10_3.35 [template] +// CHECK:STDOUT: %.96e: type = type_of_inst @F.%.loc10_3.38 [template] +// CHECK:STDOUT: %.595: %.96e = splice_inst @F.%.loc10_3.38 [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] { @@ -794,11 +814,11 @@ fn G() { // CHECK:STDOUT: } // CHECK:STDOUT: } // 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: %.bf5e2c.2: type = type_of_inst %.514 [template] +// CHECK:STDOUT: %.cd85d6.2: %.bf5e2c.2 = 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: %.087f70.2: type = type_of_inst %.a4e [template] +// CHECK:STDOUT: %.a7b35a.2: %.087f70.2 = 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] @@ -863,89 +883,99 @@ 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.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: %.loc10_24.6: = refine_inst_action %.loc10_23.1 [template] +// CHECK:STDOUT: %.loc10_24.7: type = splice_inst %.loc10_24.6 [template = %.loc10_24.7 (constants.%.4a6fd8.1)] +// CHECK:STDOUT: %.loc10_24.8: = call_action (%A.ref.loc10_20, %.loc10_24.2), false [template] +// CHECK:STDOUT: %.loc10_24.9: type = type_of_inst %.loc10_24.8 [template = %.loc10_24.9 (constants.%.69a7c9.1)] +// CHECK:STDOUT: %.loc10_24.10: @F.%.loc10_24.9 (%.69a7c9.1) = splice_inst %.loc10_24.8 [template = %.loc10_24.10 (constants.%.dcc61d.1)] +// CHECK:STDOUT: %.loc10_24.11: = convert_to_value_action %.loc10_24.4, type [template] +// CHECK:STDOUT: %.loc10_24.12: type = splice_inst %.loc10_24.11 [template = %.loc10_24.12 (constants.%.d48)] +// CHECK:STDOUT: %require_complete: = require_complete_type %.loc10_24.12 [template = %require_complete (constants.%require_complete.979)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %.loc10_24.12 [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.%.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.%.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.%.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.%.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.%.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.%.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.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.%.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.%.595)] +// CHECK:STDOUT: %.loc10_35.4: = refine_inst_action %.loc10_34 [template] +// CHECK:STDOUT: %.loc10_35.5: type = splice_inst %.loc10_35.4 [template = %.loc10_35.5 (constants.%.4a6fd8.2)] +// CHECK:STDOUT: %.loc10_35.6: = call_action (%A.ref.loc10_31, %.loc10_35.1), false [template] +// CHECK:STDOUT: %.loc10_35.7: type = type_of_inst %.loc10_35.6 [template = %.loc10_35.7 (constants.%.69a7c9.2)] +// CHECK:STDOUT: %.loc10_35.8: @F.%.loc10_35.7 (%.69a7c9.2) = splice_inst %.loc10_35.6 [template = %.loc10_35.8 (constants.%.dcc61d.2)] +// CHECK:STDOUT: %.loc10_36.3: = access_member_action %.loc10_35.3, A [template] +// CHECK:STDOUT: %.loc10_36.4: type = type_of_inst %.loc10_36.3 [template = %.loc10_36.4 (constants.%.91b)] +// CHECK:STDOUT: %.loc10_36.5: @F.%.loc10_36.4 (%.91b) = splice_inst %.loc10_36.3 [template = %.loc10_36.5 (constants.%.883)] +// CHECK:STDOUT: %.loc10_39.3: = call_action (%.loc10_36.2), false [template] +// CHECK:STDOUT: %.loc10_39.4: type = type_of_inst %.loc10_39.3 [template = %.loc10_39.4 (constants.%.af2)] +// CHECK:STDOUT: %.loc10_39.5: @F.%.loc10_39.4 (%.af2) = splice_inst %.loc10_39.3 [template = %.loc10_39.5 (constants.%.ef0)] +// CHECK:STDOUT: %.loc10_3.17: = call_action (constants.%ImplicitAs.generic, constants.%.d48), false [template] +// CHECK:STDOUT: %.loc10_3.18: type = type_of_inst %.loc10_3.17 [template = %.loc10_3.18 (constants.%.bf5e2c.1)] +// CHECK:STDOUT: %.loc10_3.19: @F.%.loc10_3.18 (%.bf5e2c.1) = splice_inst %.loc10_3.17 [template = %.loc10_3.19 (constants.%.cd85d6.1)] +// CHECK:STDOUT: %.loc10_3.20: = access_member_action %.loc10_3.2, Convert [template] +// CHECK:STDOUT: %.loc10_3.21: type = type_of_inst %.loc10_3.20 [template = %.loc10_3.21 (constants.%.087f70.1)] +// CHECK:STDOUT: %.loc10_3.22: @F.%.loc10_3.21 (%.087f70.1) = splice_inst %.loc10_3.20 [template = %.loc10_3.22 (constants.%.a7b35a.1)] +// CHECK:STDOUT: %.loc10_3.23: = compound_member_access_action %.loc10_39.2, %.loc10_3.4 [template] +// CHECK:STDOUT: %.loc10_3.24: type = type_of_inst %.loc10_3.23 [template = %.loc10_3.24 (constants.%.39b)] +// CHECK:STDOUT: %.loc10_3.25: @F.%.loc10_3.24 (%.39b) = splice_inst %.loc10_3.23 [template = %.loc10_3.25 (constants.%.b64)] +// CHECK:STDOUT: %.loc10_3.26: = call_action (%.loc10_3.6), true [template] +// CHECK:STDOUT: %.loc10_3.27: type = type_of_inst %.loc10_3.26 [template = %.loc10_3.27 (constants.%.bad)] +// CHECK:STDOUT: %.loc10_3.28: @F.%.loc10_3.27 (%.bad) = splice_inst %.loc10_3.26 [template = %.loc10_3.28 (constants.%.de5)] +// CHECK:STDOUT: %.loc10_3.29: = refine_inst_action %.loc10_3.9 [template] +// CHECK:STDOUT: %.loc10_3.30: @F.%.loc10_24.12 (%.d48) = splice_inst %.loc10_3.29 [template = %.loc10_3.30 (constants.%.7c8)] +// CHECK:STDOUT: %.loc10_3.31: = convert_to_category_action %.loc10_3.10, element10 [template] +// CHECK:STDOUT: %.loc10_3.32: @F.%.loc10_24.12 (%.d48) = splice_inst %.loc10_3.31 [template = %.loc10_3.32 (constants.%.8f8)] +// CHECK:STDOUT: %.loc10_3.33: = refine_inst_action %a.var [template] +// CHECK:STDOUT: %.loc10_3.34: @F.%.loc10_24.12 (%.d48) = splice_inst %.loc10_3.33 [template = %.loc10_3.34 (constants.%.821)] +// CHECK:STDOUT: %.loc10_3.35: = compound_member_access_action %.loc10_3.12, constants.%assoc0.ae8 [template] +// CHECK:STDOUT: %.loc10_3.36: type = type_of_inst %.loc10_3.35 [template = %.loc10_3.36 (constants.%.a6c)] +// CHECK:STDOUT: %.loc10_3.37: @F.%.loc10_3.36 (%.a6c) = splice_inst %.loc10_3.35 [template = %.loc10_3.37 (constants.%.9a3a)] +// CHECK:STDOUT: %.loc10_3.38: = call_action (%.loc10_3.14), true [template] +// CHECK:STDOUT: %.loc10_3.39: type = type_of_inst %.loc10_3.38 [template = %.loc10_3.39 (constants.%.96e)] +// CHECK:STDOUT: %.loc10_3.40: @F.%.loc10_3.39 (%.96e) = splice_inst %.loc10_3.38 [template = %.loc10_3.40 (constants.%.595)] // CHECK:STDOUT: // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.var: ref @F.%.loc10_24.11 (%.d48) = var_storage %a.var_patt.loc10_3.1 +// CHECK:STDOUT: %a.var: ref @F.%.loc10_24.12 (%.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: 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.4 [template = %.loc10_24.11 (constants.%.d48)] { +// CHECK:STDOUT: %.loc10_35.1: type = splice_inst %.loc10_35.4 [template = %.loc10_35.5 (constants.%.4a6fd8.2)] +// CHECK:STDOUT: %.loc10_35.2: type = type_of_inst %.loc10_35.6 [template = %.loc10_35.7 (constants.%.69a7c9.2)] +// CHECK:STDOUT: %.loc10_35.3: @F.%.loc10_35.7 (%.69a7c9.2) = splice_inst %.loc10_35.6 [template = %.loc10_35.8 (constants.%.dcc61d.2)] +// CHECK:STDOUT: %.loc10_36.1: type = type_of_inst %.loc10_36.3 [template = %.loc10_36.4 (constants.%.91b)] +// CHECK:STDOUT: %.loc10_36.2: @F.%.loc10_36.4 (%.91b) = splice_inst %.loc10_36.3 [template = %.loc10_36.5 (constants.%.883)] +// CHECK:STDOUT: %.loc10_39.1: type = type_of_inst %.loc10_39.3 [template = %.loc10_39.4 (constants.%.af2)] +// CHECK:STDOUT: %.loc10_39.2: @F.%.loc10_39.4 (%.af2) = splice_inst %.loc10_39.3 [template = %.loc10_39.5 (constants.%.ef0)] +// CHECK:STDOUT: %.loc10_3.1: type = type_of_inst %.loc10_3.17 [template = %.loc10_3.18 (constants.%.bf5e2c.1)] +// CHECK:STDOUT: %.loc10_3.2: @F.%.loc10_3.18 (%.bf5e2c.1) = splice_inst %.loc10_3.17 [template = %.loc10_3.19 (constants.%.cd85d6.1)] +// CHECK:STDOUT: %.loc10_3.3: type = type_of_inst %.loc10_3.20 [template = %.loc10_3.21 (constants.%.087f70.1)] +// CHECK:STDOUT: %.loc10_3.4: @F.%.loc10_3.21 (%.087f70.1) = splice_inst %.loc10_3.20 [template = %.loc10_3.22 (constants.%.a7b35a.1)] +// CHECK:STDOUT: %.loc10_3.5: type = type_of_inst %.loc10_3.23 [template = %.loc10_3.24 (constants.%.39b)] +// CHECK:STDOUT: %.loc10_3.6: @F.%.loc10_3.24 (%.39b) = splice_inst %.loc10_3.23 [template = %.loc10_3.25 (constants.%.b64)] +// CHECK:STDOUT: %.loc10_3.7: type = type_of_inst %.loc10_3.26 [template = %.loc10_3.27 (constants.%.bad)] +// CHECK:STDOUT: %.loc10_3.8: @F.%.loc10_3.27 (%.bad) = splice_inst %.loc10_3.26 [template = %.loc10_3.28 (constants.%.de5)] +// CHECK:STDOUT: %.loc10_3.9: @F.%.loc10_24.12 (%.d48) = converted %.loc10_39.2, %.loc10_3.8 [template = %.loc10_3.28 (constants.%.de5)] +// CHECK:STDOUT: %.loc10_3.10: @F.%.loc10_24.12 (%.d48) = splice_inst %.loc10_3.29 [template = %.loc10_3.30 (constants.%.7c8)] +// CHECK:STDOUT: %.loc10_3.11: @F.%.loc10_24.12 (%.d48) = splice_inst %.loc10_3.31 [template = %.loc10_3.32 (constants.%.8f8)] +// CHECK:STDOUT: assign %a.var, %.loc10_3.11 +// CHECK:STDOUT: %.loc10_24.1: type = splice_block %.loc10_24.5 [template = %.loc10_24.12 (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: 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: %.loc10_24.2: type = splice_inst %.loc10_24.6 [template = %.loc10_24.7 (constants.%.4a6fd8.1)] +// CHECK:STDOUT: %.loc10_24.3: type = type_of_inst %.loc10_24.8 [template = %.loc10_24.9 (constants.%.69a7c9.1)] +// CHECK:STDOUT: %.loc10_24.4: @F.%.loc10_24.9 (%.69a7c9.1) = splice_inst %.loc10_24.8 [template = %.loc10_24.10 (constants.%.dcc61d.1)] +// CHECK:STDOUT: %.loc10_24.5: type = splice_inst %.loc10_24.11 [template = %.loc10_24.12 (constants.%.d48)] // CHECK:STDOUT: } -// CHECK:STDOUT: %a: ref @F.%.loc10_24.11 (%.d48) = wrapper_binding a, %a.var +// CHECK:STDOUT: %a: ref @F.%.loc10_24.12 (%.d48) = wrapper_binding a, %a.var // CHECK:STDOUT: name_binding_decl { // 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.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: %.loc10_3.12: @F.%.loc10_24.12 (%.d48) = splice_inst %.loc10_3.33 [template = %.loc10_3.34 (constants.%.821)] +// CHECK:STDOUT: %.loc10_3.13: type = type_of_inst %.loc10_3.35 [template = %.loc10_3.36 (constants.%.a6c)] +// CHECK:STDOUT: %.loc10_3.14: @F.%.loc10_3.36 (%.a6c) = splice_inst %.loc10_3.35 [template = %.loc10_3.37 (constants.%.9a3a)] +// CHECK:STDOUT: %.loc10_3.15: type = type_of_inst %.loc10_3.38 [template = %.loc10_3.39 (constants.%.96e)] +// CHECK:STDOUT: %.loc10_3.16: @F.%.loc10_3.39 (%.96e) = splice_inst %.loc10_3.38 [template = %.loc10_3.40 (constants.%.595)] // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -961,51 +991,51 @@ fn G() { // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %.loc10_23.2 => constants.%i32 -// 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: %.loc10_24.6 => constants.%inst.specific_inst.9dc364.1 +// CHECK:STDOUT: %.loc10_24.7 => constants.%i32 +// CHECK:STDOUT: %.loc10_24.8 => constants.%inst.splice_block.72dff3.1 +// CHECK:STDOUT: %.loc10_24.9 => type +// CHECK:STDOUT: %.loc10_24.10 => constants.%A +// CHECK:STDOUT: %.loc10_24.11 => constants.%inst.splice_block.c26 +// CHECK:STDOUT: %.loc10_24.12 => 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.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.%.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.863 -// CHECK:STDOUT: %.loc10_3.30 => -// CHECK:STDOUT: %.loc10_3.31 => invalid -// CHECK:STDOUT: %.loc10_3.32 => constants.%inst.call -// CHECK:STDOUT: %.loc10_3.33 => constants.%empty_tuple.type +// CHECK:STDOUT: %.loc10_35.4 => constants.%inst.specific_inst.9dc364.2 +// CHECK:STDOUT: %.loc10_35.5 => constants.%i32 +// CHECK:STDOUT: %.loc10_35.6 => constants.%inst.splice_block.72dff3.2 +// CHECK:STDOUT: %.loc10_35.7 => type +// CHECK:STDOUT: %.loc10_35.8 => constants.%A +// CHECK:STDOUT: %.loc10_36.3 => constants.%inst.name_ref +// CHECK:STDOUT: %.loc10_36.4 => constants.%A.A.cpp_overload_set.type +// CHECK:STDOUT: %.loc10_36.5 => constants.%A.A.cpp_overload_set.value +// CHECK:STDOUT: %.loc10_39.3 => constants.%inst.splice_block.76c +// CHECK:STDOUT: %.loc10_39.4 => constants.%A +// CHECK:STDOUT: %.loc10_39.5 => invalid +// CHECK:STDOUT: %.loc10_3.17 => constants.%.514 +// CHECK:STDOUT: %.loc10_3.18 => constants.%.bf5e2c.2 +// CHECK:STDOUT: %.loc10_3.19 => constants.%.cd85d6.2 +// CHECK:STDOUT: %.loc10_3.20 => constants.%.a4e +// CHECK:STDOUT: %.loc10_3.21 => constants.%.087f70.2 +// CHECK:STDOUT: %.loc10_3.22 => constants.%.a7b35a.2 +// CHECK:STDOUT: %.loc10_3.23 => constants.%.0c2 +// CHECK:STDOUT: %.loc10_3.24 => constants.%.4bb +// CHECK:STDOUT: %.loc10_3.25 => constants.%.9a31 +// CHECK:STDOUT: %.loc10_3.26 => constants.%.97a +// CHECK:STDOUT: %.loc10_3.27 => constants.%.f1e +// CHECK:STDOUT: %.loc10_3.28 => constants.%.b1f +// CHECK:STDOUT: %.loc10_3.29 => constants.%.215 +// CHECK:STDOUT: %.loc10_3.30 => constants.%.6cb +// CHECK:STDOUT: %.loc10_3.31 => constants.%.297 +// CHECK:STDOUT: %.loc10_3.32 => constants.%.3d9 +// CHECK:STDOUT: %.loc10_3.33 => constants.%inst.specific_inst.cb7 // CHECK:STDOUT: %.loc10_3.34 => invalid +// CHECK:STDOUT: %.loc10_3.35 => constants.%inst.splice_block.863 +// CHECK:STDOUT: %.loc10_3.36 => +// CHECK:STDOUT: %.loc10_3.37 => invalid +// CHECK:STDOUT: %.loc10_3.38 => constants.%inst.call +// CHECK:STDOUT: %.loc10_3.39 => constants.%empty_tuple.type +// CHECK:STDOUT: %.loc10_3.40 => invalid // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/template/generic_call.carbon b/toolchain/check/testdata/interop/cpp/template/generic_call.carbon index 175fc86c9083..c183f8383f18 100644 --- a/toolchain/check/testdata/interop/cpp/template/generic_call.carbon +++ b/toolchain/check/testdata/interop/cpp/template/generic_call.carbon @@ -51,9 +51,10 @@ 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: %.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: %.4a6: type = splice_inst @F.%.loc8_24.6 [template] +// CHECK:STDOUT: %.52a: type = type_of_inst @F.%.loc8_24.8 [template] +// CHECK:STDOUT: %.2a3: %.52a = splice_inst @F.%.loc8_24.8 [template] +// CHECK:STDOUT: %.8bd: type = splice_inst @F.%.loc8_24.11 [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] @@ -69,26 +70,34 @@ fn G() { // 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: %.92d: %DefaultOrUnformed.type = splice_inst @F.%.loc8_25.8 [template] +// CHECK:STDOUT: %.177: type = type_of_inst @F.%.loc8_25.10 [template] +// CHECK:STDOUT: %.f6b: %.177 = splice_inst @F.%.loc8_25.10 [template] +// CHECK:STDOUT: %.f75: type = type_of_inst @F.%.loc8_25.13 [template] +// CHECK:STDOUT: %.82c5: %.f75 = splice_inst @F.%.loc8_25.13 [template] // CHECK:STDOUT: %ImplicitAs.type.0ff: type = generic_interface_type @ImplicitAs [concrete] // CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.0ff = struct_value () [concrete] -// 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: %.fb0a62.1: type = type_of_inst @F.%.loc8_3.17 [template] +// CHECK:STDOUT: %.42a05f.1: %.fb0a62.1 = splice_inst @F.%.loc8_3.17 [template] +// CHECK:STDOUT: %.dcfccd.1: type = type_of_inst @F.%.loc8_3.20 [template] +// CHECK:STDOUT: %.f8b3eb.1: %.dcfccd.1 = splice_inst @F.%.loc8_3.20 [template] +// CHECK:STDOUT: %.d06: type = type_of_inst @F.%.loc8_3.23 [template] +// CHECK:STDOUT: %.ebe: %.d06 = splice_inst @F.%.loc8_3.23 [template] +// CHECK:STDOUT: %.ce0: type = type_of_inst @F.%.loc8_3.26 [template] +// CHECK:STDOUT: %.9de: %.ce0 = splice_inst @F.%.loc8_3.26 [template] +// CHECK:STDOUT: %.aee: %.8bd = splice_inst @F.%.loc8_3.29 [template] +// CHECK:STDOUT: %.d37: %.8bd = splice_inst @F.%.loc8_3.31 [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: %.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: %.200: %.8bd = splice_inst @F.%.loc8_3.33 [template] +// CHECK:STDOUT: %.6a6: type = type_of_inst @F.%.loc8_3.35 [template] +// CHECK:STDOUT: %.cdc: %.6a6 = splice_inst @F.%.loc8_3.35 [template] +// CHECK:STDOUT: %.5e7: type = type_of_inst @F.%.loc8_3.38 [template] +// CHECK:STDOUT: %.993: %.5e7 = splice_inst @F.%.loc8_3.38 [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] @@ -140,11 +149,11 @@ fn G() { // CHECK:STDOUT: } // CHECK:STDOUT: } // 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: %.fb0a62.2: type = type_of_inst %.d80 [template] +// CHECK:STDOUT: %.42a05f.2: %.fb0a62.2 = 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: %.dcfccd.2: type = type_of_inst %.126 [template] +// CHECK:STDOUT: %.f8b3eb.2: %.dcfccd.2 = 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] @@ -230,86 +239,95 @@ 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.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: %.loc8_24.6: = refine_inst_action %.loc8_23.1 [template] +// CHECK:STDOUT: %.loc8_24.7: type = splice_inst %.loc8_24.6 [template = %.loc8_24.7 (constants.%.4a6)] +// CHECK:STDOUT: %.loc8_24.8: = call_action (%S.ref, %.loc8_24.2), false [template] +// CHECK:STDOUT: %.loc8_24.9: type = type_of_inst %.loc8_24.8 [template = %.loc8_24.9 (constants.%.52a)] +// CHECK:STDOUT: %.loc8_24.10: @F.%.loc8_24.9 (%.52a) = splice_inst %.loc8_24.8 [template = %.loc8_24.10 (constants.%.2a3)] +// CHECK:STDOUT: %.loc8_24.11: = convert_to_value_action %.loc8_24.4, type [template] +// CHECK:STDOUT: %.loc8_24.12: type = splice_inst %.loc8_24.11 [template = %.loc8_24.12 (constants.%.8bd)] +// CHECK:STDOUT: %require_complete.loc8: = require_complete_type %.loc8_24.12 [template = %require_complete.loc8 (constants.%require_complete.cfd)] +// CHECK:STDOUT: %pattern_type.loc8: type = pattern_type %.loc8_24.12 [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.%.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.%.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.%.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.%.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.%.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.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.%.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.%.993)] +// CHECK:STDOUT: %.loc8_25.7: require_specific_def_type = require_specific_def @T.as.DefaultOrUnformed.impl(%.loc8_24.12) [template = %.loc8_25.7 (constants.%.892)] +// CHECK:STDOUT: %DefaultOrUnformed.lookup_impl_witness: = lookup_impl_witness %.loc8_24.12, @DefaultOrUnformed [template = %DefaultOrUnformed.lookup_impl_witness (constants.%DefaultOrUnformed.lookup_impl_witness)] +// CHECK:STDOUT: %DefaultOrUnformed.facet.loc8_25.2: %DefaultOrUnformed.type = facet_value %.loc8_24.12, (%DefaultOrUnformed.lookup_impl_witness) [template = %DefaultOrUnformed.facet.loc8_25.2 (constants.%DefaultOrUnformed.facet.77c)] +// CHECK:STDOUT: %.loc8_25.8: = refine_inst_action %.loc8_25.1 [template] +// CHECK:STDOUT: %.loc8_25.9: %DefaultOrUnformed.type = splice_inst %.loc8_25.8 [template = %.loc8_25.9 (constants.%.92d)] +// CHECK:STDOUT: %.loc8_25.10: = access_member_action %.loc8_25.2, Op [template] +// CHECK:STDOUT: %.loc8_25.11: type = type_of_inst %.loc8_25.10 [template = %.loc8_25.11 (constants.%.177)] +// CHECK:STDOUT: %.loc8_25.12: @F.%.loc8_25.11 (%.177) = splice_inst %.loc8_25.10 [template = %.loc8_25.12 (constants.%.f6b)] +// CHECK:STDOUT: %.loc8_25.13: = call_action (%.loc8_25.4), false [template] +// CHECK:STDOUT: %.loc8_25.14: type = type_of_inst %.loc8_25.13 [template = %.loc8_25.14 (constants.%.f75)] +// CHECK:STDOUT: %.loc8_25.15: @F.%.loc8_25.14 (%.f75) = splice_inst %.loc8_25.13 [template = %.loc8_25.15 (constants.%.82c5)] +// CHECK:STDOUT: %.loc8_3.17: = call_action (constants.%ImplicitAs.generic, constants.%.8bd), false [template] +// CHECK:STDOUT: %.loc8_3.18: type = type_of_inst %.loc8_3.17 [template = %.loc8_3.18 (constants.%.fb0a62.1)] +// CHECK:STDOUT: %.loc8_3.19: @F.%.loc8_3.18 (%.fb0a62.1) = splice_inst %.loc8_3.17 [template = %.loc8_3.19 (constants.%.42a05f.1)] +// CHECK:STDOUT: %.loc8_3.20: = access_member_action %.loc8_3.2, Convert [template] +// CHECK:STDOUT: %.loc8_3.21: type = type_of_inst %.loc8_3.20 [template = %.loc8_3.21 (constants.%.dcfccd.1)] +// CHECK:STDOUT: %.loc8_3.22: @F.%.loc8_3.21 (%.dcfccd.1) = splice_inst %.loc8_3.20 [template = %.loc8_3.22 (constants.%.f8b3eb.1)] +// CHECK:STDOUT: %.loc8_3.23: = compound_member_access_action %.loc8_25.6, %.loc8_3.4 [template] +// CHECK:STDOUT: %.loc8_3.24: type = type_of_inst %.loc8_3.23 [template = %.loc8_3.24 (constants.%.d06)] +// CHECK:STDOUT: %.loc8_3.25: @F.%.loc8_3.24 (%.d06) = splice_inst %.loc8_3.23 [template = %.loc8_3.25 (constants.%.ebe)] +// CHECK:STDOUT: %.loc8_3.26: = call_action (%.loc8_3.6), true [template] +// CHECK:STDOUT: %.loc8_3.27: type = type_of_inst %.loc8_3.26 [template = %.loc8_3.27 (constants.%.ce0)] +// CHECK:STDOUT: %.loc8_3.28: @F.%.loc8_3.27 (%.ce0) = splice_inst %.loc8_3.26 [template = %.loc8_3.28 (constants.%.9de)] +// CHECK:STDOUT: %.loc8_3.29: = refine_inst_action %.loc8_3.9 [template] +// CHECK:STDOUT: %.loc8_3.30: @F.%.loc8_24.12 (%.8bd) = splice_inst %.loc8_3.29 [template = %.loc8_3.30 (constants.%.aee)] +// CHECK:STDOUT: %.loc8_3.31: = convert_to_category_action %.loc8_3.10, element10 [template] +// CHECK:STDOUT: %.loc8_3.32: @F.%.loc8_24.12 (%.8bd) = splice_inst %.loc8_3.31 [template = %.loc8_3.32 (constants.%.d37)] +// CHECK:STDOUT: %.loc8_3.33: = refine_inst_action %v.var [template] +// CHECK:STDOUT: %.loc8_3.34: @F.%.loc8_24.12 (%.8bd) = splice_inst %.loc8_3.33 [template = %.loc8_3.34 (constants.%.200)] +// CHECK:STDOUT: %.loc8_3.35: = compound_member_access_action %.loc8_3.12, constants.%assoc0.ae8 [template] +// CHECK:STDOUT: %.loc8_3.36: type = type_of_inst %.loc8_3.35 [template = %.loc8_3.36 (constants.%.6a6)] +// CHECK:STDOUT: %.loc8_3.37: @F.%.loc8_3.36 (%.6a6) = splice_inst %.loc8_3.35 [template = %.loc8_3.37 (constants.%.cdc)] +// CHECK:STDOUT: %.loc8_3.38: = call_action (%.loc8_3.14), true [template] +// CHECK:STDOUT: %.loc8_3.39: type = type_of_inst %.loc8_3.38 [template = %.loc8_3.39 (constants.%.5e7)] +// CHECK:STDOUT: %.loc8_3.40: @F.%.loc8_3.39 (%.5e7) = splice_inst %.loc8_3.38 [template = %.loc8_3.40 (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.11 (%.8bd) = var_storage %v.var_patt.loc8_3.1 +// CHECK:STDOUT: %v.var: ref @F.%.loc8_24.12 (%.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.4 [template = %.loc8_24.11 (constants.%.8bd)] { +// CHECK:STDOUT: %.loc8_25.2: %DefaultOrUnformed.type = splice_inst %.loc8_25.8 [template = %.loc8_25.9 (constants.%.92d)] +// CHECK:STDOUT: %.loc8_25.3: type = type_of_inst %.loc8_25.10 [template = %.loc8_25.11 (constants.%.177)] +// CHECK:STDOUT: %.loc8_25.4: @F.%.loc8_25.11 (%.177) = splice_inst %.loc8_25.10 [template = %.loc8_25.12 (constants.%.f6b)] +// CHECK:STDOUT: %.loc8_25.5: type = type_of_inst %.loc8_25.13 [template = %.loc8_25.14 (constants.%.f75)] +// CHECK:STDOUT: %.loc8_25.6: @F.%.loc8_25.14 (%.f75) = splice_inst %.loc8_25.13 [template = %.loc8_25.15 (constants.%.82c5)] +// CHECK:STDOUT: %.loc8_3.1: type = type_of_inst %.loc8_3.17 [template = %.loc8_3.18 (constants.%.fb0a62.1)] +// CHECK:STDOUT: %.loc8_3.2: @F.%.loc8_3.18 (%.fb0a62.1) = splice_inst %.loc8_3.17 [template = %.loc8_3.19 (constants.%.42a05f.1)] +// CHECK:STDOUT: %.loc8_3.3: type = type_of_inst %.loc8_3.20 [template = %.loc8_3.21 (constants.%.dcfccd.1)] +// CHECK:STDOUT: %.loc8_3.4: @F.%.loc8_3.21 (%.dcfccd.1) = splice_inst %.loc8_3.20 [template = %.loc8_3.22 (constants.%.f8b3eb.1)] +// CHECK:STDOUT: %.loc8_3.5: type = type_of_inst %.loc8_3.23 [template = %.loc8_3.24 (constants.%.d06)] +// CHECK:STDOUT: %.loc8_3.6: @F.%.loc8_3.24 (%.d06) = splice_inst %.loc8_3.23 [template = %.loc8_3.25 (constants.%.ebe)] +// CHECK:STDOUT: %.loc8_3.7: type = type_of_inst %.loc8_3.26 [template = %.loc8_3.27 (constants.%.ce0)] +// CHECK:STDOUT: %.loc8_3.8: @F.%.loc8_3.27 (%.ce0) = splice_inst %.loc8_3.26 [template = %.loc8_3.28 (constants.%.9de)] +// CHECK:STDOUT: %.loc8_3.9: @F.%.loc8_24.12 (%.8bd) = converted %.loc8_25.6, %.loc8_3.8 [template = %.loc8_3.28 (constants.%.9de)] +// CHECK:STDOUT: %.loc8_3.10: @F.%.loc8_24.12 (%.8bd) = splice_inst %.loc8_3.29 [template = %.loc8_3.30 (constants.%.aee)] +// CHECK:STDOUT: %.loc8_3.11: @F.%.loc8_24.12 (%.8bd) = splice_inst %.loc8_3.31 [template = %.loc8_3.32 (constants.%.d37)] +// CHECK:STDOUT: assign %v.var, %.loc8_3.11 +// CHECK:STDOUT: %.loc8_24.1: type = splice_block %.loc8_24.5 [template = %.loc8_24.12 (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: 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: %.loc8_24.2: type = splice_inst %.loc8_24.6 [template = %.loc8_24.7 (constants.%.4a6)] +// CHECK:STDOUT: %.loc8_24.3: type = type_of_inst %.loc8_24.8 [template = %.loc8_24.9 (constants.%.52a)] +// CHECK:STDOUT: %.loc8_24.4: @F.%.loc8_24.9 (%.52a) = splice_inst %.loc8_24.8 [template = %.loc8_24.10 (constants.%.2a3)] +// CHECK:STDOUT: %.loc8_24.5: type = splice_inst %.loc8_24.11 [template = %.loc8_24.12 (constants.%.8bd)] // CHECK:STDOUT: } -// CHECK:STDOUT: %v: ref @F.%.loc8_24.11 (%.8bd) = wrapper_binding v, %v.var +// CHECK:STDOUT: %v: ref @F.%.loc8_24.12 (%.8bd) = wrapper_binding v, %v.var // CHECK:STDOUT: name_binding_decl { // 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.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: %.loc8_3.12: @F.%.loc8_24.12 (%.8bd) = splice_inst %.loc8_3.33 [template = %.loc8_3.34 (constants.%.200)] +// CHECK:STDOUT: %.loc8_3.13: type = type_of_inst %.loc8_3.35 [template = %.loc8_3.36 (constants.%.6a6)] +// CHECK:STDOUT: %.loc8_3.14: @F.%.loc8_3.36 (%.6a6) = splice_inst %.loc8_3.35 [template = %.loc8_3.37 (constants.%.cdc)] +// CHECK:STDOUT: %.loc8_3.15: type = type_of_inst %.loc8_3.38 [template = %.loc8_3.39 (constants.%.5e7)] +// CHECK:STDOUT: %.loc8_3.16: @F.%.loc8_3.39 (%.5e7) = splice_inst %.loc8_3.38 [template = %.loc8_3.40 (constants.%.993)] // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: } @@ -332,51 +350,51 @@ fn G() { // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete.loc7 => constants.%complete_type // CHECK:STDOUT: %.loc8_23.2 => constants.%X -// 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: %.loc8_24.6 => constants.%inst.specific_inst.94c +// CHECK:STDOUT: %.loc8_24.7 => constants.%X +// CHECK:STDOUT: %.loc8_24.8 => constants.%inst.splice_block.5af +// CHECK:STDOUT: %.loc8_24.9 => type +// CHECK:STDOUT: %.loc8_24.10 => constants.%S +// CHECK:STDOUT: %.loc8_24.11 => constants.%inst.splice_block.c1e +// CHECK:STDOUT: %.loc8_24.12 => 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.5 => constants.%.e53 +// CHECK:STDOUT: %.loc8_25.7 => 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.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.57b -// CHECK:STDOUT: %.loc8_3.30 => -// CHECK:STDOUT: %.loc8_3.31 => invalid -// CHECK:STDOUT: %.loc8_3.32 => constants.%inst.splice_block.8eb -// CHECK:STDOUT: %.loc8_3.33 => constants.%empty_tuple.type +// CHECK:STDOUT: %.loc8_25.8 => constants.%inst.specific_inst.15d +// CHECK:STDOUT: %.loc8_25.9 => constants.%DefaultOrUnformed.facet.ba3 +// CHECK:STDOUT: %.loc8_25.10 => constants.%inst.splice_block.9d9 +// CHECK:STDOUT: %.loc8_25.11 => constants.%.805 +// CHECK:STDOUT: %.loc8_25.12 => constants.%T.as_type.as.DefaultOrUnformed.impl.Op.83d +// CHECK:STDOUT: %.loc8_25.13 => constants.%inst.splice_block.7e5 +// CHECK:STDOUT: %.loc8_25.14 => constants.%S +// CHECK:STDOUT: %.loc8_25.15 => invalid +// CHECK:STDOUT: %.loc8_3.17 => constants.%.d80 +// CHECK:STDOUT: %.loc8_3.18 => constants.%.fb0a62.2 +// CHECK:STDOUT: %.loc8_3.19 => constants.%.42a05f.2 +// CHECK:STDOUT: %.loc8_3.20 => constants.%.126 +// CHECK:STDOUT: %.loc8_3.21 => constants.%.dcfccd.2 +// CHECK:STDOUT: %.loc8_3.22 => constants.%.f8b3eb.2 +// CHECK:STDOUT: %.loc8_3.23 => constants.%.609 +// CHECK:STDOUT: %.loc8_3.24 => constants.%.b7f +// CHECK:STDOUT: %.loc8_3.25 => constants.%.c5b +// CHECK:STDOUT: %.loc8_3.26 => constants.%.ee1 +// CHECK:STDOUT: %.loc8_3.27 => constants.%.fb6 +// CHECK:STDOUT: %.loc8_3.28 => constants.%.904 +// CHECK:STDOUT: %.loc8_3.29 => constants.%.3aa +// CHECK:STDOUT: %.loc8_3.30 => constants.%.443 +// CHECK:STDOUT: %.loc8_3.31 => constants.%.00d +// CHECK:STDOUT: %.loc8_3.32 => constants.%.9c0 +// CHECK:STDOUT: %.loc8_3.33 => constants.%inst.specific_inst.54a // CHECK:STDOUT: %.loc8_3.34 => invalid +// CHECK:STDOUT: %.loc8_3.35 => constants.%inst.splice_block.57b +// CHECK:STDOUT: %.loc8_3.36 => +// CHECK:STDOUT: %.loc8_3.37 => invalid +// CHECK:STDOUT: %.loc8_3.38 => constants.%inst.splice_block.8eb +// CHECK:STDOUT: %.loc8_3.39 => constants.%empty_tuple.type +// CHECK:STDOUT: %.loc8_3.40 => invalid // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/lower/function_context.cpp b/toolchain/lower/function_context.cpp index d32a99ca2267..273b04574531 100644 --- a/toolchain/lower/function_context.cpp +++ b/toolchain/lower/function_context.cpp @@ -119,7 +119,7 @@ static auto LowerInstHelper(FunctionContext& context, SemIR::InstId inst_id, // in `requires`-style overloads. auto FunctionContext::LowerInst(SemIR::InstId inst_id) -> void { // Skip over constants. `FileContext::GetConstant` lowers them as needed. - if (sem_ir().constant_values().Get(inst_id).is_constant()) { + if (IsConstant(inst_id)) { return; } @@ -168,6 +168,12 @@ auto FunctionContext::GetBlockArg(SemIR::InstBlockId block_id, TypeInFile type) return phi; } +auto FunctionContext::IsConstant(SemIR::InstId inst_id) -> bool { + return GetConstantValueInSpecific(specific_sem_ir(), specific_id_, sem_ir(), + inst_id) + .second.is_constant(); +} + auto FunctionContext::GetValue(SemIR::InstId inst_id) -> llvm::Value* { // All builtins are types, with the same empty lowered value. if (SemIR::IsSingletonInstId(inst_id)) { @@ -275,7 +281,7 @@ auto FunctionContext::InitializeStorage(TypeInFile type, SemIR::InstId dest_id, case SemIR::InitRepr::None: break; case SemIR::InitRepr::InPlace: - if (sem_ir().constant_values().Get(source_id).is_constant()) { + if (IsConstant(source_id)) { // When initializing from a constant, emission of the source doesn't // initialize the destination. Copy the constant value instead. // TODO: If the type is small, emit a store rather than a memcpy. diff --git a/toolchain/lower/function_context.h b/toolchain/lower/function_context.h index 73017125c0c6..e04304475b52 100644 --- a/toolchain/lower/function_context.h +++ b/toolchain/lower/function_context.h @@ -109,6 +109,12 @@ class FunctionContext { auto GetBlockArg(SemIR::InstBlockId block_id, TypeInFile type) -> llvm::PHINode*; + // Returns whether the given instruction is treated as a constant in this + // function. For template-dependent instructions this requires looking in the + // specific, as we do not discover whether they are actually constant until + // instantiation. + auto IsConstant(SemIR::InstId) -> bool; + // Returns a value for the given instruction. auto GetValue(SemIR::InstId inst_id) -> llvm::Value*; diff --git a/toolchain/lower/handle.cpp b/toolchain/lower/handle.cpp index a6b6ec8b77db..71fd95bf334f 100644 --- a/toolchain/lower/handle.cpp +++ b/toolchain/lower/handle.cpp @@ -266,7 +266,10 @@ auto HandleInst(FunctionContext& context, SemIR::InstId /*inst_id*/, auto HandleInst(FunctionContext& context, SemIR::InstId /*inst_id*/, SemIR::ReturnExpr inst) -> void { - auto expr_cat = SemIR::GetExprCategory(context.sem_ir(), inst.expr_id); + auto expr_cat = + SemIR::GetExprCategory(context.sem_ir(), inst.expr_id, + &context.specific_sem_ir(), context.specific_id()); + context.AddEnumToCurrentFingerprint(expr_cat); switch (expr_cat) { case SemIR::ExprCategory::EphemeralRef: case SemIR::ExprCategory::DurableRef: @@ -287,7 +290,8 @@ auto HandleInst(FunctionContext& context, SemIR::InstId /*inst_id*/, case SemIR::ExprCategory::Error: case SemIR::ExprCategory::Pattern: case SemIR::ExprCategory::Dependent: - CARBON_FATAL("Unexpected category for `return` expression"); + CARBON_FATAL("Unexpected category {0} for `return` expression {1}", + expr_cat, context.sem_ir().insts().Get(inst.expr_id)); } auto result_type = context.GetTypeIdOfInst(inst.expr_id); @@ -362,11 +366,26 @@ auto HandleInst(FunctionContext& context, SemIR::InstId inst_id, context.SetLocal(inst_id, context.GetValue(inst.result_id)); } -auto HandleInst(FunctionContext& /*context*/, SemIR::InstId /*inst_id*/, - SemIR::SpliceInst /*inst*/) -> void { - // TODO: Get the constant value of the spliced instruction from the current - // specific, and lower the instruction in that constant value. - CARBON_FATAL("Template lowering not implemented yet"); +auto HandleInst(FunctionContext& context, SemIR::InstId inst_id, + SemIR::SpliceInst inst) -> void { + auto [inst_ir, inst_value_id] = GetConstantValueInSpecific( + context.specific_sem_ir(), context.specific_id(), context.sem_ir(), + inst.inst_id); + auto inst_value = + inst_ir->constant_values().GetInstAs(inst_value_id); + if (inst_ir == &context.sem_ir()) { + // Easy case: same file. Just emit the spliced instruction. + context.LowerInst(inst_value.inst_id); + context.SetLocal(inst_id, context.GetValue(inst_value.inst_id)); + } else { + // TODO: We don't yet have support for cross-file templates at all. Lowering + // the result here would mostly just require that we switch the `sem_ir` on + // the `FunctionContext` to instead refer to the `specific_sem_ir`, but we + // would also need to handle references from the instantiated instructions + // back to the original ones, and we don't even know how to represent those + // references yet. + CARBON_FATAL("Cross-file template lowering not implemented yet"); + } } auto HandleInst(FunctionContext& context, SemIR::InstId inst_id, diff --git a/toolchain/lower/handle_call.cpp b/toolchain/lower/handle_call.cpp index a5722af833ae..fd085f5b57c5 100644 --- a/toolchain/lower/handle_call.cpp +++ b/toolchain/lower/handle_call.cpp @@ -692,8 +692,8 @@ auto HandleInst(FunctionContext& context, SemIR::InstId inst_id, // list. FunctionContext::InstInFile callee = {.file = &context.sem_ir(), .inst_id = inst.callee_id}; - if (auto bound_method = context.sem_ir().insts().TryGetAs( - callee.inst_id)) { + if (auto bound_method = SemIR::TryGetCalleeAsBoundMethod( + context.sem_ir(), callee.inst_id, SemIR::SpecificId::None)) { callee.inst_id = bound_method->function_decl_id; } @@ -710,7 +710,9 @@ auto HandleInst(FunctionContext& context, SemIR::InstId inst_id, callee.inst_id); callee.file = const_file; callee.inst_id = const_file->constant_values().GetInstIdIfValid(const_id); - CARBON_CHECK(callee.inst_id.has_value()); + CARBON_CHECK(callee.inst_id.has_value(), + "Missing callee lowering call to {0}", + context.sem_ir().insts().Get(inst.callee_id)); } auto callee_function = diff --git a/toolchain/lower/testdata/template/operator.carbon b/toolchain/lower/testdata/template/operator.carbon new file mode 100644 index 000000000000..7b6e01cdc0f8 --- /dev/null +++ b/toolchain/lower/testdata/template/operator.carbon @@ -0,0 +1,237 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/full.carbon +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/lower/testdata/template/operator.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/lower/testdata/template/operator.carbon + +// --- unary.carbon +library "[[@TEST_NAME]]"; + +fn Negate[template T: type](a: T) -> T { + return -a; +} + +fn CallNegate(a: i32) -> i32 { return Negate(a); } + +// --- binary.carbon +library "[[@TEST_NAME]]"; + +fn Add[template T: type](a: T, b: T) -> T { + return a + b; +} + +fn CallAdd(a: i32, b: i32) -> i32 { return Add(a, b); } + +// --- chained.carbon +library "[[@TEST_NAME]]"; + +fn Polynomial[template T: type](n: T) -> T { + return 3 * n * n + 5 * n - 2; +} + +fn CallPolynomial(n: i32) -> i32 { return Polynomial(n); } + +// CHECK:STDOUT: ; --- +// CHECK:STDOUT: ; ModuleID = 'unary.carbon' +// CHECK:STDOUT: source_filename = "unary.carbon" +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define i32 @_CCallNegate.Main(i32 %a) #0 !dbg !4 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: %Negate.call = call i32 @_CNegate.Main.84588f41d61dafba(i32 %a), !dbg !10 +// CHECK:STDOUT: ret i32 %Negate.call, !dbg !11 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i32 @_CNegate.Main.84588f41d61dafba(i32 %a) #0 !dbg !12 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: %Int.as.Negate.impl.Op.call = sub i32 0, %a, !dbg !15 +// CHECK:STDOUT: %From.as_type.as.ImplicitAs.impl.Convert.call = call i32 @"_CConvert.45e1f8de18643ddf:ImplicitAs.0bc6489996802dd4.Core.bb469f8924cce044"(i32 %Int.as.Negate.impl.Op.call), !dbg !16 +// CHECK:STDOUT: ret i32 %From.as_type.as.ImplicitAs.impl.Convert.call, !dbg !16 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.45e1f8de18643ddf:ImplicitAs.0bc6489996802dd4.Core.bb469f8924cce044"(i32 %self) #0 !dbg !17 { +// CHECK:STDOUT: %1 = call i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self), !dbg !21 +// CHECK:STDOUT: ret i32 %1, !dbg !22 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self) #0 !dbg !23 { +// CHECK:STDOUT: ret i32 %self, !dbg !26 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: attributes #0 = { nounwind } +// CHECK:STDOUT: +// CHECK:STDOUT: !llvm.dbg.cu = !{!0} +// CHECK:STDOUT: !llvm.module.flags = !{!2, !3} +// CHECK:STDOUT: +// CHECK:STDOUT: !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "carbon", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug) +// CHECK:STDOUT: !1 = !DIFile(filename: "unary.carbon", directory: "") +// CHECK:STDOUT: !2 = !{i32 7, !"Dwarf Version", i32 5} +// CHECK:STDOUT: !3 = !{i32 2, !"Debug Info Version", i32 3} +// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "CallNegate", linkageName: "_CCallNegate.Main", scope: null, file: !1, line: 7, type: !5, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !8) +// CHECK:STDOUT: !5 = !DISubroutineType(types: !6) +// CHECK:STDOUT: !6 = !{!7, !7} +// CHECK:STDOUT: !7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +// CHECK:STDOUT: !8 = !{!9} +// CHECK:STDOUT: !9 = !DILocalVariable(arg: 1, scope: !4, type: !7) +// CHECK:STDOUT: !10 = !DILocation(line: 7, column: 39, scope: !4) +// CHECK:STDOUT: !11 = !DILocation(line: 7, column: 32, scope: !4) +// CHECK:STDOUT: !12 = distinct !DISubprogram(name: "Negate", linkageName: "_CNegate.Main.84588f41d61dafba", scope: null, file: !1, line: 3, type: !5, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !13) +// CHECK:STDOUT: !13 = !{!14} +// CHECK:STDOUT: !14 = !DILocalVariable(arg: 1, scope: !12, type: !7) +// CHECK:STDOUT: !15 = !DILocation(line: 4, column: 10, scope: !12) +// CHECK:STDOUT: !16 = !DILocation(line: 4, column: 3, scope: !12) +// CHECK:STDOUT: !17 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.45e1f8de18643ddf:ImplicitAs.0bc6489996802dd4.Core.bb469f8924cce044", scope: null, file: !18, line: 64, type: !5, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !19) +// CHECK:STDOUT: !18 = !DIFile(filename: "{{.*}}/prelude/types/int.carbon", directory: "") +// CHECK:STDOUT: !19 = !{!20} +// CHECK:STDOUT: !20 = !DILocalVariable(arg: 1, scope: !17, type: !7) +// CHECK:STDOUT: !21 = !DILocation(line: 66, column: 17, scope: !17) +// CHECK:STDOUT: !22 = !DILocation(line: 66, column: 5, scope: !17) +// CHECK:STDOUT: !23 = distinct !DISubprogram(name: "AsInt", linkageName: "_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8", scope: null, file: !18, line: 59, type: !5, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !24) +// CHECK:STDOUT: !24 = !{!25} +// CHECK:STDOUT: !25 = !DILocalVariable(arg: 1, scope: !23, type: !7) +// CHECK:STDOUT: !26 = !DILocation(line: 59, column: 28, scope: !23) +// CHECK:STDOUT: +// CHECK:STDOUT: ; --- +// CHECK:STDOUT: ; ModuleID = 'binary.carbon' +// CHECK:STDOUT: source_filename = "binary.carbon" +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define i32 @_CCallAdd.Main(i32 %a, i32 %b) #0 !dbg !4 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: %Add.call = call i32 @_CAdd.Main.84588f41d61dafba(i32 %a, i32 %b), !dbg !11 +// CHECK:STDOUT: ret i32 %Add.call, !dbg !12 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i32 @_CAdd.Main.84588f41d61dafba(i32 %a, i32 %b) #0 !dbg !13 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %a, %b, !dbg !17 +// CHECK:STDOUT: %From.as_type.as.ImplicitAs.impl.Convert.call = call i32 @"_CConvert.45e1f8de18643ddf:ImplicitAs.0bc6489996802dd4.Core.bb469f8924cce044"(i32 %Int.as.AddWith.impl.Op.call), !dbg !18 +// CHECK:STDOUT: ret i32 %From.as_type.as.ImplicitAs.impl.Convert.call, !dbg !18 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.45e1f8de18643ddf:ImplicitAs.0bc6489996802dd4.Core.bb469f8924cce044"(i32 %self) #0 !dbg !19 { +// CHECK:STDOUT: %1 = call i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self), !dbg !25 +// CHECK:STDOUT: ret i32 %1, !dbg !26 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self) #0 !dbg !27 { +// CHECK:STDOUT: ret i32 %self, !dbg !30 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: attributes #0 = { nounwind } +// CHECK:STDOUT: +// CHECK:STDOUT: !llvm.dbg.cu = !{!0} +// CHECK:STDOUT: !llvm.module.flags = !{!2, !3} +// CHECK:STDOUT: +// CHECK:STDOUT: !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "carbon", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug) +// CHECK:STDOUT: !1 = !DIFile(filename: "binary.carbon", directory: "") +// CHECK:STDOUT: !2 = !{i32 7, !"Dwarf Version", i32 5} +// CHECK:STDOUT: !3 = !{i32 2, !"Debug Info Version", i32 3} +// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "CallAdd", linkageName: "_CCallAdd.Main", scope: null, file: !1, line: 7, type: !5, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !8) +// CHECK:STDOUT: !5 = !DISubroutineType(types: !6) +// CHECK:STDOUT: !6 = !{!7, !7, !7} +// CHECK:STDOUT: !7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +// CHECK:STDOUT: !8 = !{!9, !10} +// CHECK:STDOUT: !9 = !DILocalVariable(arg: 1, scope: !4, type: !7) +// CHECK:STDOUT: !10 = !DILocalVariable(arg: 2, scope: !4, type: !7) +// CHECK:STDOUT: !11 = !DILocation(line: 7, column: 44, scope: !4) +// CHECK:STDOUT: !12 = !DILocation(line: 7, column: 37, scope: !4) +// CHECK:STDOUT: !13 = distinct !DISubprogram(name: "Add", linkageName: "_CAdd.Main.84588f41d61dafba", scope: null, file: !1, line: 3, type: !5, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !14) +// CHECK:STDOUT: !14 = !{!15, !16} +// CHECK:STDOUT: !15 = !DILocalVariable(arg: 1, scope: !13, type: !7) +// CHECK:STDOUT: !16 = !DILocalVariable(arg: 2, scope: !13, type: !7) +// CHECK:STDOUT: !17 = !DILocation(line: 4, column: 10, scope: !13) +// CHECK:STDOUT: !18 = !DILocation(line: 4, column: 3, scope: !13) +// CHECK:STDOUT: !19 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.45e1f8de18643ddf:ImplicitAs.0bc6489996802dd4.Core.bb469f8924cce044", scope: null, file: !20, line: 64, type: !21, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !23) +// CHECK:STDOUT: !20 = !DIFile(filename: "{{.*}}/prelude/types/int.carbon", directory: "") +// CHECK:STDOUT: !21 = !DISubroutineType(types: !22) +// CHECK:STDOUT: !22 = !{!7, !7} +// CHECK:STDOUT: !23 = !{!24} +// CHECK:STDOUT: !24 = !DILocalVariable(arg: 1, scope: !19, type: !7) +// CHECK:STDOUT: !25 = !DILocation(line: 66, column: 17, scope: !19) +// CHECK:STDOUT: !26 = !DILocation(line: 66, column: 5, scope: !19) +// CHECK:STDOUT: !27 = distinct !DISubprogram(name: "AsInt", linkageName: "_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8", scope: null, file: !20, line: 59, type: !21, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !28) +// CHECK:STDOUT: !28 = !{!29} +// CHECK:STDOUT: !29 = !DILocalVariable(arg: 1, scope: !27, type: !7) +// CHECK:STDOUT: !30 = !DILocation(line: 59, column: 28, scope: !27) +// CHECK:STDOUT: +// CHECK:STDOUT: ; --- +// CHECK:STDOUT: ; ModuleID = 'chained.carbon' +// CHECK:STDOUT: source_filename = "chained.carbon" +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define i32 @_CCallPolynomial.Main(i32 %n) #0 !dbg !4 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: %Polynomial.call = call i32 @_CPolynomial.Main.84588f41d61dafba(i32 %n), !dbg !10 +// CHECK:STDOUT: ret i32 %Polynomial.call, !dbg !11 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i32 @_CPolynomial.Main.84588f41d61dafba(i32 %n) #0 !dbg !12 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: %T.as_type.as.MulWith.impl.Op.call.83a = mul i32 3, %n, !dbg !15 +// CHECK:STDOUT: %Int.as.MulWith.impl.Op.call = mul i32 %T.as_type.as.MulWith.impl.Op.call.83a, %n, !dbg !15 +// CHECK:STDOUT: %T.as_type.as.MulWith.impl.Op.call.958 = mul i32 5, %n, !dbg !16 +// CHECK:STDOUT: %Int.as.AddWith.impl.Op.call = add i32 %Int.as.MulWith.impl.Op.call, %T.as_type.as.MulWith.impl.Op.call.958, !dbg !15 +// CHECK:STDOUT: %Int.as.SubWith.impl.Op.call = sub i32 %Int.as.AddWith.impl.Op.call, 2, !dbg !15 +// CHECK:STDOUT: %From.as_type.as.ImplicitAs.impl.Convert.call = call i32 @"_CConvert.45e1f8de18643ddf:ImplicitAs.0bc6489996802dd4.Core.bb469f8924cce044"(i32 %Int.as.SubWith.impl.Op.call), !dbg !17 +// CHECK:STDOUT: ret i32 %From.as_type.as.ImplicitAs.impl.Convert.call, !dbg !17 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.45e1f8de18643ddf:ImplicitAs.0bc6489996802dd4.Core.bb469f8924cce044"(i32 %self) #0 !dbg !18 { +// CHECK:STDOUT: %1 = call i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self), !dbg !22 +// CHECK:STDOUT: ret i32 %1, !dbg !23 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self) #0 !dbg !24 { +// CHECK:STDOUT: ret i32 %self, !dbg !27 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: attributes #0 = { nounwind } +// CHECK:STDOUT: +// CHECK:STDOUT: !llvm.dbg.cu = !{!0} +// CHECK:STDOUT: !llvm.module.flags = !{!2, !3} +// CHECK:STDOUT: +// CHECK:STDOUT: !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "carbon", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug) +// CHECK:STDOUT: !1 = !DIFile(filename: "chained.carbon", directory: "") +// CHECK:STDOUT: !2 = !{i32 7, !"Dwarf Version", i32 5} +// CHECK:STDOUT: !3 = !{i32 2, !"Debug Info Version", i32 3} +// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "CallPolynomial", linkageName: "_CCallPolynomial.Main", scope: null, file: !1, line: 7, type: !5, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !8) +// CHECK:STDOUT: !5 = !DISubroutineType(types: !6) +// CHECK:STDOUT: !6 = !{!7, !7} +// CHECK:STDOUT: !7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +// CHECK:STDOUT: !8 = !{!9} +// CHECK:STDOUT: !9 = !DILocalVariable(arg: 1, scope: !4, type: !7) +// CHECK:STDOUT: !10 = !DILocation(line: 7, column: 43, scope: !4) +// CHECK:STDOUT: !11 = !DILocation(line: 7, column: 36, scope: !4) +// CHECK:STDOUT: !12 = distinct !DISubprogram(name: "Polynomial", linkageName: "_CPolynomial.Main.84588f41d61dafba", scope: null, file: !1, line: 3, type: !5, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !13) +// CHECK:STDOUT: !13 = !{!14} +// CHECK:STDOUT: !14 = !DILocalVariable(arg: 1, scope: !12, type: !7) +// CHECK:STDOUT: !15 = !DILocation(line: 4, column: 10, scope: !12) +// CHECK:STDOUT: !16 = !DILocation(line: 4, column: 22, scope: !12) +// CHECK:STDOUT: !17 = !DILocation(line: 4, column: 3, scope: !12) +// CHECK:STDOUT: !18 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.45e1f8de18643ddf:ImplicitAs.0bc6489996802dd4.Core.bb469f8924cce044", scope: null, file: !19, line: 64, type: !5, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !20) +// CHECK:STDOUT: !19 = !DIFile(filename: "{{.*}}/prelude/types/int.carbon", directory: "") +// CHECK:STDOUT: !20 = !{!21} +// CHECK:STDOUT: !21 = !DILocalVariable(arg: 1, scope: !18, type: !7) +// CHECK:STDOUT: !22 = !DILocation(line: 66, column: 17, scope: !18) +// CHECK:STDOUT: !23 = !DILocation(line: 66, column: 5, scope: !18) +// CHECK:STDOUT: !24 = distinct !DISubprogram(name: "AsInt", linkageName: "_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8", scope: null, file: !19, line: 59, type: !5, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !25) +// CHECK:STDOUT: !25 = !{!26} +// CHECK:STDOUT: !26 = !DILocalVariable(arg: 1, scope: !24, type: !7) +// CHECK:STDOUT: !27 = !DILocation(line: 59, column: 28, scope: !24) +// CHECK:STDOUT: diff --git a/toolchain/sem_ir/expr_info.cpp b/toolchain/sem_ir/expr_info.cpp index c3362f816c5b..4bf9b4cc4f9b 100644 --- a/toolchain/sem_ir/expr_info.cpp +++ b/toolchain/sem_ir/expr_info.cpp @@ -29,7 +29,8 @@ struct ExprCategoryResult { // Returns the expression category of `inst_id`, and the ID of the innermost // inst visited while determining that category. -static auto GetExprCategoryImpl(const File* ir, InstId inst_id) +static auto GetExprCategoryImpl(const File* ir, InstId inst_id, + const File* specific_ir, SpecificId specific_id) -> ExprCategoryResult { // The overall expression category if the current instruction is a value // expression. @@ -58,7 +59,11 @@ static auto GetExprCategoryImpl(const File* ir, InstId inst_id) inst_id = import_ir_inst.inst_id(); return std::nullopt; } else if constexpr (std::same_as) { - auto callee = GetCallee(*ir, inst.callee_id); + // TODO: Handle the case where the specific is from a different file. + // `GetCallee` doesn't support that case currently. + auto callee = + GetCallee(*ir, inst.callee_id, + ir == specific_ir ? specific_id : SpecificId::None); CARBON_KIND_SWITCH(callee) { case CARBON_KIND(SemIR::CalleeError _): { return ExprCategory::Error; @@ -95,11 +100,27 @@ static auto GetExprCategoryImpl(const File* ir, InstId inst_id) } } } else if constexpr (std::same_as) { + // Switch to looking at the inner instruction and its specific, which is + // known to be from the current IR. 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. + specific_id = inst.specific_id; + specific_ir = ir; return std::nullopt; } else if constexpr (std::same_as) { + auto [inst_value_ir, inst_value_const_id] = GetConstantValueInSpecific( + *specific_ir, specific_id, *ir, inst.inst_id); + if (inst_value_const_id.is_concrete()) { + // If we can pull a concrete inst out of the specific, then switch to + // computing the category of that inst. + ir = inst_value_ir; + inst_id = ir->constant_values() + .GetInstAs(inst_value_const_id) + .inst_id; + return std::nullopt; + } + + // We don't know which instruction is being spliced. We may still know + // the category based on the action that produces the inst. auto action = ir->insts().Get(inst.inst_id); if (auto* action_category = std::get_if( &action.kind().expr_category())) { @@ -181,13 +202,18 @@ static auto GetExprCategoryImpl(const File* ir, InstId inst_id) } } -auto GetExprCategory(const File& file, InstId inst_id) -> ExprCategory { - return GetExprCategoryImpl(&file, inst_id).category; +auto GetExprCategory(const File& file, InstId inst_id, + const File* specific_file, SpecificId specific_id) + -> ExprCategory { + return GetExprCategoryImpl(&file, inst_id, + specific_file ? specific_file : &file, specific_id) + .category; } auto FindStorageArgForInitializer(const File& sem_ir, InstId init_id, bool allow_transitive) -> InstId { const File* ir = &sem_ir; + auto specific_id = SemIR::SpecificId::None; while (true) { Inst init_untyped = ir->insts().Get(init_id); CARBON_KIND_SWITCH(init_untyped) { @@ -231,6 +257,14 @@ auto FindStorageArgForInitializer(const File& sem_ir, InstId init_id, init_id = splice.result_id; continue; } + case CARBON_KIND(SpecificInst inst): { + if (!allow_transitive) { + return InstId::None; + } + init_id = inst.inst_id; + specific_id = inst.specific_id; + continue; + } case CARBON_KIND(ArrayInit init): { return init.dest_id; } @@ -250,7 +284,8 @@ auto FindStorageArgForInitializer(const File& sem_ir, InstId init_id, return init.dest_id; } case CARBON_KIND(Call call): { - auto callee_function = GetCalleeAsFunction(*ir, call.callee_id); + auto callee_function = + GetCalleeAsFunction(*ir, call.callee_id, specific_id); const auto& function = ir->functions().Get(callee_function.function_id); if (!function.return_form_inst_id.has_value()) { return InstId::None; @@ -311,7 +346,8 @@ static auto GetDecomposedFormKindForType(const File& sem_ir, TypeId type_id) auto GetFormInfo(const File& sem_ir, SemIR::InstId inst_id) -> FormInfo { auto inst = sem_ir.insts().Get(inst_id); - auto [category, inner_inst_id] = GetExprCategoryImpl(&sem_ir, inst_id); + auto [category, inner_inst_id] = + GetExprCategoryImpl(&sem_ir, inst_id, &sem_ir, SpecificId::None); if (inst.type_id() == SemIR::ErrorInst::TypeId) { // TODO: Should `GetExprCategory` do this? category = ExprCategory::Error; diff --git a/toolchain/sem_ir/expr_info.h b/toolchain/sem_ir/expr_info.h index 47a95fe09763..aa5c983e3891 100644 --- a/toolchain/sem_ir/expr_info.h +++ b/toolchain/sem_ir/expr_info.h @@ -14,7 +14,14 @@ namespace Carbon::SemIR { // Returns the expression category for an instruction. -auto GetExprCategory(const File& file, InstId inst_id) -> ExprCategory; +// +// If specified, `specific_file` and `specific_id` identify the specific in +// which the instruction is being queried. `specific_file` can be `file` if the +// specific is from the same file as the instruction, and can be `nullptr` if +// `SpecificId::None` is specified. +auto GetExprCategory(const File& file, InstId inst_id, + const File* specific_file = nullptr, + SpecificId specific_id = SpecificId::None) -> ExprCategory; // Returns whether the given expression category is for a reference expression. inline auto IsRefCategory(ExprCategory cat) -> bool {