Просмотр исходного кода

Ensure a symbolic `final impl` has a definition produced (#6236)

Right now, the impl lookup can both fail to resolve the specific
definition because it's symbolic, and return a "final" constant because
it's a `final impl`. This is adding an instruction to help ensure the
specific is resolved.

The constant evaluation is fully recursive, but I'm not adding a TODO
since that's a known issue with impl lookup in general.
Jon Ross-Perkins 5 месяцев назад
Родитель
Сommit
93a8c5230c
57 измененных файлов с 2917 добавлено и 2292 удалено
  1. 7 0
      toolchain/check/eval_inst.cpp
  2. 1 0
      toolchain/check/generic.cpp
  3. 15 3
      toolchain/check/impl_lookup.cpp
  4. 25 0
      toolchain/check/import_ref.cpp
  5. 9 5
      toolchain/check/testdata/array/init_dependent_bound.carbon
  6. 6 4
      toolchain/check/testdata/basics/raw_sem_ir/builtins.carbon
  7. 211 209
      toolchain/check/testdata/basics/raw_sem_ir/cpp_interop.carbon
  8. 61 61
      toolchain/check/testdata/basics/raw_sem_ir/multifile.carbon
  9. 61 61
      toolchain/check/testdata/basics/raw_sem_ir/multifile_with_textual_ir.carbon
  10. 1562 1548
      toolchain/check/testdata/basics/raw_sem_ir/one_file.carbon
  11. 122 122
      toolchain/check/testdata/basics/raw_sem_ir/one_file_with_textual_ir.carbon
  12. 9 5
      toolchain/check/testdata/class/destroy_calls.carbon
  13. 5 3
      toolchain/check/testdata/class/generic/basic.carbon
  14. 4 2
      toolchain/check/testdata/class/generic/init.carbon
  15. 8 4
      toolchain/check/testdata/class/generic/member_access.carbon
  16. 8 4
      toolchain/check/testdata/class/generic/member_type.carbon
  17. 5 3
      toolchain/check/testdata/class/generic/self.carbon
  18. 16 8
      toolchain/check/testdata/eval/aggregates.carbon
  19. 4 0
      toolchain/check/testdata/facet/convert_facet_value_to_narrowed_facet_type.carbon
  20. 2 0
      toolchain/check/testdata/facet/convert_facet_value_value_to_blanket_impl.carbon
  21. 12 8
      toolchain/check/testdata/facet/convert_facet_value_value_to_generic_facet_value_value.carbon
  22. 63 33
      toolchain/check/testdata/for/actual.carbon
  23. 4 0
      toolchain/check/testdata/function/generic/call.carbon
  24. 6 1
      toolchain/check/testdata/function/generic/deduce.carbon
  25. 5 3
      toolchain/check/testdata/function/generic/indirect_generic_type.carbon
  26. 9 5
      toolchain/check/testdata/function/generic/resolve_used.carbon
  27. 4 2
      toolchain/check/testdata/function/generic/type_param.carbon
  28. 5 3
      toolchain/check/testdata/function/generic/type_param_scope.carbon
  29. 18 10
      toolchain/check/testdata/generic/complete_type.carbon
  30. 5 1
      toolchain/check/testdata/generic/dot_self_symbolic_type.carbon
  31. 5 3
      toolchain/check/testdata/generic/template_dependence.carbon
  32. 8 2
      toolchain/check/testdata/impl/error_recovery.carbon
  33. 4 0
      toolchain/check/testdata/impl/impl_thunk.carbon
  34. 31 25
      toolchain/check/testdata/impl/import_builtin_call.carbon
  35. 37 21
      toolchain/check/testdata/impl/import_self_specific.carbon
  36. 10 4
      toolchain/check/testdata/impl/import_thunk.carbon
  37. 8 4
      toolchain/check/testdata/impl/lookup/generic.carbon
  38. 13 7
      toolchain/check/testdata/impl/lookup/impl_forall.carbon
  39. 28 11
      toolchain/check/testdata/impl/lookup/specialization_with_symbolic_rewrite.carbon
  40. 4 2
      toolchain/check/testdata/interface/as_type_of_type.carbon
  41. 4 1
      toolchain/check/testdata/interface/fail_assoc_const_alias.carbon
  42. 5 3
      toolchain/check/testdata/interface/fail_todo_define_default_fn_out_of_line.carbon
  43. 348 0
      toolchain/check/testdata/interface/final.carbon
  44. 22 10
      toolchain/check/testdata/interface/generic_method.carbon
  45. 5 3
      toolchain/check/testdata/interface/member_lookup.carbon
  46. 3 2
      toolchain/check/type_completion.cpp
  47. 4 4
      toolchain/driver/testdata/stdin.carbon
  48. 2 1
      toolchain/lower/file_context.cpp
  49. 1 0
      toolchain/lower/mangler.cpp
  50. 12 12
      toolchain/lower/testdata/array/iterate.carbon
  51. 9 9
      toolchain/lower/testdata/for/bindings.carbon
  52. 30 30
      toolchain/lower/testdata/for/break_continue.carbon
  53. 30 30
      toolchain/lower/testdata/for/for.carbon
  54. 2 0
      toolchain/sem_ir/inst_kind.def
  55. 1 0
      toolchain/sem_ir/singleton_insts.h
  56. 1 0
      toolchain/sem_ir/type_iterator.cpp
  57. 18 0
      toolchain/sem_ir/typed_insts.h

+ 7 - 0
toolchain/check/eval_inst.cpp

@@ -516,6 +516,13 @@ auto EvalConstantInst(Context& context, SemIR::InstId inst_id,
   return ConstantEvalResult::NewSamePhase(inst);
 }
 
+auto EvalConstantInst(Context& context, SemIR::RequireSpecificDefinition inst)
+    -> ConstantEvalResult {
+  // This can return false, we just need to try it.
+  ResolveSpecificDefinition(context, SemIR::LocId::None, inst.specific_id);
+  return ConstantEvalResult::NewSamePhase(inst);
+}
+
 auto EvalConstantInst(Context& context, SemIR::SpecificConstant inst)
     -> ConstantEvalResult {
   // Pull the constant value out of the specific.

+ 1 - 0
toolchain/check/generic.cpp

@@ -719,6 +719,7 @@ auto ResolveSpecificDefinition(Context& context, SemIR::LocId loc_id,
   if (!specific.definition_block_id.has_value()) {
     // Evaluate the eval block for the definition of the generic.
     auto& generic = context.generics().Get(generic_id);
+    CARBON_CHECK(generic.decl_block_id.has_value(), "missing declaration");
     if (!generic.definition_block_id.has_value()) {
       // The generic is not defined yet.
       return false;

+ 15 - 3
toolchain/check/impl_lookup.cpp

@@ -239,14 +239,15 @@ static auto GetWitnessIdForImpl(Context& context, SemIR::LocId loc_id,
 
   // The self type of the impl must match the type in the query, or this is an
   // `impl T as ...` for some other type `T` and should not be considered.
-  auto deduced_self_const_id = SemIR::GetConstantValueInSpecific(
+  auto noncanonical_deduced_self_const_id = SemIR::GetConstantValueInSpecific(
       context.sem_ir(), specific_id, impl.self_id);
+
   // In a generic `impl forall` the self type can be a FacetAccessType, which
   // will not be the same constant value as a query facet value. We move through
   // to the facet value here, and if the query was a FacetAccessType we did the
   // same there so they still match.
-  deduced_self_const_id =
-      GetCanonicalFacetOrTypeValue(context, deduced_self_const_id);
+  auto deduced_self_const_id =
+      GetCanonicalFacetOrTypeValue(context, noncanonical_deduced_self_const_id);
   if (query_self_const_id != deduced_self_const_id) {
     return EvalImplLookupResult::MakeNone();
   }
@@ -287,6 +288,17 @@ static auto GetWitnessIdForImpl(Context& context, SemIR::LocId loc_id,
 
   LoadImportRef(context, impl.witness_id);
   if (specific_id.has_value()) {
+    // Add an instruction to support requiring an impl definition which may not
+    // otherwise be generated. This is used to resolve dependency chains when
+    // `MakeFinal` is returned without a concrete definition; particularly final
+    // impls with symbolic constants.
+    AddInstInNoBlock(
+        context, loc_id,
+        SemIR::RequireSpecificDefinition{
+            .type_id = GetSingletonType(
+                context, SemIR::RequireSpecificDefinitionType::TypeInstId),
+            .specific_id = specific_id});
+
     // We need a definition of the specific `impl` so we can access its
     // witness.
     ResolveSpecificDefinition(context, loc_id, specific_id);

+ 25 - 0
toolchain/check/import_ref.cpp

@@ -3292,6 +3292,28 @@ static auto TryResolveTypedInst(ImportRefResolver& resolver,
                  .complete_type_inst_id = complete_type_inst_id});
 }
 
+static auto TryResolveTypedInst(ImportRefResolver& resolver,
+                                SemIR::RequireSpecificDefinition inst)
+    -> ResolveResult {
+  CARBON_CHECK(resolver.import_types().GetInstId(inst.type_id) ==
+               SemIR::RequireSpecificDefinitionType::TypeInstId);
+
+  auto specific_data = GetLocalSpecificData(resolver, inst.specific_id);
+
+  if (resolver.HasNewWork()) {
+    return ResolveResult::Retry();
+  }
+
+  auto specific_id =
+      GetOrAddLocalSpecific(resolver, inst.specific_id, specific_data);
+
+  return ResolveResult::Deduplicated<SemIR::RequireSpecificDefinition>(
+      resolver, {.type_id = GetSingletonType(
+                     resolver.local_context(),
+                     SemIR::RequireSpecificDefinitionType::TypeInstId),
+                 .specific_id = specific_id});
+}
+
 static auto TryResolveTypedInst(ImportRefResolver& resolver,
                                 SemIR::ReturnSlotPattern inst,
                                 SemIR::InstId import_inst_id) -> ResolveResult {
@@ -3755,6 +3777,9 @@ static auto TryResolveInstCanonical(ImportRefResolver& resolver,
     case CARBON_KIND(SemIR::RequireImplsDecl inst): {
       return TryResolveTypedInst(resolver, inst);
     }
+    case CARBON_KIND(SemIR::RequireSpecificDefinition inst): {
+      return TryResolveTypedInst(resolver, inst);
+    }
     case CARBON_KIND(SemIR::ReturnSlotPattern inst): {
       return TryResolveTypedInst(resolver, inst, constant_inst_id);
     }

+ 9 - 5
toolchain/check/testdata/array/init_dependent_bound.carbon

@@ -77,6 +77,7 @@ fn H() { G(3); }
 // CHECK:STDOUT:   %Destroy.impl_witness.aa0: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.30f) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.cc4: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.30f) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.44f: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.cc4 = struct_value () [symbolic]
+// CHECK:STDOUT:   %.019: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.30f) [symbolic]
 // CHECK:STDOUT:   %Destroy.facet.49e: %Destroy.type = facet_value %array_type.512, (%Destroy.impl_witness.aa0) [symbolic]
 // CHECK:STDOUT:   %.fb1: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.49e [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.91d: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.44f, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.30f) [symbolic]
@@ -87,10 +88,11 @@ fn H() { G(3); }
 // CHECK:STDOUT:   %array.2e5: %array_type.6f1 = tuple_value () [concrete]
 // CHECK:STDOUT:   %facet_value.cba: %type_where = facet_value %array_type.6f1, () [concrete]
 // CHECK:STDOUT:   %Destroy.impl_witness.dff: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.cba) [concrete]
-// CHECK:STDOUT:   %Destroy.facet.105: %Destroy.type = facet_value %array_type.6f1, (%Destroy.impl_witness.dff) [concrete]
-// CHECK:STDOUT:   %.0c7: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.105 [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.cc8: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.cba) [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.dcd: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.cc8 = struct_value () [concrete]
+// CHECK:STDOUT:   %.793: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.cba) [concrete]
+// CHECK:STDOUT:   %Destroy.facet.105: %Destroy.type = facet_value %array_type.6f1, (%Destroy.impl_witness.dff) [concrete]
+// CHECK:STDOUT:   %.0c7: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.105 [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.bf3: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.dcd, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.cba) [concrete]
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
@@ -108,9 +110,10 @@ fn H() { G(3); }
 // CHECK:STDOUT:   %pattern_type: type = pattern_type %array_type.loc7_22.2 [symbolic = %pattern_type (constants.%pattern_type.b5c)]
 // CHECK:STDOUT:   %array: @G.%array_type.loc7_22.2 (%array_type.512) = tuple_value () [symbolic = %array (constants.%array.8ba)]
 // CHECK:STDOUT:   %facet_value: %type_where = facet_value %array_type.loc7_22.2, () [symbolic = %facet_value (constants.%facet_value.30f)]
+// CHECK:STDOUT:   %.loc7_3.2: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %.loc7_3.2 (constants.%.019)]
 // CHECK:STDOUT:   %Destroy.impl_witness: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.aa0)]
 // CHECK:STDOUT:   %Destroy.facet: %Destroy.type = facet_value %array_type.loc7_22.2, (%Destroy.impl_witness) [symbolic = %Destroy.facet (constants.%Destroy.facet.49e)]
-// CHECK:STDOUT:   %.loc7_3.2: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc7_3.2 (constants.%.fb1)]
+// CHECK:STDOUT:   %.loc7_3.3: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc7_3.3 (constants.%.fb1)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.type (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.cc4)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op: @G.%DestroyT.binding.as_type.as.Destroy.impl.Op.type (%DestroyT.binding.as_type.as.Destroy.impl.Op.type.cc4) = struct_value () [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.44f)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.91d)]
@@ -132,7 +135,7 @@ fn H() { G(3); }
 // CHECK:STDOUT:       %array_type.loc7_22.1: type = array_type %int_0, %T.ref [symbolic = %array_type.loc7_22.2 (constants.%array_type.512)]
 // CHECK:STDOUT:     }
 // CHECK:STDOUT:     %arr: ref @G.%array_type.loc7_22.2 (%array_type.512) = ref_binding arr, %arr.var
-// CHECK:STDOUT:     %impl.elem0: @G.%.loc7_3.2 (%.fb1) = impl_witness_access constants.%Destroy.impl_witness.aa0, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.44f)]
+// CHECK:STDOUT:     %impl.elem0: @G.%.loc7_3.3 (%.fb1) = impl_witness_access constants.%Destroy.impl_witness.aa0, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.44f)]
 // CHECK:STDOUT:     %bound_method.loc7_3.1: <bound method> = bound_method %arr.var, %impl.elem0
 // CHECK:STDOUT:     %specific_fn: <specific function> = specific_function %impl.elem0, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value.30f) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.91d)]
 // CHECK:STDOUT:     %bound_method.loc7_3.2: <bound method> = bound_method %arr.var, %specific_fn
@@ -154,9 +157,10 @@ fn H() { G(3); }
 // CHECK:STDOUT:   %pattern_type => constants.%pattern_type.9c8
 // CHECK:STDOUT:   %array => constants.%array.2e5
 // CHECK:STDOUT:   %facet_value => constants.%facet_value.cba
+// CHECK:STDOUT:   %.loc7_3.2 => constants.%.793
 // CHECK:STDOUT:   %Destroy.impl_witness => constants.%Destroy.impl_witness.dff
 // CHECK:STDOUT:   %Destroy.facet => constants.%Destroy.facet.105
-// CHECK:STDOUT:   %.loc7_3.2 => constants.%.0c7
+// CHECK:STDOUT:   %.loc7_3.3 => constants.%.0c7
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.cc8
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.dcd
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.bf3

+ 6 - 4
toolchain/check/testdata/basics/raw_sem_ir/builtins.carbon

@@ -20,7 +20,7 @@
 // CHECK:STDOUT:   import_ir_insts: {}
 // CHECK:STDOUT:   clang_decls:     {}
 // CHECK:STDOUT:   name_scopes:
-// CHECK:STDOUT:     name_scope0:     {inst: instD, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {}}
+// CHECK:STDOUT:     name_scope0:     {inst: instE, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {}}
 // CHECK:STDOUT:   entity_names:    {}
 // CHECK:STDOUT:   cpp_global_vars: {}
 // CHECK:STDOUT:   functions:       {}
@@ -47,10 +47,11 @@
 // CHECK:STDOUT:     'inst(InstType)':  {kind: InstType, type: type(TypeType)}
 // CHECK:STDOUT:     'inst(IntLiteralType)': {kind: IntLiteralType, type: type(TypeType)}
 // CHECK:STDOUT:     'inst(NamespaceType)': {kind: NamespaceType, type: type(TypeType)}
+// CHECK:STDOUT:     'inst(RequireSpecificDefinitionType)': {kind: RequireSpecificDefinitionType, type: type(TypeType)}
 // CHECK:STDOUT:     'inst(SpecificFunctionType)': {kind: SpecificFunctionType, type: type(TypeType)}
 // CHECK:STDOUT:     'inst(VtableType)': {kind: VtableType, type: type(TypeType)}
 // CHECK:STDOUT:     'inst(WitnessType)': {kind: WitnessType, type: type(TypeType)}
-// CHECK:STDOUT:     instD:           {kind: Namespace, arg0: name_scope0, arg1: inst<none>, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     instE:           {kind: Namespace, arg0: name_scope0, arg1: inst<none>, type: type(inst(NamespaceType))}
 // CHECK:STDOUT:   constant_values:
 // CHECK:STDOUT:     values:
 // CHECK:STDOUT:       'inst(TypeType)':  concrete_constant(inst(TypeType))
@@ -63,10 +64,11 @@
 // CHECK:STDOUT:       'inst(InstType)':  concrete_constant(inst(InstType))
 // CHECK:STDOUT:       'inst(IntLiteralType)': concrete_constant(inst(IntLiteralType))
 // CHECK:STDOUT:       'inst(NamespaceType)': concrete_constant(inst(NamespaceType))
+// CHECK:STDOUT:       'inst(RequireSpecificDefinitionType)': concrete_constant(inst(RequireSpecificDefinitionType))
 // CHECK:STDOUT:       'inst(SpecificFunctionType)': concrete_constant(inst(SpecificFunctionType))
 // CHECK:STDOUT:       'inst(VtableType)': concrete_constant(inst(VtableType))
 // CHECK:STDOUT:       'inst(WitnessType)': concrete_constant(inst(WitnessType))
-// CHECK:STDOUT:       instD:           concrete_constant(instD)
+// CHECK:STDOUT:       instE:           concrete_constant(instE)
 // CHECK:STDOUT:     symbolic_constants: {}
 // CHECK:STDOUT:   inst_blocks:
 // CHECK:STDOUT:     inst_block_empty: {}
@@ -74,5 +76,5 @@
 // CHECK:STDOUT:     imports:         {}
 // CHECK:STDOUT:     global_init:     {}
 // CHECK:STDOUT:     inst_block60000004:
-// CHECK:STDOUT:       0:               instD
+// CHECK:STDOUT:       0:               instE
 // CHECK:STDOUT: ...

+ 211 - 209
toolchain/check/testdata/basics/raw_sem_ir/cpp_interop.carbon

@@ -43,18 +43,18 @@ fn G(x: Cpp.X) {
 // CHECK:STDOUT:     import_ir_inst1: {ir_id: import_ir(Cpp), clang_source_loc_id: clang_source_loc60000001}
 // CHECK:STDOUT:     import_ir_inst2: {ir_id: import_ir(Cpp), clang_source_loc_id: clang_source_loc60000002}
 // CHECK:STDOUT:   clang_decls:
-// CHECK:STDOUT:     clang_decl_id60000000: {key: "<translation unit>", inst_id: inst6000000F}
-// CHECK:STDOUT:     clang_decl_id60000001: {key: "struct X {}", inst_id: inst60000012}
-// CHECK:STDOUT:     clang_decl_id60000002: {key: "X * _Nonnull p", inst_id: inst60000020}
-// CHECK:STDOUT:     clang_decl_id60000003: {key: {decl: "void f(X x = {})", num_params: 0}, inst_id: inst6000002B}
-// CHECK:STDOUT:     clang_decl_id60000004: {key: {decl: "extern void f__carbon_thunk()", num_params: 0}, inst_id: inst6000002E}
-// CHECK:STDOUT:     clang_decl_id60000005: {key: {decl: "void f(X x = {})", num_params: 1}, inst_id: inst60000039}
-// CHECK:STDOUT:     clang_decl_id60000006: {key: {decl: "extern void f__carbon_thunk(X * _Nonnull x)", num_params: 1}, inst_id: inst60000041}
-// CHECK:STDOUT:     clang_decl_id60000007: {key: "X * _Nonnull global", inst_id: inst6000004A}
+// CHECK:STDOUT:     clang_decl_id60000000: {key: "<translation unit>", inst_id: inst60000010}
+// CHECK:STDOUT:     clang_decl_id60000001: {key: "struct X {}", inst_id: inst60000013}
+// CHECK:STDOUT:     clang_decl_id60000002: {key: "X * _Nonnull p", inst_id: inst60000021}
+// CHECK:STDOUT:     clang_decl_id60000003: {key: {decl: "void f(X x = {})", num_params: 0}, inst_id: inst6000002C}
+// CHECK:STDOUT:     clang_decl_id60000004: {key: {decl: "extern void f__carbon_thunk()", num_params: 0}, inst_id: inst6000002F}
+// CHECK:STDOUT:     clang_decl_id60000005: {key: {decl: "void f(X x = {})", num_params: 1}, inst_id: inst6000003A}
+// CHECK:STDOUT:     clang_decl_id60000006: {key: {decl: "extern void f__carbon_thunk(X * _Nonnull x)", num_params: 1}, inst_id: inst60000042}
+// CHECK:STDOUT:     clang_decl_id60000007: {key: "X * _Nonnull global", inst_id: inst6000004B}
 // CHECK:STDOUT:   name_scopes:
-// CHECK:STDOUT:     name_scope0:     {inst: instD, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {name(Cpp): inst6000000F, name0: inst6000001B}}
-// CHECK:STDOUT:     name_scope60000001: {inst: inst6000000F, parent_scope: name_scope0, has_error: false, extended_scopes: [], names: {name2: inst60000012, name3: inst60000028, name4: inst6000004A}}
-// CHECK:STDOUT:     name_scope60000002: {inst: inst60000012, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
+// CHECK:STDOUT:     name_scope0:     {inst: instE, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {name(Cpp): inst60000010, name0: inst6000001C}}
+// CHECK:STDOUT:     name_scope60000001: {inst: inst60000010, parent_scope: name_scope0, has_error: false, extended_scopes: [], names: {name2: inst60000013, name3: inst60000029, name4: inst6000004B}}
+// CHECK:STDOUT:     name_scope60000002: {inst: inst60000013, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
 // CHECK:STDOUT:   entity_names:
 // CHECK:STDOUT:     entity_name60000000: {name: name1, parent_scope: name_scope<none>, index: -1, is_template: 0}
 // CHECK:STDOUT:     entity_name60000001: {name: name1, parent_scope: name_scope<none>, index: -1, is_template: 0}
@@ -69,15 +69,15 @@ fn G(x: Cpp.X) {
 // CHECK:STDOUT:     function60000003: {name: name3, parent_scope: name_scope60000001, call_params_id: inst_block6000000D}
 // CHECK:STDOUT:     function60000004: {name: name6, parent_scope: name_scope60000001, call_params_id: inst_block60000012}
 // CHECK:STDOUT:   classes:
-// CHECK:STDOUT:     class60000000:   {name: name2, parent_scope: name_scope60000001, self_type_id: type(inst60000013), inheritance_kind: Base, is_dynamic: 0, scope_id: name_scope60000002, body_block_id: inst_block6000000A, adapt_id: inst<none>, base_id: inst<none>, complete_type_witness_id: inst60000023, vtable_decl_id: inst<none>}}
+// CHECK:STDOUT:     class60000000:   {name: name2, parent_scope: name_scope60000001, self_type_id: type(inst60000014), inheritance_kind: Base, is_dynamic: 0, scope_id: name_scope60000002, body_block_id: inst_block6000000A, adapt_id: inst<none>, base_id: inst<none>, complete_type_witness_id: inst60000024, vtable_decl_id: inst<none>}}
 // CHECK:STDOUT:   generics:        {}
 // CHECK:STDOUT:   specifics:       {}
 // CHECK:STDOUT:   struct_type_fields:
 // CHECK:STDOUT:     struct_type_fields_empty: {}
 // CHECK:STDOUT:     struct_type_fields60000001:
-// CHECK:STDOUT:       0:               {name_id: name5, type_inst_id: inst6000001E}
+// CHECK:STDOUT:       0:               {name_id: name5, type_inst_id: inst6000001F}
 // CHECK:STDOUT:     struct_type_fields60000002:
-// CHECK:STDOUT:       0:               {name_id: name5, type_inst_id: inst6000001E}
+// CHECK:STDOUT:       0:               {name_id: name5, type_inst_id: inst6000001F}
 // CHECK:STDOUT:   types:
 // CHECK:STDOUT:     'type(TypeType)':
 // CHECK:STDOUT:       value_repr:      {kind: copy, type: type(TypeType)}
@@ -86,31 +86,31 @@ fn G(x: Cpp.X) {
 // CHECK:STDOUT:     'type(inst(NamespaceType))':
 // CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst(NamespaceType))}
 // CHECK:STDOUT:     'type(inst(InstType))':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000011)}
-// CHECK:STDOUT:     'type(inst60000011)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000011)}
-// CHECK:STDOUT:     'type(inst6000001C)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000011)}
-// CHECK:STDOUT:     'type(inst6000001E)':
-// CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst6000001E)}
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000012)}
+// CHECK:STDOUT:     'type(inst60000012)':
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000012)}
+// CHECK:STDOUT:     'type(inst6000001D)':
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000012)}
+// CHECK:STDOUT:     'type(inst6000001F)':
+// CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst6000001F)}
 // CHECK:STDOUT:     'type(inst(WitnessType))':
 // CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     'type(inst60000025)':
-// CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst60000025)}
-// CHECK:STDOUT:     'type(inst60000022)':
-// CHECK:STDOUT:       value_repr:      {kind: pointer, type: type(inst60000025)}
-// CHECK:STDOUT:     'type(inst60000013)':
-// CHECK:STDOUT:       value_repr:      {kind: pointer, type: type(inst60000025)}
-// CHECK:STDOUT:     'type(inst60000027)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000011)}
-// CHECK:STDOUT:     'type(inst6000002C)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000011)}
-// CHECK:STDOUT:     'type(inst6000002F)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000011)}
-// CHECK:STDOUT:     'type(inst6000003A)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000011)}
-// CHECK:STDOUT:     'type(inst60000042)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000011)}
+// CHECK:STDOUT:     'type(inst60000026)':
+// CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst60000026)}
+// CHECK:STDOUT:     'type(inst60000023)':
+// CHECK:STDOUT:       value_repr:      {kind: pointer, type: type(inst60000026)}
+// CHECK:STDOUT:     'type(inst60000014)':
+// CHECK:STDOUT:       value_repr:      {kind: pointer, type: type(inst60000026)}
+// CHECK:STDOUT:     'type(inst60000028)':
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000012)}
+// CHECK:STDOUT:     'type(inst6000002D)':
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000012)}
+// CHECK:STDOUT:     'type(inst60000030)':
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000012)}
+// CHECK:STDOUT:     'type(inst6000003B)':
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000012)}
+// CHECK:STDOUT:     'type(inst60000043)':
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000012)}
 // CHECK:STDOUT:   insts:
 // CHECK:STDOUT:     'inst(TypeType)':  {kind: TypeType, type: type(TypeType)}
 // CHECK:STDOUT:     'inst(AutoType)':  {kind: AutoType, type: type(TypeType)}
@@ -122,82 +122,83 @@ fn G(x: Cpp.X) {
 // CHECK:STDOUT:     'inst(InstType)':  {kind: InstType, type: type(TypeType)}
 // CHECK:STDOUT:     'inst(IntLiteralType)': {kind: IntLiteralType, type: type(TypeType)}
 // CHECK:STDOUT:     'inst(NamespaceType)': {kind: NamespaceType, type: type(TypeType)}
+// CHECK:STDOUT:     'inst(RequireSpecificDefinitionType)': {kind: RequireSpecificDefinitionType, type: type(TypeType)}
 // CHECK:STDOUT:     'inst(SpecificFunctionType)': {kind: SpecificFunctionType, type: type(TypeType)}
 // CHECK:STDOUT:     'inst(VtableType)': {kind: VtableType, type: type(TypeType)}
 // CHECK:STDOUT:     'inst(WitnessType)': {kind: WitnessType, type: type(TypeType)}
-// CHECK:STDOUT:     instD:           {kind: Namespace, arg0: name_scope0, arg1: inst<none>, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     inst6000000E:    {kind: ImportCppDecl}
-// CHECK:STDOUT:     inst6000000F:    {kind: Namespace, arg0: name_scope60000001, arg1: inst6000000E, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     inst60000010:    {kind: NameRef, arg0: name(Cpp), arg1: inst6000000F, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     inst60000011:    {kind: TupleType, arg0: inst_block_empty, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000012:    {kind: ClassDecl, arg0: class60000000, arg1: inst_block<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000013:    {kind: ClassType, arg0: class60000000, arg1: specific<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000014:    {kind: NameRef, arg0: name2, arg1: inst60000012, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000015:    {kind: ValueBinding, arg0: entity_name60000000, arg1: inst60000019, type: type(inst60000013)}
-// CHECK:STDOUT:     inst60000016:    {kind: PatternType, arg0: inst60000013, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000017:    {kind: ValueBindingPattern, arg0: entity_name60000000, type: type(inst60000016)}
-// CHECK:STDOUT:     inst60000018:    {kind: ValueParamPattern, arg0: inst60000017, arg1: call_param0, type: type(inst60000016)}
-// CHECK:STDOUT:     inst60000019:    {kind: ValueParam, arg0: call_param0, arg1: name1, type: type(inst60000013)}
-// CHECK:STDOUT:     inst6000001A:    {kind: SpliceBlock, arg0: inst_block60000004, arg1: inst60000014, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000001B:    {kind: FunctionDecl, arg0: function60000000, arg1: inst_block60000008, type: type(inst6000001C)}
-// CHECK:STDOUT:     inst6000001C:    {kind: FunctionType, arg0: function60000000, arg1: specific<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000001D:    {kind: StructValue, arg0: inst_block_empty, type: type(inst6000001C)}
-// CHECK:STDOUT:     inst6000001E:    {kind: PointerType, arg0: inst60000013, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000001F:    {kind: UnboundElementType, arg0: inst60000013, arg1: inst6000001E, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000020:    {kind: FieldDecl, arg0: name5, arg1: element0, type: type(inst6000001F)}
-// CHECK:STDOUT:     inst60000021:    {kind: CustomLayoutType, arg0: struct_type_fields60000001, arg1: custom_layout60000001, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000022:    {kind: CustomLayoutType, arg0: struct_type_fields60000002, arg1: custom_layout60000001, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000023:    {kind: CompleteTypeWitness, arg0: inst60000021, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     instE:           {kind: Namespace, arg0: name_scope0, arg1: inst<none>, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     inst6000000F:    {kind: ImportCppDecl}
+// CHECK:STDOUT:     inst60000010:    {kind: Namespace, arg0: name_scope60000001, arg1: inst6000000F, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     inst60000011:    {kind: NameRef, arg0: name(Cpp), arg1: inst60000010, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     inst60000012:    {kind: TupleType, arg0: inst_block_empty, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000013:    {kind: ClassDecl, arg0: class60000000, arg1: inst_block<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000014:    {kind: ClassType, arg0: class60000000, arg1: specific<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000015:    {kind: NameRef, arg0: name2, arg1: inst60000013, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000016:    {kind: ValueBinding, arg0: entity_name60000000, arg1: inst6000001A, type: type(inst60000014)}
+// CHECK:STDOUT:     inst60000017:    {kind: PatternType, arg0: inst60000014, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000018:    {kind: ValueBindingPattern, arg0: entity_name60000000, type: type(inst60000017)}
+// CHECK:STDOUT:     inst60000019:    {kind: ValueParamPattern, arg0: inst60000018, arg1: call_param0, type: type(inst60000017)}
+// CHECK:STDOUT:     inst6000001A:    {kind: ValueParam, arg0: call_param0, arg1: name1, type: type(inst60000014)}
+// CHECK:STDOUT:     inst6000001B:    {kind: SpliceBlock, arg0: inst_block60000004, arg1: inst60000015, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000001C:    {kind: FunctionDecl, arg0: function60000000, arg1: inst_block60000008, type: type(inst6000001D)}
+// CHECK:STDOUT:     inst6000001D:    {kind: FunctionType, arg0: function60000000, arg1: specific<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000001E:    {kind: StructValue, arg0: inst_block_empty, type: type(inst6000001D)}
+// CHECK:STDOUT:     inst6000001F:    {kind: PointerType, arg0: inst60000014, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000020:    {kind: UnboundElementType, arg0: inst60000014, arg1: inst6000001F, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000021:    {kind: FieldDecl, arg0: name5, arg1: element0, type: type(inst60000020)}
+// CHECK:STDOUT:     inst60000022:    {kind: CustomLayoutType, arg0: struct_type_fields60000001, arg1: custom_layout60000001, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000023:    {kind: CustomLayoutType, arg0: struct_type_fields60000002, arg1: custom_layout60000001, type: type(TypeType)}
 // CHECK:STDOUT:     inst60000024:    {kind: CompleteTypeWitness, arg0: inst60000022, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst60000025:    {kind: PointerType, arg0: inst60000022, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000026:    {kind: NameRef, arg0: name(Cpp), arg1: inst6000000F, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     inst60000027:    {kind: CppOverloadSetType, arg0: cpp_overload_set60000000, arg1: specific<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000028:    {kind: CppOverloadSetValue, arg0: cpp_overload_set60000000, type: type(inst60000027)}
-// CHECK:STDOUT:     inst60000029:    {kind: CppOverloadSetValue, arg0: cpp_overload_set60000000, type: type(inst60000027)}
-// CHECK:STDOUT:     inst6000002A:    {kind: NameRef, arg0: name3, arg1: inst60000028, type: type(inst60000027)}
-// CHECK:STDOUT:     inst6000002B:    {kind: FunctionDecl, arg0: function60000001, arg1: inst_block_empty, type: type(inst6000002C)}
-// CHECK:STDOUT:     inst6000002C:    {kind: FunctionType, arg0: function60000001, arg1: specific<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000002D:    {kind: StructValue, arg0: inst_block_empty, type: type(inst6000002C)}
-// CHECK:STDOUT:     inst6000002E:    {kind: FunctionDecl, arg0: function60000002, arg1: inst_block_empty, type: type(inst6000002F)}
-// CHECK:STDOUT:     inst6000002F:    {kind: FunctionType, arg0: function60000002, arg1: specific<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000030:    {kind: StructValue, arg0: inst_block_empty, type: type(inst6000002F)}
-// CHECK:STDOUT:     inst60000031:    {kind: Call, arg0: inst6000002E, arg1: inst_block_empty, type: type(inst60000011)}
-// CHECK:STDOUT:     inst60000032:    {kind: NameRef, arg0: name(Cpp), arg1: inst6000000F, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     inst60000033:    {kind: NameRef, arg0: name3, arg1: inst60000028, type: type(inst60000027)}
-// CHECK:STDOUT:     inst60000034:    {kind: NameRef, arg0: name1, arg1: inst60000015, type: type(inst60000013)}
-// CHECK:STDOUT:     inst60000035:    {kind: ValueBinding, arg0: entity_name60000001, arg1: inst60000038, type: type(inst60000013)}
-// CHECK:STDOUT:     inst60000036:    {kind: ValueBindingPattern, arg0: entity_name60000001, type: type(inst60000016)}
-// CHECK:STDOUT:     inst60000037:    {kind: ValueParamPattern, arg0: inst60000036, arg1: call_param0, type: type(inst60000016)}
-// CHECK:STDOUT:     inst60000038:    {kind: ValueParam, arg0: call_param0, arg1: name1, type: type(inst60000013)}
-// CHECK:STDOUT:     inst60000039:    {kind: FunctionDecl, arg0: function60000003, arg1: inst_block6000000F, type: type(inst6000003A)}
-// CHECK:STDOUT:     inst6000003A:    {kind: FunctionType, arg0: function60000003, arg1: specific<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000003B:    {kind: StructValue, arg0: inst_block_empty, type: type(inst6000003A)}
-// CHECK:STDOUT:     inst6000003C:    {kind: ValueBinding, arg0: entity_name60000002, arg1: inst60000040, type: type(inst6000001E)}
-// CHECK:STDOUT:     inst6000003D:    {kind: PatternType, arg0: inst6000001E, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000003E:    {kind: ValueBindingPattern, arg0: entity_name60000002, type: type(inst6000003D)}
-// CHECK:STDOUT:     inst6000003F:    {kind: ValueParamPattern, arg0: inst6000003E, arg1: call_param0, type: type(inst6000003D)}
-// CHECK:STDOUT:     inst60000040:    {kind: ValueParam, arg0: call_param0, arg1: name1, type: type(inst6000001E)}
-// CHECK:STDOUT:     inst60000041:    {kind: FunctionDecl, arg0: function60000004, arg1: inst_block60000014, type: type(inst60000042)}
-// CHECK:STDOUT:     inst60000042:    {kind: FunctionType, arg0: function60000004, arg1: specific<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000043:    {kind: StructValue, arg0: inst_block_empty, type: type(inst60000042)}
-// CHECK:STDOUT:     inst60000044:    {kind: ValueAsRef, arg0: inst60000034, type: type(inst60000013)}
-// CHECK:STDOUT:     inst60000045:    {kind: AddrOf, arg0: inst60000044, type: type(inst6000001E)}
-// CHECK:STDOUT:     inst60000046:    {kind: Call, arg0: inst60000041, arg1: inst_block60000016, type: type(inst60000011)}
-// CHECK:STDOUT:     inst60000047:    {kind: NameRef, arg0: name(Cpp), arg1: inst6000000F, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     inst60000048:    {kind: NameRef, arg0: name3, arg1: inst60000028, type: type(inst60000027)}
-// CHECK:STDOUT:     inst60000049:    {kind: NameRef, arg0: name(Cpp), arg1: inst6000000F, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     inst6000004A:    {kind: VarStorage, arg0: inst6000004C, type: type(inst6000001E)}
-// CHECK:STDOUT:     inst6000004B:    {kind: RefBindingPattern, arg0: entity_name60000003, type: type(inst6000003D)}
-// CHECK:STDOUT:     inst6000004C:    {kind: VarPattern, arg0: inst6000004B, type: type(inst6000003D)}
-// CHECK:STDOUT:     inst6000004D:    {kind: NameBindingDecl, arg0: inst_block60000017}
-// CHECK:STDOUT:     inst6000004E:    {kind: NameRef, arg0: name4, arg1: inst6000004A, type: type(inst6000001E)}
-// CHECK:STDOUT:     inst6000004F:    {kind: AcquireValue, arg0: inst6000004E, type: type(inst6000001E)}
-// CHECK:STDOUT:     inst60000050:    {kind: Deref, arg0: inst6000004F, type: type(inst60000013)}
-// CHECK:STDOUT:     inst60000051:    {kind: AcquireValue, arg0: inst60000050, type: type(inst60000013)}
-// CHECK:STDOUT:     inst60000052:    {kind: ValueAsRef, arg0: inst60000051, type: type(inst60000013)}
-// CHECK:STDOUT:     inst60000053:    {kind: AddrOf, arg0: inst60000052, type: type(inst6000001E)}
-// CHECK:STDOUT:     inst60000054:    {kind: Call, arg0: inst60000041, arg1: inst_block60000019, type: type(inst60000011)}
-// CHECK:STDOUT:     inst60000055:    {kind: Return}
+// CHECK:STDOUT:     inst60000025:    {kind: CompleteTypeWitness, arg0: inst60000023, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst60000026:    {kind: PointerType, arg0: inst60000023, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000027:    {kind: NameRef, arg0: name(Cpp), arg1: inst60000010, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     inst60000028:    {kind: CppOverloadSetType, arg0: cpp_overload_set60000000, arg1: specific<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000029:    {kind: CppOverloadSetValue, arg0: cpp_overload_set60000000, type: type(inst60000028)}
+// CHECK:STDOUT:     inst6000002A:    {kind: CppOverloadSetValue, arg0: cpp_overload_set60000000, type: type(inst60000028)}
+// CHECK:STDOUT:     inst6000002B:    {kind: NameRef, arg0: name3, arg1: inst60000029, type: type(inst60000028)}
+// CHECK:STDOUT:     inst6000002C:    {kind: FunctionDecl, arg0: function60000001, arg1: inst_block_empty, type: type(inst6000002D)}
+// CHECK:STDOUT:     inst6000002D:    {kind: FunctionType, arg0: function60000001, arg1: specific<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000002E:    {kind: StructValue, arg0: inst_block_empty, type: type(inst6000002D)}
+// CHECK:STDOUT:     inst6000002F:    {kind: FunctionDecl, arg0: function60000002, arg1: inst_block_empty, type: type(inst60000030)}
+// CHECK:STDOUT:     inst60000030:    {kind: FunctionType, arg0: function60000002, arg1: specific<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000031:    {kind: StructValue, arg0: inst_block_empty, type: type(inst60000030)}
+// CHECK:STDOUT:     inst60000032:    {kind: Call, arg0: inst6000002F, arg1: inst_block_empty, type: type(inst60000012)}
+// CHECK:STDOUT:     inst60000033:    {kind: NameRef, arg0: name(Cpp), arg1: inst60000010, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     inst60000034:    {kind: NameRef, arg0: name3, arg1: inst60000029, type: type(inst60000028)}
+// CHECK:STDOUT:     inst60000035:    {kind: NameRef, arg0: name1, arg1: inst60000016, type: type(inst60000014)}
+// CHECK:STDOUT:     inst60000036:    {kind: ValueBinding, arg0: entity_name60000001, arg1: inst60000039, type: type(inst60000014)}
+// CHECK:STDOUT:     inst60000037:    {kind: ValueBindingPattern, arg0: entity_name60000001, type: type(inst60000017)}
+// CHECK:STDOUT:     inst60000038:    {kind: ValueParamPattern, arg0: inst60000037, arg1: call_param0, type: type(inst60000017)}
+// CHECK:STDOUT:     inst60000039:    {kind: ValueParam, arg0: call_param0, arg1: name1, type: type(inst60000014)}
+// CHECK:STDOUT:     inst6000003A:    {kind: FunctionDecl, arg0: function60000003, arg1: inst_block6000000F, type: type(inst6000003B)}
+// CHECK:STDOUT:     inst6000003B:    {kind: FunctionType, arg0: function60000003, arg1: specific<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000003C:    {kind: StructValue, arg0: inst_block_empty, type: type(inst6000003B)}
+// CHECK:STDOUT:     inst6000003D:    {kind: ValueBinding, arg0: entity_name60000002, arg1: inst60000041, type: type(inst6000001F)}
+// CHECK:STDOUT:     inst6000003E:    {kind: PatternType, arg0: inst6000001F, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000003F:    {kind: ValueBindingPattern, arg0: entity_name60000002, type: type(inst6000003E)}
+// CHECK:STDOUT:     inst60000040:    {kind: ValueParamPattern, arg0: inst6000003F, arg1: call_param0, type: type(inst6000003E)}
+// CHECK:STDOUT:     inst60000041:    {kind: ValueParam, arg0: call_param0, arg1: name1, type: type(inst6000001F)}
+// CHECK:STDOUT:     inst60000042:    {kind: FunctionDecl, arg0: function60000004, arg1: inst_block60000014, type: type(inst60000043)}
+// CHECK:STDOUT:     inst60000043:    {kind: FunctionType, arg0: function60000004, arg1: specific<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000044:    {kind: StructValue, arg0: inst_block_empty, type: type(inst60000043)}
+// CHECK:STDOUT:     inst60000045:    {kind: ValueAsRef, arg0: inst60000035, type: type(inst60000014)}
+// CHECK:STDOUT:     inst60000046:    {kind: AddrOf, arg0: inst60000045, type: type(inst6000001F)}
+// CHECK:STDOUT:     inst60000047:    {kind: Call, arg0: inst60000042, arg1: inst_block60000016, type: type(inst60000012)}
+// CHECK:STDOUT:     inst60000048:    {kind: NameRef, arg0: name(Cpp), arg1: inst60000010, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     inst60000049:    {kind: NameRef, arg0: name3, arg1: inst60000029, type: type(inst60000028)}
+// CHECK:STDOUT:     inst6000004A:    {kind: NameRef, arg0: name(Cpp), arg1: inst60000010, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     inst6000004B:    {kind: VarStorage, arg0: inst6000004D, type: type(inst6000001F)}
+// CHECK:STDOUT:     inst6000004C:    {kind: RefBindingPattern, arg0: entity_name60000003, type: type(inst6000003E)}
+// CHECK:STDOUT:     inst6000004D:    {kind: VarPattern, arg0: inst6000004C, type: type(inst6000003E)}
+// CHECK:STDOUT:     inst6000004E:    {kind: NameBindingDecl, arg0: inst_block60000017}
+// CHECK:STDOUT:     inst6000004F:    {kind: NameRef, arg0: name4, arg1: inst6000004B, type: type(inst6000001F)}
+// CHECK:STDOUT:     inst60000050:    {kind: AcquireValue, arg0: inst6000004F, type: type(inst6000001F)}
+// CHECK:STDOUT:     inst60000051:    {kind: Deref, arg0: inst60000050, type: type(inst60000014)}
+// CHECK:STDOUT:     inst60000052:    {kind: AcquireValue, arg0: inst60000051, type: type(inst60000014)}
+// CHECK:STDOUT:     inst60000053:    {kind: ValueAsRef, arg0: inst60000052, type: type(inst60000014)}
+// CHECK:STDOUT:     inst60000054:    {kind: AddrOf, arg0: inst60000053, type: type(inst6000001F)}
+// CHECK:STDOUT:     inst60000055:    {kind: Call, arg0: inst60000042, arg1: inst_block60000019, type: type(inst60000012)}
+// CHECK:STDOUT:     inst60000056:    {kind: Return}
 // CHECK:STDOUT:   constant_values:
 // CHECK:STDOUT:     values:
 // CHECK:STDOUT:       'inst(TypeType)':  concrete_constant(inst(TypeType))
@@ -210,152 +211,153 @@ fn G(x: Cpp.X) {
 // CHECK:STDOUT:       'inst(InstType)':  concrete_constant(inst(InstType))
 // CHECK:STDOUT:       'inst(IntLiteralType)': concrete_constant(inst(IntLiteralType))
 // CHECK:STDOUT:       'inst(NamespaceType)': concrete_constant(inst(NamespaceType))
+// CHECK:STDOUT:       'inst(RequireSpecificDefinitionType)': concrete_constant(inst(RequireSpecificDefinitionType))
 // CHECK:STDOUT:       'inst(SpecificFunctionType)': concrete_constant(inst(SpecificFunctionType))
 // CHECK:STDOUT:       'inst(VtableType)': concrete_constant(inst(VtableType))
 // CHECK:STDOUT:       'inst(WitnessType)': concrete_constant(inst(WitnessType))
-// CHECK:STDOUT:       instD:           concrete_constant(instD)
-// CHECK:STDOUT:       inst6000000F:    concrete_constant(inst6000000F)
-// CHECK:STDOUT:       inst60000010:    concrete_constant(inst6000000F)
-// CHECK:STDOUT:       inst60000011:    concrete_constant(inst60000011)
-// CHECK:STDOUT:       inst60000012:    concrete_constant(inst60000013)
-// CHECK:STDOUT:       inst60000013:    concrete_constant(inst60000013)
-// CHECK:STDOUT:       inst60000014:    concrete_constant(inst60000013)
-// CHECK:STDOUT:       inst60000016:    concrete_constant(inst60000016)
+// CHECK:STDOUT:       instE:           concrete_constant(instE)
+// CHECK:STDOUT:       inst60000010:    concrete_constant(inst60000010)
+// CHECK:STDOUT:       inst60000011:    concrete_constant(inst60000010)
+// CHECK:STDOUT:       inst60000012:    concrete_constant(inst60000012)
+// CHECK:STDOUT:       inst60000013:    concrete_constant(inst60000014)
+// CHECK:STDOUT:       inst60000014:    concrete_constant(inst60000014)
+// CHECK:STDOUT:       inst60000015:    concrete_constant(inst60000014)
 // CHECK:STDOUT:       inst60000017:    concrete_constant(inst60000017)
 // CHECK:STDOUT:       inst60000018:    concrete_constant(inst60000018)
-// CHECK:STDOUT:       inst6000001A:    concrete_constant(inst60000013)
-// CHECK:STDOUT:       inst6000001B:    concrete_constant(inst6000001D)
-// CHECK:STDOUT:       inst6000001C:    concrete_constant(inst6000001C)
+// CHECK:STDOUT:       inst60000019:    concrete_constant(inst60000019)
+// CHECK:STDOUT:       inst6000001B:    concrete_constant(inst60000014)
+// CHECK:STDOUT:       inst6000001C:    concrete_constant(inst6000001E)
 // CHECK:STDOUT:       inst6000001D:    concrete_constant(inst6000001D)
 // CHECK:STDOUT:       inst6000001E:    concrete_constant(inst6000001E)
 // CHECK:STDOUT:       inst6000001F:    concrete_constant(inst6000001F)
 // CHECK:STDOUT:       inst60000020:    concrete_constant(inst60000020)
-// CHECK:STDOUT:       inst60000021:    concrete_constant(inst60000022)
-// CHECK:STDOUT:       inst60000022:    concrete_constant(inst60000022)
-// CHECK:STDOUT:       inst60000023:    concrete_constant(inst60000024)
-// CHECK:STDOUT:       inst60000024:    concrete_constant(inst60000024)
+// CHECK:STDOUT:       inst60000021:    concrete_constant(inst60000021)
+// CHECK:STDOUT:       inst60000022:    concrete_constant(inst60000023)
+// CHECK:STDOUT:       inst60000023:    concrete_constant(inst60000023)
+// CHECK:STDOUT:       inst60000024:    concrete_constant(inst60000025)
 // CHECK:STDOUT:       inst60000025:    concrete_constant(inst60000025)
-// CHECK:STDOUT:       inst60000026:    concrete_constant(inst6000000F)
-// CHECK:STDOUT:       inst60000027:    concrete_constant(inst60000027)
-// CHECK:STDOUT:       inst60000028:    concrete_constant(inst60000029)
-// CHECK:STDOUT:       inst60000029:    concrete_constant(inst60000029)
-// CHECK:STDOUT:       inst6000002A:    concrete_constant(inst60000029)
-// CHECK:STDOUT:       inst6000002B:    concrete_constant(inst6000002D)
-// CHECK:STDOUT:       inst6000002C:    concrete_constant(inst6000002C)
+// CHECK:STDOUT:       inst60000026:    concrete_constant(inst60000026)
+// CHECK:STDOUT:       inst60000027:    concrete_constant(inst60000010)
+// CHECK:STDOUT:       inst60000028:    concrete_constant(inst60000028)
+// CHECK:STDOUT:       inst60000029:    concrete_constant(inst6000002A)
+// CHECK:STDOUT:       inst6000002A:    concrete_constant(inst6000002A)
+// CHECK:STDOUT:       inst6000002B:    concrete_constant(inst6000002A)
+// CHECK:STDOUT:       inst6000002C:    concrete_constant(inst6000002E)
 // CHECK:STDOUT:       inst6000002D:    concrete_constant(inst6000002D)
-// CHECK:STDOUT:       inst6000002E:    concrete_constant(inst60000030)
-// CHECK:STDOUT:       inst6000002F:    concrete_constant(inst6000002F)
+// CHECK:STDOUT:       inst6000002E:    concrete_constant(inst6000002E)
+// CHECK:STDOUT:       inst6000002F:    concrete_constant(inst60000031)
 // CHECK:STDOUT:       inst60000030:    concrete_constant(inst60000030)
-// CHECK:STDOUT:       inst60000032:    concrete_constant(inst6000000F)
-// CHECK:STDOUT:       inst60000033:    concrete_constant(inst60000029)
-// CHECK:STDOUT:       inst60000036:    concrete_constant(inst60000036)
+// CHECK:STDOUT:       inst60000031:    concrete_constant(inst60000031)
+// CHECK:STDOUT:       inst60000033:    concrete_constant(inst60000010)
+// CHECK:STDOUT:       inst60000034:    concrete_constant(inst6000002A)
 // CHECK:STDOUT:       inst60000037:    concrete_constant(inst60000037)
-// CHECK:STDOUT:       inst60000039:    concrete_constant(inst6000003B)
-// CHECK:STDOUT:       inst6000003A:    concrete_constant(inst6000003A)
+// CHECK:STDOUT:       inst60000038:    concrete_constant(inst60000038)
+// CHECK:STDOUT:       inst6000003A:    concrete_constant(inst6000003C)
 // CHECK:STDOUT:       inst6000003B:    concrete_constant(inst6000003B)
-// CHECK:STDOUT:       inst6000003D:    concrete_constant(inst6000003D)
+// CHECK:STDOUT:       inst6000003C:    concrete_constant(inst6000003C)
 // CHECK:STDOUT:       inst6000003E:    concrete_constant(inst6000003E)
 // CHECK:STDOUT:       inst6000003F:    concrete_constant(inst6000003F)
-// CHECK:STDOUT:       inst60000041:    concrete_constant(inst60000043)
-// CHECK:STDOUT:       inst60000042:    concrete_constant(inst60000042)
+// CHECK:STDOUT:       inst60000040:    concrete_constant(inst60000040)
+// CHECK:STDOUT:       inst60000042:    concrete_constant(inst60000044)
 // CHECK:STDOUT:       inst60000043:    concrete_constant(inst60000043)
-// CHECK:STDOUT:       inst60000047:    concrete_constant(inst6000000F)
-// CHECK:STDOUT:       inst60000048:    concrete_constant(inst60000029)
-// CHECK:STDOUT:       inst60000049:    concrete_constant(inst6000000F)
-// CHECK:STDOUT:       inst6000004A:    concrete_constant(inst6000004A)
+// CHECK:STDOUT:       inst60000044:    concrete_constant(inst60000044)
+// CHECK:STDOUT:       inst60000048:    concrete_constant(inst60000010)
+// CHECK:STDOUT:       inst60000049:    concrete_constant(inst6000002A)
+// CHECK:STDOUT:       inst6000004A:    concrete_constant(inst60000010)
 // CHECK:STDOUT:       inst6000004B:    concrete_constant(inst6000004B)
 // CHECK:STDOUT:       inst6000004C:    concrete_constant(inst6000004C)
-// CHECK:STDOUT:       inst6000004E:    concrete_constant(inst6000004A)
+// CHECK:STDOUT:       inst6000004D:    concrete_constant(inst6000004D)
+// CHECK:STDOUT:       inst6000004F:    concrete_constant(inst6000004B)
 // CHECK:STDOUT:     symbolic_constants: {}
 // CHECK:STDOUT:   inst_blocks:
 // CHECK:STDOUT:     inst_block_empty: {}
 // CHECK:STDOUT:     exports:
-// CHECK:STDOUT:       0:               inst6000001B
+// CHECK:STDOUT:       0:               inst6000001C
 // CHECK:STDOUT:     imports:
-// CHECK:STDOUT:       0:               inst6000000F
-// CHECK:STDOUT:       1:               inst60000012
-// CHECK:STDOUT:       2:               inst60000028
-// CHECK:STDOUT:       3:               inst6000002B
-// CHECK:STDOUT:       4:               inst6000002E
-// CHECK:STDOUT:       5:               inst60000039
-// CHECK:STDOUT:       6:               inst60000041
-// CHECK:STDOUT:       7:               inst6000004A
-// CHECK:STDOUT:       8:               inst6000004D
+// CHECK:STDOUT:       0:               inst60000010
+// CHECK:STDOUT:       1:               inst60000013
+// CHECK:STDOUT:       2:               inst60000029
+// CHECK:STDOUT:       3:               inst6000002C
+// CHECK:STDOUT:       4:               inst6000002F
+// CHECK:STDOUT:       5:               inst6000003A
+// CHECK:STDOUT:       6:               inst60000042
+// CHECK:STDOUT:       7:               inst6000004B
+// CHECK:STDOUT:       8:               inst6000004E
 // CHECK:STDOUT:     global_init:     {}
 // CHECK:STDOUT:     inst_block60000004:
-// CHECK:STDOUT:       0:               inst60000010
-// CHECK:STDOUT:       1:               inst60000014
+// CHECK:STDOUT:       0:               inst60000011
+// CHECK:STDOUT:       1:               inst60000015
 // CHECK:STDOUT:     inst_block60000005:
-// CHECK:STDOUT:       0:               inst60000018
-// CHECK:STDOUT:     inst_block60000006:
 // CHECK:STDOUT:       0:               inst60000019
+// CHECK:STDOUT:     inst_block60000006:
+// CHECK:STDOUT:       0:               inst6000001A
 // CHECK:STDOUT:     inst_block60000007:
-// CHECK:STDOUT:       0:               inst60000017
-// CHECK:STDOUT:       1:               inst60000018
+// CHECK:STDOUT:       0:               inst60000018
+// CHECK:STDOUT:       1:               inst60000019
 // CHECK:STDOUT:     inst_block60000008:
-// CHECK:STDOUT:       0:               inst60000019
-// CHECK:STDOUT:       1:               inst6000001A
-// CHECK:STDOUT:       2:               inst60000015
+// CHECK:STDOUT:       0:               inst6000001A
+// CHECK:STDOUT:       1:               inst6000001B
+// CHECK:STDOUT:       2:               inst60000016
 // CHECK:STDOUT:     inst_block60000009:
-// CHECK:STDOUT:       0:               inst60000026
-// CHECK:STDOUT:       1:               inst6000002A
-// CHECK:STDOUT:       2:               inst60000031
-// CHECK:STDOUT:       3:               inst60000032
-// CHECK:STDOUT:       4:               inst60000033
-// CHECK:STDOUT:       5:               inst60000034
-// CHECK:STDOUT:       6:               inst60000044
-// CHECK:STDOUT:       7:               inst60000045
-// CHECK:STDOUT:       8:               inst60000046
-// CHECK:STDOUT:       9:               inst60000047
-// CHECK:STDOUT:       10:              inst60000048
-// CHECK:STDOUT:       11:              inst60000049
-// CHECK:STDOUT:       12:              inst6000004E
-// CHECK:STDOUT:       13:              inst6000004F
-// CHECK:STDOUT:       14:              inst60000050
-// CHECK:STDOUT:       15:              inst60000051
-// CHECK:STDOUT:       16:              inst60000052
-// CHECK:STDOUT:       17:              inst60000053
-// CHECK:STDOUT:       18:              inst60000054
-// CHECK:STDOUT:       19:              inst60000055
+// CHECK:STDOUT:       0:               inst60000027
+// CHECK:STDOUT:       1:               inst6000002B
+// CHECK:STDOUT:       2:               inst60000032
+// CHECK:STDOUT:       3:               inst60000033
+// CHECK:STDOUT:       4:               inst60000034
+// CHECK:STDOUT:       5:               inst60000035
+// CHECK:STDOUT:       6:               inst60000045
+// CHECK:STDOUT:       7:               inst60000046
+// CHECK:STDOUT:       8:               inst60000047
+// CHECK:STDOUT:       9:               inst60000048
+// CHECK:STDOUT:       10:              inst60000049
+// CHECK:STDOUT:       11:              inst6000004A
+// CHECK:STDOUT:       12:              inst6000004F
+// CHECK:STDOUT:       13:              inst60000050
+// CHECK:STDOUT:       14:              inst60000051
+// CHECK:STDOUT:       15:              inst60000052
+// CHECK:STDOUT:       16:              inst60000053
+// CHECK:STDOUT:       17:              inst60000054
+// CHECK:STDOUT:       18:              inst60000055
+// CHECK:STDOUT:       19:              inst60000056
 // CHECK:STDOUT:     inst_block6000000A:
-// CHECK:STDOUT:       0:               inst60000020
-// CHECK:STDOUT:       1:               inst60000021
-// CHECK:STDOUT:       2:               inst60000023
+// CHECK:STDOUT:       0:               inst60000021
+// CHECK:STDOUT:       1:               inst60000022
+// CHECK:STDOUT:       2:               inst60000024
 // CHECK:STDOUT:     inst_block6000000B: {}
 // CHECK:STDOUT:     inst_block6000000C:
-// CHECK:STDOUT:       0:               inst60000037
-// CHECK:STDOUT:     inst_block6000000D:
 // CHECK:STDOUT:       0:               inst60000038
+// CHECK:STDOUT:     inst_block6000000D:
+// CHECK:STDOUT:       0:               inst60000039
 // CHECK:STDOUT:     inst_block6000000E:
-// CHECK:STDOUT:       0:               inst60000036
-// CHECK:STDOUT:       1:               inst60000037
+// CHECK:STDOUT:       0:               inst60000037
+// CHECK:STDOUT:       1:               inst60000038
 // CHECK:STDOUT:     inst_block6000000F:
-// CHECK:STDOUT:       0:               inst60000038
-// CHECK:STDOUT:       1:               inst60000035
+// CHECK:STDOUT:       0:               inst60000039
+// CHECK:STDOUT:       1:               inst60000036
 // CHECK:STDOUT:     inst_block60000010: {}
 // CHECK:STDOUT:     inst_block60000011:
-// CHECK:STDOUT:       0:               inst6000003F
-// CHECK:STDOUT:     inst_block60000012:
 // CHECK:STDOUT:       0:               inst60000040
+// CHECK:STDOUT:     inst_block60000012:
+// CHECK:STDOUT:       0:               inst60000041
 // CHECK:STDOUT:     inst_block60000013:
-// CHECK:STDOUT:       0:               inst6000003E
-// CHECK:STDOUT:       1:               inst6000003F
+// CHECK:STDOUT:       0:               inst6000003F
+// CHECK:STDOUT:       1:               inst60000040
 // CHECK:STDOUT:     inst_block60000014:
-// CHECK:STDOUT:       0:               inst60000040
-// CHECK:STDOUT:       1:               inst6000003C
+// CHECK:STDOUT:       0:               inst60000041
+// CHECK:STDOUT:       1:               inst6000003D
 // CHECK:STDOUT:     inst_block60000015:
-// CHECK:STDOUT:       0:               inst60000034
+// CHECK:STDOUT:       0:               inst60000035
 // CHECK:STDOUT:     inst_block60000016:
-// CHECK:STDOUT:       0:               inst60000045
+// CHECK:STDOUT:       0:               inst60000046
 // CHECK:STDOUT:     inst_block60000017:
-// CHECK:STDOUT:       0:               inst6000004B
-// CHECK:STDOUT:       1:               inst6000004C
+// CHECK:STDOUT:       0:               inst6000004C
+// CHECK:STDOUT:       1:               inst6000004D
 // CHECK:STDOUT:     inst_block60000018:
-// CHECK:STDOUT:       0:               inst60000051
+// CHECK:STDOUT:       0:               inst60000052
 // CHECK:STDOUT:     inst_block60000019:
-// CHECK:STDOUT:       0:               inst60000053
+// CHECK:STDOUT:       0:               inst60000054
 // CHECK:STDOUT:     inst_block6000001A:
-// CHECK:STDOUT:       0:               instD
-// CHECK:STDOUT:       1:               inst6000000E
-// CHECK:STDOUT:       2:               inst6000001B
+// CHECK:STDOUT:       0:               instE
+// CHECK:STDOUT:       1:               inst6000000F
+// CHECK:STDOUT:       2:               inst6000001C
 // CHECK:STDOUT: ...

+ 61 - 61
toolchain/check/testdata/basics/raw_sem_ir/multifile.carbon

@@ -36,7 +36,7 @@ fn B() {
 // CHECK:STDOUT:   import_ir_insts: {}
 // CHECK:STDOUT:   clang_decls:     {}
 // CHECK:STDOUT:   name_scopes:
-// CHECK:STDOUT:     name_scope0:     {inst: instD, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {name0: inst6000000E}}
+// CHECK:STDOUT:     name_scope0:     {inst: instE, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {name0: inst6000000F}}
 // CHECK:STDOUT:   entity_names:    {}
 // CHECK:STDOUT:   cpp_global_vars: {}
 // CHECK:STDOUT:   functions:
@@ -53,37 +53,37 @@ fn B() {
 // CHECK:STDOUT:       value_repr:      {kind: copy, type: type(Error)}
 // CHECK:STDOUT:     'type(inst(NamespaceType))':
 // CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     'type(inst6000000F)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000010)}
 // CHECK:STDOUT:     'type(inst60000010)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000010)}
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000011)}
+// CHECK:STDOUT:     'type(inst60000011)':
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000011)}
 // CHECK:STDOUT:   insts:
-// CHECK:STDOUT:     instD:           {kind: Namespace, arg0: name_scope0, arg1: inst<none>, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     inst6000000E:    {kind: FunctionDecl, arg0: function60000000, arg1: inst_block_empty, type: type(inst6000000F)}
-// CHECK:STDOUT:     inst6000000F:    {kind: FunctionType, arg0: function60000000, arg1: specific<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000010:    {kind: TupleType, arg0: inst_block_empty, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000011:    {kind: StructValue, arg0: inst_block_empty, type: type(inst6000000F)}
-// CHECK:STDOUT:     inst60000012:    {kind: Return}
+// CHECK:STDOUT:     instE:           {kind: Namespace, arg0: name_scope0, arg1: inst<none>, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     inst6000000F:    {kind: FunctionDecl, arg0: function60000000, arg1: inst_block_empty, type: type(inst60000010)}
+// CHECK:STDOUT:     inst60000010:    {kind: FunctionType, arg0: function60000000, arg1: specific<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000011:    {kind: TupleType, arg0: inst_block_empty, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000012:    {kind: StructValue, arg0: inst_block_empty, type: type(inst60000010)}
+// CHECK:STDOUT:     inst60000013:    {kind: Return}
 // CHECK:STDOUT:   constant_values:
 // CHECK:STDOUT:     values:
-// CHECK:STDOUT:       instD:           concrete_constant(instD)
-// CHECK:STDOUT:       inst6000000E:    concrete_constant(inst60000011)
-// CHECK:STDOUT:       inst6000000F:    concrete_constant(inst6000000F)
+// CHECK:STDOUT:       instE:           concrete_constant(instE)
+// CHECK:STDOUT:       inst6000000F:    concrete_constant(inst60000012)
 // CHECK:STDOUT:       inst60000010:    concrete_constant(inst60000010)
 // CHECK:STDOUT:       inst60000011:    concrete_constant(inst60000011)
+// CHECK:STDOUT:       inst60000012:    concrete_constant(inst60000012)
 // CHECK:STDOUT:     symbolic_constants: {}
 // CHECK:STDOUT:   inst_blocks:
 // CHECK:STDOUT:     inst_block_empty: {}
 // CHECK:STDOUT:     exports:
-// CHECK:STDOUT:       0:               inst6000000E
+// CHECK:STDOUT:       0:               inst6000000F
 // CHECK:STDOUT:     imports:         {}
 // CHECK:STDOUT:     global_init:     {}
 // CHECK:STDOUT:     inst_block60000004: {}
 // CHECK:STDOUT:     inst_block60000005:
-// CHECK:STDOUT:       0:               inst60000012
+// CHECK:STDOUT:       0:               inst60000013
 // CHECK:STDOUT:     inst_block60000006:
-// CHECK:STDOUT:       0:               instD
-// CHECK:STDOUT:       1:               inst6000000E
+// CHECK:STDOUT:       0:               instE
+// CHECK:STDOUT:       1:               inst6000000F
 // CHECK:STDOUT: ...
 // CHECK:STDOUT: ---
 // CHECK:STDOUT: filename:        b.carbon
@@ -91,14 +91,14 @@ fn B() {
 // CHECK:STDOUT:   import_irs:
 // CHECK:STDOUT:     'import_ir(ApiForImpl)': {decl_id: inst<none>, is_export: false}
 // CHECK:STDOUT:     'import_ir(Cpp)':  {decl_id: inst<none>, is_export: false}
-// CHECK:STDOUT:     import_ir50000002: {decl_id: inst5000000E, is_export: false}
+// CHECK:STDOUT:     import_ir50000002: {decl_id: inst5000000F, is_export: false}
 // CHECK:STDOUT:   import_ir_insts:
-// CHECK:STDOUT:     import_ir_inst0: {ir_id: import_ir50000002, inst_id: inst6000000E}
-// CHECK:STDOUT:     import_ir_inst1: {ir_id: import_ir50000002, inst_id: inst6000000E}
+// CHECK:STDOUT:     import_ir_inst0: {ir_id: import_ir50000002, inst_id: inst6000000F}
+// CHECK:STDOUT:     import_ir_inst1: {ir_id: import_ir50000002, inst_id: inst6000000F}
 // CHECK:STDOUT:   clang_decls:     {}
 // CHECK:STDOUT:   name_scopes:
-// CHECK:STDOUT:     name_scope0:     {inst: instD, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {name1: inst5000000F, name0: inst50000010}}
-// CHECK:STDOUT:     name_scope50000001: {inst: inst5000000F, parent_scope: name_scope0, has_error: false, extended_scopes: [], names: {name1: inst50000015}}
+// CHECK:STDOUT:     name_scope0:     {inst: instE, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {name1: inst50000010, name0: inst50000011}}
+// CHECK:STDOUT:     name_scope50000001: {inst: inst50000010, parent_scope: name_scope0, has_error: false, extended_scopes: [], names: {name1: inst50000016}}
 // CHECK:STDOUT:   entity_names:
 // CHECK:STDOUT:     entity_name50000000: {name: name1, parent_scope: name_scope50000001, index: -1, is_template: 0}
 // CHECK:STDOUT:   cpp_global_vars: {}
@@ -117,60 +117,60 @@ fn B() {
 // CHECK:STDOUT:       value_repr:      {kind: copy, type: type(Error)}
 // CHECK:STDOUT:     'type(inst(NamespaceType))':
 // CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     'type(inst50000011)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst50000012)}
 // CHECK:STDOUT:     'type(inst50000012)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst50000012)}
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst50000013)}
+// CHECK:STDOUT:     'type(inst50000013)':
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst50000013)}
 // CHECK:STDOUT:     'type(inst(InstType))':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst50000012)}
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst50000013)}
 // CHECK:STDOUT:   insts:
-// CHECK:STDOUT:     instD:           {kind: Namespace, arg0: name_scope0, arg1: inst<none>, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     inst5000000E:    {kind: ImportDecl, arg0: name1}
-// CHECK:STDOUT:     inst5000000F:    {kind: Namespace, arg0: name_scope50000001, arg1: inst5000000E, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     inst50000010:    {kind: FunctionDecl, arg0: function50000000, arg1: inst_block_empty, type: type(inst50000011)}
-// CHECK:STDOUT:     inst50000011:    {kind: FunctionType, arg0: function50000000, arg1: specific<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst50000012:    {kind: TupleType, arg0: inst_block_empty, type: type(TypeType)}
-// CHECK:STDOUT:     inst50000013:    {kind: StructValue, arg0: inst_block_empty, type: type(inst50000011)}
-// CHECK:STDOUT:     inst50000014:    {kind: NameRef, arg0: name1, arg1: inst5000000F, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     inst50000015:    {kind: ImportRefLoaded, arg0: import_ir_inst0, arg1: entity_name50000000, type: type(inst50000017)}
-// CHECK:STDOUT:     inst50000016:    {kind: FunctionDecl, arg0: function50000001, arg1: inst_block_empty, type: type(inst50000017)}
-// CHECK:STDOUT:     inst50000017:    {kind: FunctionType, arg0: function50000001, arg1: specific<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst50000018:    {kind: StructValue, arg0: inst_block_empty, type: type(inst50000017)}
-// CHECK:STDOUT:     inst50000019:    {kind: NameRef, arg0: name1, arg1: inst50000015, type: type(inst50000017)}
-// CHECK:STDOUT:     inst5000001A:    {kind: Call, arg0: inst50000019, arg1: inst_block_empty, type: type(inst50000012)}
-// CHECK:STDOUT:     inst5000001B:    {kind: Return}
+// CHECK:STDOUT:     instE:           {kind: Namespace, arg0: name_scope0, arg1: inst<none>, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     inst5000000F:    {kind: ImportDecl, arg0: name1}
+// CHECK:STDOUT:     inst50000010:    {kind: Namespace, arg0: name_scope50000001, arg1: inst5000000F, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     inst50000011:    {kind: FunctionDecl, arg0: function50000000, arg1: inst_block_empty, type: type(inst50000012)}
+// CHECK:STDOUT:     inst50000012:    {kind: FunctionType, arg0: function50000000, arg1: specific<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst50000013:    {kind: TupleType, arg0: inst_block_empty, type: type(TypeType)}
+// CHECK:STDOUT:     inst50000014:    {kind: StructValue, arg0: inst_block_empty, type: type(inst50000012)}
+// CHECK:STDOUT:     inst50000015:    {kind: NameRef, arg0: name1, arg1: inst50000010, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     inst50000016:    {kind: ImportRefLoaded, arg0: import_ir_inst0, arg1: entity_name50000000, type: type(inst50000018)}
+// CHECK:STDOUT:     inst50000017:    {kind: FunctionDecl, arg0: function50000001, arg1: inst_block_empty, type: type(inst50000018)}
+// CHECK:STDOUT:     inst50000018:    {kind: FunctionType, arg0: function50000001, arg1: specific<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst50000019:    {kind: StructValue, arg0: inst_block_empty, type: type(inst50000018)}
+// CHECK:STDOUT:     inst5000001A:    {kind: NameRef, arg0: name1, arg1: inst50000016, type: type(inst50000018)}
+// CHECK:STDOUT:     inst5000001B:    {kind: Call, arg0: inst5000001A, arg1: inst_block_empty, type: type(inst50000013)}
+// CHECK:STDOUT:     inst5000001C:    {kind: Return}
 // CHECK:STDOUT:   constant_values:
 // CHECK:STDOUT:     values:
-// CHECK:STDOUT:       instD:           concrete_constant(instD)
-// CHECK:STDOUT:       inst5000000F:    concrete_constant(inst5000000F)
-// CHECK:STDOUT:       inst50000010:    concrete_constant(inst50000013)
-// CHECK:STDOUT:       inst50000011:    concrete_constant(inst50000011)
+// CHECK:STDOUT:       instE:           concrete_constant(instE)
+// CHECK:STDOUT:       inst50000010:    concrete_constant(inst50000010)
+// CHECK:STDOUT:       inst50000011:    concrete_constant(inst50000014)
 // CHECK:STDOUT:       inst50000012:    concrete_constant(inst50000012)
 // CHECK:STDOUT:       inst50000013:    concrete_constant(inst50000013)
-// CHECK:STDOUT:       inst50000014:    concrete_constant(inst5000000F)
-// CHECK:STDOUT:       inst50000015:    concrete_constant(inst50000018)
-// CHECK:STDOUT:       inst50000016:    concrete_constant(inst50000018)
-// CHECK:STDOUT:       inst50000017:    concrete_constant(inst50000017)
+// CHECK:STDOUT:       inst50000014:    concrete_constant(inst50000014)
+// CHECK:STDOUT:       inst50000015:    concrete_constant(inst50000010)
+// CHECK:STDOUT:       inst50000016:    concrete_constant(inst50000019)
+// CHECK:STDOUT:       inst50000017:    concrete_constant(inst50000019)
 // CHECK:STDOUT:       inst50000018:    concrete_constant(inst50000018)
-// CHECK:STDOUT:       inst50000019:    concrete_constant(inst50000018)
+// CHECK:STDOUT:       inst50000019:    concrete_constant(inst50000019)
+// CHECK:STDOUT:       inst5000001A:    concrete_constant(inst50000019)
 // CHECK:STDOUT:     symbolic_constants: {}
 // CHECK:STDOUT:   inst_blocks:
 // CHECK:STDOUT:     inst_block_empty: {}
 // CHECK:STDOUT:     exports:
-// CHECK:STDOUT:       0:               inst50000010
+// CHECK:STDOUT:       0:               inst50000011
 // CHECK:STDOUT:     imports:
-// CHECK:STDOUT:       0:               inst5000000F
-// CHECK:STDOUT:       1:               inst50000015
-// CHECK:STDOUT:       2:               inst50000016
+// CHECK:STDOUT:       0:               inst50000010
+// CHECK:STDOUT:       1:               inst50000016
+// CHECK:STDOUT:       2:               inst50000017
 // CHECK:STDOUT:     global_init:     {}
 // CHECK:STDOUT:     inst_block50000004: {}
 // CHECK:STDOUT:     inst_block50000005:
-// CHECK:STDOUT:       0:               inst50000014
-// CHECK:STDOUT:       1:               inst50000019
-// CHECK:STDOUT:       2:               inst5000001A
-// CHECK:STDOUT:       3:               inst5000001B
+// CHECK:STDOUT:       0:               inst50000015
+// CHECK:STDOUT:       1:               inst5000001A
+// CHECK:STDOUT:       2:               inst5000001B
+// CHECK:STDOUT:       3:               inst5000001C
 // CHECK:STDOUT:     inst_block50000006:
-// CHECK:STDOUT:       0:               instD
-// CHECK:STDOUT:       1:               inst5000000E
-// CHECK:STDOUT:       2:               inst50000010
+// CHECK:STDOUT:       0:               instE
+// CHECK:STDOUT:       1:               inst5000000F
+// CHECK:STDOUT:       2:               inst50000011
 // CHECK:STDOUT: ...

+ 61 - 61
toolchain/check/testdata/basics/raw_sem_ir/multifile_with_textual_ir.carbon

@@ -36,7 +36,7 @@ fn B() {
 // CHECK:STDOUT:   import_ir_insts: {}
 // CHECK:STDOUT:   clang_decls:     {}
 // CHECK:STDOUT:   name_scopes:
-// CHECK:STDOUT:     name_scope0:     {inst: instD, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {name0: inst6000000E}}
+// CHECK:STDOUT:     name_scope0:     {inst: instE, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {name0: inst6000000F}}
 // CHECK:STDOUT:   entity_names:    {}
 // CHECK:STDOUT:   cpp_global_vars: {}
 // CHECK:STDOUT:   functions:
@@ -53,37 +53,37 @@ fn B() {
 // CHECK:STDOUT:       value_repr:      {kind: copy, type: type(Error)}
 // CHECK:STDOUT:     'type(inst(NamespaceType))':
 // CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     'type(inst6000000F)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000010)}
 // CHECK:STDOUT:     'type(inst60000010)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000010)}
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000011)}
+// CHECK:STDOUT:     'type(inst60000011)':
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000011)}
 // CHECK:STDOUT:   insts:
-// CHECK:STDOUT:     instD:           {kind: Namespace, arg0: name_scope0, arg1: inst<none>, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     inst6000000E:    {kind: FunctionDecl, arg0: function60000000, arg1: inst_block_empty, type: type(inst6000000F)}
-// CHECK:STDOUT:     inst6000000F:    {kind: FunctionType, arg0: function60000000, arg1: specific<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000010:    {kind: TupleType, arg0: inst_block_empty, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000011:    {kind: StructValue, arg0: inst_block_empty, type: type(inst6000000F)}
-// CHECK:STDOUT:     inst60000012:    {kind: Return}
+// CHECK:STDOUT:     instE:           {kind: Namespace, arg0: name_scope0, arg1: inst<none>, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     inst6000000F:    {kind: FunctionDecl, arg0: function60000000, arg1: inst_block_empty, type: type(inst60000010)}
+// CHECK:STDOUT:     inst60000010:    {kind: FunctionType, arg0: function60000000, arg1: specific<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000011:    {kind: TupleType, arg0: inst_block_empty, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000012:    {kind: StructValue, arg0: inst_block_empty, type: type(inst60000010)}
+// CHECK:STDOUT:     inst60000013:    {kind: Return}
 // CHECK:STDOUT:   constant_values:
 // CHECK:STDOUT:     values:
-// CHECK:STDOUT:       instD:           concrete_constant(instD)
-// CHECK:STDOUT:       inst6000000E:    concrete_constant(inst60000011)
-// CHECK:STDOUT:       inst6000000F:    concrete_constant(inst6000000F)
+// CHECK:STDOUT:       instE:           concrete_constant(instE)
+// CHECK:STDOUT:       inst6000000F:    concrete_constant(inst60000012)
 // CHECK:STDOUT:       inst60000010:    concrete_constant(inst60000010)
 // CHECK:STDOUT:       inst60000011:    concrete_constant(inst60000011)
+// CHECK:STDOUT:       inst60000012:    concrete_constant(inst60000012)
 // CHECK:STDOUT:     symbolic_constants: {}
 // CHECK:STDOUT:   inst_blocks:
 // CHECK:STDOUT:     inst_block_empty: {}
 // CHECK:STDOUT:     exports:
-// CHECK:STDOUT:       0:               inst6000000E
+// CHECK:STDOUT:       0:               inst6000000F
 // CHECK:STDOUT:     imports:         {}
 // CHECK:STDOUT:     global_init:     {}
 // CHECK:STDOUT:     inst_block60000004: {}
 // CHECK:STDOUT:     inst_block60000005:
-// CHECK:STDOUT:       0:               inst60000012
+// CHECK:STDOUT:       0:               inst60000013
 // CHECK:STDOUT:     inst_block60000006:
-// CHECK:STDOUT:       0:               instD
-// CHECK:STDOUT:       1:               inst6000000E
+// CHECK:STDOUT:       0:               instE
+// CHECK:STDOUT:       1:               inst6000000F
 // CHECK:STDOUT: ...
 // CHECK:STDOUT: --- a.carbon
 // CHECK:STDOUT:
@@ -110,14 +110,14 @@ fn B() {
 // CHECK:STDOUT:   import_irs:
 // CHECK:STDOUT:     'import_ir(ApiForImpl)': {decl_id: inst<none>, is_export: false}
 // CHECK:STDOUT:     'import_ir(Cpp)':  {decl_id: inst<none>, is_export: false}
-// CHECK:STDOUT:     import_ir50000002: {decl_id: inst5000000E, is_export: false}
+// CHECK:STDOUT:     import_ir50000002: {decl_id: inst5000000F, is_export: false}
 // CHECK:STDOUT:   import_ir_insts:
-// CHECK:STDOUT:     import_ir_inst0: {ir_id: import_ir50000002, inst_id: inst6000000E}
-// CHECK:STDOUT:     import_ir_inst1: {ir_id: import_ir50000002, inst_id: inst6000000E}
+// CHECK:STDOUT:     import_ir_inst0: {ir_id: import_ir50000002, inst_id: inst6000000F}
+// CHECK:STDOUT:     import_ir_inst1: {ir_id: import_ir50000002, inst_id: inst6000000F}
 // CHECK:STDOUT:   clang_decls:     {}
 // CHECK:STDOUT:   name_scopes:
-// CHECK:STDOUT:     name_scope0:     {inst: instD, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {name1: inst5000000F, name0: inst50000010}}
-// CHECK:STDOUT:     name_scope50000001: {inst: inst5000000F, parent_scope: name_scope0, has_error: false, extended_scopes: [], names: {name1: inst50000015}}
+// CHECK:STDOUT:     name_scope0:     {inst: instE, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {name1: inst50000010, name0: inst50000011}}
+// CHECK:STDOUT:     name_scope50000001: {inst: inst50000010, parent_scope: name_scope0, has_error: false, extended_scopes: [], names: {name1: inst50000016}}
 // CHECK:STDOUT:   entity_names:
 // CHECK:STDOUT:     entity_name50000000: {name: name1, parent_scope: name_scope50000001, index: -1, is_template: 0}
 // CHECK:STDOUT:   cpp_global_vars: {}
@@ -136,62 +136,62 @@ fn B() {
 // CHECK:STDOUT:       value_repr:      {kind: copy, type: type(Error)}
 // CHECK:STDOUT:     'type(inst(NamespaceType))':
 // CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     'type(inst50000011)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst50000012)}
 // CHECK:STDOUT:     'type(inst50000012)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst50000012)}
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst50000013)}
+// CHECK:STDOUT:     'type(inst50000013)':
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst50000013)}
 // CHECK:STDOUT:     'type(inst(InstType))':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst50000012)}
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst50000013)}
 // CHECK:STDOUT:   insts:
-// CHECK:STDOUT:     instD:           {kind: Namespace, arg0: name_scope0, arg1: inst<none>, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     inst5000000E:    {kind: ImportDecl, arg0: name1}
-// CHECK:STDOUT:     inst5000000F:    {kind: Namespace, arg0: name_scope50000001, arg1: inst5000000E, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     inst50000010:    {kind: FunctionDecl, arg0: function50000000, arg1: inst_block_empty, type: type(inst50000011)}
-// CHECK:STDOUT:     inst50000011:    {kind: FunctionType, arg0: function50000000, arg1: specific<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst50000012:    {kind: TupleType, arg0: inst_block_empty, type: type(TypeType)}
-// CHECK:STDOUT:     inst50000013:    {kind: StructValue, arg0: inst_block_empty, type: type(inst50000011)}
-// CHECK:STDOUT:     inst50000014:    {kind: NameRef, arg0: name1, arg1: inst5000000F, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     inst50000015:    {kind: ImportRefLoaded, arg0: import_ir_inst0, arg1: entity_name50000000, type: type(inst50000017)}
-// CHECK:STDOUT:     inst50000016:    {kind: FunctionDecl, arg0: function50000001, arg1: inst_block_empty, type: type(inst50000017)}
-// CHECK:STDOUT:     inst50000017:    {kind: FunctionType, arg0: function50000001, arg1: specific<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst50000018:    {kind: StructValue, arg0: inst_block_empty, type: type(inst50000017)}
-// CHECK:STDOUT:     inst50000019:    {kind: NameRef, arg0: name1, arg1: inst50000015, type: type(inst50000017)}
-// CHECK:STDOUT:     inst5000001A:    {kind: Call, arg0: inst50000019, arg1: inst_block_empty, type: type(inst50000012)}
-// CHECK:STDOUT:     inst5000001B:    {kind: Return}
+// CHECK:STDOUT:     instE:           {kind: Namespace, arg0: name_scope0, arg1: inst<none>, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     inst5000000F:    {kind: ImportDecl, arg0: name1}
+// CHECK:STDOUT:     inst50000010:    {kind: Namespace, arg0: name_scope50000001, arg1: inst5000000F, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     inst50000011:    {kind: FunctionDecl, arg0: function50000000, arg1: inst_block_empty, type: type(inst50000012)}
+// CHECK:STDOUT:     inst50000012:    {kind: FunctionType, arg0: function50000000, arg1: specific<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst50000013:    {kind: TupleType, arg0: inst_block_empty, type: type(TypeType)}
+// CHECK:STDOUT:     inst50000014:    {kind: StructValue, arg0: inst_block_empty, type: type(inst50000012)}
+// CHECK:STDOUT:     inst50000015:    {kind: NameRef, arg0: name1, arg1: inst50000010, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     inst50000016:    {kind: ImportRefLoaded, arg0: import_ir_inst0, arg1: entity_name50000000, type: type(inst50000018)}
+// CHECK:STDOUT:     inst50000017:    {kind: FunctionDecl, arg0: function50000001, arg1: inst_block_empty, type: type(inst50000018)}
+// CHECK:STDOUT:     inst50000018:    {kind: FunctionType, arg0: function50000001, arg1: specific<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst50000019:    {kind: StructValue, arg0: inst_block_empty, type: type(inst50000018)}
+// CHECK:STDOUT:     inst5000001A:    {kind: NameRef, arg0: name1, arg1: inst50000016, type: type(inst50000018)}
+// CHECK:STDOUT:     inst5000001B:    {kind: Call, arg0: inst5000001A, arg1: inst_block_empty, type: type(inst50000013)}
+// CHECK:STDOUT:     inst5000001C:    {kind: Return}
 // CHECK:STDOUT:   constant_values:
 // CHECK:STDOUT:     values:
-// CHECK:STDOUT:       instD:           concrete_constant(instD)
-// CHECK:STDOUT:       inst5000000F:    concrete_constant(inst5000000F)
-// CHECK:STDOUT:       inst50000010:    concrete_constant(inst50000013)
-// CHECK:STDOUT:       inst50000011:    concrete_constant(inst50000011)
+// CHECK:STDOUT:       instE:           concrete_constant(instE)
+// CHECK:STDOUT:       inst50000010:    concrete_constant(inst50000010)
+// CHECK:STDOUT:       inst50000011:    concrete_constant(inst50000014)
 // CHECK:STDOUT:       inst50000012:    concrete_constant(inst50000012)
 // CHECK:STDOUT:       inst50000013:    concrete_constant(inst50000013)
-// CHECK:STDOUT:       inst50000014:    concrete_constant(inst5000000F)
-// CHECK:STDOUT:       inst50000015:    concrete_constant(inst50000018)
-// CHECK:STDOUT:       inst50000016:    concrete_constant(inst50000018)
-// CHECK:STDOUT:       inst50000017:    concrete_constant(inst50000017)
+// CHECK:STDOUT:       inst50000014:    concrete_constant(inst50000014)
+// CHECK:STDOUT:       inst50000015:    concrete_constant(inst50000010)
+// CHECK:STDOUT:       inst50000016:    concrete_constant(inst50000019)
+// CHECK:STDOUT:       inst50000017:    concrete_constant(inst50000019)
 // CHECK:STDOUT:       inst50000018:    concrete_constant(inst50000018)
-// CHECK:STDOUT:       inst50000019:    concrete_constant(inst50000018)
+// CHECK:STDOUT:       inst50000019:    concrete_constant(inst50000019)
+// CHECK:STDOUT:       inst5000001A:    concrete_constant(inst50000019)
 // CHECK:STDOUT:     symbolic_constants: {}
 // CHECK:STDOUT:   inst_blocks:
 // CHECK:STDOUT:     inst_block_empty: {}
 // CHECK:STDOUT:     exports:
-// CHECK:STDOUT:       0:               inst50000010
+// CHECK:STDOUT:       0:               inst50000011
 // CHECK:STDOUT:     imports:
-// CHECK:STDOUT:       0:               inst5000000F
-// CHECK:STDOUT:       1:               inst50000015
-// CHECK:STDOUT:       2:               inst50000016
+// CHECK:STDOUT:       0:               inst50000010
+// CHECK:STDOUT:       1:               inst50000016
+// CHECK:STDOUT:       2:               inst50000017
 // CHECK:STDOUT:     global_init:     {}
 // CHECK:STDOUT:     inst_block50000004: {}
 // CHECK:STDOUT:     inst_block50000005:
-// CHECK:STDOUT:       0:               inst50000014
-// CHECK:STDOUT:       1:               inst50000019
-// CHECK:STDOUT:       2:               inst5000001A
-// CHECK:STDOUT:       3:               inst5000001B
+// CHECK:STDOUT:       0:               inst50000015
+// CHECK:STDOUT:       1:               inst5000001A
+// CHECK:STDOUT:       2:               inst5000001B
+// CHECK:STDOUT:       3:               inst5000001C
 // CHECK:STDOUT:     inst_block50000006:
-// CHECK:STDOUT:       0:               instD
-// CHECK:STDOUT:       1:               inst5000000E
-// CHECK:STDOUT:       2:               inst50000010
+// CHECK:STDOUT:       0:               instE
+// CHECK:STDOUT:       1:               inst5000000F
+// CHECK:STDOUT:       2:               inst50000011
 // CHECK:STDOUT: ...
 // CHECK:STDOUT: --- b.carbon
 // CHECK:STDOUT:

+ 1562 - 1548
toolchain/check/testdata/basics/raw_sem_ir/one_file.carbon

@@ -23,216 +23,216 @@ fn Foo[T:! type](p: T*) -> (T*, ()) {
 // CHECK:STDOUT:   import_irs:
 // CHECK:STDOUT:     'import_ir(ApiForImpl)': {decl_id: inst<none>, is_export: false}
 // CHECK:STDOUT:     'import_ir(Cpp)':  {decl_id: inst<none>, is_export: false}
-// CHECK:STDOUT:     import_ir60000002: {decl_id: inst6000000E, is_export: false}
-// CHECK:STDOUT:     import_ir60000003: {decl_id: inst6000000E, is_export: false}
-// CHECK:STDOUT:     import_ir60000004: {decl_id: inst6000000E, is_export: false}
-// CHECK:STDOUT:     import_ir60000005: {decl_id: inst6000000E, is_export: false}
+// CHECK:STDOUT:     import_ir60000002: {decl_id: inst6000000F, is_export: false}
+// CHECK:STDOUT:     import_ir60000003: {decl_id: inst6000000F, is_export: false}
+// CHECK:STDOUT:     import_ir60000004: {decl_id: inst6000000F, is_export: false}
+// CHECK:STDOUT:     import_ir60000005: {decl_id: inst6000000F, is_export: false}
 // CHECK:STDOUT:   import_ir_insts:
-// CHECK:STDOUT:     import_ir_inst0: {ir_id: import_ir60000004, inst_id: inst4800000E}
-// CHECK:STDOUT:     import_ir_inst1: {ir_id: import_ir60000004, inst_id: inst4800000E}
-// CHECK:STDOUT:     import_ir_inst2: {ir_id: import_ir60000004, inst_id: inst48000010}
-// CHECK:STDOUT:     import_ir_inst3: {ir_id: import_ir60000004, inst_id: inst4800002C}
-// CHECK:STDOUT:     import_ir_inst4: {ir_id: import_ir60000004, inst_id: inst48000027}
-// CHECK:STDOUT:     import_ir_inst5: {ir_id: import_ir60000004, inst_id: inst48000027}
-// CHECK:STDOUT:     import_ir_inst6: {ir_id: import_ir60000004, inst_id: inst48000027}
-// CHECK:STDOUT:     import_ir_inst7: {ir_id: import_ir60000004, inst_id: inst48000021}
-// CHECK:STDOUT:     import_ir_inst8: {ir_id: import_ir60000004, inst_id: inst48000022}
-// CHECK:STDOUT:     import_ir_inst9: {ir_id: import_ir60000004, inst_id: inst4800001B}
-// CHECK:STDOUT:     import_ir_instA: {ir_id: import_ir60000004, inst_id: inst4800001D}
-// CHECK:STDOUT:     import_ir_instB: {ir_id: import_ir60000004, inst_id: inst48000010}
-// CHECK:STDOUT:     import_ir_instC: {ir_id: import_ir60000004, inst_id: inst48000014}
-// CHECK:STDOUT:     import_ir_instD: {ir_id: import_ir60000004, inst_id: inst48000017}
-// CHECK:STDOUT:     import_ir_instE: {ir_id: import_ir60000004, inst_id: inst4800001C}
-// CHECK:STDOUT:     import_ir_instF: {ir_id: import_ir60000004, inst_id: inst48000060}
-// CHECK:STDOUT:     import_ir_inst10: {ir_id: import_ir60000004, inst_id: inst4800005E}
-// CHECK:STDOUT:     import_ir_inst11: {ir_id: import_ir60000004, inst_id: inst48000074}
-// CHECK:STDOUT:     import_ir_inst12: {ir_id: import_ir60000004, inst_id: inst4800005F}
-// CHECK:STDOUT:     import_ir_inst13: {ir_id: import_ir60000004, inst_id: inst48000074}
-// CHECK:STDOUT:     import_ir_inst14: {ir_id: import_ir60000004, inst_id: inst4800006F}
-// CHECK:STDOUT:     import_ir_inst15: {ir_id: import_ir60000004, inst_id: inst48000070}
-// CHECK:STDOUT:     import_ir_inst16: {ir_id: import_ir60000004, inst_id: inst4800006B}
-// CHECK:STDOUT:     import_ir_inst17: {ir_id: import_ir60000004, inst_id: inst4800006D}
-// CHECK:STDOUT:     import_ir_inst18: {ir_id: import_ir60000004, inst_id: inst4800004F}
-// CHECK:STDOUT:     import_ir_inst19: {ir_id: import_ir60000004, inst_id: inst48000066}
-// CHECK:STDOUT:     import_ir_inst1A: {ir_id: import_ir60000004, inst_id: inst48000067}
-// CHECK:STDOUT:     import_ir_inst1B: {ir_id: import_ir60000004, inst_id: inst48000068}
-// CHECK:STDOUT:     import_ir_inst1C: {ir_id: import_ir60000004, inst_id: inst4800006C}
-// CHECK:STDOUT:     import_ir_inst1D: {ir_id: import_ir60000004, inst_id: inst4800007C}
-// CHECK:STDOUT:     import_ir_inst1E: {ir_id: import_ir60000004, inst_id: inst48000084}
-// CHECK:STDOUT:     import_ir_inst1F: {ir_id: import_ir60000004, inst_id: inst4800008B}
-// CHECK:STDOUT:     import_ir_inst20: {ir_id: import_ir60000004, inst_id: inst4800008F}
-// CHECK:STDOUT:     import_ir_inst21: {ir_id: import_ir60000004, inst_id: inst48000090}
-// CHECK:STDOUT:     import_ir_inst22: {ir_id: import_ir60000004, inst_id: inst48000095}
-// CHECK:STDOUT:     import_ir_inst23: {ir_id: import_ir60000004, inst_id: inst48000053}
-// CHECK:STDOUT:     import_ir_inst24: {ir_id: import_ir60000004, inst_id: inst48000059}
-// CHECK:STDOUT:     import_ir_inst25: {ir_id: import_ir60000004, inst_id: inst4800005C}
-// CHECK:STDOUT:     import_ir_inst26: {ir_id: import_ir60000004, inst_id: inst4800004F}
-// CHECK:STDOUT:     import_ir_inst27: {ir_id: import_ir60000004, inst_id: inst48000051}
-// CHECK:STDOUT:     import_ir_inst28: {ir_id: import_ir60000004, inst_id: inst48000057}
-// CHECK:STDOUT:     import_ir_inst29: {ir_id: import_ir60000004, inst_id: inst4800005B}
-// CHECK:STDOUT:     import_ir_inst2A: {ir_id: import_ir60000004, inst_id: inst48000062}
-// CHECK:STDOUT:     import_ir_inst2B: {ir_id: import_ir60000004, inst_id: inst48000077}
-// CHECK:STDOUT:     import_ir_inst2C: {ir_id: import_ir60000004, inst_id: inst48000078}
-// CHECK:STDOUT:     import_ir_inst2D: {ir_id: import_ir60000004, inst_id: inst480000AA}
-// CHECK:STDOUT:     import_ir_inst2E: {ir_id: import_ir60000004, inst_id: inst480000A8}
-// CHECK:STDOUT:     import_ir_inst2F: {ir_id: import_ir60000004, inst_id: inst480000A6}
-// CHECK:STDOUT:     import_ir_inst30: {ir_id: import_ir60000004, inst_id: inst480000A7}
-// CHECK:STDOUT:     import_ir_inst31: {ir_id: import_ir60000004, inst_id: inst480000C2}
-// CHECK:STDOUT:     import_ir_inst32: {ir_id: import_ir60000004, inst_id: inst480000C0}
-// CHECK:STDOUT:     import_ir_inst33: {ir_id: import_ir60000004, inst_id: inst480000BE}
-// CHECK:STDOUT:     import_ir_inst34: {ir_id: import_ir60000004, inst_id: inst480000BF}
-// CHECK:STDOUT:     import_ir_inst35: {ir_id: import_ir60000004, inst_id: inst480000DA}
-// CHECK:STDOUT:     import_ir_inst36: {ir_id: import_ir60000004, inst_id: inst480000D8}
-// CHECK:STDOUT:     import_ir_inst37: {ir_id: import_ir60000004, inst_id: inst480000D6}
-// CHECK:STDOUT:     import_ir_inst38: {ir_id: import_ir60000004, inst_id: inst480000D7}
-// CHECK:STDOUT:     import_ir_inst39: {ir_id: import_ir60000004, inst_id: inst480000F2}
-// CHECK:STDOUT:     import_ir_inst3A: {ir_id: import_ir60000004, inst_id: inst480000F0}
-// CHECK:STDOUT:     import_ir_inst3B: {ir_id: import_ir60000004, inst_id: inst480000EE}
-// CHECK:STDOUT:     import_ir_inst3C: {ir_id: import_ir60000004, inst_id: inst480000EF}
-// CHECK:STDOUT:     import_ir_inst3D: {ir_id: import_ir60000004, inst_id: inst4800010F}
-// CHECK:STDOUT:     import_ir_inst3E: {ir_id: import_ir60000004, inst_id: inst4800010D}
-// CHECK:STDOUT:     import_ir_inst3F: {ir_id: import_ir60000004, inst_id: inst48000120}
-// CHECK:STDOUT:     import_ir_inst40: {ir_id: import_ir60000004, inst_id: inst4800010E}
-// CHECK:STDOUT:     import_ir_inst41: {ir_id: import_ir60000004, inst_id: inst48000107}
-// CHECK:STDOUT:     import_ir_inst42: {ir_id: import_ir60000004, inst_id: inst48000109}
-// CHECK:STDOUT:     import_ir_inst43: {ir_id: import_ir60000004, inst_id: inst4800010C}
-// CHECK:STDOUT:     import_ir_inst44: {ir_id: import_ir60000004, inst_id: inst48000104}
-// CHECK:STDOUT:     import_ir_inst45: {ir_id: import_ir60000004, inst_id: inst48000106}
-// CHECK:STDOUT:     import_ir_inst46: {ir_id: import_ir60000004, inst_id: inst4800010B}
-// CHECK:STDOUT:     import_ir_inst47: {ir_id: import_ir60000004, inst_id: inst48000111}
-// CHECK:STDOUT:     import_ir_inst48: {ir_id: import_ir60000004, inst_id: inst48000120}
-// CHECK:STDOUT:     import_ir_inst49: {ir_id: import_ir60000004, inst_id: inst4800011B}
-// CHECK:STDOUT:     import_ir_inst4A: {ir_id: import_ir60000004, inst_id: inst4800011C}
-// CHECK:STDOUT:     import_ir_inst4B: {ir_id: import_ir60000004, inst_id: inst48000117}
-// CHECK:STDOUT:     import_ir_inst4C: {ir_id: import_ir60000004, inst_id: inst48000119}
-// CHECK:STDOUT:     import_ir_inst4D: {ir_id: import_ir60000004, inst_id: inst48000104}
-// CHECK:STDOUT:     import_ir_inst4E: {ir_id: import_ir60000004, inst_id: inst48000113}
-// CHECK:STDOUT:     import_ir_inst4F: {ir_id: import_ir60000004, inst_id: inst48000114}
-// CHECK:STDOUT:     import_ir_inst50: {ir_id: import_ir60000004, inst_id: inst48000118}
-// CHECK:STDOUT:     import_ir_inst51: {ir_id: import_ir60000004, inst_id: inst48000123}
-// CHECK:STDOUT:     import_ir_inst52: {ir_id: import_ir60000004, inst_id: inst48000124}
-// CHECK:STDOUT:     import_ir_inst53: {ir_id: import_ir60000004, inst_id: inst48000127}
-// CHECK:STDOUT:     import_ir_inst54: {ir_id: import_ir60000004, inst_id: inst4800012D}
-// CHECK:STDOUT:     import_ir_inst55: {ir_id: import_ir60000004, inst_id: inst4800012B}
+// CHECK:STDOUT:     import_ir_inst0: {ir_id: import_ir60000004, inst_id: inst4800000F}
+// CHECK:STDOUT:     import_ir_inst1: {ir_id: import_ir60000004, inst_id: inst4800000F}
+// CHECK:STDOUT:     import_ir_inst2: {ir_id: import_ir60000004, inst_id: inst48000011}
+// CHECK:STDOUT:     import_ir_inst3: {ir_id: import_ir60000004, inst_id: inst4800002D}
+// CHECK:STDOUT:     import_ir_inst4: {ir_id: import_ir60000004, inst_id: inst48000028}
+// CHECK:STDOUT:     import_ir_inst5: {ir_id: import_ir60000004, inst_id: inst48000028}
+// CHECK:STDOUT:     import_ir_inst6: {ir_id: import_ir60000004, inst_id: inst48000028}
+// CHECK:STDOUT:     import_ir_inst7: {ir_id: import_ir60000004, inst_id: inst48000022}
+// CHECK:STDOUT:     import_ir_inst8: {ir_id: import_ir60000004, inst_id: inst48000023}
+// CHECK:STDOUT:     import_ir_inst9: {ir_id: import_ir60000004, inst_id: inst4800001C}
+// CHECK:STDOUT:     import_ir_instA: {ir_id: import_ir60000004, inst_id: inst4800001E}
+// CHECK:STDOUT:     import_ir_instB: {ir_id: import_ir60000004, inst_id: inst48000011}
+// CHECK:STDOUT:     import_ir_instC: {ir_id: import_ir60000004, inst_id: inst48000015}
+// CHECK:STDOUT:     import_ir_instD: {ir_id: import_ir60000004, inst_id: inst48000018}
+// CHECK:STDOUT:     import_ir_instE: {ir_id: import_ir60000004, inst_id: inst4800001D}
+// CHECK:STDOUT:     import_ir_instF: {ir_id: import_ir60000004, inst_id: inst48000061}
+// CHECK:STDOUT:     import_ir_inst10: {ir_id: import_ir60000004, inst_id: inst4800005F}
+// CHECK:STDOUT:     import_ir_inst11: {ir_id: import_ir60000004, inst_id: inst48000075}
+// CHECK:STDOUT:     import_ir_inst12: {ir_id: import_ir60000004, inst_id: inst48000060}
+// CHECK:STDOUT:     import_ir_inst13: {ir_id: import_ir60000004, inst_id: inst48000075}
+// CHECK:STDOUT:     import_ir_inst14: {ir_id: import_ir60000004, inst_id: inst48000070}
+// CHECK:STDOUT:     import_ir_inst15: {ir_id: import_ir60000004, inst_id: inst48000071}
+// CHECK:STDOUT:     import_ir_inst16: {ir_id: import_ir60000004, inst_id: inst4800006C}
+// CHECK:STDOUT:     import_ir_inst17: {ir_id: import_ir60000004, inst_id: inst4800006E}
+// CHECK:STDOUT:     import_ir_inst18: {ir_id: import_ir60000004, inst_id: inst48000050}
+// CHECK:STDOUT:     import_ir_inst19: {ir_id: import_ir60000004, inst_id: inst48000067}
+// CHECK:STDOUT:     import_ir_inst1A: {ir_id: import_ir60000004, inst_id: inst48000068}
+// CHECK:STDOUT:     import_ir_inst1B: {ir_id: import_ir60000004, inst_id: inst48000069}
+// CHECK:STDOUT:     import_ir_inst1C: {ir_id: import_ir60000004, inst_id: inst4800006D}
+// CHECK:STDOUT:     import_ir_inst1D: {ir_id: import_ir60000004, inst_id: inst4800007D}
+// CHECK:STDOUT:     import_ir_inst1E: {ir_id: import_ir60000004, inst_id: inst48000085}
+// CHECK:STDOUT:     import_ir_inst1F: {ir_id: import_ir60000004, inst_id: inst4800008C}
+// CHECK:STDOUT:     import_ir_inst20: {ir_id: import_ir60000004, inst_id: inst48000090}
+// CHECK:STDOUT:     import_ir_inst21: {ir_id: import_ir60000004, inst_id: inst48000091}
+// CHECK:STDOUT:     import_ir_inst22: {ir_id: import_ir60000004, inst_id: inst48000096}
+// CHECK:STDOUT:     import_ir_inst23: {ir_id: import_ir60000004, inst_id: inst48000054}
+// CHECK:STDOUT:     import_ir_inst24: {ir_id: import_ir60000004, inst_id: inst4800005A}
+// CHECK:STDOUT:     import_ir_inst25: {ir_id: import_ir60000004, inst_id: inst4800005D}
+// CHECK:STDOUT:     import_ir_inst26: {ir_id: import_ir60000004, inst_id: inst48000050}
+// CHECK:STDOUT:     import_ir_inst27: {ir_id: import_ir60000004, inst_id: inst48000052}
+// CHECK:STDOUT:     import_ir_inst28: {ir_id: import_ir60000004, inst_id: inst48000058}
+// CHECK:STDOUT:     import_ir_inst29: {ir_id: import_ir60000004, inst_id: inst4800005C}
+// CHECK:STDOUT:     import_ir_inst2A: {ir_id: import_ir60000004, inst_id: inst48000063}
+// CHECK:STDOUT:     import_ir_inst2B: {ir_id: import_ir60000004, inst_id: inst48000078}
+// CHECK:STDOUT:     import_ir_inst2C: {ir_id: import_ir60000004, inst_id: inst48000079}
+// CHECK:STDOUT:     import_ir_inst2D: {ir_id: import_ir60000004, inst_id: inst480000AB}
+// CHECK:STDOUT:     import_ir_inst2E: {ir_id: import_ir60000004, inst_id: inst480000A9}
+// CHECK:STDOUT:     import_ir_inst2F: {ir_id: import_ir60000004, inst_id: inst480000A7}
+// CHECK:STDOUT:     import_ir_inst30: {ir_id: import_ir60000004, inst_id: inst480000A8}
+// CHECK:STDOUT:     import_ir_inst31: {ir_id: import_ir60000004, inst_id: inst480000C3}
+// CHECK:STDOUT:     import_ir_inst32: {ir_id: import_ir60000004, inst_id: inst480000C1}
+// CHECK:STDOUT:     import_ir_inst33: {ir_id: import_ir60000004, inst_id: inst480000BF}
+// CHECK:STDOUT:     import_ir_inst34: {ir_id: import_ir60000004, inst_id: inst480000C0}
+// CHECK:STDOUT:     import_ir_inst35: {ir_id: import_ir60000004, inst_id: inst480000DB}
+// CHECK:STDOUT:     import_ir_inst36: {ir_id: import_ir60000004, inst_id: inst480000D9}
+// CHECK:STDOUT:     import_ir_inst37: {ir_id: import_ir60000004, inst_id: inst480000D7}
+// CHECK:STDOUT:     import_ir_inst38: {ir_id: import_ir60000004, inst_id: inst480000D8}
+// CHECK:STDOUT:     import_ir_inst39: {ir_id: import_ir60000004, inst_id: inst480000F3}
+// CHECK:STDOUT:     import_ir_inst3A: {ir_id: import_ir60000004, inst_id: inst480000F1}
+// CHECK:STDOUT:     import_ir_inst3B: {ir_id: import_ir60000004, inst_id: inst480000EF}
+// CHECK:STDOUT:     import_ir_inst3C: {ir_id: import_ir60000004, inst_id: inst480000F0}
+// CHECK:STDOUT:     import_ir_inst3D: {ir_id: import_ir60000004, inst_id: inst48000110}
+// CHECK:STDOUT:     import_ir_inst3E: {ir_id: import_ir60000004, inst_id: inst4800010E}
+// CHECK:STDOUT:     import_ir_inst3F: {ir_id: import_ir60000004, inst_id: inst48000121}
+// CHECK:STDOUT:     import_ir_inst40: {ir_id: import_ir60000004, inst_id: inst4800010F}
+// CHECK:STDOUT:     import_ir_inst41: {ir_id: import_ir60000004, inst_id: inst48000108}
+// CHECK:STDOUT:     import_ir_inst42: {ir_id: import_ir60000004, inst_id: inst4800010A}
+// CHECK:STDOUT:     import_ir_inst43: {ir_id: import_ir60000004, inst_id: inst4800010D}
+// CHECK:STDOUT:     import_ir_inst44: {ir_id: import_ir60000004, inst_id: inst48000105}
+// CHECK:STDOUT:     import_ir_inst45: {ir_id: import_ir60000004, inst_id: inst48000107}
+// CHECK:STDOUT:     import_ir_inst46: {ir_id: import_ir60000004, inst_id: inst4800010C}
+// CHECK:STDOUT:     import_ir_inst47: {ir_id: import_ir60000004, inst_id: inst48000112}
+// CHECK:STDOUT:     import_ir_inst48: {ir_id: import_ir60000004, inst_id: inst48000121}
+// CHECK:STDOUT:     import_ir_inst49: {ir_id: import_ir60000004, inst_id: inst4800011C}
+// CHECK:STDOUT:     import_ir_inst4A: {ir_id: import_ir60000004, inst_id: inst4800011D}
+// CHECK:STDOUT:     import_ir_inst4B: {ir_id: import_ir60000004, inst_id: inst48000118}
+// CHECK:STDOUT:     import_ir_inst4C: {ir_id: import_ir60000004, inst_id: inst4800011A}
+// CHECK:STDOUT:     import_ir_inst4D: {ir_id: import_ir60000004, inst_id: inst48000105}
+// CHECK:STDOUT:     import_ir_inst4E: {ir_id: import_ir60000004, inst_id: inst48000114}
+// CHECK:STDOUT:     import_ir_inst4F: {ir_id: import_ir60000004, inst_id: inst48000115}
+// CHECK:STDOUT:     import_ir_inst50: {ir_id: import_ir60000004, inst_id: inst48000119}
+// CHECK:STDOUT:     import_ir_inst51: {ir_id: import_ir60000004, inst_id: inst48000124}
+// CHECK:STDOUT:     import_ir_inst52: {ir_id: import_ir60000004, inst_id: inst48000125}
+// CHECK:STDOUT:     import_ir_inst53: {ir_id: import_ir60000004, inst_id: inst48000128}
+// CHECK:STDOUT:     import_ir_inst54: {ir_id: import_ir60000004, inst_id: inst4800012E}
+// CHECK:STDOUT:     import_ir_inst55: {ir_id: import_ir60000004, inst_id: inst4800012C}
 // CHECK:STDOUT:     import_ir_inst56: {ir_id: import_ir60000004, inst_id: inst(TypeType)}
-// CHECK:STDOUT:     import_ir_inst57: {ir_id: import_ir60000004, inst_id: inst4800012A}
-// CHECK:STDOUT:     import_ir_inst58: {ir_id: import_ir60000004, inst_id: inst48000143}
-// CHECK:STDOUT:     import_ir_inst59: {ir_id: import_ir60000004, inst_id: inst48000141}
-// CHECK:STDOUT:     import_ir_inst5A: {ir_id: import_ir60000004, inst_id: inst4800013F}
-// CHECK:STDOUT:     import_ir_inst5B: {ir_id: import_ir60000004, inst_id: inst48000140}
-// CHECK:STDOUT:     import_ir_inst5C: {ir_id: import_ir60000004, inst_id: inst48000175}
-// CHECK:STDOUT:     import_ir_inst5D: {ir_id: import_ir60000004, inst_id: inst48000173}
-// CHECK:STDOUT:     import_ir_inst5E: {ir_id: import_ir60000004, inst_id: inst4800018D}
-// CHECK:STDOUT:     import_ir_inst5F: {ir_id: import_ir60000004, inst_id: inst48000174}
-// CHECK:STDOUT:     import_ir_inst60: {ir_id: import_ir60000004, inst_id: inst4800018D}
-// CHECK:STDOUT:     import_ir_inst61: {ir_id: import_ir60000004, inst_id: inst48000188}
-// CHECK:STDOUT:     import_ir_inst62: {ir_id: import_ir60000004, inst_id: inst48000189}
-// CHECK:STDOUT:     import_ir_inst63: {ir_id: import_ir60000004, inst_id: inst48000184}
-// CHECK:STDOUT:     import_ir_inst64: {ir_id: import_ir60000004, inst_id: inst48000186}
-// CHECK:STDOUT:     import_ir_inst65: {ir_id: import_ir60000004, inst_id: inst48000156}
-// CHECK:STDOUT:     import_ir_inst66: {ir_id: import_ir60000004, inst_id: inst4800015B}
-// CHECK:STDOUT:     import_ir_inst67: {ir_id: import_ir60000004, inst_id: inst4800017D}
-// CHECK:STDOUT:     import_ir_inst68: {ir_id: import_ir60000004, inst_id: inst4800017E}
-// CHECK:STDOUT:     import_ir_inst69: {ir_id: import_ir60000004, inst_id: inst4800017F}
-// CHECK:STDOUT:     import_ir_inst6A: {ir_id: import_ir60000004, inst_id: inst48000180}
-// CHECK:STDOUT:     import_ir_inst6B: {ir_id: import_ir60000004, inst_id: inst48000181}
-// CHECK:STDOUT:     import_ir_inst6C: {ir_id: import_ir60000004, inst_id: inst48000185}
-// CHECK:STDOUT:     import_ir_inst6D: {ir_id: import_ir60000004, inst_id: inst48000196}
-// CHECK:STDOUT:     import_ir_inst6E: {ir_id: import_ir60000004, inst_id: inst4800019E}
-// CHECK:STDOUT:     import_ir_inst6F: {ir_id: import_ir60000004, inst_id: inst480001A2}
-// CHECK:STDOUT:     import_ir_inst70: {ir_id: import_ir60000004, inst_id: inst480001A4}
-// CHECK:STDOUT:     import_ir_inst71: {ir_id: import_ir60000004, inst_id: inst480001A5}
-// CHECK:STDOUT:     import_ir_inst72: {ir_id: import_ir60000004, inst_id: inst480001A8}
-// CHECK:STDOUT:     import_ir_inst73: {ir_id: import_ir60000004, inst_id: inst480001B4}
-// CHECK:STDOUT:     import_ir_inst74: {ir_id: import_ir60000004, inst_id: inst480001B9}
-// CHECK:STDOUT:     import_ir_inst75: {ir_id: import_ir60000004, inst_id: inst480001BD}
-// CHECK:STDOUT:     import_ir_inst76: {ir_id: import_ir60000004, inst_id: inst480001BE}
-// CHECK:STDOUT:     import_ir_inst77: {ir_id: import_ir60000004, inst_id: inst480001C3}
-// CHECK:STDOUT:     import_ir_inst78: {ir_id: import_ir60000004, inst_id: inst4800015E}
-// CHECK:STDOUT:     import_ir_inst79: {ir_id: import_ir60000004, inst_id: inst48000158}
-// CHECK:STDOUT:     import_ir_inst7A: {ir_id: import_ir60000004, inst_id: inst4800016E}
-// CHECK:STDOUT:     import_ir_inst7B: {ir_id: import_ir60000004, inst_id: inst48000170}
-// CHECK:STDOUT:     import_ir_inst7C: {ir_id: import_ir60000004, inst_id: inst48000156}
-// CHECK:STDOUT:     import_ir_inst7D: {ir_id: import_ir60000004, inst_id: inst4800015B}
-// CHECK:STDOUT:     import_ir_inst7E: {ir_id: import_ir60000004, inst_id: inst48000157}
-// CHECK:STDOUT:     import_ir_inst7F: {ir_id: import_ir60000004, inst_id: inst4800015D}
-// CHECK:STDOUT:     import_ir_inst80: {ir_id: import_ir60000004, inst_id: inst48000164}
-// CHECK:STDOUT:     import_ir_inst81: {ir_id: import_ir60000004, inst_id: inst48000167}
-// CHECK:STDOUT:     import_ir_inst82: {ir_id: import_ir60000004, inst_id: inst4800016B}
-// CHECK:STDOUT:     import_ir_inst83: {ir_id: import_ir60000004, inst_id: inst4800016F}
-// CHECK:STDOUT:     import_ir_inst84: {ir_id: import_ir60000004, inst_id: inst48000177}
-// CHECK:STDOUT:     import_ir_inst85: {ir_id: import_ir60000004, inst_id: inst48000190}
-// CHECK:STDOUT:     import_ir_inst86: {ir_id: import_ir60000004, inst_id: inst48000191}
-// CHECK:STDOUT:     import_ir_inst87: {ir_id: import_ir60000004, inst_id: inst480001FE}
-// CHECK:STDOUT:     import_ir_inst88: {ir_id: import_ir60000004, inst_id: inst480001FC}
-// CHECK:STDOUT:     import_ir_inst89: {ir_id: import_ir60000004, inst_id: inst4800021A}
-// CHECK:STDOUT:     import_ir_inst8A: {ir_id: import_ir60000004, inst_id: inst480001FD}
-// CHECK:STDOUT:     import_ir_inst8B: {ir_id: import_ir60000004, inst_id: inst4800021A}
-// CHECK:STDOUT:     import_ir_inst8C: {ir_id: import_ir60000004, inst_id: inst48000215}
-// CHECK:STDOUT:     import_ir_inst8D: {ir_id: import_ir60000004, inst_id: inst48000216}
-// CHECK:STDOUT:     import_ir_inst8E: {ir_id: import_ir60000004, inst_id: inst48000211}
-// CHECK:STDOUT:     import_ir_inst8F: {ir_id: import_ir60000004, inst_id: inst48000213}
-// CHECK:STDOUT:     import_ir_inst90: {ir_id: import_ir60000004, inst_id: inst480001D5}
-// CHECK:STDOUT:     import_ir_inst91: {ir_id: import_ir60000004, inst_id: inst480001DA}
-// CHECK:STDOUT:     import_ir_inst92: {ir_id: import_ir60000004, inst_id: inst480001DF}
-// CHECK:STDOUT:     import_ir_inst93: {ir_id: import_ir60000004, inst_id: inst48000208}
-// CHECK:STDOUT:     import_ir_inst94: {ir_id: import_ir60000004, inst_id: inst48000209}
-// CHECK:STDOUT:     import_ir_inst95: {ir_id: import_ir60000004, inst_id: inst4800020A}
-// CHECK:STDOUT:     import_ir_inst96: {ir_id: import_ir60000004, inst_id: inst4800020B}
-// CHECK:STDOUT:     import_ir_inst97: {ir_id: import_ir60000004, inst_id: inst4800020C}
-// CHECK:STDOUT:     import_ir_inst98: {ir_id: import_ir60000004, inst_id: inst4800020D}
-// CHECK:STDOUT:     import_ir_inst99: {ir_id: import_ir60000004, inst_id: inst4800020E}
-// CHECK:STDOUT:     import_ir_inst9A: {ir_id: import_ir60000004, inst_id: inst48000212}
-// CHECK:STDOUT:     import_ir_inst9B: {ir_id: import_ir60000004, inst_id: inst48000223}
-// CHECK:STDOUT:     import_ir_inst9C: {ir_id: import_ir60000004, inst_id: inst4800022A}
-// CHECK:STDOUT:     import_ir_inst9D: {ir_id: import_ir60000004, inst_id: inst4800022E}
-// CHECK:STDOUT:     import_ir_inst9E: {ir_id: import_ir60000004, inst_id: inst48000230}
-// CHECK:STDOUT:     import_ir_inst9F: {ir_id: import_ir60000004, inst_id: inst48000231}
-// CHECK:STDOUT:     import_ir_instA0: {ir_id: import_ir60000004, inst_id: inst48000234}
-// CHECK:STDOUT:     import_ir_instA1: {ir_id: import_ir60000004, inst_id: inst4800023E}
-// CHECK:STDOUT:     import_ir_instA2: {ir_id: import_ir60000004, inst_id: inst48000242}
-// CHECK:STDOUT:     import_ir_instA3: {ir_id: import_ir60000004, inst_id: inst48000244}
-// CHECK:STDOUT:     import_ir_instA4: {ir_id: import_ir60000004, inst_id: inst48000245}
-// CHECK:STDOUT:     import_ir_instA5: {ir_id: import_ir60000004, inst_id: inst48000248}
-// CHECK:STDOUT:     import_ir_instA6: {ir_id: import_ir60000004, inst_id: inst48000254}
-// CHECK:STDOUT:     import_ir_instA7: {ir_id: import_ir60000004, inst_id: inst48000259}
-// CHECK:STDOUT:     import_ir_instA8: {ir_id: import_ir60000004, inst_id: inst4800025D}
-// CHECK:STDOUT:     import_ir_instA9: {ir_id: import_ir60000004, inst_id: inst4800025E}
-// CHECK:STDOUT:     import_ir_instAA: {ir_id: import_ir60000004, inst_id: inst48000263}
-// CHECK:STDOUT:     import_ir_instAB: {ir_id: import_ir60000004, inst_id: inst480001E2}
-// CHECK:STDOUT:     import_ir_instAC: {ir_id: import_ir60000004, inst_id: inst480001DC}
-// CHECK:STDOUT:     import_ir_instAD: {ir_id: import_ir60000004, inst_id: inst480001D7}
-// CHECK:STDOUT:     import_ir_instAE: {ir_id: import_ir60000004, inst_id: inst480001F6}
-// CHECK:STDOUT:     import_ir_instAF: {ir_id: import_ir60000004, inst_id: inst480001F8}
-// CHECK:STDOUT:     import_ir_instB0: {ir_id: import_ir60000004, inst_id: inst480001D5}
-// CHECK:STDOUT:     import_ir_instB1: {ir_id: import_ir60000004, inst_id: inst480001DA}
-// CHECK:STDOUT:     import_ir_instB2: {ir_id: import_ir60000004, inst_id: inst480001DF}
-// CHECK:STDOUT:     import_ir_instB3: {ir_id: import_ir60000004, inst_id: inst480001D6}
-// CHECK:STDOUT:     import_ir_instB4: {ir_id: import_ir60000004, inst_id: inst480001DB}
-// CHECK:STDOUT:     import_ir_instB5: {ir_id: import_ir60000004, inst_id: inst480001E1}
-// CHECK:STDOUT:     import_ir_instB6: {ir_id: import_ir60000004, inst_id: inst480001E9}
-// CHECK:STDOUT:     import_ir_instB7: {ir_id: import_ir60000004, inst_id: inst480001EC}
-// CHECK:STDOUT:     import_ir_instB8: {ir_id: import_ir60000004, inst_id: inst480001EF}
-// CHECK:STDOUT:     import_ir_instB9: {ir_id: import_ir60000004, inst_id: inst480001F3}
-// CHECK:STDOUT:     import_ir_instBA: {ir_id: import_ir60000004, inst_id: inst480001F7}
-// CHECK:STDOUT:     import_ir_instBB: {ir_id: import_ir60000004, inst_id: inst48000200}
-// CHECK:STDOUT:     import_ir_instBC: {ir_id: import_ir60000004, inst_id: inst4800021D}
-// CHECK:STDOUT:     import_ir_instBD: {ir_id: import_ir60000004, inst_id: inst4800021E}
+// CHECK:STDOUT:     import_ir_inst57: {ir_id: import_ir60000004, inst_id: inst4800012B}
+// CHECK:STDOUT:     import_ir_inst58: {ir_id: import_ir60000004, inst_id: inst48000144}
+// CHECK:STDOUT:     import_ir_inst59: {ir_id: import_ir60000004, inst_id: inst48000142}
+// CHECK:STDOUT:     import_ir_inst5A: {ir_id: import_ir60000004, inst_id: inst48000140}
+// CHECK:STDOUT:     import_ir_inst5B: {ir_id: import_ir60000004, inst_id: inst48000141}
+// CHECK:STDOUT:     import_ir_inst5C: {ir_id: import_ir60000004, inst_id: inst48000176}
+// CHECK:STDOUT:     import_ir_inst5D: {ir_id: import_ir60000004, inst_id: inst48000174}
+// CHECK:STDOUT:     import_ir_inst5E: {ir_id: import_ir60000004, inst_id: inst4800018E}
+// CHECK:STDOUT:     import_ir_inst5F: {ir_id: import_ir60000004, inst_id: inst48000175}
+// CHECK:STDOUT:     import_ir_inst60: {ir_id: import_ir60000004, inst_id: inst4800018E}
+// CHECK:STDOUT:     import_ir_inst61: {ir_id: import_ir60000004, inst_id: inst48000189}
+// CHECK:STDOUT:     import_ir_inst62: {ir_id: import_ir60000004, inst_id: inst4800018A}
+// CHECK:STDOUT:     import_ir_inst63: {ir_id: import_ir60000004, inst_id: inst48000185}
+// CHECK:STDOUT:     import_ir_inst64: {ir_id: import_ir60000004, inst_id: inst48000187}
+// CHECK:STDOUT:     import_ir_inst65: {ir_id: import_ir60000004, inst_id: inst48000157}
+// CHECK:STDOUT:     import_ir_inst66: {ir_id: import_ir60000004, inst_id: inst4800015C}
+// CHECK:STDOUT:     import_ir_inst67: {ir_id: import_ir60000004, inst_id: inst4800017E}
+// CHECK:STDOUT:     import_ir_inst68: {ir_id: import_ir60000004, inst_id: inst4800017F}
+// CHECK:STDOUT:     import_ir_inst69: {ir_id: import_ir60000004, inst_id: inst48000180}
+// CHECK:STDOUT:     import_ir_inst6A: {ir_id: import_ir60000004, inst_id: inst48000181}
+// CHECK:STDOUT:     import_ir_inst6B: {ir_id: import_ir60000004, inst_id: inst48000182}
+// CHECK:STDOUT:     import_ir_inst6C: {ir_id: import_ir60000004, inst_id: inst48000186}
+// CHECK:STDOUT:     import_ir_inst6D: {ir_id: import_ir60000004, inst_id: inst48000197}
+// CHECK:STDOUT:     import_ir_inst6E: {ir_id: import_ir60000004, inst_id: inst4800019F}
+// CHECK:STDOUT:     import_ir_inst6F: {ir_id: import_ir60000004, inst_id: inst480001A3}
+// CHECK:STDOUT:     import_ir_inst70: {ir_id: import_ir60000004, inst_id: inst480001A5}
+// CHECK:STDOUT:     import_ir_inst71: {ir_id: import_ir60000004, inst_id: inst480001A6}
+// CHECK:STDOUT:     import_ir_inst72: {ir_id: import_ir60000004, inst_id: inst480001A9}
+// CHECK:STDOUT:     import_ir_inst73: {ir_id: import_ir60000004, inst_id: inst480001B5}
+// CHECK:STDOUT:     import_ir_inst74: {ir_id: import_ir60000004, inst_id: inst480001BA}
+// CHECK:STDOUT:     import_ir_inst75: {ir_id: import_ir60000004, inst_id: inst480001BE}
+// CHECK:STDOUT:     import_ir_inst76: {ir_id: import_ir60000004, inst_id: inst480001BF}
+// CHECK:STDOUT:     import_ir_inst77: {ir_id: import_ir60000004, inst_id: inst480001C4}
+// CHECK:STDOUT:     import_ir_inst78: {ir_id: import_ir60000004, inst_id: inst4800015F}
+// CHECK:STDOUT:     import_ir_inst79: {ir_id: import_ir60000004, inst_id: inst48000159}
+// CHECK:STDOUT:     import_ir_inst7A: {ir_id: import_ir60000004, inst_id: inst4800016F}
+// CHECK:STDOUT:     import_ir_inst7B: {ir_id: import_ir60000004, inst_id: inst48000171}
+// CHECK:STDOUT:     import_ir_inst7C: {ir_id: import_ir60000004, inst_id: inst48000157}
+// CHECK:STDOUT:     import_ir_inst7D: {ir_id: import_ir60000004, inst_id: inst4800015C}
+// CHECK:STDOUT:     import_ir_inst7E: {ir_id: import_ir60000004, inst_id: inst48000158}
+// CHECK:STDOUT:     import_ir_inst7F: {ir_id: import_ir60000004, inst_id: inst4800015E}
+// CHECK:STDOUT:     import_ir_inst80: {ir_id: import_ir60000004, inst_id: inst48000165}
+// CHECK:STDOUT:     import_ir_inst81: {ir_id: import_ir60000004, inst_id: inst48000168}
+// CHECK:STDOUT:     import_ir_inst82: {ir_id: import_ir60000004, inst_id: inst4800016C}
+// CHECK:STDOUT:     import_ir_inst83: {ir_id: import_ir60000004, inst_id: inst48000170}
+// CHECK:STDOUT:     import_ir_inst84: {ir_id: import_ir60000004, inst_id: inst48000178}
+// CHECK:STDOUT:     import_ir_inst85: {ir_id: import_ir60000004, inst_id: inst48000191}
+// CHECK:STDOUT:     import_ir_inst86: {ir_id: import_ir60000004, inst_id: inst48000192}
+// CHECK:STDOUT:     import_ir_inst87: {ir_id: import_ir60000004, inst_id: inst480001FF}
+// CHECK:STDOUT:     import_ir_inst88: {ir_id: import_ir60000004, inst_id: inst480001FD}
+// CHECK:STDOUT:     import_ir_inst89: {ir_id: import_ir60000004, inst_id: inst4800021B}
+// CHECK:STDOUT:     import_ir_inst8A: {ir_id: import_ir60000004, inst_id: inst480001FE}
+// CHECK:STDOUT:     import_ir_inst8B: {ir_id: import_ir60000004, inst_id: inst4800021B}
+// CHECK:STDOUT:     import_ir_inst8C: {ir_id: import_ir60000004, inst_id: inst48000216}
+// CHECK:STDOUT:     import_ir_inst8D: {ir_id: import_ir60000004, inst_id: inst48000217}
+// CHECK:STDOUT:     import_ir_inst8E: {ir_id: import_ir60000004, inst_id: inst48000212}
+// CHECK:STDOUT:     import_ir_inst8F: {ir_id: import_ir60000004, inst_id: inst48000214}
+// CHECK:STDOUT:     import_ir_inst90: {ir_id: import_ir60000004, inst_id: inst480001D6}
+// CHECK:STDOUT:     import_ir_inst91: {ir_id: import_ir60000004, inst_id: inst480001DB}
+// CHECK:STDOUT:     import_ir_inst92: {ir_id: import_ir60000004, inst_id: inst480001E0}
+// CHECK:STDOUT:     import_ir_inst93: {ir_id: import_ir60000004, inst_id: inst48000209}
+// CHECK:STDOUT:     import_ir_inst94: {ir_id: import_ir60000004, inst_id: inst4800020A}
+// CHECK:STDOUT:     import_ir_inst95: {ir_id: import_ir60000004, inst_id: inst4800020B}
+// CHECK:STDOUT:     import_ir_inst96: {ir_id: import_ir60000004, inst_id: inst4800020C}
+// CHECK:STDOUT:     import_ir_inst97: {ir_id: import_ir60000004, inst_id: inst4800020D}
+// CHECK:STDOUT:     import_ir_inst98: {ir_id: import_ir60000004, inst_id: inst4800020E}
+// CHECK:STDOUT:     import_ir_inst99: {ir_id: import_ir60000004, inst_id: inst4800020F}
+// CHECK:STDOUT:     import_ir_inst9A: {ir_id: import_ir60000004, inst_id: inst48000213}
+// CHECK:STDOUT:     import_ir_inst9B: {ir_id: import_ir60000004, inst_id: inst48000224}
+// CHECK:STDOUT:     import_ir_inst9C: {ir_id: import_ir60000004, inst_id: inst4800022B}
+// CHECK:STDOUT:     import_ir_inst9D: {ir_id: import_ir60000004, inst_id: inst4800022F}
+// CHECK:STDOUT:     import_ir_inst9E: {ir_id: import_ir60000004, inst_id: inst48000231}
+// CHECK:STDOUT:     import_ir_inst9F: {ir_id: import_ir60000004, inst_id: inst48000232}
+// CHECK:STDOUT:     import_ir_instA0: {ir_id: import_ir60000004, inst_id: inst48000235}
+// CHECK:STDOUT:     import_ir_instA1: {ir_id: import_ir60000004, inst_id: inst4800023F}
+// CHECK:STDOUT:     import_ir_instA2: {ir_id: import_ir60000004, inst_id: inst48000243}
+// CHECK:STDOUT:     import_ir_instA3: {ir_id: import_ir60000004, inst_id: inst48000245}
+// CHECK:STDOUT:     import_ir_instA4: {ir_id: import_ir60000004, inst_id: inst48000246}
+// CHECK:STDOUT:     import_ir_instA5: {ir_id: import_ir60000004, inst_id: inst48000249}
+// CHECK:STDOUT:     import_ir_instA6: {ir_id: import_ir60000004, inst_id: inst48000255}
+// CHECK:STDOUT:     import_ir_instA7: {ir_id: import_ir60000004, inst_id: inst4800025A}
+// CHECK:STDOUT:     import_ir_instA8: {ir_id: import_ir60000004, inst_id: inst4800025E}
+// CHECK:STDOUT:     import_ir_instA9: {ir_id: import_ir60000004, inst_id: inst4800025F}
+// CHECK:STDOUT:     import_ir_instAA: {ir_id: import_ir60000004, inst_id: inst48000264}
+// CHECK:STDOUT:     import_ir_instAB: {ir_id: import_ir60000004, inst_id: inst480001E3}
+// CHECK:STDOUT:     import_ir_instAC: {ir_id: import_ir60000004, inst_id: inst480001DD}
+// CHECK:STDOUT:     import_ir_instAD: {ir_id: import_ir60000004, inst_id: inst480001D8}
+// CHECK:STDOUT:     import_ir_instAE: {ir_id: import_ir60000004, inst_id: inst480001F7}
+// CHECK:STDOUT:     import_ir_instAF: {ir_id: import_ir60000004, inst_id: inst480001F9}
+// CHECK:STDOUT:     import_ir_instB0: {ir_id: import_ir60000004, inst_id: inst480001D6}
+// CHECK:STDOUT:     import_ir_instB1: {ir_id: import_ir60000004, inst_id: inst480001DB}
+// CHECK:STDOUT:     import_ir_instB2: {ir_id: import_ir60000004, inst_id: inst480001E0}
+// CHECK:STDOUT:     import_ir_instB3: {ir_id: import_ir60000004, inst_id: inst480001D7}
+// CHECK:STDOUT:     import_ir_instB4: {ir_id: import_ir60000004, inst_id: inst480001DC}
+// CHECK:STDOUT:     import_ir_instB5: {ir_id: import_ir60000004, inst_id: inst480001E2}
+// CHECK:STDOUT:     import_ir_instB6: {ir_id: import_ir60000004, inst_id: inst480001EA}
+// CHECK:STDOUT:     import_ir_instB7: {ir_id: import_ir60000004, inst_id: inst480001ED}
+// CHECK:STDOUT:     import_ir_instB8: {ir_id: import_ir60000004, inst_id: inst480001F0}
+// CHECK:STDOUT:     import_ir_instB9: {ir_id: import_ir60000004, inst_id: inst480001F4}
+// CHECK:STDOUT:     import_ir_instBA: {ir_id: import_ir60000004, inst_id: inst480001F8}
+// CHECK:STDOUT:     import_ir_instBB: {ir_id: import_ir60000004, inst_id: inst48000201}
+// CHECK:STDOUT:     import_ir_instBC: {ir_id: import_ir60000004, inst_id: inst4800021E}
+// CHECK:STDOUT:     import_ir_instBD: {ir_id: import_ir60000004, inst_id: inst4800021F}
 // CHECK:STDOUT:   clang_decls:     {}
 // CHECK:STDOUT:   name_scopes:
-// CHECK:STDOUT:     name_scope0:     {inst: instD, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {name(Core): inst6000000F, name0: inst60000037}}
-// CHECK:STDOUT:     name_scope60000001: {inst: inst6000000F, parent_scope: name_scope0, has_error: false, extended_scopes: [], names: {name3: inst60000047}}
-// CHECK:STDOUT:     name_scope60000002: {inst: inst60000048, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {name(SelfType): inst6000004B, name4: inst6000004C}}
-// CHECK:STDOUT:     name_scope60000003: {inst: inst60000060, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
-// CHECK:STDOUT:     name_scope60000004: {inst: inst6000008D, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
-// CHECK:STDOUT:     name_scope60000005: {inst: inst60000091, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
-// CHECK:STDOUT:     name_scope60000006: {inst: inst60000095, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
-// CHECK:STDOUT:     name_scope60000007: {inst: inst60000099, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
-// CHECK:STDOUT:     name_scope60000008: {inst: inst6000009D, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
-// CHECK:STDOUT:     name_scope60000009: {inst: inst600000B7, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
-// CHECK:STDOUT:     name_scope6000000A: {inst: inst600000BB, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
-// CHECK:STDOUT:     name_scope6000000B: {inst: inst600000BF, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
-// CHECK:STDOUT:     name_scope6000000C: {inst: inst600000FA, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
+// CHECK:STDOUT:     name_scope0:     {inst: instE, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {name(Core): inst60000010, name0: inst60000038}}
+// CHECK:STDOUT:     name_scope60000001: {inst: inst60000010, parent_scope: name_scope0, has_error: false, extended_scopes: [], names: {name3: inst60000048}}
+// CHECK:STDOUT:     name_scope60000002: {inst: inst60000049, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {name(SelfType): inst6000004C, name4: inst6000004D}}
+// CHECK:STDOUT:     name_scope60000003: {inst: inst60000061, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
+// CHECK:STDOUT:     name_scope60000004: {inst: inst6000008E, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
+// CHECK:STDOUT:     name_scope60000005: {inst: inst60000092, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
+// CHECK:STDOUT:     name_scope60000006: {inst: inst60000096, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
+// CHECK:STDOUT:     name_scope60000007: {inst: inst6000009A, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
+// CHECK:STDOUT:     name_scope60000008: {inst: inst6000009E, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
+// CHECK:STDOUT:     name_scope60000009: {inst: inst600000B8, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
+// CHECK:STDOUT:     name_scope6000000A: {inst: inst600000BC, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
+// CHECK:STDOUT:     name_scope6000000B: {inst: inst600000C0, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
+// CHECK:STDOUT:     name_scope6000000C: {inst: inst600000FB, parent_scope: name_scope60000001, has_error: false, extended_scopes: [], names: {}}
 // CHECK:STDOUT:   entity_names:
 // CHECK:STDOUT:     entity_name60000000: {name: name(PeriodSelf), parent_scope: name_scope<none>, index: -1, is_template: 0}
 // CHECK:STDOUT:     entity_name60000001: {name: name1, parent_scope: name_scope<none>, index: 0, is_template: 0}
@@ -298,24 +298,24 @@ fn Foo[T:! type](p: T*) -> (T*, ()) {
 // CHECK:STDOUT:     entity_name6000003D: {name: name1, parent_scope: name_scope<none>, index: 0, is_template: 0}
 // CHECK:STDOUT:   cpp_global_vars: {}
 // CHECK:STDOUT:   functions:
-// CHECK:STDOUT:     function60000000: {name: name0, parent_scope: name_scope0, call_params_id: inst_block6000000F, return_slot_pattern: inst60000032, body: [inst_block60000016]}
-// CHECK:STDOUT:     function60000001: {name: name4, parent_scope: name_scope60000002, return_slot_pattern: inst60000057}
-// CHECK:STDOUT:     function60000002: {name: name4, parent_scope: name_scope60000003, return_slot_pattern: inst6000006C}
-// CHECK:STDOUT:     function60000003: {name: name4, parent_scope: name_scope60000008, return_slot_pattern: inst600000AC}
-// CHECK:STDOUT:     function60000004: {name: name4, parent_scope: name_scope6000000B, return_slot_pattern: inst600000CD}
-// CHECK:STDOUT:     function60000005: {name: name4, parent_scope: name_scope6000000C, return_slot_pattern: inst60000108}
+// CHECK:STDOUT:     function60000000: {name: name0, parent_scope: name_scope0, call_params_id: inst_block6000000F, return_slot_pattern: inst60000033, body: [inst_block60000016]}
+// CHECK:STDOUT:     function60000001: {name: name4, parent_scope: name_scope60000002, return_slot_pattern: inst60000058}
+// CHECK:STDOUT:     function60000002: {name: name4, parent_scope: name_scope60000003, return_slot_pattern: inst6000006D}
+// CHECK:STDOUT:     function60000003: {name: name4, parent_scope: name_scope60000008, return_slot_pattern: inst600000AD}
+// CHECK:STDOUT:     function60000004: {name: name4, parent_scope: name_scope6000000B, return_slot_pattern: inst600000CE}
+// CHECK:STDOUT:     function60000005: {name: name4, parent_scope: name_scope6000000C, return_slot_pattern: inst60000109}
 // CHECK:STDOUT:   classes:         {}
 // CHECK:STDOUT:   generics:
-// CHECK:STDOUT:     generic60000000: {decl: inst60000037, bindings: inst_block60000012}
-// CHECK:STDOUT:     generic60000001: {decl: inst60000051, bindings: inst_block6000001A}
-// CHECK:STDOUT:     generic60000002: {decl: inst60000060, bindings: inst_block6000002A}
-// CHECK:STDOUT:     generic60000003: {decl: inst60000067, bindings: inst_block60000023}
-// CHECK:STDOUT:     generic60000004: {decl: inst6000009D, bindings: inst_block60000032}
-// CHECK:STDOUT:     generic60000005: {decl: inst600000A8, bindings: inst_block60000036}
-// CHECK:STDOUT:     generic60000006: {decl: inst600000BF, bindings: inst_block6000004C}
-// CHECK:STDOUT:     generic60000007: {decl: inst600000C6, bindings: inst_block60000042}
-// CHECK:STDOUT:     generic60000008: {decl: inst600000FA, bindings: inst_block60000065}
-// CHECK:STDOUT:     generic60000009: {decl: inst60000101, bindings: inst_block6000005A}
+// CHECK:STDOUT:     generic60000000: {decl: inst60000038, bindings: inst_block60000012}
+// CHECK:STDOUT:     generic60000001: {decl: inst60000052, bindings: inst_block6000001A}
+// CHECK:STDOUT:     generic60000002: {decl: inst60000061, bindings: inst_block6000002A}
+// CHECK:STDOUT:     generic60000003: {decl: inst60000068, bindings: inst_block60000023}
+// CHECK:STDOUT:     generic60000004: {decl: inst6000009E, bindings: inst_block60000032}
+// CHECK:STDOUT:     generic60000005: {decl: inst600000A9, bindings: inst_block60000036}
+// CHECK:STDOUT:     generic60000006: {decl: inst600000C0, bindings: inst_block6000004C}
+// CHECK:STDOUT:     generic60000007: {decl: inst600000C7, bindings: inst_block60000042}
+// CHECK:STDOUT:     generic60000008: {decl: inst600000FB, bindings: inst_block60000065}
+// CHECK:STDOUT:     generic60000009: {decl: inst60000102, bindings: inst_block6000005A}
 // CHECK:STDOUT:   specifics:
 // CHECK:STDOUT:     specific60000000: {generic: generic60000000, args: inst_block60000013}
 // CHECK:STDOUT:     specific60000001: {generic: generic60000001, args: inst_block6000001C}
@@ -340,8 +340,9 @@ fn Foo[T:! type](p: T*) -> (T*, ()) {
 // CHECK:STDOUT:     specific60000014: {generic: generic60000001, args: inst_block60000060}
 // CHECK:STDOUT:     specific60000015: {generic: generic60000001, args: inst_block60000061}
 // CHECK:STDOUT:     specific60000016: {generic: generic60000008, args: inst_block60000066}
-// CHECK:STDOUT:     specific60000017: {generic: generic60000001, args: inst_block6000006F}
-// CHECK:STDOUT:     specific60000018: {generic: generic60000001, args: inst_block60000071}
+// CHECK:STDOUT:     specific60000017: {generic: generic60000004, args: inst_block6000006D}
+// CHECK:STDOUT:     specific60000018: {generic: generic60000001, args: inst_block60000070}
+// CHECK:STDOUT:     specific60000019: {generic: generic60000001, args: inst_block60000072}
 // CHECK:STDOUT:   struct_type_fields:
 // CHECK:STDOUT:     struct_type_fields_empty: {}
 // CHECK:STDOUT:   types:
@@ -351,14 +352,14 @@ fn Foo[T:! type](p: T*) -> (T*, ()) {
 // CHECK:STDOUT:       value_repr:      {kind: copy, type: type(Error)}
 // CHECK:STDOUT:     'type(inst(NamespaceType))':
 // CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     'type(inst60000023)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000023)}
-// CHECK:STDOUT:     'type(inst6000002A)':
-// CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst6000002A)}
-// CHECK:STDOUT:     'type(inst60000026)':
-// CHECK:STDOUT:       value_repr:      {kind: pointer, type: type(inst6000002A)}
-// CHECK:STDOUT:     'type(inst60000038)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000023)}
+// CHECK:STDOUT:     'type(inst60000024)':
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000024)}
+// CHECK:STDOUT:     'type(inst6000002B)':
+// CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst6000002B)}
+// CHECK:STDOUT:     'type(inst60000027)':
+// CHECK:STDOUT:       value_repr:      {kind: pointer, type: type(inst6000002B)}
+// CHECK:STDOUT:     'type(inst60000039)':
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000024)}
 // CHECK:STDOUT:     'type(symbolic_constant3)':
 // CHECK:STDOUT:       value_repr:      {kind: copy, type: type(symbolic_constant3)}
 // CHECK:STDOUT:     'type(symbolic_constantD)':
@@ -372,1488 +373,1501 @@ fn Foo[T:! type](p: T*) -> (T*, ()) {
 // CHECK:STDOUT:     'type(symbolic_constantA)':
 // CHECK:STDOUT:       value_repr:      {kind: pointer, type: type(symbolic_constantD)}
 // CHECK:STDOUT:     'type(inst(InstType))':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000023)}
-// CHECK:STDOUT:     'type(inst60000049)':
-// CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst60000049)}
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000024)}
+// CHECK:STDOUT:     'type(inst6000004A)':
+// CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst6000004A)}
 // CHECK:STDOUT:     'type(inst(SpecificFunctionType))':
 // CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst(SpecificFunctionType))}
-// CHECK:STDOUT:     'type(symbolic_constant60000109)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000023)}
-// CHECK:STDOUT:     'type(symbolic_constant6000010C)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000023)}
+// CHECK:STDOUT:     'type(inst(RequireSpecificDefinitionType))':
+// CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst(RequireSpecificDefinitionType))}
+// CHECK:STDOUT:     'type(symbolic_constant6000010B)':
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000024)}
+// CHECK:STDOUT:     'type(symbolic_constant6000010E)':
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst60000024)}
 // CHECK:STDOUT:     'type(inst(BoundMethodType))':
 // CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst(BoundMethodType))}
 // CHECK:STDOUT:   insts:
-// CHECK:STDOUT:     instD:           {kind: Namespace, arg0: name_scope0, arg1: inst<none>, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     inst6000000E:    {kind: ImportDecl, arg0: name(Core)}
-// CHECK:STDOUT:     inst6000000F:    {kind: Namespace, arg0: name_scope60000001, arg1: inst6000000E, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     inst60000010:    {kind: FacetType, arg0: facet_type60000000, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000011:    {kind: SymbolicBinding, arg0: entity_name60000000, arg1: inst<none>, type: type(inst60000010)}
-// CHECK:STDOUT:     inst60000012:    {kind: SymbolicBinding, arg0: entity_name60000000, arg1: inst<none>, type: type(inst60000010)}
-// CHECK:STDOUT:     inst60000013:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(TypeType)}
+// CHECK:STDOUT:     instE:           {kind: Namespace, arg0: name_scope0, arg1: inst<none>, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     inst6000000F:    {kind: ImportDecl, arg0: name(Core)}
+// CHECK:STDOUT:     inst60000010:    {kind: Namespace, arg0: name_scope60000001, arg1: inst6000000F, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     inst60000011:    {kind: FacetType, arg0: facet_type60000000, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000012:    {kind: SymbolicBinding, arg0: entity_name60000000, arg1: inst<none>, type: type(inst60000011)}
+// CHECK:STDOUT:     inst60000013:    {kind: SymbolicBinding, arg0: entity_name60000000, arg1: inst<none>, type: type(inst60000011)}
 // CHECK:STDOUT:     inst60000014:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(TypeType)}
 // CHECK:STDOUT:     inst60000015:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000016:    {kind: PatternType, arg0: inst(TypeType), type: type(TypeType)}
-// CHECK:STDOUT:     inst60000017:    {kind: SymbolicBindingPattern, arg0: entity_name60000001, type: type(inst60000016)}
-// CHECK:STDOUT:     inst60000018:    {kind: NameRef, arg0: name1, arg1: inst60000013, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000019:    {kind: PointerType, arg0: inst60000018, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000001A:    {kind: PointerType, arg0: inst60000014, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000016:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000017:    {kind: PatternType, arg0: inst(TypeType), type: type(TypeType)}
+// CHECK:STDOUT:     inst60000018:    {kind: SymbolicBindingPattern, arg0: entity_name60000001, type: type(inst60000017)}
+// CHECK:STDOUT:     inst60000019:    {kind: NameRef, arg0: name1, arg1: inst60000014, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000001A:    {kind: PointerType, arg0: inst60000019, type: type(TypeType)}
 // CHECK:STDOUT:     inst6000001B:    {kind: PointerType, arg0: inst60000015, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000001C:    {kind: ValueBinding, arg0: entity_name60000002, arg1: inst60000033, type: type(symbolic_constant4)}
-// CHECK:STDOUT:     inst6000001D:    {kind: PatternType, arg0: inst6000001A, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000001E:    {kind: ValueBindingPattern, arg0: entity_name60000002, type: type(symbolic_constant6)}
-// CHECK:STDOUT:     inst6000001F:    {kind: PatternType, arg0: inst6000001B, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000020:    {kind: ValueParamPattern, arg0: inst6000001E, arg1: call_param0, type: type(symbolic_constant6)}
-// CHECK:STDOUT:     inst60000021:    {kind: NameRef, arg0: name1, arg1: inst60000013, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000022:    {kind: PointerType, arg0: inst60000021, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000023:    {kind: TupleType, arg0: inst_block_empty, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000024:    {kind: TupleLiteral, arg0: inst_block_empty, type: type(inst60000023)}
-// CHECK:STDOUT:     inst60000025:    {kind: TupleValue, arg0: inst_block_empty, type: type(inst60000023)}
-// CHECK:STDOUT:     inst60000026:    {kind: TupleType, arg0: inst_block60000009, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000027:    {kind: TupleLiteral, arg0: inst_block60000008, type: type(inst60000026)}
-// CHECK:STDOUT:     inst60000028:    {kind: TupleValue, arg0: inst_block6000000A, type: type(inst60000026)}
-// CHECK:STDOUT:     inst60000029:    {kind: TupleValue, arg0: inst_block6000000B, type: type(inst60000026)}
-// CHECK:STDOUT:     inst6000002A:    {kind: PointerType, arg0: inst60000026, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000002B:    {kind: Converted, arg0: inst60000025, arg1: inst60000023, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000002C:    {kind: TupleType, arg0: inst_block6000000D, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000002D:    {kind: Converted, arg0: inst60000027, arg1: inst6000002C, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000002E:    {kind: TupleType, arg0: inst_block6000000E, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000002F:    {kind: PatternType, arg0: inst6000002C, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000030:    {kind: ReturnSlotPattern, arg0: inst6000002D, type: type(symbolic_constantC)}
-// CHECK:STDOUT:     inst60000031:    {kind: PatternType, arg0: inst6000002E, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000032:    {kind: OutParamPattern, arg0: inst60000030, arg1: call_param1, type: type(symbolic_constantC)}
-// CHECK:STDOUT:     inst60000033:    {kind: ValueParam, arg0: call_param0, arg1: name2, type: type(symbolic_constant4)}
-// CHECK:STDOUT:     inst60000034:    {kind: SpliceBlock, arg0: inst_block60000006, arg1: inst60000019, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000035:    {kind: OutParam, arg0: call_param1, arg1: name(ReturnSlot), type: type(symbolic_constantA)}
-// CHECK:STDOUT:     inst60000036:    {kind: ReturnSlot, arg0: inst6000002C, arg1: inst60000035, type: type(symbolic_constantA)}
-// CHECK:STDOUT:     inst60000037:    {kind: FunctionDecl, arg0: function60000000, arg1: inst_block60000011, type: type(inst60000038)}
-// CHECK:STDOUT:     inst60000038:    {kind: FunctionType, arg0: function60000000, arg1: specific<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000039:    {kind: StructValue, arg0: inst_block_empty, type: type(inst60000038)}
-// CHECK:STDOUT:     inst6000003A:    {kind: PointerType, arg0: inst6000002C, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000003B:    {kind: RequireCompleteType, arg0: inst6000002C, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst6000003C:    {kind: RequireCompleteType, arg0: inst6000002C, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst6000003D:    {kind: RequireCompleteType, arg0: inst6000002E, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst6000003E:    {kind: RequireCompleteType, arg0: inst6000001A, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst6000003F:    {kind: RequireCompleteType, arg0: inst6000001A, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst6000001C:    {kind: PointerType, arg0: inst60000016, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000001D:    {kind: ValueBinding, arg0: entity_name60000002, arg1: inst60000034, type: type(symbolic_constant4)}
+// CHECK:STDOUT:     inst6000001E:    {kind: PatternType, arg0: inst6000001B, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000001F:    {kind: ValueBindingPattern, arg0: entity_name60000002, type: type(symbolic_constant6)}
+// CHECK:STDOUT:     inst60000020:    {kind: PatternType, arg0: inst6000001C, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000021:    {kind: ValueParamPattern, arg0: inst6000001F, arg1: call_param0, type: type(symbolic_constant6)}
+// CHECK:STDOUT:     inst60000022:    {kind: NameRef, arg0: name1, arg1: inst60000014, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000023:    {kind: PointerType, arg0: inst60000022, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000024:    {kind: TupleType, arg0: inst_block_empty, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000025:    {kind: TupleLiteral, arg0: inst_block_empty, type: type(inst60000024)}
+// CHECK:STDOUT:     inst60000026:    {kind: TupleValue, arg0: inst_block_empty, type: type(inst60000024)}
+// CHECK:STDOUT:     inst60000027:    {kind: TupleType, arg0: inst_block60000009, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000028:    {kind: TupleLiteral, arg0: inst_block60000008, type: type(inst60000027)}
+// CHECK:STDOUT:     inst60000029:    {kind: TupleValue, arg0: inst_block6000000A, type: type(inst60000027)}
+// CHECK:STDOUT:     inst6000002A:    {kind: TupleValue, arg0: inst_block6000000B, type: type(inst60000027)}
+// CHECK:STDOUT:     inst6000002B:    {kind: PointerType, arg0: inst60000027, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000002C:    {kind: Converted, arg0: inst60000026, arg1: inst60000024, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000002D:    {kind: TupleType, arg0: inst_block6000000D, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000002E:    {kind: Converted, arg0: inst60000028, arg1: inst6000002D, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000002F:    {kind: TupleType, arg0: inst_block6000000E, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000030:    {kind: PatternType, arg0: inst6000002D, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000031:    {kind: ReturnSlotPattern, arg0: inst6000002E, type: type(symbolic_constantC)}
+// CHECK:STDOUT:     inst60000032:    {kind: PatternType, arg0: inst6000002F, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000033:    {kind: OutParamPattern, arg0: inst60000031, arg1: call_param1, type: type(symbolic_constantC)}
+// CHECK:STDOUT:     inst60000034:    {kind: ValueParam, arg0: call_param0, arg1: name2, type: type(symbolic_constant4)}
+// CHECK:STDOUT:     inst60000035:    {kind: SpliceBlock, arg0: inst_block60000006, arg1: inst6000001A, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000036:    {kind: OutParam, arg0: call_param1, arg1: name(ReturnSlot), type: type(symbolic_constantA)}
+// CHECK:STDOUT:     inst60000037:    {kind: ReturnSlot, arg0: inst6000002D, arg1: inst60000036, type: type(symbolic_constantA)}
+// CHECK:STDOUT:     inst60000038:    {kind: FunctionDecl, arg0: function60000000, arg1: inst_block60000011, type: type(inst60000039)}
+// CHECK:STDOUT:     inst60000039:    {kind: FunctionType, arg0: function60000000, arg1: specific<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000003A:    {kind: StructValue, arg0: inst_block_empty, type: type(inst60000039)}
+// CHECK:STDOUT:     inst6000003B:    {kind: PointerType, arg0: inst6000002D, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000003C:    {kind: RequireCompleteType, arg0: inst6000002D, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst6000003D:    {kind: RequireCompleteType, arg0: inst6000002D, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst6000003E:    {kind: RequireCompleteType, arg0: inst6000002F, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst6000003F:    {kind: RequireCompleteType, arg0: inst6000001B, type: type(inst(WitnessType))}
 // CHECK:STDOUT:     inst60000040:    {kind: RequireCompleteType, arg0: inst6000001B, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst60000041:    {kind: NameRef, arg0: name2, arg1: inst6000001C, type: type(symbolic_constant4)}
-// CHECK:STDOUT:     inst60000042:    {kind: TupleLiteral, arg0: inst_block_empty, type: type(inst60000023)}
-// CHECK:STDOUT:     inst60000043:    {kind: TupleLiteral, arg0: inst_block60000017, type: type(symbolic_constantA)}
-// CHECK:STDOUT:     inst60000044:    {kind: RequireCompleteType, arg0: inst6000002C, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst60000045:    {kind: TupleAccess, arg0: inst60000036, arg1: element0, type: type(symbolic_constant4)}
-// CHECK:STDOUT:     inst60000046:    {kind: RequireCompleteType, arg0: inst6000001A, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst60000047:    {kind: ImportRefLoaded, arg0: import_ir_inst0, arg1: entity_name60000003, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000048:    {kind: InterfaceDecl, arg0: interface60000000, arg1: inst_block_empty, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000049:    {kind: FacetType, arg0: facet_type60000001, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000004A:    {kind: SymbolicBinding, arg0: entity_name60000004, arg1: inst<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst6000004B:    {kind: ImportRefUnloaded, arg0: import_ir_inst2, arg1: entity_name<none>}
-// CHECK:STDOUT:     inst6000004C:    {kind: ImportRefLoaded, arg0: import_ir_inst3, arg1: entity_name<none>, type: type(inst6000004E)}
-// CHECK:STDOUT:     inst6000004D:    {kind: ImportRefUnloaded, arg0: import_ir_inst4, arg1: entity_name60000005}
-// CHECK:STDOUT:     inst6000004E:    {kind: AssociatedEntityType, arg0: interface60000000, arg1: specific<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000004F:    {kind: ImportRefLoaded, arg0: import_ir_inst5, arg1: entity_name<none>, type: type(inst60000052)}
-// CHECK:STDOUT:     inst60000050:    {kind: AssociatedEntity, arg0: element0, arg1: inst6000004F, type: type(inst6000004E)}
-// CHECK:STDOUT:     inst60000051:    {kind: FunctionDecl, arg0: function60000001, arg1: inst_block_empty, type: type(inst60000052)}
-// CHECK:STDOUT:     inst60000052:    {kind: FunctionType, arg0: function60000001, arg1: specific<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000053:    {kind: StructValue, arg0: inst_block_empty, type: type(inst60000052)}
-// CHECK:STDOUT:     inst60000054:    {kind: SymbolicBindingType, arg0: entity_name60000004, arg1: inst6000004A, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000055:    {kind: PatternType, arg0: inst60000054, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000056:    {kind: ReturnSlotPattern, arg0: inst<none>, type: type(symbolic_constant60000015)}
-// CHECK:STDOUT:     inst60000057:    {kind: OutParamPattern, arg0: inst60000056, arg1: call_param1, type: type(symbolic_constant60000015)}
-// CHECK:STDOUT:     inst60000058:    {kind: ValueBindingPattern, arg0: entity_name60000008, type: type(symbolic_constant60000015)}
-// CHECK:STDOUT:     inst60000059:    {kind: ValueParamPattern, arg0: inst60000058, arg1: call_param0, type: type(symbolic_constant60000015)}
-// CHECK:STDOUT:     inst6000005A:    {kind: ImportRefLoaded, arg0: import_ir_instB, arg1: entity_name<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst6000005B:    {kind: SymbolicBinding, arg0: entity_name60000004, arg1: inst<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst6000005C:    {kind: SymbolicBindingType, arg0: entity_name60000004, arg1: inst6000005B, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000005D:    {kind: PatternType, arg0: inst6000005C, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000005E:    {kind: LookupImplWitness, arg0: inst6000001A, arg1: specific_interface60000000, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst6000005F:    {kind: ImportRefUnloaded, arg0: import_ir_instF, arg1: entity_name<none>}
-// CHECK:STDOUT:     inst60000060:    {kind: ImplDecl, arg0: impl60000000, arg1: inst_block_empty}
-// CHECK:STDOUT:     inst60000061:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst60000062:    {kind: SymbolicBindingType, arg0: entity_name60000001, arg1: inst60000061, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000063:    {kind: ConstType, arg0: inst60000062, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000064:    {kind: ImportRefUnloaded, arg0: import_ir_inst11, arg1: entity_name<none>}
-// CHECK:STDOUT:     inst60000065:    {kind: ImplWitnessTable, arg0: inst_block6000001E, arg1: impl60000000}
-// CHECK:STDOUT:     inst60000066:    {kind: ImplWitness, arg0: inst60000065, arg1: specific60000002, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst60000067:    {kind: FunctionDecl, arg0: function60000002, arg1: inst_block_empty, type: type(symbolic_constant60000021)}
-// CHECK:STDOUT:     inst60000068:    {kind: FunctionType, arg0: function60000002, arg1: specific60000002, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000069:    {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant60000021)}
-// CHECK:STDOUT:     inst6000006A:    {kind: PatternType, arg0: inst60000063, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000006B:    {kind: ReturnSlotPattern, arg0: inst<none>, type: type(symbolic_constant60000026)}
-// CHECK:STDOUT:     inst6000006C:    {kind: OutParamPattern, arg0: inst6000006B, arg1: call_param1, type: type(symbolic_constant60000026)}
-// CHECK:STDOUT:     inst6000006D:    {kind: ValueBindingPattern, arg0: entity_name6000000D, type: type(symbolic_constant60000026)}
-// CHECK:STDOUT:     inst6000006E:    {kind: ValueParamPattern, arg0: inst6000006D, arg1: call_param0, type: type(symbolic_constant60000026)}
-// CHECK:STDOUT:     inst6000006F:    {kind: ImportRefLoaded, arg0: import_ir_inst18, arg1: entity_name<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst60000070:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst60000071:    {kind: SymbolicBindingType, arg0: entity_name60000001, arg1: inst60000070, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000072:    {kind: ConstType, arg0: inst60000071, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000073:    {kind: PatternType, arg0: inst60000072, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000074:    {kind: LookupImplWitness, arg0: inst60000061, arg1: specific_interface60000000, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst60000075:    {kind: FunctionTypeWithSelfType, arg0: inst60000052, arg1: inst60000061, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000076:    {kind: ImplWitnessAccess, arg0: inst60000074, arg1: element0, type: type(symbolic_constant60000030)}
-// CHECK:STDOUT:     inst60000077:    {kind: SpecificImplFunction, arg0: inst60000076, arg1: specific60000003, type: type(inst(SpecificFunctionType))}
-// CHECK:STDOUT:     inst60000078:    {kind: PatternType, arg0: inst60000062, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000079:    {kind: RequireCompleteType, arg0: inst60000062, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst60000041:    {kind: RequireCompleteType, arg0: inst6000001C, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst60000042:    {kind: NameRef, arg0: name2, arg1: inst6000001D, type: type(symbolic_constant4)}
+// CHECK:STDOUT:     inst60000043:    {kind: TupleLiteral, arg0: inst_block_empty, type: type(inst60000024)}
+// CHECK:STDOUT:     inst60000044:    {kind: TupleLiteral, arg0: inst_block60000017, type: type(symbolic_constantA)}
+// CHECK:STDOUT:     inst60000045:    {kind: RequireCompleteType, arg0: inst6000002D, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst60000046:    {kind: TupleAccess, arg0: inst60000037, arg1: element0, type: type(symbolic_constant4)}
+// CHECK:STDOUT:     inst60000047:    {kind: RequireCompleteType, arg0: inst6000001B, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst60000048:    {kind: ImportRefLoaded, arg0: import_ir_inst0, arg1: entity_name60000003, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000049:    {kind: InterfaceDecl, arg0: interface60000000, arg1: inst_block_empty, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000004A:    {kind: FacetType, arg0: facet_type60000001, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000004B:    {kind: SymbolicBinding, arg0: entity_name60000004, arg1: inst<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst6000004C:    {kind: ImportRefUnloaded, arg0: import_ir_inst2, arg1: entity_name<none>}
+// CHECK:STDOUT:     inst6000004D:    {kind: ImportRefLoaded, arg0: import_ir_inst3, arg1: entity_name<none>, type: type(inst6000004F)}
+// CHECK:STDOUT:     inst6000004E:    {kind: ImportRefUnloaded, arg0: import_ir_inst4, arg1: entity_name60000005}
+// CHECK:STDOUT:     inst6000004F:    {kind: AssociatedEntityType, arg0: interface60000000, arg1: specific<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000050:    {kind: ImportRefLoaded, arg0: import_ir_inst5, arg1: entity_name<none>, type: type(inst60000053)}
+// CHECK:STDOUT:     inst60000051:    {kind: AssociatedEntity, arg0: element0, arg1: inst60000050, type: type(inst6000004F)}
+// CHECK:STDOUT:     inst60000052:    {kind: FunctionDecl, arg0: function60000001, arg1: inst_block_empty, type: type(inst60000053)}
+// CHECK:STDOUT:     inst60000053:    {kind: FunctionType, arg0: function60000001, arg1: specific<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000054:    {kind: StructValue, arg0: inst_block_empty, type: type(inst60000053)}
+// CHECK:STDOUT:     inst60000055:    {kind: SymbolicBindingType, arg0: entity_name60000004, arg1: inst6000004B, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000056:    {kind: PatternType, arg0: inst60000055, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000057:    {kind: ReturnSlotPattern, arg0: inst<none>, type: type(symbolic_constant60000015)}
+// CHECK:STDOUT:     inst60000058:    {kind: OutParamPattern, arg0: inst60000057, arg1: call_param1, type: type(symbolic_constant60000015)}
+// CHECK:STDOUT:     inst60000059:    {kind: ValueBindingPattern, arg0: entity_name60000008, type: type(symbolic_constant60000015)}
+// CHECK:STDOUT:     inst6000005A:    {kind: ValueParamPattern, arg0: inst60000059, arg1: call_param0, type: type(symbolic_constant60000015)}
+// CHECK:STDOUT:     inst6000005B:    {kind: ImportRefLoaded, arg0: import_ir_instB, arg1: entity_name<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst6000005C:    {kind: SymbolicBinding, arg0: entity_name60000004, arg1: inst<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst6000005D:    {kind: SymbolicBindingType, arg0: entity_name60000004, arg1: inst6000005C, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000005E:    {kind: PatternType, arg0: inst6000005D, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000005F:    {kind: LookupImplWitness, arg0: inst6000001B, arg1: specific_interface60000000, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst60000060:    {kind: ImportRefUnloaded, arg0: import_ir_instF, arg1: entity_name<none>}
+// CHECK:STDOUT:     inst60000061:    {kind: ImplDecl, arg0: impl60000000, arg1: inst_block_empty}
+// CHECK:STDOUT:     inst60000062:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst60000063:    {kind: SymbolicBindingType, arg0: entity_name60000001, arg1: inst60000062, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000064:    {kind: ConstType, arg0: inst60000063, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000065:    {kind: ImportRefUnloaded, arg0: import_ir_inst11, arg1: entity_name<none>}
+// CHECK:STDOUT:     inst60000066:    {kind: ImplWitnessTable, arg0: inst_block6000001E, arg1: impl60000000}
+// CHECK:STDOUT:     inst60000067:    {kind: ImplWitness, arg0: inst60000066, arg1: specific60000002, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst60000068:    {kind: FunctionDecl, arg0: function60000002, arg1: inst_block_empty, type: type(symbolic_constant60000021)}
+// CHECK:STDOUT:     inst60000069:    {kind: FunctionType, arg0: function60000002, arg1: specific60000002, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000006A:    {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant60000021)}
+// CHECK:STDOUT:     inst6000006B:    {kind: PatternType, arg0: inst60000064, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000006C:    {kind: ReturnSlotPattern, arg0: inst<none>, type: type(symbolic_constant60000026)}
+// CHECK:STDOUT:     inst6000006D:    {kind: OutParamPattern, arg0: inst6000006C, arg1: call_param1, type: type(symbolic_constant60000026)}
+// CHECK:STDOUT:     inst6000006E:    {kind: ValueBindingPattern, arg0: entity_name6000000D, type: type(symbolic_constant60000026)}
+// CHECK:STDOUT:     inst6000006F:    {kind: ValueParamPattern, arg0: inst6000006E, arg1: call_param0, type: type(symbolic_constant60000026)}
+// CHECK:STDOUT:     inst60000070:    {kind: ImportRefLoaded, arg0: import_ir_inst18, arg1: entity_name<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst60000071:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst60000072:    {kind: SymbolicBindingType, arg0: entity_name60000001, arg1: inst60000071, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000073:    {kind: ConstType, arg0: inst60000072, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000074:    {kind: PatternType, arg0: inst60000073, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000075:    {kind: LookupImplWitness, arg0: inst60000062, arg1: specific_interface60000000, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst60000076:    {kind: FunctionTypeWithSelfType, arg0: inst60000053, arg1: inst60000062, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000077:    {kind: ImplWitnessAccess, arg0: inst60000075, arg1: element0, type: type(symbolic_constant60000030)}
+// CHECK:STDOUT:     inst60000078:    {kind: SpecificImplFunction, arg0: inst60000077, arg1: specific60000003, type: type(inst(SpecificFunctionType))}
+// CHECK:STDOUT:     inst60000079:    {kind: PatternType, arg0: inst60000063, type: type(TypeType)}
 // CHECK:STDOUT:     inst6000007A:    {kind: RequireCompleteType, arg0: inst60000063, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst6000007B:    {kind: RequireCompleteType, arg0: inst60000072, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst6000007C:    {kind: RequireCompleteType, arg0: inst60000071, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst6000007D:    {kind: LookupImplWitness, arg0: inst60000070, arg1: specific_interface60000000, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst6000007E:    {kind: FunctionTypeWithSelfType, arg0: inst60000052, arg1: inst60000070, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000007F:    {kind: ImplWitnessAccess, arg0: inst6000007D, arg1: element0, type: type(symbolic_constant6000003F)}
-// CHECK:STDOUT:     inst60000080:    {kind: SpecificImplFunction, arg0: inst6000007F, arg1: specific60000005, type: type(inst(SpecificFunctionType))}
-// CHECK:STDOUT:     inst60000081:    {kind: PatternType, arg0: inst60000049, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000082:    {kind: SymbolicBindingPattern, arg0: entity_name60000013, type: type(inst60000081)}
-// CHECK:STDOUT:     inst60000083:    {kind: ImportRefLoaded, arg0: import_ir_inst24, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000084:    {kind: ImportRefLoaded, arg0: import_ir_inst25, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000085:    {kind: ImportRefLoaded, arg0: import_ir_inst26, arg1: entity_name<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst60000086:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst60000087:    {kind: SymbolicBindingType, arg0: entity_name60000001, arg1: inst60000086, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000088:    {kind: ConstType, arg0: inst60000087, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000089:    {kind: ImplWitness, arg0: inst60000065, arg1: specific60000006, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst6000008A:    {kind: FunctionType, arg0: function60000002, arg1: specific60000006, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000008B:    {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant6000004A)}
-// CHECK:STDOUT:     inst6000008C:    {kind: ImportRefUnloaded, arg0: import_ir_inst2D, arg1: entity_name<none>}
-// CHECK:STDOUT:     inst6000008D:    {kind: ImplDecl, arg0: impl60000001, arg1: inst_block_empty}
-// CHECK:STDOUT:     inst6000008E:    {kind: ImportRefLoaded, arg0: import_ir_inst2F, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000008F:    {kind: ImportRefLoaded, arg0: import_ir_inst30, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000090:    {kind: ImportRefUnloaded, arg0: import_ir_inst31, arg1: entity_name<none>}
-// CHECK:STDOUT:     inst60000091:    {kind: ImplDecl, arg0: impl60000002, arg1: inst_block_empty}
-// CHECK:STDOUT:     inst60000092:    {kind: ImportRefLoaded, arg0: import_ir_inst33, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000093:    {kind: ImportRefLoaded, arg0: import_ir_inst34, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000094:    {kind: ImportRefUnloaded, arg0: import_ir_inst35, arg1: entity_name<none>}
-// CHECK:STDOUT:     inst60000095:    {kind: ImplDecl, arg0: impl60000003, arg1: inst_block_empty}
-// CHECK:STDOUT:     inst60000096:    {kind: ImportRefLoaded, arg0: import_ir_inst37, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000097:    {kind: ImportRefLoaded, arg0: import_ir_inst38, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000098:    {kind: ImportRefUnloaded, arg0: import_ir_inst39, arg1: entity_name<none>}
-// CHECK:STDOUT:     inst60000099:    {kind: ImplDecl, arg0: impl60000004, arg1: inst_block_empty}
-// CHECK:STDOUT:     inst6000009A:    {kind: ImportRefLoaded, arg0: import_ir_inst3B, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000009B:    {kind: ImportRefLoaded, arg0: import_ir_inst3C, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000009C:    {kind: ImportRefLoaded, arg0: import_ir_inst3D, arg1: entity_name<none>, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst6000009D:    {kind: ImplDecl, arg0: impl60000005, arg1: inst_block_empty}
-// CHECK:STDOUT:     inst6000009E:    {kind: ImportRefUnloaded, arg0: import_ir_inst3F, arg1: entity_name<none>}
-// CHECK:STDOUT:     inst6000009F:    {kind: ImplWitnessTable, arg0: inst_block6000002F, arg1: impl60000005}
-// CHECK:STDOUT:     inst600000A0:    {kind: ImplWitness, arg0: inst6000009F, arg1: specific60000007, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst600000A1:    {kind: SymbolicBindingPattern, arg0: entity_name60000017, type: type(inst60000016)}
-// CHECK:STDOUT:     inst600000A2:    {kind: ImportRefLoaded, arg0: import_ir_inst42, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000A3:    {kind: ImportRefLoaded, arg0: import_ir_inst43, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000A4:    {kind: ImportRefLoaded, arg0: import_ir_inst44, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000A5:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000A6:    {kind: PointerType, arg0: inst600000A5, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000A7:    {kind: ImplWitness, arg0: inst6000009F, arg1: specific60000008, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst600000A8:    {kind: FunctionDecl, arg0: function60000003, arg1: inst_block_empty, type: type(symbolic_constant60000056)}
-// CHECK:STDOUT:     inst600000A9:    {kind: FunctionType, arg0: function60000003, arg1: specific60000007, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000AA:    {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant60000056)}
-// CHECK:STDOUT:     inst600000AB:    {kind: ReturnSlotPattern, arg0: inst<none>, type: type(symbolic_constant6000005A)}
-// CHECK:STDOUT:     inst600000AC:    {kind: OutParamPattern, arg0: inst600000AB, arg1: call_param1, type: type(symbolic_constant6000005A)}
-// CHECK:STDOUT:     inst600000AD:    {kind: ValueBindingPattern, arg0: entity_name60000018, type: type(symbolic_constant6000005A)}
-// CHECK:STDOUT:     inst600000AE:    {kind: ValueParamPattern, arg0: inst600000AD, arg1: call_param0, type: type(symbolic_constant6000005A)}
-// CHECK:STDOUT:     inst600000AF:    {kind: ImportRefLoaded, arg0: import_ir_inst4D, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000B0:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000B1:    {kind: PointerType, arg0: inst600000B0, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000B2:    {kind: PatternType, arg0: inst600000B1, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000B3:    {kind: FunctionType, arg0: function60000003, arg1: specific60000008, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000B4:    {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant60000061)}
-// CHECK:STDOUT:     inst600000B5:    {kind: RequireCompleteType, arg0: inst600000A6, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst600000B6:    {kind: ImportRefUnloaded, arg0: import_ir_inst54, arg1: entity_name<none>}
-// CHECK:STDOUT:     inst600000B7:    {kind: ImplDecl, arg0: impl60000006, arg1: inst_block_empty}
-// CHECK:STDOUT:     inst600000B8:    {kind: ImportRefLoaded, arg0: import_ir_inst56, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000B9:    {kind: ImportRefLoaded, arg0: import_ir_inst57, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000BA:    {kind: ImportRefUnloaded, arg0: import_ir_inst58, arg1: entity_name<none>}
-// CHECK:STDOUT:     inst600000BB:    {kind: ImplDecl, arg0: impl60000007, arg1: inst_block_empty}
-// CHECK:STDOUT:     inst600000BC:    {kind: ImportRefLoaded, arg0: import_ir_inst5A, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000BD:    {kind: ImportRefLoaded, arg0: import_ir_inst5B, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000BE:    {kind: ImportRefUnloaded, arg0: import_ir_inst5C, arg1: entity_name<none>}
-// CHECK:STDOUT:     inst600000BF:    {kind: ImplDecl, arg0: impl60000008, arg1: inst_block_empty}
-// CHECK:STDOUT:     inst600000C0:    {kind: SymbolicBinding, arg0: entity_name6000001A, arg1: inst<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst600000C1:    {kind: SymbolicBindingType, arg0: entity_name6000001A, arg1: inst600000C0, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000C2:    {kind: TupleType, arg0: inst_block6000003B, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000C3:    {kind: ImportRefUnloaded, arg0: import_ir_inst5E, arg1: entity_name<none>}
-// CHECK:STDOUT:     inst600000C4:    {kind: ImplWitnessTable, arg0: inst_block6000003C, arg1: impl60000008}
-// CHECK:STDOUT:     inst600000C5:    {kind: ImplWitness, arg0: inst600000C4, arg1: specific6000000A, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst600000C6:    {kind: FunctionDecl, arg0: function60000004, arg1: inst_block_empty, type: type(symbolic_constant6000006A)}
-// CHECK:STDOUT:     inst600000C7:    {kind: FunctionType, arg0: function60000004, arg1: specific6000000A, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000C8:    {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant6000006A)}
-// CHECK:STDOUT:     inst600000C9:    {kind: TupleType, arg0: inst_block6000003E, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000CA:    {kind: TupleValue, arg0: inst_block6000003D, type: type(inst600000C9)}
-// CHECK:STDOUT:     inst600000CB:    {kind: PatternType, arg0: inst600000C2, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000CC:    {kind: ReturnSlotPattern, arg0: inst<none>, type: type(symbolic_constant60000070)}
-// CHECK:STDOUT:     inst600000CD:    {kind: OutParamPattern, arg0: inst600000CC, arg1: call_param1, type: type(symbolic_constant60000070)}
-// CHECK:STDOUT:     inst600000CE:    {kind: ValueBindingPattern, arg0: entity_name6000001C, type: type(symbolic_constant60000070)}
-// CHECK:STDOUT:     inst600000CF:    {kind: ValueParamPattern, arg0: inst600000CE, arg1: call_param0, type: type(symbolic_constant60000070)}
-// CHECK:STDOUT:     inst600000D0:    {kind: ImportRefLoaded, arg0: import_ir_inst65, arg1: entity_name<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst600000D1:    {kind: ImportRefLoaded, arg0: import_ir_inst66, arg1: entity_name<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst600000D2:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst600000D3:    {kind: SymbolicBindingType, arg0: entity_name60000001, arg1: inst600000D2, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000D4:    {kind: SymbolicBinding, arg0: entity_name6000001A, arg1: inst<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst600000D5:    {kind: SymbolicBindingType, arg0: entity_name6000001A, arg1: inst600000D4, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000D6:    {kind: TupleType, arg0: inst_block60000043, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000D7:    {kind: PatternType, arg0: inst600000D6, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000D8:    {kind: LookupImplWitness, arg0: inst600000C0, arg1: specific_interface60000000, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst600000D9:    {kind: FunctionTypeWithSelfType, arg0: inst60000052, arg1: inst600000C0, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000DA:    {kind: ImplWitnessAccess, arg0: inst600000D8, arg1: element0, type: type(symbolic_constant6000007F)}
-// CHECK:STDOUT:     inst600000DB:    {kind: SpecificImplFunction, arg0: inst600000DA, arg1: specific6000000B, type: type(inst(SpecificFunctionType))}
-// CHECK:STDOUT:     inst600000DC:    {kind: PatternType, arg0: inst600000C1, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000DD:    {kind: RequireCompleteType, arg0: inst600000C1, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst6000007B:    {kind: RequireCompleteType, arg0: inst60000064, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst6000007C:    {kind: RequireCompleteType, arg0: inst60000073, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst6000007D:    {kind: RequireCompleteType, arg0: inst60000072, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst6000007E:    {kind: LookupImplWitness, arg0: inst60000071, arg1: specific_interface60000000, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst6000007F:    {kind: FunctionTypeWithSelfType, arg0: inst60000053, arg1: inst60000071, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000080:    {kind: ImplWitnessAccess, arg0: inst6000007E, arg1: element0, type: type(symbolic_constant6000003F)}
+// CHECK:STDOUT:     inst60000081:    {kind: SpecificImplFunction, arg0: inst60000080, arg1: specific60000005, type: type(inst(SpecificFunctionType))}
+// CHECK:STDOUT:     inst60000082:    {kind: PatternType, arg0: inst6000004A, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000083:    {kind: SymbolicBindingPattern, arg0: entity_name60000013, type: type(inst60000082)}
+// CHECK:STDOUT:     inst60000084:    {kind: ImportRefLoaded, arg0: import_ir_inst24, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000085:    {kind: ImportRefLoaded, arg0: import_ir_inst25, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000086:    {kind: ImportRefLoaded, arg0: import_ir_inst26, arg1: entity_name<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst60000087:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst60000088:    {kind: SymbolicBindingType, arg0: entity_name60000001, arg1: inst60000087, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000089:    {kind: ConstType, arg0: inst60000088, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000008A:    {kind: ImplWitness, arg0: inst60000066, arg1: specific60000006, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst6000008B:    {kind: FunctionType, arg0: function60000002, arg1: specific60000006, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000008C:    {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant6000004A)}
+// CHECK:STDOUT:     inst6000008D:    {kind: ImportRefUnloaded, arg0: import_ir_inst2D, arg1: entity_name<none>}
+// CHECK:STDOUT:     inst6000008E:    {kind: ImplDecl, arg0: impl60000001, arg1: inst_block_empty}
+// CHECK:STDOUT:     inst6000008F:    {kind: ImportRefLoaded, arg0: import_ir_inst2F, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000090:    {kind: ImportRefLoaded, arg0: import_ir_inst30, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000091:    {kind: ImportRefUnloaded, arg0: import_ir_inst31, arg1: entity_name<none>}
+// CHECK:STDOUT:     inst60000092:    {kind: ImplDecl, arg0: impl60000002, arg1: inst_block_empty}
+// CHECK:STDOUT:     inst60000093:    {kind: ImportRefLoaded, arg0: import_ir_inst33, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000094:    {kind: ImportRefLoaded, arg0: import_ir_inst34, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000095:    {kind: ImportRefUnloaded, arg0: import_ir_inst35, arg1: entity_name<none>}
+// CHECK:STDOUT:     inst60000096:    {kind: ImplDecl, arg0: impl60000003, arg1: inst_block_empty}
+// CHECK:STDOUT:     inst60000097:    {kind: ImportRefLoaded, arg0: import_ir_inst37, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000098:    {kind: ImportRefLoaded, arg0: import_ir_inst38, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000099:    {kind: ImportRefUnloaded, arg0: import_ir_inst39, arg1: entity_name<none>}
+// CHECK:STDOUT:     inst6000009A:    {kind: ImplDecl, arg0: impl60000004, arg1: inst_block_empty}
+// CHECK:STDOUT:     inst6000009B:    {kind: ImportRefLoaded, arg0: import_ir_inst3B, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000009C:    {kind: ImportRefLoaded, arg0: import_ir_inst3C, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000009D:    {kind: ImportRefLoaded, arg0: import_ir_inst3D, arg1: entity_name<none>, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst6000009E:    {kind: ImplDecl, arg0: impl60000005, arg1: inst_block_empty}
+// CHECK:STDOUT:     inst6000009F:    {kind: ImportRefUnloaded, arg0: import_ir_inst3F, arg1: entity_name<none>}
+// CHECK:STDOUT:     inst600000A0:    {kind: ImplWitnessTable, arg0: inst_block6000002F, arg1: impl60000005}
+// CHECK:STDOUT:     inst600000A1:    {kind: ImplWitness, arg0: inst600000A0, arg1: specific60000007, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst600000A2:    {kind: SymbolicBindingPattern, arg0: entity_name60000017, type: type(inst60000017)}
+// CHECK:STDOUT:     inst600000A3:    {kind: ImportRefLoaded, arg0: import_ir_inst42, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000A4:    {kind: ImportRefLoaded, arg0: import_ir_inst43, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000A5:    {kind: ImportRefLoaded, arg0: import_ir_inst44, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000A6:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000A7:    {kind: PointerType, arg0: inst600000A6, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000A8:    {kind: ImplWitness, arg0: inst600000A0, arg1: specific60000008, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst600000A9:    {kind: FunctionDecl, arg0: function60000003, arg1: inst_block_empty, type: type(symbolic_constant60000056)}
+// CHECK:STDOUT:     inst600000AA:    {kind: FunctionType, arg0: function60000003, arg1: specific60000007, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000AB:    {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant60000056)}
+// CHECK:STDOUT:     inst600000AC:    {kind: ReturnSlotPattern, arg0: inst<none>, type: type(symbolic_constant6000005A)}
+// CHECK:STDOUT:     inst600000AD:    {kind: OutParamPattern, arg0: inst600000AC, arg1: call_param1, type: type(symbolic_constant6000005A)}
+// CHECK:STDOUT:     inst600000AE:    {kind: ValueBindingPattern, arg0: entity_name60000018, type: type(symbolic_constant6000005A)}
+// CHECK:STDOUT:     inst600000AF:    {kind: ValueParamPattern, arg0: inst600000AE, arg1: call_param0, type: type(symbolic_constant6000005A)}
+// CHECK:STDOUT:     inst600000B0:    {kind: ImportRefLoaded, arg0: import_ir_inst4D, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000B1:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000B2:    {kind: PointerType, arg0: inst600000B1, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000B3:    {kind: PatternType, arg0: inst600000B2, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000B4:    {kind: FunctionType, arg0: function60000003, arg1: specific60000008, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000B5:    {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant60000061)}
+// CHECK:STDOUT:     inst600000B6:    {kind: RequireCompleteType, arg0: inst600000A7, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst600000B7:    {kind: ImportRefUnloaded, arg0: import_ir_inst54, arg1: entity_name<none>}
+// CHECK:STDOUT:     inst600000B8:    {kind: ImplDecl, arg0: impl60000006, arg1: inst_block_empty}
+// CHECK:STDOUT:     inst600000B9:    {kind: ImportRefLoaded, arg0: import_ir_inst56, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000BA:    {kind: ImportRefLoaded, arg0: import_ir_inst57, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000BB:    {kind: ImportRefUnloaded, arg0: import_ir_inst58, arg1: entity_name<none>}
+// CHECK:STDOUT:     inst600000BC:    {kind: ImplDecl, arg0: impl60000007, arg1: inst_block_empty}
+// CHECK:STDOUT:     inst600000BD:    {kind: ImportRefLoaded, arg0: import_ir_inst5A, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000BE:    {kind: ImportRefLoaded, arg0: import_ir_inst5B, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000BF:    {kind: ImportRefUnloaded, arg0: import_ir_inst5C, arg1: entity_name<none>}
+// CHECK:STDOUT:     inst600000C0:    {kind: ImplDecl, arg0: impl60000008, arg1: inst_block_empty}
+// CHECK:STDOUT:     inst600000C1:    {kind: SymbolicBinding, arg0: entity_name6000001A, arg1: inst<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst600000C2:    {kind: SymbolicBindingType, arg0: entity_name6000001A, arg1: inst600000C1, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000C3:    {kind: TupleType, arg0: inst_block6000003B, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000C4:    {kind: ImportRefUnloaded, arg0: import_ir_inst5E, arg1: entity_name<none>}
+// CHECK:STDOUT:     inst600000C5:    {kind: ImplWitnessTable, arg0: inst_block6000003C, arg1: impl60000008}
+// CHECK:STDOUT:     inst600000C6:    {kind: ImplWitness, arg0: inst600000C5, arg1: specific6000000A, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst600000C7:    {kind: FunctionDecl, arg0: function60000004, arg1: inst_block_empty, type: type(symbolic_constant6000006A)}
+// CHECK:STDOUT:     inst600000C8:    {kind: FunctionType, arg0: function60000004, arg1: specific6000000A, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000C9:    {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant6000006A)}
+// CHECK:STDOUT:     inst600000CA:    {kind: TupleType, arg0: inst_block6000003E, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000CB:    {kind: TupleValue, arg0: inst_block6000003D, type: type(inst600000CA)}
+// CHECK:STDOUT:     inst600000CC:    {kind: PatternType, arg0: inst600000C3, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000CD:    {kind: ReturnSlotPattern, arg0: inst<none>, type: type(symbolic_constant60000070)}
+// CHECK:STDOUT:     inst600000CE:    {kind: OutParamPattern, arg0: inst600000CD, arg1: call_param1, type: type(symbolic_constant60000070)}
+// CHECK:STDOUT:     inst600000CF:    {kind: ValueBindingPattern, arg0: entity_name6000001C, type: type(symbolic_constant60000070)}
+// CHECK:STDOUT:     inst600000D0:    {kind: ValueParamPattern, arg0: inst600000CF, arg1: call_param0, type: type(symbolic_constant60000070)}
+// CHECK:STDOUT:     inst600000D1:    {kind: ImportRefLoaded, arg0: import_ir_inst65, arg1: entity_name<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst600000D2:    {kind: ImportRefLoaded, arg0: import_ir_inst66, arg1: entity_name<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst600000D3:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst600000D4:    {kind: SymbolicBindingType, arg0: entity_name60000001, arg1: inst600000D3, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000D5:    {kind: SymbolicBinding, arg0: entity_name6000001A, arg1: inst<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst600000D6:    {kind: SymbolicBindingType, arg0: entity_name6000001A, arg1: inst600000D5, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000D7:    {kind: TupleType, arg0: inst_block60000043, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000D8:    {kind: PatternType, arg0: inst600000D7, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000D9:    {kind: LookupImplWitness, arg0: inst600000C1, arg1: specific_interface60000000, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst600000DA:    {kind: FunctionTypeWithSelfType, arg0: inst60000053, arg1: inst600000C1, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000DB:    {kind: ImplWitnessAccess, arg0: inst600000D9, arg1: element0, type: type(symbolic_constant6000007F)}
+// CHECK:STDOUT:     inst600000DC:    {kind: SpecificImplFunction, arg0: inst600000DB, arg1: specific6000000B, type: type(inst(SpecificFunctionType))}
+// CHECK:STDOUT:     inst600000DD:    {kind: PatternType, arg0: inst600000C2, type: type(TypeType)}
 // CHECK:STDOUT:     inst600000DE:    {kind: RequireCompleteType, arg0: inst600000C2, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst600000DF:    {kind: RequireCompleteType, arg0: inst600000D6, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst600000E0:    {kind: RequireCompleteType, arg0: inst600000D3, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst600000E1:    {kind: LookupImplWitness, arg0: inst600000D2, arg1: specific_interface60000000, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst600000E2:    {kind: FunctionTypeWithSelfType, arg0: inst60000052, arg1: inst600000D2, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000E3:    {kind: ImplWitnessAccess, arg0: inst600000E1, arg1: element0, type: type(symbolic_constant60000093)}
-// CHECK:STDOUT:     inst600000E4:    {kind: SpecificImplFunction, arg0: inst600000E3, arg1: specific6000000D, type: type(inst(SpecificFunctionType))}
-// CHECK:STDOUT:     inst600000E5:    {kind: RequireCompleteType, arg0: inst600000D5, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst600000E6:    {kind: LookupImplWitness, arg0: inst600000D4, arg1: specific_interface60000000, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst600000E7:    {kind: FunctionTypeWithSelfType, arg0: inst60000052, arg1: inst600000D4, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000E8:    {kind: ImplWitnessAccess, arg0: inst600000E6, arg1: element0, type: type(symbolic_constant60000098)}
-// CHECK:STDOUT:     inst600000E9:    {kind: SpecificImplFunction, arg0: inst600000E8, arg1: specific6000000E, type: type(inst(SpecificFunctionType))}
-// CHECK:STDOUT:     inst600000EA:    {kind: SymbolicBindingPattern, arg0: entity_name60000027, type: type(inst60000081)}
-// CHECK:STDOUT:     inst600000EB:    {kind: SymbolicBindingPattern, arg0: entity_name60000028, type: type(inst60000081)}
-// CHECK:STDOUT:     inst600000EC:    {kind: ImportRefLoaded, arg0: import_ir_inst7A, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000ED:    {kind: ImportRefLoaded, arg0: import_ir_inst7B, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000EE:    {kind: ImportRefLoaded, arg0: import_ir_inst7C, arg1: entity_name<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst600000EF:    {kind: ImportRefLoaded, arg0: import_ir_inst7D, arg1: entity_name<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst600000F0:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst600000F1:    {kind: SymbolicBinding, arg0: entity_name6000001A, arg1: inst<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst600000F2:    {kind: TupleValue, arg0: inst_block6000004D, type: type(inst600000C9)}
-// CHECK:STDOUT:     inst600000F3:    {kind: SymbolicBindingType, arg0: entity_name60000001, arg1: inst600000F0, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000F4:    {kind: SymbolicBindingType, arg0: entity_name6000001A, arg1: inst600000F1, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000F5:    {kind: TupleType, arg0: inst_block6000004E, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000F6:    {kind: ImplWitness, arg0: inst600000C4, arg1: specific6000000F, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst600000F7:    {kind: FunctionType, arg0: function60000004, arg1: specific6000000F, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000F8:    {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant600000A9)}
-// CHECK:STDOUT:     inst600000F9:    {kind: ImportRefUnloaded, arg0: import_ir_inst87, arg1: entity_name<none>}
-// CHECK:STDOUT:     inst600000FA:    {kind: ImplDecl, arg0: impl60000009, arg1: inst_block_empty}
-// CHECK:STDOUT:     inst600000FB:    {kind: SymbolicBinding, arg0: entity_name60000029, arg1: inst<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst600000FC:    {kind: SymbolicBindingType, arg0: entity_name60000029, arg1: inst600000FB, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000FD:    {kind: TupleType, arg0: inst_block60000053, type: type(TypeType)}
-// CHECK:STDOUT:     inst600000FE:    {kind: ImportRefUnloaded, arg0: import_ir_inst89, arg1: entity_name<none>}
-// CHECK:STDOUT:     inst600000FF:    {kind: ImplWitnessTable, arg0: inst_block60000054, arg1: impl60000009}
-// CHECK:STDOUT:     inst60000100:    {kind: ImplWitness, arg0: inst600000FF, arg1: specific60000010, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst60000101:    {kind: FunctionDecl, arg0: function60000005, arg1: inst_block_empty, type: type(symbolic_constant600000B1)}
-// CHECK:STDOUT:     inst60000102:    {kind: FunctionType, arg0: function60000005, arg1: specific60000010, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000103:    {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant600000B1)}
-// CHECK:STDOUT:     inst60000104:    {kind: TupleType, arg0: inst_block60000056, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000105:    {kind: TupleValue, arg0: inst_block60000055, type: type(inst60000104)}
-// CHECK:STDOUT:     inst60000106:    {kind: PatternType, arg0: inst600000FD, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000107:    {kind: ReturnSlotPattern, arg0: inst<none>, type: type(symbolic_constant600000B7)}
-// CHECK:STDOUT:     inst60000108:    {kind: OutParamPattern, arg0: inst60000107, arg1: call_param1, type: type(symbolic_constant600000B7)}
-// CHECK:STDOUT:     inst60000109:    {kind: ValueBindingPattern, arg0: entity_name6000002B, type: type(symbolic_constant600000B7)}
-// CHECK:STDOUT:     inst6000010A:    {kind: ValueParamPattern, arg0: inst60000109, arg1: call_param0, type: type(symbolic_constant600000B7)}
-// CHECK:STDOUT:     inst6000010B:    {kind: ImportRefLoaded, arg0: import_ir_inst90, arg1: entity_name<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst6000010C:    {kind: ImportRefLoaded, arg0: import_ir_inst91, arg1: entity_name<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst6000010D:    {kind: ImportRefLoaded, arg0: import_ir_inst92, arg1: entity_name<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst6000010E:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst6000010F:    {kind: SymbolicBindingType, arg0: entity_name60000001, arg1: inst6000010E, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000110:    {kind: SymbolicBinding, arg0: entity_name6000001A, arg1: inst<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst60000111:    {kind: SymbolicBindingType, arg0: entity_name6000001A, arg1: inst60000110, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000112:    {kind: SymbolicBinding, arg0: entity_name60000029, arg1: inst<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst60000113:    {kind: SymbolicBindingType, arg0: entity_name60000029, arg1: inst60000112, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000114:    {kind: TupleType, arg0: inst_block6000005B, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000115:    {kind: PatternType, arg0: inst60000114, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000116:    {kind: LookupImplWitness, arg0: inst600000FB, arg1: specific_interface60000000, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst60000117:    {kind: FunctionTypeWithSelfType, arg0: inst60000052, arg1: inst600000FB, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000118:    {kind: ImplWitnessAccess, arg0: inst60000116, arg1: element0, type: type(symbolic_constant600000CB)}
-// CHECK:STDOUT:     inst60000119:    {kind: SpecificImplFunction, arg0: inst60000118, arg1: specific60000011, type: type(inst(SpecificFunctionType))}
-// CHECK:STDOUT:     inst6000011A:    {kind: PatternType, arg0: inst600000FC, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000011B:    {kind: RequireCompleteType, arg0: inst600000FC, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst600000DF:    {kind: RequireCompleteType, arg0: inst600000C3, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst600000E0:    {kind: RequireCompleteType, arg0: inst600000D7, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst600000E1:    {kind: RequireCompleteType, arg0: inst600000D4, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst600000E2:    {kind: LookupImplWitness, arg0: inst600000D3, arg1: specific_interface60000000, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst600000E3:    {kind: FunctionTypeWithSelfType, arg0: inst60000053, arg1: inst600000D3, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000E4:    {kind: ImplWitnessAccess, arg0: inst600000E2, arg1: element0, type: type(symbolic_constant60000093)}
+// CHECK:STDOUT:     inst600000E5:    {kind: SpecificImplFunction, arg0: inst600000E4, arg1: specific6000000D, type: type(inst(SpecificFunctionType))}
+// CHECK:STDOUT:     inst600000E6:    {kind: RequireCompleteType, arg0: inst600000D6, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst600000E7:    {kind: LookupImplWitness, arg0: inst600000D5, arg1: specific_interface60000000, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst600000E8:    {kind: FunctionTypeWithSelfType, arg0: inst60000053, arg1: inst600000D5, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000E9:    {kind: ImplWitnessAccess, arg0: inst600000E7, arg1: element0, type: type(symbolic_constant60000098)}
+// CHECK:STDOUT:     inst600000EA:    {kind: SpecificImplFunction, arg0: inst600000E9, arg1: specific6000000E, type: type(inst(SpecificFunctionType))}
+// CHECK:STDOUT:     inst600000EB:    {kind: SymbolicBindingPattern, arg0: entity_name60000027, type: type(inst60000082)}
+// CHECK:STDOUT:     inst600000EC:    {kind: SymbolicBindingPattern, arg0: entity_name60000028, type: type(inst60000082)}
+// CHECK:STDOUT:     inst600000ED:    {kind: ImportRefLoaded, arg0: import_ir_inst7A, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000EE:    {kind: ImportRefLoaded, arg0: import_ir_inst7B, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000EF:    {kind: ImportRefLoaded, arg0: import_ir_inst7C, arg1: entity_name<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst600000F0:    {kind: ImportRefLoaded, arg0: import_ir_inst7D, arg1: entity_name<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst600000F1:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst600000F2:    {kind: SymbolicBinding, arg0: entity_name6000001A, arg1: inst<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst600000F3:    {kind: TupleValue, arg0: inst_block6000004D, type: type(inst600000CA)}
+// CHECK:STDOUT:     inst600000F4:    {kind: SymbolicBindingType, arg0: entity_name60000001, arg1: inst600000F1, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000F5:    {kind: SymbolicBindingType, arg0: entity_name6000001A, arg1: inst600000F2, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000F6:    {kind: TupleType, arg0: inst_block6000004E, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000F7:    {kind: ImplWitness, arg0: inst600000C5, arg1: specific6000000F, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst600000F8:    {kind: FunctionType, arg0: function60000004, arg1: specific6000000F, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000F9:    {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant600000A9)}
+// CHECK:STDOUT:     inst600000FA:    {kind: ImportRefUnloaded, arg0: import_ir_inst87, arg1: entity_name<none>}
+// CHECK:STDOUT:     inst600000FB:    {kind: ImplDecl, arg0: impl60000009, arg1: inst_block_empty}
+// CHECK:STDOUT:     inst600000FC:    {kind: SymbolicBinding, arg0: entity_name60000029, arg1: inst<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst600000FD:    {kind: SymbolicBindingType, arg0: entity_name60000029, arg1: inst600000FC, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000FE:    {kind: TupleType, arg0: inst_block60000053, type: type(TypeType)}
+// CHECK:STDOUT:     inst600000FF:    {kind: ImportRefUnloaded, arg0: import_ir_inst89, arg1: entity_name<none>}
+// CHECK:STDOUT:     inst60000100:    {kind: ImplWitnessTable, arg0: inst_block60000054, arg1: impl60000009}
+// CHECK:STDOUT:     inst60000101:    {kind: ImplWitness, arg0: inst60000100, arg1: specific60000010, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst60000102:    {kind: FunctionDecl, arg0: function60000005, arg1: inst_block_empty, type: type(symbolic_constant600000B1)}
+// CHECK:STDOUT:     inst60000103:    {kind: FunctionType, arg0: function60000005, arg1: specific60000010, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000104:    {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant600000B1)}
+// CHECK:STDOUT:     inst60000105:    {kind: TupleType, arg0: inst_block60000056, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000106:    {kind: TupleValue, arg0: inst_block60000055, type: type(inst60000105)}
+// CHECK:STDOUT:     inst60000107:    {kind: PatternType, arg0: inst600000FE, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000108:    {kind: ReturnSlotPattern, arg0: inst<none>, type: type(symbolic_constant600000B7)}
+// CHECK:STDOUT:     inst60000109:    {kind: OutParamPattern, arg0: inst60000108, arg1: call_param1, type: type(symbolic_constant600000B7)}
+// CHECK:STDOUT:     inst6000010A:    {kind: ValueBindingPattern, arg0: entity_name6000002B, type: type(symbolic_constant600000B7)}
+// CHECK:STDOUT:     inst6000010B:    {kind: ValueParamPattern, arg0: inst6000010A, arg1: call_param0, type: type(symbolic_constant600000B7)}
+// CHECK:STDOUT:     inst6000010C:    {kind: ImportRefLoaded, arg0: import_ir_inst90, arg1: entity_name<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst6000010D:    {kind: ImportRefLoaded, arg0: import_ir_inst91, arg1: entity_name<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst6000010E:    {kind: ImportRefLoaded, arg0: import_ir_inst92, arg1: entity_name<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst6000010F:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst60000110:    {kind: SymbolicBindingType, arg0: entity_name60000001, arg1: inst6000010F, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000111:    {kind: SymbolicBinding, arg0: entity_name6000001A, arg1: inst<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst60000112:    {kind: SymbolicBindingType, arg0: entity_name6000001A, arg1: inst60000111, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000113:    {kind: SymbolicBinding, arg0: entity_name60000029, arg1: inst<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst60000114:    {kind: SymbolicBindingType, arg0: entity_name60000029, arg1: inst60000113, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000115:    {kind: TupleType, arg0: inst_block6000005B, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000116:    {kind: PatternType, arg0: inst60000115, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000117:    {kind: LookupImplWitness, arg0: inst600000FC, arg1: specific_interface60000000, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst60000118:    {kind: FunctionTypeWithSelfType, arg0: inst60000053, arg1: inst600000FC, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000119:    {kind: ImplWitnessAccess, arg0: inst60000117, arg1: element0, type: type(symbolic_constant600000CB)}
+// CHECK:STDOUT:     inst6000011A:    {kind: SpecificImplFunction, arg0: inst60000119, arg1: specific60000011, type: type(inst(SpecificFunctionType))}
+// CHECK:STDOUT:     inst6000011B:    {kind: PatternType, arg0: inst600000FD, type: type(TypeType)}
 // CHECK:STDOUT:     inst6000011C:    {kind: RequireCompleteType, arg0: inst600000FD, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst6000011D:    {kind: RequireCompleteType, arg0: inst60000114, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst6000011E:    {kind: RequireCompleteType, arg0: inst6000010F, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst6000011F:    {kind: LookupImplWitness, arg0: inst6000010E, arg1: specific_interface60000000, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst60000120:    {kind: FunctionTypeWithSelfType, arg0: inst60000052, arg1: inst6000010E, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000121:    {kind: ImplWitnessAccess, arg0: inst6000011F, arg1: element0, type: type(symbolic_constant600000E4)}
-// CHECK:STDOUT:     inst60000122:    {kind: SpecificImplFunction, arg0: inst60000121, arg1: specific60000013, type: type(inst(SpecificFunctionType))}
-// CHECK:STDOUT:     inst60000123:    {kind: RequireCompleteType, arg0: inst60000111, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst60000124:    {kind: LookupImplWitness, arg0: inst60000110, arg1: specific_interface60000000, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst60000125:    {kind: FunctionTypeWithSelfType, arg0: inst60000052, arg1: inst60000110, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000126:    {kind: ImplWitnessAccess, arg0: inst60000124, arg1: element0, type: type(symbolic_constant600000E9)}
-// CHECK:STDOUT:     inst60000127:    {kind: SpecificImplFunction, arg0: inst60000126, arg1: specific60000014, type: type(inst(SpecificFunctionType))}
-// CHECK:STDOUT:     inst60000128:    {kind: RequireCompleteType, arg0: inst60000113, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst60000129:    {kind: LookupImplWitness, arg0: inst60000112, arg1: specific_interface60000000, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst6000012A:    {kind: FunctionTypeWithSelfType, arg0: inst60000052, arg1: inst60000112, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000012B:    {kind: ImplWitnessAccess, arg0: inst60000129, arg1: element0, type: type(symbolic_constant600000EE)}
-// CHECK:STDOUT:     inst6000012C:    {kind: SpecificImplFunction, arg0: inst6000012B, arg1: specific60000015, type: type(inst(SpecificFunctionType))}
-// CHECK:STDOUT:     inst6000012D:    {kind: SymbolicBindingPattern, arg0: entity_name6000003B, type: type(inst60000081)}
-// CHECK:STDOUT:     inst6000012E:    {kind: SymbolicBindingPattern, arg0: entity_name6000003C, type: type(inst60000081)}
-// CHECK:STDOUT:     inst6000012F:    {kind: SymbolicBindingPattern, arg0: entity_name6000003D, type: type(inst60000081)}
-// CHECK:STDOUT:     inst60000130:    {kind: ImportRefLoaded, arg0: import_ir_instAE, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000131:    {kind: ImportRefLoaded, arg0: import_ir_instAF, arg1: entity_name<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000132:    {kind: ImportRefLoaded, arg0: import_ir_instB0, arg1: entity_name<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst60000133:    {kind: ImportRefLoaded, arg0: import_ir_instB1, arg1: entity_name<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst60000134:    {kind: ImportRefLoaded, arg0: import_ir_instB2, arg1: entity_name<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst60000135:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst60000136:    {kind: SymbolicBinding, arg0: entity_name6000001A, arg1: inst<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst60000137:    {kind: SymbolicBinding, arg0: entity_name60000029, arg1: inst<none>, type: type(inst60000049)}
-// CHECK:STDOUT:     inst60000138:    {kind: TupleValue, arg0: inst_block60000066, type: type(inst60000104)}
-// CHECK:STDOUT:     inst60000139:    {kind: SymbolicBindingType, arg0: entity_name60000001, arg1: inst60000135, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000013A:    {kind: SymbolicBindingType, arg0: entity_name6000001A, arg1: inst60000136, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000013B:    {kind: SymbolicBindingType, arg0: entity_name60000029, arg1: inst60000137, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000013C:    {kind: TupleType, arg0: inst_block60000067, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000013D:    {kind: ImplWitness, arg0: inst600000FF, arg1: specific60000016, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst6000013E:    {kind: FunctionType, arg0: function60000005, arg1: specific60000016, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000013F:    {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant60000103)}
-// CHECK:STDOUT:     inst60000140:    {kind: LookupImplWitness, arg0: inst6000001A, arg1: specific_interface60000000, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst60000141:    {kind: LookupImplWitness, arg0: inst6000001B, arg1: specific_interface60000000, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst60000142:    {kind: FacetValue, arg0: inst6000001A, arg1: inst_block6000006D, type: type(inst60000049)}
-// CHECK:STDOUT:     inst60000143:    {kind: FunctionTypeWithSelfType, arg0: inst60000052, arg1: inst60000142, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000144:    {kind: ImplWitnessAccess, arg0: inst60000140, arg1: element0, type: type(symbolic_constant6000010C)}
-// CHECK:STDOUT:     inst60000145:    {kind: ImplWitnessAccess, arg0: inst60000140, arg1: element0, type: type(symbolic_constant60000109)}
-// CHECK:STDOUT:     inst60000146:    {kind: FacetValue, arg0: inst6000001B, arg1: inst_block6000006E, type: type(inst60000049)}
-// CHECK:STDOUT:     inst60000147:    {kind: FunctionTypeWithSelfType, arg0: inst60000052, arg1: inst60000146, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000148:    {kind: ImplWitnessAccess, arg0: inst60000141, arg1: element0, type: type(symbolic_constant6000010C)}
-// CHECK:STDOUT:     inst60000149:    {kind: BoundMethod, arg0: inst60000041, arg1: inst60000144, type: type(inst(BoundMethodType))}
-// CHECK:STDOUT:     inst6000014A:    {kind: SpecificImplFunction, arg0: inst60000144, arg1: specific60000017, type: type(inst(SpecificFunctionType))}
-// CHECK:STDOUT:     inst6000014B:    {kind: SpecificImplFunction, arg0: inst60000145, arg1: specific60000017, type: type(inst(SpecificFunctionType))}
-// CHECK:STDOUT:     inst6000014C:    {kind: SpecificImplFunction, arg0: inst60000148, arg1: specific60000018, type: type(inst(SpecificFunctionType))}
-// CHECK:STDOUT:     inst6000014D:    {kind: BoundMethod, arg0: inst60000041, arg1: inst6000014A, type: type(inst(BoundMethodType))}
-// CHECK:STDOUT:     inst6000014E:    {kind: RequireCompleteType, arg0: inst6000001A, type: type(inst(WitnessType))}
-// CHECK:STDOUT:     inst6000014F:    {kind: Call, arg0: inst6000014D, arg1: inst_block60000072, type: type(symbolic_constant4)}
-// CHECK:STDOUT:     inst60000150:    {kind: InitializeFrom, arg0: inst6000014F, arg1: inst60000045, type: type(symbolic_constant4)}
-// CHECK:STDOUT:     inst60000151:    {kind: TupleAccess, arg0: inst60000036, arg1: element1, type: type(inst60000023)}
-// CHECK:STDOUT:     inst60000152:    {kind: TupleInit, arg0: inst_block_empty, arg1: inst60000151, type: type(inst60000023)}
-// CHECK:STDOUT:     inst60000153:    {kind: Converted, arg0: inst60000042, arg1: inst60000152, type: type(inst60000023)}
-// CHECK:STDOUT:     inst60000154:    {kind: TupleInit, arg0: inst_block60000073, arg1: inst60000036, type: type(symbolic_constantA)}
-// CHECK:STDOUT:     inst60000155:    {kind: Converted, arg0: inst60000043, arg1: inst60000154, type: type(symbolic_constantA)}
-// CHECK:STDOUT:     inst60000156:    {kind: ReturnExpr, arg0: inst60000155, arg1: inst60000036}
+// CHECK:STDOUT:     inst6000011D:    {kind: RequireCompleteType, arg0: inst600000FE, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst6000011E:    {kind: RequireCompleteType, arg0: inst60000115, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst6000011F:    {kind: RequireCompleteType, arg0: inst60000110, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst60000120:    {kind: LookupImplWitness, arg0: inst6000010F, arg1: specific_interface60000000, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst60000121:    {kind: FunctionTypeWithSelfType, arg0: inst60000053, arg1: inst6000010F, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000122:    {kind: ImplWitnessAccess, arg0: inst60000120, arg1: element0, type: type(symbolic_constant600000E4)}
+// CHECK:STDOUT:     inst60000123:    {kind: SpecificImplFunction, arg0: inst60000122, arg1: specific60000013, type: type(inst(SpecificFunctionType))}
+// CHECK:STDOUT:     inst60000124:    {kind: RequireCompleteType, arg0: inst60000112, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst60000125:    {kind: LookupImplWitness, arg0: inst60000111, arg1: specific_interface60000000, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst60000126:    {kind: FunctionTypeWithSelfType, arg0: inst60000053, arg1: inst60000111, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000127:    {kind: ImplWitnessAccess, arg0: inst60000125, arg1: element0, type: type(symbolic_constant600000E9)}
+// CHECK:STDOUT:     inst60000128:    {kind: SpecificImplFunction, arg0: inst60000127, arg1: specific60000014, type: type(inst(SpecificFunctionType))}
+// CHECK:STDOUT:     inst60000129:    {kind: RequireCompleteType, arg0: inst60000114, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst6000012A:    {kind: LookupImplWitness, arg0: inst60000113, arg1: specific_interface60000000, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst6000012B:    {kind: FunctionTypeWithSelfType, arg0: inst60000053, arg1: inst60000113, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000012C:    {kind: ImplWitnessAccess, arg0: inst6000012A, arg1: element0, type: type(symbolic_constant600000EE)}
+// CHECK:STDOUT:     inst6000012D:    {kind: SpecificImplFunction, arg0: inst6000012C, arg1: specific60000015, type: type(inst(SpecificFunctionType))}
+// CHECK:STDOUT:     inst6000012E:    {kind: SymbolicBindingPattern, arg0: entity_name6000003B, type: type(inst60000082)}
+// CHECK:STDOUT:     inst6000012F:    {kind: SymbolicBindingPattern, arg0: entity_name6000003C, type: type(inst60000082)}
+// CHECK:STDOUT:     inst60000130:    {kind: SymbolicBindingPattern, arg0: entity_name6000003D, type: type(inst60000082)}
+// CHECK:STDOUT:     inst60000131:    {kind: ImportRefLoaded, arg0: import_ir_instAE, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000132:    {kind: ImportRefLoaded, arg0: import_ir_instAF, arg1: entity_name<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000133:    {kind: ImportRefLoaded, arg0: import_ir_instB0, arg1: entity_name<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst60000134:    {kind: ImportRefLoaded, arg0: import_ir_instB1, arg1: entity_name<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst60000135:    {kind: ImportRefLoaded, arg0: import_ir_instB2, arg1: entity_name<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst60000136:    {kind: SymbolicBinding, arg0: entity_name60000001, arg1: inst<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst60000137:    {kind: SymbolicBinding, arg0: entity_name6000001A, arg1: inst<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst60000138:    {kind: SymbolicBinding, arg0: entity_name60000029, arg1: inst<none>, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst60000139:    {kind: TupleValue, arg0: inst_block60000066, type: type(inst60000105)}
+// CHECK:STDOUT:     inst6000013A:    {kind: SymbolicBindingType, arg0: entity_name60000001, arg1: inst60000136, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000013B:    {kind: SymbolicBindingType, arg0: entity_name6000001A, arg1: inst60000137, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000013C:    {kind: SymbolicBindingType, arg0: entity_name60000029, arg1: inst60000138, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000013D:    {kind: TupleType, arg0: inst_block60000067, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000013E:    {kind: ImplWitness, arg0: inst60000100, arg1: specific60000016, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst6000013F:    {kind: FunctionType, arg0: function60000005, arg1: specific60000016, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000140:    {kind: StructValue, arg0: inst_block_empty, type: type(symbolic_constant60000103)}
+// CHECK:STDOUT:     inst60000141:    {kind: RequireSpecificDefinition, arg0: specific60000007, type: type(inst(RequireSpecificDefinitionType))}
+// CHECK:STDOUT:     inst60000142:    {kind: RequireSpecificDefinition, arg0: specific60000007, type: type(inst(RequireSpecificDefinitionType))}
+// CHECK:STDOUT:     inst60000143:    {kind: RequireSpecificDefinition, arg0: specific60000017, type: type(inst(RequireSpecificDefinitionType))}
+// CHECK:STDOUT:     inst60000144:    {kind: LookupImplWitness, arg0: inst6000001B, arg1: specific_interface60000000, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst60000145:    {kind: LookupImplWitness, arg0: inst6000001C, arg1: specific_interface60000000, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst60000146:    {kind: FacetValue, arg0: inst6000001B, arg1: inst_block6000006E, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst60000147:    {kind: FunctionTypeWithSelfType, arg0: inst60000053, arg1: inst60000146, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000148:    {kind: ImplWitnessAccess, arg0: inst60000144, arg1: element0, type: type(symbolic_constant6000010E)}
+// CHECK:STDOUT:     inst60000149:    {kind: ImplWitnessAccess, arg0: inst60000144, arg1: element0, type: type(symbolic_constant6000010B)}
+// CHECK:STDOUT:     inst6000014A:    {kind: FacetValue, arg0: inst6000001C, arg1: inst_block6000006F, type: type(inst6000004A)}
+// CHECK:STDOUT:     inst6000014B:    {kind: FunctionTypeWithSelfType, arg0: inst60000053, arg1: inst6000014A, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000014C:    {kind: ImplWitnessAccess, arg0: inst60000145, arg1: element0, type: type(symbolic_constant6000010E)}
+// CHECK:STDOUT:     inst6000014D:    {kind: BoundMethod, arg0: inst60000042, arg1: inst60000148, type: type(inst(BoundMethodType))}
+// CHECK:STDOUT:     inst6000014E:    {kind: SpecificImplFunction, arg0: inst60000148, arg1: specific60000018, type: type(inst(SpecificFunctionType))}
+// CHECK:STDOUT:     inst6000014F:    {kind: SpecificImplFunction, arg0: inst60000149, arg1: specific60000018, type: type(inst(SpecificFunctionType))}
+// CHECK:STDOUT:     inst60000150:    {kind: SpecificImplFunction, arg0: inst6000014C, arg1: specific60000019, type: type(inst(SpecificFunctionType))}
+// CHECK:STDOUT:     inst60000151:    {kind: BoundMethod, arg0: inst60000042, arg1: inst6000014E, type: type(inst(BoundMethodType))}
+// CHECK:STDOUT:     inst60000152:    {kind: RequireCompleteType, arg0: inst6000001B, type: type(inst(WitnessType))}
+// CHECK:STDOUT:     inst60000153:    {kind: Call, arg0: inst60000151, arg1: inst_block60000073, type: type(symbolic_constant4)}
+// CHECK:STDOUT:     inst60000154:    {kind: InitializeFrom, arg0: inst60000153, arg1: inst60000046, type: type(symbolic_constant4)}
+// CHECK:STDOUT:     inst60000155:    {kind: TupleAccess, arg0: inst60000037, arg1: element1, type: type(inst60000024)}
+// CHECK:STDOUT:     inst60000156:    {kind: TupleInit, arg0: inst_block_empty, arg1: inst60000155, type: type(inst60000024)}
+// CHECK:STDOUT:     inst60000157:    {kind: Converted, arg0: inst60000043, arg1: inst60000156, type: type(inst60000024)}
+// CHECK:STDOUT:     inst60000158:    {kind: TupleInit, arg0: inst_block60000074, arg1: inst60000037, type: type(symbolic_constantA)}
+// CHECK:STDOUT:     inst60000159:    {kind: Converted, arg0: inst60000044, arg1: inst60000158, type: type(symbolic_constantA)}
+// CHECK:STDOUT:     inst6000015A:    {kind: ReturnExpr, arg0: inst60000159, arg1: inst60000037}
 // CHECK:STDOUT:   constant_values:
 // CHECK:STDOUT:     values:
-// CHECK:STDOUT:       instD:           concrete_constant(instD)
-// CHECK:STDOUT:       inst6000000F:    concrete_constant(inst6000000F)
+// CHECK:STDOUT:       instE:           concrete_constant(instE)
 // CHECK:STDOUT:       inst60000010:    concrete_constant(inst60000010)
-// CHECK:STDOUT:       inst60000011:    symbolic_constant0
+// CHECK:STDOUT:       inst60000011:    concrete_constant(inst60000011)
 // CHECK:STDOUT:       inst60000012:    symbolic_constant0
-// CHECK:STDOUT:       inst60000013:    symbolic_constant2
-// CHECK:STDOUT:       inst60000014:    symbolic_constant1
-// CHECK:STDOUT:       inst60000015:    symbolic_constant2
-// CHECK:STDOUT:       inst60000016:    concrete_constant(inst60000016)
+// CHECK:STDOUT:       inst60000013:    symbolic_constant0
+// CHECK:STDOUT:       inst60000014:    symbolic_constant2
+// CHECK:STDOUT:       inst60000015:    symbolic_constant1
+// CHECK:STDOUT:       inst60000016:    symbolic_constant2
 // CHECK:STDOUT:       inst60000017:    concrete_constant(inst60000017)
-// CHECK:STDOUT:       inst60000018:    symbolic_constant2
-// CHECK:STDOUT:       inst60000019:    symbolic_constant4
-// CHECK:STDOUT:       inst6000001A:    symbolic_constant3
-// CHECK:STDOUT:       inst6000001B:    symbolic_constant4
-// CHECK:STDOUT:       inst6000001D:    symbolic_constant5
-// CHECK:STDOUT:       inst6000001E:    concrete_constant(inst6000001E)
-// CHECK:STDOUT:       inst6000001F:    symbolic_constant6
-// CHECK:STDOUT:       inst60000020:    concrete_constant(inst60000020)
-// CHECK:STDOUT:       inst60000021:    symbolic_constant2
-// CHECK:STDOUT:       inst60000022:    symbolic_constant4
-// CHECK:STDOUT:       inst60000023:    concrete_constant(inst60000023)
-// CHECK:STDOUT:       inst60000024:    concrete_constant(inst60000025)
-// CHECK:STDOUT:       inst60000025:    concrete_constant(inst60000025)
+// CHECK:STDOUT:       inst60000018:    concrete_constant(inst60000018)
+// CHECK:STDOUT:       inst60000019:    symbolic_constant2
+// CHECK:STDOUT:       inst6000001A:    symbolic_constant4
+// CHECK:STDOUT:       inst6000001B:    symbolic_constant3
+// CHECK:STDOUT:       inst6000001C:    symbolic_constant4
+// CHECK:STDOUT:       inst6000001E:    symbolic_constant5
+// CHECK:STDOUT:       inst6000001F:    concrete_constant(inst6000001F)
+// CHECK:STDOUT:       inst60000020:    symbolic_constant6
+// CHECK:STDOUT:       inst60000021:    concrete_constant(inst60000021)
+// CHECK:STDOUT:       inst60000022:    symbolic_constant2
+// CHECK:STDOUT:       inst60000023:    symbolic_constant4
+// CHECK:STDOUT:       inst60000024:    concrete_constant(inst60000024)
+// CHECK:STDOUT:       inst60000025:    concrete_constant(inst60000026)
 // CHECK:STDOUT:       inst60000026:    concrete_constant(inst60000026)
-// CHECK:STDOUT:       inst60000027:    symbolic_constant8
-// CHECK:STDOUT:       inst60000028:    symbolic_constant7
-// CHECK:STDOUT:       inst60000029:    symbolic_constant8
-// CHECK:STDOUT:       inst6000002A:    concrete_constant(inst6000002A)
-// CHECK:STDOUT:       inst6000002B:    concrete_constant(inst60000023)
-// CHECK:STDOUT:       inst6000002C:    symbolic_constant9
-// CHECK:STDOUT:       inst6000002D:    symbolic_constantA
+// CHECK:STDOUT:       inst60000027:    concrete_constant(inst60000027)
+// CHECK:STDOUT:       inst60000028:    symbolic_constant8
+// CHECK:STDOUT:       inst60000029:    symbolic_constant7
+// CHECK:STDOUT:       inst6000002A:    symbolic_constant8
+// CHECK:STDOUT:       inst6000002B:    concrete_constant(inst6000002B)
+// CHECK:STDOUT:       inst6000002C:    concrete_constant(inst60000024)
+// CHECK:STDOUT:       inst6000002D:    symbolic_constant9
 // CHECK:STDOUT:       inst6000002E:    symbolic_constantA
-// CHECK:STDOUT:       inst6000002F:    symbolic_constantB
-// CHECK:STDOUT:       inst60000030:    concrete_constant(inst60000030)
-// CHECK:STDOUT:       inst60000031:    symbolic_constantC
-// CHECK:STDOUT:       inst60000032:    concrete_constant(inst60000032)
-// CHECK:STDOUT:       inst60000034:    symbolic_constant4
-// CHECK:STDOUT:       inst60000037:    concrete_constant(inst60000039)
-// CHECK:STDOUT:       inst60000038:    concrete_constant(inst60000038)
+// CHECK:STDOUT:       inst6000002F:    symbolic_constantA
+// CHECK:STDOUT:       inst60000030:    symbolic_constantB
+// CHECK:STDOUT:       inst60000031:    concrete_constant(inst60000031)
+// CHECK:STDOUT:       inst60000032:    symbolic_constantC
+// CHECK:STDOUT:       inst60000033:    concrete_constant(inst60000033)
+// CHECK:STDOUT:       inst60000035:    symbolic_constant4
+// CHECK:STDOUT:       inst60000038:    concrete_constant(inst6000003A)
 // CHECK:STDOUT:       inst60000039:    concrete_constant(inst60000039)
-// CHECK:STDOUT:       inst6000003A:    symbolic_constantD
-// CHECK:STDOUT:       inst6000003B:    symbolic_constant6000000F
-// CHECK:STDOUT:       inst6000003C:    symbolic_constant6000000E
-// CHECK:STDOUT:       inst6000003D:    symbolic_constant6000000F
-// CHECK:STDOUT:       inst6000003E:    symbolic_constant60000011
-// CHECK:STDOUT:       inst6000003F:    symbolic_constant60000010
-// CHECK:STDOUT:       inst60000040:    symbolic_constant60000011
-// CHECK:STDOUT:       inst60000042:    concrete_constant(inst60000025)
-// CHECK:STDOUT:       inst60000044:    symbolic_constant6000000F
-// CHECK:STDOUT:       inst60000046:    symbolic_constant60000011
-// CHECK:STDOUT:       inst60000047:    concrete_constant(inst60000049)
-// CHECK:STDOUT:       inst60000048:    concrete_constant(inst60000049)
-// CHECK:STDOUT:       inst60000049:    concrete_constant(inst60000049)
-// CHECK:STDOUT:       inst6000004A:    symbolic_constant60000012
-// CHECK:STDOUT:       inst6000004B:    constant<none>
-// CHECK:STDOUT:       inst6000004C:    concrete_constant(inst60000050)
-// CHECK:STDOUT:       inst6000004D:    constant<none>
-// CHECK:STDOUT:       inst6000004E:    concrete_constant(inst6000004E)
-// CHECK:STDOUT:       inst6000004F:    concrete_constant(inst60000053)
-// CHECK:STDOUT:       inst60000050:    concrete_constant(inst60000050)
-// CHECK:STDOUT:       inst60000051:    concrete_constant(inst60000053)
-// CHECK:STDOUT:       inst60000052:    concrete_constant(inst60000052)
+// CHECK:STDOUT:       inst6000003A:    concrete_constant(inst6000003A)
+// CHECK:STDOUT:       inst6000003B:    symbolic_constantD
+// CHECK:STDOUT:       inst6000003C:    symbolic_constant6000000F
+// CHECK:STDOUT:       inst6000003D:    symbolic_constantE
+// CHECK:STDOUT:       inst6000003E:    symbolic_constant6000000F
+// CHECK:STDOUT:       inst6000003F:    symbolic_constant60000011
+// CHECK:STDOUT:       inst60000040:    symbolic_constant60000010
+// CHECK:STDOUT:       inst60000041:    symbolic_constant60000011
+// CHECK:STDOUT:       inst60000043:    concrete_constant(inst60000026)
+// CHECK:STDOUT:       inst60000045:    symbolic_constant6000000F
+// CHECK:STDOUT:       inst60000047:    symbolic_constant60000011
+// CHECK:STDOUT:       inst60000048:    concrete_constant(inst6000004A)
+// CHECK:STDOUT:       inst60000049:    concrete_constant(inst6000004A)
+// CHECK:STDOUT:       inst6000004A:    concrete_constant(inst6000004A)
+// CHECK:STDOUT:       inst6000004B:    symbolic_constant60000012
+// CHECK:STDOUT:       inst6000004C:    constant<none>
+// CHECK:STDOUT:       inst6000004D:    concrete_constant(inst60000051)
+// CHECK:STDOUT:       inst6000004E:    constant<none>
+// CHECK:STDOUT:       inst6000004F:    concrete_constant(inst6000004F)
+// CHECK:STDOUT:       inst60000050:    concrete_constant(inst60000054)
+// CHECK:STDOUT:       inst60000051:    concrete_constant(inst60000051)
+// CHECK:STDOUT:       inst60000052:    concrete_constant(inst60000054)
 // CHECK:STDOUT:       inst60000053:    concrete_constant(inst60000053)
-// CHECK:STDOUT:       inst60000054:    symbolic_constant60000013
-// CHECK:STDOUT:       inst60000055:    symbolic_constant60000014
-// CHECK:STDOUT:       inst60000056:    concrete_constant(inst60000056)
+// CHECK:STDOUT:       inst60000054:    concrete_constant(inst60000054)
+// CHECK:STDOUT:       inst60000055:    symbolic_constant60000013
+// CHECK:STDOUT:       inst60000056:    symbolic_constant60000014
 // CHECK:STDOUT:       inst60000057:    concrete_constant(inst60000057)
 // CHECK:STDOUT:       inst60000058:    concrete_constant(inst60000058)
 // CHECK:STDOUT:       inst60000059:    concrete_constant(inst60000059)
-// CHECK:STDOUT:       inst6000005A:    symbolic_constant60000012
-// CHECK:STDOUT:       inst6000005B:    symbolic_constant60000018
-// CHECK:STDOUT:       inst6000005C:    symbolic_constant60000019
-// CHECK:STDOUT:       inst6000005D:    symbolic_constant6000001A
-// CHECK:STDOUT:       inst6000005E:    symbolic_constant60000107
-// CHECK:STDOUT:       inst6000005F:    constant<none>
-// CHECK:STDOUT:       inst60000060:    concrete_constant(inst60000060)
-// CHECK:STDOUT:       inst60000061:    symbolic_constant6000001B
-// CHECK:STDOUT:       inst60000062:    symbolic_constant6000001C
-// CHECK:STDOUT:       inst60000063:    symbolic_constant6000001D
-// CHECK:STDOUT:       inst60000064:    constant<none>
-// CHECK:STDOUT:       inst60000065:    concrete_constant(inst60000065)
-// CHECK:STDOUT:       inst60000066:    symbolic_constant6000001F
-// CHECK:STDOUT:       inst60000067:    symbolic_constant60000023
-// CHECK:STDOUT:       inst60000068:    symbolic_constant60000021
-// CHECK:STDOUT:       inst60000069:    symbolic_constant60000022
-// CHECK:STDOUT:       inst6000006A:    symbolic_constant60000025
-// CHECK:STDOUT:       inst6000006B:    concrete_constant(inst6000006B)
+// CHECK:STDOUT:       inst6000005A:    concrete_constant(inst6000005A)
+// CHECK:STDOUT:       inst6000005B:    symbolic_constant60000012
+// CHECK:STDOUT:       inst6000005C:    symbolic_constant60000018
+// CHECK:STDOUT:       inst6000005D:    symbolic_constant60000019
+// CHECK:STDOUT:       inst6000005E:    symbolic_constant6000001A
+// CHECK:STDOUT:       inst6000005F:    symbolic_constant60000109
+// CHECK:STDOUT:       inst60000060:    constant<none>
+// CHECK:STDOUT:       inst60000061:    concrete_constant(inst60000061)
+// CHECK:STDOUT:       inst60000062:    symbolic_constant6000001B
+// CHECK:STDOUT:       inst60000063:    symbolic_constant6000001C
+// CHECK:STDOUT:       inst60000064:    symbolic_constant6000001D
+// CHECK:STDOUT:       inst60000065:    constant<none>
+// CHECK:STDOUT:       inst60000066:    concrete_constant(inst60000066)
+// CHECK:STDOUT:       inst60000067:    symbolic_constant6000001F
+// CHECK:STDOUT:       inst60000068:    symbolic_constant60000023
+// CHECK:STDOUT:       inst60000069:    symbolic_constant60000021
+// CHECK:STDOUT:       inst6000006A:    symbolic_constant60000022
+// CHECK:STDOUT:       inst6000006B:    symbolic_constant60000025
 // CHECK:STDOUT:       inst6000006C:    concrete_constant(inst6000006C)
 // CHECK:STDOUT:       inst6000006D:    concrete_constant(inst6000006D)
 // CHECK:STDOUT:       inst6000006E:    concrete_constant(inst6000006E)
-// CHECK:STDOUT:       inst6000006F:    symbolic_constant6000002A
-// CHECK:STDOUT:       inst60000070:    symbolic_constant6000002B
-// CHECK:STDOUT:       inst60000071:    symbolic_constant6000002C
-// CHECK:STDOUT:       inst60000072:    symbolic_constant6000002D
-// CHECK:STDOUT:       inst60000073:    symbolic_constant6000002E
-// CHECK:STDOUT:       inst60000074:    symbolic_constant6000002F
-// CHECK:STDOUT:       inst60000075:    symbolic_constant60000030
-// CHECK:STDOUT:       inst60000076:    symbolic_constant60000031
-// CHECK:STDOUT:       inst60000077:    symbolic_constant60000032
-// CHECK:STDOUT:       inst60000078:    symbolic_constant60000034
-// CHECK:STDOUT:       inst60000079:    symbolic_constant60000038
-// CHECK:STDOUT:       inst6000007A:    symbolic_constant6000003A
-// CHECK:STDOUT:       inst6000007B:    symbolic_constant6000003C
-// CHECK:STDOUT:       inst6000007C:    symbolic_constant6000003D
-// CHECK:STDOUT:       inst6000007D:    symbolic_constant6000003E
-// CHECK:STDOUT:       inst6000007E:    symbolic_constant6000003F
-// CHECK:STDOUT:       inst6000007F:    symbolic_constant60000040
-// CHECK:STDOUT:       inst60000080:    symbolic_constant60000041
-// CHECK:STDOUT:       inst60000081:    concrete_constant(inst60000081)
+// CHECK:STDOUT:       inst6000006F:    concrete_constant(inst6000006F)
+// CHECK:STDOUT:       inst60000070:    symbolic_constant6000002A
+// CHECK:STDOUT:       inst60000071:    symbolic_constant6000002B
+// CHECK:STDOUT:       inst60000072:    symbolic_constant6000002C
+// CHECK:STDOUT:       inst60000073:    symbolic_constant6000002D
+// CHECK:STDOUT:       inst60000074:    symbolic_constant6000002E
+// CHECK:STDOUT:       inst60000075:    symbolic_constant6000002F
+// CHECK:STDOUT:       inst60000076:    symbolic_constant60000030
+// CHECK:STDOUT:       inst60000077:    symbolic_constant60000031
+// CHECK:STDOUT:       inst60000078:    symbolic_constant60000032
+// CHECK:STDOUT:       inst60000079:    symbolic_constant60000034
+// CHECK:STDOUT:       inst6000007A:    symbolic_constant60000038
+// CHECK:STDOUT:       inst6000007B:    symbolic_constant6000003A
+// CHECK:STDOUT:       inst6000007C:    symbolic_constant6000003C
+// CHECK:STDOUT:       inst6000007D:    symbolic_constant6000003D
+// CHECK:STDOUT:       inst6000007E:    symbolic_constant6000003E
+// CHECK:STDOUT:       inst6000007F:    symbolic_constant6000003F
+// CHECK:STDOUT:       inst60000080:    symbolic_constant60000040
+// CHECK:STDOUT:       inst60000081:    symbolic_constant60000041
 // CHECK:STDOUT:       inst60000082:    concrete_constant(inst60000082)
-// CHECK:STDOUT:       inst60000083:    symbolic_constant6000001E
-// CHECK:STDOUT:       inst60000084:    concrete_constant(inst60000049)
-// CHECK:STDOUT:       inst60000085:    symbolic_constant6000002A
-// CHECK:STDOUT:       inst60000086:    symbolic_constant60000045
-// CHECK:STDOUT:       inst60000087:    symbolic_constant60000046
-// CHECK:STDOUT:       inst60000088:    symbolic_constant60000047
-// CHECK:STDOUT:       inst60000089:    symbolic_constant60000048
-// CHECK:STDOUT:       inst6000008A:    symbolic_constant6000004A
-// CHECK:STDOUT:       inst6000008B:    symbolic_constant6000004B
-// CHECK:STDOUT:       inst6000008C:    constant<none>
-// CHECK:STDOUT:       inst6000008D:    concrete_constant(inst6000008D)
-// CHECK:STDOUT:       inst6000008E:    concrete_constant(inst(BoolType))
-// CHECK:STDOUT:       inst6000008F:    concrete_constant(inst60000049)
-// CHECK:STDOUT:       inst60000090:    constant<none>
-// CHECK:STDOUT:       inst60000091:    concrete_constant(inst60000091)
-// CHECK:STDOUT:       inst60000092:    concrete_constant(inst(CharLiteralType))
-// CHECK:STDOUT:       inst60000093:    concrete_constant(inst60000049)
-// CHECK:STDOUT:       inst60000094:    constant<none>
-// CHECK:STDOUT:       inst60000095:    concrete_constant(inst60000095)
-// CHECK:STDOUT:       inst60000096:    concrete_constant(inst(FloatLiteralType))
-// CHECK:STDOUT:       inst60000097:    concrete_constant(inst60000049)
-// CHECK:STDOUT:       inst60000098:    constant<none>
-// CHECK:STDOUT:       inst60000099:    concrete_constant(inst60000099)
-// CHECK:STDOUT:       inst6000009A:    concrete_constant(inst(IntLiteralType))
-// CHECK:STDOUT:       inst6000009B:    concrete_constant(inst60000049)
-// CHECK:STDOUT:       inst6000009C:    symbolic_constant60000105
-// CHECK:STDOUT:       inst6000009D:    concrete_constant(inst6000009D)
-// CHECK:STDOUT:       inst6000009E:    constant<none>
-// CHECK:STDOUT:       inst6000009F:    concrete_constant(inst6000009F)
-// CHECK:STDOUT:       inst600000A0:    symbolic_constant6000004D
-// CHECK:STDOUT:       inst600000A1:    concrete_constant(inst600000A1)
-// CHECK:STDOUT:       inst600000A2:    symbolic_constant6000004C
-// CHECK:STDOUT:       inst600000A3:    concrete_constant(inst60000049)
-// CHECK:STDOUT:       inst600000A4:    symbolic_constant60000051
-// CHECK:STDOUT:       inst600000A5:    symbolic_constant60000052
-// CHECK:STDOUT:       inst600000A6:    symbolic_constant60000053
-// CHECK:STDOUT:       inst600000A7:    symbolic_constant60000054
-// CHECK:STDOUT:       inst600000A8:    symbolic_constant60000058
-// CHECK:STDOUT:       inst600000A9:    symbolic_constant60000056
-// CHECK:STDOUT:       inst600000AA:    symbolic_constant60000057
-// CHECK:STDOUT:       inst600000AB:    concrete_constant(inst600000AB)
+// CHECK:STDOUT:       inst60000083:    concrete_constant(inst60000083)
+// CHECK:STDOUT:       inst60000084:    symbolic_constant6000001E
+// CHECK:STDOUT:       inst60000085:    concrete_constant(inst6000004A)
+// CHECK:STDOUT:       inst60000086:    symbolic_constant6000002A
+// CHECK:STDOUT:       inst60000087:    symbolic_constant60000045
+// CHECK:STDOUT:       inst60000088:    symbolic_constant60000046
+// CHECK:STDOUT:       inst60000089:    symbolic_constant60000047
+// CHECK:STDOUT:       inst6000008A:    symbolic_constant60000048
+// CHECK:STDOUT:       inst6000008B:    symbolic_constant6000004A
+// CHECK:STDOUT:       inst6000008C:    symbolic_constant6000004B
+// CHECK:STDOUT:       inst6000008D:    constant<none>
+// CHECK:STDOUT:       inst6000008E:    concrete_constant(inst6000008E)
+// CHECK:STDOUT:       inst6000008F:    concrete_constant(inst(BoolType))
+// CHECK:STDOUT:       inst60000090:    concrete_constant(inst6000004A)
+// CHECK:STDOUT:       inst60000091:    constant<none>
+// CHECK:STDOUT:       inst60000092:    concrete_constant(inst60000092)
+// CHECK:STDOUT:       inst60000093:    concrete_constant(inst(CharLiteralType))
+// CHECK:STDOUT:       inst60000094:    concrete_constant(inst6000004A)
+// CHECK:STDOUT:       inst60000095:    constant<none>
+// CHECK:STDOUT:       inst60000096:    concrete_constant(inst60000096)
+// CHECK:STDOUT:       inst60000097:    concrete_constant(inst(FloatLiteralType))
+// CHECK:STDOUT:       inst60000098:    concrete_constant(inst6000004A)
+// CHECK:STDOUT:       inst60000099:    constant<none>
+// CHECK:STDOUT:       inst6000009A:    concrete_constant(inst6000009A)
+// CHECK:STDOUT:       inst6000009B:    concrete_constant(inst(IntLiteralType))
+// CHECK:STDOUT:       inst6000009C:    concrete_constant(inst6000004A)
+// CHECK:STDOUT:       inst6000009D:    symbolic_constant60000105
+// CHECK:STDOUT:       inst6000009E:    concrete_constant(inst6000009E)
+// CHECK:STDOUT:       inst6000009F:    constant<none>
+// CHECK:STDOUT:       inst600000A0:    concrete_constant(inst600000A0)
+// CHECK:STDOUT:       inst600000A1:    symbolic_constant6000004D
+// CHECK:STDOUT:       inst600000A2:    concrete_constant(inst600000A2)
+// CHECK:STDOUT:       inst600000A3:    symbolic_constant6000004C
+// CHECK:STDOUT:       inst600000A4:    concrete_constant(inst6000004A)
+// CHECK:STDOUT:       inst600000A5:    symbolic_constant60000051
+// CHECK:STDOUT:       inst600000A6:    symbolic_constant60000052
+// CHECK:STDOUT:       inst600000A7:    symbolic_constant60000053
+// CHECK:STDOUT:       inst600000A8:    symbolic_constant60000054
+// CHECK:STDOUT:       inst600000A9:    symbolic_constant60000058
+// CHECK:STDOUT:       inst600000AA:    symbolic_constant60000056
+// CHECK:STDOUT:       inst600000AB:    symbolic_constant60000057
 // CHECK:STDOUT:       inst600000AC:    concrete_constant(inst600000AC)
 // CHECK:STDOUT:       inst600000AD:    concrete_constant(inst600000AD)
 // CHECK:STDOUT:       inst600000AE:    concrete_constant(inst600000AE)
-// CHECK:STDOUT:       inst600000AF:    symbolic_constant60000051
-// CHECK:STDOUT:       inst600000B0:    symbolic_constant6000005D
-// CHECK:STDOUT:       inst600000B1:    symbolic_constant6000005E
-// CHECK:STDOUT:       inst600000B2:    symbolic_constant6000005F
-// CHECK:STDOUT:       inst600000B3:    symbolic_constant60000061
-// CHECK:STDOUT:       inst600000B4:    symbolic_constant60000062
-// CHECK:STDOUT:       inst600000B5:    symbolic_constant60000063
-// CHECK:STDOUT:       inst600000B6:    constant<none>
-// CHECK:STDOUT:       inst600000B7:    concrete_constant(inst600000B7)
-// CHECK:STDOUT:       inst600000B8:    concrete_constant(inst(TypeType))
-// CHECK:STDOUT:       inst600000B9:    concrete_constant(inst60000049)
-// CHECK:STDOUT:       inst600000BA:    constant<none>
-// CHECK:STDOUT:       inst600000BB:    concrete_constant(inst600000BB)
-// CHECK:STDOUT:       inst600000BC:    concrete_constant(inst60000023)
-// CHECK:STDOUT:       inst600000BD:    concrete_constant(inst60000049)
-// CHECK:STDOUT:       inst600000BE:    constant<none>
-// CHECK:STDOUT:       inst600000BF:    concrete_constant(inst600000BF)
-// CHECK:STDOUT:       inst600000C0:    symbolic_constant60000064
-// CHECK:STDOUT:       inst600000C1:    symbolic_constant60000065
-// CHECK:STDOUT:       inst600000C2:    symbolic_constant60000066
-// CHECK:STDOUT:       inst600000C3:    constant<none>
-// CHECK:STDOUT:       inst600000C4:    concrete_constant(inst600000C4)
-// CHECK:STDOUT:       inst600000C5:    symbolic_constant60000068
-// CHECK:STDOUT:       inst600000C6:    symbolic_constant6000006C
-// CHECK:STDOUT:       inst600000C7:    symbolic_constant6000006A
-// CHECK:STDOUT:       inst600000C8:    symbolic_constant6000006B
-// CHECK:STDOUT:       inst600000C9:    concrete_constant(inst600000C9)
-// CHECK:STDOUT:       inst600000CA:    symbolic_constant6000006E
-// CHECK:STDOUT:       inst600000CB:    symbolic_constant6000006F
-// CHECK:STDOUT:       inst600000CC:    concrete_constant(inst600000CC)
+// CHECK:STDOUT:       inst600000AF:    concrete_constant(inst600000AF)
+// CHECK:STDOUT:       inst600000B0:    symbolic_constant60000051
+// CHECK:STDOUT:       inst600000B1:    symbolic_constant6000005D
+// CHECK:STDOUT:       inst600000B2:    symbolic_constant6000005E
+// CHECK:STDOUT:       inst600000B3:    symbolic_constant6000005F
+// CHECK:STDOUT:       inst600000B4:    symbolic_constant60000061
+// CHECK:STDOUT:       inst600000B5:    symbolic_constant60000062
+// CHECK:STDOUT:       inst600000B6:    symbolic_constant60000063
+// CHECK:STDOUT:       inst600000B7:    constant<none>
+// CHECK:STDOUT:       inst600000B8:    concrete_constant(inst600000B8)
+// CHECK:STDOUT:       inst600000B9:    concrete_constant(inst(TypeType))
+// CHECK:STDOUT:       inst600000BA:    concrete_constant(inst6000004A)
+// CHECK:STDOUT:       inst600000BB:    constant<none>
+// CHECK:STDOUT:       inst600000BC:    concrete_constant(inst600000BC)
+// CHECK:STDOUT:       inst600000BD:    concrete_constant(inst60000024)
+// CHECK:STDOUT:       inst600000BE:    concrete_constant(inst6000004A)
+// CHECK:STDOUT:       inst600000BF:    constant<none>
+// CHECK:STDOUT:       inst600000C0:    concrete_constant(inst600000C0)
+// CHECK:STDOUT:       inst600000C1:    symbolic_constant60000064
+// CHECK:STDOUT:       inst600000C2:    symbolic_constant60000065
+// CHECK:STDOUT:       inst600000C3:    symbolic_constant60000066
+// CHECK:STDOUT:       inst600000C4:    constant<none>
+// CHECK:STDOUT:       inst600000C5:    concrete_constant(inst600000C5)
+// CHECK:STDOUT:       inst600000C6:    symbolic_constant60000068
+// CHECK:STDOUT:       inst600000C7:    symbolic_constant6000006C
+// CHECK:STDOUT:       inst600000C8:    symbolic_constant6000006A
+// CHECK:STDOUT:       inst600000C9:    symbolic_constant6000006B
+// CHECK:STDOUT:       inst600000CA:    concrete_constant(inst600000CA)
+// CHECK:STDOUT:       inst600000CB:    symbolic_constant6000006E
+// CHECK:STDOUT:       inst600000CC:    symbolic_constant6000006F
 // CHECK:STDOUT:       inst600000CD:    concrete_constant(inst600000CD)
 // CHECK:STDOUT:       inst600000CE:    concrete_constant(inst600000CE)
 // CHECK:STDOUT:       inst600000CF:    concrete_constant(inst600000CF)
-// CHECK:STDOUT:       inst600000D0:    symbolic_constant60000077
-// CHECK:STDOUT:       inst600000D1:    symbolic_constant60000076
-// CHECK:STDOUT:       inst600000D2:    symbolic_constant60000078
-// CHECK:STDOUT:       inst600000D3:    symbolic_constant60000079
-// CHECK:STDOUT:       inst600000D4:    symbolic_constant6000007A
-// CHECK:STDOUT:       inst600000D5:    symbolic_constant6000007B
-// CHECK:STDOUT:       inst600000D6:    symbolic_constant6000007C
-// CHECK:STDOUT:       inst600000D7:    symbolic_constant6000007D
-// CHECK:STDOUT:       inst600000D8:    symbolic_constant6000007E
-// CHECK:STDOUT:       inst600000D9:    symbolic_constant6000007F
-// CHECK:STDOUT:       inst600000DA:    symbolic_constant60000080
-// CHECK:STDOUT:       inst600000DB:    symbolic_constant60000081
-// CHECK:STDOUT:       inst600000DC:    symbolic_constant60000083
-// CHECK:STDOUT:       inst600000DD:    symbolic_constant60000087
-// CHECK:STDOUT:       inst600000DE:    symbolic_constant6000008E
-// CHECK:STDOUT:       inst600000DF:    symbolic_constant60000090
-// CHECK:STDOUT:       inst600000E0:    symbolic_constant60000091
-// CHECK:STDOUT:       inst600000E1:    symbolic_constant60000092
-// CHECK:STDOUT:       inst600000E2:    symbolic_constant60000093
-// CHECK:STDOUT:       inst600000E3:    symbolic_constant60000094
-// CHECK:STDOUT:       inst600000E4:    symbolic_constant60000095
-// CHECK:STDOUT:       inst600000E5:    symbolic_constant60000096
-// CHECK:STDOUT:       inst600000E6:    symbolic_constant60000097
-// CHECK:STDOUT:       inst600000E7:    symbolic_constant60000098
-// CHECK:STDOUT:       inst600000E8:    symbolic_constant60000099
-// CHECK:STDOUT:       inst600000E9:    symbolic_constant6000009A
-// CHECK:STDOUT:       inst600000EA:    concrete_constant(inst600000EA)
+// CHECK:STDOUT:       inst600000D0:    concrete_constant(inst600000D0)
+// CHECK:STDOUT:       inst600000D1:    symbolic_constant60000077
+// CHECK:STDOUT:       inst600000D2:    symbolic_constant60000076
+// CHECK:STDOUT:       inst600000D3:    symbolic_constant60000078
+// CHECK:STDOUT:       inst600000D4:    symbolic_constant60000079
+// CHECK:STDOUT:       inst600000D5:    symbolic_constant6000007A
+// CHECK:STDOUT:       inst600000D6:    symbolic_constant6000007B
+// CHECK:STDOUT:       inst600000D7:    symbolic_constant6000007C
+// CHECK:STDOUT:       inst600000D8:    symbolic_constant6000007D
+// CHECK:STDOUT:       inst600000D9:    symbolic_constant6000007E
+// CHECK:STDOUT:       inst600000DA:    symbolic_constant6000007F
+// CHECK:STDOUT:       inst600000DB:    symbolic_constant60000080
+// CHECK:STDOUT:       inst600000DC:    symbolic_constant60000081
+// CHECK:STDOUT:       inst600000DD:    symbolic_constant60000083
+// CHECK:STDOUT:       inst600000DE:    symbolic_constant60000087
+// CHECK:STDOUT:       inst600000DF:    symbolic_constant6000008E
+// CHECK:STDOUT:       inst600000E0:    symbolic_constant60000090
+// CHECK:STDOUT:       inst600000E1:    symbolic_constant60000091
+// CHECK:STDOUT:       inst600000E2:    symbolic_constant60000092
+// CHECK:STDOUT:       inst600000E3:    symbolic_constant60000093
+// CHECK:STDOUT:       inst600000E4:    symbolic_constant60000094
+// CHECK:STDOUT:       inst600000E5:    symbolic_constant60000095
+// CHECK:STDOUT:       inst600000E6:    symbolic_constant60000096
+// CHECK:STDOUT:       inst600000E7:    symbolic_constant60000097
+// CHECK:STDOUT:       inst600000E8:    symbolic_constant60000098
+// CHECK:STDOUT:       inst600000E9:    symbolic_constant60000099
+// CHECK:STDOUT:       inst600000EA:    symbolic_constant6000009A
 // CHECK:STDOUT:       inst600000EB:    concrete_constant(inst600000EB)
-// CHECK:STDOUT:       inst600000EC:    symbolic_constant60000067
-// CHECK:STDOUT:       inst600000ED:    concrete_constant(inst60000049)
-// CHECK:STDOUT:       inst600000EE:    symbolic_constant60000077
-// CHECK:STDOUT:       inst600000EF:    symbolic_constant60000076
-// CHECK:STDOUT:       inst600000F0:    symbolic_constant600000A1
-// CHECK:STDOUT:       inst600000F1:    symbolic_constant600000A2
-// CHECK:STDOUT:       inst600000F2:    symbolic_constant600000A3
-// CHECK:STDOUT:       inst600000F3:    symbolic_constant600000A4
-// CHECK:STDOUT:       inst600000F4:    symbolic_constant600000A5
-// CHECK:STDOUT:       inst600000F5:    symbolic_constant600000A6
-// CHECK:STDOUT:       inst600000F6:    symbolic_constant600000A7
-// CHECK:STDOUT:       inst600000F7:    symbolic_constant600000A9
-// CHECK:STDOUT:       inst600000F8:    symbolic_constant600000AA
-// CHECK:STDOUT:       inst600000F9:    constant<none>
-// CHECK:STDOUT:       inst600000FA:    concrete_constant(inst600000FA)
-// CHECK:STDOUT:       inst600000FB:    symbolic_constant600000AB
-// CHECK:STDOUT:       inst600000FC:    symbolic_constant600000AC
-// CHECK:STDOUT:       inst600000FD:    symbolic_constant600000AD
-// CHECK:STDOUT:       inst600000FE:    constant<none>
-// CHECK:STDOUT:       inst600000FF:    concrete_constant(inst600000FF)
-// CHECK:STDOUT:       inst60000100:    symbolic_constant600000AF
-// CHECK:STDOUT:       inst60000101:    symbolic_constant600000B3
-// CHECK:STDOUT:       inst60000102:    symbolic_constant600000B1
-// CHECK:STDOUT:       inst60000103:    symbolic_constant600000B2
-// CHECK:STDOUT:       inst60000104:    concrete_constant(inst60000104)
-// CHECK:STDOUT:       inst60000105:    symbolic_constant600000B5
-// CHECK:STDOUT:       inst60000106:    symbolic_constant600000B6
-// CHECK:STDOUT:       inst60000107:    concrete_constant(inst60000107)
+// CHECK:STDOUT:       inst600000EC:    concrete_constant(inst600000EC)
+// CHECK:STDOUT:       inst600000ED:    symbolic_constant60000067
+// CHECK:STDOUT:       inst600000EE:    concrete_constant(inst6000004A)
+// CHECK:STDOUT:       inst600000EF:    symbolic_constant60000077
+// CHECK:STDOUT:       inst600000F0:    symbolic_constant60000076
+// CHECK:STDOUT:       inst600000F1:    symbolic_constant600000A1
+// CHECK:STDOUT:       inst600000F2:    symbolic_constant600000A2
+// CHECK:STDOUT:       inst600000F3:    symbolic_constant600000A3
+// CHECK:STDOUT:       inst600000F4:    symbolic_constant600000A4
+// CHECK:STDOUT:       inst600000F5:    symbolic_constant600000A5
+// CHECK:STDOUT:       inst600000F6:    symbolic_constant600000A6
+// CHECK:STDOUT:       inst600000F7:    symbolic_constant600000A7
+// CHECK:STDOUT:       inst600000F8:    symbolic_constant600000A9
+// CHECK:STDOUT:       inst600000F9:    symbolic_constant600000AA
+// CHECK:STDOUT:       inst600000FA:    constant<none>
+// CHECK:STDOUT:       inst600000FB:    concrete_constant(inst600000FB)
+// CHECK:STDOUT:       inst600000FC:    symbolic_constant600000AB
+// CHECK:STDOUT:       inst600000FD:    symbolic_constant600000AC
+// CHECK:STDOUT:       inst600000FE:    symbolic_constant600000AD
+// CHECK:STDOUT:       inst600000FF:    constant<none>
+// CHECK:STDOUT:       inst60000100:    concrete_constant(inst60000100)
+// CHECK:STDOUT:       inst60000101:    symbolic_constant600000AF
+// CHECK:STDOUT:       inst60000102:    symbolic_constant600000B3
+// CHECK:STDOUT:       inst60000103:    symbolic_constant600000B1
+// CHECK:STDOUT:       inst60000104:    symbolic_constant600000B2
+// CHECK:STDOUT:       inst60000105:    concrete_constant(inst60000105)
+// CHECK:STDOUT:       inst60000106:    symbolic_constant600000B5
+// CHECK:STDOUT:       inst60000107:    symbolic_constant600000B6
 // CHECK:STDOUT:       inst60000108:    concrete_constant(inst60000108)
 // CHECK:STDOUT:       inst60000109:    concrete_constant(inst60000109)
 // CHECK:STDOUT:       inst6000010A:    concrete_constant(inst6000010A)
-// CHECK:STDOUT:       inst6000010B:    symbolic_constant600000C1
-// CHECK:STDOUT:       inst6000010C:    symbolic_constant600000C0
-// CHECK:STDOUT:       inst6000010D:    symbolic_constant600000BF
-// CHECK:STDOUT:       inst6000010E:    symbolic_constant600000C2
-// CHECK:STDOUT:       inst6000010F:    symbolic_constant600000C3
-// CHECK:STDOUT:       inst60000110:    symbolic_constant600000C4
-// CHECK:STDOUT:       inst60000111:    symbolic_constant600000C5
-// CHECK:STDOUT:       inst60000112:    symbolic_constant600000C6
-// CHECK:STDOUT:       inst60000113:    symbolic_constant600000C7
-// CHECK:STDOUT:       inst60000114:    symbolic_constant600000C8
-// CHECK:STDOUT:       inst60000115:    symbolic_constant600000C9
-// CHECK:STDOUT:       inst60000116:    symbolic_constant600000CA
-// CHECK:STDOUT:       inst60000117:    symbolic_constant600000CB
-// CHECK:STDOUT:       inst60000118:    symbolic_constant600000CC
-// CHECK:STDOUT:       inst60000119:    symbolic_constant600000CD
-// CHECK:STDOUT:       inst6000011A:    symbolic_constant600000CF
-// CHECK:STDOUT:       inst6000011B:    symbolic_constant600000D3
-// CHECK:STDOUT:       inst6000011C:    symbolic_constant600000DF
-// CHECK:STDOUT:       inst6000011D:    symbolic_constant600000E1
-// CHECK:STDOUT:       inst6000011E:    symbolic_constant600000E2
-// CHECK:STDOUT:       inst6000011F:    symbolic_constant600000E3
-// CHECK:STDOUT:       inst60000120:    symbolic_constant600000E4
-// CHECK:STDOUT:       inst60000121:    symbolic_constant600000E5
-// CHECK:STDOUT:       inst60000122:    symbolic_constant600000E6
-// CHECK:STDOUT:       inst60000123:    symbolic_constant600000E7
-// CHECK:STDOUT:       inst60000124:    symbolic_constant600000E8
-// CHECK:STDOUT:       inst60000125:    symbolic_constant600000E9
-// CHECK:STDOUT:       inst60000126:    symbolic_constant600000EA
-// CHECK:STDOUT:       inst60000127:    symbolic_constant600000EB
-// CHECK:STDOUT:       inst60000128:    symbolic_constant600000EC
-// CHECK:STDOUT:       inst60000129:    symbolic_constant600000ED
-// CHECK:STDOUT:       inst6000012A:    symbolic_constant600000EE
-// CHECK:STDOUT:       inst6000012B:    symbolic_constant600000EF
-// CHECK:STDOUT:       inst6000012C:    symbolic_constant600000F0
-// CHECK:STDOUT:       inst6000012D:    concrete_constant(inst6000012D)
+// CHECK:STDOUT:       inst6000010B:    concrete_constant(inst6000010B)
+// CHECK:STDOUT:       inst6000010C:    symbolic_constant600000C1
+// CHECK:STDOUT:       inst6000010D:    symbolic_constant600000C0
+// CHECK:STDOUT:       inst6000010E:    symbolic_constant600000BF
+// CHECK:STDOUT:       inst6000010F:    symbolic_constant600000C2
+// CHECK:STDOUT:       inst60000110:    symbolic_constant600000C3
+// CHECK:STDOUT:       inst60000111:    symbolic_constant600000C4
+// CHECK:STDOUT:       inst60000112:    symbolic_constant600000C5
+// CHECK:STDOUT:       inst60000113:    symbolic_constant600000C6
+// CHECK:STDOUT:       inst60000114:    symbolic_constant600000C7
+// CHECK:STDOUT:       inst60000115:    symbolic_constant600000C8
+// CHECK:STDOUT:       inst60000116:    symbolic_constant600000C9
+// CHECK:STDOUT:       inst60000117:    symbolic_constant600000CA
+// CHECK:STDOUT:       inst60000118:    symbolic_constant600000CB
+// CHECK:STDOUT:       inst60000119:    symbolic_constant600000CC
+// CHECK:STDOUT:       inst6000011A:    symbolic_constant600000CD
+// CHECK:STDOUT:       inst6000011B:    symbolic_constant600000CF
+// CHECK:STDOUT:       inst6000011C:    symbolic_constant600000D3
+// CHECK:STDOUT:       inst6000011D:    symbolic_constant600000DF
+// CHECK:STDOUT:       inst6000011E:    symbolic_constant600000E1
+// CHECK:STDOUT:       inst6000011F:    symbolic_constant600000E2
+// CHECK:STDOUT:       inst60000120:    symbolic_constant600000E3
+// CHECK:STDOUT:       inst60000121:    symbolic_constant600000E4
+// CHECK:STDOUT:       inst60000122:    symbolic_constant600000E5
+// CHECK:STDOUT:       inst60000123:    symbolic_constant600000E6
+// CHECK:STDOUT:       inst60000124:    symbolic_constant600000E7
+// CHECK:STDOUT:       inst60000125:    symbolic_constant600000E8
+// CHECK:STDOUT:       inst60000126:    symbolic_constant600000E9
+// CHECK:STDOUT:       inst60000127:    symbolic_constant600000EA
+// CHECK:STDOUT:       inst60000128:    symbolic_constant600000EB
+// CHECK:STDOUT:       inst60000129:    symbolic_constant600000EC
+// CHECK:STDOUT:       inst6000012A:    symbolic_constant600000ED
+// CHECK:STDOUT:       inst6000012B:    symbolic_constant600000EE
+// CHECK:STDOUT:       inst6000012C:    symbolic_constant600000EF
+// CHECK:STDOUT:       inst6000012D:    symbolic_constant600000F0
 // CHECK:STDOUT:       inst6000012E:    concrete_constant(inst6000012E)
 // CHECK:STDOUT:       inst6000012F:    concrete_constant(inst6000012F)
-// CHECK:STDOUT:       inst60000130:    symbolic_constant600000AE
-// CHECK:STDOUT:       inst60000131:    concrete_constant(inst60000049)
-// CHECK:STDOUT:       inst60000132:    symbolic_constant600000C1
-// CHECK:STDOUT:       inst60000133:    symbolic_constant600000C0
-// CHECK:STDOUT:       inst60000134:    symbolic_constant600000BF
-// CHECK:STDOUT:       inst60000135:    symbolic_constant600000F9
-// CHECK:STDOUT:       inst60000136:    symbolic_constant600000FA
-// CHECK:STDOUT:       inst60000137:    symbolic_constant600000FB
-// CHECK:STDOUT:       inst60000138:    symbolic_constant600000FC
-// CHECK:STDOUT:       inst60000139:    symbolic_constant600000FD
-// CHECK:STDOUT:       inst6000013A:    symbolic_constant600000FE
-// CHECK:STDOUT:       inst6000013B:    symbolic_constant600000FF
-// CHECK:STDOUT:       inst6000013C:    symbolic_constant60000100
-// CHECK:STDOUT:       inst6000013D:    symbolic_constant60000101
-// CHECK:STDOUT:       inst6000013E:    symbolic_constant60000103
-// CHECK:STDOUT:       inst6000013F:    symbolic_constant60000104
-// CHECK:STDOUT:       inst60000140:    symbolic_constant60000106
+// CHECK:STDOUT:       inst60000130:    concrete_constant(inst60000130)
+// CHECK:STDOUT:       inst60000131:    symbolic_constant600000AE
+// CHECK:STDOUT:       inst60000132:    concrete_constant(inst6000004A)
+// CHECK:STDOUT:       inst60000133:    symbolic_constant600000C1
+// CHECK:STDOUT:       inst60000134:    symbolic_constant600000C0
+// CHECK:STDOUT:       inst60000135:    symbolic_constant600000BF
+// CHECK:STDOUT:       inst60000136:    symbolic_constant600000F9
+// CHECK:STDOUT:       inst60000137:    symbolic_constant600000FA
+// CHECK:STDOUT:       inst60000138:    symbolic_constant600000FB
+// CHECK:STDOUT:       inst60000139:    symbolic_constant600000FC
+// CHECK:STDOUT:       inst6000013A:    symbolic_constant600000FD
+// CHECK:STDOUT:       inst6000013B:    symbolic_constant600000FE
+// CHECK:STDOUT:       inst6000013C:    symbolic_constant600000FF
+// CHECK:STDOUT:       inst6000013D:    symbolic_constant60000100
+// CHECK:STDOUT:       inst6000013E:    symbolic_constant60000101
+// CHECK:STDOUT:       inst6000013F:    symbolic_constant60000103
+// CHECK:STDOUT:       inst60000140:    symbolic_constant60000104
 // CHECK:STDOUT:       inst60000141:    symbolic_constant60000107
-// CHECK:STDOUT:       inst60000142:    symbolic_constant60000108
-// CHECK:STDOUT:       inst60000143:    symbolic_constant60000109
-// CHECK:STDOUT:       inst60000144:    symbolic_constant6000010D
-// CHECK:STDOUT:       inst60000145:    symbolic_constant6000010A
-// CHECK:STDOUT:       inst60000146:    symbolic_constant6000010B
-// CHECK:STDOUT:       inst60000147:    symbolic_constant6000010C
-// CHECK:STDOUT:       inst60000148:    symbolic_constant6000010D
-// CHECK:STDOUT:       inst6000014A:    symbolic_constant6000010F
+// CHECK:STDOUT:       inst60000142:    symbolic_constant60000106
+// CHECK:STDOUT:       inst60000143:    symbolic_constant60000107
+// CHECK:STDOUT:       inst60000144:    symbolic_constant60000108
+// CHECK:STDOUT:       inst60000145:    symbolic_constant60000109
+// CHECK:STDOUT:       inst60000146:    symbolic_constant6000010A
+// CHECK:STDOUT:       inst60000147:    symbolic_constant6000010B
+// CHECK:STDOUT:       inst60000148:    symbolic_constant6000010F
+// CHECK:STDOUT:       inst60000149:    symbolic_constant6000010C
+// CHECK:STDOUT:       inst6000014A:    symbolic_constant6000010D
 // CHECK:STDOUT:       inst6000014B:    symbolic_constant6000010E
 // CHECK:STDOUT:       inst6000014C:    symbolic_constant6000010F
-// CHECK:STDOUT:       inst6000014E:    symbolic_constant60000011
-// CHECK:STDOUT:       inst60000152:    concrete_constant(inst60000025)
-// CHECK:STDOUT:       inst60000153:    concrete_constant(inst60000025)
+// CHECK:STDOUT:       inst6000014E:    symbolic_constant60000111
+// CHECK:STDOUT:       inst6000014F:    symbolic_constant60000110
+// CHECK:STDOUT:       inst60000150:    symbolic_constant60000111
+// CHECK:STDOUT:       inst60000152:    symbolic_constant60000011
+// CHECK:STDOUT:       inst60000156:    concrete_constant(inst60000026)
+// CHECK:STDOUT:       inst60000157:    concrete_constant(inst60000026)
 // CHECK:STDOUT:     symbolic_constants:
-// CHECK:STDOUT:       symbolic_constant0: {inst: inst60000012, generic: generic<none>, index: generic_inst<none>, kind: self}
-// CHECK:STDOUT:       symbolic_constant1: {inst: inst60000014, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant2: {inst: inst60000014, generic: generic60000000, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant3: {inst: inst6000001A, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant4: {inst: inst6000001A, generic: generic60000000, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant5: {inst: inst6000001D, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6: {inst: inst6000001D, generic: generic60000000, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant7: {inst: inst60000028, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant8: {inst: inst60000028, generic: generic60000000, index: generic_inst_in_decl3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant9: {inst: inst6000002C, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constantA: {inst: inst6000002C, generic: generic60000000, index: generic_inst_in_decl4, kind: checked}
-// CHECK:STDOUT:       symbolic_constantB: {inst: inst6000002F, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constantC: {inst: inst6000002F, generic: generic60000000, index: generic_inst_in_decl5, kind: checked}
-// CHECK:STDOUT:       symbolic_constantD: {inst: inst6000003A, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000000E: {inst: inst6000003C, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000000F: {inst: inst6000003C, generic: generic60000000, index: generic_inst_in_def0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000010: {inst: inst6000003F, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000011: {inst: inst6000003F, generic: generic60000000, index: generic_inst_in_def1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000012: {inst: inst6000004A, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000013: {inst: inst60000054, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000014: {inst: inst60000055, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000015: {inst: inst60000055, generic: generic60000001, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000016: {inst: inst60000054, generic: generic60000001, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000017: {inst: inst6000004A, generic: generic60000001, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000018: {inst: inst6000004A, generic: generic60000001, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000019: {inst: inst60000054, generic: generic60000001, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000001A: {inst: inst60000055, generic: generic60000001, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000001B: {inst: inst60000061, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000001C: {inst: inst60000062, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000001D: {inst: inst60000063, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000001E: {inst: inst60000063, generic: generic60000002, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000001F: {inst: inst60000066, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000020: {inst: inst60000066, generic: generic60000002, index: generic_inst_in_decl3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000021: {inst: inst60000068, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000022: {inst: inst60000069, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000023: {inst: inst60000069, generic: generic60000002, index: generic_inst_in_def1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000024: {inst: inst60000068, generic: generic60000002, index: generic_inst_in_def0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000025: {inst: inst6000006A, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000026: {inst: inst6000006A, generic: generic60000003, index: generic_inst_in_decl3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000027: {inst: inst60000063, generic: generic60000003, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000028: {inst: inst60000062, generic: generic60000003, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000029: {inst: inst60000061, generic: generic60000003, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000002A: {inst: inst60000061, generic: generic60000002, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000002B: {inst: inst60000061, generic: generic60000003, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000002C: {inst: inst60000062, generic: generic60000003, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000002D: {inst: inst60000063, generic: generic60000003, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000002E: {inst: inst6000006A, generic: generic60000003, index: generic_inst_in_decl3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000002F: {inst: inst60000074, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000030: {inst: inst60000075, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000031: {inst: inst60000076, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000032: {inst: inst60000077, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000033: {inst: inst60000077, generic: generic60000003, index: generic_inst_in_def5, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000034: {inst: inst60000078, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000035: {inst: inst60000076, generic: generic60000003, index: generic_inst_in_def4, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000036: {inst: inst60000075, generic: generic60000003, index: generic_inst_in_def3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000037: {inst: inst60000074, generic: generic60000003, index: generic_inst_in_def2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000038: {inst: inst60000079, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000039: {inst: inst60000079, generic: generic60000003, index: generic_inst_in_def1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000003A: {inst: inst6000007A, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000003B: {inst: inst6000007A, generic: generic60000003, index: generic_inst_in_def0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000003C: {inst: inst6000007A, generic: generic60000003, index: generic_inst_in_def0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000003D: {inst: inst60000079, generic: generic60000003, index: generic_inst_in_def1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000003E: {inst: inst60000074, generic: generic60000003, index: generic_inst_in_def2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000003F: {inst: inst60000075, generic: generic60000003, index: generic_inst_in_def3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000040: {inst: inst60000076, generic: generic60000003, index: generic_inst_in_def4, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000041: {inst: inst60000077, generic: generic60000003, index: generic_inst_in_def5, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000042: {inst: inst60000063, generic: generic60000002, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000043: {inst: inst60000062, generic: generic60000002, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000044: {inst: inst60000061, generic: generic60000002, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000045: {inst: inst60000061, generic: generic60000002, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000046: {inst: inst60000062, generic: generic60000002, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000047: {inst: inst60000063, generic: generic60000002, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000048: {inst: inst60000066, generic: generic60000002, index: generic_inst_in_decl3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000049: {inst: inst60000069, generic: generic60000002, index: generic_inst_in_def1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000004A: {inst: inst60000068, generic: generic60000002, index: generic_inst_in_def0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000004B: {inst: inst60000069, generic: generic60000002, index: generic_inst_in_def1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000004C: {inst: inst6000001A, generic: generic60000004, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000004D: {inst: inst600000A0, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000004E: {inst: inst600000A0, generic: generic60000004, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000004F: {inst: inst6000001A, generic: generic60000004, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000050: {inst: inst60000014, generic: generic60000004, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000051: {inst: inst60000014, generic: generic60000004, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000052: {inst: inst60000014, generic: generic60000004, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000053: {inst: inst6000001A, generic: generic60000004, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000054: {inst: inst600000A0, generic: generic60000004, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000055: {inst: inst6000003F, generic: generic60000004, index: generic_inst_in_def2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000056: {inst: inst600000A9, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000057: {inst: inst600000AA, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000058: {inst: inst600000AA, generic: generic60000004, index: generic_inst_in_def1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000059: {inst: inst600000A9, generic: generic60000004, index: generic_inst_in_def0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000005A: {inst: inst6000001D, generic: generic60000005, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000005B: {inst: inst6000001A, generic: generic60000005, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000005C: {inst: inst60000014, generic: generic60000005, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000005D: {inst: inst60000014, generic: generic60000005, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000005E: {inst: inst6000001A, generic: generic60000005, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000005F: {inst: inst6000001D, generic: generic60000005, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000060: {inst: inst600000AA, generic: generic60000004, index: generic_inst_in_def1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000061: {inst: inst600000A9, generic: generic60000004, index: generic_inst_in_def0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000062: {inst: inst600000AA, generic: generic60000004, index: generic_inst_in_def1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000063: {inst: inst6000003F, generic: generic60000004, index: generic_inst_in_def2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000064: {inst: inst600000C0, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000065: {inst: inst600000C1, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000066: {inst: inst600000C2, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000067: {inst: inst600000C2, generic: generic60000006, index: generic_inst_in_decl5, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000068: {inst: inst600000C5, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000069: {inst: inst600000C5, generic: generic60000006, index: generic_inst_in_decl6, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000006A: {inst: inst600000C7, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000006B: {inst: inst600000C8, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000006C: {inst: inst600000C8, generic: generic60000006, index: generic_inst_in_def1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000006D: {inst: inst600000C7, generic: generic60000006, index: generic_inst_in_def0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000006E: {inst: inst600000CA, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000006F: {inst: inst600000CB, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000070: {inst: inst600000CB, generic: generic60000007, index: generic_inst_in_decl5, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000071: {inst: inst600000C2, generic: generic60000007, index: generic_inst_in_decl4, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000072: {inst: inst600000C1, generic: generic60000007, index: generic_inst_in_decl3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000073: {inst: inst600000C0, generic: generic60000007, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000074: {inst: inst60000062, generic: generic60000007, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000075: {inst: inst60000061, generic: generic60000007, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000076: {inst: inst600000C0, generic: generic60000006, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000077: {inst: inst60000061, generic: generic60000006, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000078: {inst: inst60000061, generic: generic60000007, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000079: {inst: inst60000062, generic: generic60000007, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000007A: {inst: inst600000C0, generic: generic60000007, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000007B: {inst: inst600000C1, generic: generic60000007, index: generic_inst_in_decl3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000007C: {inst: inst600000C2, generic: generic60000007, index: generic_inst_in_decl4, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000007D: {inst: inst600000CB, generic: generic60000007, index: generic_inst_in_decl5, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000007E: {inst: inst600000D8, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000007F: {inst: inst600000D9, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000080: {inst: inst600000DA, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000081: {inst: inst600000DB, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000082: {inst: inst600000DB, generic: generic60000007, index: generic_inst_in_def10, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000083: {inst: inst600000DC, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000084: {inst: inst600000DA, generic: generic60000007, index: generic_inst_in_def9, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000085: {inst: inst600000D9, generic: generic60000007, index: generic_inst_in_def8, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000086: {inst: inst600000D8, generic: generic60000007, index: generic_inst_in_def7, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000087: {inst: inst600000DD, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000088: {inst: inst600000DD, generic: generic60000007, index: generic_inst_in_def6, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000089: {inst: inst60000077, generic: generic60000007, index: generic_inst_in_def5, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000008A: {inst: inst60000076, generic: generic60000007, index: generic_inst_in_def4, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000008B: {inst: inst60000075, generic: generic60000007, index: generic_inst_in_def3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000008C: {inst: inst60000074, generic: generic60000007, index: generic_inst_in_def2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000008D: {inst: inst60000079, generic: generic60000007, index: generic_inst_in_def1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000008E: {inst: inst600000DE, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000008F: {inst: inst600000DE, generic: generic60000007, index: generic_inst_in_def0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000090: {inst: inst600000DE, generic: generic60000007, index: generic_inst_in_def0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000091: {inst: inst60000079, generic: generic60000007, index: generic_inst_in_def1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000092: {inst: inst60000074, generic: generic60000007, index: generic_inst_in_def2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000093: {inst: inst60000075, generic: generic60000007, index: generic_inst_in_def3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000094: {inst: inst60000076, generic: generic60000007, index: generic_inst_in_def4, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000095: {inst: inst60000077, generic: generic60000007, index: generic_inst_in_def5, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000096: {inst: inst600000DD, generic: generic60000007, index: generic_inst_in_def6, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000097: {inst: inst600000D8, generic: generic60000007, index: generic_inst_in_def7, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000098: {inst: inst600000D9, generic: generic60000007, index: generic_inst_in_def8, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000099: {inst: inst600000DA, generic: generic60000007, index: generic_inst_in_def9, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000009A: {inst: inst600000DB, generic: generic60000007, index: generic_inst_in_def10, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000009B: {inst: inst600000C2, generic: generic60000006, index: generic_inst_in_decl5, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000009C: {inst: inst600000C1, generic: generic60000006, index: generic_inst_in_decl4, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000009D: {inst: inst60000062, generic: generic60000006, index: generic_inst_in_decl3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000009E: {inst: inst600000CA, generic: generic60000006, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000009F: {inst: inst600000C0, generic: generic60000006, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000A0: {inst: inst60000061, generic: generic60000006, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000A1: {inst: inst60000061, generic: generic60000006, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000A2: {inst: inst600000C0, generic: generic60000006, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000A3: {inst: inst600000CA, generic: generic60000006, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000A4: {inst: inst60000062, generic: generic60000006, index: generic_inst_in_decl3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000A5: {inst: inst600000C1, generic: generic60000006, index: generic_inst_in_decl4, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000A6: {inst: inst600000C2, generic: generic60000006, index: generic_inst_in_decl5, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000A7: {inst: inst600000C5, generic: generic60000006, index: generic_inst_in_decl6, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000A8: {inst: inst600000C8, generic: generic60000006, index: generic_inst_in_def1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000A9: {inst: inst600000C7, generic: generic60000006, index: generic_inst_in_def0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000AA: {inst: inst600000C8, generic: generic60000006, index: generic_inst_in_def1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000AB: {inst: inst600000FB, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000AC: {inst: inst600000FC, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000AD: {inst: inst600000FD, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000AE: {inst: inst600000FD, generic: generic60000008, index: generic_inst_in_decl7, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000AF: {inst: inst60000100, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000B0: {inst: inst60000100, generic: generic60000008, index: generic_inst_in_decl8, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000B1: {inst: inst60000102, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000B2: {inst: inst60000103, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000B3: {inst: inst60000103, generic: generic60000008, index: generic_inst_in_def1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000B4: {inst: inst60000102, generic: generic60000008, index: generic_inst_in_def0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000B5: {inst: inst60000105, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000B6: {inst: inst60000106, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000B7: {inst: inst60000106, generic: generic60000009, index: generic_inst_in_decl7, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000B8: {inst: inst600000FD, generic: generic60000009, index: generic_inst_in_decl6, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000B9: {inst: inst600000FC, generic: generic60000009, index: generic_inst_in_decl5, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000BA: {inst: inst600000FB, generic: generic60000009, index: generic_inst_in_decl4, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000BB: {inst: inst600000C1, generic: generic60000009, index: generic_inst_in_decl3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000BC: {inst: inst600000C0, generic: generic60000009, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000BD: {inst: inst60000062, generic: generic60000009, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000BE: {inst: inst60000061, generic: generic60000009, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000BF: {inst: inst600000FB, generic: generic60000008, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000C0: {inst: inst600000C0, generic: generic60000008, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000C1: {inst: inst60000061, generic: generic60000008, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000C2: {inst: inst60000061, generic: generic60000009, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000C3: {inst: inst60000062, generic: generic60000009, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000C4: {inst: inst600000C0, generic: generic60000009, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000C5: {inst: inst600000C1, generic: generic60000009, index: generic_inst_in_decl3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000C6: {inst: inst600000FB, generic: generic60000009, index: generic_inst_in_decl4, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000C7: {inst: inst600000FC, generic: generic60000009, index: generic_inst_in_decl5, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000C8: {inst: inst600000FD, generic: generic60000009, index: generic_inst_in_decl6, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000C9: {inst: inst60000106, generic: generic60000009, index: generic_inst_in_decl7, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000CA: {inst: inst60000116, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000CB: {inst: inst60000117, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000CC: {inst: inst60000118, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000CD: {inst: inst60000119, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000CE: {inst: inst60000119, generic: generic60000009, index: generic_inst_in_def15, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000CF: {inst: inst6000011A, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000D0: {inst: inst60000118, generic: generic60000009, index: generic_inst_in_def14, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000D1: {inst: inst60000117, generic: generic60000009, index: generic_inst_in_def13, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000D2: {inst: inst60000116, generic: generic60000009, index: generic_inst_in_def12, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000D3: {inst: inst6000011B, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000D4: {inst: inst6000011B, generic: generic60000009, index: generic_inst_in_def11, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000D5: {inst: inst600000DB, generic: generic60000009, index: generic_inst_in_def10, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000D6: {inst: inst600000DA, generic: generic60000009, index: generic_inst_in_def9, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000D7: {inst: inst600000D9, generic: generic60000009, index: generic_inst_in_def8, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000D8: {inst: inst600000D8, generic: generic60000009, index: generic_inst_in_def7, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000D9: {inst: inst600000DD, generic: generic60000009, index: generic_inst_in_def6, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000DA: {inst: inst60000077, generic: generic60000009, index: generic_inst_in_def5, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000DB: {inst: inst60000076, generic: generic60000009, index: generic_inst_in_def4, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000DC: {inst: inst60000075, generic: generic60000009, index: generic_inst_in_def3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000DD: {inst: inst60000074, generic: generic60000009, index: generic_inst_in_def2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000DE: {inst: inst60000079, generic: generic60000009, index: generic_inst_in_def1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000DF: {inst: inst6000011C, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000E0: {inst: inst6000011C, generic: generic60000009, index: generic_inst_in_def0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000E1: {inst: inst6000011C, generic: generic60000009, index: generic_inst_in_def0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000E2: {inst: inst60000079, generic: generic60000009, index: generic_inst_in_def1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000E3: {inst: inst60000074, generic: generic60000009, index: generic_inst_in_def2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000E4: {inst: inst60000075, generic: generic60000009, index: generic_inst_in_def3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000E5: {inst: inst60000076, generic: generic60000009, index: generic_inst_in_def4, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000E6: {inst: inst60000077, generic: generic60000009, index: generic_inst_in_def5, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000E7: {inst: inst600000DD, generic: generic60000009, index: generic_inst_in_def6, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000E8: {inst: inst600000D8, generic: generic60000009, index: generic_inst_in_def7, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000E9: {inst: inst600000D9, generic: generic60000009, index: generic_inst_in_def8, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000EA: {inst: inst600000DA, generic: generic60000009, index: generic_inst_in_def9, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000EB: {inst: inst600000DB, generic: generic60000009, index: generic_inst_in_def10, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000EC: {inst: inst6000011B, generic: generic60000009, index: generic_inst_in_def11, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000ED: {inst: inst60000116, generic: generic60000009, index: generic_inst_in_def12, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000EE: {inst: inst60000117, generic: generic60000009, index: generic_inst_in_def13, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000EF: {inst: inst60000118, generic: generic60000009, index: generic_inst_in_def14, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000F0: {inst: inst60000119, generic: generic60000009, index: generic_inst_in_def15, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000F1: {inst: inst600000FD, generic: generic60000008, index: generic_inst_in_decl7, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000F2: {inst: inst600000FC, generic: generic60000008, index: generic_inst_in_decl6, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000F3: {inst: inst600000C1, generic: generic60000008, index: generic_inst_in_decl5, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000F4: {inst: inst60000062, generic: generic60000008, index: generic_inst_in_decl4, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000F5: {inst: inst60000105, generic: generic60000008, index: generic_inst_in_decl3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000F6: {inst: inst600000FB, generic: generic60000008, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000F7: {inst: inst600000C0, generic: generic60000008, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000F8: {inst: inst60000061, generic: generic60000008, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000F9: {inst: inst60000061, generic: generic60000008, index: generic_inst_in_decl0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000FA: {inst: inst600000C0, generic: generic60000008, index: generic_inst_in_decl1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000FB: {inst: inst600000FB, generic: generic60000008, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000FC: {inst: inst60000105, generic: generic60000008, index: generic_inst_in_decl3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000FD: {inst: inst60000062, generic: generic60000008, index: generic_inst_in_decl4, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000FE: {inst: inst600000C1, generic: generic60000008, index: generic_inst_in_decl5, kind: checked}
-// CHECK:STDOUT:       symbolic_constant600000FF: {inst: inst600000FC, generic: generic60000008, index: generic_inst_in_decl6, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000100: {inst: inst600000FD, generic: generic60000008, index: generic_inst_in_decl7, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000101: {inst: inst60000100, generic: generic60000008, index: generic_inst_in_decl8, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000102: {inst: inst60000103, generic: generic60000008, index: generic_inst_in_def1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000103: {inst: inst60000102, generic: generic60000008, index: generic_inst_in_def0, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000104: {inst: inst60000103, generic: generic60000008, index: generic_inst_in_def1, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000105: {inst: inst600000A0, generic: generic60000004, index: generic_inst_in_decl2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000106: {inst: inst60000140, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000107: {inst: inst60000140, generic: generic60000000, index: generic_inst_in_def2, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000108: {inst: inst60000142, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant60000109: {inst: inst60000143, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000010A: {inst: inst60000145, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000010B: {inst: inst60000142, generic: generic60000000, index: generic_inst_in_def3, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000010C: {inst: inst60000143, generic: generic60000000, index: generic_inst_in_def4, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000010D: {inst: inst60000145, generic: generic60000000, index: generic_inst_in_def5, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000010E: {inst: inst6000014B, generic: generic<none>, index: generic_inst<none>, kind: checked}
-// CHECK:STDOUT:       symbolic_constant6000010F: {inst: inst6000014B, generic: generic60000000, index: generic_inst_in_def6, kind: checked}
+// CHECK:STDOUT:       symbolic_constant0: {inst: inst60000013, generic: generic<none>, index: generic_inst<none>, kind: self}
+// CHECK:STDOUT:       symbolic_constant1: {inst: inst60000015, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant2: {inst: inst60000015, generic: generic60000000, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant3: {inst: inst6000001B, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant4: {inst: inst6000001B, generic: generic60000000, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant5: {inst: inst6000001E, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6: {inst: inst6000001E, generic: generic60000000, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant7: {inst: inst60000029, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant8: {inst: inst60000029, generic: generic60000000, index: generic_inst_in_decl3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant9: {inst: inst6000002D, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constantA: {inst: inst6000002D, generic: generic60000000, index: generic_inst_in_decl4, kind: checked}
+// CHECK:STDOUT:       symbolic_constantB: {inst: inst60000030, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constantC: {inst: inst60000030, generic: generic60000000, index: generic_inst_in_decl5, kind: checked}
+// CHECK:STDOUT:       symbolic_constantD: {inst: inst6000003B, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constantE: {inst: inst6000003D, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000000F: {inst: inst6000003D, generic: generic60000000, index: generic_inst_in_def0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000010: {inst: inst60000040, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000011: {inst: inst60000040, generic: generic60000000, index: generic_inst_in_def1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000012: {inst: inst6000004B, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000013: {inst: inst60000055, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000014: {inst: inst60000056, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000015: {inst: inst60000056, generic: generic60000001, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000016: {inst: inst60000055, generic: generic60000001, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000017: {inst: inst6000004B, generic: generic60000001, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000018: {inst: inst6000004B, generic: generic60000001, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000019: {inst: inst60000055, generic: generic60000001, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000001A: {inst: inst60000056, generic: generic60000001, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000001B: {inst: inst60000062, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000001C: {inst: inst60000063, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000001D: {inst: inst60000064, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000001E: {inst: inst60000064, generic: generic60000002, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000001F: {inst: inst60000067, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000020: {inst: inst60000067, generic: generic60000002, index: generic_inst_in_decl3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000021: {inst: inst60000069, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000022: {inst: inst6000006A, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000023: {inst: inst6000006A, generic: generic60000002, index: generic_inst_in_def1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000024: {inst: inst60000069, generic: generic60000002, index: generic_inst_in_def0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000025: {inst: inst6000006B, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000026: {inst: inst6000006B, generic: generic60000003, index: generic_inst_in_decl3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000027: {inst: inst60000064, generic: generic60000003, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000028: {inst: inst60000063, generic: generic60000003, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000029: {inst: inst60000062, generic: generic60000003, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000002A: {inst: inst60000062, generic: generic60000002, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000002B: {inst: inst60000062, generic: generic60000003, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000002C: {inst: inst60000063, generic: generic60000003, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000002D: {inst: inst60000064, generic: generic60000003, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000002E: {inst: inst6000006B, generic: generic60000003, index: generic_inst_in_decl3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000002F: {inst: inst60000075, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000030: {inst: inst60000076, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000031: {inst: inst60000077, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000032: {inst: inst60000078, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000033: {inst: inst60000078, generic: generic60000003, index: generic_inst_in_def5, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000034: {inst: inst60000079, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000035: {inst: inst60000077, generic: generic60000003, index: generic_inst_in_def4, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000036: {inst: inst60000076, generic: generic60000003, index: generic_inst_in_def3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000037: {inst: inst60000075, generic: generic60000003, index: generic_inst_in_def2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000038: {inst: inst6000007A, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000039: {inst: inst6000007A, generic: generic60000003, index: generic_inst_in_def1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000003A: {inst: inst6000007B, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000003B: {inst: inst6000007B, generic: generic60000003, index: generic_inst_in_def0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000003C: {inst: inst6000007B, generic: generic60000003, index: generic_inst_in_def0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000003D: {inst: inst6000007A, generic: generic60000003, index: generic_inst_in_def1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000003E: {inst: inst60000075, generic: generic60000003, index: generic_inst_in_def2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000003F: {inst: inst60000076, generic: generic60000003, index: generic_inst_in_def3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000040: {inst: inst60000077, generic: generic60000003, index: generic_inst_in_def4, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000041: {inst: inst60000078, generic: generic60000003, index: generic_inst_in_def5, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000042: {inst: inst60000064, generic: generic60000002, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000043: {inst: inst60000063, generic: generic60000002, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000044: {inst: inst60000062, generic: generic60000002, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000045: {inst: inst60000062, generic: generic60000002, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000046: {inst: inst60000063, generic: generic60000002, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000047: {inst: inst60000064, generic: generic60000002, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000048: {inst: inst60000067, generic: generic60000002, index: generic_inst_in_decl3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000049: {inst: inst6000006A, generic: generic60000002, index: generic_inst_in_def1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000004A: {inst: inst60000069, generic: generic60000002, index: generic_inst_in_def0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000004B: {inst: inst6000006A, generic: generic60000002, index: generic_inst_in_def1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000004C: {inst: inst6000001B, generic: generic60000004, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000004D: {inst: inst600000A1, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000004E: {inst: inst600000A1, generic: generic60000004, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000004F: {inst: inst6000001B, generic: generic60000004, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000050: {inst: inst60000015, generic: generic60000004, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000051: {inst: inst60000015, generic: generic60000004, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000052: {inst: inst60000015, generic: generic60000004, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000053: {inst: inst6000001B, generic: generic60000004, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000054: {inst: inst600000A1, generic: generic60000004, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000055: {inst: inst60000040, generic: generic60000004, index: generic_inst_in_def2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000056: {inst: inst600000AA, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000057: {inst: inst600000AB, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000058: {inst: inst600000AB, generic: generic60000004, index: generic_inst_in_def1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000059: {inst: inst600000AA, generic: generic60000004, index: generic_inst_in_def0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000005A: {inst: inst6000001E, generic: generic60000005, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000005B: {inst: inst6000001B, generic: generic60000005, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000005C: {inst: inst60000015, generic: generic60000005, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000005D: {inst: inst60000015, generic: generic60000005, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000005E: {inst: inst6000001B, generic: generic60000005, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000005F: {inst: inst6000001E, generic: generic60000005, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000060: {inst: inst600000AB, generic: generic60000004, index: generic_inst_in_def1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000061: {inst: inst600000AA, generic: generic60000004, index: generic_inst_in_def0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000062: {inst: inst600000AB, generic: generic60000004, index: generic_inst_in_def1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000063: {inst: inst60000040, generic: generic60000004, index: generic_inst_in_def2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000064: {inst: inst600000C1, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000065: {inst: inst600000C2, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000066: {inst: inst600000C3, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000067: {inst: inst600000C3, generic: generic60000006, index: generic_inst_in_decl5, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000068: {inst: inst600000C6, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000069: {inst: inst600000C6, generic: generic60000006, index: generic_inst_in_decl6, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000006A: {inst: inst600000C8, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000006B: {inst: inst600000C9, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000006C: {inst: inst600000C9, generic: generic60000006, index: generic_inst_in_def1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000006D: {inst: inst600000C8, generic: generic60000006, index: generic_inst_in_def0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000006E: {inst: inst600000CB, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000006F: {inst: inst600000CC, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000070: {inst: inst600000CC, generic: generic60000007, index: generic_inst_in_decl5, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000071: {inst: inst600000C3, generic: generic60000007, index: generic_inst_in_decl4, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000072: {inst: inst600000C2, generic: generic60000007, index: generic_inst_in_decl3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000073: {inst: inst600000C1, generic: generic60000007, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000074: {inst: inst60000063, generic: generic60000007, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000075: {inst: inst60000062, generic: generic60000007, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000076: {inst: inst600000C1, generic: generic60000006, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000077: {inst: inst60000062, generic: generic60000006, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000078: {inst: inst60000062, generic: generic60000007, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000079: {inst: inst60000063, generic: generic60000007, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000007A: {inst: inst600000C1, generic: generic60000007, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000007B: {inst: inst600000C2, generic: generic60000007, index: generic_inst_in_decl3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000007C: {inst: inst600000C3, generic: generic60000007, index: generic_inst_in_decl4, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000007D: {inst: inst600000CC, generic: generic60000007, index: generic_inst_in_decl5, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000007E: {inst: inst600000D9, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000007F: {inst: inst600000DA, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000080: {inst: inst600000DB, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000081: {inst: inst600000DC, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000082: {inst: inst600000DC, generic: generic60000007, index: generic_inst_in_def10, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000083: {inst: inst600000DD, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000084: {inst: inst600000DB, generic: generic60000007, index: generic_inst_in_def9, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000085: {inst: inst600000DA, generic: generic60000007, index: generic_inst_in_def8, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000086: {inst: inst600000D9, generic: generic60000007, index: generic_inst_in_def7, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000087: {inst: inst600000DE, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000088: {inst: inst600000DE, generic: generic60000007, index: generic_inst_in_def6, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000089: {inst: inst60000078, generic: generic60000007, index: generic_inst_in_def5, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000008A: {inst: inst60000077, generic: generic60000007, index: generic_inst_in_def4, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000008B: {inst: inst60000076, generic: generic60000007, index: generic_inst_in_def3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000008C: {inst: inst60000075, generic: generic60000007, index: generic_inst_in_def2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000008D: {inst: inst6000007A, generic: generic60000007, index: generic_inst_in_def1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000008E: {inst: inst600000DF, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000008F: {inst: inst600000DF, generic: generic60000007, index: generic_inst_in_def0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000090: {inst: inst600000DF, generic: generic60000007, index: generic_inst_in_def0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000091: {inst: inst6000007A, generic: generic60000007, index: generic_inst_in_def1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000092: {inst: inst60000075, generic: generic60000007, index: generic_inst_in_def2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000093: {inst: inst60000076, generic: generic60000007, index: generic_inst_in_def3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000094: {inst: inst60000077, generic: generic60000007, index: generic_inst_in_def4, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000095: {inst: inst60000078, generic: generic60000007, index: generic_inst_in_def5, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000096: {inst: inst600000DE, generic: generic60000007, index: generic_inst_in_def6, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000097: {inst: inst600000D9, generic: generic60000007, index: generic_inst_in_def7, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000098: {inst: inst600000DA, generic: generic60000007, index: generic_inst_in_def8, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000099: {inst: inst600000DB, generic: generic60000007, index: generic_inst_in_def9, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000009A: {inst: inst600000DC, generic: generic60000007, index: generic_inst_in_def10, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000009B: {inst: inst600000C3, generic: generic60000006, index: generic_inst_in_decl5, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000009C: {inst: inst600000C2, generic: generic60000006, index: generic_inst_in_decl4, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000009D: {inst: inst60000063, generic: generic60000006, index: generic_inst_in_decl3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000009E: {inst: inst600000CB, generic: generic60000006, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000009F: {inst: inst600000C1, generic: generic60000006, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000A0: {inst: inst60000062, generic: generic60000006, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000A1: {inst: inst60000062, generic: generic60000006, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000A2: {inst: inst600000C1, generic: generic60000006, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000A3: {inst: inst600000CB, generic: generic60000006, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000A4: {inst: inst60000063, generic: generic60000006, index: generic_inst_in_decl3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000A5: {inst: inst600000C2, generic: generic60000006, index: generic_inst_in_decl4, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000A6: {inst: inst600000C3, generic: generic60000006, index: generic_inst_in_decl5, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000A7: {inst: inst600000C6, generic: generic60000006, index: generic_inst_in_decl6, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000A8: {inst: inst600000C9, generic: generic60000006, index: generic_inst_in_def1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000A9: {inst: inst600000C8, generic: generic60000006, index: generic_inst_in_def0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000AA: {inst: inst600000C9, generic: generic60000006, index: generic_inst_in_def1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000AB: {inst: inst600000FC, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000AC: {inst: inst600000FD, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000AD: {inst: inst600000FE, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000AE: {inst: inst600000FE, generic: generic60000008, index: generic_inst_in_decl7, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000AF: {inst: inst60000101, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000B0: {inst: inst60000101, generic: generic60000008, index: generic_inst_in_decl8, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000B1: {inst: inst60000103, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000B2: {inst: inst60000104, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000B3: {inst: inst60000104, generic: generic60000008, index: generic_inst_in_def1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000B4: {inst: inst60000103, generic: generic60000008, index: generic_inst_in_def0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000B5: {inst: inst60000106, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000B6: {inst: inst60000107, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000B7: {inst: inst60000107, generic: generic60000009, index: generic_inst_in_decl7, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000B8: {inst: inst600000FE, generic: generic60000009, index: generic_inst_in_decl6, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000B9: {inst: inst600000FD, generic: generic60000009, index: generic_inst_in_decl5, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000BA: {inst: inst600000FC, generic: generic60000009, index: generic_inst_in_decl4, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000BB: {inst: inst600000C2, generic: generic60000009, index: generic_inst_in_decl3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000BC: {inst: inst600000C1, generic: generic60000009, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000BD: {inst: inst60000063, generic: generic60000009, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000BE: {inst: inst60000062, generic: generic60000009, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000BF: {inst: inst600000FC, generic: generic60000008, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000C0: {inst: inst600000C1, generic: generic60000008, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000C1: {inst: inst60000062, generic: generic60000008, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000C2: {inst: inst60000062, generic: generic60000009, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000C3: {inst: inst60000063, generic: generic60000009, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000C4: {inst: inst600000C1, generic: generic60000009, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000C5: {inst: inst600000C2, generic: generic60000009, index: generic_inst_in_decl3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000C6: {inst: inst600000FC, generic: generic60000009, index: generic_inst_in_decl4, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000C7: {inst: inst600000FD, generic: generic60000009, index: generic_inst_in_decl5, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000C8: {inst: inst600000FE, generic: generic60000009, index: generic_inst_in_decl6, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000C9: {inst: inst60000107, generic: generic60000009, index: generic_inst_in_decl7, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000CA: {inst: inst60000117, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000CB: {inst: inst60000118, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000CC: {inst: inst60000119, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000CD: {inst: inst6000011A, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000CE: {inst: inst6000011A, generic: generic60000009, index: generic_inst_in_def15, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000CF: {inst: inst6000011B, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000D0: {inst: inst60000119, generic: generic60000009, index: generic_inst_in_def14, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000D1: {inst: inst60000118, generic: generic60000009, index: generic_inst_in_def13, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000D2: {inst: inst60000117, generic: generic60000009, index: generic_inst_in_def12, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000D3: {inst: inst6000011C, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000D4: {inst: inst6000011C, generic: generic60000009, index: generic_inst_in_def11, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000D5: {inst: inst600000DC, generic: generic60000009, index: generic_inst_in_def10, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000D6: {inst: inst600000DB, generic: generic60000009, index: generic_inst_in_def9, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000D7: {inst: inst600000DA, generic: generic60000009, index: generic_inst_in_def8, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000D8: {inst: inst600000D9, generic: generic60000009, index: generic_inst_in_def7, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000D9: {inst: inst600000DE, generic: generic60000009, index: generic_inst_in_def6, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000DA: {inst: inst60000078, generic: generic60000009, index: generic_inst_in_def5, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000DB: {inst: inst60000077, generic: generic60000009, index: generic_inst_in_def4, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000DC: {inst: inst60000076, generic: generic60000009, index: generic_inst_in_def3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000DD: {inst: inst60000075, generic: generic60000009, index: generic_inst_in_def2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000DE: {inst: inst6000007A, generic: generic60000009, index: generic_inst_in_def1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000DF: {inst: inst6000011D, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000E0: {inst: inst6000011D, generic: generic60000009, index: generic_inst_in_def0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000E1: {inst: inst6000011D, generic: generic60000009, index: generic_inst_in_def0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000E2: {inst: inst6000007A, generic: generic60000009, index: generic_inst_in_def1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000E3: {inst: inst60000075, generic: generic60000009, index: generic_inst_in_def2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000E4: {inst: inst60000076, generic: generic60000009, index: generic_inst_in_def3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000E5: {inst: inst60000077, generic: generic60000009, index: generic_inst_in_def4, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000E6: {inst: inst60000078, generic: generic60000009, index: generic_inst_in_def5, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000E7: {inst: inst600000DE, generic: generic60000009, index: generic_inst_in_def6, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000E8: {inst: inst600000D9, generic: generic60000009, index: generic_inst_in_def7, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000E9: {inst: inst600000DA, generic: generic60000009, index: generic_inst_in_def8, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000EA: {inst: inst600000DB, generic: generic60000009, index: generic_inst_in_def9, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000EB: {inst: inst600000DC, generic: generic60000009, index: generic_inst_in_def10, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000EC: {inst: inst6000011C, generic: generic60000009, index: generic_inst_in_def11, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000ED: {inst: inst60000117, generic: generic60000009, index: generic_inst_in_def12, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000EE: {inst: inst60000118, generic: generic60000009, index: generic_inst_in_def13, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000EF: {inst: inst60000119, generic: generic60000009, index: generic_inst_in_def14, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000F0: {inst: inst6000011A, generic: generic60000009, index: generic_inst_in_def15, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000F1: {inst: inst600000FE, generic: generic60000008, index: generic_inst_in_decl7, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000F2: {inst: inst600000FD, generic: generic60000008, index: generic_inst_in_decl6, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000F3: {inst: inst600000C2, generic: generic60000008, index: generic_inst_in_decl5, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000F4: {inst: inst60000063, generic: generic60000008, index: generic_inst_in_decl4, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000F5: {inst: inst60000106, generic: generic60000008, index: generic_inst_in_decl3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000F6: {inst: inst600000FC, generic: generic60000008, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000F7: {inst: inst600000C1, generic: generic60000008, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000F8: {inst: inst60000062, generic: generic60000008, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000F9: {inst: inst60000062, generic: generic60000008, index: generic_inst_in_decl0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000FA: {inst: inst600000C1, generic: generic60000008, index: generic_inst_in_decl1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000FB: {inst: inst600000FC, generic: generic60000008, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000FC: {inst: inst60000106, generic: generic60000008, index: generic_inst_in_decl3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000FD: {inst: inst60000063, generic: generic60000008, index: generic_inst_in_decl4, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000FE: {inst: inst600000C2, generic: generic60000008, index: generic_inst_in_decl5, kind: checked}
+// CHECK:STDOUT:       symbolic_constant600000FF: {inst: inst600000FD, generic: generic60000008, index: generic_inst_in_decl6, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000100: {inst: inst600000FE, generic: generic60000008, index: generic_inst_in_decl7, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000101: {inst: inst60000101, generic: generic60000008, index: generic_inst_in_decl8, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000102: {inst: inst60000104, generic: generic60000008, index: generic_inst_in_def1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000103: {inst: inst60000103, generic: generic60000008, index: generic_inst_in_def0, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000104: {inst: inst60000104, generic: generic60000008, index: generic_inst_in_def1, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000105: {inst: inst600000A1, generic: generic60000004, index: generic_inst_in_decl2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000106: {inst: inst60000142, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000107: {inst: inst60000142, generic: generic60000000, index: generic_inst_in_def2, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000108: {inst: inst60000144, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000109: {inst: inst60000144, generic: generic60000000, index: generic_inst_in_def3, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000010A: {inst: inst60000146, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000010B: {inst: inst60000147, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000010C: {inst: inst60000149, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000010D: {inst: inst60000146, generic: generic60000000, index: generic_inst_in_def4, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000010E: {inst: inst60000147, generic: generic60000000, index: generic_inst_in_def5, kind: checked}
+// CHECK:STDOUT:       symbolic_constant6000010F: {inst: inst60000149, generic: generic60000000, index: generic_inst_in_def6, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000110: {inst: inst6000014F, generic: generic<none>, index: generic_inst<none>, kind: checked}
+// CHECK:STDOUT:       symbolic_constant60000111: {inst: inst6000014F, generic: generic60000000, index: generic_inst_in_def7, kind: checked}
 // CHECK:STDOUT:   inst_blocks:
 // CHECK:STDOUT:     inst_block_empty: {}
 // CHECK:STDOUT:     exports:
-// CHECK:STDOUT:       0:               inst60000037
+// CHECK:STDOUT:       0:               inst60000038
 // CHECK:STDOUT:     imports:
-// CHECK:STDOUT:       0:               inst6000000F
-// CHECK:STDOUT:       1:               inst60000047
-// CHECK:STDOUT:       2:               inst60000048
-// CHECK:STDOUT:       3:               inst6000004B
-// CHECK:STDOUT:       4:               inst6000004C
-// CHECK:STDOUT:       5:               inst6000004D
-// CHECK:STDOUT:       6:               inst6000004F
-// CHECK:STDOUT:       7:               inst60000051
-// CHECK:STDOUT:       8:               inst60000056
-// CHECK:STDOUT:       9:               inst60000057
-// CHECK:STDOUT:       10:              inst60000058
-// CHECK:STDOUT:       11:              inst60000059
-// CHECK:STDOUT:       12:              inst6000005A
-// CHECK:STDOUT:       13:              inst6000005F
-// CHECK:STDOUT:       14:              inst60000060
-// CHECK:STDOUT:       15:              inst60000064
-// CHECK:STDOUT:       16:              inst60000065
-// CHECK:STDOUT:       17:              inst60000067
-// CHECK:STDOUT:       18:              inst6000006B
-// CHECK:STDOUT:       19:              inst6000006C
-// CHECK:STDOUT:       20:              inst6000006D
-// CHECK:STDOUT:       21:              inst6000006E
-// CHECK:STDOUT:       22:              inst6000006F
-// CHECK:STDOUT:       23:              inst60000082
-// CHECK:STDOUT:       24:              inst60000083
-// CHECK:STDOUT:       25:              inst60000084
-// CHECK:STDOUT:       26:              inst60000085
-// CHECK:STDOUT:       27:              inst6000008C
-// CHECK:STDOUT:       28:              inst6000008D
-// CHECK:STDOUT:       29:              inst6000008E
-// CHECK:STDOUT:       30:              inst6000008F
-// CHECK:STDOUT:       31:              inst60000090
-// CHECK:STDOUT:       32:              inst60000091
-// CHECK:STDOUT:       33:              inst60000092
-// CHECK:STDOUT:       34:              inst60000093
-// CHECK:STDOUT:       35:              inst60000094
-// CHECK:STDOUT:       36:              inst60000095
-// CHECK:STDOUT:       37:              inst60000096
-// CHECK:STDOUT:       38:              inst60000097
-// CHECK:STDOUT:       39:              inst60000098
-// CHECK:STDOUT:       40:              inst60000099
-// CHECK:STDOUT:       41:              inst6000009A
-// CHECK:STDOUT:       42:              inst6000009B
-// CHECK:STDOUT:       43:              inst6000009C
-// CHECK:STDOUT:       44:              inst6000009D
-// CHECK:STDOUT:       45:              inst6000009E
-// CHECK:STDOUT:       46:              inst6000009F
-// CHECK:STDOUT:       47:              inst600000A1
-// CHECK:STDOUT:       48:              inst600000A2
-// CHECK:STDOUT:       49:              inst600000A3
-// CHECK:STDOUT:       50:              inst600000A4
-// CHECK:STDOUT:       51:              inst600000A8
-// CHECK:STDOUT:       52:              inst600000AB
-// CHECK:STDOUT:       53:              inst600000AC
-// CHECK:STDOUT:       54:              inst600000AD
-// CHECK:STDOUT:       55:              inst600000AE
-// CHECK:STDOUT:       56:              inst600000AF
-// CHECK:STDOUT:       57:              inst600000B6
-// CHECK:STDOUT:       58:              inst600000B7
-// CHECK:STDOUT:       59:              inst600000B8
-// CHECK:STDOUT:       60:              inst600000B9
-// CHECK:STDOUT:       61:              inst600000BA
-// CHECK:STDOUT:       62:              inst600000BB
-// CHECK:STDOUT:       63:              inst600000BC
-// CHECK:STDOUT:       64:              inst600000BD
-// CHECK:STDOUT:       65:              inst600000BE
-// CHECK:STDOUT:       66:              inst600000BF
-// CHECK:STDOUT:       67:              inst600000C3
-// CHECK:STDOUT:       68:              inst600000C4
-// CHECK:STDOUT:       69:              inst600000C6
-// CHECK:STDOUT:       70:              inst600000CC
-// CHECK:STDOUT:       71:              inst600000CD
-// CHECK:STDOUT:       72:              inst600000CE
-// CHECK:STDOUT:       73:              inst600000CF
-// CHECK:STDOUT:       74:              inst600000D0
-// CHECK:STDOUT:       75:              inst600000D1
-// CHECK:STDOUT:       76:              inst600000EA
-// CHECK:STDOUT:       77:              inst600000EB
-// CHECK:STDOUT:       78:              inst600000EC
-// CHECK:STDOUT:       79:              inst600000ED
-// CHECK:STDOUT:       80:              inst600000EE
-// CHECK:STDOUT:       81:              inst600000EF
-// CHECK:STDOUT:       82:              inst600000F9
-// CHECK:STDOUT:       83:              inst600000FA
-// CHECK:STDOUT:       84:              inst600000FE
-// CHECK:STDOUT:       85:              inst600000FF
-// CHECK:STDOUT:       86:              inst60000101
-// CHECK:STDOUT:       87:              inst60000107
-// CHECK:STDOUT:       88:              inst60000108
-// CHECK:STDOUT:       89:              inst60000109
-// CHECK:STDOUT:       90:              inst6000010A
-// CHECK:STDOUT:       91:              inst6000010B
-// CHECK:STDOUT:       92:              inst6000010C
-// CHECK:STDOUT:       93:              inst6000010D
-// CHECK:STDOUT:       94:              inst6000012D
-// CHECK:STDOUT:       95:              inst6000012E
-// CHECK:STDOUT:       96:              inst6000012F
-// CHECK:STDOUT:       97:              inst60000130
-// CHECK:STDOUT:       98:              inst60000131
-// CHECK:STDOUT:       99:              inst60000132
-// CHECK:STDOUT:       100:             inst60000133
-// CHECK:STDOUT:       101:             inst60000134
+// CHECK:STDOUT:       0:               inst60000010
+// CHECK:STDOUT:       1:               inst60000048
+// CHECK:STDOUT:       2:               inst60000049
+// CHECK:STDOUT:       3:               inst6000004C
+// CHECK:STDOUT:       4:               inst6000004D
+// CHECK:STDOUT:       5:               inst6000004E
+// CHECK:STDOUT:       6:               inst60000050
+// CHECK:STDOUT:       7:               inst60000052
+// CHECK:STDOUT:       8:               inst60000057
+// CHECK:STDOUT:       9:               inst60000058
+// CHECK:STDOUT:       10:              inst60000059
+// CHECK:STDOUT:       11:              inst6000005A
+// CHECK:STDOUT:       12:              inst6000005B
+// CHECK:STDOUT:       13:              inst60000060
+// CHECK:STDOUT:       14:              inst60000061
+// CHECK:STDOUT:       15:              inst60000065
+// CHECK:STDOUT:       16:              inst60000066
+// CHECK:STDOUT:       17:              inst60000068
+// CHECK:STDOUT:       18:              inst6000006C
+// CHECK:STDOUT:       19:              inst6000006D
+// CHECK:STDOUT:       20:              inst6000006E
+// CHECK:STDOUT:       21:              inst6000006F
+// CHECK:STDOUT:       22:              inst60000070
+// CHECK:STDOUT:       23:              inst60000083
+// CHECK:STDOUT:       24:              inst60000084
+// CHECK:STDOUT:       25:              inst60000085
+// CHECK:STDOUT:       26:              inst60000086
+// CHECK:STDOUT:       27:              inst6000008D
+// CHECK:STDOUT:       28:              inst6000008E
+// CHECK:STDOUT:       29:              inst6000008F
+// CHECK:STDOUT:       30:              inst60000090
+// CHECK:STDOUT:       31:              inst60000091
+// CHECK:STDOUT:       32:              inst60000092
+// CHECK:STDOUT:       33:              inst60000093
+// CHECK:STDOUT:       34:              inst60000094
+// CHECK:STDOUT:       35:              inst60000095
+// CHECK:STDOUT:       36:              inst60000096
+// CHECK:STDOUT:       37:              inst60000097
+// CHECK:STDOUT:       38:              inst60000098
+// CHECK:STDOUT:       39:              inst60000099
+// CHECK:STDOUT:       40:              inst6000009A
+// CHECK:STDOUT:       41:              inst6000009B
+// CHECK:STDOUT:       42:              inst6000009C
+// CHECK:STDOUT:       43:              inst6000009D
+// CHECK:STDOUT:       44:              inst6000009E
+// CHECK:STDOUT:       45:              inst6000009F
+// CHECK:STDOUT:       46:              inst600000A0
+// CHECK:STDOUT:       47:              inst600000A2
+// CHECK:STDOUT:       48:              inst600000A3
+// CHECK:STDOUT:       49:              inst600000A4
+// CHECK:STDOUT:       50:              inst600000A5
+// CHECK:STDOUT:       51:              inst600000A9
+// CHECK:STDOUT:       52:              inst600000AC
+// CHECK:STDOUT:       53:              inst600000AD
+// CHECK:STDOUT:       54:              inst600000AE
+// CHECK:STDOUT:       55:              inst600000AF
+// CHECK:STDOUT:       56:              inst600000B0
+// CHECK:STDOUT:       57:              inst600000B7
+// CHECK:STDOUT:       58:              inst600000B8
+// CHECK:STDOUT:       59:              inst600000B9
+// CHECK:STDOUT:       60:              inst600000BA
+// CHECK:STDOUT:       61:              inst600000BB
+// CHECK:STDOUT:       62:              inst600000BC
+// CHECK:STDOUT:       63:              inst600000BD
+// CHECK:STDOUT:       64:              inst600000BE
+// CHECK:STDOUT:       65:              inst600000BF
+// CHECK:STDOUT:       66:              inst600000C0
+// CHECK:STDOUT:       67:              inst600000C4
+// CHECK:STDOUT:       68:              inst600000C5
+// CHECK:STDOUT:       69:              inst600000C7
+// CHECK:STDOUT:       70:              inst600000CD
+// CHECK:STDOUT:       71:              inst600000CE
+// CHECK:STDOUT:       72:              inst600000CF
+// CHECK:STDOUT:       73:              inst600000D0
+// CHECK:STDOUT:       74:              inst600000D1
+// CHECK:STDOUT:       75:              inst600000D2
+// CHECK:STDOUT:       76:              inst600000EB
+// CHECK:STDOUT:       77:              inst600000EC
+// CHECK:STDOUT:       78:              inst600000ED
+// CHECK:STDOUT:       79:              inst600000EE
+// CHECK:STDOUT:       80:              inst600000EF
+// CHECK:STDOUT:       81:              inst600000F0
+// CHECK:STDOUT:       82:              inst600000FA
+// CHECK:STDOUT:       83:              inst600000FB
+// CHECK:STDOUT:       84:              inst600000FF
+// CHECK:STDOUT:       85:              inst60000100
+// CHECK:STDOUT:       86:              inst60000102
+// CHECK:STDOUT:       87:              inst60000108
+// CHECK:STDOUT:       88:              inst60000109
+// CHECK:STDOUT:       89:              inst6000010A
+// CHECK:STDOUT:       90:              inst6000010B
+// CHECK:STDOUT:       91:              inst6000010C
+// CHECK:STDOUT:       92:              inst6000010D
+// CHECK:STDOUT:       93:              inst6000010E
+// CHECK:STDOUT:       94:              inst6000012E
+// CHECK:STDOUT:       95:              inst6000012F
+// CHECK:STDOUT:       96:              inst60000130
+// CHECK:STDOUT:       97:              inst60000131
+// CHECK:STDOUT:       98:              inst60000132
+// CHECK:STDOUT:       99:              inst60000133
+// CHECK:STDOUT:       100:             inst60000134
+// CHECK:STDOUT:       101:             inst60000135
 // CHECK:STDOUT:     global_init:     {}
 // CHECK:STDOUT:     inst_block60000004:
-// CHECK:STDOUT:       0:               inst60000011
+// CHECK:STDOUT:       0:               inst60000012
 // CHECK:STDOUT:     inst_block60000005:
-// CHECK:STDOUT:       0:               inst60000017
-// CHECK:STDOUT:     inst_block60000006:
 // CHECK:STDOUT:       0:               inst60000018
-// CHECK:STDOUT:       1:               inst60000019
+// CHECK:STDOUT:     inst_block60000006:
+// CHECK:STDOUT:       0:               inst60000019
+// CHECK:STDOUT:       1:               inst6000001A
 // CHECK:STDOUT:     inst_block60000007:
-// CHECK:STDOUT:       0:               inst60000020
+// CHECK:STDOUT:       0:               inst60000021
 // CHECK:STDOUT:     inst_block60000008:
-// CHECK:STDOUT:       0:               inst60000022
-// CHECK:STDOUT:       1:               inst60000024
+// CHECK:STDOUT:       0:               inst60000023
+// CHECK:STDOUT:       1:               inst60000025
 // CHECK:STDOUT:     inst_block60000009:
 // CHECK:STDOUT:       0:               inst(TypeType)
-// CHECK:STDOUT:       1:               inst60000023
+// CHECK:STDOUT:       1:               inst60000024
 // CHECK:STDOUT:     inst_block6000000A:
-// CHECK:STDOUT:       0:               inst6000001A
-// CHECK:STDOUT:       1:               inst60000025
-// CHECK:STDOUT:     inst_block6000000B:
 // CHECK:STDOUT:       0:               inst6000001B
-// CHECK:STDOUT:       1:               inst60000025
+// CHECK:STDOUT:       1:               inst60000026
+// CHECK:STDOUT:     inst_block6000000B:
+// CHECK:STDOUT:       0:               inst6000001C
+// CHECK:STDOUT:       1:               inst60000026
 // CHECK:STDOUT:     inst_block6000000C:
-// CHECK:STDOUT:       0:               inst6000001A
-// CHECK:STDOUT:       1:               inst6000002B
+// CHECK:STDOUT:       0:               inst6000001B
+// CHECK:STDOUT:       1:               inst6000002C
 // CHECK:STDOUT:     inst_block6000000D:
-// CHECK:STDOUT:       0:               inst6000001A
-// CHECK:STDOUT:       1:               inst60000023
-// CHECK:STDOUT:     inst_block6000000E:
 // CHECK:STDOUT:       0:               inst6000001B
-// CHECK:STDOUT:       1:               inst60000023
+// CHECK:STDOUT:       1:               inst60000024
+// CHECK:STDOUT:     inst_block6000000E:
+// CHECK:STDOUT:       0:               inst6000001C
+// CHECK:STDOUT:       1:               inst60000024
 // CHECK:STDOUT:     inst_block6000000F:
-// CHECK:STDOUT:       0:               inst60000033
-// CHECK:STDOUT:       1:               inst60000035
+// CHECK:STDOUT:       0:               inst60000034
+// CHECK:STDOUT:       1:               inst60000036
 // CHECK:STDOUT:     inst_block60000010:
-// CHECK:STDOUT:       0:               inst60000017
-// CHECK:STDOUT:       1:               inst6000001E
-// CHECK:STDOUT:       2:               inst60000020
-// CHECK:STDOUT:       3:               inst60000030
-// CHECK:STDOUT:       4:               inst60000032
+// CHECK:STDOUT:       0:               inst60000018
+// CHECK:STDOUT:       1:               inst6000001F
+// CHECK:STDOUT:       2:               inst60000021
+// CHECK:STDOUT:       3:               inst60000031
+// CHECK:STDOUT:       4:               inst60000033
 // CHECK:STDOUT:     inst_block60000011:
-// CHECK:STDOUT:       0:               inst60000021
-// CHECK:STDOUT:       1:               inst60000022
-// CHECK:STDOUT:       2:               inst60000024
-// CHECK:STDOUT:       3:               inst60000027
-// CHECK:STDOUT:       4:               inst6000002B
-// CHECK:STDOUT:       5:               inst6000002D
-// CHECK:STDOUT:       6:               inst60000011
-// CHECK:STDOUT:       7:               inst60000013
-// CHECK:STDOUT:       8:               inst60000033
-// CHECK:STDOUT:       9:               inst60000034
-// CHECK:STDOUT:       10:              inst6000001C
-// CHECK:STDOUT:       11:              inst60000035
-// CHECK:STDOUT:       12:              inst60000036
+// CHECK:STDOUT:       0:               inst60000022
+// CHECK:STDOUT:       1:               inst60000023
+// CHECK:STDOUT:       2:               inst60000025
+// CHECK:STDOUT:       3:               inst60000028
+// CHECK:STDOUT:       4:               inst6000002C
+// CHECK:STDOUT:       5:               inst6000002E
+// CHECK:STDOUT:       6:               inst60000012
+// CHECK:STDOUT:       7:               inst60000014
+// CHECK:STDOUT:       8:               inst60000034
+// CHECK:STDOUT:       9:               inst60000035
+// CHECK:STDOUT:       10:              inst6000001D
+// CHECK:STDOUT:       11:              inst60000036
+// CHECK:STDOUT:       12:              inst60000037
 // CHECK:STDOUT:     inst_block60000012:
-// CHECK:STDOUT:       0:               inst60000013
-// CHECK:STDOUT:     inst_block60000013:
 // CHECK:STDOUT:       0:               inst60000014
+// CHECK:STDOUT:     inst_block60000013:
+// CHECK:STDOUT:       0:               inst60000015
 // CHECK:STDOUT:     inst_block60000014:
+// CHECK:STDOUT:       0:               inst60000016
+// CHECK:STDOUT:       1:               inst6000001C
+// CHECK:STDOUT:       2:               inst60000020
+// CHECK:STDOUT:       3:               inst6000002A
+// CHECK:STDOUT:       4:               inst6000002F
+// CHECK:STDOUT:       5:               inst60000032
+// CHECK:STDOUT:     inst_block60000015:
 // CHECK:STDOUT:       0:               inst60000015
 // CHECK:STDOUT:       1:               inst6000001B
-// CHECK:STDOUT:       2:               inst6000001F
+// CHECK:STDOUT:       2:               inst6000001E
 // CHECK:STDOUT:       3:               inst60000029
-// CHECK:STDOUT:       4:               inst6000002E
-// CHECK:STDOUT:       5:               inst60000031
-// CHECK:STDOUT:     inst_block60000015:
-// CHECK:STDOUT:       0:               inst60000014
-// CHECK:STDOUT:       1:               inst6000001A
-// CHECK:STDOUT:       2:               inst6000001D
-// CHECK:STDOUT:       3:               inst60000028
-// CHECK:STDOUT:       4:               inst6000002C
-// CHECK:STDOUT:       5:               inst6000002F
+// CHECK:STDOUT:       4:               inst6000002D
+// CHECK:STDOUT:       5:               inst60000030
 // CHECK:STDOUT:     inst_block60000016:
-// CHECK:STDOUT:       0:               inst60000041
-// CHECK:STDOUT:       1:               inst60000042
-// CHECK:STDOUT:       2:               inst60000043
-// CHECK:STDOUT:       3:               inst60000144
-// CHECK:STDOUT:       4:               inst60000149
-// CHECK:STDOUT:       5:               inst6000014A
-// CHECK:STDOUT:       6:               inst6000014D
-// CHECK:STDOUT:       7:               inst6000014F
-// CHECK:STDOUT:       8:               inst60000045
-// CHECK:STDOUT:       9:               inst60000150
-// CHECK:STDOUT:       10:              inst60000151
-// CHECK:STDOUT:       11:              inst60000152
-// CHECK:STDOUT:       12:              inst60000153
-// CHECK:STDOUT:       13:              inst60000154
-// CHECK:STDOUT:       14:              inst60000155
-// CHECK:STDOUT:       15:              inst60000156
+// CHECK:STDOUT:       0:               inst60000042
+// CHECK:STDOUT:       1:               inst60000043
+// CHECK:STDOUT:       2:               inst60000044
+// CHECK:STDOUT:       3:               inst60000148
+// CHECK:STDOUT:       4:               inst6000014D
+// CHECK:STDOUT:       5:               inst6000014E
+// CHECK:STDOUT:       6:               inst60000151
+// CHECK:STDOUT:       7:               inst60000153
+// CHECK:STDOUT:       8:               inst60000046
+// CHECK:STDOUT:       9:               inst60000154
+// CHECK:STDOUT:       10:              inst60000155
+// CHECK:STDOUT:       11:              inst60000156
+// CHECK:STDOUT:       12:              inst60000157
+// CHECK:STDOUT:       13:              inst60000158
+// CHECK:STDOUT:       14:              inst60000159
+// CHECK:STDOUT:       15:              inst6000015A
 // CHECK:STDOUT:     inst_block60000017:
-// CHECK:STDOUT:       0:               inst60000041
-// CHECK:STDOUT:       1:               inst60000042
+// CHECK:STDOUT:       0:               inst60000042
+// CHECK:STDOUT:       1:               inst60000043
 // CHECK:STDOUT:     inst_block60000018:
-// CHECK:STDOUT:       0:               inst6000004D
+// CHECK:STDOUT:       0:               inst6000004E
 // CHECK:STDOUT:     inst_block60000019:
-// CHECK:STDOUT:       0:               inst60000059
-// CHECK:STDOUT:     inst_block6000001A:
 // CHECK:STDOUT:       0:               inst6000005A
-// CHECK:STDOUT:     inst_block6000001B:
+// CHECK:STDOUT:     inst_block6000001A:
 // CHECK:STDOUT:       0:               inst6000005B
-// CHECK:STDOUT:       1:               inst6000005C
-// CHECK:STDOUT:       2:               inst6000005D
+// CHECK:STDOUT:     inst_block6000001B:
+// CHECK:STDOUT:       0:               inst6000005C
+// CHECK:STDOUT:       1:               inst6000005D
+// CHECK:STDOUT:       2:               inst6000005E
 // CHECK:STDOUT:     inst_block6000001C:
-// CHECK:STDOUT:       0:               inst6000004A
+// CHECK:STDOUT:       0:               inst6000004B
 // CHECK:STDOUT:     inst_block6000001D:
-// CHECK:STDOUT:       0:               inst6000004A
-// CHECK:STDOUT:       1:               inst60000054
-// CHECK:STDOUT:       2:               inst60000055
+// CHECK:STDOUT:       0:               inst6000004B
+// CHECK:STDOUT:       1:               inst60000055
+// CHECK:STDOUT:       2:               inst60000056
 // CHECK:STDOUT:     inst_block6000001E:
-// CHECK:STDOUT:       0:               inst60000064
+// CHECK:STDOUT:       0:               inst60000065
 // CHECK:STDOUT:     inst_block6000001F:
-// CHECK:STDOUT:       0:               inst60000061
+// CHECK:STDOUT:       0:               inst60000062
 // CHECK:STDOUT:     inst_block60000020:
-// CHECK:STDOUT:       0:               inst60000061
-// CHECK:STDOUT:       1:               inst60000062
-// CHECK:STDOUT:       2:               inst60000063
-// CHECK:STDOUT:       3:               inst60000066
+// CHECK:STDOUT:       0:               inst60000062
+// CHECK:STDOUT:       1:               inst60000063
+// CHECK:STDOUT:       2:               inst60000064
+// CHECK:STDOUT:       3:               inst60000067
 // CHECK:STDOUT:     inst_block60000021:
-// CHECK:STDOUT:       0:               inst60000068
-// CHECK:STDOUT:       1:               inst60000069
+// CHECK:STDOUT:       0:               inst60000069
+// CHECK:STDOUT:       1:               inst6000006A
 // CHECK:STDOUT:     inst_block60000022:
-// CHECK:STDOUT:       0:               inst6000006E
-// CHECK:STDOUT:     inst_block60000023:
 // CHECK:STDOUT:       0:               inst6000006F
-// CHECK:STDOUT:     inst_block60000024:
+// CHECK:STDOUT:     inst_block60000023:
 // CHECK:STDOUT:       0:               inst60000070
-// CHECK:STDOUT:       1:               inst60000071
-// CHECK:STDOUT:       2:               inst60000072
-// CHECK:STDOUT:       3:               inst60000073
+// CHECK:STDOUT:     inst_block60000024:
+// CHECK:STDOUT:       0:               inst60000071
+// CHECK:STDOUT:       1:               inst60000072
+// CHECK:STDOUT:       2:               inst60000073
+// CHECK:STDOUT:       3:               inst60000074
 // CHECK:STDOUT:     inst_block60000025:
-// CHECK:STDOUT:       0:               inst60000061
-// CHECK:STDOUT:       1:               inst60000062
-// CHECK:STDOUT:       2:               inst60000078
+// CHECK:STDOUT:       0:               inst60000062
+// CHECK:STDOUT:       1:               inst60000063
+// CHECK:STDOUT:       2:               inst60000079
 // CHECK:STDOUT:     inst_block60000026:
-// CHECK:STDOUT:       0:               inst60000070
+// CHECK:STDOUT:       0:               inst60000071
 // CHECK:STDOUT:     inst_block60000027:
-// CHECK:STDOUT:       0:               inst6000007B
-// CHECK:STDOUT:       1:               inst6000007C
-// CHECK:STDOUT:       2:               inst6000007D
-// CHECK:STDOUT:       3:               inst6000007E
-// CHECK:STDOUT:       4:               inst6000007F
-// CHECK:STDOUT:       5:               inst60000080
+// CHECK:STDOUT:       0:               inst6000007C
+// CHECK:STDOUT:       1:               inst6000007D
+// CHECK:STDOUT:       2:               inst6000007E
+// CHECK:STDOUT:       3:               inst6000007F
+// CHECK:STDOUT:       4:               inst60000080
+// CHECK:STDOUT:       5:               inst60000081
 // CHECK:STDOUT:     inst_block60000028:
-// CHECK:STDOUT:       0:               inst60000061
-// CHECK:STDOUT:       1:               inst60000062
-// CHECK:STDOUT:       2:               inst60000063
-// CHECK:STDOUT:       3:               inst6000006A
+// CHECK:STDOUT:       0:               inst60000062
+// CHECK:STDOUT:       1:               inst60000063
+// CHECK:STDOUT:       2:               inst60000064
+// CHECK:STDOUT:       3:               inst6000006B
 // CHECK:STDOUT:     inst_block60000029:
-// CHECK:STDOUT:       0:               inst60000082
+// CHECK:STDOUT:       0:               inst60000083
 // CHECK:STDOUT:     inst_block6000002A:
-// CHECK:STDOUT:       0:               inst60000085
-// CHECK:STDOUT:     inst_block6000002B:
 // CHECK:STDOUT:       0:               inst60000086
+// CHECK:STDOUT:     inst_block6000002B:
+// CHECK:STDOUT:       0:               inst60000087
 // CHECK:STDOUT:     inst_block6000002C:
-// CHECK:STDOUT:       0:               inst60000086
-// CHECK:STDOUT:       1:               inst60000087
-// CHECK:STDOUT:       2:               inst60000088
-// CHECK:STDOUT:       3:               inst60000089
+// CHECK:STDOUT:       0:               inst60000087
+// CHECK:STDOUT:       1:               inst60000088
+// CHECK:STDOUT:       2:               inst60000089
+// CHECK:STDOUT:       3:               inst6000008A
 // CHECK:STDOUT:     inst_block6000002D:
-// CHECK:STDOUT:       0:               inst60000086
+// CHECK:STDOUT:       0:               inst60000087
 // CHECK:STDOUT:     inst_block6000002E:
-// CHECK:STDOUT:       0:               inst6000008A
-// CHECK:STDOUT:       1:               inst6000008B
+// CHECK:STDOUT:       0:               inst6000008B
+// CHECK:STDOUT:       1:               inst6000008C
 // CHECK:STDOUT:     inst_block6000002F:
-// CHECK:STDOUT:       0:               inst6000009E
+// CHECK:STDOUT:       0:               inst6000009F
 // CHECK:STDOUT:     inst_block60000030:
-// CHECK:STDOUT:       0:               inst60000014
-// CHECK:STDOUT:       1:               inst6000001A
-// CHECK:STDOUT:       2:               inst600000A0
+// CHECK:STDOUT:       0:               inst60000015
+// CHECK:STDOUT:       1:               inst6000001B
+// CHECK:STDOUT:       2:               inst600000A1
 // CHECK:STDOUT:     inst_block60000031:
-// CHECK:STDOUT:       0:               inst600000A1
+// CHECK:STDOUT:       0:               inst600000A2
 // CHECK:STDOUT:     inst_block60000032:
-// CHECK:STDOUT:       0:               inst600000A4
-// CHECK:STDOUT:     inst_block60000033:
 // CHECK:STDOUT:       0:               inst600000A5
+// CHECK:STDOUT:     inst_block60000033:
+// CHECK:STDOUT:       0:               inst600000A6
 // CHECK:STDOUT:     inst_block60000034:
-// CHECK:STDOUT:       0:               inst600000A5
-// CHECK:STDOUT:       1:               inst600000A6
-// CHECK:STDOUT:       2:               inst600000A7
+// CHECK:STDOUT:       0:               inst600000A6
+// CHECK:STDOUT:       1:               inst600000A7
+// CHECK:STDOUT:       2:               inst600000A8
 // CHECK:STDOUT:     inst_block60000035:
-// CHECK:STDOUT:       0:               inst600000AE
-// CHECK:STDOUT:     inst_block60000036:
 // CHECK:STDOUT:       0:               inst600000AF
-// CHECK:STDOUT:     inst_block60000037:
+// CHECK:STDOUT:     inst_block60000036:
 // CHECK:STDOUT:       0:               inst600000B0
-// CHECK:STDOUT:       1:               inst600000B1
-// CHECK:STDOUT:       2:               inst600000B2
+// CHECK:STDOUT:     inst_block60000037:
+// CHECK:STDOUT:       0:               inst600000B1
+// CHECK:STDOUT:       1:               inst600000B2
+// CHECK:STDOUT:       2:               inst600000B3
 // CHECK:STDOUT:     inst_block60000038:
-// CHECK:STDOUT:       0:               inst60000014
-// CHECK:STDOUT:       1:               inst6000001A
-// CHECK:STDOUT:       2:               inst6000001D
+// CHECK:STDOUT:       0:               inst60000015
+// CHECK:STDOUT:       1:               inst6000001B
+// CHECK:STDOUT:       2:               inst6000001E
 // CHECK:STDOUT:     inst_block60000039:
-// CHECK:STDOUT:       0:               inst600000A5
+// CHECK:STDOUT:       0:               inst600000A6
 // CHECK:STDOUT:     inst_block6000003A:
-// CHECK:STDOUT:       0:               inst600000B3
-// CHECK:STDOUT:       1:               inst600000B4
-// CHECK:STDOUT:       2:               inst600000B5
+// CHECK:STDOUT:       0:               inst600000B4
+// CHECK:STDOUT:       1:               inst600000B5
+// CHECK:STDOUT:       2:               inst600000B6
 // CHECK:STDOUT:     inst_block6000003B:
-// CHECK:STDOUT:       0:               inst60000062
-// CHECK:STDOUT:       1:               inst600000C1
+// CHECK:STDOUT:       0:               inst60000063
+// CHECK:STDOUT:       1:               inst600000C2
 // CHECK:STDOUT:     inst_block6000003C:
-// CHECK:STDOUT:       0:               inst600000C3
+// CHECK:STDOUT:       0:               inst600000C4
 // CHECK:STDOUT:     inst_block6000003D:
-// CHECK:STDOUT:       0:               inst60000061
-// CHECK:STDOUT:       1:               inst600000C0
+// CHECK:STDOUT:       0:               inst60000062
+// CHECK:STDOUT:       1:               inst600000C1
 // CHECK:STDOUT:     inst_block6000003E:
-// CHECK:STDOUT:       0:               inst60000049
-// CHECK:STDOUT:       1:               inst60000049
+// CHECK:STDOUT:       0:               inst6000004A
+// CHECK:STDOUT:       1:               inst6000004A
 // CHECK:STDOUT:     inst_block6000003F:
-// CHECK:STDOUT:       0:               inst60000061
-// CHECK:STDOUT:       1:               inst600000C0
-// CHECK:STDOUT:       2:               inst600000CA
-// CHECK:STDOUT:       3:               inst60000062
-// CHECK:STDOUT:       4:               inst600000C1
-// CHECK:STDOUT:       5:               inst600000C2
-// CHECK:STDOUT:       6:               inst600000C5
+// CHECK:STDOUT:       0:               inst60000062
+// CHECK:STDOUT:       1:               inst600000C1
+// CHECK:STDOUT:       2:               inst600000CB
+// CHECK:STDOUT:       3:               inst60000063
+// CHECK:STDOUT:       4:               inst600000C2
+// CHECK:STDOUT:       5:               inst600000C3
+// CHECK:STDOUT:       6:               inst600000C6
 // CHECK:STDOUT:     inst_block60000040:
-// CHECK:STDOUT:       0:               inst600000C7
-// CHECK:STDOUT:       1:               inst600000C8
+// CHECK:STDOUT:       0:               inst600000C8
+// CHECK:STDOUT:       1:               inst600000C9
 // CHECK:STDOUT:     inst_block60000041:
-// CHECK:STDOUT:       0:               inst600000CF
-// CHECK:STDOUT:     inst_block60000042:
 // CHECK:STDOUT:       0:               inst600000D0
-// CHECK:STDOUT:       1:               inst600000D1
+// CHECK:STDOUT:     inst_block60000042:
+// CHECK:STDOUT:       0:               inst600000D1
+// CHECK:STDOUT:       1:               inst600000D2
 // CHECK:STDOUT:     inst_block60000043:
-// CHECK:STDOUT:       0:               inst600000D3
-// CHECK:STDOUT:       1:               inst600000D5
+// CHECK:STDOUT:       0:               inst600000D4
+// CHECK:STDOUT:       1:               inst600000D6
 // CHECK:STDOUT:     inst_block60000044:
-// CHECK:STDOUT:       0:               inst600000D2
-// CHECK:STDOUT:       1:               inst600000D3
-// CHECK:STDOUT:       2:               inst600000D4
-// CHECK:STDOUT:       3:               inst600000D5
-// CHECK:STDOUT:       4:               inst600000D6
-// CHECK:STDOUT:       5:               inst600000D7
+// CHECK:STDOUT:       0:               inst600000D3
+// CHECK:STDOUT:       1:               inst600000D4
+// CHECK:STDOUT:       2:               inst600000D5
+// CHECK:STDOUT:       3:               inst600000D6
+// CHECK:STDOUT:       4:               inst600000D7
+// CHECK:STDOUT:       5:               inst600000D8
 // CHECK:STDOUT:     inst_block60000045:
-// CHECK:STDOUT:       0:               inst600000C0
+// CHECK:STDOUT:       0:               inst600000C1
 // CHECK:STDOUT:     inst_block60000046:
-// CHECK:STDOUT:       0:               inst600000C0
-// CHECK:STDOUT:       1:               inst600000C1
-// CHECK:STDOUT:       2:               inst600000DC
+// CHECK:STDOUT:       0:               inst600000C1
+// CHECK:STDOUT:       1:               inst600000C2
+// CHECK:STDOUT:       2:               inst600000DD
 // CHECK:STDOUT:     inst_block60000047:
-// CHECK:STDOUT:       0:               inst600000D2
+// CHECK:STDOUT:       0:               inst600000D3
 // CHECK:STDOUT:     inst_block60000048:
-// CHECK:STDOUT:       0:               inst600000D4
+// CHECK:STDOUT:       0:               inst600000D5
 // CHECK:STDOUT:     inst_block60000049:
-// CHECK:STDOUT:       0:               inst600000DF
-// CHECK:STDOUT:       1:               inst600000E0
-// CHECK:STDOUT:       2:               inst600000E1
-// CHECK:STDOUT:       3:               inst600000E2
-// CHECK:STDOUT:       4:               inst600000E3
-// CHECK:STDOUT:       5:               inst600000E4
-// CHECK:STDOUT:       6:               inst600000E5
-// CHECK:STDOUT:       7:               inst600000E6
-// CHECK:STDOUT:       8:               inst600000E7
-// CHECK:STDOUT:       9:               inst600000E8
-// CHECK:STDOUT:       10:              inst600000E9
+// CHECK:STDOUT:       0:               inst600000E0
+// CHECK:STDOUT:       1:               inst600000E1
+// CHECK:STDOUT:       2:               inst600000E2
+// CHECK:STDOUT:       3:               inst600000E3
+// CHECK:STDOUT:       4:               inst600000E4
+// CHECK:STDOUT:       5:               inst600000E5
+// CHECK:STDOUT:       6:               inst600000E6
+// CHECK:STDOUT:       7:               inst600000E7
+// CHECK:STDOUT:       8:               inst600000E8
+// CHECK:STDOUT:       9:               inst600000E9
+// CHECK:STDOUT:       10:              inst600000EA
 // CHECK:STDOUT:     inst_block6000004A:
-// CHECK:STDOUT:       0:               inst60000061
-// CHECK:STDOUT:       1:               inst60000062
-// CHECK:STDOUT:       2:               inst600000C0
-// CHECK:STDOUT:       3:               inst600000C1
-// CHECK:STDOUT:       4:               inst600000C2
-// CHECK:STDOUT:       5:               inst600000CB
+// CHECK:STDOUT:       0:               inst60000062
+// CHECK:STDOUT:       1:               inst60000063
+// CHECK:STDOUT:       2:               inst600000C1
+// CHECK:STDOUT:       3:               inst600000C2
+// CHECK:STDOUT:       4:               inst600000C3
+// CHECK:STDOUT:       5:               inst600000CC
 // CHECK:STDOUT:     inst_block6000004B:
-// CHECK:STDOUT:       0:               inst600000EB
-// CHECK:STDOUT:       1:               inst600000EA
+// CHECK:STDOUT:       0:               inst600000EC
+// CHECK:STDOUT:       1:               inst600000EB
 // CHECK:STDOUT:     inst_block6000004C:
-// CHECK:STDOUT:       0:               inst600000EE
-// CHECK:STDOUT:       1:               inst600000EF
+// CHECK:STDOUT:       0:               inst600000EF
+// CHECK:STDOUT:       1:               inst600000F0
 // CHECK:STDOUT:     inst_block6000004D:
-// CHECK:STDOUT:       0:               inst600000F0
-// CHECK:STDOUT:       1:               inst600000F1
+// CHECK:STDOUT:       0:               inst600000F1
+// CHECK:STDOUT:       1:               inst600000F2
 // CHECK:STDOUT:     inst_block6000004E:
-// CHECK:STDOUT:       0:               inst600000F3
-// CHECK:STDOUT:       1:               inst600000F4
+// CHECK:STDOUT:       0:               inst600000F4
+// CHECK:STDOUT:       1:               inst600000F5
 // CHECK:STDOUT:     inst_block6000004F:
-// CHECK:STDOUT:       0:               inst600000F0
-// CHECK:STDOUT:       1:               inst600000F1
+// CHECK:STDOUT:       0:               inst600000F1
+// CHECK:STDOUT:       1:               inst600000F2
 // CHECK:STDOUT:     inst_block60000050:
-// CHECK:STDOUT:       0:               inst600000F0
-// CHECK:STDOUT:       1:               inst600000F1
-// CHECK:STDOUT:       2:               inst600000F2
-// CHECK:STDOUT:       3:               inst600000F3
-// CHECK:STDOUT:       4:               inst600000F4
-// CHECK:STDOUT:       5:               inst600000F5
-// CHECK:STDOUT:       6:               inst600000F6
+// CHECK:STDOUT:       0:               inst600000F1
+// CHECK:STDOUT:       1:               inst600000F2
+// CHECK:STDOUT:       2:               inst600000F3
+// CHECK:STDOUT:       3:               inst600000F4
+// CHECK:STDOUT:       4:               inst600000F5
+// CHECK:STDOUT:       5:               inst600000F6
+// CHECK:STDOUT:       6:               inst600000F7
 // CHECK:STDOUT:     inst_block60000051:
-// CHECK:STDOUT:       0:               inst600000F0
-// CHECK:STDOUT:       1:               inst600000F1
+// CHECK:STDOUT:       0:               inst600000F1
+// CHECK:STDOUT:       1:               inst600000F2
 // CHECK:STDOUT:     inst_block60000052:
-// CHECK:STDOUT:       0:               inst600000F7
-// CHECK:STDOUT:       1:               inst600000F8
+// CHECK:STDOUT:       0:               inst600000F8
+// CHECK:STDOUT:       1:               inst600000F9
 // CHECK:STDOUT:     inst_block60000053:
+// CHECK:STDOUT:       0:               inst60000063
+// CHECK:STDOUT:       1:               inst600000C2
+// CHECK:STDOUT:       2:               inst600000FD
+// CHECK:STDOUT:     inst_block60000054:
+// CHECK:STDOUT:       0:               inst600000FF
+// CHECK:STDOUT:     inst_block60000055:
 // CHECK:STDOUT:       0:               inst60000062
 // CHECK:STDOUT:       1:               inst600000C1
 // CHECK:STDOUT:       2:               inst600000FC
-// CHECK:STDOUT:     inst_block60000054:
-// CHECK:STDOUT:       0:               inst600000FE
-// CHECK:STDOUT:     inst_block60000055:
-// CHECK:STDOUT:       0:               inst60000061
-// CHECK:STDOUT:       1:               inst600000C0
-// CHECK:STDOUT:       2:               inst600000FB
 // CHECK:STDOUT:     inst_block60000056:
-// CHECK:STDOUT:       0:               inst60000049
-// CHECK:STDOUT:       1:               inst60000049
-// CHECK:STDOUT:       2:               inst60000049
+// CHECK:STDOUT:       0:               inst6000004A
+// CHECK:STDOUT:       1:               inst6000004A
+// CHECK:STDOUT:       2:               inst6000004A
 // CHECK:STDOUT:     inst_block60000057:
-// CHECK:STDOUT:       0:               inst60000061
-// CHECK:STDOUT:       1:               inst600000C0
-// CHECK:STDOUT:       2:               inst600000FB
-// CHECK:STDOUT:       3:               inst60000105
-// CHECK:STDOUT:       4:               inst60000062
-// CHECK:STDOUT:       5:               inst600000C1
-// CHECK:STDOUT:       6:               inst600000FC
-// CHECK:STDOUT:       7:               inst600000FD
-// CHECK:STDOUT:       8:               inst60000100
+// CHECK:STDOUT:       0:               inst60000062
+// CHECK:STDOUT:       1:               inst600000C1
+// CHECK:STDOUT:       2:               inst600000FC
+// CHECK:STDOUT:       3:               inst60000106
+// CHECK:STDOUT:       4:               inst60000063
+// CHECK:STDOUT:       5:               inst600000C2
+// CHECK:STDOUT:       6:               inst600000FD
+// CHECK:STDOUT:       7:               inst600000FE
+// CHECK:STDOUT:       8:               inst60000101
 // CHECK:STDOUT:     inst_block60000058:
-// CHECK:STDOUT:       0:               inst60000102
-// CHECK:STDOUT:       1:               inst60000103
+// CHECK:STDOUT:       0:               inst60000103
+// CHECK:STDOUT:       1:               inst60000104
 // CHECK:STDOUT:     inst_block60000059:
-// CHECK:STDOUT:       0:               inst6000010A
-// CHECK:STDOUT:     inst_block6000005A:
 // CHECK:STDOUT:       0:               inst6000010B
-// CHECK:STDOUT:       1:               inst6000010C
-// CHECK:STDOUT:       2:               inst6000010D
+// CHECK:STDOUT:     inst_block6000005A:
+// CHECK:STDOUT:       0:               inst6000010C
+// CHECK:STDOUT:       1:               inst6000010D
+// CHECK:STDOUT:       2:               inst6000010E
 // CHECK:STDOUT:     inst_block6000005B:
-// CHECK:STDOUT:       0:               inst6000010F
-// CHECK:STDOUT:       1:               inst60000111
-// CHECK:STDOUT:       2:               inst60000113
+// CHECK:STDOUT:       0:               inst60000110
+// CHECK:STDOUT:       1:               inst60000112
+// CHECK:STDOUT:       2:               inst60000114
 // CHECK:STDOUT:     inst_block6000005C:
-// CHECK:STDOUT:       0:               inst6000010E
-// CHECK:STDOUT:       1:               inst6000010F
-// CHECK:STDOUT:       2:               inst60000110
-// CHECK:STDOUT:       3:               inst60000111
-// CHECK:STDOUT:       4:               inst60000112
-// CHECK:STDOUT:       5:               inst60000113
-// CHECK:STDOUT:       6:               inst60000114
-// CHECK:STDOUT:       7:               inst60000115
+// CHECK:STDOUT:       0:               inst6000010F
+// CHECK:STDOUT:       1:               inst60000110
+// CHECK:STDOUT:       2:               inst60000111
+// CHECK:STDOUT:       3:               inst60000112
+// CHECK:STDOUT:       4:               inst60000113
+// CHECK:STDOUT:       5:               inst60000114
+// CHECK:STDOUT:       6:               inst60000115
+// CHECK:STDOUT:       7:               inst60000116
 // CHECK:STDOUT:     inst_block6000005D:
-// CHECK:STDOUT:       0:               inst600000FB
+// CHECK:STDOUT:       0:               inst600000FC
 // CHECK:STDOUT:     inst_block6000005E:
-// CHECK:STDOUT:       0:               inst600000FB
-// CHECK:STDOUT:       1:               inst600000FC
-// CHECK:STDOUT:       2:               inst6000011A
+// CHECK:STDOUT:       0:               inst600000FC
+// CHECK:STDOUT:       1:               inst600000FD
+// CHECK:STDOUT:       2:               inst6000011B
 // CHECK:STDOUT:     inst_block6000005F:
-// CHECK:STDOUT:       0:               inst6000010E
+// CHECK:STDOUT:       0:               inst6000010F
 // CHECK:STDOUT:     inst_block60000060:
-// CHECK:STDOUT:       0:               inst60000110
+// CHECK:STDOUT:       0:               inst60000111
 // CHECK:STDOUT:     inst_block60000061:
-// CHECK:STDOUT:       0:               inst60000112
+// CHECK:STDOUT:       0:               inst60000113
 // CHECK:STDOUT:     inst_block60000062:
-// CHECK:STDOUT:       0:               inst6000011D
-// CHECK:STDOUT:       1:               inst6000011E
-// CHECK:STDOUT:       2:               inst6000011F
-// CHECK:STDOUT:       3:               inst60000120
-// CHECK:STDOUT:       4:               inst60000121
-// CHECK:STDOUT:       5:               inst60000122
-// CHECK:STDOUT:       6:               inst60000123
-// CHECK:STDOUT:       7:               inst60000124
-// CHECK:STDOUT:       8:               inst60000125
-// CHECK:STDOUT:       9:               inst60000126
-// CHECK:STDOUT:       10:              inst60000127
-// CHECK:STDOUT:       11:              inst60000128
-// CHECK:STDOUT:       12:              inst60000129
-// CHECK:STDOUT:       13:              inst6000012A
-// CHECK:STDOUT:       14:              inst6000012B
-// CHECK:STDOUT:       15:              inst6000012C
+// CHECK:STDOUT:       0:               inst6000011E
+// CHECK:STDOUT:       1:               inst6000011F
+// CHECK:STDOUT:       2:               inst60000120
+// CHECK:STDOUT:       3:               inst60000121
+// CHECK:STDOUT:       4:               inst60000122
+// CHECK:STDOUT:       5:               inst60000123
+// CHECK:STDOUT:       6:               inst60000124
+// CHECK:STDOUT:       7:               inst60000125
+// CHECK:STDOUT:       8:               inst60000126
+// CHECK:STDOUT:       9:               inst60000127
+// CHECK:STDOUT:       10:              inst60000128
+// CHECK:STDOUT:       11:              inst60000129
+// CHECK:STDOUT:       12:              inst6000012A
+// CHECK:STDOUT:       13:              inst6000012B
+// CHECK:STDOUT:       14:              inst6000012C
+// CHECK:STDOUT:       15:              inst6000012D
 // CHECK:STDOUT:     inst_block60000063:
-// CHECK:STDOUT:       0:               inst60000061
-// CHECK:STDOUT:       1:               inst60000062
-// CHECK:STDOUT:       2:               inst600000C0
-// CHECK:STDOUT:       3:               inst600000C1
-// CHECK:STDOUT:       4:               inst600000FB
-// CHECK:STDOUT:       5:               inst600000FC
-// CHECK:STDOUT:       6:               inst600000FD
-// CHECK:STDOUT:       7:               inst60000106
+// CHECK:STDOUT:       0:               inst60000062
+// CHECK:STDOUT:       1:               inst60000063
+// CHECK:STDOUT:       2:               inst600000C1
+// CHECK:STDOUT:       3:               inst600000C2
+// CHECK:STDOUT:       4:               inst600000FC
+// CHECK:STDOUT:       5:               inst600000FD
+// CHECK:STDOUT:       6:               inst600000FE
+// CHECK:STDOUT:       7:               inst60000107
 // CHECK:STDOUT:     inst_block60000064:
-// CHECK:STDOUT:       0:               inst6000012F
-// CHECK:STDOUT:       1:               inst6000012E
-// CHECK:STDOUT:       2:               inst6000012D
+// CHECK:STDOUT:       0:               inst60000130
+// CHECK:STDOUT:       1:               inst6000012F
+// CHECK:STDOUT:       2:               inst6000012E
 // CHECK:STDOUT:     inst_block60000065:
-// CHECK:STDOUT:       0:               inst60000132
-// CHECK:STDOUT:       1:               inst60000133
-// CHECK:STDOUT:       2:               inst60000134
+// CHECK:STDOUT:       0:               inst60000133
+// CHECK:STDOUT:       1:               inst60000134
+// CHECK:STDOUT:       2:               inst60000135
 // CHECK:STDOUT:     inst_block60000066:
-// CHECK:STDOUT:       0:               inst60000135
-// CHECK:STDOUT:       1:               inst60000136
-// CHECK:STDOUT:       2:               inst60000137
+// CHECK:STDOUT:       0:               inst60000136
+// CHECK:STDOUT:       1:               inst60000137
+// CHECK:STDOUT:       2:               inst60000138
 // CHECK:STDOUT:     inst_block60000067:
-// CHECK:STDOUT:       0:               inst60000139
-// CHECK:STDOUT:       1:               inst6000013A
-// CHECK:STDOUT:       2:               inst6000013B
+// CHECK:STDOUT:       0:               inst6000013A
+// CHECK:STDOUT:       1:               inst6000013B
+// CHECK:STDOUT:       2:               inst6000013C
 // CHECK:STDOUT:     inst_block60000068:
-// CHECK:STDOUT:       0:               inst60000135
-// CHECK:STDOUT:       1:               inst60000136
-// CHECK:STDOUT:       2:               inst60000137
+// CHECK:STDOUT:       0:               inst60000136
+// CHECK:STDOUT:       1:               inst60000137
+// CHECK:STDOUT:       2:               inst60000138
 // CHECK:STDOUT:     inst_block60000069:
-// CHECK:STDOUT:       0:               inst60000135
-// CHECK:STDOUT:       1:               inst60000136
-// CHECK:STDOUT:       2:               inst60000137
-// CHECK:STDOUT:       3:               inst60000138
-// CHECK:STDOUT:       4:               inst60000139
-// CHECK:STDOUT:       5:               inst6000013A
-// CHECK:STDOUT:       6:               inst6000013B
-// CHECK:STDOUT:       7:               inst6000013C
-// CHECK:STDOUT:       8:               inst6000013D
+// CHECK:STDOUT:       0:               inst60000136
+// CHECK:STDOUT:       1:               inst60000137
+// CHECK:STDOUT:       2:               inst60000138
+// CHECK:STDOUT:       3:               inst60000139
+// CHECK:STDOUT:       4:               inst6000013A
+// CHECK:STDOUT:       5:               inst6000013B
+// CHECK:STDOUT:       6:               inst6000013C
+// CHECK:STDOUT:       7:               inst6000013D
+// CHECK:STDOUT:       8:               inst6000013E
 // CHECK:STDOUT:     inst_block6000006A:
-// CHECK:STDOUT:       0:               inst60000135
-// CHECK:STDOUT:       1:               inst60000136
-// CHECK:STDOUT:       2:               inst60000137
+// CHECK:STDOUT:       0:               inst60000136
+// CHECK:STDOUT:       1:               inst60000137
+// CHECK:STDOUT:       2:               inst60000138
 // CHECK:STDOUT:     inst_block6000006B:
-// CHECK:STDOUT:       0:               inst6000013E
-// CHECK:STDOUT:       1:               inst6000013F
+// CHECK:STDOUT:       0:               inst6000013F
+// CHECK:STDOUT:       1:               inst60000140
 // CHECK:STDOUT:     inst_block6000006C:
-// CHECK:STDOUT:       0:               inst600000A9
-// CHECK:STDOUT:       1:               inst600000AA
-// CHECK:STDOUT:       2:               inst6000003F
+// CHECK:STDOUT:       0:               inst600000AA
+// CHECK:STDOUT:       1:               inst600000AB
+// CHECK:STDOUT:       2:               inst60000040
 // CHECK:STDOUT:     inst_block6000006D:
-// CHECK:STDOUT:       0:               inst60000140
+// CHECK:STDOUT:       0:               inst60000016
 // CHECK:STDOUT:     inst_block6000006E:
-// CHECK:STDOUT:       0:               inst60000141
+// CHECK:STDOUT:       0:               inst60000144
 // CHECK:STDOUT:     inst_block6000006F:
-// CHECK:STDOUT:       0:               inst60000142
+// CHECK:STDOUT:       0:               inst60000145
 // CHECK:STDOUT:     inst_block60000070:
-// CHECK:STDOUT:       0:               inst60000142
-// CHECK:STDOUT:       1:               inst6000001A
-// CHECK:STDOUT:       2:               inst6000001D
+// CHECK:STDOUT:       0:               inst60000146
 // CHECK:STDOUT:     inst_block60000071:
 // CHECK:STDOUT:       0:               inst60000146
+// CHECK:STDOUT:       1:               inst6000001B
+// CHECK:STDOUT:       2:               inst6000001E
 // CHECK:STDOUT:     inst_block60000072:
-// CHECK:STDOUT:       0:               inst60000041
+// CHECK:STDOUT:       0:               inst6000014A
 // CHECK:STDOUT:     inst_block60000073:
-// CHECK:STDOUT:       0:               inst60000150
-// CHECK:STDOUT:       1:               inst60000153
+// CHECK:STDOUT:       0:               inst60000042
 // CHECK:STDOUT:     inst_block60000074:
-// CHECK:STDOUT:       0:               inst6000003D
-// CHECK:STDOUT:       1:               inst60000040
-// CHECK:STDOUT:       2:               inst60000141
-// CHECK:STDOUT:       3:               inst60000146
-// CHECK:STDOUT:       4:               inst60000147
-// CHECK:STDOUT:       5:               inst60000148
-// CHECK:STDOUT:       6:               inst6000014C
+// CHECK:STDOUT:       0:               inst60000154
+// CHECK:STDOUT:       1:               inst60000157
 // CHECK:STDOUT:     inst_block60000075:
-// CHECK:STDOUT:       0:               instD
-// CHECK:STDOUT:       1:               inst6000000E
-// CHECK:STDOUT:       2:               inst60000037
+// CHECK:STDOUT:       0:               inst6000003E
+// CHECK:STDOUT:       1:               inst60000041
+// CHECK:STDOUT:       2:               inst60000143
+// CHECK:STDOUT:       3:               inst60000145
+// CHECK:STDOUT:       4:               inst6000014A
+// CHECK:STDOUT:       5:               inst6000014B
+// CHECK:STDOUT:       6:               inst6000014C
+// CHECK:STDOUT:       7:               inst60000150
+// CHECK:STDOUT:     inst_block60000076:
+// CHECK:STDOUT:       0:               instE
+// CHECK:STDOUT:       1:               inst6000000F
+// CHECK:STDOUT:       2:               inst60000038
 // CHECK:STDOUT: ...

+ 122 - 122
toolchain/check/testdata/basics/raw_sem_ir/one_file_with_textual_ir.carbon

@@ -26,12 +26,12 @@ fn Foo(n: ()) -> ((), ()) {
 // CHECK:STDOUT:   import_ir_insts: {}
 // CHECK:STDOUT:   clang_decls:     {}
 // CHECK:STDOUT:   name_scopes:
-// CHECK:STDOUT:     name_scope0:     {inst: instD, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {name0: inst60000026}}
+// CHECK:STDOUT:     name_scope0:     {inst: instE, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {name0: inst60000027}}
 // CHECK:STDOUT:   entity_names:
 // CHECK:STDOUT:     entity_name60000000: {name: name1, parent_scope: name_scope<none>, index: -1, is_template: 0}
 // CHECK:STDOUT:   cpp_global_vars: {}
 // CHECK:STDOUT:   functions:
-// CHECK:STDOUT:     function60000000: {name: name0, parent_scope: name_scope0, call_params_id: inst_block6000000A, return_slot_pattern: inst60000021, body: [inst_block6000000D]}
+// CHECK:STDOUT:     function60000000: {name: name0, parent_scope: name_scope0, call_params_id: inst_block6000000A, return_slot_pattern: inst60000022, body: [inst_block6000000D]}
 // CHECK:STDOUT:   classes:         {}
 // CHECK:STDOUT:   generics:        {}
 // CHECK:STDOUT:   specifics:       {}
@@ -44,155 +44,155 @@ fn Foo(n: ()) -> ((), ()) {
 // CHECK:STDOUT:       value_repr:      {kind: copy, type: type(Error)}
 // CHECK:STDOUT:     'type(inst(NamespaceType))':
 // CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     'type(inst6000000E)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst6000000E)}
-// CHECK:STDOUT:     'type(inst6000001B)':
-// CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst6000001B)}
-// CHECK:STDOUT:     'type(inst60000018)':
-// CHECK:STDOUT:       value_repr:      {kind: pointer, type: type(inst6000001B)}
-// CHECK:STDOUT:     'type(inst60000027)':
-// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst6000000E)}
+// CHECK:STDOUT:     'type(inst6000000F)':
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst6000000F)}
+// CHECK:STDOUT:     'type(inst6000001C)':
+// CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst6000001C)}
+// CHECK:STDOUT:     'type(inst60000019)':
+// CHECK:STDOUT:       value_repr:      {kind: pointer, type: type(inst6000001C)}
+// CHECK:STDOUT:     'type(inst60000028)':
+// CHECK:STDOUT:       value_repr:      {kind: none, type: type(inst6000000F)}
 // CHECK:STDOUT:   insts:
-// CHECK:STDOUT:     instD:           {kind: Namespace, arg0: name_scope0, arg1: inst<none>, type: type(inst(NamespaceType))}
-// CHECK:STDOUT:     inst6000000E:    {kind: TupleType, arg0: inst_block_empty, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000000F:    {kind: TupleLiteral, arg0: inst_block_empty, type: type(inst6000000E)}
-// CHECK:STDOUT:     inst60000010:    {kind: TupleValue, arg0: inst_block_empty, type: type(inst6000000E)}
-// CHECK:STDOUT:     inst60000011:    {kind: Converted, arg0: inst6000000F, arg1: inst6000000E, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000012:    {kind: ValueBinding, arg0: entity_name60000000, arg1: inst60000022, type: type(inst6000000E)}
-// CHECK:STDOUT:     inst60000013:    {kind: PatternType, arg0: inst6000000E, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000014:    {kind: ValueBindingPattern, arg0: entity_name60000000, type: type(inst60000013)}
-// CHECK:STDOUT:     inst60000015:    {kind: ValueParamPattern, arg0: inst60000014, arg1: call_param0, type: type(inst60000013)}
-// CHECK:STDOUT:     inst60000016:    {kind: TupleLiteral, arg0: inst_block_empty, type: type(inst6000000E)}
-// CHECK:STDOUT:     inst60000017:    {kind: TupleLiteral, arg0: inst_block_empty, type: type(inst6000000E)}
-// CHECK:STDOUT:     inst60000018:    {kind: TupleType, arg0: inst_block60000007, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000019:    {kind: TupleLiteral, arg0: inst_block60000006, type: type(inst60000018)}
-// CHECK:STDOUT:     inst6000001A:    {kind: TupleValue, arg0: inst_block60000008, type: type(inst60000018)}
-// CHECK:STDOUT:     inst6000001B:    {kind: PointerType, arg0: inst60000018, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000001C:    {kind: Converted, arg0: inst60000010, arg1: inst6000000E, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000001D:    {kind: Converted, arg0: inst60000010, arg1: inst6000000E, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000001E:    {kind: Converted, arg0: inst60000019, arg1: inst60000018, type: type(TypeType)}
-// CHECK:STDOUT:     inst6000001F:    {kind: PatternType, arg0: inst60000018, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000020:    {kind: ReturnSlotPattern, arg0: inst6000001E, type: type(inst6000001F)}
-// CHECK:STDOUT:     inst60000021:    {kind: OutParamPattern, arg0: inst60000020, arg1: call_param1, type: type(inst6000001F)}
-// CHECK:STDOUT:     inst60000022:    {kind: ValueParam, arg0: call_param0, arg1: name1, type: type(inst6000000E)}
-// CHECK:STDOUT:     inst60000023:    {kind: SpliceBlock, arg0: inst_block60000004, arg1: inst60000011, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000024:    {kind: OutParam, arg0: call_param1, arg1: name(ReturnSlot), type: type(inst60000018)}
-// CHECK:STDOUT:     inst60000025:    {kind: ReturnSlot, arg0: inst60000018, arg1: inst60000024, type: type(inst60000018)}
-// CHECK:STDOUT:     inst60000026:    {kind: FunctionDecl, arg0: function60000000, arg1: inst_block6000000C, type: type(inst60000027)}
-// CHECK:STDOUT:     inst60000027:    {kind: FunctionType, arg0: function60000000, arg1: specific<none>, type: type(TypeType)}
-// CHECK:STDOUT:     inst60000028:    {kind: StructValue, arg0: inst_block_empty, type: type(inst60000027)}
-// CHECK:STDOUT:     inst60000029:    {kind: NameRef, arg0: name1, arg1: inst60000012, type: type(inst6000000E)}
-// CHECK:STDOUT:     inst6000002A:    {kind: TupleLiteral, arg0: inst_block_empty, type: type(inst6000000E)}
-// CHECK:STDOUT:     inst6000002B:    {kind: TupleLiteral, arg0: inst_block6000000E, type: type(inst60000018)}
-// CHECK:STDOUT:     inst6000002C:    {kind: TupleAccess, arg0: inst60000025, arg1: element0, type: type(inst6000000E)}
-// CHECK:STDOUT:     inst6000002D:    {kind: TupleInit, arg0: inst_block6000000F, arg1: inst6000002C, type: type(inst6000000E)}
-// CHECK:STDOUT:     inst6000002E:    {kind: Converted, arg0: inst60000029, arg1: inst6000002D, type: type(inst6000000E)}
-// CHECK:STDOUT:     inst6000002F:    {kind: TupleAccess, arg0: inst60000025, arg1: element1, type: type(inst6000000E)}
-// CHECK:STDOUT:     inst60000030:    {kind: TupleInit, arg0: inst_block_empty, arg1: inst6000002F, type: type(inst6000000E)}
-// CHECK:STDOUT:     inst60000031:    {kind: Converted, arg0: inst6000002A, arg1: inst60000030, type: type(inst6000000E)}
-// CHECK:STDOUT:     inst60000032:    {kind: TupleInit, arg0: inst_block60000010, arg1: inst60000025, type: type(inst60000018)}
-// CHECK:STDOUT:     inst60000033:    {kind: Converted, arg0: inst6000002B, arg1: inst60000032, type: type(inst60000018)}
-// CHECK:STDOUT:     inst60000034:    {kind: ReturnExpr, arg0: inst60000033, arg1: inst60000025}
+// CHECK:STDOUT:     instE:           {kind: Namespace, arg0: name_scope0, arg1: inst<none>, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     inst6000000F:    {kind: TupleType, arg0: inst_block_empty, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000010:    {kind: TupleLiteral, arg0: inst_block_empty, type: type(inst6000000F)}
+// CHECK:STDOUT:     inst60000011:    {kind: TupleValue, arg0: inst_block_empty, type: type(inst6000000F)}
+// CHECK:STDOUT:     inst60000012:    {kind: Converted, arg0: inst60000010, arg1: inst6000000F, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000013:    {kind: ValueBinding, arg0: entity_name60000000, arg1: inst60000023, type: type(inst6000000F)}
+// CHECK:STDOUT:     inst60000014:    {kind: PatternType, arg0: inst6000000F, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000015:    {kind: ValueBindingPattern, arg0: entity_name60000000, type: type(inst60000014)}
+// CHECK:STDOUT:     inst60000016:    {kind: ValueParamPattern, arg0: inst60000015, arg1: call_param0, type: type(inst60000014)}
+// CHECK:STDOUT:     inst60000017:    {kind: TupleLiteral, arg0: inst_block_empty, type: type(inst6000000F)}
+// CHECK:STDOUT:     inst60000018:    {kind: TupleLiteral, arg0: inst_block_empty, type: type(inst6000000F)}
+// CHECK:STDOUT:     inst60000019:    {kind: TupleType, arg0: inst_block60000007, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000001A:    {kind: TupleLiteral, arg0: inst_block60000006, type: type(inst60000019)}
+// CHECK:STDOUT:     inst6000001B:    {kind: TupleValue, arg0: inst_block60000008, type: type(inst60000019)}
+// CHECK:STDOUT:     inst6000001C:    {kind: PointerType, arg0: inst60000019, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000001D:    {kind: Converted, arg0: inst60000011, arg1: inst6000000F, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000001E:    {kind: Converted, arg0: inst60000011, arg1: inst6000000F, type: type(TypeType)}
+// CHECK:STDOUT:     inst6000001F:    {kind: Converted, arg0: inst6000001A, arg1: inst60000019, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000020:    {kind: PatternType, arg0: inst60000019, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000021:    {kind: ReturnSlotPattern, arg0: inst6000001F, type: type(inst60000020)}
+// CHECK:STDOUT:     inst60000022:    {kind: OutParamPattern, arg0: inst60000021, arg1: call_param1, type: type(inst60000020)}
+// CHECK:STDOUT:     inst60000023:    {kind: ValueParam, arg0: call_param0, arg1: name1, type: type(inst6000000F)}
+// CHECK:STDOUT:     inst60000024:    {kind: SpliceBlock, arg0: inst_block60000004, arg1: inst60000012, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000025:    {kind: OutParam, arg0: call_param1, arg1: name(ReturnSlot), type: type(inst60000019)}
+// CHECK:STDOUT:     inst60000026:    {kind: ReturnSlot, arg0: inst60000019, arg1: inst60000025, type: type(inst60000019)}
+// CHECK:STDOUT:     inst60000027:    {kind: FunctionDecl, arg0: function60000000, arg1: inst_block6000000C, type: type(inst60000028)}
+// CHECK:STDOUT:     inst60000028:    {kind: FunctionType, arg0: function60000000, arg1: specific<none>, type: type(TypeType)}
+// CHECK:STDOUT:     inst60000029:    {kind: StructValue, arg0: inst_block_empty, type: type(inst60000028)}
+// CHECK:STDOUT:     inst6000002A:    {kind: NameRef, arg0: name1, arg1: inst60000013, type: type(inst6000000F)}
+// CHECK:STDOUT:     inst6000002B:    {kind: TupleLiteral, arg0: inst_block_empty, type: type(inst6000000F)}
+// CHECK:STDOUT:     inst6000002C:    {kind: TupleLiteral, arg0: inst_block6000000E, type: type(inst60000019)}
+// CHECK:STDOUT:     inst6000002D:    {kind: TupleAccess, arg0: inst60000026, arg1: element0, type: type(inst6000000F)}
+// CHECK:STDOUT:     inst6000002E:    {kind: TupleInit, arg0: inst_block6000000F, arg1: inst6000002D, type: type(inst6000000F)}
+// CHECK:STDOUT:     inst6000002F:    {kind: Converted, arg0: inst6000002A, arg1: inst6000002E, type: type(inst6000000F)}
+// CHECK:STDOUT:     inst60000030:    {kind: TupleAccess, arg0: inst60000026, arg1: element1, type: type(inst6000000F)}
+// CHECK:STDOUT:     inst60000031:    {kind: TupleInit, arg0: inst_block_empty, arg1: inst60000030, type: type(inst6000000F)}
+// CHECK:STDOUT:     inst60000032:    {kind: Converted, arg0: inst6000002B, arg1: inst60000031, type: type(inst6000000F)}
+// CHECK:STDOUT:     inst60000033:    {kind: TupleInit, arg0: inst_block60000010, arg1: inst60000026, type: type(inst60000019)}
+// CHECK:STDOUT:     inst60000034:    {kind: Converted, arg0: inst6000002C, arg1: inst60000033, type: type(inst60000019)}
+// CHECK:STDOUT:     inst60000035:    {kind: ReturnExpr, arg0: inst60000034, arg1: inst60000026}
 // CHECK:STDOUT:   constant_values:
 // CHECK:STDOUT:     values:
-// CHECK:STDOUT:       instD:           concrete_constant(instD)
-// CHECK:STDOUT:       inst6000000E:    concrete_constant(inst6000000E)
-// CHECK:STDOUT:       inst6000000F:    concrete_constant(inst60000010)
-// CHECK:STDOUT:       inst60000010:    concrete_constant(inst60000010)
-// CHECK:STDOUT:       inst60000011:    concrete_constant(inst6000000E)
-// CHECK:STDOUT:       inst60000013:    concrete_constant(inst60000013)
+// CHECK:STDOUT:       instE:           concrete_constant(instE)
+// CHECK:STDOUT:       inst6000000F:    concrete_constant(inst6000000F)
+// CHECK:STDOUT:       inst60000010:    concrete_constant(inst60000011)
+// CHECK:STDOUT:       inst60000011:    concrete_constant(inst60000011)
+// CHECK:STDOUT:       inst60000012:    concrete_constant(inst6000000F)
 // CHECK:STDOUT:       inst60000014:    concrete_constant(inst60000014)
 // CHECK:STDOUT:       inst60000015:    concrete_constant(inst60000015)
-// CHECK:STDOUT:       inst60000016:    concrete_constant(inst60000010)
-// CHECK:STDOUT:       inst60000017:    concrete_constant(inst60000010)
-// CHECK:STDOUT:       inst60000018:    concrete_constant(inst60000018)
-// CHECK:STDOUT:       inst60000019:    concrete_constant(inst6000001A)
-// CHECK:STDOUT:       inst6000001A:    concrete_constant(inst6000001A)
+// CHECK:STDOUT:       inst60000016:    concrete_constant(inst60000016)
+// CHECK:STDOUT:       inst60000017:    concrete_constant(inst60000011)
+// CHECK:STDOUT:       inst60000018:    concrete_constant(inst60000011)
+// CHECK:STDOUT:       inst60000019:    concrete_constant(inst60000019)
+// CHECK:STDOUT:       inst6000001A:    concrete_constant(inst6000001B)
 // CHECK:STDOUT:       inst6000001B:    concrete_constant(inst6000001B)
-// CHECK:STDOUT:       inst6000001C:    concrete_constant(inst6000000E)
-// CHECK:STDOUT:       inst6000001D:    concrete_constant(inst6000000E)
-// CHECK:STDOUT:       inst6000001E:    concrete_constant(inst60000018)
-// CHECK:STDOUT:       inst6000001F:    concrete_constant(inst6000001F)
+// CHECK:STDOUT:       inst6000001C:    concrete_constant(inst6000001C)
+// CHECK:STDOUT:       inst6000001D:    concrete_constant(inst6000000F)
+// CHECK:STDOUT:       inst6000001E:    concrete_constant(inst6000000F)
+// CHECK:STDOUT:       inst6000001F:    concrete_constant(inst60000019)
 // CHECK:STDOUT:       inst60000020:    concrete_constant(inst60000020)
 // CHECK:STDOUT:       inst60000021:    concrete_constant(inst60000021)
-// CHECK:STDOUT:       inst60000023:    concrete_constant(inst6000000E)
-// CHECK:STDOUT:       inst60000026:    concrete_constant(inst60000028)
-// CHECK:STDOUT:       inst60000027:    concrete_constant(inst60000027)
+// CHECK:STDOUT:       inst60000022:    concrete_constant(inst60000022)
+// CHECK:STDOUT:       inst60000024:    concrete_constant(inst6000000F)
+// CHECK:STDOUT:       inst60000027:    concrete_constant(inst60000029)
 // CHECK:STDOUT:       inst60000028:    concrete_constant(inst60000028)
-// CHECK:STDOUT:       inst6000002A:    concrete_constant(inst60000010)
-// CHECK:STDOUT:       inst6000002D:    concrete_constant(inst60000010)
-// CHECK:STDOUT:       inst6000002E:    concrete_constant(inst60000010)
-// CHECK:STDOUT:       inst60000030:    concrete_constant(inst60000010)
-// CHECK:STDOUT:       inst60000031:    concrete_constant(inst60000010)
-// CHECK:STDOUT:       inst60000032:    concrete_constant(inst6000001A)
-// CHECK:STDOUT:       inst60000033:    concrete_constant(inst6000001A)
+// CHECK:STDOUT:       inst60000029:    concrete_constant(inst60000029)
+// CHECK:STDOUT:       inst6000002B:    concrete_constant(inst60000011)
+// CHECK:STDOUT:       inst6000002E:    concrete_constant(inst60000011)
+// CHECK:STDOUT:       inst6000002F:    concrete_constant(inst60000011)
+// CHECK:STDOUT:       inst60000031:    concrete_constant(inst60000011)
+// CHECK:STDOUT:       inst60000032:    concrete_constant(inst60000011)
+// CHECK:STDOUT:       inst60000033:    concrete_constant(inst6000001B)
+// CHECK:STDOUT:       inst60000034:    concrete_constant(inst6000001B)
 // CHECK:STDOUT:     symbolic_constants: {}
 // CHECK:STDOUT:   inst_blocks:
 // CHECK:STDOUT:     inst_block_empty: {}
 // CHECK:STDOUT:     exports:
-// CHECK:STDOUT:       0:               inst60000026
+// CHECK:STDOUT:       0:               inst60000027
 // CHECK:STDOUT:     imports:         {}
 // CHECK:STDOUT:     global_init:     {}
 // CHECK:STDOUT:     inst_block60000004:
-// CHECK:STDOUT:       0:               inst6000000F
-// CHECK:STDOUT:       1:               inst60000011
+// CHECK:STDOUT:       0:               inst60000010
+// CHECK:STDOUT:       1:               inst60000012
 // CHECK:STDOUT:     inst_block60000005:
-// CHECK:STDOUT:       0:               inst60000015
-// CHECK:STDOUT:     inst_block60000006:
 // CHECK:STDOUT:       0:               inst60000016
-// CHECK:STDOUT:       1:               inst60000017
+// CHECK:STDOUT:     inst_block60000006:
+// CHECK:STDOUT:       0:               inst60000017
+// CHECK:STDOUT:       1:               inst60000018
 // CHECK:STDOUT:     inst_block60000007:
-// CHECK:STDOUT:       0:               inst6000000E
-// CHECK:STDOUT:       1:               inst6000000E
+// CHECK:STDOUT:       0:               inst6000000F
+// CHECK:STDOUT:       1:               inst6000000F
 // CHECK:STDOUT:     inst_block60000008:
-// CHECK:STDOUT:       0:               inst60000010
-// CHECK:STDOUT:       1:               inst60000010
+// CHECK:STDOUT:       0:               inst60000011
+// CHECK:STDOUT:       1:               inst60000011
 // CHECK:STDOUT:     inst_block60000009:
-// CHECK:STDOUT:       0:               inst6000001C
-// CHECK:STDOUT:       1:               inst6000001D
+// CHECK:STDOUT:       0:               inst6000001D
+// CHECK:STDOUT:       1:               inst6000001E
 // CHECK:STDOUT:     inst_block6000000A:
-// CHECK:STDOUT:       0:               inst60000022
-// CHECK:STDOUT:       1:               inst60000024
+// CHECK:STDOUT:       0:               inst60000023
+// CHECK:STDOUT:       1:               inst60000025
 // CHECK:STDOUT:     inst_block6000000B:
-// CHECK:STDOUT:       0:               inst60000014
-// CHECK:STDOUT:       1:               inst60000015
-// CHECK:STDOUT:       2:               inst60000020
-// CHECK:STDOUT:       3:               inst60000021
+// CHECK:STDOUT:       0:               inst60000015
+// CHECK:STDOUT:       1:               inst60000016
+// CHECK:STDOUT:       2:               inst60000021
+// CHECK:STDOUT:       3:               inst60000022
 // CHECK:STDOUT:     inst_block6000000C:
-// CHECK:STDOUT:       0:               inst60000016
-// CHECK:STDOUT:       1:               inst60000017
-// CHECK:STDOUT:       2:               inst60000019
-// CHECK:STDOUT:       3:               inst6000001C
-// CHECK:STDOUT:       4:               inst6000001D
-// CHECK:STDOUT:       5:               inst6000001E
-// CHECK:STDOUT:       6:               inst60000022
-// CHECK:STDOUT:       7:               inst60000023
-// CHECK:STDOUT:       8:               inst60000012
-// CHECK:STDOUT:       9:               inst60000024
-// CHECK:STDOUT:       10:              inst60000025
+// CHECK:STDOUT:       0:               inst60000017
+// CHECK:STDOUT:       1:               inst60000018
+// CHECK:STDOUT:       2:               inst6000001A
+// CHECK:STDOUT:       3:               inst6000001D
+// CHECK:STDOUT:       4:               inst6000001E
+// CHECK:STDOUT:       5:               inst6000001F
+// CHECK:STDOUT:       6:               inst60000023
+// CHECK:STDOUT:       7:               inst60000024
+// CHECK:STDOUT:       8:               inst60000013
+// CHECK:STDOUT:       9:               inst60000025
+// CHECK:STDOUT:       10:              inst60000026
 // CHECK:STDOUT:     inst_block6000000D:
-// CHECK:STDOUT:       0:               inst60000029
-// CHECK:STDOUT:       1:               inst6000002A
-// CHECK:STDOUT:       2:               inst6000002B
-// CHECK:STDOUT:       3:               inst6000002C
-// CHECK:STDOUT:       4:               inst6000002D
-// CHECK:STDOUT:       5:               inst6000002E
-// CHECK:STDOUT:       6:               inst6000002F
-// CHECK:STDOUT:       7:               inst60000030
-// CHECK:STDOUT:       8:               inst60000031
-// CHECK:STDOUT:       9:               inst60000032
-// CHECK:STDOUT:       10:              inst60000033
-// CHECK:STDOUT:       11:              inst60000034
+// CHECK:STDOUT:       0:               inst6000002A
+// CHECK:STDOUT:       1:               inst6000002B
+// CHECK:STDOUT:       2:               inst6000002C
+// CHECK:STDOUT:       3:               inst6000002D
+// CHECK:STDOUT:       4:               inst6000002E
+// CHECK:STDOUT:       5:               inst6000002F
+// CHECK:STDOUT:       6:               inst60000030
+// CHECK:STDOUT:       7:               inst60000031
+// CHECK:STDOUT:       8:               inst60000032
+// CHECK:STDOUT:       9:               inst60000033
+// CHECK:STDOUT:       10:              inst60000034
+// CHECK:STDOUT:       11:              inst60000035
 // CHECK:STDOUT:     inst_block6000000E:
-// CHECK:STDOUT:       0:               inst60000029
-// CHECK:STDOUT:       1:               inst6000002A
+// CHECK:STDOUT:       0:               inst6000002A
+// CHECK:STDOUT:       1:               inst6000002B
 // CHECK:STDOUT:     inst_block6000000F: {}
 // CHECK:STDOUT:     inst_block60000010:
-// CHECK:STDOUT:       0:               inst6000002E
-// CHECK:STDOUT:       1:               inst60000031
+// CHECK:STDOUT:       0:               inst6000002F
+// CHECK:STDOUT:       1:               inst60000032
 // CHECK:STDOUT:     inst_block60000011:
-// CHECK:STDOUT:       0:               instD
-// CHECK:STDOUT:       1:               inst60000026
+// CHECK:STDOUT:       0:               instE
+// CHECK:STDOUT:       1:               inst60000027
 // CHECK:STDOUT: ...
 // CHECK:STDOUT: --- one_file_with_textual_ir.carbon
 // CHECK:STDOUT:

+ 9 - 5
toolchain/check/testdata/class/destroy_calls.carbon

@@ -369,6 +369,7 @@ fn G() { F({}); }
 // CHECK:STDOUT:   %Destroy.impl_witness.a59: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.bf8) [template]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.7d9: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.bf8) [template]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.76f: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.7d9 = struct_value () [template]
+// CHECK:STDOUT:   %.3ed: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.bf8) [template]
 // CHECK:STDOUT:   %Destroy.facet.a5b: %Destroy.type = facet_value %C.3f0, (%Destroy.impl_witness.a59) [template]
 // CHECK:STDOUT:   %.4c5: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.a5b [template]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.5e4: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.76f, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.bf8) [template]
@@ -376,10 +377,11 @@ fn G() { F({}); }
 // CHECK:STDOUT:   %pattern_type.99a: type = pattern_type %C.7a7 [concrete]
 // CHECK:STDOUT:   %facet_value.036: %type_where = facet_value %C.7a7, () [concrete]
 // CHECK:STDOUT:   %Destroy.impl_witness.8e7: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.036) [concrete]
-// CHECK:STDOUT:   %Destroy.facet.056: %Destroy.type = facet_value %C.7a7, (%Destroy.impl_witness.8e7) [concrete]
-// CHECK:STDOUT:   %.1c0: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.056 [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.c3a: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.036) [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.b3a: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.c3a = struct_value () [concrete]
+// CHECK:STDOUT:   %.8e4: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.036) [concrete]
+// CHECK:STDOUT:   %Destroy.facet.056: %Destroy.type = facet_value %C.7a7, (%Destroy.impl_witness.8e7) [concrete]
+// CHECK:STDOUT:   %.1c0: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.056 [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.a93: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.b3a, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.036) [concrete]
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
@@ -405,9 +407,10 @@ fn G() { F({}); }
 // CHECK:STDOUT:   %require_complete: <witness> = require_complete_type %C.loc7_13.2 [template = %require_complete (constants.%require_complete.c98)]
 // CHECK:STDOUT:   %pattern_type: type = pattern_type %C.loc7_13.2 [template = %pattern_type (constants.%pattern_type.06f)]
 // CHECK:STDOUT:   %facet_value: %type_where = facet_value %C.loc7_13.2, () [template = %facet_value (constants.%facet_value.bf8)]
+// CHECK:STDOUT:   %.loc7_3.1: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [template = %.loc7_3.1 (constants.%.3ed)]
 // CHECK:STDOUT:   %Destroy.impl_witness: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [template = %Destroy.impl_witness (constants.%Destroy.impl_witness.a59)]
 // CHECK:STDOUT:   %Destroy.facet: %Destroy.type = facet_value %C.loc7_13.2, (%Destroy.impl_witness) [template = %Destroy.facet (constants.%Destroy.facet.a5b)]
-// CHECK:STDOUT:   %.loc7_3: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [template = %.loc7_3 (constants.%.4c5)]
+// CHECK:STDOUT:   %.loc7_3.2: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [template = %.loc7_3.2 (constants.%.4c5)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [template = %DestroyT.binding.as_type.as.Destroy.impl.Op.type (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.7d9)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op: @F.%DestroyT.binding.as_type.as.Destroy.impl.Op.type (%DestroyT.binding.as_type.as.Destroy.impl.Op.type.7d9) = struct_value () [template = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.76f)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value) [template = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.5e4)]
@@ -425,7 +428,7 @@ fn G() { F({}); }
 // CHECK:STDOUT:       %C.loc7_13.1: type = class_type @C, @C(constants.%T) [template = %C.loc7_13.2 (constants.%C.3f0)]
 // CHECK:STDOUT:     }
 // CHECK:STDOUT:     %v: ref @F.%C.loc7_13.2 (%C.3f0) = ref_binding v, %v.var
-// CHECK:STDOUT:     %impl.elem0: @F.%.loc7_3 (%.4c5) = impl_witness_access constants.%Destroy.impl_witness.a59, element0 [template = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.76f)]
+// CHECK:STDOUT:     %impl.elem0: @F.%.loc7_3.2 (%.4c5) = impl_witness_access constants.%Destroy.impl_witness.a59, element0 [template = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.76f)]
 // CHECK:STDOUT:     %bound_method.loc7_3.1: <bound method> = bound_method %v.var, %impl.elem0
 // CHECK:STDOUT:     %specific_fn: <specific function> = specific_function %impl.elem0, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value.bf8) [template = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.5e4)]
 // CHECK:STDOUT:     %bound_method.loc7_3.2: <bound method> = bound_method %v.var, %specific_fn
@@ -446,9 +449,10 @@ fn G() { F({}); }
 // CHECK:STDOUT:   %require_complete => constants.%complete_type
 // CHECK:STDOUT:   %pattern_type => constants.%pattern_type.99a
 // CHECK:STDOUT:   %facet_value => constants.%facet_value.036
+// CHECK:STDOUT:   %.loc7_3.1 => constants.%.8e4
 // CHECK:STDOUT:   %Destroy.impl_witness => constants.%Destroy.impl_witness.8e7
 // CHECK:STDOUT:   %Destroy.facet => constants.%Destroy.facet.056
-// CHECK:STDOUT:   %.loc7_3 => constants.%.1c0
+// CHECK:STDOUT:   %.loc7_3.2 => constants.%.1c0
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.c3a
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.b3a
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.a93

+ 5 - 3
toolchain/check/testdata/class/generic/basic.carbon

@@ -61,6 +61,7 @@ class Declaration(T:! type);
 // CHECK:STDOUT:   %specific_impl_fn.103: <specific function> = specific_impl_function %impl.elem0.fac, @Copy.Op(%T.417) [symbolic]
 // CHECK:STDOUT:   %T.d9f: type = symbolic_binding T, 0 [symbolic]
 // CHECK:STDOUT:   %pattern_type.98f: type = pattern_type type [concrete]
+// CHECK:STDOUT:   %.d8a: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.binding.as_type) [symbolic]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness.34c: <witness> = lookup_impl_witness %ptr.d8c, @Copy [symbolic]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr.d8c, (%Copy.lookup_impl_witness.34c) [symbolic]
 // CHECK:STDOUT:   %.dba: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet [symbolic]
@@ -185,10 +186,11 @@ class Declaration(T:! type);
 // CHECK:STDOUT:   %require_complete.loc6_32: <witness> = require_complete_type %ptr.loc6_36.1 [symbolic = %require_complete.loc6_32 (constants.%require_complete.d1a)]
 // CHECK:STDOUT:   %require_complete.loc6_22: <witness> = require_complete_type %Class [symbolic = %require_complete.loc6_22 (constants.%require_complete.f79)]
 // CHECK:STDOUT:   %Class.elem: type = unbound_element_type %Class, %T.binding.as_type [symbolic = %Class.elem (constants.%Class.elem)]
+// CHECK:STDOUT:   %.loc7_12.2: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.binding.as_type) [symbolic = %.loc7_12.2 (constants.%.d8a)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr.loc6_36.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.34c)]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr.loc6_36.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet)]
-// CHECK:STDOUT:   %.loc7_12.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc7_12.2 (constants.%.dba)]
-// CHECK:STDOUT:   %impl.elem0.loc7_12.2: @Class.GetAddr.%.loc7_12.2 (%.dba) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc7_12.2 (constants.%impl.elem0.f88)]
+// CHECK:STDOUT:   %.loc7_12.3: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc7_12.3 (constants.%.dba)]
+// CHECK:STDOUT:   %impl.elem0.loc7_12.2: @Class.GetAddr.%.loc7_12.3 (%.dba) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc7_12.2 (constants.%impl.elem0.f88)]
 // CHECK:STDOUT:   %specific_impl_fn.loc7_12.2: <specific function> = specific_impl_function %impl.elem0.loc7_12.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc7_12.2 (constants.%specific_impl_fn.5e8)]
 // CHECK:STDOUT:
 // CHECK:STDOUT:   fn(%self.param: @Class.GetAddr.%Class (%Class)) -> @Class.GetAddr.%ptr.loc6_36.1 (%ptr.d8c) {
@@ -197,7 +199,7 @@ class Declaration(T:! type);
 // CHECK:STDOUT:     %k.ref: @Class.GetAddr.%Class.elem (%Class.elem) = name_ref k, @Class.%.loc14_8 [concrete = @Class.%.loc14_8]
 // CHECK:STDOUT:     %.loc7_17: ref @Class.GetAddr.%T.binding.as_type (%T.binding.as_type) = class_element_access %self.ref, element0
 // CHECK:STDOUT:     %addr: @Class.GetAddr.%ptr.loc6_36.1 (%ptr.d8c) = addr_of %.loc7_17
-// CHECK:STDOUT:     %impl.elem0.loc7_12.1: @Class.GetAddr.%.loc7_12.2 (%.dba) = impl_witness_access constants.%Copy.lookup_impl_witness.34c, element0 [symbolic = %impl.elem0.loc7_12.2 (constants.%impl.elem0.f88)]
+// CHECK:STDOUT:     %impl.elem0.loc7_12.1: @Class.GetAddr.%.loc7_12.3 (%.dba) = impl_witness_access constants.%Copy.lookup_impl_witness.34c, element0 [symbolic = %impl.elem0.loc7_12.2 (constants.%impl.elem0.f88)]
 // CHECK:STDOUT:     %bound_method.loc7_12.1: <bound method> = bound_method %addr, %impl.elem0.loc7_12.1
 // CHECK:STDOUT:     %specific_impl_fn.loc7_12.1: <specific function> = specific_impl_function %impl.elem0.loc7_12.1, @Copy.Op(constants.%Copy.facet) [symbolic = %specific_impl_fn.loc7_12.2 (constants.%specific_impl_fn.5e8)]
 // CHECK:STDOUT:     %bound_method.loc7_12.2: <bound method> = bound_method %addr, %specific_impl_fn.loc7_12.1

+ 4 - 2
toolchain/check/testdata/class/generic/init.carbon

@@ -82,6 +82,7 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 {
 // CHECK:STDOUT:   %Destroy.impl_witness.386: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.c52) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.555: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.c52) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.61a: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.555 = struct_value () [symbolic]
+// CHECK:STDOUT:   %.b57: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.c52) [symbolic]
 // CHECK:STDOUT:   %Destroy.facet.381: %Destroy.type = facet_value %Class.55f, (%Destroy.impl_witness.386) [symbolic]
 // CHECK:STDOUT:   %.ab9: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.381 [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.95f: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.61a, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.c52) [symbolic]
@@ -190,9 +191,10 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 {
 // CHECK:STDOUT:   %specific_impl_fn.loc10_27.2: <specific function> = specific_impl_function %impl.elem0.loc10_27.2, @Copy.Op(%T.loc9_26.1) [symbolic = %specific_impl_fn.loc10_27.2 (constants.%specific_impl_fn.103)]
 // CHECK:STDOUT:   %Class.elem: type = unbound_element_type %Class.loc10_17.2, %T.binding.as_type [symbolic = %Class.elem (constants.%Class.elem.4f3)]
 // CHECK:STDOUT:   %facet_value: %type_where = facet_value %Class.loc10_17.2, () [symbolic = %facet_value (constants.%facet_value.c52)]
+// CHECK:STDOUT:   %.loc10_3.2: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %.loc10_3.2 (constants.%.b57)]
 // CHECK:STDOUT:   %Destroy.impl_witness: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.386)]
 // CHECK:STDOUT:   %Destroy.facet: %Destroy.type = facet_value %Class.loc10_17.2, (%Destroy.impl_witness) [symbolic = %Destroy.facet (constants.%Destroy.facet.381)]
-// CHECK:STDOUT:   %.loc10_3.2: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc10_3.2 (constants.%.ab9)]
+// CHECK:STDOUT:   %.loc10_3.3: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc10_3.3 (constants.%.ab9)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.type (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.555)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op: @InitFromStructGeneric.%DestroyT.binding.as_type.as.Destroy.impl.Op.type (%DestroyT.binding.as_type.as.Destroy.impl.Op.type.555) = struct_value () [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.61a)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.95f)]
@@ -234,7 +236,7 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 {
 // CHECK:STDOUT:     %bound_method.loc11_11.2: <bound method> = bound_method %.loc11_11.2, %specific_impl_fn.loc11
 // CHECK:STDOUT:     %.loc9_47: ref @InitFromStructGeneric.%T.binding.as_type (%T.binding.as_type) = splice_block %return {}
 // CHECK:STDOUT:     %.loc11_11.3: init @InitFromStructGeneric.%T.binding.as_type (%T.binding.as_type) = call %bound_method.loc11_11.2(%.loc11_11.2) to %.loc9_47
-// CHECK:STDOUT:     %impl.elem0.loc10_3: @InitFromStructGeneric.%.loc10_3.2 (%.ab9) = impl_witness_access constants.%Destroy.impl_witness.386, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.61a)]
+// CHECK:STDOUT:     %impl.elem0.loc10_3: @InitFromStructGeneric.%.loc10_3.3 (%.ab9) = impl_witness_access constants.%Destroy.impl_witness.386, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.61a)]
 // CHECK:STDOUT:     %bound_method.loc10_3.1: <bound method> = bound_method %v.var, %impl.elem0.loc10_3
 // CHECK:STDOUT:     %specific_fn: <specific function> = specific_function %impl.elem0.loc10_3, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value.c52) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.95f)]
 // CHECK:STDOUT:     %bound_method.loc10_3.2: <bound method> = bound_method %v.var, %specific_fn

+ 8 - 4
toolchain/check/testdata/class/generic/member_access.carbon

@@ -89,6 +89,7 @@ fn StaticMemberFunctionCall(T:! type) -> Class(T) {
 // CHECK:STDOUT:   %T.d9f: type = symbolic_binding T, 0 [symbolic]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.type.75b: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.d9f) [symbolic]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.692: %ptr.as.Copy.impl.Op.type.75b = struct_value () [symbolic]
+// CHECK:STDOUT:   %.d8a: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.binding.as_type) [symbolic]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness.34c: <witness> = lookup_impl_witness %ptr.d8c, @Copy [symbolic]
 // CHECK:STDOUT:   %Copy.facet.89c: %Copy.type = facet_value %ptr.d8c, (%Copy.lookup_impl_witness.34c) [symbolic]
 // CHECK:STDOUT:   %.dba: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.89c [symbolic]
@@ -126,6 +127,7 @@ fn StaticMemberFunctionCall(T:! type) -> Class(T) {
 // CHECK:STDOUT:   %Copy.impl_witness.be3: <witness> = impl_witness imports.%Copy.impl_witness_table.67d, @ptr.as.Copy.impl(%i32) [concrete]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.type.d7c: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%i32) [concrete]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.687: %ptr.as.Copy.impl.Op.type.d7c = struct_value () [concrete]
+// CHECK:STDOUT:   %.b55: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%i32) [concrete]
 // CHECK:STDOUT:   %Copy.facet.687: %Copy.type = facet_value %ptr.235, (%Copy.impl_witness.be3) [concrete]
 // CHECK:STDOUT:   %.cbc: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.687 [concrete]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.specific_fn: <specific function> = specific_function %ptr.as.Copy.impl.Op.687, @ptr.as.Copy.impl.Op(%i32) [concrete]
@@ -191,10 +193,11 @@ fn StaticMemberFunctionCall(T:! type) -> Class(T) {
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   <elided>
 // CHECK:STDOUT:   %Class.elem: type = unbound_element_type %Class, %T.binding.as_type [symbolic = %Class.elem (constants.%Class.elem.bc9)]
+// CHECK:STDOUT:   %.loc15_12.2: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.binding.as_type) [symbolic = %.loc15_12.2 (constants.%.d8a)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr.loc13_36.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.34c)]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr.loc13_36.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.89c)]
-// CHECK:STDOUT:   %.loc15_12.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc15_12.2 (constants.%.dba)]
-// CHECK:STDOUT:   %impl.elem0.loc15_12.2: @Class.GetAddr.%.loc15_12.2 (%.dba) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc15_12.2 (constants.%impl.elem0.f88)]
+// CHECK:STDOUT:   %.loc15_12.3: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc15_12.3 (constants.%.dba)]
+// CHECK:STDOUT:   %impl.elem0.loc15_12.2: @Class.GetAddr.%.loc15_12.3 (%.dba) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc15_12.2 (constants.%impl.elem0.f88)]
 // CHECK:STDOUT:   %specific_impl_fn.loc15_12.2: <specific function> = specific_impl_function %impl.elem0.loc15_12.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc15_12.2 (constants.%specific_impl_fn.5e8)]
 // CHECK:STDOUT:
 // CHECK:STDOUT:   fn(%self.param: @Class.GetAddr.%Class (%Class.32e)) -> @Class.GetAddr.%ptr.loc13_36.1 (%ptr.d8c) {
@@ -203,7 +206,7 @@ fn StaticMemberFunctionCall(T:! type) -> Class(T) {
 // CHECK:STDOUT:     %x.ref: @Class.GetAddr.%Class.elem (%Class.elem.bc9) = name_ref x, @Class.%.loc5_8 [concrete = @Class.%.loc5_8]
 // CHECK:STDOUT:     %.loc15_17: ref @Class.GetAddr.%T.binding.as_type (%T.binding.as_type) = class_element_access %self.ref, element0
 // CHECK:STDOUT:     %addr: @Class.GetAddr.%ptr.loc13_36.1 (%ptr.d8c) = addr_of %.loc15_17
-// CHECK:STDOUT:     %impl.elem0.loc15_12.1: @Class.GetAddr.%.loc15_12.2 (%.dba) = impl_witness_access constants.%Copy.lookup_impl_witness.34c, element0 [symbolic = %impl.elem0.loc15_12.2 (constants.%impl.elem0.f88)]
+// CHECK:STDOUT:     %impl.elem0.loc15_12.1: @Class.GetAddr.%.loc15_12.3 (%.dba) = impl_witness_access constants.%Copy.lookup_impl_witness.34c, element0 [symbolic = %impl.elem0.loc15_12.2 (constants.%impl.elem0.f88)]
 // CHECK:STDOUT:     %bound_method.loc15_12.1: <bound method> = bound_method %addr, %impl.elem0.loc15_12.1
 // CHECK:STDOUT:     %specific_impl_fn.loc15_12.1: <specific function> = specific_impl_function %impl.elem0.loc15_12.1, @Copy.Op(constants.%Copy.facet.89c) [symbolic = %specific_impl_fn.loc15_12.2 (constants.%specific_impl_fn.5e8)]
 // CHECK:STDOUT:     %bound_method.loc15_12.2: <bound method> = bound_method %addr, %specific_impl_fn.loc15_12.1
@@ -338,9 +341,10 @@ fn StaticMemberFunctionCall(T:! type) -> Class(T) {
 // CHECK:STDOUT:   %require_complete.loc13_32 => constants.%complete_type.3d0
 // CHECK:STDOUT:   %require_complete.loc13_22 => constants.%complete_type.1ec
 // CHECK:STDOUT:   %Class.elem => constants.%Class.elem.ef0
+// CHECK:STDOUT:   %.loc15_12.2 => constants.%.b55
 // CHECK:STDOUT:   %Copy.lookup_impl_witness => constants.%Copy.impl_witness.be3
 // CHECK:STDOUT:   %Copy.facet => constants.%Copy.facet.687
-// CHECK:STDOUT:   %.loc15_12.2 => constants.%.cbc
+// CHECK:STDOUT:   %.loc15_12.3 => constants.%.cbc
 // CHECK:STDOUT:   %impl.elem0.loc15_12.2 => constants.%ptr.as.Copy.impl.Op.687
 // CHECK:STDOUT:   %specific_impl_fn.loc15_12.2 => constants.%ptr.as.Copy.impl.Op.specific_fn
 // CHECK:STDOUT: }

+ 8 - 4
toolchain/check/testdata/class/generic/member_type.carbon

@@ -440,6 +440,7 @@ fn Test() -> i32 {
 // CHECK:STDOUT:   %complete_type.357: <witness> = complete_type_witness %empty_struct_type [concrete]
 // CHECK:STDOUT:   %require_complete.4b7: <witness> = require_complete_type %T [symbolic]
 // CHECK:STDOUT:   %require_complete.a8f: <witness> = require_complete_type %C.52d [symbolic]
+// CHECK:STDOUT:   %.ec4: require_specific_def_type = require_specific_def @C.as.Inner.impl(%T) [symbolic]
 // CHECK:STDOUT:   %Inner.lookup_impl_witness: <witness> = lookup_impl_witness %C.52d, @Inner, @Inner(%T) [symbolic]
 // CHECK:STDOUT:   %Inner.facet.318: %Inner.type.5f4 = facet_value %C.52d, (%Inner.lookup_impl_witness) [symbolic]
 // CHECK:STDOUT:   %.b0e: type = fn_type_with_self_type %Inner.F.type.b25, %Inner.facet.318 [symbolic]
@@ -475,6 +476,7 @@ fn Test() -> i32 {
 // CHECK:STDOUT:   %Inner.impl_witness.f06: <witness> = impl_witness @C.%Inner.impl_witness_table, @C.as.Inner.impl(%i32) [concrete]
 // CHECK:STDOUT:   %C.as.Inner.impl.F.type.aa4: type = fn_type @C.as.Inner.impl.F, @C.as.Inner.impl(%i32) [concrete]
 // CHECK:STDOUT:   %C.as.Inner.impl.F.709: %C.as.Inner.impl.F.type.aa4 = struct_value () [concrete]
+// CHECK:STDOUT:   %.e9a: require_specific_def_type = require_specific_def @C.as.Inner.impl(%i32) [concrete]
 // CHECK:STDOUT:   %Inner.facet.98e: %Inner.type.56c = facet_value %C.70f, (%Inner.impl_witness.f06) [concrete]
 // CHECK:STDOUT:   %.3cd: type = fn_type_with_self_type %Inner.F.type.86e, %Inner.facet.98e [concrete]
 // CHECK:STDOUT:   %C.as.Inner.impl.F.specific_fn: <specific function> = specific_function %C.as.Inner.impl.F.709, @C.as.Inner.impl.F(%i32) [concrete]
@@ -713,11 +715,12 @@ fn Test() -> i32 {
 // CHECK:STDOUT:   %require_complete.loc11_48: <witness> = require_complete_type %Inner.type [symbolic = %require_complete.loc11_48 (constants.%require_complete.3ba)]
 // CHECK:STDOUT:   %Inner.assoc_type: type = assoc_entity_type @Inner, @Inner(%T) [symbolic = %Inner.assoc_type (constants.%Inner.assoc_type.b54)]
 // CHECK:STDOUT:   %assoc0: @C.as.Inner.impl.F.%Inner.assoc_type (%Inner.assoc_type.b54) = assoc_entity element0, @Inner.%Inner.F.decl [symbolic = %assoc0 (constants.%assoc0.dc7)]
+// CHECK:STDOUT:   %.loc11_41.1: require_specific_def_type = require_specific_def @C.as.Inner.impl(%T) [symbolic = %.loc11_41.1 (constants.%.ec4)]
 // CHECK:STDOUT:   %Inner.lookup_impl_witness: <witness> = lookup_impl_witness %C, @Inner, @Inner(%T) [symbolic = %Inner.lookup_impl_witness (constants.%Inner.lookup_impl_witness)]
 // CHECK:STDOUT:   %Inner.F.type: type = fn_type @Inner.F, @Inner(%T) [symbolic = %Inner.F.type (constants.%Inner.F.type.b25)]
 // CHECK:STDOUT:   %Inner.facet: @C.as.Inner.impl.F.%Inner.type (%Inner.type.5f4) = facet_value %C, (%Inner.lookup_impl_witness) [symbolic = %Inner.facet (constants.%Inner.facet.318)]
-// CHECK:STDOUT:   %.loc11_41: type = fn_type_with_self_type %Inner.F.type, %Inner.facet [symbolic = %.loc11_41 (constants.%.b0e)]
-// CHECK:STDOUT:   %impl.elem0.loc11_41.2: @C.as.Inner.impl.F.%.loc11_41 (%.b0e) = impl_witness_access %Inner.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc11_41.2 (constants.%impl.elem0)]
+// CHECK:STDOUT:   %.loc11_41.2: type = fn_type_with_self_type %Inner.F.type, %Inner.facet [symbolic = %.loc11_41.2 (constants.%.b0e)]
+// CHECK:STDOUT:   %impl.elem0.loc11_41.2: @C.as.Inner.impl.F.%.loc11_41.2 (%.b0e) = impl_witness_access %Inner.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc11_41.2 (constants.%impl.elem0)]
 // CHECK:STDOUT:   %specific_impl_fn.loc11_41.2: <specific function> = specific_impl_function %impl.elem0.loc11_41.2, @Inner.F(%T, %Inner.facet) [symbolic = %specific_impl_fn.loc11_41.2 (constants.%specific_impl_fn)]
 // CHECK:STDOUT:
 // CHECK:STDOUT:   fn(%self.param: @C.as.Inner.impl.F.%C (%C.52d)) -> %return.param: @C.as.Inner.impl.F.%T (%T) {
@@ -727,7 +730,7 @@ fn Test() -> i32 {
 // CHECK:STDOUT:     %Inner.ref: type = name_ref Inner, %.loc11_43 [symbolic = %Inner.type (constants.%Inner.type.5f4)]
 // CHECK:STDOUT:     %.loc11_48: @C.as.Inner.impl.F.%Inner.assoc_type (%Inner.assoc_type.b54) = specific_constant @Inner.%assoc0.loc6_28.1, @Inner(constants.%T) [symbolic = %assoc0 (constants.%assoc0.dc7)]
 // CHECK:STDOUT:     %F.ref: @C.as.Inner.impl.F.%Inner.assoc_type (%Inner.assoc_type.b54) = name_ref F, %.loc11_48 [symbolic = %assoc0 (constants.%assoc0.dc7)]
-// CHECK:STDOUT:     %impl.elem0.loc11_41.1: @C.as.Inner.impl.F.%.loc11_41 (%.b0e) = impl_witness_access constants.%Inner.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc11_41.2 (constants.%impl.elem0)]
+// CHECK:STDOUT:     %impl.elem0.loc11_41.1: @C.as.Inner.impl.F.%.loc11_41.2 (%.b0e) = impl_witness_access constants.%Inner.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc11_41.2 (constants.%impl.elem0)]
 // CHECK:STDOUT:     %bound_method.loc11_41: <bound method> = bound_method %self.ref, %impl.elem0.loc11_41.1
 // CHECK:STDOUT:     %specific_impl_fn.loc11_41.1: <specific function> = specific_impl_function %impl.elem0.loc11_41.1, @Inner.F(constants.%T, constants.%Inner.facet.318) [symbolic = %specific_impl_fn.loc11_41.2 (constants.%specific_impl_fn)]
 // CHECK:STDOUT:     %bound_method.loc11_52: <bound method> = bound_method %self.ref, %specific_impl_fn.loc11_41.1
@@ -907,10 +910,11 @@ fn Test() -> i32 {
 // CHECK:STDOUT:   %require_complete.loc11_48 => constants.%complete_type.619
 // CHECK:STDOUT:   %Inner.assoc_type => constants.%Inner.assoc_type.215
 // CHECK:STDOUT:   %assoc0 => constants.%assoc0.eba
+// CHECK:STDOUT:   %.loc11_41.1 => constants.%.e9a
 // CHECK:STDOUT:   %Inner.lookup_impl_witness => constants.%Inner.impl_witness.f06
 // CHECK:STDOUT:   %Inner.F.type => constants.%Inner.F.type.86e
 // CHECK:STDOUT:   %Inner.facet => constants.%Inner.facet.98e
-// CHECK:STDOUT:   %.loc11_41 => constants.%.3cd
+// CHECK:STDOUT:   %.loc11_41.2 => constants.%.3cd
 // CHECK:STDOUT:   %impl.elem0.loc11_41.2 => constants.%C.as.Inner.impl.F.709
 // CHECK:STDOUT:   %specific_impl_fn.loc11_41.2 => constants.%C.as.Inner.impl.F.specific_fn
 // CHECK:STDOUT: }

+ 5 - 3
toolchain/check/testdata/class/generic/self.carbon

@@ -58,6 +58,7 @@ class Class(T:! type) {
 // CHECK:STDOUT:   %Destroy.impl_witness.fd0: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.85d: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.47b: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.85d = struct_value () [symbolic]
+// CHECK:STDOUT:   %.5ac: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic]
 // CHECK:STDOUT:   %Destroy.facet: %Destroy.type = facet_value %Class, (%Destroy.impl_witness.fd0) [symbolic]
 // CHECK:STDOUT:   %.610: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.47b, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value) [symbolic]
@@ -182,9 +183,10 @@ class Class(T:! type) {
 // CHECK:STDOUT:   %Class.MakeClass: @Class.F.%Class.MakeClass.type (%Class.MakeClass.type) = struct_value () [symbolic = %Class.MakeClass (constants.%Class.MakeClass)]
 // CHECK:STDOUT:   %Class.MakeClass.specific_fn.loc22_19.2: <specific function> = specific_function %Class.MakeClass, @Class.MakeClass(%T) [symbolic = %Class.MakeClass.specific_fn.loc22_19.2 (constants.%Class.MakeClass.specific_fn)]
 // CHECK:STDOUT:   %facet_value: %type_where = facet_value %Class.loc21_19.2, () [symbolic = %facet_value (constants.%facet_value)]
+// CHECK:STDOUT:   %.loc22_5.2: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %.loc22_5.2 (constants.%.5ac)]
 // CHECK:STDOUT:   %Destroy.impl_witness: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.fd0)]
 // CHECK:STDOUT:   %Destroy.facet: %Destroy.type = facet_value %Class.loc21_19.2, (%Destroy.impl_witness) [symbolic = %Destroy.facet (constants.%Destroy.facet)]
-// CHECK:STDOUT:   %.loc22_5.2: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc22_5.2 (constants.%.610)]
+// CHECK:STDOUT:   %.loc22_5.3: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc22_5.3 (constants.%.610)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.type (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.85d)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op: @Class.F.%DestroyT.binding.as_type.as.Destroy.impl.Op.type (%DestroyT.binding.as_type.as.Destroy.impl.Op.type.85d) = struct_value () [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.47b)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn)]
@@ -224,12 +226,12 @@ class Class(T:! type) {
 // CHECK:STDOUT:       %Self.ref: type = name_ref Self, %.loc22_12.2 [symbolic = %Class.loc21_19.2 (constants.%Class)]
 // CHECK:STDOUT:     }
 // CHECK:STDOUT:     %s: ref @Class.F.%Class.loc21_19.2 (%Class) = ref_binding s, %s.var
-// CHECK:STDOUT:     %impl.elem0.loc22: @Class.F.%.loc22_5.2 (%.610) = impl_witness_access constants.%Destroy.impl_witness.fd0, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.47b)]
+// CHECK:STDOUT:     %impl.elem0.loc22: @Class.F.%.loc22_5.3 (%.610) = impl_witness_access constants.%Destroy.impl_witness.fd0, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.47b)]
 // CHECK:STDOUT:     %bound_method.loc22_5.1: <bound method> = bound_method %s.var, %impl.elem0.loc22
 // CHECK:STDOUT:     %specific_fn.loc22: <specific function> = specific_function %impl.elem0.loc22, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn)]
 // CHECK:STDOUT:     %bound_method.loc22_5.2: <bound method> = bound_method %s.var, %specific_fn.loc22
 // CHECK:STDOUT:     %DestroyT.binding.as_type.as.Destroy.impl.Op.call.loc22: init %empty_tuple.type = call %bound_method.loc22_5.2(%s.var)
-// CHECK:STDOUT:     %impl.elem0.loc21: @Class.F.%.loc22_5.2 (%.610) = impl_witness_access constants.%Destroy.impl_witness.fd0, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.47b)]
+// CHECK:STDOUT:     %impl.elem0.loc21: @Class.F.%.loc22_5.3 (%.610) = impl_witness_access constants.%Destroy.impl_witness.fd0, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.47b)]
 // CHECK:STDOUT:     %bound_method.loc21_5.1: <bound method> = bound_method %c.var, %impl.elem0.loc21
 // CHECK:STDOUT:     %specific_fn.loc21: <specific function> = specific_function %impl.elem0.loc21, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn)]
 // CHECK:STDOUT:     %bound_method.loc21_5.2: <bound method> = bound_method %c.var, %specific_fn.loc21

+ 16 - 8
toolchain/check/testdata/eval/aggregates.carbon

@@ -528,6 +528,7 @@ fn G(N:! i32) {
 // CHECK:STDOUT:   %Destroy.impl_witness.fed: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.f78) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.6fe: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.f78) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.440: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.6fe = struct_value () [symbolic]
+// CHECK:STDOUT:   %.83b: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.f78) [symbolic]
 // CHECK:STDOUT:   %Destroy.facet.d98: %Destroy.type = facet_value %array_type.297, (%Destroy.impl_witness.fed) [symbolic]
 // CHECK:STDOUT:   %.539: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.d98 [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.cd0: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.440, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.f78) [symbolic]
@@ -535,6 +536,7 @@ fn G(N:! i32) {
 // CHECK:STDOUT:   %Destroy.impl_witness.e1b: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.d02) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.722: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.d02) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.a8b: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.722 = struct_value () [symbolic]
+// CHECK:STDOUT:   %.76e: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.d02) [symbolic]
 // CHECK:STDOUT:   %Destroy.facet.1ca: %Destroy.type = facet_value %struct_type.a, (%Destroy.impl_witness.e1b) [symbolic]
 // CHECK:STDOUT:   %.506: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.1ca [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.df3: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.a8b, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.d02) [symbolic]
@@ -542,6 +544,7 @@ fn G(N:! i32) {
 // CHECK:STDOUT:   %Destroy.impl_witness.ef2: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.0f0) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.36c: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.0f0) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.2b6: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.36c = struct_value () [symbolic]
+// CHECK:STDOUT:   %.64b: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.0f0) [symbolic]
 // CHECK:STDOUT:   %Destroy.facet.ce6: %Destroy.type = facet_value %tuple.type.2d0, (%Destroy.impl_witness.ef2) [symbolic]
 // CHECK:STDOUT:   %.271: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.ce6 [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.e81: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.2b6, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.0f0) [symbolic]
@@ -569,6 +572,7 @@ fn G(N:! i32) {
 // CHECK:STDOUT:   %Destroy.impl_witness.db6: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.8c5) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.405: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.8c5) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.a68: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.405 = struct_value () [symbolic]
+// CHECK:STDOUT:   %.b21: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.8c5) [symbolic]
 // CHECK:STDOUT:   %Destroy.facet.bb1: %Destroy.type = facet_value %array_type.58c, (%Destroy.impl_witness.db6) [symbolic]
 // CHECK:STDOUT:   %.cc4: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.bb1 [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.695: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.a68, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.8c5) [symbolic]
@@ -598,23 +602,26 @@ fn G(N:! i32) {
 // CHECK:STDOUT:   %require_complete.loc8: <witness> = require_complete_type %array_type.loc8_20.2 [symbolic = %require_complete.loc8 (constants.%require_complete.e3e)]
 // CHECK:STDOUT:   %pattern_type.loc8: type = pattern_type %array_type.loc8_20.2 [symbolic = %pattern_type.loc8 (constants.%pattern_type.9a2)]
 // CHECK:STDOUT:   %facet_value.loc8: %type_where = facet_value %array_type.loc8_20.2, () [symbolic = %facet_value.loc8 (constants.%facet_value.f78)]
+// CHECK:STDOUT:   %.loc8_3.1: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.loc8) [symbolic = %.loc8_3.1 (constants.%.83b)]
 // CHECK:STDOUT:   %Destroy.impl_witness.loc8: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.loc8) [symbolic = %Destroy.impl_witness.loc8 (constants.%Destroy.impl_witness.fed)]
 // CHECK:STDOUT:   %Destroy.facet.loc8: %Destroy.type = facet_value %array_type.loc8_20.2, (%Destroy.impl_witness.loc8) [symbolic = %Destroy.facet.loc8 (constants.%Destroy.facet.d98)]
-// CHECK:STDOUT:   %.loc8_3: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet.loc8 [symbolic = %.loc8_3 (constants.%.539)]
+// CHECK:STDOUT:   %.loc8_3.2: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet.loc8 [symbolic = %.loc8_3.2 (constants.%.539)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.loc8: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.loc8) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.type.loc8 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.6fe)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.loc8: @F.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.loc8 (%DestroyT.binding.as_type.as.Destroy.impl.Op.type.6fe) = struct_value () [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.loc8 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.440)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.loc8: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.loc8, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.loc8) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.loc8 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.cd0)]
 // CHECK:STDOUT:   %facet_value.loc7: %type_where = facet_value %struct_type.a.loc7_16.2, () [symbolic = %facet_value.loc7 (constants.%facet_value.d02)]
+// CHECK:STDOUT:   %.loc7_3.1: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.loc7) [symbolic = %.loc7_3.1 (constants.%.76e)]
 // CHECK:STDOUT:   %Destroy.impl_witness.loc7: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.loc7) [symbolic = %Destroy.impl_witness.loc7 (constants.%Destroy.impl_witness.e1b)]
 // CHECK:STDOUT:   %Destroy.facet.loc7: %Destroy.type = facet_value %struct_type.a.loc7_16.2, (%Destroy.impl_witness.loc7) [symbolic = %Destroy.facet.loc7 (constants.%Destroy.facet.1ca)]
-// CHECK:STDOUT:   %.loc7_3: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet.loc7 [symbolic = %.loc7_3 (constants.%.506)]
+// CHECK:STDOUT:   %.loc7_3.2: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet.loc7 [symbolic = %.loc7_3.2 (constants.%.506)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.loc7: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.loc7) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.type.loc7 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.722)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.loc7: @F.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.loc7 (%DestroyT.binding.as_type.as.Destroy.impl.Op.type.722) = struct_value () [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.loc7 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.a8b)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.loc7: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.loc7, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.loc7) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.loc7 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.df3)]
 // CHECK:STDOUT:   %facet_value.loc6: %type_where = facet_value %tuple.type, () [symbolic = %facet_value.loc6 (constants.%facet_value.0f0)]
+// CHECK:STDOUT:   %.loc6_3.1: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.loc6) [symbolic = %.loc6_3.1 (constants.%.64b)]
 // CHECK:STDOUT:   %Destroy.impl_witness.loc6: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.loc6) [symbolic = %Destroy.impl_witness.loc6 (constants.%Destroy.impl_witness.ef2)]
 // CHECK:STDOUT:   %Destroy.facet.loc6: %Destroy.type = facet_value %tuple.type, (%Destroy.impl_witness.loc6) [symbolic = %Destroy.facet.loc6 (constants.%Destroy.facet.ce6)]
-// CHECK:STDOUT:   %.loc6_3: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet.loc6 [symbolic = %.loc6_3 (constants.%.271)]
+// CHECK:STDOUT:   %.loc6_3.2: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet.loc6 [symbolic = %.loc6_3.2 (constants.%.271)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.loc6: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.loc6) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.type.loc6 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.36c)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.loc6: @F.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.loc6 (%DestroyT.binding.as_type.as.Destroy.impl.Op.type.36c) = struct_value () [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.loc6 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.2b6)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.loc6: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.loc6, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.loc6) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.loc6 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.e81)]
@@ -656,17 +663,17 @@ fn G(N:! i32) {
 // CHECK:STDOUT:       %array_type.loc8_20.1: type = array_type %int_5, %T.ref.loc8 [symbolic = %array_type.loc8_20.2 (constants.%array_type.297)]
 // CHECK:STDOUT:     }
 // CHECK:STDOUT:     %w: ref @F.%array_type.loc8_20.2 (%array_type.297) = ref_binding w, %w.var
-// CHECK:STDOUT:     %impl.elem0.loc8: @F.%.loc8_3 (%.539) = impl_witness_access constants.%Destroy.impl_witness.fed, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.loc8 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.440)]
+// CHECK:STDOUT:     %impl.elem0.loc8: @F.%.loc8_3.2 (%.539) = impl_witness_access constants.%Destroy.impl_witness.fed, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.loc8 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.440)]
 // CHECK:STDOUT:     %bound_method.loc8_3.1: <bound method> = bound_method %w.var, %impl.elem0.loc8
 // CHECK:STDOUT:     %specific_fn.loc8: <specific function> = specific_function %impl.elem0.loc8, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value.f78) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.loc8 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.cd0)]
 // CHECK:STDOUT:     %bound_method.loc8_3.2: <bound method> = bound_method %w.var, %specific_fn.loc8
 // CHECK:STDOUT:     %DestroyT.binding.as_type.as.Destroy.impl.Op.call.loc8: init %empty_tuple.type = call %bound_method.loc8_3.2(%w.var)
-// CHECK:STDOUT:     %impl.elem0.loc7: @F.%.loc7_3 (%.506) = impl_witness_access constants.%Destroy.impl_witness.e1b, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.loc7 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.a8b)]
+// CHECK:STDOUT:     %impl.elem0.loc7: @F.%.loc7_3.2 (%.506) = impl_witness_access constants.%Destroy.impl_witness.e1b, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.loc7 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.a8b)]
 // CHECK:STDOUT:     %bound_method.loc7_3.1: <bound method> = bound_method %v.var, %impl.elem0.loc7
 // CHECK:STDOUT:     %specific_fn.loc7: <specific function> = specific_function %impl.elem0.loc7, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value.d02) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.loc7 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.df3)]
 // CHECK:STDOUT:     %bound_method.loc7_3.2: <bound method> = bound_method %v.var, %specific_fn.loc7
 // CHECK:STDOUT:     %DestroyT.binding.as_type.as.Destroy.impl.Op.call.loc7: init %empty_tuple.type = call %bound_method.loc7_3.2(%v.var)
-// CHECK:STDOUT:     %impl.elem0.loc6: @F.%.loc6_3 (%.271) = impl_witness_access constants.%Destroy.impl_witness.ef2, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.loc6 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.2b6)]
+// CHECK:STDOUT:     %impl.elem0.loc6: @F.%.loc6_3.2 (%.271) = impl_witness_access constants.%Destroy.impl_witness.ef2, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.loc6 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.2b6)]
 // CHECK:STDOUT:     %bound_method.loc6_3.1: <bound method> = bound_method %u.var, %impl.elem0.loc6
 // CHECK:STDOUT:     %specific_fn.loc6: <specific function> = specific_function %impl.elem0.loc6, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value.0f0) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.loc6 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.e81)]
 // CHECK:STDOUT:     %bound_method.loc6_3.2: <bound method> = bound_method %u.var, %specific_fn.loc6
@@ -686,9 +693,10 @@ fn G(N:! i32) {
 // CHECK:STDOUT:   %require_complete: <witness> = require_complete_type %array_type.loc14_22.2 [symbolic = %require_complete (constants.%require_complete.33a)]
 // CHECK:STDOUT:   %pattern_type: type = pattern_type %array_type.loc14_22.2 [symbolic = %pattern_type (constants.%pattern_type.e6c)]
 // CHECK:STDOUT:   %facet_value: %type_where = facet_value %array_type.loc14_22.2, () [symbolic = %facet_value (constants.%facet_value.8c5)]
+// CHECK:STDOUT:   %.loc14_3.1: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %.loc14_3.1 (constants.%.b21)]
 // CHECK:STDOUT:   %Destroy.impl_witness: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.db6)]
 // CHECK:STDOUT:   %Destroy.facet: %Destroy.type = facet_value %array_type.loc14_22.2, (%Destroy.impl_witness) [symbolic = %Destroy.facet (constants.%Destroy.facet.bb1)]
-// CHECK:STDOUT:   %.loc14_3: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc14_3 (constants.%.cc4)]
+// CHECK:STDOUT:   %.loc14_3.2: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc14_3.2 (constants.%.cc4)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.type (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.405)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op: @G.%DestroyT.binding.as_type.as.Destroy.impl.Op.type (%DestroyT.binding.as_type.as.Destroy.impl.Op.type.405) = struct_value () [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.a68)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.695)]
@@ -714,7 +722,7 @@ fn G(N:! i32) {
 // CHECK:STDOUT:       %array_type.loc14_22.1: type = array_type %.loc14_21.2, %i32.loc14 [symbolic = %array_type.loc14_22.2 (constants.%array_type.58c)]
 // CHECK:STDOUT:     }
 // CHECK:STDOUT:     %k: ref @G.%array_type.loc14_22.2 (%array_type.58c) = ref_binding k, %k.var
-// CHECK:STDOUT:     %impl.elem0.loc14_3: @G.%.loc14_3 (%.cc4) = impl_witness_access constants.%Destroy.impl_witness.db6, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.a68)]
+// CHECK:STDOUT:     %impl.elem0.loc14_3: @G.%.loc14_3.2 (%.cc4) = impl_witness_access constants.%Destroy.impl_witness.db6, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.a68)]
 // CHECK:STDOUT:     %bound_method.loc14_3.1: <bound method> = bound_method %k.var, %impl.elem0.loc14_3
 // CHECK:STDOUT:     %specific_fn.loc14_3: <specific function> = specific_function %impl.elem0.loc14_3, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value.8c5) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.695)]
 // CHECK:STDOUT:     %bound_method.loc14_3.2: <bound method> = bound_method %k.var, %specific_fn.loc14_3

+ 4 - 0
toolchain/check/testdata/facet/convert_facet_value_to_narrowed_facet_type.carbon

@@ -539,6 +539,7 @@ fn CallsWithTypeExplicit(U:! type) {
 // CHECK:STDOUT:   %Animal.lookup_impl_witness: <witness> = lookup_impl_witness %W, @Animal [symbolic]
 // CHECK:STDOUT:   %Animal.facet: %Animal.type = facet_value %W.binding.as_type, (%Animal.lookup_impl_witness) [symbolic]
 // CHECK:STDOUT:   %Eats.impl_witness.4bd: <witness> = impl_witness file.%Eats.impl_witness_table, @A.binding.as_type.as.Eats.impl(%Animal.facet) [symbolic]
+// CHECK:STDOUT:   %.16f: require_specific_def_type = require_specific_def @A.binding.as_type.as.Eats.impl(%Animal.facet) [symbolic]
 // CHECK:STDOUT:   %Eats.lookup_impl_witness: <witness> = lookup_impl_witness %W, @Eats [symbolic]
 // CHECK:STDOUT:   %Tame.lookup_impl_witness: <witness> = lookup_impl_witness %W, @Tame [symbolic]
 // CHECK:STDOUT:   %facet_value: %facet_type.807 = facet_value %W.binding.as_type, (%Eats.lookup_impl_witness, %Tame.lookup_impl_witness) [symbolic]
@@ -698,6 +699,9 @@ fn CallsWithTypeExplicit(U:! type) {
 // CHECK:STDOUT:
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %require_complete: <witness> = require_complete_type %W.binding.as_type [symbolic = %require_complete (constants.%require_complete.b58)]
+// CHECK:STDOUT:   %Animal.lookup_impl_witness: <witness> = lookup_impl_witness %W.loc11_22.1, @Animal [symbolic = %Animal.lookup_impl_witness (constants.%Animal.lookup_impl_witness)]
+// CHECK:STDOUT:   %Animal.facet: %Animal.type = facet_value %W.binding.as_type, (%Animal.lookup_impl_witness) [symbolic = %Animal.facet (constants.%Animal.facet)]
+// CHECK:STDOUT:   %.loc12_14.3: require_specific_def_type = require_specific_def @A.binding.as_type.as.Eats.impl(%Animal.facet) [symbolic = %.loc12_14.3 (constants.%.16f)]
 // CHECK:STDOUT:   %Eats.lookup_impl_witness: <witness> = lookup_impl_witness %W.loc11_22.1, @Eats [symbolic = %Eats.lookup_impl_witness (constants.%Eats.lookup_impl_witness)]
 // CHECK:STDOUT:   %Tame.lookup_impl_witness: <witness> = lookup_impl_witness %W.loc11_22.1, @Tame [symbolic = %Tame.lookup_impl_witness (constants.%Tame.lookup_impl_witness)]
 // CHECK:STDOUT:   %facet_value.loc12_14.3: %facet_type.807 = facet_value %W.binding.as_type, (%Eats.lookup_impl_witness, %Tame.lookup_impl_witness) [symbolic = %facet_value.loc12_14.3 (constants.%facet_value)]

+ 2 - 0
toolchain/check/testdata/facet/convert_facet_value_value_to_blanket_impl.carbon

@@ -49,6 +49,7 @@ fn HandleAnimal[T:! Animal](a: T) { Feed(a); }
 // CHECK:STDOUT:   %HandleAnimal: %HandleAnimal.type = struct_value () [concrete]
 // CHECK:STDOUT:   %require_complete.c0f: <witness> = require_complete_type %T.binding.as_type.5cd [symbolic]
 // CHECK:STDOUT:   %Eats.impl_witness.62c94e.2: <witness> = impl_witness file.%Eats.impl_witness_table, @A.binding.as_type.as.Eats.impl(%T.84c) [symbolic]
+// CHECK:STDOUT:   %.cd5: require_specific_def_type = require_specific_def @A.binding.as_type.as.Eats.impl(%T.84c) [symbolic]
 // CHECK:STDOUT:   %Eats.lookup_impl_witness: <witness> = lookup_impl_witness %T.84c, @Eats [symbolic]
 // CHECK:STDOUT:   %Eats.facet: %Eats.type = facet_value %T.binding.as_type.5cd, (%Eats.lookup_impl_witness) [symbolic]
 // CHECK:STDOUT:   %Feed.specific_fn: <specific function> = specific_function %Feed, @Feed(%Eats.facet) [symbolic]
@@ -179,6 +180,7 @@ fn HandleAnimal[T:! Animal](a: T) { Feed(a); }
 // CHECK:STDOUT:
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %require_complete: <witness> = require_complete_type %T.binding.as_type [symbolic = %require_complete (constants.%require_complete.c0f)]
+// CHECK:STDOUT:   %.loc22_43.3: require_specific_def_type = require_specific_def @A.binding.as_type.as.Eats.impl(%T.loc22_17.1) [symbolic = %.loc22_43.3 (constants.%.cd5)]
 // CHECK:STDOUT:   %Eats.lookup_impl_witness: <witness> = lookup_impl_witness %T.loc22_17.1, @Eats [symbolic = %Eats.lookup_impl_witness (constants.%Eats.lookup_impl_witness)]
 // CHECK:STDOUT:   %Eats.facet.loc22_43.3: %Eats.type = facet_value %T.binding.as_type, (%Eats.lookup_impl_witness) [symbolic = %Eats.facet.loc22_43.3 (constants.%Eats.facet)]
 // CHECK:STDOUT:   %Feed.specific_fn.loc22_37.2: <specific function> = specific_function constants.%Feed, @Feed(%Eats.facet.loc22_43.3) [symbolic = %Feed.specific_fn.loc22_37.2 (constants.%Feed.specific_fn)]

+ 12 - 8
toolchain/check/testdata/facet/convert_facet_value_value_to_generic_facet_value_value.carbon

@@ -93,6 +93,7 @@ fn F() {
 // CHECK:STDOUT:   %Eats.type.98f93b.2: type = facet_type <@Eats, @Eats(%Food.binding.as_type.86a)> [symbolic]
 // CHECK:STDOUT:   %require_complete.cc38c8.2: <witness> = require_complete_type %Eats.type.98f93b.2 [symbolic]
 // CHECK:STDOUT:   %Eats.impl_witness.42a0e2.2: <witness> = impl_witness file.%Eats.impl_witness_table, @T.binding.as_type.as.Eats.impl(%A, %Food.e7a) [symbolic]
+// CHECK:STDOUT:   %.f1a: require_specific_def_type = require_specific_def @T.binding.as_type.as.Eats.impl(%A, %Food.e7a) [symbolic]
 // CHECK:STDOUT:   %Eats.lookup_impl_witness: <witness> = lookup_impl_witness %A, @Eats, @Eats(%Food.binding.as_type.86a) [symbolic]
 // CHECK:STDOUT:   %Eats.facet.bda: %Eats.type.98f93b.2 = facet_value %A.binding.as_type, (%Eats.lookup_impl_witness) [symbolic]
 // CHECK:STDOUT:   %pattern_type.5a9: type = pattern_type %Eats.type.98f93b.2 [symbolic]
@@ -121,6 +122,7 @@ fn F() {
 // CHECK:STDOUT:   %Self.026: %Eats.type.cee = symbolic_binding Self, 1 [symbolic]
 // CHECK:STDOUT:   %complete_type.eba: <witness> = complete_type_witness %Eats.type.cee [concrete]
 // CHECK:STDOUT:   %Eats.impl_witness.7f7: <witness> = impl_witness file.%Eats.impl_witness_table, @T.binding.as_type.as.Eats.impl(%Animal.facet, %Edible.facet) [concrete]
+// CHECK:STDOUT:   %.8d1: require_specific_def_type = require_specific_def @T.binding.as_type.as.Eats.impl(%Animal.facet, %Edible.facet) [concrete]
 // CHECK:STDOUT:   %Eats.facet.179: %Eats.type.cee = facet_value %Goat, (%Eats.impl_witness.7f7) [concrete]
 // CHECK:STDOUT:   %pattern_type.cf8: type = pattern_type %Eats.type.cee [concrete]
 // CHECK:STDOUT:   %Feed.specific_fn.577: <specific function> = specific_function %Feed, @Feed(%Edible.facet, %Eats.facet.179) [concrete]
@@ -380,6 +382,7 @@ fn F() {
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %require_complete.loc32_45: <witness> = require_complete_type %A.binding.as_type [symbolic = %require_complete.loc32_45 (constants.%require_complete.c0f)]
 // CHECK:STDOUT:   %require_complete.loc32_54: <witness> = require_complete_type %Food.binding.as_type [symbolic = %require_complete.loc32_54 (constants.%require_complete.74d)]
+// CHECK:STDOUT:   %.loc32_76.4: require_specific_def_type = require_specific_def @T.binding.as_type.as.Eats.impl(%A.loc32_17.1, %Food.loc32_29.1) [symbolic = %.loc32_76.4 (constants.%.f1a)]
 // CHECK:STDOUT:   %Eats.lookup_impl_witness: <witness> = lookup_impl_witness %A.loc32_17.1, @Eats, @Eats(%Food.binding.as_type) [symbolic = %Eats.lookup_impl_witness (constants.%Eats.lookup_impl_witness)]
 // CHECK:STDOUT:   %Eats.type: type = facet_type <@Eats, @Eats(%Food.binding.as_type)> [symbolic = %Eats.type (constants.%Eats.type.98f93b.2)]
 // CHECK:STDOUT:   %Eats.facet.loc32_76.2: @HandleAnimal.%Eats.type (%Eats.type.98f93b.2) = facet_value %A.binding.as_type, (%Eats.lookup_impl_witness) [symbolic = %Eats.facet.loc32_76.2 (constants.%Eats.facet.bda)]
@@ -530,20 +533,13 @@ fn F() {
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %require_complete.loc32_45 => constants.%complete_type.357
 // CHECK:STDOUT:   %require_complete.loc32_54 => constants.%complete_type.357
+// CHECK:STDOUT:   %.loc32_76.4 => constants.%.8d1
 // CHECK:STDOUT:   %Eats.lookup_impl_witness => constants.%Eats.impl_witness.7f7
 // CHECK:STDOUT:   %Eats.type => constants.%Eats.type.cee
 // CHECK:STDOUT:   %Eats.facet.loc32_76.2 => constants.%Eats.facet.179
 // CHECK:STDOUT:   %Feed.specific_fn.loc32_64.2 => constants.%Feed.specific_fn.577
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
-// CHECK:STDOUT: specific @Eats(constants.%Grass) {
-// CHECK:STDOUT:   %Food.loc21_16.1 => constants.%Grass
-// CHECK:STDOUT:
-// CHECK:STDOUT: !definition:
-// CHECK:STDOUT:   %Eats.type => constants.%Eats.type.cee
-// CHECK:STDOUT:   %Self.loc21_29.2 => constants.%Self.026
-// CHECK:STDOUT: }
-// CHECK:STDOUT:
 // CHECK:STDOUT: specific @T.binding.as_type.as.Eats.impl(constants.%Animal.facet, constants.%Edible.facet) {
 // CHECK:STDOUT:   %T.loc26_14.2 => constants.%Animal.facet
 // CHECK:STDOUT:   %U.loc26_26.2 => constants.%Edible.facet
@@ -556,6 +552,14 @@ fn F() {
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
+// CHECK:STDOUT: specific @Eats(constants.%Grass) {
+// CHECK:STDOUT:   %Food.loc21_16.1 => constants.%Grass
+// CHECK:STDOUT:
+// CHECK:STDOUT: !definition:
+// CHECK:STDOUT:   %Eats.type => constants.%Eats.type.cee
+// CHECK:STDOUT:   %Self.loc21_29.2 => constants.%Self.026
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
 // CHECK:STDOUT: specific @Feed(constants.%Edible.facet, constants.%Eats.facet.179) {
 // CHECK:STDOUT:   %Food.loc31_9.1 => constants.%Edible.facet
 // CHECK:STDOUT:   %Food.binding.as_type => constants.%Grass

+ 63 - 33
toolchain/check/testdata/for/actual.carbon

@@ -84,6 +84,7 @@ fn Read() {
 // CHECK:STDOUT:   %require_complete.e66303.1: <witness> = require_complete_type %Int.b50e37.1 [symbolic]
 // CHECK:STDOUT:   %Int.as.Copy.impl.Op.type.24b: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic]
 // CHECK:STDOUT:   %Int.as.Copy.impl.Op.c95: %Int.as.Copy.impl.Op.type.24b = struct_value () [symbolic]
+// CHECK:STDOUT:   %.1a2: require_specific_def_type = require_specific_def @Int.as.Copy.impl(%N) [symbolic]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness.035: <witness> = lookup_impl_witness %Int.b50e37.1, @Copy [symbolic]
 // CHECK:STDOUT:   %Copy.facet.d3d: %Copy.type = facet_value %Int.b50e37.1, (%Copy.lookup_impl_witness.035) [symbolic]
 // CHECK:STDOUT:   %Iterate_where.type: type = facet_type <@Iterate where %impl.elem1.aba = %Int.b50e37.1 and %impl.elem0.0b5 = %Copy.facet.d3d> [symbolic]
@@ -107,6 +108,7 @@ fn Read() {
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.15c: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%DestroyT) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.fd5: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.15c = struct_value () [symbolic]
 // CHECK:STDOUT:   %Destroy.Op.type: type = fn_type @Destroy.Op [concrete]
+// CHECK:STDOUT:   %.833: require_specific_def_type = require_specific_def @T.binding.as_type.as.OptionalStorage.impl(%Copy.facet.d3d) [symbolic]
 // CHECK:STDOUT:   %OptionalStorage.lookup_impl_witness.8c6: <witness> = lookup_impl_witness %Int.b50e37.1, @OptionalStorage [symbolic]
 // CHECK:STDOUT:   %OptionalStorage.facet.ea4: %OptionalStorage.type = facet_value %Int.b50e37.1, (%OptionalStorage.lookup_impl_witness.8c6) [symbolic]
 // CHECK:STDOUT:   %Optional.23f: type = class_type @Optional, @Optional(%OptionalStorage.facet.ea4) [symbolic]
@@ -146,11 +148,13 @@ fn Read() {
 // CHECK:STDOUT:   %OrderedWith.impl_witness.586: <witness> = impl_witness imports.%OrderedWith.impl_witness_table.401, @Int.as.OrderedWith.impl.849(%N, %N) [symbolic]
 // CHECK:STDOUT:   %Int.as.OrderedWith.impl.Less.type.f52: type = fn_type @Int.as.OrderedWith.impl.Less.1, @Int.as.OrderedWith.impl.849(%N, %N) [symbolic]
 // CHECK:STDOUT:   %Int.as.OrderedWith.impl.Less.af3: %Int.as.OrderedWith.impl.Less.type.f52 = struct_value () [symbolic]
+// CHECK:STDOUT:   %.e09: require_specific_def_type = require_specific_def @Int.as.OrderedWith.impl.849(%N, %N) [symbolic]
 // CHECK:STDOUT:   %OrderedWith.facet: %OrderedWith.type.393 = facet_value %Int.b50e37.1, (%OrderedWith.impl_witness.586) [symbolic]
 // CHECK:STDOUT:   %.db5: type = fn_type_with_self_type %OrderedWith.Less.type.c6f, %OrderedWith.facet [symbolic]
 // CHECK:STDOUT:   %Int.as.OrderedWith.impl.Less.specific_fn.0ff: <specific function> = specific_function %Int.as.OrderedWith.impl.Less.af3, @Int.as.OrderedWith.impl.Less.1(%N, %N) [symbolic]
 // CHECK:STDOUT:   %Inc.type: type = facet_type <@Inc> [concrete]
 // CHECK:STDOUT:   %Inc.Op.type: type = fn_type @Inc.Op [concrete]
+// CHECK:STDOUT:   %.4ff: require_specific_def_type = require_specific_def @Int.as.Inc.impl(%N) [symbolic]
 // CHECK:STDOUT:   %Inc.lookup_impl_witness: <witness> = lookup_impl_witness %Int.b50e37.1, @Inc [symbolic]
 // CHECK:STDOUT:   %Inc.facet: %Inc.type = facet_value %Int.b50e37.1, (%Inc.lookup_impl_witness) [symbolic]
 // CHECK:STDOUT:   %.080: type = fn_type_with_self_type %Inc.Op.type, %Inc.facet [symbolic]
@@ -161,6 +165,7 @@ fn Read() {
 // CHECK:STDOUT:   %Destroy.impl_witness.b47: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.4a9) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.353: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.4a9) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.3be: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.353 = struct_value () [symbolic]
+// CHECK:STDOUT:   %.4d6: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.4a9) [symbolic]
 // CHECK:STDOUT:   %Destroy.facet.11d: %Destroy.type = facet_value %Int.b50e37.1, (%Destroy.impl_witness.b47) [symbolic]
 // CHECK:STDOUT:   %.a64: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.11d [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.e87: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.3be, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.4a9) [symbolic]
@@ -174,8 +179,12 @@ fn Read() {
 // CHECK:STDOUT:   %Range: %Range.type = struct_value () [concrete]
 // CHECK:STDOUT:   %IntRange.Make.type.cef: type = fn_type @IntRange.Make, @IntRange(%int_32) [concrete]
 // CHECK:STDOUT:   %IntRange.Make.0dc: %IntRange.Make.type.cef = struct_value () [concrete]
+// CHECK:STDOUT:   %Copy.impl_witness.fb7: <witness> = impl_witness imports.%Copy.impl_witness_table.b6a, @Int.as.Copy.impl(%int_32) [concrete]
+// CHECK:STDOUT:   %Int.as.Copy.impl.Op.type.469: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete]
+// CHECK:STDOUT:   %Int.as.Copy.impl.Op.dfd: %Int.as.Copy.impl.Op.type.469 = struct_value () [concrete]
 // CHECK:STDOUT:   %i32.builtin: type = int_type signed, %int_32 [concrete]
 // CHECK:STDOUT:   %complete_type.f8a: <witness> = complete_type_witness %i32.builtin [concrete]
+// CHECK:STDOUT:   %.1e9: require_specific_def_type = require_specific_def @Int.as.Copy.impl(%int_32) [concrete]
 // CHECK:STDOUT:   %IntRange.elem.e33: type = unbound_element_type %IntRange.365, %i32 [concrete]
 // CHECK:STDOUT:   %struct_type.start.end.d0a: type = struct_type {.start: %i32, .end: %i32} [concrete]
 // CHECK:STDOUT:   %complete_type.c45: <witness> = complete_type_witness %struct_type.start.end.d0a [concrete]
@@ -189,15 +198,12 @@ fn Read() {
 // CHECK:STDOUT:   %ImplicitAs.impl_witness.bc9: <witness> = impl_witness imports.%ImplicitAs.impl_witness_table.132, @Core.IntLiteral.as.ImplicitAs.impl(%int_32) [concrete]
 // CHECK:STDOUT:   %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.51e: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%int_32) [concrete]
 // CHECK:STDOUT:   %Core.IntLiteral.as.ImplicitAs.impl.Convert.e9b: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.51e = struct_value () [concrete]
-// CHECK:STDOUT:   %ImplicitAs.facet: %ImplicitAs.type.d14 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.bc9) [concrete]
-// CHECK:STDOUT:   %.322: type = fn_type_with_self_type %ImplicitAs.Convert.type.1b6, %ImplicitAs.facet [concrete]
+// CHECK:STDOUT:   %ImplicitAs.facet.3ad: %ImplicitAs.type.d14 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.bc9) [concrete]
+// CHECK:STDOUT:   %.322: type = fn_type_with_self_type %ImplicitAs.Convert.type.1b6, %ImplicitAs.facet.3ad [concrete]
 // CHECK:STDOUT:   %Core.IntLiteral.as.ImplicitAs.impl.Convert.bound: <bound method> = bound_method %int_0.5c6, %Core.IntLiteral.as.ImplicitAs.impl.Convert.e9b [concrete]
 // CHECK:STDOUT:   %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: <specific function> = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.e9b, @Core.IntLiteral.as.ImplicitAs.impl.Convert(%int_32) [concrete]
 // CHECK:STDOUT:   %bound_method: <bound method> = bound_method %int_0.5c6, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete]
 // CHECK:STDOUT:   %int_0.6a9: %i32 = int_value 0 [concrete]
-// CHECK:STDOUT:   %Copy.impl_witness.fb7: <witness> = impl_witness imports.%Copy.impl_witness_table.b6a, @Int.as.Copy.impl(%int_32) [concrete]
-// CHECK:STDOUT:   %Int.as.Copy.impl.Op.type.469: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%int_32) [concrete]
-// CHECK:STDOUT:   %Int.as.Copy.impl.Op.dfd: %Int.as.Copy.impl.Op.type.469 = struct_value () [concrete]
 // CHECK:STDOUT:   %Copy.facet.c50: %Copy.type = facet_value %i32, (%Copy.impl_witness.fb7) [concrete]
 // CHECK:STDOUT:   %.65f: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.c50 [concrete]
 // CHECK:STDOUT:   %Int.as.Copy.impl.Op.specific_fn: <specific function> = specific_function %Int.as.Copy.impl.Op.dfd, @Int.as.Copy.impl.Op(%int_32) [concrete]
@@ -294,6 +300,7 @@ fn Read() {
 // CHECK:STDOUT:   %N: Core.IntLiteral = symbolic_binding N, 0 [symbolic = %N (constants.%N)]
 // CHECK:STDOUT:   %IntRange: type = class_type @IntRange, @IntRange(%N) [symbolic = %IntRange (constants.%IntRange.48b)]
 // CHECK:STDOUT:   %Int.loc9_54.1: type = class_type @Int, @Int(%N) [symbolic = %Int.loc9_54.1 (constants.%Int.b50e37.1)]
+// CHECK:STDOUT:   %.loc9_85.1: require_specific_def_type = require_specific_def @Int.as.Copy.impl(%N) [symbolic = %.loc9_85.1 (constants.%.1a2)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %Int.loc9_54.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.035)]
 // CHECK:STDOUT:   %Copy.facet.loc9_85.1: %Copy.type = facet_value %Int.loc9_54.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet.loc9_85.1 (constants.%Copy.facet.d3d)]
 // CHECK:STDOUT:   %Iterate_where.type: type = facet_type <@Iterate where constants.%impl.elem1.aba = %Int.loc9_54.1 and constants.%impl.elem0.0b5 = %Copy.facet.loc9_85.1> [symbolic = %Iterate_where.type (constants.%Iterate_where.type)]
@@ -303,6 +310,7 @@ fn Read() {
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %IntRange.as.Iterate.impl.NewCursor.type: type = fn_type @IntRange.as.Iterate.impl.NewCursor, @IntRange.as.Iterate.impl(%N) [symbolic = %IntRange.as.Iterate.impl.NewCursor.type (constants.%IntRange.as.Iterate.impl.NewCursor.type)]
 // CHECK:STDOUT:   %IntRange.as.Iterate.impl.NewCursor: @IntRange.as.Iterate.impl.%IntRange.as.Iterate.impl.NewCursor.type (%IntRange.as.Iterate.impl.NewCursor.type) = struct_value () [symbolic = %IntRange.as.Iterate.impl.NewCursor (constants.%IntRange.as.Iterate.impl.NewCursor)]
+// CHECK:STDOUT:   %.loc11: require_specific_def_type = require_specific_def @T.binding.as_type.as.OptionalStorage.impl(%Copy.facet.loc9_85.1) [symbolic = %.loc11 (constants.%.833)]
 // CHECK:STDOUT:   %IntRange.as.Iterate.impl.Next.type: type = fn_type @IntRange.as.Iterate.impl.Next, @IntRange.as.Iterate.impl(%N) [symbolic = %IntRange.as.Iterate.impl.Next.type (constants.%IntRange.as.Iterate.impl.Next.type)]
 // CHECK:STDOUT:   %IntRange.as.Iterate.impl.Next: @IntRange.as.Iterate.impl.%IntRange.as.Iterate.impl.Next.type (%IntRange.as.Iterate.impl.Next.type) = struct_value () [symbolic = %IntRange.as.Iterate.impl.Next (constants.%IntRange.as.Iterate.impl.Next)]
 // CHECK:STDOUT:
@@ -341,7 +349,7 @@ fn Read() {
 // CHECK:STDOUT:       %N.ref.loc11_73: Core.IntLiteral = name_ref N, @IntRange.%N.loc4_16.2 [symbolic = %N (constants.%N)]
 // CHECK:STDOUT:       %Int.loc11_74: type = class_type @Int, @Int(constants.%N) [symbolic = %Int.loc11_43.1 (constants.%Int.b50e37.1)]
 // CHECK:STDOUT:       %OptionalStorage.facet.loc11_75.2: %OptionalStorage.type = facet_value %Int.loc11_74, (constants.%OptionalStorage.lookup_impl_witness.8c6) [symbolic = %OptionalStorage.facet.loc11_75.1 (constants.%OptionalStorage.facet.ea4)]
-// CHECK:STDOUT:       %.loc11_75: %OptionalStorage.type = converted %Int.loc11_74, %OptionalStorage.facet.loc11_75.2 [symbolic = %OptionalStorage.facet.loc11_75.1 (constants.%OptionalStorage.facet.ea4)]
+// CHECK:STDOUT:       %.loc11_75.2: %OptionalStorage.type = converted %Int.loc11_74, %OptionalStorage.facet.loc11_75.2 [symbolic = %OptionalStorage.facet.loc11_75.1 (constants.%OptionalStorage.facet.ea4)]
 // CHECK:STDOUT:       %Optional.loc11_75.2: type = class_type @Optional, @Optional(constants.%OptionalStorage.facet.ea4) [symbolic = %Optional.loc11_75.1 (constants.%Optional.23f)]
 // CHECK:STDOUT:       %self.param: @IntRange.as.Iterate.impl.Next.%IntRange (%IntRange.48b) = value_param call_param0
 // CHECK:STDOUT:       %.loc11_19.1: type = splice_block %Self.ref [symbolic = %IntRange (constants.%IntRange.48b)] {
@@ -376,6 +384,7 @@ fn Read() {
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %IntRange.Make.type: type = fn_type @IntRange.Make, @IntRange(%N.loc4_16.1) [symbolic = %IntRange.Make.type (constants.%IntRange.Make.type.121)]
 // CHECK:STDOUT:   %IntRange.Make: @IntRange.%IntRange.Make.type (%IntRange.Make.type.121) = struct_value () [symbolic = %IntRange.Make (constants.%IntRange.Make.14e)]
+// CHECK:STDOUT:   %.loc9: require_specific_def_type = require_specific_def @Int.as.Copy.impl(%N.loc4_16.1) [symbolic = %.loc9 (constants.%.1a2)]
 // CHECK:STDOUT:   %Int.loc22_32.2: type = class_type @Int, @Int(%N.loc4_16.1) [symbolic = %Int.loc22_32.2 (constants.%Int.b50e37.1)]
 // CHECK:STDOUT:   %require_complete: <witness> = require_complete_type %Int.loc22_32.2 [symbolic = %require_complete (constants.%require_complete.e66303.1)]
 // CHECK:STDOUT:   %IntRange: type = class_type @IntRange, @IntRange(%N.loc4_16.1) [symbolic = %IntRange (constants.%IntRange.48b)]
@@ -437,11 +446,11 @@ fn Read() {
 // CHECK:STDOUT:       %N.ref.loc9_84: Core.IntLiteral = name_ref N, @IntRange.%N.loc4_16.2 [symbolic = %N (constants.%N)]
 // CHECK:STDOUT:       %Int.loc9_85: type = class_type @Int, @Int(constants.%N) [symbolic = %Int.loc9_54.1 (constants.%Int.b50e37.1)]
 // CHECK:STDOUT:       %Copy.facet.loc9_85.2: %Copy.type = facet_value %Int.loc9_85, (constants.%Copy.lookup_impl_witness.035) [symbolic = %Copy.facet.loc9_85.1 (constants.%Copy.facet.d3d)]
-// CHECK:STDOUT:       %.loc9_85: %Copy.type = converted %Int.loc9_85, %Copy.facet.loc9_85.2 [symbolic = %Copy.facet.loc9_85.1 (constants.%Copy.facet.d3d)]
+// CHECK:STDOUT:       %.loc9_85.2: %Copy.type = converted %Int.loc9_85, %Copy.facet.loc9_85.2 [symbolic = %Copy.facet.loc9_85.1 (constants.%Copy.facet.d3d)]
 // CHECK:STDOUT:       %.loc9_24: type = where_expr %.Self [symbolic = %Iterate_where.type (constants.%Iterate_where.type)] {
 // CHECK:STDOUT:         requirement_base_facet_type constants.%Iterate.type
 // CHECK:STDOUT:         requirement_rewrite %impl.elem1, %Int.loc9_54.2
-// CHECK:STDOUT:         requirement_rewrite %impl.elem0, %.loc9_85
+// CHECK:STDOUT:         requirement_rewrite %impl.elem0, %.loc9_85.2
 // CHECK:STDOUT:       }
 // CHECK:STDOUT:     }
 // CHECK:STDOUT:     %Iterate.impl_witness_table = impl_witness_table (%impl_witness_assoc_constant.loc9_87.2, %impl_witness_assoc_constant.loc9_87.1, @IntRange.as.Iterate.impl.%IntRange.as.Iterate.impl.NewCursor.decl, @IntRange.as.Iterate.impl.%IntRange.as.Iterate.impl.Next.decl), @IntRange.as.Iterate.impl [concrete]
@@ -481,10 +490,11 @@ fn Read() {
 // CHECK:STDOUT:   %require_complete.loc5_49: <witness> = require_complete_type %IntRange [symbolic = %require_complete.loc5_49 (constants.%require_complete.b4c)]
 // CHECK:STDOUT:   %require_complete.loc5_16: <witness> = require_complete_type %Int.loc5_28.1 [symbolic = %require_complete.loc5_16 (constants.%require_complete.e66303.1)]
 // CHECK:STDOUT:   %struct_type.start.end: type = struct_type {.start: @IntRange.Make.%Int.loc5_28.1 (%Int.b50e37.1), .end: @IntRange.Make.%Int.loc5_28.1 (%Int.b50e37.1)} [symbolic = %struct_type.start.end (constants.%struct_type.start.end.cb5)]
+// CHECK:STDOUT:   %.loc6_22.2: require_specific_def_type = require_specific_def @Int.as.Copy.impl(%N) [symbolic = %.loc6_22.2 (constants.%.1a2)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %Int.loc5_28.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.035)]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %Int.loc5_28.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.d3d)]
-// CHECK:STDOUT:   %.loc6_22.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc6_22.2 (constants.%.20c)]
-// CHECK:STDOUT:   %impl.elem0.loc6_22.2: @IntRange.Make.%.loc6_22.2 (%.20c) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc6_22.2 (constants.%impl.elem0.625)]
+// CHECK:STDOUT:   %.loc6_22.3: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc6_22.3 (constants.%.20c)]
+// CHECK:STDOUT:   %impl.elem0.loc6_22.2: @IntRange.Make.%.loc6_22.3 (%.20c) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc6_22.2 (constants.%impl.elem0.625)]
 // CHECK:STDOUT:   %specific_impl_fn.loc6_22.2: <specific function> = specific_impl_function %impl.elem0.loc6_22.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc6_22.2 (constants.%specific_impl_fn.c88)]
 // CHECK:STDOUT:
 // CHECK:STDOUT:   fn(%start.param: @IntRange.Make.%Int.loc5_28.1 (%Int.b50e37.1), %end.param: @IntRange.Make.%Int.loc5_28.1 (%Int.b50e37.1)) -> %return.param: @IntRange.Make.%IntRange (%IntRange.48b) {
@@ -492,14 +502,14 @@ fn Read() {
 // CHECK:STDOUT:     %start.ref: @IntRange.Make.%Int.loc5_28.1 (%Int.b50e37.1) = name_ref start, %start
 // CHECK:STDOUT:     %end.ref: @IntRange.Make.%Int.loc5_28.1 (%Int.b50e37.1) = name_ref end, %end
 // CHECK:STDOUT:     %.loc6_39.1: @IntRange.Make.%struct_type.start.end (%struct_type.start.end.cb5) = struct_literal (%start.ref, %end.ref)
-// CHECK:STDOUT:     %impl.elem0.loc6_22.1: @IntRange.Make.%.loc6_22.2 (%.20c) = impl_witness_access constants.%Copy.lookup_impl_witness.035, element0 [symbolic = %impl.elem0.loc6_22.2 (constants.%impl.elem0.625)]
+// CHECK:STDOUT:     %impl.elem0.loc6_22.1: @IntRange.Make.%.loc6_22.3 (%.20c) = impl_witness_access constants.%Copy.lookup_impl_witness.035, element0 [symbolic = %impl.elem0.loc6_22.2 (constants.%impl.elem0.625)]
 // CHECK:STDOUT:     %bound_method.loc6_22.1: <bound method> = bound_method %start.ref, %impl.elem0.loc6_22.1
 // CHECK:STDOUT:     %specific_impl_fn.loc6_22.1: <specific function> = specific_impl_function %impl.elem0.loc6_22.1, @Copy.Op(constants.%Copy.facet.d3d) [symbolic = %specific_impl_fn.loc6_22.2 (constants.%specific_impl_fn.c88)]
 // CHECK:STDOUT:     %bound_method.loc6_22.2: <bound method> = bound_method %start.ref, %specific_impl_fn.loc6_22.1
 // CHECK:STDOUT:     %.loc6_22.1: init @IntRange.Make.%Int.loc5_28.1 (%Int.b50e37.1) = call %bound_method.loc6_22.2(%start.ref)
 // CHECK:STDOUT:     %.loc6_39.2: ref @IntRange.Make.%Int.loc5_28.1 (%Int.b50e37.1) = class_element_access %return, element0
 // CHECK:STDOUT:     %.loc6_39.3: init @IntRange.Make.%Int.loc5_28.1 (%Int.b50e37.1) = initialize_from %.loc6_22.1 to %.loc6_39.2
-// CHECK:STDOUT:     %impl.elem0.loc6_36: @IntRange.Make.%.loc6_22.2 (%.20c) = impl_witness_access constants.%Copy.lookup_impl_witness.035, element0 [symbolic = %impl.elem0.loc6_22.2 (constants.%impl.elem0.625)]
+// CHECK:STDOUT:     %impl.elem0.loc6_36: @IntRange.Make.%.loc6_22.3 (%.20c) = impl_witness_access constants.%Copy.lookup_impl_witness.035, element0 [symbolic = %impl.elem0.loc6_22.2 (constants.%impl.elem0.625)]
 // CHECK:STDOUT:     %bound_method.loc6_36.1: <bound method> = bound_method %end.ref, %impl.elem0.loc6_36
 // CHECK:STDOUT:     %specific_impl_fn.loc6_36: <specific function> = specific_impl_function %impl.elem0.loc6_36, @Copy.Op(constants.%Copy.facet.d3d) [symbolic = %specific_impl_fn.loc6_22.2 (constants.%specific_impl_fn.c88)]
 // CHECK:STDOUT:     %bound_method.loc6_36.2: <bound method> = bound_method %end.ref, %specific_impl_fn.loc6_36
@@ -523,10 +533,11 @@ fn Read() {
 // CHECK:STDOUT:   %require_complete.loc10_22: <witness> = require_complete_type %IntRange [symbolic = %require_complete.loc10_22 (constants.%require_complete.b4c)]
 // CHECK:STDOUT:   %IntRange.elem: type = unbound_element_type %IntRange, %Int.loc10_45.1 [symbolic = %IntRange.elem (constants.%IntRange.elem.baf)]
 // CHECK:STDOUT:   %require_complete.loc10_60: <witness> = require_complete_type %Int.loc10_45.1 [symbolic = %require_complete.loc10_60 (constants.%require_complete.e66303.1)]
+// CHECK:STDOUT:   %.loc10_60.4: require_specific_def_type = require_specific_def @Int.as.Copy.impl(%N) [symbolic = %.loc10_60.4 (constants.%.1a2)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %Int.loc10_45.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.035)]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %Int.loc10_45.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.d3d)]
-// CHECK:STDOUT:   %.loc10_60.4: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc10_60.4 (constants.%.20c)]
-// CHECK:STDOUT:   %impl.elem0.loc10_60.2: @IntRange.as.Iterate.impl.NewCursor.%.loc10_60.4 (%.20c) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc10_60.2 (constants.%impl.elem0.625)]
+// CHECK:STDOUT:   %.loc10_60.5: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc10_60.5 (constants.%.20c)]
+// CHECK:STDOUT:   %impl.elem0.loc10_60.2: @IntRange.as.Iterate.impl.NewCursor.%.loc10_60.5 (%.20c) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc10_60.2 (constants.%impl.elem0.625)]
 // CHECK:STDOUT:   %specific_impl_fn.loc10_60.2: <specific function> = specific_impl_function %impl.elem0.loc10_60.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc10_60.2 (constants.%specific_impl_fn.c88)]
 // CHECK:STDOUT:
 // CHECK:STDOUT:   fn(%self.param: @IntRange.as.Iterate.impl.NewCursor.%IntRange (%IntRange.48b)) -> @IntRange.as.Iterate.impl.NewCursor.%Int.loc10_45.1 (%Int.b50e37.1) {
@@ -535,7 +546,7 @@ fn Read() {
 // CHECK:STDOUT:     %start.ref: @IntRange.as.Iterate.impl.NewCursor.%IntRange.elem (%IntRange.elem.baf) = name_ref start, @IntRange.%.loc22 [concrete = @IntRange.%.loc22]
 // CHECK:STDOUT:     %.loc10_60.1: ref @IntRange.as.Iterate.impl.NewCursor.%Int.loc10_45.1 (%Int.b50e37.1) = class_element_access %self.ref, element0
 // CHECK:STDOUT:     %.loc10_60.2: @IntRange.as.Iterate.impl.NewCursor.%Int.loc10_45.1 (%Int.b50e37.1) = acquire_value %.loc10_60.1
-// CHECK:STDOUT:     %impl.elem0.loc10_60.1: @IntRange.as.Iterate.impl.NewCursor.%.loc10_60.4 (%.20c) = impl_witness_access constants.%Copy.lookup_impl_witness.035, element0 [symbolic = %impl.elem0.loc10_60.2 (constants.%impl.elem0.625)]
+// CHECK:STDOUT:     %impl.elem0.loc10_60.1: @IntRange.as.Iterate.impl.NewCursor.%.loc10_60.5 (%.20c) = impl_witness_access constants.%Copy.lookup_impl_witness.035, element0 [symbolic = %impl.elem0.loc10_60.2 (constants.%impl.elem0.625)]
 // CHECK:STDOUT:     %bound_method.loc10_60.1: <bound method> = bound_method %.loc10_60.2, %impl.elem0.loc10_60.1
 // CHECK:STDOUT:     %specific_impl_fn.loc10_60.1: <specific function> = specific_impl_function %impl.elem0.loc10_60.1, @Copy.Op(constants.%Copy.facet.d3d) [symbolic = %specific_impl_fn.loc10_60.2 (constants.%specific_impl_fn.c88)]
 // CHECK:STDOUT:     %bound_method.loc10_60.2: <bound method> = bound_method %.loc10_60.2, %specific_impl_fn.loc10_60.1
@@ -551,6 +562,9 @@ fn Read() {
 // CHECK:STDOUT:   %Int.loc11_43.1: type = class_type @Int, @Int(%N) [symbolic = %Int.loc11_43.1 (constants.%Int.b50e37.1)]
 // CHECK:STDOUT:   %ptr.loc11_44.1: type = ptr_type %Int.loc11_43.1 [symbolic = %ptr.loc11_44.1 (constants.%ptr.1cf)]
 // CHECK:STDOUT:   %pattern_type.loc11_25: type = pattern_type %ptr.loc11_44.1 [symbolic = %pattern_type.loc11_25 (constants.%pattern_type.054)]
+// CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %Int.loc11_43.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.035)]
+// CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %Int.loc11_43.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.d3d)]
+// CHECK:STDOUT:   %.loc11_75.1: require_specific_def_type = require_specific_def @T.binding.as_type.as.OptionalStorage.impl(%Copy.facet) [symbolic = %.loc11_75.1 (constants.%.833)]
 // CHECK:STDOUT:   %OptionalStorage.lookup_impl_witness: <witness> = lookup_impl_witness %Int.loc11_43.1, @OptionalStorage [symbolic = %OptionalStorage.lookup_impl_witness (constants.%OptionalStorage.lookup_impl_witness.8c6)]
 // CHECK:STDOUT:   %OptionalStorage.facet.loc11_75.1: %OptionalStorage.type = facet_value %Int.loc11_43.1, (%OptionalStorage.lookup_impl_witness) [symbolic = %OptionalStorage.facet.loc11_75.1 (constants.%OptionalStorage.facet.ea4)]
 // CHECK:STDOUT:   %Optional.loc11_75.1: type = class_type @Optional, @Optional(%OptionalStorage.facet.loc11_75.1) [symbolic = %Optional.loc11_75.1 (constants.%Optional.23f)]
@@ -562,35 +576,37 @@ fn Read() {
 // CHECK:STDOUT:   %require_complete.loc11_31: <witness> = require_complete_type %ptr.loc11_44.1 [symbolic = %require_complete.loc11_31 (constants.%require_complete.6ca)]
 // CHECK:STDOUT:   %require_complete.loc12: <witness> = require_complete_type %Int.loc11_43.1 [symbolic = %require_complete.loc12 (constants.%require_complete.e66303.1)]
 // CHECK:STDOUT:   %pattern_type.loc12: type = pattern_type %Int.loc11_43.1 [symbolic = %pattern_type.loc12 (constants.%pattern_type.60f8e7.1)]
-// CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %Int.loc11_43.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.035)]
-// CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %Int.loc11_43.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.d3d)]
-// CHECK:STDOUT:   %.loc12_32.4: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc12_32.4 (constants.%.20c)]
-// CHECK:STDOUT:   %impl.elem0.loc12_32.2: @IntRange.as.Iterate.impl.Next.%.loc12_32.4 (%.20c) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc12_32.2 (constants.%impl.elem0.625)]
+// CHECK:STDOUT:   %.loc12_32.4: require_specific_def_type = require_specific_def @Int.as.Copy.impl(%N) [symbolic = %.loc12_32.4 (constants.%.1a2)]
+// CHECK:STDOUT:   %.loc12_32.5: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc12_32.5 (constants.%.20c)]
+// CHECK:STDOUT:   %impl.elem0.loc12_32.2: @IntRange.as.Iterate.impl.Next.%.loc12_32.5 (%.20c) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc12_32.2 (constants.%impl.elem0.625)]
 // CHECK:STDOUT:   %specific_impl_fn.loc12_32.2: <specific function> = specific_impl_function %impl.elem0.loc12_32.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc12_32.2 (constants.%specific_impl_fn.c88)]
 // CHECK:STDOUT:   %IntRange.elem: type = unbound_element_type %IntRange, %Int.loc11_43.1 [symbolic = %IntRange.elem (constants.%IntRange.elem.baf)]
 // CHECK:STDOUT:   %OrderedWith.type.loc13_17.2: type = facet_type <@OrderedWith, @OrderedWith(%Int.loc11_43.1)> [symbolic = %OrderedWith.type.loc13_17.2 (constants.%OrderedWith.type.393)]
 // CHECK:STDOUT:   %require_complete.loc13: <witness> = require_complete_type %OrderedWith.type.loc13_17.2 [symbolic = %require_complete.loc13 (constants.%require_complete.4f7)]
 // CHECK:STDOUT:   %OrderedWith.assoc_type: type = assoc_entity_type @OrderedWith, @OrderedWith(%Int.loc11_43.1) [symbolic = %OrderedWith.assoc_type (constants.%OrderedWith.assoc_type.72a)]
 // CHECK:STDOUT:   %assoc0: @IntRange.as.Iterate.impl.Next.%OrderedWith.assoc_type (%OrderedWith.assoc_type.72a) = assoc_entity element0, imports.%Core.import_ref.02d [symbolic = %assoc0 (constants.%assoc0.3f6)]
+// CHECK:STDOUT:   %.loc13_17.2: require_specific_def_type = require_specific_def @Int.as.OrderedWith.impl.849(%N, %N) [symbolic = %.loc13_17.2 (constants.%.e09)]
 // CHECK:STDOUT:   %OrderedWith.impl_witness: <witness> = impl_witness imports.%OrderedWith.impl_witness_table.401, @Int.as.OrderedWith.impl.849(%N, %N) [symbolic = %OrderedWith.impl_witness (constants.%OrderedWith.impl_witness.586)]
 // CHECK:STDOUT:   %OrderedWith.Less.type: type = fn_type @OrderedWith.Less, @OrderedWith(%Int.loc11_43.1) [symbolic = %OrderedWith.Less.type (constants.%OrderedWith.Less.type.c6f)]
 // CHECK:STDOUT:   %OrderedWith.facet: @IntRange.as.Iterate.impl.Next.%OrderedWith.type.loc13_17.2 (%OrderedWith.type.393) = facet_value %Int.loc11_43.1, (%OrderedWith.impl_witness) [symbolic = %OrderedWith.facet (constants.%OrderedWith.facet)]
-// CHECK:STDOUT:   %.loc13_17.2: type = fn_type_with_self_type %OrderedWith.Less.type, %OrderedWith.facet [symbolic = %.loc13_17.2 (constants.%.db5)]
+// CHECK:STDOUT:   %.loc13_17.3: type = fn_type_with_self_type %OrderedWith.Less.type, %OrderedWith.facet [symbolic = %.loc13_17.3 (constants.%.db5)]
 // CHECK:STDOUT:   %Int.as.OrderedWith.impl.Less.type: type = fn_type @Int.as.OrderedWith.impl.Less.1, @Int.as.OrderedWith.impl.849(%N, %N) [symbolic = %Int.as.OrderedWith.impl.Less.type (constants.%Int.as.OrderedWith.impl.Less.type.f52)]
 // CHECK:STDOUT:   %Int.as.OrderedWith.impl.Less: @IntRange.as.Iterate.impl.Next.%Int.as.OrderedWith.impl.Less.type (%Int.as.OrderedWith.impl.Less.type.f52) = struct_value () [symbolic = %Int.as.OrderedWith.impl.Less (constants.%Int.as.OrderedWith.impl.Less.af3)]
 // CHECK:STDOUT:   %Int.as.OrderedWith.impl.Less.specific_fn: <specific function> = specific_function %Int.as.OrderedWith.impl.Less, @Int.as.OrderedWith.impl.Less.1(%N, %N) [symbolic = %Int.as.OrderedWith.impl.Less.specific_fn (constants.%Int.as.OrderedWith.impl.Less.specific_fn.0ff)]
+// CHECK:STDOUT:   %.loc14_9.2: require_specific_def_type = require_specific_def @Int.as.Inc.impl(%N) [symbolic = %.loc14_9.2 (constants.%.4ff)]
 // CHECK:STDOUT:   %Inc.lookup_impl_witness: <witness> = lookup_impl_witness %Int.loc11_43.1, @Inc [symbolic = %Inc.lookup_impl_witness (constants.%Inc.lookup_impl_witness)]
 // CHECK:STDOUT:   %Inc.facet: %Inc.type = facet_value %Int.loc11_43.1, (%Inc.lookup_impl_witness) [symbolic = %Inc.facet (constants.%Inc.facet)]
-// CHECK:STDOUT:   %.loc14_9.2: type = fn_type_with_self_type constants.%Inc.Op.type, %Inc.facet [symbolic = %.loc14_9.2 (constants.%.080)]
-// CHECK:STDOUT:   %impl.elem0.loc14_9.2: @IntRange.as.Iterate.impl.Next.%.loc14_9.2 (%.080) = impl_witness_access %Inc.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc14_9.2 (constants.%impl.elem0.923)]
+// CHECK:STDOUT:   %.loc14_9.3: type = fn_type_with_self_type constants.%Inc.Op.type, %Inc.facet [symbolic = %.loc14_9.3 (constants.%.080)]
+// CHECK:STDOUT:   %impl.elem0.loc14_9.2: @IntRange.as.Iterate.impl.Next.%.loc14_9.3 (%.080) = impl_witness_access %Inc.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc14_9.2 (constants.%impl.elem0.923)]
 // CHECK:STDOUT:   %specific_impl_fn.loc14_9.2: <specific function> = specific_impl_function %impl.elem0.loc14_9.2, @Inc.Op(%Inc.facet) [symbolic = %specific_impl_fn.loc14_9.2 (constants.%specific_impl_fn.173)]
 // CHECK:STDOUT:   %Optional.Some.type: type = fn_type @Optional.Some, @Optional(%OptionalStorage.facet.loc11_75.1) [symbolic = %Optional.Some.type (constants.%Optional.Some.type.74c)]
 // CHECK:STDOUT:   %Optional.Some: @IntRange.as.Iterate.impl.Next.%Optional.Some.type (%Optional.Some.type.74c) = struct_value () [symbolic = %Optional.Some (constants.%Optional.Some.37c)]
 // CHECK:STDOUT:   %Optional.Some.specific_fn.loc15_42.2: <specific function> = specific_function %Optional.Some, @Optional.Some(%OptionalStorage.facet.loc11_75.1) [symbolic = %Optional.Some.specific_fn.loc15_42.2 (constants.%Optional.Some.specific_fn)]
 // CHECK:STDOUT:   %facet_value: %type_where = facet_value %Int.loc11_43.1, () [symbolic = %facet_value (constants.%facet_value.4a9)]
+// CHECK:STDOUT:   %.loc12_7.1: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %.loc12_7.1 (constants.%.4d6)]
 // CHECK:STDOUT:   %Destroy.impl_witness: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.b47)]
 // CHECK:STDOUT:   %Destroy.facet: %Destroy.type = facet_value %Int.loc11_43.1, (%Destroy.impl_witness) [symbolic = %Destroy.facet (constants.%Destroy.facet.11d)]
-// CHECK:STDOUT:   %.loc12_7: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc12_7 (constants.%.a64)]
+// CHECK:STDOUT:   %.loc12_7.2: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc12_7.2 (constants.%.a64)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.type (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.353)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op: @IntRange.as.Iterate.impl.Next.%DestroyT.binding.as_type.as.Destroy.impl.Op.type (%DestroyT.binding.as_type.as.Destroy.impl.Op.type.353) = struct_value () [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.3be)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.e87)]
@@ -608,7 +624,7 @@ fn Read() {
 // CHECK:STDOUT:     %cursor.ref.loc12: @IntRange.as.Iterate.impl.Next.%ptr.loc11_44.1 (%ptr.1cf) = name_ref cursor, %cursor
 // CHECK:STDOUT:     %.loc12_32.1: ref @IntRange.as.Iterate.impl.Next.%Int.loc11_43.1 (%Int.b50e37.1) = deref %cursor.ref.loc12
 // CHECK:STDOUT:     %.loc12_32.2: @IntRange.as.Iterate.impl.Next.%Int.loc11_43.1 (%Int.b50e37.1) = acquire_value %.loc12_32.1
-// CHECK:STDOUT:     %impl.elem0.loc12_32.1: @IntRange.as.Iterate.impl.Next.%.loc12_32.4 (%.20c) = impl_witness_access constants.%Copy.lookup_impl_witness.035, element0 [symbolic = %impl.elem0.loc12_32.2 (constants.%impl.elem0.625)]
+// CHECK:STDOUT:     %impl.elem0.loc12_32.1: @IntRange.as.Iterate.impl.Next.%.loc12_32.5 (%.20c) = impl_witness_access constants.%Copy.lookup_impl_witness.035, element0 [symbolic = %impl.elem0.loc12_32.2 (constants.%impl.elem0.625)]
 // CHECK:STDOUT:     %bound_method.loc12_32.1: <bound method> = bound_method %.loc12_32.2, %impl.elem0.loc12_32.1
 // CHECK:STDOUT:     %specific_impl_fn.loc12_32.1: <specific function> = specific_impl_function %impl.elem0.loc12_32.1, @Copy.Op(constants.%Copy.facet.d3d) [symbolic = %specific_impl_fn.loc12_32.2 (constants.%specific_impl_fn.c88)]
 // CHECK:STDOUT:     %bound_method.loc12_32.2: <bound method> = bound_method %.loc12_32.2, %specific_impl_fn.loc12_32.1
@@ -629,7 +645,7 @@ fn Read() {
 // CHECK:STDOUT:     %OrderedWith.type.loc13_17.1: type = facet_type <@OrderedWith, @OrderedWith(constants.%Int.b50e37.1)> [symbolic = %OrderedWith.type.loc13_17.2 (constants.%OrderedWith.type.393)]
 // CHECK:STDOUT:     %.loc13_17.1: @IntRange.as.Iterate.impl.Next.%OrderedWith.assoc_type (%OrderedWith.assoc_type.72a) = specific_constant imports.%Core.import_ref.128, @OrderedWith(constants.%Int.b50e37.1) [symbolic = %assoc0 (constants.%assoc0.3f6)]
 // CHECK:STDOUT:     %Less.ref: @IntRange.as.Iterate.impl.Next.%OrderedWith.assoc_type (%OrderedWith.assoc_type.72a) = name_ref Less, %.loc13_17.1 [symbolic = %assoc0 (constants.%assoc0.3f6)]
-// CHECK:STDOUT:     %impl.elem0.loc13: @IntRange.as.Iterate.impl.Next.%.loc13_17.2 (%.db5) = impl_witness_access constants.%OrderedWith.impl_witness.586, element0 [symbolic = %Int.as.OrderedWith.impl.Less (constants.%Int.as.OrderedWith.impl.Less.af3)]
+// CHECK:STDOUT:     %impl.elem0.loc13: @IntRange.as.Iterate.impl.Next.%.loc13_17.3 (%.db5) = impl_witness_access constants.%OrderedWith.impl_witness.586, element0 [symbolic = %Int.as.OrderedWith.impl.Less (constants.%Int.as.OrderedWith.impl.Less.af3)]
 // CHECK:STDOUT:     %bound_method.loc13_17.1: <bound method> = bound_method %value.ref.loc13, %impl.elem0.loc13
 // CHECK:STDOUT:     %specific_fn.loc13: <specific function> = specific_function %impl.elem0.loc13, @Int.as.OrderedWith.impl.Less.1(constants.%N, constants.%N) [symbolic = %Int.as.OrderedWith.impl.Less.specific_fn (constants.%Int.as.OrderedWith.impl.Less.specific_fn.0ff)]
 // CHECK:STDOUT:     %bound_method.loc13_17.2: <bound method> = bound_method %value.ref.loc13, %specific_fn.loc13
@@ -642,7 +658,7 @@ fn Read() {
 // CHECK:STDOUT:   !if.then:
 // CHECK:STDOUT:     %cursor.ref.loc14: @IntRange.as.Iterate.impl.Next.%ptr.loc11_44.1 (%ptr.1cf) = name_ref cursor, %cursor
 // CHECK:STDOUT:     %.loc14_11: ref @IntRange.as.Iterate.impl.Next.%Int.loc11_43.1 (%Int.b50e37.1) = deref %cursor.ref.loc14
-// CHECK:STDOUT:     %impl.elem0.loc14_9.1: @IntRange.as.Iterate.impl.Next.%.loc14_9.2 (%.080) = impl_witness_access constants.%Inc.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc14_9.2 (constants.%impl.elem0.923)]
+// CHECK:STDOUT:     %impl.elem0.loc14_9.1: @IntRange.as.Iterate.impl.Next.%.loc14_9.3 (%.080) = impl_witness_access constants.%Inc.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc14_9.2 (constants.%impl.elem0.923)]
 // CHECK:STDOUT:     %bound_method.loc14_9.1: <bound method> = bound_method %.loc14_11, %impl.elem0.loc14_9.1
 // CHECK:STDOUT:     %specific_impl_fn.loc14_9.1: <specific function> = specific_impl_function %impl.elem0.loc14_9.1, @Inc.Op(constants.%Inc.facet) [symbolic = %specific_impl_fn.loc14_9.2 (constants.%specific_impl_fn.173)]
 // CHECK:STDOUT:     %bound_method.loc14_9.2: <bound method> = bound_method %.loc14_11, %specific_impl_fn.loc14_9.1
@@ -667,7 +683,7 @@ fn Read() {
 // CHECK:STDOUT:     %.loc11_47.1: ref @IntRange.as.Iterate.impl.Next.%Optional.loc11_75.1 (%Optional.23f) = splice_block %return {}
 // CHECK:STDOUT:     %.loc15_48: @IntRange.as.Iterate.impl.Next.%Int.loc11_43.1 (%Int.b50e37.1) = acquire_value %value.ref.loc15
 // CHECK:STDOUT:     %Optional.Some.call: init @IntRange.as.Iterate.impl.Next.%Optional.loc11_75.1 (%Optional.23f) = call %Optional.Some.specific_fn.loc15_42.1(%.loc15_48) to %.loc11_47.1
-// CHECK:STDOUT:     %impl.elem0.loc12_7.1: @IntRange.as.Iterate.impl.Next.%.loc12_7 (%.a64) = impl_witness_access constants.%Destroy.impl_witness.b47, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.3be)]
+// CHECK:STDOUT:     %impl.elem0.loc12_7.1: @IntRange.as.Iterate.impl.Next.%.loc12_7.2 (%.a64) = impl_witness_access constants.%Destroy.impl_witness.b47, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.3be)]
 // CHECK:STDOUT:     %bound_method.loc12_7.1: <bound method> = bound_method %value.var, %impl.elem0.loc12_7.1
 // CHECK:STDOUT:     %specific_fn.loc12_7.1: <specific function> = specific_function %impl.elem0.loc12_7.1, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value.4a9) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.e87)]
 // CHECK:STDOUT:     %bound_method.loc12_7.2: <bound method> = bound_method %value.var, %specific_fn.loc12_7.1
@@ -689,7 +705,7 @@ fn Read() {
 // CHECK:STDOUT:     %Optional.None.specific_fn.loc17_42.1: <specific function> = specific_function %None.ref, @Optional.None(constants.%OptionalStorage.facet.ea4) [symbolic = %Optional.None.specific_fn.loc17_42.2 (constants.%Optional.None.specific_fn)]
 // CHECK:STDOUT:     %.loc11_47.2: ref @IntRange.as.Iterate.impl.Next.%Optional.loc11_75.1 (%Optional.23f) = splice_block %return {}
 // CHECK:STDOUT:     %Optional.None.call: init @IntRange.as.Iterate.impl.Next.%Optional.loc11_75.1 (%Optional.23f) = call %Optional.None.specific_fn.loc17_42.1() to %.loc11_47.2
-// CHECK:STDOUT:     %impl.elem0.loc12_7.2: @IntRange.as.Iterate.impl.Next.%.loc12_7 (%.a64) = impl_witness_access constants.%Destroy.impl_witness.b47, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.3be)]
+// CHECK:STDOUT:     %impl.elem0.loc12_7.2: @IntRange.as.Iterate.impl.Next.%.loc12_7.2 (%.a64) = impl_witness_access constants.%Destroy.impl_witness.b47, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.3be)]
 // CHECK:STDOUT:     %bound_method.loc12_7.3: <bound method> = bound_method %value.var, %impl.elem0.loc12_7.2
 // CHECK:STDOUT:     %specific_fn.loc12_7.2: <specific function> = specific_function %impl.elem0.loc12_7.2, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value.4a9) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.e87)]
 // CHECK:STDOUT:     %bound_method.loc12_7.4: <bound method> = bound_method %value.var, %specific_fn.loc12_7.2
@@ -726,6 +742,7 @@ fn Read() {
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %IntRange.Make.type => constants.%IntRange.Make.type.121
 // CHECK:STDOUT:   %IntRange.Make => constants.%IntRange.Make.14e
+// CHECK:STDOUT:   %.loc9 => constants.%.1a2
 // CHECK:STDOUT:   %Int.loc22_32.2 => constants.%Int.b50e37.1
 // CHECK:STDOUT:   %require_complete => constants.%require_complete.e66303.1
 // CHECK:STDOUT:   %IntRange => constants.%IntRange.48b
@@ -746,6 +763,7 @@ fn Read() {
 // CHECK:STDOUT:   %N => constants.%N
 // CHECK:STDOUT:   %IntRange => constants.%IntRange.48b
 // CHECK:STDOUT:   %Int.loc9_54.1 => constants.%Int.b50e37.1
+// CHECK:STDOUT:   %.loc9_85.1 => constants.%.1a2
 // CHECK:STDOUT:   %Copy.lookup_impl_witness => constants.%Copy.lookup_impl_witness.035
 // CHECK:STDOUT:   %Copy.facet.loc9_85.1 => constants.%Copy.facet.d3d
 // CHECK:STDOUT:   %Iterate_where.type => constants.%Iterate_where.type
@@ -755,6 +773,7 @@ fn Read() {
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %IntRange.as.Iterate.impl.NewCursor.type => constants.%IntRange.as.Iterate.impl.NewCursor.type
 // CHECK:STDOUT:   %IntRange.as.Iterate.impl.NewCursor => constants.%IntRange.as.Iterate.impl.NewCursor
+// CHECK:STDOUT:   %.loc11 => constants.%.833
 // CHECK:STDOUT:   %IntRange.as.Iterate.impl.Next.type => constants.%IntRange.as.Iterate.impl.Next.type
 // CHECK:STDOUT:   %IntRange.as.Iterate.impl.Next => constants.%IntRange.as.Iterate.impl.Next
 // CHECK:STDOUT: }
@@ -774,6 +793,9 @@ fn Read() {
 // CHECK:STDOUT:   %Int.loc11_43.1 => constants.%Int.b50e37.1
 // CHECK:STDOUT:   %ptr.loc11_44.1 => constants.%ptr.1cf
 // CHECK:STDOUT:   %pattern_type.loc11_25 => constants.%pattern_type.054
+// CHECK:STDOUT:   %Copy.lookup_impl_witness => constants.%Copy.lookup_impl_witness.035
+// CHECK:STDOUT:   %Copy.facet => constants.%Copy.facet.d3d
+// CHECK:STDOUT:   %.loc11_75.1 => constants.%.833
 // CHECK:STDOUT:   %OptionalStorage.lookup_impl_witness => constants.%OptionalStorage.lookup_impl_witness.8c6
 // CHECK:STDOUT:   %OptionalStorage.facet.loc11_75.1 => constants.%OptionalStorage.facet.ea4
 // CHECK:STDOUT:   %Optional.loc11_75.1 => constants.%Optional.23f
@@ -786,6 +808,7 @@ fn Read() {
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %IntRange.Make.type => constants.%IntRange.Make.type.cef
 // CHECK:STDOUT:   %IntRange.Make => constants.%IntRange.Make.0dc
+// CHECK:STDOUT:   %.loc9 => constants.%.1e9
 // CHECK:STDOUT:   %Int.loc22_32.2 => constants.%i32
 // CHECK:STDOUT:   %require_complete => constants.%complete_type.f8a
 // CHECK:STDOUT:   %IntRange => constants.%IntRange.365
@@ -805,9 +828,10 @@ fn Read() {
 // CHECK:STDOUT:   %require_complete.loc5_49 => constants.%complete_type.c45
 // CHECK:STDOUT:   %require_complete.loc5_16 => constants.%complete_type.f8a
 // CHECK:STDOUT:   %struct_type.start.end => constants.%struct_type.start.end.d0a
+// CHECK:STDOUT:   %.loc6_22.2 => constants.%.1e9
 // CHECK:STDOUT:   %Copy.lookup_impl_witness => constants.%Copy.impl_witness.fb7
 // CHECK:STDOUT:   %Copy.facet => constants.%Copy.facet.c50
-// CHECK:STDOUT:   %.loc6_22.2 => constants.%.65f
+// CHECK:STDOUT:   %.loc6_22.3 => constants.%.65f
 // CHECK:STDOUT:   %impl.elem0.loc6_22.2 => constants.%Int.as.Copy.impl.Op.dfd
 // CHECK:STDOUT:   %specific_impl_fn.loc6_22.2 => constants.%Int.as.Copy.impl.Op.specific_fn
 // CHECK:STDOUT: }
@@ -834,11 +858,12 @@ fn Read() {
 // CHECK:STDOUT:   %IntRange.48b: type = class_type @IntRange, @IntRange(%N) [symbolic]
 // CHECK:STDOUT:   %IntRange.elem.4f4: type = unbound_element_type %IntRange.48b, %Int.f4f02c.1 [symbolic]
 // CHECK:STDOUT:   %require_complete.001e59.1: <witness> = require_complete_type %Int.f4f02c.1 [symbolic]
+// CHECK:STDOUT:   %Copy.type: type = facet_type <@Copy> [concrete]
+// CHECK:STDOUT:   %pattern_type.e3e33e.1: type = pattern_type %Int.f4f02c.1 [symbolic]
+// CHECK:STDOUT:   %.6a2: require_specific_def_type = require_specific_def @Int.as.Copy.impl(%N) [symbolic]
 // CHECK:STDOUT:   %IntRange.Make.type.121: type = fn_type @IntRange.Make, @IntRange(%N) [symbolic]
 // CHECK:STDOUT:   %IntRange.Make.14e: %IntRange.Make.type.121 = struct_value () [symbolic]
 // CHECK:STDOUT:   %pattern_type.6de: type = pattern_type %IntRange.48b [symbolic]
-// CHECK:STDOUT:   %pattern_type.e3e33e.1: type = pattern_type %Int.f4f02c.1 [symbolic]
-// CHECK:STDOUT:   %Copy.type: type = facet_type <@Copy> [concrete]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness.d1a: <witness> = lookup_impl_witness %Int.f4f02c.1, @Copy [symbolic]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %Int.f4f02c.1, (%Copy.lookup_impl_witness.d1a) [symbolic]
 // CHECK:STDOUT:   %Copy.Op.type: type = fn_type @Copy.Op [concrete]
@@ -853,6 +878,7 @@ fn Read() {
 // CHECK:STDOUT:   %i32: type = class_type @Int, @Int(%int_32) [concrete]
 // CHECK:STDOUT:   %i32.builtin: type = int_type signed, %int_32 [concrete]
 // CHECK:STDOUT:   %complete_type.f8a: <witness> = complete_type_witness %i32.builtin [concrete]
+// CHECK:STDOUT:   %.f57: require_specific_def_type = require_specific_def @Int.as.Copy.impl(%int_32) [concrete]
 // CHECK:STDOUT:   %IntRange.elem.f21: type = unbound_element_type %IntRange.365, %i32 [concrete]
 // CHECK:STDOUT:   %struct_type.start.end.0fe: type = struct_type {.start: %i32, .end: %i32} [concrete]
 // CHECK:STDOUT:   %complete_type.a43: <witness> = complete_type_witness %struct_type.start.end.0fe [concrete]
@@ -925,6 +951,7 @@ fn Read() {
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %IntRange.Make.type: type = fn_type @IntRange.Make, @IntRange(%N) [symbolic = %IntRange.Make.type (constants.%IntRange.Make.type.121)]
 // CHECK:STDOUT:   %IntRange.Make: @IntRange.%IntRange.Make.type (%IntRange.Make.type.121) = struct_value () [symbolic = %IntRange.Make (constants.%IntRange.Make.14e)]
+// CHECK:STDOUT:   %.1: require_specific_def_type = require_specific_def @Int.as.Copy.impl(%N) [symbolic = %.1 (constants.%.6a2)]
 // CHECK:STDOUT:   %Int: type = class_type @Int, @Int(%N) [symbolic = %Int (constants.%Int.f4f02c.1)]
 // CHECK:STDOUT:   %require_complete: <witness> = require_complete_type %Int [symbolic = %require_complete (constants.%require_complete.001e59.1)]
 // CHECK:STDOUT:   %IntRange: type = class_type @IntRange, @IntRange(%N) [symbolic = %IntRange (constants.%IntRange.48b)]
@@ -999,10 +1026,11 @@ fn Read() {
 // CHECK:STDOUT:   %require_complete.1: <witness> = require_complete_type %IntRange [symbolic = %require_complete.1 (constants.%require_complete.b4c)]
 // CHECK:STDOUT:   %require_complete.2: <witness> = require_complete_type %Int [symbolic = %require_complete.2 (constants.%require_complete.001e59.1)]
 // CHECK:STDOUT:   %struct_type.start.end: type = struct_type {.start: @IntRange.Make.%Int (%Int.f4f02c.1), .end: @IntRange.Make.%Int (%Int.f4f02c.1)} [symbolic = %struct_type.start.end (constants.%struct_type.start.end.fb5)]
+// CHECK:STDOUT:   %.1: require_specific_def_type = require_specific_def @Int.as.Copy.impl(%N) [symbolic = %.1 (constants.%.6a2)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %Int, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.d1a)]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %Int, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet)]
-// CHECK:STDOUT:   %.1: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.1 (constants.%.b90)]
-// CHECK:STDOUT:   %impl.elem0: @IntRange.Make.%.1 (%.b90) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0 (constants.%impl.elem0.305)]
+// CHECK:STDOUT:   %.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.2 (constants.%.b90)]
+// CHECK:STDOUT:   %impl.elem0: @IntRange.Make.%.2 (%.b90) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0 (constants.%impl.elem0.305)]
 // CHECK:STDOUT:   %specific_impl_fn: <specific function> = specific_impl_function %impl.elem0, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn (constants.%specific_impl_fn.3a3)]
 // CHECK:STDOUT:
 // CHECK:STDOUT:   fn;
@@ -1016,6 +1044,7 @@ fn Read() {
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %IntRange.Make.type => constants.%IntRange.Make.type.121
 // CHECK:STDOUT:   %IntRange.Make => constants.%IntRange.Make.14e
+// CHECK:STDOUT:   %.1 => constants.%.6a2
 // CHECK:STDOUT:   %Int => constants.%Int.f4f02c.1
 // CHECK:STDOUT:   %require_complete => constants.%require_complete.001e59.1
 // CHECK:STDOUT:   %IntRange => constants.%IntRange.48b
@@ -1038,6 +1067,7 @@ fn Read() {
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %IntRange.Make.type => constants.%IntRange.Make.type.cef
 // CHECK:STDOUT:   %IntRange.Make => constants.%IntRange.Make.0dc
+// CHECK:STDOUT:   %.1 => constants.%.f57
 // CHECK:STDOUT:   %Int => constants.%i32
 // CHECK:STDOUT:   %require_complete => constants.%complete_type.f8a
 // CHECK:STDOUT:   %IntRange => constants.%IntRange.365

+ 4 - 0
toolchain/check/testdata/function/generic/call.carbon

@@ -93,6 +93,7 @@ fn CallSpecific(x: C*) -> C* {
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.692: %ptr.as.Copy.impl.Op.type.75b = struct_value () [symbolic]
 // CHECK:STDOUT:   %pattern_type.a60: type = pattern_type %ptr.4f0 [symbolic]
 // CHECK:STDOUT:   %Function.specific_fn.c1b: <specific function> = specific_function %Function, @Function(%T.417) [symbolic]
+// CHECK:STDOUT:   %.dcd: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.d9f) [symbolic]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness.c66: <witness> = lookup_impl_witness %ptr.4f0, @Copy [symbolic]
 // CHECK:STDOUT:   %Copy.facet.747: %Copy.type = facet_value %ptr.4f0, (%Copy.lookup_impl_witness.c66) [symbolic]
 // CHECK:STDOUT:   %Function.specific_fn.244: <specific function> = specific_function %Function, @Function(%Copy.facet.747) [symbolic]
@@ -203,6 +204,7 @@ fn CallSpecific(x: C*) -> C* {
 // CHECK:STDOUT:
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   <elided>
+// CHECK:STDOUT:   %.loc18_24.4: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.loc16_19.1) [symbolic = %.loc18_24.4 (constants.%.dcd)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr.loc16_33.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.c66)]
 // CHECK:STDOUT:   %Copy.facet.loc18_24.4: %Copy.type = facet_value %ptr.loc16_33.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet.loc18_24.4 (constants.%Copy.facet.747)]
 // CHECK:STDOUT:   %Function.specific_fn.loc18_10.2: <specific function> = specific_function constants.%Function, @Function(%Copy.facet.loc18_24.4) [symbolic = %Function.specific_fn.loc18_10.2 (constants.%Function.specific_fn.244)]
@@ -316,6 +318,7 @@ fn CallSpecific(x: C*) -> C* {
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.692: %ptr.as.Copy.impl.Op.type.75b = struct_value () [symbolic]
 // CHECK:STDOUT:   %pattern_type.a60: type = pattern_type %ptr.4f0 [symbolic]
 // CHECK:STDOUT:   %Function.specific_fn.c1b: <specific function> = specific_function %Function, @Function(%T.417) [symbolic]
+// CHECK:STDOUT:   %.dcd: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.d9f) [symbolic]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness.c66: <witness> = lookup_impl_witness %ptr.4f0, @Copy [symbolic]
 // CHECK:STDOUT:   %Copy.facet.747: %Copy.type = facet_value %ptr.4f0, (%Copy.lookup_impl_witness.c66) [symbolic]
 // CHECK:STDOUT:   %Function.specific_fn.244: <specific function> = specific_function %Function, @Function(%Copy.facet.747) [symbolic]
@@ -425,6 +428,7 @@ fn CallSpecific(x: C*) -> C* {
 // CHECK:STDOUT:
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   <elided>
+// CHECK:STDOUT:   %.loc18_20.3: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.loc16_19.1) [symbolic = %.loc18_20.3 (constants.%.dcd)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr.loc16_33.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.c66)]
 // CHECK:STDOUT:   %Copy.facet.loc18_20.3: %Copy.type = facet_value %ptr.loc16_33.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet.loc18_20.3 (constants.%Copy.facet.747)]
 // CHECK:STDOUT:   %Function.specific_fn.loc18_10.2: <specific function> = specific_function constants.%Function, @Function(%Copy.facet.loc18_20.3) [symbolic = %Function.specific_fn.loc18_10.2 (constants.%Function.specific_fn.244)]

+ 6 - 1
toolchain/check/testdata/function/generic/deduce.carbon

@@ -1603,6 +1603,7 @@ fn F() {
 // CHECK:STDOUT:   %CC.type: type = generic_class_type @CC [concrete]
 // CHECK:STDOUT:   %CC.generic: %CC.type = struct_value () [concrete]
 // CHECK:STDOUT:   %CC.218: type = class_type @CC, @CC(%D) [symbolic]
+// CHECK:STDOUT:   %.7ec: require_specific_def_type = require_specific_def @DD.as.Z.impl(%E) [symbolic]
 // CHECK:STDOUT:   %Z.lookup_impl_witness: <witness> = lookup_impl_witness %DD.1e7, @Z [symbolic]
 // CHECK:STDOUT:   %Z.facet.4e5: %Z.type = facet_value %DD.1e7, (%Z.lookup_impl_witness) [symbolic]
 // CHECK:STDOUT:   %CC.fef: type = class_type @CC, @CC(%Z.facet.4e5) [symbolic]
@@ -1611,6 +1612,7 @@ fn F() {
 // CHECK:STDOUT:   %F: %F.type = struct_value () [concrete]
 // CHECK:STDOUT:   %DD.689: type = class_type @DD, @DD(%EE) [concrete]
 // CHECK:STDOUT:   %Z.impl_witness.5de: <witness> = impl_witness file.%Z.impl_witness_table.loc9, @DD.as.Z.impl(%EE) [concrete]
+// CHECK:STDOUT:   %.889: require_specific_def_type = require_specific_def @DD.as.Z.impl(%EE) [concrete]
 // CHECK:STDOUT:   %Z.facet.72a: %Z.type = facet_value %DD.689, (%Z.impl_witness.5de) [concrete]
 // CHECK:STDOUT:   %CC.86a: type = class_type @CC, @CC(%Z.facet.72a) [concrete]
 // CHECK:STDOUT:   %Z.impl_witness.516: <witness> = impl_witness file.%Z.impl_witness_table.loc12, @CC.as.Z.impl(%EE) [concrete]
@@ -1677,7 +1679,7 @@ fn F() {
 // CHECK:STDOUT:     %E.ref: type = name_ref E, %E.loc12_14.1 [symbolic = %E.loc12_14.2 (constants.%E)]
 // CHECK:STDOUT:     %DD.loc12_31.1: type = class_type @DD, @DD(constants.%E) [symbolic = %DD.loc12_31.2 (constants.%DD.1e7)]
 // CHECK:STDOUT:     %Z.facet.loc12_32.1: %Z.type = facet_value %DD.loc12_31.1, (constants.%Z.lookup_impl_witness) [symbolic = %Z.facet.loc12_32.2 (constants.%Z.facet.4e5)]
-// CHECK:STDOUT:     %.loc12: %Z.type = converted %DD.loc12_31.1, %Z.facet.loc12_32.1 [symbolic = %Z.facet.loc12_32.2 (constants.%Z.facet.4e5)]
+// CHECK:STDOUT:     %.loc12_32.1: %Z.type = converted %DD.loc12_31.1, %Z.facet.loc12_32.1 [symbolic = %Z.facet.loc12_32.2 (constants.%Z.facet.4e5)]
 // CHECK:STDOUT:     %CC.loc12_32.1: type = class_type @CC, @CC(constants.%Z.facet.4e5) [symbolic = %CC.loc12_32.2 (constants.%CC.fef)]
 // CHECK:STDOUT:     %Z.ref: type = name_ref Z, file.%Z.decl [concrete = constants.%Z.type]
 // CHECK:STDOUT:     %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self]
@@ -1719,6 +1721,7 @@ fn F() {
 // CHECK:STDOUT: generic impl @CC.as.Z.impl(%E.loc12_14.1: type) {
 // CHECK:STDOUT:   %E.loc12_14.2: type = symbolic_binding E, 0 [symbolic = %E.loc12_14.2 (constants.%E)]
 // CHECK:STDOUT:   %DD.loc12_31.2: type = class_type @DD, @DD(%E.loc12_14.2) [symbolic = %DD.loc12_31.2 (constants.%DD.1e7)]
+// CHECK:STDOUT:   %.loc12_32.2: require_specific_def_type = require_specific_def @DD.as.Z.impl(%E.loc12_14.2) [symbolic = %.loc12_32.2 (constants.%.7ec)]
 // CHECK:STDOUT:   %Z.lookup_impl_witness: <witness> = lookup_impl_witness %DD.loc12_31.2, @Z [symbolic = %Z.lookup_impl_witness (constants.%Z.lookup_impl_witness)]
 // CHECK:STDOUT:   %Z.facet.loc12_32.2: %Z.type = facet_value %DD.loc12_31.2, (%Z.lookup_impl_witness) [symbolic = %Z.facet.loc12_32.2 (constants.%Z.facet.4e5)]
 // CHECK:STDOUT:   %CC.loc12_32.2: type = class_type @CC, @CC(%Z.facet.loc12_32.2) [symbolic = %CC.loc12_32.2 (constants.%CC.fef)]
@@ -1806,6 +1809,7 @@ fn F() {
 // CHECK:STDOUT: specific @CC.as.Z.impl(constants.%E) {
 // CHECK:STDOUT:   %E.loc12_14.2 => constants.%E
 // CHECK:STDOUT:   %DD.loc12_31.2 => constants.%DD.1e7
+// CHECK:STDOUT:   %.loc12_32.2 => constants.%.7ec
 // CHECK:STDOUT:   %Z.lookup_impl_witness => constants.%Z.lookup_impl_witness
 // CHECK:STDOUT:   %Z.facet.loc12_32.2 => constants.%Z.facet.4e5
 // CHECK:STDOUT:   %CC.loc12_32.2 => constants.%CC.fef
@@ -1831,6 +1835,7 @@ fn F() {
 // CHECK:STDOUT: specific @CC.as.Z.impl(constants.%EE) {
 // CHECK:STDOUT:   %E.loc12_14.2 => constants.%EE
 // CHECK:STDOUT:   %DD.loc12_31.2 => constants.%DD.689
+// CHECK:STDOUT:   %.loc12_32.2 => constants.%.889
 // CHECK:STDOUT:   %Z.lookup_impl_witness => constants.%Z.impl_witness.5de
 // CHECK:STDOUT:   %Z.facet.loc12_32.2 => constants.%Z.facet.72a
 // CHECK:STDOUT:   %CC.loc12_32.2 => constants.%CC.86a

+ 5 - 3
toolchain/check/testdata/function/generic/indirect_generic_type.carbon

@@ -30,6 +30,7 @@ fn F(T:! type, p: T**) -> T* {
 // CHECK:STDOUT:   %pattern_type.a60: type = pattern_type %ptr.4f0 [symbolic]
 // CHECK:STDOUT:   %Copy.type: type = facet_type <@Copy> [concrete]
 // CHECK:STDOUT:   %Copy.Op.type: type = fn_type @Copy.Op [concrete]
+// CHECK:STDOUT:   %.dcd: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.d9f) [symbolic]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness.c66: <witness> = lookup_impl_witness %ptr.4f0, @Copy [symbolic]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr.4f0, (%Copy.lookup_impl_witness.c66) [symbolic]
 // CHECK:STDOUT:   %.89d: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet [symbolic]
@@ -45,10 +46,11 @@ fn F(T:! type, p: T**) -> T* {
 // CHECK:STDOUT:
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   <elided>
+// CHECK:STDOUT:   %.loc6_10.4: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.loc4_6.1) [symbolic = %.loc6_10.4 (constants.%.dcd)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr.loc4_20.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.c66)]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr.loc4_20.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet)]
-// CHECK:STDOUT:   %.loc6_10.4: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc6_10.4 (constants.%.89d)]
-// CHECK:STDOUT:   %impl.elem0.loc6_10.2: @F.%.loc6_10.4 (%.89d) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc6_10.2 (constants.%impl.elem0.928)]
+// CHECK:STDOUT:   %.loc6_10.5: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc6_10.5 (constants.%.89d)]
+// CHECK:STDOUT:   %impl.elem0.loc6_10.2: @F.%.loc6_10.5 (%.89d) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc6_10.2 (constants.%impl.elem0.928)]
 // CHECK:STDOUT:   %specific_impl_fn.loc6_10.2: <specific function> = specific_impl_function %impl.elem0.loc6_10.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc6_10.2 (constants.%specific_impl_fn.6a1)]
 // CHECK:STDOUT:
 // CHECK:STDOUT:   fn(%p.param: @F.%ptr.loc4_21.1 (%ptr.3f2)) -> @F.%ptr.loc4_20.1 (%ptr.4f0) {
@@ -56,7 +58,7 @@ fn F(T:! type, p: T**) -> T* {
 // CHECK:STDOUT:     %p.ref: @F.%ptr.loc4_21.1 (%ptr.3f2) = name_ref p, %p
 // CHECK:STDOUT:     %.loc6_10.1: ref @F.%ptr.loc4_20.1 (%ptr.4f0) = deref %p.ref
 // CHECK:STDOUT:     %.loc6_10.2: @F.%ptr.loc4_20.1 (%ptr.4f0) = acquire_value %.loc6_10.1
-// CHECK:STDOUT:     %impl.elem0.loc6_10.1: @F.%.loc6_10.4 (%.89d) = impl_witness_access constants.%Copy.lookup_impl_witness.c66, element0 [symbolic = %impl.elem0.loc6_10.2 (constants.%impl.elem0.928)]
+// CHECK:STDOUT:     %impl.elem0.loc6_10.1: @F.%.loc6_10.5 (%.89d) = impl_witness_access constants.%Copy.lookup_impl_witness.c66, element0 [symbolic = %impl.elem0.loc6_10.2 (constants.%impl.elem0.928)]
 // CHECK:STDOUT:     %bound_method.loc6_10.1: <bound method> = bound_method %.loc6_10.2, %impl.elem0.loc6_10.1
 // CHECK:STDOUT:     %specific_impl_fn.loc6_10.1: <specific function> = specific_impl_function %impl.elem0.loc6_10.1, @Copy.Op(constants.%Copy.facet) [symbolic = %specific_impl_fn.loc6_10.2 (constants.%specific_impl_fn.6a1)]
 // CHECK:STDOUT:     %bound_method.loc6_10.2: <bound method> = bound_method %.loc6_10.2, %specific_impl_fn.loc6_10.1

+ 9 - 5
toolchain/check/testdata/function/generic/resolve_used.carbon

@@ -65,6 +65,7 @@ fn CallNegative() {
 // CHECK:STDOUT:   %Destroy.impl_witness.437: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.4a9) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.353: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.4a9) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.3be: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.353 = struct_value () [symbolic]
+// CHECK:STDOUT:   %.4d6: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.4a9) [symbolic]
 // CHECK:STDOUT:   %Destroy.facet.04a: %Destroy.type = facet_value %Int, (%Destroy.impl_witness.437) [symbolic]
 // CHECK:STDOUT:   %.200: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.04a [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.e87: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.3be, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.4a9) [symbolic]
@@ -77,10 +78,11 @@ fn CallNegative() {
 // CHECK:STDOUT:   %pattern_type.47b: type = pattern_type %i0 [concrete]
 // CHECK:STDOUT:   %facet_value.5b4: %type_where = facet_value %i0, () [concrete]
 // CHECK:STDOUT:   %Destroy.impl_witness.db9: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.5b4) [concrete]
-// CHECK:STDOUT:   %Destroy.facet.b5f: %Destroy.type = facet_value %i0, (%Destroy.impl_witness.db9) [concrete]
-// CHECK:STDOUT:   %.54d: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.b5f [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.7d2: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.5b4) [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.cc2: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.7d2 = struct_value () [concrete]
+// CHECK:STDOUT:   %.53b: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.5b4) [concrete]
+// CHECK:STDOUT:   %Destroy.facet.b5f: %Destroy.type = facet_value %i0, (%Destroy.impl_witness.db9) [concrete]
+// CHECK:STDOUT:   %.54d: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.b5f [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.6f4: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.cc2, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.5b4) [concrete]
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
@@ -130,9 +132,10 @@ fn CallNegative() {
 // CHECK:STDOUT:   %require_complete: <witness> = require_complete_type %Int.loc15_20.2 [symbolic = %require_complete (constants.%require_complete.e66)]
 // CHECK:STDOUT:   %pattern_type: type = pattern_type %Int.loc15_20.2 [symbolic = %pattern_type (constants.%pattern_type.60f)]
 // CHECK:STDOUT:   %facet_value: %type_where = facet_value %Int.loc15_20.2, () [symbolic = %facet_value (constants.%facet_value.4a9)]
+// CHECK:STDOUT:   %.loc15_3.1: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %.loc15_3.1 (constants.%.4d6)]
 // CHECK:STDOUT:   %Destroy.impl_witness: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.437)]
 // CHECK:STDOUT:   %Destroy.facet: %Destroy.type = facet_value %Int.loc15_20.2, (%Destroy.impl_witness) [symbolic = %Destroy.facet (constants.%Destroy.facet.04a)]
-// CHECK:STDOUT:   %.loc15_3: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc15_3 (constants.%.200)]
+// CHECK:STDOUT:   %.loc15_3.2: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc15_3.2 (constants.%.200)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.type (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.353)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op: @ErrorIfNIsZero.%DestroyT.binding.as_type.as.Destroy.impl.Op.type (%DestroyT.binding.as_type.as.Destroy.impl.Op.type.353) = struct_value () [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.3be)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.e87)]
@@ -151,7 +154,7 @@ fn CallNegative() {
 // CHECK:STDOUT:       %Int.loc15_20.1: type = class_type @Int, @Int(constants.%N) [symbolic = %Int.loc15_20.2 (constants.%Int)]
 // CHECK:STDOUT:     }
 // CHECK:STDOUT:     %v: ref @ErrorIfNIsZero.%Int.loc15_20.2 (%Int) = ref_binding v, %v.var
-// CHECK:STDOUT:     %impl.elem0: @ErrorIfNIsZero.%.loc15_3 (%.200) = impl_witness_access constants.%Destroy.impl_witness.437, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.3be)]
+// CHECK:STDOUT:     %impl.elem0: @ErrorIfNIsZero.%.loc15_3.2 (%.200) = impl_witness_access constants.%Destroy.impl_witness.437, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.3be)]
 // CHECK:STDOUT:     %bound_method.loc15_3.1: <bound method> = bound_method %v.var, %impl.elem0
 // CHECK:STDOUT:     %specific_fn: <specific function> = specific_function %impl.elem0, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value.4a9) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.e87)]
 // CHECK:STDOUT:     %bound_method.loc15_3.2: <bound method> = bound_method %v.var, %specific_fn
@@ -181,9 +184,10 @@ fn CallNegative() {
 // CHECK:STDOUT:   %require_complete => constants.%complete_type.d94
 // CHECK:STDOUT:   %pattern_type => constants.%pattern_type.47b
 // CHECK:STDOUT:   %facet_value => constants.%facet_value.5b4
+// CHECK:STDOUT:   %.loc15_3.1 => constants.%.53b
 // CHECK:STDOUT:   %Destroy.impl_witness => constants.%Destroy.impl_witness.db9
 // CHECK:STDOUT:   %Destroy.facet => constants.%Destroy.facet.b5f
-// CHECK:STDOUT:   %.loc15_3 => constants.%.54d
+// CHECK:STDOUT:   %.loc15_3.2 => constants.%.54d
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.7d2
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.cc2
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.6f4

+ 4 - 2
toolchain/check/testdata/function/generic/type_param.carbon

@@ -42,6 +42,7 @@ fn F(T:! type) {
 // CHECK:STDOUT:   %Destroy.impl_witness.60c: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.e46: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.9ef: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.e46 = struct_value () [symbolic]
+// CHECK:STDOUT:   %.209: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic]
 // CHECK:STDOUT:   %Destroy.facet: %Destroy.type = facet_value %ptr, (%Destroy.impl_witness.60c) [symbolic]
 // CHECK:STDOUT:   %.17f: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.9ef, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value) [symbolic]
@@ -82,9 +83,10 @@ fn F(T:! type) {
 // CHECK:STDOUT:   %require_complete.loc17: <witness> = require_complete_type %T.loc15_6.1 [symbolic = %require_complete.loc17 (constants.%require_complete.4b7)]
 // CHECK:STDOUT:   %pattern_type.loc17: type = pattern_type %T.loc15_6.1 [symbolic = %pattern_type.loc17 (constants.%pattern_type.e68)]
 // CHECK:STDOUT:   %facet_value: %type_where = facet_value %ptr.loc16_11.2, () [symbolic = %facet_value (constants.%facet_value)]
+// CHECK:STDOUT:   %.loc16_3.1: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %.loc16_3.1 (constants.%.209)]
 // CHECK:STDOUT:   %Destroy.impl_witness: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.60c)]
 // CHECK:STDOUT:   %Destroy.facet: %Destroy.type = facet_value %ptr.loc16_11.2, (%Destroy.impl_witness) [symbolic = %Destroy.facet (constants.%Destroy.facet)]
-// CHECK:STDOUT:   %.loc16_3: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc16_3 (constants.%.17f)]
+// CHECK:STDOUT:   %.loc16_3.2: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc16_3.2 (constants.%.17f)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.type (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.e46)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op: @F.%DestroyT.binding.as_type.as.Destroy.impl.Op.type (%DestroyT.binding.as_type.as.Destroy.impl.Op.type.e46) = struct_value () [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.9ef)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn)]
@@ -110,7 +112,7 @@ fn F(T:! type) {
 // CHECK:STDOUT:     %T.ref.loc17: type = name_ref T, %T.loc15_6.2 [symbolic = %T.loc15_6.1 (constants.%T)]
 // CHECK:STDOUT:     %.loc17_14.2: @F.%T.loc15_6.1 (%T) = acquire_value %.loc17_14.1
 // CHECK:STDOUT:     %n: @F.%T.loc15_6.1 (%T) = value_binding n, %.loc17_14.2
-// CHECK:STDOUT:     %impl.elem0: @F.%.loc16_3 (%.17f) = impl_witness_access constants.%Destroy.impl_witness.60c, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.9ef)]
+// CHECK:STDOUT:     %impl.elem0: @F.%.loc16_3.2 (%.17f) = impl_witness_access constants.%Destroy.impl_witness.60c, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.9ef)]
 // CHECK:STDOUT:     %bound_method.loc16_3.1: <bound method> = bound_method %p.var, %impl.elem0
 // CHECK:STDOUT:     %specific_fn: <specific function> = specific_function %impl.elem0, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn)]
 // CHECK:STDOUT:     %bound_method.loc16_3.2: <bound method> = bound_method %p.var, %specific_fn

+ 5 - 3
toolchain/check/testdata/function/generic/type_param_scope.carbon

@@ -29,6 +29,7 @@ fn F(T:! type, n: T*) -> T* {
 // CHECK:STDOUT:   %pattern_type.a60: type = pattern_type %ptr [symbolic]
 // CHECK:STDOUT:   %Copy.type: type = facet_type <@Copy> [concrete]
 // CHECK:STDOUT:   %Copy.Op.type: type = fn_type @Copy.Op [concrete]
+// CHECK:STDOUT:   %.dcd: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.d9f) [symbolic]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness.c66: <witness> = lookup_impl_witness %ptr, @Copy [symbolic]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr, (%Copy.lookup_impl_witness.c66) [symbolic]
 // CHECK:STDOUT:   %.89d: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet [symbolic]
@@ -44,10 +45,11 @@ fn F(T:! type, n: T*) -> T* {
 // CHECK:STDOUT:
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   <elided>
+// CHECK:STDOUT:   %.loc7_10.2: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.loc4_6.1) [symbolic = %.loc7_10.2 (constants.%.dcd)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr.loc4_20.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.c66)]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr.loc4_20.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet)]
-// CHECK:STDOUT:   %.loc7_10.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc7_10.2 (constants.%.89d)]
-// CHECK:STDOUT:   %impl.elem0.loc7_10.2: @F.%.loc7_10.2 (%.89d) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc7_10.2 (constants.%impl.elem0.928)]
+// CHECK:STDOUT:   %.loc7_10.3: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc7_10.3 (constants.%.89d)]
+// CHECK:STDOUT:   %impl.elem0.loc7_10.2: @F.%.loc7_10.3 (%.89d) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc7_10.2 (constants.%impl.elem0.928)]
 // CHECK:STDOUT:   %specific_impl_fn.loc7_10.2: <specific function> = specific_impl_function %impl.elem0.loc7_10.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc7_10.2 (constants.%specific_impl_fn.6a1)]
 // CHECK:STDOUT:
 // CHECK:STDOUT:   fn(%n.param: @F.%ptr.loc4_20.1 (%ptr)) -> @F.%ptr.loc4_20.1 (%ptr) {
@@ -62,7 +64,7 @@ fn F(T:! type, n: T*) -> T* {
 // CHECK:STDOUT:     }
 // CHECK:STDOUT:     %m: @F.%ptr.loc4_20.1 (%ptr) = value_binding m, %n.ref
 // CHECK:STDOUT:     %m.ref: @F.%ptr.loc4_20.1 (%ptr) = name_ref m, %m
-// CHECK:STDOUT:     %impl.elem0.loc7_10.1: @F.%.loc7_10.2 (%.89d) = impl_witness_access constants.%Copy.lookup_impl_witness.c66, element0 [symbolic = %impl.elem0.loc7_10.2 (constants.%impl.elem0.928)]
+// CHECK:STDOUT:     %impl.elem0.loc7_10.1: @F.%.loc7_10.3 (%.89d) = impl_witness_access constants.%Copy.lookup_impl_witness.c66, element0 [symbolic = %impl.elem0.loc7_10.2 (constants.%impl.elem0.928)]
 // CHECK:STDOUT:     %bound_method.loc7_10.1: <bound method> = bound_method %m.ref, %impl.elem0.loc7_10.1
 // CHECK:STDOUT:     %specific_impl_fn.loc7_10.1: <specific function> = specific_impl_function %impl.elem0.loc7_10.1, @Copy.Op(constants.%Copy.facet) [symbolic = %specific_impl_fn.loc7_10.2 (constants.%specific_impl_fn.6a1)]
 // CHECK:STDOUT:     %bound_method.loc7_10.2: <bound method> = bound_method %m.ref, %specific_impl_fn.loc7_10.1

+ 18 - 10
toolchain/check/testdata/generic/complete_type.carbon

@@ -221,6 +221,7 @@ fn G() { F(B); }
 // CHECK:STDOUT:   %Destroy.impl_witness.60c: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.ddd) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.e46: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.ddd) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.9ef: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.e46 = struct_value () [symbolic]
+// CHECK:STDOUT:   %.209: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.ddd) [symbolic]
 // CHECK:STDOUT:   %Destroy.facet.78b: %Destroy.type = facet_value %ptr.4f0, (%Destroy.impl_witness.60c) [symbolic]
 // CHECK:STDOUT:   %.17f: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.78b [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.af8: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.9ef, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.ddd) [symbolic]
@@ -234,10 +235,11 @@ fn G() { F(B); }
 // CHECK:STDOUT:   %pattern_type.960: type = pattern_type %ptr.e79 [concrete]
 // CHECK:STDOUT:   %facet_value.888: %type_where = facet_value %ptr.e79, () [concrete]
 // CHECK:STDOUT:   %Destroy.impl_witness.42f: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.888) [concrete]
-// CHECK:STDOUT:   %Destroy.facet.de3: %Destroy.type = facet_value %ptr.e79, (%Destroy.impl_witness.42f) [concrete]
-// CHECK:STDOUT:   %.dfd: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.de3 [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.b47: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.888) [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.c02: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.b47 = struct_value () [concrete]
+// CHECK:STDOUT:   %.9d3: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.888) [concrete]
+// CHECK:STDOUT:   %Destroy.facet.de3: %Destroy.type = facet_value %ptr.e79, (%Destroy.impl_witness.42f) [concrete]
+// CHECK:STDOUT:   %.dfd: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.de3 [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.a4b: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.c02, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.888) [concrete]
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
@@ -288,9 +290,10 @@ fn G() { F(B); }
 // CHECK:STDOUT:   %pattern_type: type = pattern_type %ptr.loc7_11.2 [symbolic = %pattern_type (constants.%pattern_type.a60)]
 // CHECK:STDOUT:   %require_complete.loc8: <witness> = require_complete_type %T.loc6_6.1 [symbolic = %require_complete.loc8 (constants.%require_complete.4b7)]
 // CHECK:STDOUT:   %facet_value: %type_where = facet_value %ptr.loc7_11.2, () [symbolic = %facet_value (constants.%facet_value.ddd)]
+// CHECK:STDOUT:   %.loc7_3.1: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %.loc7_3.1 (constants.%.209)]
 // CHECK:STDOUT:   %Destroy.impl_witness: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.60c)]
 // CHECK:STDOUT:   %Destroy.facet: %Destroy.type = facet_value %ptr.loc7_11.2, (%Destroy.impl_witness) [symbolic = %Destroy.facet (constants.%Destroy.facet.78b)]
-// CHECK:STDOUT:   %.loc7_3: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc7_3 (constants.%.17f)]
+// CHECK:STDOUT:   %.loc7_3.2: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc7_3.2 (constants.%.17f)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.type (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.e46)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op: @F.%DestroyT.binding.as_type.as.Destroy.impl.Op.type (%DestroyT.binding.as_type.as.Destroy.impl.Op.type.e46) = struct_value () [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.9ef)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.af8)]
@@ -310,7 +313,7 @@ fn G() { F(B); }
 // CHECK:STDOUT:     %v.ref: ref @F.%ptr.loc7_11.2 (%ptr.4f0) = name_ref v, %v
 // CHECK:STDOUT:     %.loc8_4: @F.%ptr.loc7_11.2 (%ptr.4f0) = acquire_value %v.ref
 // CHECK:STDOUT:     %.loc8_3: ref @F.%T.loc6_6.1 (%T) = deref %.loc8_4
-// CHECK:STDOUT:     %impl.elem0: @F.%.loc7_3 (%.17f) = impl_witness_access constants.%Destroy.impl_witness.60c, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.9ef)]
+// CHECK:STDOUT:     %impl.elem0: @F.%.loc7_3.2 (%.17f) = impl_witness_access constants.%Destroy.impl_witness.60c, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.9ef)]
 // CHECK:STDOUT:     %bound_method.loc7_3.1: <bound method> = bound_method %v.var, %impl.elem0
 // CHECK:STDOUT:     %specific_fn: <specific function> = specific_function %impl.elem0, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value.ddd) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.af8)]
 // CHECK:STDOUT:     %bound_method.loc7_3.2: <bound method> = bound_method %v.var, %specific_fn
@@ -341,9 +344,10 @@ fn G() { F(B); }
 // CHECK:STDOUT:   %pattern_type => constants.%pattern_type.960
 // CHECK:STDOUT:   %require_complete.loc8 => constants.%complete_type.357
 // CHECK:STDOUT:   %facet_value => constants.%facet_value.888
+// CHECK:STDOUT:   %.loc7_3.1 => constants.%.9d3
 // CHECK:STDOUT:   %Destroy.impl_witness => constants.%Destroy.impl_witness.42f
 // CHECK:STDOUT:   %Destroy.facet => constants.%Destroy.facet.de3
-// CHECK:STDOUT:   %.loc7_3 => constants.%.dfd
+// CHECK:STDOUT:   %.loc7_3.2 => constants.%.dfd
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.b47
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.c02
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.a4b
@@ -374,6 +378,7 @@ fn G() { F(B); }
 // CHECK:STDOUT:   %Destroy.impl_witness.60c: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.ddd) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.e46: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.ddd) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.9ef: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.e46 = struct_value () [symbolic]
+// CHECK:STDOUT:   %.209: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.ddd) [symbolic]
 // CHECK:STDOUT:   %Destroy.facet.78b: %Destroy.type = facet_value %ptr.4f0, (%Destroy.impl_witness.60c) [symbolic]
 // CHECK:STDOUT:   %.17f: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.78b [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.af8: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.9ef, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.ddd) [symbolic]
@@ -385,10 +390,11 @@ fn G() { F(B); }
 // CHECK:STDOUT:   %pattern_type.960: type = pattern_type %ptr.e79 [concrete]
 // CHECK:STDOUT:   %facet_value.888: %type_where = facet_value %ptr.e79, () [concrete]
 // CHECK:STDOUT:   %Destroy.impl_witness.42f: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.888) [concrete]
-// CHECK:STDOUT:   %Destroy.facet.de3: %Destroy.type = facet_value %ptr.e79, (%Destroy.impl_witness.42f) [concrete]
-// CHECK:STDOUT:   %.dfd: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.de3 [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.b47: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.888) [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.c02: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.b47 = struct_value () [concrete]
+// CHECK:STDOUT:   %.9d3: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.888) [concrete]
+// CHECK:STDOUT:   %Destroy.facet.de3: %Destroy.type = facet_value %ptr.e79, (%Destroy.impl_witness.42f) [concrete]
+// CHECK:STDOUT:   %.dfd: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.de3 [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.a4b: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.c02, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.888) [concrete]
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
@@ -432,9 +438,10 @@ fn G() { F(B); }
 // CHECK:STDOUT:   %pattern_type: type = pattern_type %ptr.loc7_11.2 [symbolic = %pattern_type (constants.%pattern_type.a60)]
 // CHECK:STDOUT:   %require_complete.loc14: <witness> = require_complete_type %T.loc6_6.1 [symbolic = %require_complete.loc14 (constants.%require_complete.4b7)]
 // CHECK:STDOUT:   %facet_value: %type_where = facet_value %ptr.loc7_11.2, () [symbolic = %facet_value (constants.%facet_value.ddd)]
+// CHECK:STDOUT:   %.loc7_3.1: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %.loc7_3.1 (constants.%.209)]
 // CHECK:STDOUT:   %Destroy.impl_witness: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.60c)]
 // CHECK:STDOUT:   %Destroy.facet: %Destroy.type = facet_value %ptr.loc7_11.2, (%Destroy.impl_witness) [symbolic = %Destroy.facet (constants.%Destroy.facet.78b)]
-// CHECK:STDOUT:   %.loc7_3: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc7_3 (constants.%.17f)]
+// CHECK:STDOUT:   %.loc7_3.2: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc7_3.2 (constants.%.17f)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.type (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.e46)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op: @F.%DestroyT.binding.as_type.as.Destroy.impl.Op.type (%DestroyT.binding.as_type.as.Destroy.impl.Op.type.e46) = struct_value () [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.9ef)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.af8)]
@@ -454,7 +461,7 @@ fn G() { F(B); }
 // CHECK:STDOUT:     %v.ref: ref @F.%ptr.loc7_11.2 (%ptr.4f0) = name_ref v, %v
 // CHECK:STDOUT:     %.loc14_4: @F.%ptr.loc7_11.2 (%ptr.4f0) = acquire_value %v.ref
 // CHECK:STDOUT:     %.loc14_3: ref @F.%T.loc6_6.1 (%T) = deref %.loc14_4
-// CHECK:STDOUT:     %impl.elem0: @F.%.loc7_3 (%.17f) = impl_witness_access constants.%Destroy.impl_witness.60c, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.9ef)]
+// CHECK:STDOUT:     %impl.elem0: @F.%.loc7_3.2 (%.17f) = impl_witness_access constants.%Destroy.impl_witness.60c, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.9ef)]
 // CHECK:STDOUT:     %bound_method.loc7_3.1: <bound method> = bound_method %v.var, %impl.elem0
 // CHECK:STDOUT:     %specific_fn: <specific function> = specific_function %impl.elem0, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value.ddd) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.af8)]
 // CHECK:STDOUT:     %bound_method.loc7_3.2: <bound method> = bound_method %v.var, %specific_fn
@@ -485,9 +492,10 @@ fn G() { F(B); }
 // CHECK:STDOUT:   %pattern_type => constants.%pattern_type.960
 // CHECK:STDOUT:   %require_complete.loc14 => <error>
 // CHECK:STDOUT:   %facet_value => constants.%facet_value.888
+// CHECK:STDOUT:   %.loc7_3.1 => constants.%.9d3
 // CHECK:STDOUT:   %Destroy.impl_witness => constants.%Destroy.impl_witness.42f
 // CHECK:STDOUT:   %Destroy.facet => constants.%Destroy.facet.de3
-// CHECK:STDOUT:   %.loc7_3 => constants.%.dfd
+// CHECK:STDOUT:   %.loc7_3.2 => constants.%.dfd
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.b47
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.c02
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.a4b

+ 5 - 1
toolchain/check/testdata/generic/dot_self_symbolic_type.carbon

@@ -340,6 +340,7 @@ fn H(T:! type) {
 // CHECK:STDOUT:   %empty_struct_type: type = struct_type {} [concrete]
 // CHECK:STDOUT:   %ptr.4f0b5c.2: type = ptr_type %DD [symbolic]
 // CHECK:STDOUT:   %B.type.1e50b2.2: type = facet_type <@B, @B(%ptr.4f0b5c.2)> [symbolic]
+// CHECK:STDOUT:   %.0a8: require_specific_def_type = require_specific_def @BB.as.B.impl(%ptr.4f0b5c.2, %T.b88) [symbolic]
 // CHECK:STDOUT:   %B.lookup_impl_witness.57f: <witness> = lookup_impl_witness %T.b88, @B, @B(%ptr.4f0b5c.2) [symbolic]
 // CHECK:STDOUT:   %B.facet.88e: %B.type.1e50b2.2 = facet_value %T.b88, (%B.lookup_impl_witness.57f) [symbolic]
 // CHECK:STDOUT:   %T.d9f: type = symbolic_binding T, 0 [symbolic]
@@ -347,6 +348,7 @@ fn H(T:! type) {
 // CHECK:STDOUT:   %D.G.54c: %D.G.type.0da = struct_value () [concrete]
 // CHECK:STDOUT:   %ptr.c28: type = ptr_type %empty_struct_type [concrete]
 // CHECK:STDOUT:   %B.type.997: type = facet_type <@B, @B(%ptr.c28)> [concrete]
+// CHECK:STDOUT:   %.be0: require_specific_def_type = require_specific_def @BB.as.B.impl(%ptr.c28, %T.d9f) [symbolic]
 // CHECK:STDOUT:   %B.lookup_impl_witness.10f: <witness> = lookup_impl_witness %T.d9f, @B, @B(%ptr.c28) [symbolic]
 // CHECK:STDOUT:   %B.facet.a05: %B.type.997 = facet_value %T.d9f, (%B.lookup_impl_witness.10f) [symbolic]
 // CHECK:STDOUT: }
@@ -442,6 +444,7 @@ fn H(T:! type) {
 // CHECK:STDOUT:   %DD: type = symbolic_binding DD, 0 [symbolic = %DD (constants.%DD)]
 // CHECK:STDOUT:   %ptr.loc21_14.2: type = ptr_type %DD [symbolic = %ptr.loc21_14.2 (constants.%ptr.4f0b5c.2)]
 // CHECK:STDOUT:   %B.type.loc21_15.2: type = facet_type <@B, @B(%ptr.loc21_14.2)> [symbolic = %B.type.loc21_15.2 (constants.%B.type.1e50b2.2)]
+// CHECK:STDOUT:   %.loc21_7.2: require_specific_def_type = require_specific_def @BB.as.B.impl(%ptr.loc21_14.2, %T.loc15_8.1) [symbolic = %.loc21_7.2 (constants.%.0a8)]
 // CHECK:STDOUT:   %B.lookup_impl_witness: <witness> = lookup_impl_witness %T.loc15_8.1, @B, @B(%ptr.loc21_14.2) [symbolic = %B.lookup_impl_witness (constants.%B.lookup_impl_witness.57f)]
 // CHECK:STDOUT:   %B.facet.loc21_7.2: @D.G.%B.type.loc21_15.2 (%B.type.1e50b2.2) = facet_value %T.loc15_8.1, (%B.lookup_impl_witness) [symbolic = %B.facet.loc21_7.2 (constants.%B.facet.88e)]
 // CHECK:STDOUT:
@@ -453,7 +456,7 @@ fn H(T:! type) {
 // CHECK:STDOUT:     %ptr.loc21_14.1: type = ptr_type %DD.ref [symbolic = %ptr.loc21_14.2 (constants.%ptr.4f0b5c.2)]
 // CHECK:STDOUT:     %B.type.loc21_15.1: type = facet_type <@B, @B(constants.%ptr.4f0b5c.2)> [symbolic = %B.type.loc21_15.2 (constants.%B.type.1e50b2.2)]
 // CHECK:STDOUT:     %B.facet.loc21_7.1: @D.G.%B.type.loc21_15.2 (%B.type.1e50b2.2) = facet_value %T.ref, (constants.%B.lookup_impl_witness.57f) [symbolic = %B.facet.loc21_7.2 (constants.%B.facet.88e)]
-// CHECK:STDOUT:     %.loc21: @D.G.%B.type.loc21_15.2 (%B.type.1e50b2.2) = converted %T.ref, %B.facet.loc21_7.1 [symbolic = %B.facet.loc21_7.2 (constants.%B.facet.88e)]
+// CHECK:STDOUT:     %.loc21_7.1: @D.G.%B.type.loc21_15.2 (%B.type.1e50b2.2) = converted %T.ref, %B.facet.loc21_7.1 [symbolic = %B.facet.loc21_7.2 (constants.%B.facet.88e)]
 // CHECK:STDOUT:     <elided>
 // CHECK:STDOUT:   }
 // CHECK:STDOUT: }
@@ -505,6 +508,7 @@ fn H(T:! type) {
 // CHECK:STDOUT:   %DD => constants.%empty_struct_type
 // CHECK:STDOUT:   %ptr.loc21_14.2 => constants.%ptr.c28
 // CHECK:STDOUT:   %B.type.loc21_15.2 => constants.%B.type.997
+// CHECK:STDOUT:   %.loc21_7.2 => constants.%.be0
 // CHECK:STDOUT:   %B.lookup_impl_witness => constants.%B.lookup_impl_witness.10f
 // CHECK:STDOUT:   %B.facet.loc21_7.2 => constants.%B.facet.a05
 // CHECK:STDOUT: }

+ 5 - 3
toolchain/check/testdata/generic/template_dependence.carbon

@@ -45,6 +45,7 @@ fn F(template T:! type, U:! type) -> (T, U) {
 // CHECK:STDOUT:   %require_complete.6d1: <witness> = require_complete_type %ptr.3f2 [template]
 // CHECK:STDOUT:   %Copy.type: type = facet_type <@Copy> [concrete]
 // CHECK:STDOUT:   %Copy.Op.type: type = fn_type @Copy.Op [concrete]
+// CHECK:STDOUT:   %.dcd: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.d9fe7a.1) [template]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness.c66: <witness> = lookup_impl_witness %ptr.4f0b5c.1, @Copy [template]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr.4f0b5c.1, (%Copy.lookup_impl_witness.c66) [template]
 // CHECK:STDOUT:   %.89d: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet [template]
@@ -89,10 +90,11 @@ fn F(template T:! type, U:! type) -> (T, U) {
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %require_complete.loc5_33: <witness> = require_complete_type %ptr.loc5_29.1 [template = %require_complete.loc5_33 (constants.%require_complete.482d3f.1)]
 // CHECK:STDOUT:   %require_complete.loc5_26: <witness> = require_complete_type %ptr.loc5_30.1 [template = %require_complete.loc5_26 (constants.%require_complete.6d1)]
+// CHECK:STDOUT:   %.loc6_10.4: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.loc5_15.1) [template = %.loc6_10.4 (constants.%.dcd)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr.loc5_29.1, @Copy [template = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.c66)]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr.loc5_29.1, (%Copy.lookup_impl_witness) [template = %Copy.facet (constants.%Copy.facet)]
-// CHECK:STDOUT:   %.loc6_10.4: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [template = %.loc6_10.4 (constants.%.89d)]
-// CHECK:STDOUT:   %impl.elem0.loc6_10.2: @F.%.loc6_10.4 (%.89d) = impl_witness_access %Copy.lookup_impl_witness, element0 [template = %impl.elem0.loc6_10.2 (constants.%impl.elem0.928)]
+// CHECK:STDOUT:   %.loc6_10.5: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [template = %.loc6_10.5 (constants.%.89d)]
+// CHECK:STDOUT:   %impl.elem0.loc6_10.2: @F.%.loc6_10.5 (%.89d) = impl_witness_access %Copy.lookup_impl_witness, element0 [template = %impl.elem0.loc6_10.2 (constants.%impl.elem0.928)]
 // CHECK:STDOUT:   %specific_impl_fn.loc6_10.2: <specific function> = specific_impl_function %impl.elem0.loc6_10.2, @Copy.Op(%Copy.facet) [template = %specific_impl_fn.loc6_10.2 (constants.%specific_impl_fn.6a1)]
 // CHECK:STDOUT:
 // CHECK:STDOUT:   fn(%x.param: @F.%ptr.loc5_30.1 (%ptr.3f2)) -> @F.%ptr.loc5_29.1 (%ptr.4f0b5c.1) {
@@ -100,7 +102,7 @@ fn F(template T:! type, U:! type) -> (T, U) {
 // CHECK:STDOUT:     %x.ref: @F.%ptr.loc5_30.1 (%ptr.3f2) = name_ref x, %x
 // CHECK:STDOUT:     %.loc6_10.1: ref @F.%ptr.loc5_29.1 (%ptr.4f0b5c.1) = deref %x.ref
 // CHECK:STDOUT:     %.loc6_10.2: @F.%ptr.loc5_29.1 (%ptr.4f0b5c.1) = acquire_value %.loc6_10.1
-// CHECK:STDOUT:     %impl.elem0.loc6_10.1: @F.%.loc6_10.4 (%.89d) = impl_witness_access constants.%Copy.lookup_impl_witness.c66, element0 [template = %impl.elem0.loc6_10.2 (constants.%impl.elem0.928)]
+// CHECK:STDOUT:     %impl.elem0.loc6_10.1: @F.%.loc6_10.5 (%.89d) = impl_witness_access constants.%Copy.lookup_impl_witness.c66, element0 [template = %impl.elem0.loc6_10.2 (constants.%impl.elem0.928)]
 // CHECK:STDOUT:     %bound_method.loc6_10.1: <bound method> = bound_method %.loc6_10.2, %impl.elem0.loc6_10.1
 // CHECK:STDOUT:     %specific_impl_fn.loc6_10.1: <specific function> = specific_impl_function %impl.elem0.loc6_10.1, @Copy.Op(constants.%Copy.facet) [template = %specific_impl_fn.loc6_10.2 (constants.%specific_impl_fn.6a1)]
 // CHECK:STDOUT:     %bound_method.loc6_10.2: <bound method> = bound_method %.loc6_10.2, %specific_impl_fn.loc6_10.1

+ 8 - 2
toolchain/check/testdata/impl/error_recovery.carbon

@@ -163,6 +163,7 @@ impl C as I {
 // CHECK:STDOUT:   %F: %F.type = struct_value () [concrete]
 // CHECK:STDOUT:   %G.type: type = fn_type @G [concrete]
 // CHECK:STDOUT:   %G: %G.type = struct_value () [concrete]
+// CHECK:STDOUT:   %.b31: require_specific_def_type = require_specific_def @T.as.Z.impl(%T) [symbolic]
 // CHECK:STDOUT:   %Z.lookup_impl_witness: <witness> = lookup_impl_witness %T, @Z [symbolic]
 // CHECK:STDOUT:   %Z.facet: %Z.type = facet_value %T, (%Z.lookup_impl_witness) [symbolic]
 // CHECK:STDOUT:   %F.specific_fn: <specific function> = specific_function %F, @F(%Z.facet) [symbolic]
@@ -181,6 +182,7 @@ impl C as I {
 // CHECK:STDOUT:   %T.loc13_6.1: type = symbolic_binding T, 0 [symbolic = %T.loc13_6.1 (constants.%T)]
 // CHECK:STDOUT:
 // CHECK:STDOUT: !definition:
+// CHECK:STDOUT:   %.loc19_6.2: require_specific_def_type = require_specific_def @T.as.Z.impl(%T.loc13_6.1) [symbolic = %.loc19_6.2 (constants.%.b31)]
 // CHECK:STDOUT:   %Z.lookup_impl_witness: <witness> = lookup_impl_witness %T.loc13_6.1, @Z [symbolic = %Z.lookup_impl_witness (constants.%Z.lookup_impl_witness)]
 // CHECK:STDOUT:   %Z.facet.loc19_6.2: %Z.type = facet_value %T.loc13_6.1, (%Z.lookup_impl_witness) [symbolic = %Z.facet.loc19_6.2 (constants.%Z.facet)]
 // CHECK:STDOUT:   %F.specific_fn.loc19_3.2: <specific function> = specific_function constants.%F, @F(%Z.facet.loc19_6.2) [symbolic = %F.specific_fn.loc19_3.2 (constants.%F.specific_fn)]
@@ -190,7 +192,7 @@ impl C as I {
 // CHECK:STDOUT:     %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F]
 // CHECK:STDOUT:     %T.ref: type = name_ref T, %T.loc13_6.2 [symbolic = %T.loc13_6.1 (constants.%T)]
 // CHECK:STDOUT:     %Z.facet.loc19_6.1: %Z.type = facet_value %T.ref, (constants.%Z.lookup_impl_witness) [symbolic = %Z.facet.loc19_6.2 (constants.%Z.facet)]
-// CHECK:STDOUT:     %.loc19: %Z.type = converted %T.ref, %Z.facet.loc19_6.1 [symbolic = %Z.facet.loc19_6.2 (constants.%Z.facet)]
+// CHECK:STDOUT:     %.loc19_6.1: %Z.type = converted %T.ref, %Z.facet.loc19_6.1 [symbolic = %Z.facet.loc19_6.2 (constants.%Z.facet)]
 // CHECK:STDOUT:     %F.specific_fn.loc19_3.1: <specific function> = specific_function %F.ref, @F(constants.%Z.facet) [symbolic = %F.specific_fn.loc19_3.2 (constants.%F.specific_fn)]
 // CHECK:STDOUT:     %F.call: init %empty_tuple.type = call %F.specific_fn.loc19_3.1()
 // CHECK:STDOUT:     return
@@ -212,9 +214,11 @@ impl C as I {
 // CHECK:STDOUT:   %F: %F.type = struct_value () [concrete]
 // CHECK:STDOUT:   %G.type: type = fn_type @G [concrete]
 // CHECK:STDOUT:   %G: %G.type = struct_value () [concrete]
+// CHECK:STDOUT:   %.b31: require_specific_def_type = require_specific_def @T.as.Z.impl(%T) [symbolic]
 // CHECK:STDOUT:   %Z.lookup_impl_witness: <witness> = lookup_impl_witness %T, @Z [symbolic]
 // CHECK:STDOUT:   %Z.facet: %Z.type = facet_value %T, (%Z.lookup_impl_witness) [symbolic]
 // CHECK:STDOUT:   %F.specific_fn: <specific function> = specific_function %F, @F(%Z.facet) [symbolic]
+// CHECK:STDOUT:   %.0df: require_specific_def_type = require_specific_def @T.as.Z.impl(%empty_tuple.type) [concrete]
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
@@ -230,6 +234,7 @@ impl C as I {
 // CHECK:STDOUT:   %T.loc13_6.1: type = symbolic_binding T, 0 [symbolic = %T.loc13_6.1 (constants.%T)]
 // CHECK:STDOUT:
 // CHECK:STDOUT: !definition:
+// CHECK:STDOUT:   %.loc19_6.2: require_specific_def_type = require_specific_def @T.as.Z.impl(%T.loc13_6.1) [symbolic = %.loc19_6.2 (constants.%.b31)]
 // CHECK:STDOUT:   %Z.lookup_impl_witness: <witness> = lookup_impl_witness %T.loc13_6.1, @Z [symbolic = %Z.lookup_impl_witness (constants.%Z.lookup_impl_witness)]
 // CHECK:STDOUT:   %Z.facet.loc19_6.2: %Z.type = facet_value %T.loc13_6.1, (%Z.lookup_impl_witness) [symbolic = %Z.facet.loc19_6.2 (constants.%Z.facet)]
 // CHECK:STDOUT:   %F.specific_fn.loc19_3.2: <specific function> = specific_function constants.%F, @F(%Z.facet.loc19_6.2) [symbolic = %F.specific_fn.loc19_3.2 (constants.%F.specific_fn)]
@@ -239,7 +244,7 @@ impl C as I {
 // CHECK:STDOUT:     %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F]
 // CHECK:STDOUT:     %T.ref: type = name_ref T, %T.loc13_6.2 [symbolic = %T.loc13_6.1 (constants.%T)]
 // CHECK:STDOUT:     %Z.facet.loc19_6.1: %Z.type = facet_value %T.ref, (constants.%Z.lookup_impl_witness) [symbolic = %Z.facet.loc19_6.2 (constants.%Z.facet)]
-// CHECK:STDOUT:     %.loc19: %Z.type = converted %T.ref, %Z.facet.loc19_6.1 [symbolic = %Z.facet.loc19_6.2 (constants.%Z.facet)]
+// CHECK:STDOUT:     %.loc19_6.1: %Z.type = converted %T.ref, %Z.facet.loc19_6.1 [symbolic = %Z.facet.loc19_6.2 (constants.%Z.facet)]
 // CHECK:STDOUT:     %F.specific_fn.loc19_3.1: <specific function> = specific_function %F.ref, @F(constants.%Z.facet) [symbolic = %F.specific_fn.loc19_3.2 (constants.%F.specific_fn)]
 // CHECK:STDOUT:     %F.call: init %empty_tuple.type = call %F.specific_fn.loc19_3.1()
 // CHECK:STDOUT:     return
@@ -254,6 +259,7 @@ impl C as I {
 // CHECK:STDOUT:   %T.loc13_6.1 => constants.%empty_tuple.type
 // CHECK:STDOUT:
 // CHECK:STDOUT: !definition:
+// CHECK:STDOUT:   %.loc19_6.2 => constants.%.0df
 // CHECK:STDOUT:   %Z.lookup_impl_witness => <error>
 // CHECK:STDOUT:   %Z.facet.loc19_6.2 => <error>
 // CHECK:STDOUT:   %F.specific_fn.loc19_3.2 => <error>

+ 4 - 0
toolchain/check/testdata/impl/impl_thunk.carbon

@@ -827,6 +827,7 @@ impl () as I({}) {
 // CHECK:STDOUT:   %.a79665.2: type = fn_type_with_self_type %Copy.Op.type, %U.417 [symbolic]
 // CHECK:STDOUT:   %impl.elem0.fac0be.2: %.a79665.2 = impl_witness_access %Copy.lookup_impl_witness.c42a3d.2, element0 [symbolic]
 // CHECK:STDOUT:   %specific_impl_fn.103937.2: <specific function> = specific_impl_function %impl.elem0.fac0be.2, @Copy.Op(%U.417) [symbolic]
+// CHECK:STDOUT:   %.dcd: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.d9f) [symbolic]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness.c66: <witness> = lookup_impl_witness %ptr.4f0, @Copy [symbolic]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr.4f0, (%Copy.lookup_impl_witness.c66) [symbolic]
 // CHECK:STDOUT:   %empty_tuple.type.as.I.impl.F.specific_fn: <specific function> = specific_function %empty_tuple.type.as.I.impl.F.f1aebb.1, @empty_tuple.type.as.I.impl.F.loc10_34.1(%Copy.facet) [symbolic]
@@ -911,6 +912,7 @@ impl () as I({}) {
 // CHECK:STDOUT:   <elided>
 // CHECK:STDOUT:
 // CHECK:STDOUT: !definition:
+// CHECK:STDOUT:   %.loc10_34.3: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.loc5_8.1) [symbolic = %.loc10_34.3 (constants.%.dcd)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.c66)]
 // CHECK:STDOUT:   %Copy.facet.loc10_34.3: %Copy.type = facet_value %ptr, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet.loc10_34.3 (constants.%Copy.facet)]
 // CHECK:STDOUT:   %empty_tuple.type.as.I.impl.F.specific_fn.loc10_34.2: <specific function> = specific_function constants.%empty_tuple.type.as.I.impl.F.f1aebb.1, @empty_tuple.type.as.I.impl.F.loc10_34.1(%Copy.facet.loc10_34.3) [symbolic = %empty_tuple.type.as.I.impl.F.specific_fn.loc10_34.2 (constants.%empty_tuple.type.as.I.impl.F.specific_fn)]
@@ -980,6 +982,7 @@ impl () as I({}) {
 // CHECK:STDOUT:   %.a79665.2: type = fn_type_with_self_type %Copy.Op.type, %U.417 [symbolic]
 // CHECK:STDOUT:   %impl.elem0.fac0be.2: %.a79665.2 = impl_witness_access %Copy.lookup_impl_witness.c42a3d.2, element0 [symbolic]
 // CHECK:STDOUT:   %specific_impl_fn.103937.2: <specific function> = specific_impl_function %impl.elem0.fac0be.2, @Copy.Op(%U.417) [symbolic]
+// CHECK:STDOUT:   %.dcd: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.d9f) [symbolic]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness.c66: <witness> = lookup_impl_witness %ptr.4f0, @Copy [symbolic]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr.4f0, (%Copy.lookup_impl_witness.c66) [symbolic]
 // CHECK:STDOUT:   %empty_tuple.type.as.I.impl.F.specific_fn: <specific function> = specific_function %empty_tuple.type.as.I.impl.F.f1aebb.1, @empty_tuple.type.as.I.impl.F.loc10_44.1(%Copy.facet) [symbolic]
@@ -1072,6 +1075,7 @@ impl () as I({}) {
 // CHECK:STDOUT:   <elided>
 // CHECK:STDOUT:
 // CHECK:STDOUT: !definition:
+// CHECK:STDOUT:   %.loc10_44.3: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.loc5_20.1) [symbolic = %.loc10_44.3 (constants.%.dcd)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.c66)]
 // CHECK:STDOUT:   %Copy.facet.loc10_44.3: %Copy.type = facet_value %ptr, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet.loc10_44.3 (constants.%Copy.facet)]
 // CHECK:STDOUT:   %empty_tuple.type.as.I.impl.F.specific_fn.loc10_44.2: <specific function> = specific_function constants.%empty_tuple.type.as.I.impl.F.f1aebb.1, @empty_tuple.type.as.I.impl.F.loc10_44.1(%Copy.facet.loc10_44.3) [symbolic = %empty_tuple.type.as.I.impl.F.specific_fn.loc10_44.2 (constants.%empty_tuple.type.as.I.impl.F.specific_fn)]

+ 31 - 25
toolchain/check/testdata/impl/import_builtin_call.carbon

@@ -108,6 +108,7 @@ var n: Int(64) = MakeFromClass(FromLiteral(64) as OtherInt);
 // CHECK:STDOUT:   %Add.facet.099: %Add.type = facet_value %MyInt, (%Add.impl_witness) [symbolic]
 // CHECK:STDOUT:   %Double.type: type = fn_type @Double [concrete]
 // CHECK:STDOUT:   %Double: %Double.type = struct_value () [concrete]
+// CHECK:STDOUT:   %.bc4: require_specific_def_type = require_specific_def @MyInt.as.Add.impl(%N) [symbolic]
 // CHECK:STDOUT:   %Add.lookup_impl_witness: <witness> = lookup_impl_witness %MyInt, @Add [symbolic]
 // CHECK:STDOUT:   %Add.facet.98c: %Add.type = facet_value %MyInt, (%Add.lookup_impl_witness) [symbolic]
 // CHECK:STDOUT:   %.99e: type = fn_type_with_self_type %Add.Op.type, %Add.facet.98c [symbolic]
@@ -338,10 +339,11 @@ var n: Int(64) = MakeFromClass(FromLiteral(64) as OtherInt);
 // CHECK:STDOUT:
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %require_complete: <witness> = require_complete_type %MyInt.loc19_39.1 [symbolic = %require_complete (constants.%require_complete.a87)]
+// CHECK:STDOUT:   %.loc20_11.1: require_specific_def_type = require_specific_def @MyInt.as.Add.impl(%N.loc19_11.1) [symbolic = %.loc20_11.1 (constants.%.bc4)]
 // CHECK:STDOUT:   %Add.lookup_impl_witness: <witness> = lookup_impl_witness %MyInt.loc19_39.1, @Add [symbolic = %Add.lookup_impl_witness (constants.%Add.lookup_impl_witness)]
 // CHECK:STDOUT:   %Add.facet.loc20_11: %Add.type = facet_value %MyInt.loc19_39.1, (%Add.lookup_impl_witness) [symbolic = %Add.facet.loc20_11 (constants.%Add.facet.98c)]
-// CHECK:STDOUT:   %.loc20_11: type = fn_type_with_self_type constants.%Add.Op.type, %Add.facet.loc20_11 [symbolic = %.loc20_11 (constants.%.99e)]
-// CHECK:STDOUT:   %impl.elem0.loc20_11.2: @Double.%.loc20_11 (%.99e) = impl_witness_access %Add.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc20_11.2 (constants.%impl.elem0)]
+// CHECK:STDOUT:   %.loc20_11.2: type = fn_type_with_self_type constants.%Add.Op.type, %Add.facet.loc20_11 [symbolic = %.loc20_11.2 (constants.%.99e)]
+// CHECK:STDOUT:   %impl.elem0.loc20_11.2: @Double.%.loc20_11.2 (%.99e) = impl_witness_access %Add.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc20_11.2 (constants.%impl.elem0)]
 // CHECK:STDOUT:   %specific_impl_fn.loc20_11.2: <specific function> = specific_impl_function %impl.elem0.loc20_11.2, @Add.Op(%Add.facet.loc20_11) [symbolic = %specific_impl_fn.loc20_11.2 (constants.%specific_impl_fn)]
 // CHECK:STDOUT:
 // CHECK:STDOUT:   fn(%x.param: @Double.%MyInt.loc19_39.1 (%MyInt)) -> @Double.%MyInt.loc19_39.1 (%MyInt) {
@@ -349,7 +351,7 @@ var n: Int(64) = MakeFromClass(FromLiteral(64) as OtherInt);
 // CHECK:STDOUT:     %x.ref.loc20_10: @Double.%MyInt.loc19_39.1 (%MyInt) = name_ref x, %x
 // CHECK:STDOUT:     %Add.ref: type = name_ref Add, file.%Add.decl [concrete = constants.%Add.type]
 // CHECK:STDOUT:     %Op.ref: %Add.assoc_type = name_ref Op, @Add.%assoc0 [concrete = constants.%assoc0]
-// CHECK:STDOUT:     %impl.elem0.loc20_11.1: @Double.%.loc20_11 (%.99e) = impl_witness_access constants.%Add.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc20_11.2 (constants.%impl.elem0)]
+// CHECK:STDOUT:     %impl.elem0.loc20_11.1: @Double.%.loc20_11.2 (%.99e) = impl_witness_access constants.%Add.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc20_11.2 (constants.%impl.elem0)]
 // CHECK:STDOUT:     %bound_method.loc20_11: <bound method> = bound_method %x.ref.loc20_10, %impl.elem0.loc20_11.1
 // CHECK:STDOUT:     %x.ref.loc20_21: @Double.%MyInt.loc19_39.1 (%MyInt) = name_ref x, %x
 // CHECK:STDOUT:     %Add.facet.loc20_22.1: %Add.type = facet_value constants.%MyInt, (constants.%Add.lookup_impl_witness) [symbolic = %Add.facet.loc20_11 (constants.%Add.facet.98c)]
@@ -443,14 +445,16 @@ var n: Int(64) = MakeFromClass(FromLiteral(64) as OtherInt);
 // CHECK:STDOUT:   %.99e: type = fn_type_with_self_type %Add.Op.type, %Add.facet.98c [symbolic]
 // CHECK:STDOUT:   %impl.elem0: %.99e = impl_witness_access %Add.lookup_impl_witness, element0 [symbolic]
 // CHECK:STDOUT:   %specific_impl_fn: <specific function> = specific_impl_function %impl.elem0, @Add.Op(%Add.facet.98c) [symbolic]
-// CHECK:STDOUT:   %require_complete.a87: <witness> = require_complete_type %MyInt.19f [symbolic]
-// CHECK:STDOUT:   %Double.specific_fn: <specific function> = specific_function %Double, @Double(%int_64) [concrete]
 // CHECK:STDOUT:   %Add.impl_witness.ec1: <witness> = impl_witness imports.%Add.impl_witness_table, @MyInt.as.Add.impl(%N) [symbolic]
+// CHECK:STDOUT:   %require_complete.a87: <witness> = require_complete_type %MyInt.19f [symbolic]
 // CHECK:STDOUT:   %MyInt.as.Add.impl.Op.type.1ab: type = fn_type @MyInt.as.Add.impl.Op, @MyInt.as.Add.impl(%N) [symbolic]
 // CHECK:STDOUT:   %MyInt.as.Add.impl.Op.959: %MyInt.as.Add.impl.Op.type.1ab = struct_value () [symbolic]
+// CHECK:STDOUT:   %.bc4: require_specific_def_type = require_specific_def @MyInt.as.Add.impl(%N) [symbolic]
+// CHECK:STDOUT:   %Double.specific_fn: <specific function> = specific_function %Double, @Double(%int_64) [concrete]
 // CHECK:STDOUT:   %Add.impl_witness.8fe: <witness> = impl_witness imports.%Add.impl_witness_table, @MyInt.as.Add.impl(%int_64) [concrete]
 // CHECK:STDOUT:   %MyInt.as.Add.impl.Op.type.193: type = fn_type @MyInt.as.Add.impl.Op, @MyInt.as.Add.impl(%int_64) [concrete]
 // CHECK:STDOUT:   %MyInt.as.Add.impl.Op.803: %MyInt.as.Add.impl.Op.type.193 = struct_value () [concrete]
+// CHECK:STDOUT:   %.9b3: require_specific_def_type = require_specific_def @MyInt.as.Add.impl(%int_64) [concrete]
 // CHECK:STDOUT:   %Add.facet.bfc: %Add.type = facet_value %MyInt.f30, (%Add.impl_witness.8fe) [concrete]
 // CHECK:STDOUT:   %.006: type = fn_type_with_self_type %Add.Op.type, %Add.facet.bfc [concrete]
 // CHECK:STDOUT:   %MyInt.as.Add.impl.Op.specific_fn: <specific function> = specific_function %MyInt.as.Add.impl.Op.803, @MyInt.as.Add.impl.Op(%int_64) [concrete]
@@ -567,10 +571,11 @@ var n: Int(64) = MakeFromClass(FromLiteral(64) as OtherInt);
 // CHECK:STDOUT:
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %require_complete: <witness> = require_complete_type %MyInt [symbolic = %require_complete (constants.%require_complete.a87)]
+// CHECK:STDOUT:   %.1: require_specific_def_type = require_specific_def @MyInt.as.Add.impl(%N) [symbolic = %.1 (constants.%.bc4)]
 // CHECK:STDOUT:   %Add.lookup_impl_witness: <witness> = lookup_impl_witness %MyInt, @Add [symbolic = %Add.lookup_impl_witness (constants.%Add.lookup_impl_witness)]
 // CHECK:STDOUT:   %Add.facet: %Add.type = facet_value %MyInt, (%Add.lookup_impl_witness) [symbolic = %Add.facet (constants.%Add.facet.98c)]
-// CHECK:STDOUT:   %.1: type = fn_type_with_self_type constants.%Add.Op.type, %Add.facet [symbolic = %.1 (constants.%.99e)]
-// CHECK:STDOUT:   %impl.elem0: @Double.%.1 (%.99e) = impl_witness_access %Add.lookup_impl_witness, element0 [symbolic = %impl.elem0 (constants.%impl.elem0)]
+// CHECK:STDOUT:   %.2: type = fn_type_with_self_type constants.%Add.Op.type, %Add.facet [symbolic = %.2 (constants.%.99e)]
+// CHECK:STDOUT:   %impl.elem0: @Double.%.2 (%.99e) = impl_witness_access %Add.lookup_impl_witness, element0 [symbolic = %impl.elem0 (constants.%impl.elem0)]
 // CHECK:STDOUT:   %specific_impl_fn: <specific function> = specific_impl_function %impl.elem0, @Add.Op(%Add.facet) [symbolic = %specific_impl_fn (constants.%specific_impl_fn)]
 // CHECK:STDOUT:
 // CHECK:STDOUT:   fn;
@@ -624,6 +629,23 @@ var n: Int(64) = MakeFromClass(FromLiteral(64) as OtherInt);
 // CHECK:STDOUT:   %pattern_type => constants.%pattern_type.37a
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
+// CHECK:STDOUT: specific @MyInt.as.Add.impl(constants.%N) {
+// CHECK:STDOUT:   %N => constants.%N
+// CHECK:STDOUT:   %MyInt => constants.%MyInt.19f
+// CHECK:STDOUT:   %Add.impl_witness => constants.%Add.impl_witness.ec1
+// CHECK:STDOUT:
+// CHECK:STDOUT: !definition:
+// CHECK:STDOUT:   %MyInt.as.Add.impl.Op.type => constants.%MyInt.as.Add.impl.Op.type.1ab
+// CHECK:STDOUT:   %MyInt.as.Add.impl.Op => constants.%MyInt.as.Add.impl.Op.959
+// CHECK:STDOUT:   %require_complete => constants.%require_complete.a87
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: specific @MyInt.as.Add.impl.Op(constants.%N) {
+// CHECK:STDOUT:   %N => constants.%N
+// CHECK:STDOUT:   %MyInt => constants.%MyInt.19f
+// CHECK:STDOUT:   %pattern_type => constants.%pattern_type.37a
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
 // CHECK:STDOUT: specific @Double(constants.%N) {
 // CHECK:STDOUT:   %N => constants.%N
 // CHECK:STDOUT:   %MyInt => constants.%MyInt.19f
@@ -637,30 +659,14 @@ var n: Int(64) = MakeFromClass(FromLiteral(64) as OtherInt);
 // CHECK:STDOUT:
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %require_complete => constants.%complete_type.4a1
+// CHECK:STDOUT:   %.1 => constants.%.9b3
 // CHECK:STDOUT:   %Add.lookup_impl_witness => constants.%Add.impl_witness.8fe
 // CHECK:STDOUT:   %Add.facet => constants.%Add.facet.bfc
-// CHECK:STDOUT:   %.1 => constants.%.006
+// CHECK:STDOUT:   %.2 => constants.%.006
 // CHECK:STDOUT:   %impl.elem0 => constants.%MyInt.as.Add.impl.Op.803
 // CHECK:STDOUT:   %specific_impl_fn => constants.%MyInt.as.Add.impl.Op.specific_fn
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
-// CHECK:STDOUT: specific @MyInt.as.Add.impl(constants.%N) {
-// CHECK:STDOUT:   %N => constants.%N
-// CHECK:STDOUT:   %MyInt => constants.%MyInt.19f
-// CHECK:STDOUT:   %Add.impl_witness => constants.%Add.impl_witness.ec1
-// CHECK:STDOUT:
-// CHECK:STDOUT: !definition:
-// CHECK:STDOUT:   %MyInt.as.Add.impl.Op.type => constants.%MyInt.as.Add.impl.Op.type.1ab
-// CHECK:STDOUT:   %MyInt.as.Add.impl.Op => constants.%MyInt.as.Add.impl.Op.959
-// CHECK:STDOUT:   %require_complete => constants.%require_complete.a87
-// CHECK:STDOUT: }
-// CHECK:STDOUT:
-// CHECK:STDOUT: specific @MyInt.as.Add.impl.Op(constants.%N) {
-// CHECK:STDOUT:   %N => constants.%N
-// CHECK:STDOUT:   %MyInt => constants.%MyInt.19f
-// CHECK:STDOUT:   %pattern_type => constants.%pattern_type.37a
-// CHECK:STDOUT: }
-// CHECK:STDOUT:
 // CHECK:STDOUT: specific @MyInt.as.Add.impl(constants.%int_64) {
 // CHECK:STDOUT:   %N => constants.%int_64
 // CHECK:STDOUT:   %MyInt => constants.%MyInt.f30

+ 37 - 21
toolchain/check/testdata/impl/import_self_specific.carbon

@@ -92,6 +92,7 @@ impl forall [N:! E] D(N) as I where .Assoc = () {
 // CHECK:STDOUT:   %impl.elem0: %Y.type = impl_witness_access %I.lookup_impl_witness, element0 [symbolic]
 // CHECK:STDOUT:   %as_type: type = facet_access_type %impl.elem0 [symbolic]
 // CHECK:STDOUT:   %Z.impl_witness.58d: <witness> = impl_witness file.%Z.impl_witness_table, @U.as.Z.impl(%as_type) [symbolic]
+// CHECK:STDOUT:   %.e03: require_specific_def_type = require_specific_def @U.as.Z.impl(%as_type) [symbolic]
 // CHECK:STDOUT:   %Z.lookup_impl_witness: <witness> = lookup_impl_witness %impl.elem0, @Z [symbolic]
 // CHECK:STDOUT:   %Z.facet: %Z.type = facet_value %as_type, (%Z.lookup_impl_witness) [symbolic]
 // CHECK:STDOUT:   %C.a0e: type = class_type @C, @C(%Z.facet) [symbolic]
@@ -172,13 +173,13 @@ impl forall [N:! E] D(N) as I where .Assoc = () {
 // CHECK:STDOUT:     %c.param_patt: @I.F.%pattern_type (%pattern_type.8e3) = value_param_pattern %c.patt, call_param0 [concrete]
 // CHECK:STDOUT:   } {
 // CHECK:STDOUT:     %c.param: @I.F.%C.loc24_18.1 (%C.a0e) = value_param call_param0
-// CHECK:STDOUT:     %.loc24_18.1: type = splice_block %C.loc24_18.2 [symbolic = %C.loc24_18.1 (constants.%C.a0e)] {
+// CHECK:STDOUT:     %.loc24_18.2: type = splice_block %C.loc24_18.2 [symbolic = %C.loc24_18.1 (constants.%C.a0e)] {
 // CHECK:STDOUT:       %C.ref: %C.type = name_ref C, file.%C.decl [concrete = constants.%C.generic]
 // CHECK:STDOUT:       %impl.elem0.loc24_13.2: %Y.type = impl_witness_access constants.%I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc24_13.1 (constants.%impl.elem0)]
 // CHECK:STDOUT:       %Assoc.ref: %Y.type = name_ref Assoc, %impl.elem0.loc24_13.2 [symbolic = %impl.elem0.loc24_13.1 (constants.%impl.elem0)]
 // CHECK:STDOUT:       %Assoc.as_type: type = facet_access_type %Assoc.ref [symbolic = %as_type (constants.%as_type)]
 // CHECK:STDOUT:       %Z.facet.loc24_18.2: %Z.type = facet_value %Assoc.as_type, (constants.%Z.lookup_impl_witness) [symbolic = %Z.facet.loc24_18.1 (constants.%Z.facet)]
-// CHECK:STDOUT:       %.loc24_18.2: %Z.type = converted %Assoc.ref, %Z.facet.loc24_18.2 [symbolic = %Z.facet.loc24_18.1 (constants.%Z.facet)]
+// CHECK:STDOUT:       %.loc24_18.3: %Z.type = converted %Assoc.ref, %Z.facet.loc24_18.2 [symbolic = %Z.facet.loc24_18.1 (constants.%Z.facet)]
 // CHECK:STDOUT:       %C.loc24_18.2: type = class_type @C, @C(constants.%Z.facet) [symbolic = %C.loc24_18.1 (constants.%C.a0e)]
 // CHECK:STDOUT:     }
 // CHECK:STDOUT:     %c: @I.F.%C.loc24_18.1 (%C.a0e) = value_binding c, %c.param
@@ -246,6 +247,7 @@ impl forall [N:! E] D(N) as I where .Assoc = () {
 // CHECK:STDOUT:   %I.lookup_impl_witness: <witness> = lookup_impl_witness %Self, @I [symbolic = %I.lookup_impl_witness (constants.%I.lookup_impl_witness)]
 // CHECK:STDOUT:   %impl.elem0.loc24_13.1: %Y.type = impl_witness_access %I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc24_13.1 (constants.%impl.elem0)]
 // CHECK:STDOUT:   %as_type: type = facet_access_type %impl.elem0.loc24_13.1 [symbolic = %as_type (constants.%as_type)]
+// CHECK:STDOUT:   %.loc24_18.1: require_specific_def_type = require_specific_def @U.as.Z.impl(%as_type) [symbolic = %.loc24_18.1 (constants.%.e03)]
 // CHECK:STDOUT:   %Z.lookup_impl_witness: <witness> = lookup_impl_witness %impl.elem0.loc24_13.1, @Z [symbolic = %Z.lookup_impl_witness (constants.%Z.lookup_impl_witness)]
 // CHECK:STDOUT:   %Z.facet.loc24_18.1: %Z.type = facet_value %as_type, (%Z.lookup_impl_witness) [symbolic = %Z.facet.loc24_18.1 (constants.%Z.facet)]
 // CHECK:STDOUT:   %C.loc24_18.1: type = class_type @C, @C(%Z.facet.loc24_18.1) [symbolic = %C.loc24_18.1 (constants.%C.a0e)]
@@ -286,6 +288,7 @@ impl forall [N:! E] D(N) as I where .Assoc = () {
 // CHECK:STDOUT:   %I.lookup_impl_witness => constants.%I.lookup_impl_witness
 // CHECK:STDOUT:   %impl.elem0.loc24_13.1 => constants.%impl.elem0
 // CHECK:STDOUT:   %as_type => constants.%as_type
+// CHECK:STDOUT:   %.loc24_18.1 => constants.%.e03
 // CHECK:STDOUT:   %Z.lookup_impl_witness => constants.%Z.lookup_impl_witness
 // CHECK:STDOUT:   %Z.facet.loc24_18.1 => constants.%Z.facet
 // CHECK:STDOUT:   %C.loc24_18.1 => constants.%C.a0e
@@ -335,10 +338,13 @@ impl forall [N:! E] D(N) as I where .Assoc = () {
 // CHECK:STDOUT:   %V: %Z.type = symbolic_binding V, 0 [symbolic]
 // CHECK:STDOUT:   %C.a0e: type = class_type @C, @C(%Z.facet.aa8) [symbolic]
 // CHECK:STDOUT:   %pattern_type.8e3: type = pattern_type %C.a0e [symbolic]
-// CHECK:STDOUT:   %I.impl_witness: <witness> = impl_witness file.%I.impl_witness_table, @D.as.I.impl(%N) [symbolic]
 // CHECK:STDOUT:   %U: type = symbolic_binding U, 0 [symbolic]
 // CHECK:STDOUT:   %Z.impl_witness.5e4: <witness> = impl_witness imports.%Z.impl_witness_table, @U.as.Z.impl(%U) [symbolic]
+// CHECK:STDOUT:   %.e03: require_specific_def_type = require_specific_def @U.as.Z.impl(%as_type) [symbolic]
+// CHECK:STDOUT:   %Z.impl_witness.58d: <witness> = impl_witness imports.%Z.impl_witness_table, @U.as.Z.impl(%as_type) [symbolic]
+// CHECK:STDOUT:   %I.impl_witness: <witness> = impl_witness file.%I.impl_witness_table, @D.as.I.impl(%N) [symbolic]
 // CHECK:STDOUT:   %Z.impl_witness.b07: <witness> = impl_witness imports.%Z.impl_witness_table, @U.as.Z.impl(%empty_tuple.type) [concrete]
+// CHECK:STDOUT:   %.0df: require_specific_def_type = require_specific_def @U.as.Z.impl(%empty_tuple.type) [concrete]
 // CHECK:STDOUT:   %Z.facet.996: %Z.type = facet_value %empty_tuple.type, (%Z.impl_witness.b07) [concrete]
 // CHECK:STDOUT:   %C.3c2: type = class_type @C, @C(%Z.facet.996) [concrete]
 // CHECK:STDOUT:   %pattern_type.b50: type = pattern_type %C.3c2 [concrete]
@@ -370,12 +376,12 @@ impl forall [N:! E] D(N) as I where .Assoc = () {
 // CHECK:STDOUT:   %Main.import_ref.3fc: <witness> = import_ref Main//impl_def, loc13_1, loaded [concrete = constants.%complete_type.782]
 // CHECK:STDOUT:   %Main.import_ref.f7e = import_ref Main//impl_def, inst{{[0-9A-F]+}} [no loc], unloaded
 // CHECK:STDOUT:   %Main.import_ref.62f: %Z.type = import_ref Main//impl_def, loc11_9, loaded [symbolic = @C.%V (constants.%V)]
-// CHECK:STDOUT:   %Main.import_ref.e339be.2: %I.type = import_ref Main//impl_def, loc15_13, loaded [symbolic = constants.%Self.9f2]
 // CHECK:STDOUT:   %Main.import_ref.cfb: <witness> = import_ref Main//impl_def, loc9_31, loaded [symbolic = @U.as.Z.impl.%Z.impl_witness (constants.%Z.impl_witness.5e4)]
 // CHECK:STDOUT:   %Z.impl_witness_table = impl_witness_table (), @U.as.Z.impl [concrete]
 // CHECK:STDOUT:   %Main.import_ref.ff3: type = import_ref Main//impl_def, loc9_24, loaded [symbolic = @U.as.Z.impl.%U (constants.%U)]
 // CHECK:STDOUT:   %Main.import_ref.df1: type = import_ref Main//impl_def, loc9_29, loaded [concrete = constants.%Z.type]
 // CHECK:STDOUT:   %Main.import_ref.efcd44.2: type = import_ref Main//impl_def, loc9_14, loaded [symbolic = @U.as.Z.impl.%U (constants.%U)]
+// CHECK:STDOUT:   %Main.import_ref.e339be.2: %I.type = import_ref Main//impl_def, loc15_13, loaded [symbolic = constants.%Self.9f2]
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
@@ -471,6 +477,18 @@ impl forall [N:! E] D(N) as I where .Assoc = () {
 // CHECK:STDOUT:   }
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
+// CHECK:STDOUT: generic impl @U.as.Z.impl(imports.%Main.import_ref.efcd44.2: type) [from "impl_def.carbon"] {
+// CHECK:STDOUT:   %U: type = symbolic_binding U, 0 [symbolic = %U (constants.%U)]
+// CHECK:STDOUT:   %Z.impl_witness: <witness> = impl_witness imports.%Z.impl_witness_table, @U.as.Z.impl(%U) [symbolic = %Z.impl_witness (constants.%Z.impl_witness.5e4)]
+// CHECK:STDOUT:
+// CHECK:STDOUT: !definition:
+// CHECK:STDOUT:
+// CHECK:STDOUT:   impl: imports.%Main.import_ref.ff3 as imports.%Main.import_ref.df1 {
+// CHECK:STDOUT:   !members:
+// CHECK:STDOUT:     witness = imports.%Main.import_ref.cfb
+// CHECK:STDOUT:   }
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
 // CHECK:STDOUT: generic impl @D.as.I.impl(%N.loc20_14.2: %E) {
 // CHECK:STDOUT:   %N.loc20_14.1: %E = symbolic_binding N, 0 [symbolic = %N.loc20_14.1 (constants.%N)]
 // CHECK:STDOUT:   %D.loc20_24.1: type = class_type @D, @D(%N.loc20_14.1) [symbolic = %D.loc20_24.1 (constants.%D)]
@@ -503,18 +521,6 @@ impl forall [N:! E] D(N) as I where .Assoc = () {
 // CHECK:STDOUT:   }
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
-// CHECK:STDOUT: generic impl @U.as.Z.impl(imports.%Main.import_ref.efcd44.2: type) [from "impl_def.carbon"] {
-// CHECK:STDOUT:   %U: type = symbolic_binding U, 0 [symbolic = %U (constants.%U)]
-// CHECK:STDOUT:   %Z.impl_witness: <witness> = impl_witness imports.%Z.impl_witness_table, @U.as.Z.impl(%U) [symbolic = %Z.impl_witness (constants.%Z.impl_witness.5e4)]
-// CHECK:STDOUT:
-// CHECK:STDOUT: !definition:
-// CHECK:STDOUT:
-// CHECK:STDOUT:   impl: imports.%Main.import_ref.ff3 as imports.%Main.import_ref.df1 {
-// CHECK:STDOUT:   !members:
-// CHECK:STDOUT:     witness = imports.%Main.import_ref.cfb
-// CHECK:STDOUT:   }
-// CHECK:STDOUT: }
-// CHECK:STDOUT:
 // CHECK:STDOUT: class @E {
 // CHECK:STDOUT:   %complete_type: <witness> = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type.357]
 // CHECK:STDOUT:   complete_type_witness = %complete_type
@@ -555,6 +561,7 @@ impl forall [N:! E] D(N) as I where .Assoc = () {
 // CHECK:STDOUT:   %I.lookup_impl_witness: <witness> = lookup_impl_witness %Self, @I [symbolic = %I.lookup_impl_witness (constants.%I.lookup_impl_witness.9b0)]
 // CHECK:STDOUT:   %impl.elem0: %Y.type = impl_witness_access %I.lookup_impl_witness, element0 [symbolic = %impl.elem0 (constants.%impl.elem0.d3e)]
 // CHECK:STDOUT:   %as_type: type = facet_access_type %impl.elem0 [symbolic = %as_type (constants.%as_type)]
+// CHECK:STDOUT:   %.1: require_specific_def_type = require_specific_def @U.as.Z.impl(%as_type) [symbolic = %.1 (constants.%.e03)]
 // CHECK:STDOUT:   %Z.lookup_impl_witness: <witness> = lookup_impl_witness %impl.elem0, @Z [symbolic = %Z.lookup_impl_witness (constants.%Z.lookup_impl_witness)]
 // CHECK:STDOUT:   %Z.facet: %Z.type = facet_value %as_type, (%Z.lookup_impl_witness) [symbolic = %Z.facet (constants.%Z.facet.aa8)]
 // CHECK:STDOUT:   %C: type = class_type @C, @C(%Z.facet) [symbolic = %C (constants.%C.a0e)]
@@ -610,22 +617,30 @@ impl forall [N:! E] D(N) as I where .Assoc = () {
 // CHECK:STDOUT:   %V => constants.%Z.facet.aa8
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
+// CHECK:STDOUT: specific @U.as.Z.impl(constants.%U) {
+// CHECK:STDOUT:   %U => constants.%U
+// CHECK:STDOUT:   %Z.impl_witness => constants.%Z.impl_witness.5e4
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: specific @U.as.Z.impl(constants.%as_type) {
+// CHECK:STDOUT:   %U => constants.%as_type
+// CHECK:STDOUT:   %Z.impl_witness => constants.%Z.impl_witness.58d
+// CHECK:STDOUT:
+// CHECK:STDOUT: !definition:
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
 // CHECK:STDOUT: specific @I.F(constants.%Self.9f2) {
 // CHECK:STDOUT:   %Self => constants.%Self.9f2
 // CHECK:STDOUT:   %I.lookup_impl_witness => constants.%I.lookup_impl_witness.9b0
 // CHECK:STDOUT:   %impl.elem0 => constants.%impl.elem0.d3e
 // CHECK:STDOUT:   %as_type => constants.%as_type
+// CHECK:STDOUT:   %.1 => constants.%.e03
 // CHECK:STDOUT:   %Z.lookup_impl_witness => constants.%Z.lookup_impl_witness
 // CHECK:STDOUT:   %Z.facet => constants.%Z.facet.aa8
 // CHECK:STDOUT:   %C => constants.%C.a0e
 // CHECK:STDOUT:   %pattern_type => constants.%pattern_type.8e3
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
-// CHECK:STDOUT: specific @U.as.Z.impl(constants.%U) {
-// CHECK:STDOUT:   %U => constants.%U
-// CHECK:STDOUT:   %Z.impl_witness => constants.%Z.impl_witness.5e4
-// CHECK:STDOUT: }
-// CHECK:STDOUT:
 // CHECK:STDOUT: specific @U.as.Z.impl(constants.%empty_tuple.type) {
 // CHECK:STDOUT:   %U => constants.%empty_tuple.type
 // CHECK:STDOUT:   %Z.impl_witness => constants.%Z.impl_witness.b07
@@ -646,6 +661,7 @@ impl forall [N:! E] D(N) as I where .Assoc = () {
 // CHECK:STDOUT:   %I.lookup_impl_witness => constants.%I.impl_witness
 // CHECK:STDOUT:   %impl.elem0 => constants.%Y.facet
 // CHECK:STDOUT:   %as_type => constants.%empty_tuple.type
+// CHECK:STDOUT:   %.1 => constants.%.0df
 // CHECK:STDOUT:   %Z.lookup_impl_witness => constants.%Z.impl_witness.b07
 // CHECK:STDOUT:   %Z.facet => constants.%Z.facet.996
 // CHECK:STDOUT:   %C => constants.%C.3c2

+ 10 - 4
toolchain/check/testdata/impl/import_thunk.carbon

@@ -144,6 +144,7 @@ fn G() {
 // CHECK:STDOUT:   %Destroy.impl_witness.a7c: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.edc: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.393: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.edc = struct_value () [symbolic]
+// CHECK:STDOUT:   %.052: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic]
 // CHECK:STDOUT:   %Destroy.facet: %Destroy.type = facet_value %C.32c8ec.2, (%Destroy.impl_witness.a7c) [symbolic]
 // CHECK:STDOUT:   %.05d: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.393, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value) [symbolic]
@@ -294,9 +295,10 @@ fn G() {
 // CHECK:STDOUT:   %require_complete: <witness> = require_complete_type %C [symbolic = %require_complete (constants.%require_complete.10b)]
 // CHECK:STDOUT:   %C.val: @C.as.I.impl.F.loc8_17.2.%C (%C.32c8ec.2) = struct_value () [symbolic = %C.val (constants.%C.val)]
 // CHECK:STDOUT:   %facet_value: %type_where = facet_value %C, () [symbolic = %facet_value (constants.%facet_value)]
+// CHECK:STDOUT:   %.6: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %.6 (constants.%.052)]
 // CHECK:STDOUT:   %Destroy.impl_witness: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.a7c)]
 // CHECK:STDOUT:   %Destroy.facet: %Destroy.type = facet_value %C, (%Destroy.impl_witness) [symbolic = %Destroy.facet (constants.%Destroy.facet)]
-// CHECK:STDOUT:   %.6: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.6 (constants.%.05d)]
+// CHECK:STDOUT:   %.7: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.7 (constants.%.05d)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.type (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.edc)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op: @C.as.I.impl.F.loc8_17.2.%DestroyT.binding.as_type.as.Destroy.impl.Op.type (%DestroyT.binding.as_type.as.Destroy.impl.Op.type.edc) = struct_value () [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.393)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn)]
@@ -314,7 +316,7 @@ fn G() {
 // CHECK:STDOUT:     %.5: @C.as.I.impl.F.loc8_17.2.%C (%C.32c8ec.2) = acquire_value %.4
 // CHECK:STDOUT:     %C.as.I.impl.F.call: init %empty_tuple.type = call %C.as.I.impl.F.specific_fn.loc8_17.1(%.5)
 // CHECK:STDOUT:     %Op.ref: %Destroy.assoc_type = name_ref Op, imports.%Core.import_ref.f99 [concrete = constants.%assoc0]
-// CHECK:STDOUT:     %impl.elem0: @C.as.I.impl.F.loc8_17.2.%.6 (%.05d) = impl_witness_access constants.%Destroy.impl_witness.a7c, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.393)]
+// CHECK:STDOUT:     %impl.elem0: @C.as.I.impl.F.loc8_17.2.%.7 (%.05d) = impl_witness_access constants.%Destroy.impl_witness.a7c, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.393)]
 // CHECK:STDOUT:     %bound_method.1: <bound method> = bound_method %.3, %impl.elem0
 // CHECK:STDOUT:     %specific_fn: <specific function> = specific_function %impl.elem0, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn)]
 // CHECK:STDOUT:     %bound_method.2: <bound method> = bound_method %.3, %specific_fn
@@ -401,6 +403,7 @@ fn G() {
 // CHECK:STDOUT:   %Destroy.facet.f71: %Destroy.type = facet_value %C.32c8ec.2, (%Destroy.impl_witness.3e8) [symbolic]
 // CHECK:STDOUT:   %Destroy.Op.type: type = fn_type @Destroy.Op [concrete]
 // CHECK:STDOUT:   %.7e5: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.f71 [symbolic]
+// CHECK:STDOUT:   %.fa1: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.4a7) [symbolic]
 // CHECK:STDOUT:   %C.val.31e: %C.32c8ec.2 = struct_value () [symbolic]
 // CHECK:STDOUT:   %C.as.I.impl.F.specific_fn.5ba: <specific function> = specific_function %C.as.I.impl.F.e11987.2, @C.as.I.impl.F.2(%Y) [symbolic]
 // CHECK:STDOUT:   %I.impl_witness.2f0: <witness> = impl_witness imports.%I.impl_witness_table, @C.as.I.impl(%empty_tuple) [concrete]
@@ -419,6 +422,7 @@ fn G() {
 // CHECK:STDOUT:   %Destroy.impl_witness.e84: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.637) [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.c6d: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.637) [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.302: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.c6d = struct_value () [concrete]
+// CHECK:STDOUT:   %.a6e: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.637) [concrete]
 // CHECK:STDOUT:   %Destroy.facet.91e: %Destroy.type = facet_value %C.607, (%Destroy.impl_witness.e84) [concrete]
 // CHECK:STDOUT:   %.303: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.91e [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.942: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.302, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.637) [concrete]
@@ -553,9 +557,10 @@ fn G() {
 // CHECK:STDOUT:   %require_complete: <witness> = require_complete_type %C [symbolic = %require_complete (constants.%require_complete.10b)]
 // CHECK:STDOUT:   %C.val: @C.as.I.impl.F.1.%C (%C.32c8ec.2) = struct_value () [symbolic = %C.val (constants.%C.val.31e)]
 // CHECK:STDOUT:   %facet_value: %type_where = facet_value %C, () [symbolic = %facet_value (constants.%facet_value.4a7)]
+// CHECK:STDOUT:   %.1: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %.1 (constants.%.fa1)]
 // CHECK:STDOUT:   %Destroy.impl_witness: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.3e8)]
 // CHECK:STDOUT:   %Destroy.facet: %Destroy.type = facet_value %C, (%Destroy.impl_witness) [symbolic = %Destroy.facet (constants.%Destroy.facet.f71)]
-// CHECK:STDOUT:   %.1: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.1 (constants.%.7e5)]
+// CHECK:STDOUT:   %.2: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.2 (constants.%.7e5)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.type (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.9d8)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op: @C.as.I.impl.F.1.%DestroyT.binding.as_type.as.Destroy.impl.Op.type (%DestroyT.binding.as_type.as.Destroy.impl.Op.type.9d8) = struct_value () [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.32b)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.a82)]
@@ -637,9 +642,10 @@ fn G() {
 // CHECK:STDOUT:   %require_complete => constants.%complete_type
 // CHECK:STDOUT:   %C.val => constants.%C.val.12f
 // CHECK:STDOUT:   %facet_value => constants.%facet_value.637
+// CHECK:STDOUT:   %.1 => constants.%.a6e
 // CHECK:STDOUT:   %Destroy.impl_witness => constants.%Destroy.impl_witness.e84
 // CHECK:STDOUT:   %Destroy.facet => constants.%Destroy.facet.91e
-// CHECK:STDOUT:   %.1 => constants.%.303
+// CHECK:STDOUT:   %.2 => constants.%.303
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.c6d
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.302
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.942

+ 8 - 4
toolchain/check/testdata/impl/lookup/generic.carbon

@@ -352,6 +352,7 @@ fn G(x: A) {
 // CHECK:STDOUT:   %Copy.Op.type: type = fn_type @Copy.Op [concrete]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.type.75b: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.d9f) [symbolic]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.692: %ptr.as.Copy.impl.Op.type.75b = struct_value () [symbolic]
+// CHECK:STDOUT:   %.dcd: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.d9f) [symbolic]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness.c66: <witness> = lookup_impl_witness %ptr.4f0, @Copy [symbolic]
 // CHECK:STDOUT:   %Copy.facet.747: %Copy.type = facet_value %ptr.4f0, (%Copy.lookup_impl_witness.c66) [symbolic]
 // CHECK:STDOUT:   %.89d: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.747 [symbolic]
@@ -373,6 +374,7 @@ fn G(x: A) {
 // CHECK:STDOUT:   %Copy.impl_witness.433: <witness> = impl_witness imports.%Copy.impl_witness_table.67d, @ptr.as.Copy.impl(%empty_struct_type) [concrete]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.type.424: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%empty_struct_type) [concrete]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.15e: %ptr.as.Copy.impl.Op.type.424 = struct_value () [concrete]
+// CHECK:STDOUT:   %.1b5: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%empty_struct_type) [concrete]
 // CHECK:STDOUT:   %Copy.facet.48c: %Copy.type = facet_value %ptr.c28, (%Copy.impl_witness.433) [concrete]
 // CHECK:STDOUT:   %.fb0: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.48c [concrete]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.specific_fn: <specific function> = specific_function %ptr.as.Copy.impl.Op.15e, @ptr.as.Copy.impl.Op(%empty_struct_type) [concrete]
@@ -507,16 +509,17 @@ fn G(x: A) {
 // CHECK:STDOUT:
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %require_complete: <witness> = require_complete_type %ptr.loc9_14 [symbolic = %require_complete (constants.%require_complete.482)]
+// CHECK:STDOUT:   %.loc9_37.2: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T) [symbolic = %.loc9_37.2 (constants.%.dcd)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr.loc9_14, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.c66)]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr.loc9_14, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.747)]
-// CHECK:STDOUT:   %.loc9_37.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc9_37.2 (constants.%.89d)]
-// CHECK:STDOUT:   %impl.elem0.loc9_37.2: @ptr.as.HasF.impl.F.%.loc9_37.2 (%.89d) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc9_37.2 (constants.%impl.elem0.928)]
+// CHECK:STDOUT:   %.loc9_37.3: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc9_37.3 (constants.%.89d)]
+// CHECK:STDOUT:   %impl.elem0.loc9_37.2: @ptr.as.HasF.impl.F.%.loc9_37.3 (%.89d) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc9_37.2 (constants.%impl.elem0.928)]
 // CHECK:STDOUT:   %specific_impl_fn.loc9_37.2: <specific function> = specific_impl_function %impl.elem0.loc9_37.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc9_37.2 (constants.%specific_impl_fn.6a1)]
 // CHECK:STDOUT:
 // CHECK:STDOUT:   fn(%self.param: @ptr.as.HasF.impl.F.%ptr.loc9_14 (%ptr.4f0)) -> @ptr.as.HasF.impl.F.%ptr.loc9_14 (%ptr.4f0) {
 // CHECK:STDOUT:   !entry:
 // CHECK:STDOUT:     %self.ref: @ptr.as.HasF.impl.F.%ptr.loc9_14 (%ptr.4f0) = name_ref self, %self
-// CHECK:STDOUT:     %impl.elem0.loc9_37.1: @ptr.as.HasF.impl.F.%.loc9_37.2 (%.89d) = impl_witness_access constants.%Copy.lookup_impl_witness.c66, element0 [symbolic = %impl.elem0.loc9_37.2 (constants.%impl.elem0.928)]
+// CHECK:STDOUT:     %impl.elem0.loc9_37.1: @ptr.as.HasF.impl.F.%.loc9_37.3 (%.89d) = impl_witness_access constants.%Copy.lookup_impl_witness.c66, element0 [symbolic = %impl.elem0.loc9_37.2 (constants.%impl.elem0.928)]
 // CHECK:STDOUT:     %bound_method.loc9_37.1: <bound method> = bound_method %self.ref, %impl.elem0.loc9_37.1
 // CHECK:STDOUT:     %specific_impl_fn.loc9_37.1: <specific function> = specific_impl_function %impl.elem0.loc9_37.1, @Copy.Op(constants.%Copy.facet.747) [symbolic = %specific_impl_fn.loc9_37.2 (constants.%specific_impl_fn.6a1)]
 // CHECK:STDOUT:     %bound_method.loc9_37.2: <bound method> = bound_method %self.ref, %specific_impl_fn.loc9_37.1
@@ -583,9 +586,10 @@ fn G(x: A) {
 // CHECK:STDOUT:
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %require_complete => constants.%complete_type
+// CHECK:STDOUT:   %.loc9_37.2 => constants.%.1b5
 // CHECK:STDOUT:   %Copy.lookup_impl_witness => constants.%Copy.impl_witness.433
 // CHECK:STDOUT:   %Copy.facet => constants.%Copy.facet.48c
-// CHECK:STDOUT:   %.loc9_37.2 => constants.%.fb0
+// CHECK:STDOUT:   %.loc9_37.3 => constants.%.fb0
 // CHECK:STDOUT:   %impl.elem0.loc9_37.2 => constants.%ptr.as.Copy.impl.Op.15e
 // CHECK:STDOUT:   %specific_impl_fn.loc9_37.2 => constants.%ptr.as.Copy.impl.Op.specific_fn
 // CHECK:STDOUT: }

+ 13 - 7
toolchain/check/testdata/impl/lookup/impl_forall.carbon

@@ -67,6 +67,7 @@ fn TestSpecific(a: A({})*) -> {}* {
 // CHECK:STDOUT:   %Copy.Op.type: type = fn_type @Copy.Op [concrete]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.type.75bcbe.1: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.d9f) [symbolic]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.692ac2.1: %ptr.as.Copy.impl.Op.type.75bcbe.1 = struct_value () [symbolic]
+// CHECK:STDOUT:   %.dcd: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%V.d9f) [symbolic]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness.c66: <witness> = lookup_impl_witness %ptr.4f0b5c.2, @Copy [symbolic]
 // CHECK:STDOUT:   %Copy.facet.747: %Copy.type = facet_value %ptr.4f0b5c.2, (%Copy.lookup_impl_witness.c66) [symbolic]
 // CHECK:STDOUT:   %.89d: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.747 [symbolic]
@@ -86,6 +87,7 @@ fn TestSpecific(a: A({})*) -> {}* {
 // CHECK:STDOUT:   %I.impl_witness.0c179e.2: <witness> = impl_witness file.%I.impl_witness_table, @A.as.I.impl(%W) [symbolic]
 // CHECK:STDOUT:   %A.as.I.impl.F.type.2974bf.2: type = fn_type @A.as.I.impl.F, @A.as.I.impl(%W) [symbolic]
 // CHECK:STDOUT:   %A.as.I.impl.F.786476.2: %A.as.I.impl.F.type.2974bf.2 = struct_value () [symbolic]
+// CHECK:STDOUT:   %.dfa: require_specific_def_type = require_specific_def @A.as.I.impl(%W) [symbolic]
 // CHECK:STDOUT:   %I.lookup_impl_witness: <witness> = lookup_impl_witness %A.2ddf89.3, @I, @I(%W) [symbolic]
 // CHECK:STDOUT:   %I.facet.84d: %I.type.07036d.3 = facet_value %A.2ddf89.3, (%I.lookup_impl_witness) [symbolic]
 // CHECK:STDOUT:   %.e50: type = fn_type_with_self_type %I.F.type.76d346.3, %I.facet.84d [symbolic]
@@ -117,6 +119,7 @@ fn TestSpecific(a: A({})*) -> {}* {
 // CHECK:STDOUT:   %Copy.impl_witness.433: <witness> = impl_witness imports.%Copy.impl_witness_table.67d, @ptr.as.Copy.impl(%empty_struct_type) [concrete]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.type.424: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%empty_struct_type) [concrete]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.15e: %ptr.as.Copy.impl.Op.type.424 = struct_value () [concrete]
+// CHECK:STDOUT:   %.1b5: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%empty_struct_type) [concrete]
 // CHECK:STDOUT:   %Copy.facet.48c: %Copy.type = facet_value %ptr.c28, (%Copy.impl_witness.433) [concrete]
 // CHECK:STDOUT:   %.fb0: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.48c [concrete]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.specific_fn: <specific function> = specific_function %ptr.as.Copy.impl.Op.15e, @ptr.as.Copy.impl.Op(%empty_struct_type) [concrete]
@@ -189,10 +192,11 @@ fn TestSpecific(a: A({})*) -> {}* {
 // CHECK:STDOUT:   %require_complete.loc13_26: <witness> = require_complete_type %ptr.loc13_30.1 [symbolic = %require_complete.loc13_26 (constants.%require_complete.482d3f.1)]
 // CHECK:STDOUT:   %require_complete.loc13_16: <witness> = require_complete_type %A [symbolic = %require_complete.loc13_16 (constants.%require_complete.f6b5ff.1)]
 // CHECK:STDOUT:   %A.elem: type = unbound_element_type %A, %V [symbolic = %A.elem (constants.%A.elem.ee5a68.2)]
+// CHECK:STDOUT:   %.loc14_12.2: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%V) [symbolic = %.loc14_12.2 (constants.%.dcd)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr.loc13_30.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.c66)]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr.loc13_30.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.747)]
-// CHECK:STDOUT:   %.loc14_12.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc14_12.2 (constants.%.89d)]
-// CHECK:STDOUT:   %impl.elem0.loc14_12.2: @A.as.I.impl.F.%.loc14_12.2 (%.89d) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc14_12.2 (constants.%impl.elem0.928)]
+// CHECK:STDOUT:   %.loc14_12.3: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc14_12.3 (constants.%.89d)]
+// CHECK:STDOUT:   %impl.elem0.loc14_12.2: @A.as.I.impl.F.%.loc14_12.3 (%.89d) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc14_12.2 (constants.%impl.elem0.928)]
 // CHECK:STDOUT:   %specific_impl_fn.loc14_12.2: <specific function> = specific_impl_function %impl.elem0.loc14_12.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc14_12.2 (constants.%specific_impl_fn.6a1)]
 // CHECK:STDOUT:
 // CHECK:STDOUT:   fn(%self.param: @A.as.I.impl.F.%A (%A.2ddf89.2)) -> @A.as.I.impl.F.%ptr.loc13_30.1 (%ptr.4f0b5c.2) {
@@ -201,7 +205,7 @@ fn TestSpecific(a: A({})*) -> {}* {
 // CHECK:STDOUT:     %n.ref: @A.as.I.impl.F.%A.elem (%A.elem.ee5a68.2) = name_ref n, @A.%.loc4 [concrete = @A.%.loc4]
 // CHECK:STDOUT:     %.loc14_17: ref @A.as.I.impl.F.%V (%V.d9f) = class_element_access %self.ref, element0
 // CHECK:STDOUT:     %addr: @A.as.I.impl.F.%ptr.loc13_30.1 (%ptr.4f0b5c.2) = addr_of %.loc14_17
-// CHECK:STDOUT:     %impl.elem0.loc14_12.1: @A.as.I.impl.F.%.loc14_12.2 (%.89d) = impl_witness_access constants.%Copy.lookup_impl_witness.c66, element0 [symbolic = %impl.elem0.loc14_12.2 (constants.%impl.elem0.928)]
+// CHECK:STDOUT:     %impl.elem0.loc14_12.1: @A.as.I.impl.F.%.loc14_12.3 (%.89d) = impl_witness_access constants.%Copy.lookup_impl_witness.c66, element0 [symbolic = %impl.elem0.loc14_12.2 (constants.%impl.elem0.928)]
 // CHECK:STDOUT:     %bound_method.loc14_12.1: <bound method> = bound_method %addr, %impl.elem0.loc14_12.1
 // CHECK:STDOUT:     %specific_impl_fn.loc14_12.1: <specific function> = specific_impl_function %impl.elem0.loc14_12.1, @Copy.Op(constants.%Copy.facet.747) [symbolic = %specific_impl_fn.loc14_12.2 (constants.%specific_impl_fn.6a1)]
 // CHECK:STDOUT:     %bound_method.loc14_12.2: <bound method> = bound_method %addr, %specific_impl_fn.loc14_12.1
@@ -219,11 +223,12 @@ fn TestSpecific(a: A({})*) -> {}* {
 // CHECK:STDOUT:   %require_complete.loc21_18: <witness> = require_complete_type %I.type.loc21_17.2 [symbolic = %require_complete.loc21_18 (constants.%require_complete.c94ab4.2)]
 // CHECK:STDOUT:   %I.assoc_type: type = assoc_entity_type @I, @I(%W.loc19_16.1) [symbolic = %I.assoc_type (constants.%I.assoc_type.b650b2.3)]
 // CHECK:STDOUT:   %assoc0: @TestGeneric.%I.assoc_type (%I.assoc_type.b650b2.3) = assoc_entity element0, @I.%I.F.decl [symbolic = %assoc0 (constants.%assoc0.b4fda0.3)]
+// CHECK:STDOUT:   %.loc21_11.2: require_specific_def_type = require_specific_def @A.as.I.impl(%W.loc19_16.1) [symbolic = %.loc21_11.2 (constants.%.dfa)]
 // CHECK:STDOUT:   %I.lookup_impl_witness: <witness> = lookup_impl_witness %A.loc19_32.1, @I, @I(%W.loc19_16.1) [symbolic = %I.lookup_impl_witness (constants.%I.lookup_impl_witness)]
 // CHECK:STDOUT:   %I.F.type: type = fn_type @I.F, @I(%W.loc19_16.1) [symbolic = %I.F.type (constants.%I.F.type.76d346.3)]
 // CHECK:STDOUT:   %I.facet: @TestGeneric.%I.type.loc21_17.2 (%I.type.07036d.3) = facet_value %A.loc19_32.1, (%I.lookup_impl_witness) [symbolic = %I.facet (constants.%I.facet.84d)]
-// CHECK:STDOUT:   %.loc21_11.2: type = fn_type_with_self_type %I.F.type, %I.facet [symbolic = %.loc21_11.2 (constants.%.e50)]
-// CHECK:STDOUT:   %impl.elem0.loc21_11.2: @TestGeneric.%.loc21_11.2 (%.e50) = impl_witness_access %I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc21_11.2 (constants.%impl.elem0.a9e)]
+// CHECK:STDOUT:   %.loc21_11.3: type = fn_type_with_self_type %I.F.type, %I.facet [symbolic = %.loc21_11.3 (constants.%.e50)]
+// CHECK:STDOUT:   %impl.elem0.loc21_11.2: @TestGeneric.%.loc21_11.3 (%.e50) = impl_witness_access %I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc21_11.2 (constants.%impl.elem0.a9e)]
 // CHECK:STDOUT:   %specific_impl_fn.loc21_11.2: <specific function> = specific_impl_function %impl.elem0.loc21_11.2, @I.F(%W.loc19_16.1, %I.facet) [symbolic = %specific_impl_fn.loc21_11.2 (constants.%specific_impl_fn.2e3)]
 // CHECK:STDOUT:   %require_complete.loc21_11: <witness> = require_complete_type %A.loc19_32.1 [symbolic = %require_complete.loc21_11 (constants.%require_complete.f6b5ff.2)]
 // CHECK:STDOUT:
@@ -236,7 +241,7 @@ fn TestSpecific(a: A({})*) -> {}* {
 // CHECK:STDOUT:     %.loc21_18: @TestGeneric.%I.assoc_type (%I.assoc_type.b650b2.3) = specific_constant @I.%assoc0.loc8_31.1, @I(constants.%W) [symbolic = %assoc0 (constants.%assoc0.b4fda0.3)]
 // CHECK:STDOUT:     %F.ref: @TestGeneric.%I.assoc_type (%I.assoc_type.b650b2.3) = name_ref F, %.loc21_18 [symbolic = %assoc0 (constants.%assoc0.b4fda0.3)]
 // CHECK:STDOUT:     %.loc21_11.1: ref @TestGeneric.%A.loc19_32.1 (%A.2ddf89.3) = deref %a.ref
-// CHECK:STDOUT:     %impl.elem0.loc21_11.1: @TestGeneric.%.loc21_11.2 (%.e50) = impl_witness_access constants.%I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc21_11.2 (constants.%impl.elem0.a9e)]
+// CHECK:STDOUT:     %impl.elem0.loc21_11.1: @TestGeneric.%.loc21_11.3 (%.e50) = impl_witness_access constants.%I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc21_11.2 (constants.%impl.elem0.a9e)]
 // CHECK:STDOUT:     %bound_method.loc21_11: <bound method> = bound_method %.loc21_11.1, %impl.elem0.loc21_11.1
 // CHECK:STDOUT:     %specific_impl_fn.loc21_11.1: <specific function> = specific_impl_function %impl.elem0.loc21_11.1, @I.F(constants.%W, constants.%I.facet.84d) [symbolic = %specific_impl_fn.loc21_11.2 (constants.%specific_impl_fn.2e3)]
 // CHECK:STDOUT:     %bound_method.loc21_22: <bound method> = bound_method %.loc21_11.1, %specific_impl_fn.loc21_11.1
@@ -327,9 +332,10 @@ fn TestSpecific(a: A({})*) -> {}* {
 // CHECK:STDOUT:   %require_complete.loc13_26 => constants.%complete_type.38e
 // CHECK:STDOUT:   %require_complete.loc13_16 => constants.%complete_type.0a6
 // CHECK:STDOUT:   %A.elem => constants.%A.elem.2af
+// CHECK:STDOUT:   %.loc14_12.2 => constants.%.1b5
 // CHECK:STDOUT:   %Copy.lookup_impl_witness => constants.%Copy.impl_witness.433
 // CHECK:STDOUT:   %Copy.facet => constants.%Copy.facet.48c
-// CHECK:STDOUT:   %.loc14_12.2 => constants.%.fb0
+// CHECK:STDOUT:   %.loc14_12.3 => constants.%.fb0
 // CHECK:STDOUT:   %impl.elem0.loc14_12.2 => constants.%ptr.as.Copy.impl.Op.15e
 // CHECK:STDOUT:   %specific_impl_fn.loc14_12.2 => constants.%ptr.as.Copy.impl.Op.specific_fn
 // CHECK:STDOUT: }

+ 28 - 11
toolchain/check/testdata/impl/lookup/specialization_with_symbolic_rewrite.carbon

@@ -146,6 +146,7 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) {
 // CHECK:STDOUT:   %Z_where.type.593: type = facet_type <@Z, @Z(%C) where %impl.elem0.62f = %T.binding.as_type> [symbolic]
 // CHECK:STDOUT:   %require_complete.bf7: <witness> = require_complete_type %Z_where.type.593 [symbolic]
 // CHECK:STDOUT:   %Z.impl_witness.f1f: <witness> = impl_witness file.%Z.impl_witness_table.loc11, @T.as.Z.impl.030(%T.binding.as_type) [symbolic]
+// CHECK:STDOUT:   %.1c1: require_specific_def_type = require_specific_def @T.as.Z.impl.030(%T.binding.as_type) [symbolic]
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: imports {
@@ -326,6 +327,7 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) {
 // CHECK:STDOUT:
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %require_complete: <witness> = require_complete_type %T.binding.as_type [symbolic = %require_complete (constants.%require_complete.9c0)]
+// CHECK:STDOUT:   %.loc15_11.4: require_specific_def_type = require_specific_def @T.as.Z.impl.030(%T.binding.as_type) [symbolic = %.loc15_11.4 (constants.%.1c1)]
 // CHECK:STDOUT:   %Z.impl_witness: <witness> = impl_witness file.%Z.impl_witness_table.loc11, @T.as.Z.impl.030(%T.binding.as_type) [symbolic = %Z.impl_witness (constants.%Z.impl_witness.f1f)]
 // CHECK:STDOUT:
 // CHECK:STDOUT:   fn(%t.param: @F.%T.binding.as_type (%T.binding.as_type)) {
@@ -798,6 +800,7 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) {
 // CHECK:STDOUT:   %Ptr_where.type.0d1962.2: type = facet_type <@Ptr where %impl.elem0.00d = %ptr.4f0b5c.2> [symbolic]
 // CHECK:STDOUT:   %require_complete.19c230.2: <witness> = require_complete_type %Ptr_where.type.0d1962.2 [symbolic]
 // CHECK:STDOUT:   %Ptr.impl_witness.a48d1a.2: <witness> = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%T.d9f) [symbolic]
+// CHECK:STDOUT:   %.a2d: require_specific_def_type = require_specific_def @U.as.Ptr.impl(%T.d9f) [symbolic]
 // CHECK:STDOUT:   %Ptr.facet: %Ptr.type = facet_value %T.d9f, (%Ptr.impl_witness.a48d1a.2) [symbolic]
 // CHECK:STDOUT:   %pattern_type.a60: type = pattern_type %ptr.4f0b5c.2 [symbolic]
 // CHECK:STDOUT:   %F.type: type = fn_type @F [concrete]
@@ -806,6 +809,7 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) {
 // CHECK:STDOUT:   %require_complete.4b7: <witness> = require_complete_type %T.d9f [symbolic]
 // CHECK:STDOUT:   %Copy.type: type = facet_type <@Copy> [concrete]
 // CHECK:STDOUT:   %Copy.Op.type: type = fn_type @Copy.Op [concrete]
+// CHECK:STDOUT:   %.dcd: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.d9f) [symbolic]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness.c66: <witness> = lookup_impl_witness %ptr.4f0b5c.2, @Copy [symbolic]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr.4f0b5c.2, (%Copy.lookup_impl_witness.c66) [symbolic]
 // CHECK:STDOUT:   %.89d: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet [symbolic]
@@ -865,7 +869,7 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) {
 // CHECK:STDOUT:     %Ptr.ref: type = name_ref Ptr, file.%Ptr.decl [concrete = constants.%Ptr.type]
 // CHECK:STDOUT:     %Type.ref: %Ptr.assoc_type = name_ref Type, @Type.%assoc0 [concrete = constants.%assoc0.d28]
 // CHECK:STDOUT:     %Ptr.facet.loc9_30.2: %Ptr.type = facet_value %T.ref.loc9_29, (constants.%Ptr.impl_witness.a48d1a.2) [symbolic = %Ptr.facet.loc9_30.1 (constants.%Ptr.facet)]
-// CHECK:STDOUT:     %.loc9: %Ptr.type = converted %T.ref.loc9_29, %Ptr.facet.loc9_30.2 [symbolic = %Ptr.facet.loc9_30.1 (constants.%Ptr.facet)]
+// CHECK:STDOUT:     %.loc9_30.2: %Ptr.type = converted %T.ref.loc9_29, %Ptr.facet.loc9_30.2 [symbolic = %Ptr.facet.loc9_30.1 (constants.%Ptr.facet)]
 // CHECK:STDOUT:     %impl.elem0.loc9: type = impl_witness_access constants.%Ptr.impl_witness.a48d1a.2, element0 [symbolic = %ptr (constants.%ptr.4f0b5c.2)]
 // CHECK:STDOUT:     %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.3b7]
 // CHECK:STDOUT:     %T.loc9_6.2: type = symbolic_binding T, 0 [symbolic = %T.loc9_6.1 (constants.%T.d9f)]
@@ -913,6 +917,7 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) {
 // CHECK:STDOUT: generic fn @F(%T.loc9_6.2: type) {
 // CHECK:STDOUT:   %T.loc9_6.1: type = symbolic_binding T, 0 [symbolic = %T.loc9_6.1 (constants.%T.d9f)]
 // CHECK:STDOUT:   %pattern_type.loc9_20: type = pattern_type %T.loc9_6.1 [symbolic = %pattern_type.loc9_20 (constants.%pattern_type.e68)]
+// CHECK:STDOUT:   %.loc9_30.1: require_specific_def_type = require_specific_def @U.as.Ptr.impl(%T.loc9_6.1) [symbolic = %.loc9_30.1 (constants.%.a2d)]
 // CHECK:STDOUT:   %Ptr.impl_witness: <witness> = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%T.loc9_6.1) [symbolic = %Ptr.impl_witness (constants.%Ptr.impl_witness.a48d1a.2)]
 // CHECK:STDOUT:   %Ptr.facet.loc9_30.1: %Ptr.type = facet_value %T.loc9_6.1, (%Ptr.impl_witness) [symbolic = %Ptr.facet.loc9_30.1 (constants.%Ptr.facet)]
 // CHECK:STDOUT:   %ptr: type = ptr_type %T.loc9_6.1 [symbolic = %ptr (constants.%ptr.4f0b5c.2)]
@@ -921,17 +926,18 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) {
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %require_complete.loc9_26: <witness> = require_complete_type %ptr [symbolic = %require_complete.loc9_26 (constants.%require_complete.482)]
 // CHECK:STDOUT:   %require_complete.loc9_16: <witness> = require_complete_type %T.loc9_6.1 [symbolic = %require_complete.loc9_16 (constants.%require_complete.4b7)]
+// CHECK:STDOUT:   %.loc10_10.2: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.loc9_6.1) [symbolic = %.loc10_10.2 (constants.%.dcd)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.c66)]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet)]
-// CHECK:STDOUT:   %.loc10_10.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc10_10.2 (constants.%.89d)]
-// CHECK:STDOUT:   %impl.elem0.loc10_10.2: @F.%.loc10_10.2 (%.89d) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc10_10.2 (constants.%impl.elem0.928)]
+// CHECK:STDOUT:   %.loc10_10.3: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc10_10.3 (constants.%.89d)]
+// CHECK:STDOUT:   %impl.elem0.loc10_10.2: @F.%.loc10_10.3 (%.89d) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc10_10.2 (constants.%impl.elem0.928)]
 // CHECK:STDOUT:   %specific_impl_fn.loc10_10.2: <specific function> = specific_impl_function %impl.elem0.loc10_10.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc10_10.2 (constants.%specific_impl_fn.6a1)]
 // CHECK:STDOUT:
 // CHECK:STDOUT:   fn(%t.param: @F.%T.loc9_6.1 (%T.d9f)) -> @F.%ptr (%ptr.4f0b5c.2) {
 // CHECK:STDOUT:   !entry:
 // CHECK:STDOUT:     %t.ref: ref @F.%T.loc9_6.1 (%T.d9f) = name_ref t, %t
 // CHECK:STDOUT:     %addr: @F.%ptr (%ptr.4f0b5c.2) = addr_of %t.ref
-// CHECK:STDOUT:     %impl.elem0.loc10_10.1: @F.%.loc10_10.2 (%.89d) = impl_witness_access constants.%Copy.lookup_impl_witness.c66, element0 [symbolic = %impl.elem0.loc10_10.2 (constants.%impl.elem0.928)]
+// CHECK:STDOUT:     %impl.elem0.loc10_10.1: @F.%.loc10_10.3 (%.89d) = impl_witness_access constants.%Copy.lookup_impl_witness.c66, element0 [symbolic = %impl.elem0.loc10_10.2 (constants.%impl.elem0.928)]
 // CHECK:STDOUT:     %bound_method.loc10_10.1: <bound method> = bound_method %addr, %impl.elem0.loc10_10.1
 // CHECK:STDOUT:     %specific_impl_fn.loc10_10.1: <specific function> = specific_impl_function %impl.elem0.loc10_10.1, @Copy.Op(constants.%Copy.facet) [symbolic = %specific_impl_fn.loc10_10.2 (constants.%specific_impl_fn.6a1)]
 // CHECK:STDOUT:     %bound_method.loc10_10.2: <bound method> = bound_method %addr, %specific_impl_fn.loc10_10.1
@@ -967,6 +973,7 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) {
 // CHECK:STDOUT: specific @F(constants.%T.d9f) {
 // CHECK:STDOUT:   %T.loc9_6.1 => constants.%T.d9f
 // CHECK:STDOUT:   %pattern_type.loc9_20 => constants.%pattern_type.e68
+// CHECK:STDOUT:   %.loc9_30.1 => constants.%.a2d
 // CHECK:STDOUT:   %Ptr.impl_witness => constants.%Ptr.impl_witness.a48d1a.2
 // CHECK:STDOUT:   %Ptr.facet.loc9_30.1 => constants.%Ptr.facet
 // CHECK:STDOUT:   %ptr => constants.%ptr.4f0b5c.2
@@ -1000,6 +1007,7 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) {
 // CHECK:STDOUT:   %Ptr_where.type.1bd: type = facet_type <@Ptr where %impl.elem0.00d = %ptr.86c> [symbolic]
 // CHECK:STDOUT:   %require_complete.ec0: <witness> = require_complete_type %Ptr_where.type.1bd [symbolic]
 // CHECK:STDOUT:   %Ptr.impl_witness.d27: <witness> = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%T.binding.as_type.28a) [symbolic]
+// CHECK:STDOUT:   %.1a9: require_specific_def_type = require_specific_def @U.as.Ptr.impl(%T.binding.as_type.28a) [symbolic]
 // CHECK:STDOUT:   %pattern_type.425: type = pattern_type %ptr.86c [symbolic]
 // CHECK:STDOUT:   %F.type: type = fn_type @F [concrete]
 // CHECK:STDOUT:   %F: %F.type = struct_value () [concrete]
@@ -1007,6 +1015,7 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) {
 // CHECK:STDOUT:   %require_complete.b27: <witness> = require_complete_type %T.binding.as_type.28a [symbolic]
 // CHECK:STDOUT:   %Copy.type: type = facet_type <@Copy> [concrete]
 // CHECK:STDOUT:   %Copy.Op.type: type = fn_type @Copy.Op [concrete]
+// CHECK:STDOUT:   %.fd3: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.binding.as_type.28a) [symbolic]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness.c59: <witness> = lookup_impl_witness %ptr.86c, @Copy [symbolic]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr.86c, (%Copy.lookup_impl_witness.c59) [symbolic]
 // CHECK:STDOUT:   %.32f: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet [symbolic]
@@ -1065,7 +1074,7 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) {
 // CHECK:STDOUT:     %T.ref.loc9_28: %Ptr.type = name_ref T, %T.loc9_6.2 [symbolic = %T.loc9_6.1 (constants.%T.717)]
 // CHECK:STDOUT:     %Type.ref: %Ptr.assoc_type = name_ref Type, @Type.%assoc0 [concrete = constants.%assoc0.d28]
 // CHECK:STDOUT:     %T.as_type.loc9_29: type = facet_access_type %T.ref.loc9_28 [symbolic = %T.binding.as_type (constants.%T.binding.as_type.28a)]
-// CHECK:STDOUT:     %.loc9_29: type = converted %T.ref.loc9_28, %T.as_type.loc9_29 [symbolic = %T.binding.as_type (constants.%T.binding.as_type.28a)]
+// CHECK:STDOUT:     %.loc9_29.2: type = converted %T.ref.loc9_28, %T.as_type.loc9_29 [symbolic = %T.binding.as_type (constants.%T.binding.as_type.28a)]
 // CHECK:STDOUT:     %impl.elem0.loc9: type = impl_witness_access constants.%Ptr.impl_witness.d27, element0 [symbolic = %ptr (constants.%ptr.86c)]
 // CHECK:STDOUT:     %.loc9_10: type = splice_block %Ptr.ref [concrete = constants.%Ptr.type] {
 // CHECK:STDOUT:       %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.3b7]
@@ -1121,6 +1130,7 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) {
 // CHECK:STDOUT:   %T.loc9_6.1: %Ptr.type = symbolic_binding T, 0 [symbolic = %T.loc9_6.1 (constants.%T.717)]
 // CHECK:STDOUT:   %T.binding.as_type: type = symbolic_binding_type T, 0, %T.loc9_6.1 [symbolic = %T.binding.as_type (constants.%T.binding.as_type.28a)]
 // CHECK:STDOUT:   %pattern_type.loc9_19: type = pattern_type %T.binding.as_type [symbolic = %pattern_type.loc9_19 (constants.%pattern_type.6f0)]
+// CHECK:STDOUT:   %.loc9_29.1: require_specific_def_type = require_specific_def @U.as.Ptr.impl(%T.binding.as_type) [symbolic = %.loc9_29.1 (constants.%.1a9)]
 // CHECK:STDOUT:   %Ptr.impl_witness: <witness> = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%T.binding.as_type) [symbolic = %Ptr.impl_witness (constants.%Ptr.impl_witness.d27)]
 // CHECK:STDOUT:   %ptr: type = ptr_type %T.binding.as_type [symbolic = %ptr (constants.%ptr.86c)]
 // CHECK:STDOUT:   %pattern_type.loc9_25: type = pattern_type %ptr [symbolic = %pattern_type.loc9_25 (constants.%pattern_type.425)]
@@ -1128,17 +1138,18 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) {
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %require_complete.loc9_25: <witness> = require_complete_type %ptr [symbolic = %require_complete.loc9_25 (constants.%require_complete.c88)]
 // CHECK:STDOUT:   %require_complete.loc9_15: <witness> = require_complete_type %T.binding.as_type [symbolic = %require_complete.loc9_15 (constants.%require_complete.b27)]
+// CHECK:STDOUT:   %.loc10_10.2: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.binding.as_type) [symbolic = %.loc10_10.2 (constants.%.fd3)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.c59)]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet)]
-// CHECK:STDOUT:   %.loc10_10.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc10_10.2 (constants.%.32f)]
-// CHECK:STDOUT:   %impl.elem0.loc10_10.2: @F.%.loc10_10.2 (%.32f) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc10_10.2 (constants.%impl.elem0.1e1)]
+// CHECK:STDOUT:   %.loc10_10.3: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc10_10.3 (constants.%.32f)]
+// CHECK:STDOUT:   %impl.elem0.loc10_10.2: @F.%.loc10_10.3 (%.32f) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc10_10.2 (constants.%impl.elem0.1e1)]
 // CHECK:STDOUT:   %specific_impl_fn.loc10_10.2: <specific function> = specific_impl_function %impl.elem0.loc10_10.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc10_10.2 (constants.%specific_impl_fn.cac)]
 // CHECK:STDOUT:
 // CHECK:STDOUT:   fn(%t.param: @F.%T.binding.as_type (%T.binding.as_type.28a)) -> @F.%ptr (%ptr.86c) {
 // CHECK:STDOUT:   !entry:
 // CHECK:STDOUT:     %t.ref: ref @F.%T.binding.as_type (%T.binding.as_type.28a) = name_ref t, %t
 // CHECK:STDOUT:     %addr: @F.%ptr (%ptr.86c) = addr_of %t.ref
-// CHECK:STDOUT:     %impl.elem0.loc10_10.1: @F.%.loc10_10.2 (%.32f) = impl_witness_access constants.%Copy.lookup_impl_witness.c59, element0 [symbolic = %impl.elem0.loc10_10.2 (constants.%impl.elem0.1e1)]
+// CHECK:STDOUT:     %impl.elem0.loc10_10.1: @F.%.loc10_10.3 (%.32f) = impl_witness_access constants.%Copy.lookup_impl_witness.c59, element0 [symbolic = %impl.elem0.loc10_10.2 (constants.%impl.elem0.1e1)]
 // CHECK:STDOUT:     %bound_method.loc10_10.1: <bound method> = bound_method %addr, %impl.elem0.loc10_10.1
 // CHECK:STDOUT:     %specific_impl_fn.loc10_10.1: <specific function> = specific_impl_function %impl.elem0.loc10_10.1, @Copy.Op(constants.%Copy.facet) [symbolic = %specific_impl_fn.loc10_10.2 (constants.%specific_impl_fn.cac)]
 // CHECK:STDOUT:     %bound_method.loc10_10.2: <bound method> = bound_method %addr, %specific_impl_fn.loc10_10.1
@@ -1175,6 +1186,7 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) {
 // CHECK:STDOUT:   %T.loc9_6.1 => constants.%T.717
 // CHECK:STDOUT:   %T.binding.as_type => constants.%T.binding.as_type.28a
 // CHECK:STDOUT:   %pattern_type.loc9_19 => constants.%pattern_type.6f0
+// CHECK:STDOUT:   %.loc9_29.1 => constants.%.1a9
 // CHECK:STDOUT:   %Ptr.impl_witness => constants.%Ptr.impl_witness.d27
 // CHECK:STDOUT:   %ptr => constants.%ptr.86c
 // CHECK:STDOUT:   %pattern_type.loc9_25 => constants.%pattern_type.425
@@ -1207,6 +1219,7 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) {
 // CHECK:STDOUT:   %Ptr_where.type.1bd: type = facet_type <@Ptr where %impl.elem0.00d = %ptr.86c> [symbolic]
 // CHECK:STDOUT:   %require_complete.ec0: <witness> = require_complete_type %Ptr_where.type.1bd [symbolic]
 // CHECK:STDOUT:   %Ptr.impl_witness.d27: <witness> = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%T.binding.as_type.28a) [symbolic]
+// CHECK:STDOUT:   %.1a9: require_specific_def_type = require_specific_def @U.as.Ptr.impl(%T.binding.as_type.28a) [symbolic]
 // CHECK:STDOUT:   %pattern_type.425: type = pattern_type %ptr.86c [symbolic]
 // CHECK:STDOUT:   %F.type: type = fn_type @F [concrete]
 // CHECK:STDOUT:   %F: %F.type = struct_value () [concrete]
@@ -1214,6 +1227,7 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) {
 // CHECK:STDOUT:   %require_complete.b27: <witness> = require_complete_type %T.binding.as_type.28a [symbolic]
 // CHECK:STDOUT:   %Copy.type: type = facet_type <@Copy> [concrete]
 // CHECK:STDOUT:   %Copy.Op.type: type = fn_type @Copy.Op [concrete]
+// CHECK:STDOUT:   %.fd3: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.binding.as_type.28a) [symbolic]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness.c59: <witness> = lookup_impl_witness %ptr.86c, @Copy [symbolic]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr.86c, (%Copy.lookup_impl_witness.c59) [symbolic]
 // CHECK:STDOUT:   %.32f: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet [symbolic]
@@ -1327,6 +1341,7 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) {
 // CHECK:STDOUT:   %T.loc9_6.1: %Ptr.type = symbolic_binding T, 0 [symbolic = %T.loc9_6.1 (constants.%T.717)]
 // CHECK:STDOUT:   %T.binding.as_type: type = symbolic_binding_type T, 0, %T.loc9_6.1 [symbolic = %T.binding.as_type (constants.%T.binding.as_type.28a)]
 // CHECK:STDOUT:   %pattern_type.loc9_19: type = pattern_type %T.binding.as_type [symbolic = %pattern_type.loc9_19 (constants.%pattern_type.6f0)]
+// CHECK:STDOUT:   %.loc9_29: require_specific_def_type = require_specific_def @U.as.Ptr.impl(%T.binding.as_type) [symbolic = %.loc9_29 (constants.%.1a9)]
 // CHECK:STDOUT:   %Ptr.impl_witness: <witness> = impl_witness file.%Ptr.impl_witness_table, @U.as.Ptr.impl(%T.binding.as_type) [symbolic = %Ptr.impl_witness (constants.%Ptr.impl_witness.d27)]
 // CHECK:STDOUT:   %ptr: type = ptr_type %T.binding.as_type [symbolic = %ptr (constants.%ptr.86c)]
 // CHECK:STDOUT:   %pattern_type.loc9_25: type = pattern_type %ptr [symbolic = %pattern_type.loc9_25 (constants.%pattern_type.425)]
@@ -1334,17 +1349,18 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) {
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %require_complete.loc9_25: <witness> = require_complete_type %ptr [symbolic = %require_complete.loc9_25 (constants.%require_complete.c88)]
 // CHECK:STDOUT:   %require_complete.loc9_15: <witness> = require_complete_type %T.binding.as_type [symbolic = %require_complete.loc9_15 (constants.%require_complete.b27)]
+// CHECK:STDOUT:   %.loc10_10.2: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.binding.as_type) [symbolic = %.loc10_10.2 (constants.%.fd3)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.c59)]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet)]
-// CHECK:STDOUT:   %.loc10_10.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc10_10.2 (constants.%.32f)]
-// CHECK:STDOUT:   %impl.elem0.loc10_10.2: @F.%.loc10_10.2 (%.32f) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc10_10.2 (constants.%impl.elem0.1e1)]
+// CHECK:STDOUT:   %.loc10_10.3: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc10_10.3 (constants.%.32f)]
+// CHECK:STDOUT:   %impl.elem0.loc10_10.2: @F.%.loc10_10.3 (%.32f) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc10_10.2 (constants.%impl.elem0.1e1)]
 // CHECK:STDOUT:   %specific_impl_fn.loc10_10.2: <specific function> = specific_impl_function %impl.elem0.loc10_10.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc10_10.2 (constants.%specific_impl_fn.cac)]
 // CHECK:STDOUT:
 // CHECK:STDOUT:   fn(%t.param: @F.%T.binding.as_type (%T.binding.as_type.28a)) -> @F.%ptr (%ptr.86c) {
 // CHECK:STDOUT:   !entry:
 // CHECK:STDOUT:     %t.ref: ref @F.%T.binding.as_type (%T.binding.as_type.28a) = name_ref t, %t
 // CHECK:STDOUT:     %addr: @F.%ptr (%ptr.86c) = addr_of %t.ref
-// CHECK:STDOUT:     %impl.elem0.loc10_10.1: @F.%.loc10_10.2 (%.32f) = impl_witness_access constants.%Copy.lookup_impl_witness.c59, element0 [symbolic = %impl.elem0.loc10_10.2 (constants.%impl.elem0.1e1)]
+// CHECK:STDOUT:     %impl.elem0.loc10_10.1: @F.%.loc10_10.3 (%.32f) = impl_witness_access constants.%Copy.lookup_impl_witness.c59, element0 [symbolic = %impl.elem0.loc10_10.2 (constants.%impl.elem0.1e1)]
 // CHECK:STDOUT:     %bound_method.loc10_10.1: <bound method> = bound_method %addr, %impl.elem0.loc10_10.1
 // CHECK:STDOUT:     %specific_impl_fn.loc10_10.1: <specific function> = specific_impl_function %impl.elem0.loc10_10.1, @Copy.Op(constants.%Copy.facet) [symbolic = %specific_impl_fn.loc10_10.2 (constants.%specific_impl_fn.cac)]
 // CHECK:STDOUT:     %bound_method.loc10_10.2: <bound method> = bound_method %addr, %specific_impl_fn.loc10_10.1
@@ -1381,6 +1397,7 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) {
 // CHECK:STDOUT:   %T.loc9_6.1 => constants.%T.717
 // CHECK:STDOUT:   %T.binding.as_type => constants.%T.binding.as_type.28a
 // CHECK:STDOUT:   %pattern_type.loc9_19 => constants.%pattern_type.6f0
+// CHECK:STDOUT:   %.loc9_29 => constants.%.1a9
 // CHECK:STDOUT:   %Ptr.impl_witness => constants.%Ptr.impl_witness.d27
 // CHECK:STDOUT:   %ptr => constants.%ptr.86c
 // CHECK:STDOUT:   %pattern_type.loc9_25 => constants.%pattern_type.425

+ 4 - 2
toolchain/check/testdata/interface/as_type_of_type.carbon

@@ -52,6 +52,7 @@ fn F(T:! Empty) {
 // CHECK:STDOUT:   %Destroy.impl_witness.080: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.13d: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.f7c: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.13d = struct_value () [symbolic]
+// CHECK:STDOUT:   %.eec: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic]
 // CHECK:STDOUT:   %Destroy.facet: %Destroy.type = facet_value %ptr, (%Destroy.impl_witness.080) [symbolic]
 // CHECK:STDOUT:   %.c8c: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.f7c, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value) [symbolic]
@@ -127,9 +128,10 @@ fn F(T:! Empty) {
 // CHECK:STDOUT:   %require_complete: <witness> = require_complete_type %ptr.loc22_11.2 [symbolic = %require_complete (constants.%require_complete.78f)]
 // CHECK:STDOUT:   %pattern_type: type = pattern_type %ptr.loc22_11.2 [symbolic = %pattern_type (constants.%pattern_type.0e5)]
 // CHECK:STDOUT:   %facet_value: %type_where = facet_value %ptr.loc22_11.2, () [symbolic = %facet_value (constants.%facet_value)]
+// CHECK:STDOUT:   %.loc22_3.1: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %.loc22_3.1 (constants.%.eec)]
 // CHECK:STDOUT:   %Destroy.impl_witness: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.080)]
 // CHECK:STDOUT:   %Destroy.facet: %Destroy.type = facet_value %ptr.loc22_11.2, (%Destroy.impl_witness) [symbolic = %Destroy.facet (constants.%Destroy.facet)]
-// CHECK:STDOUT:   %.loc22_3: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc22_3 (constants.%.c8c)]
+// CHECK:STDOUT:   %.loc22_3.2: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc22_3.2 (constants.%.c8c)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.type (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.13d)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op: @F.%DestroyT.binding.as_type.as.Destroy.impl.Op.type (%DestroyT.binding.as_type.as.Destroy.impl.Op.type.13d) = struct_value () [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.f7c)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn)]
@@ -148,7 +150,7 @@ fn F(T:! Empty) {
 // CHECK:STDOUT:       %ptr.loc22_11.1: type = ptr_type %.loc22_11.2 [symbolic = %ptr.loc22_11.2 (constants.%ptr)]
 // CHECK:STDOUT:     }
 // CHECK:STDOUT:     %x: ref @F.%ptr.loc22_11.2 (%ptr) = ref_binding x, %x.var
-// CHECK:STDOUT:     %impl.elem0: @F.%.loc22_3 (%.c8c) = impl_witness_access constants.%Destroy.impl_witness.080, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.f7c)]
+// CHECK:STDOUT:     %impl.elem0: @F.%.loc22_3.2 (%.c8c) = impl_witness_access constants.%Destroy.impl_witness.080, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.f7c)]
 // CHECK:STDOUT:     %bound_method.loc22_3.1: <bound method> = bound_method %x.var, %impl.elem0
 // CHECK:STDOUT:     %specific_fn: <specific function> = specific_function %impl.elem0, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn)]
 // CHECK:STDOUT:     %bound_method.loc22_3.2: <bound method> = bound_method %x.var, %specific_fn

+ 4 - 1
toolchain/check/testdata/interface/fail_assoc_const_alias.carbon

@@ -300,6 +300,7 @@ interface C {
 // CHECK:STDOUT:   %Self.4d7: %J2.type = symbolic_binding Self, 0 [symbolic]
 // CHECK:STDOUT:   %Self.binding.as_type: type = symbolic_binding_type Self, 0, %Self.4d7 [symbolic]
 // CHECK:STDOUT:   %I2.impl_witness.7b7f96.2: <witness> = impl_witness file.%I2.impl_witness_table, @V.binding.as_type.as.I2.impl(%Self.4d7) [symbolic]
+// CHECK:STDOUT:   %.6cb: require_specific_def_type = require_specific_def @V.binding.as_type.as.I2.impl(%Self.4d7) [symbolic]
 // CHECK:STDOUT:   %I2.lookup_impl_witness.1de: <witness> = lookup_impl_witness %Self.4d7, @I2 [symbolic]
 // CHECK:STDOUT:   %I2.facet: %I2.type = facet_value %Self.binding.as_type, (%I2.lookup_impl_witness.1de) [symbolic]
 // CHECK:STDOUT:   %impl.elem0.804: type = impl_witness_access %I2.lookup_impl_witness.1de, element0 [symbolic]
@@ -381,7 +382,7 @@ interface C {
 // CHECK:STDOUT:   } {
 // CHECK:STDOUT:     %Self.as_type: type = facet_access_type @J2.%Self [symbolic = %Self.binding.as_type (constants.%Self.binding.as_type)]
 // CHECK:STDOUT:     %I2.facet.loc15_14.2: %I2.type = facet_value %Self.as_type, (constants.%I2.lookup_impl_witness.1de) [symbolic = %I2.facet.loc15_14.1 (constants.%I2.facet)]
-// CHECK:STDOUT:     %.loc15: %I2.type = converted @J2.%Self, %I2.facet.loc15_14.2 [symbolic = %I2.facet.loc15_14.1 (constants.%I2.facet)]
+// CHECK:STDOUT:     %.loc15_14.2: %I2.type = converted @J2.%Self, %I2.facet.loc15_14.2 [symbolic = %I2.facet.loc15_14.1 (constants.%I2.facet)]
 // CHECK:STDOUT:     %impl.elem0.loc15_14.2: type = impl_witness_access constants.%I2.lookup_impl_witness.1de, element0 [symbolic = %impl.elem0.loc15_14.1 (constants.%impl.elem0.804)]
 // CHECK:STDOUT:     %U2.ref: type = name_ref U2, %impl.elem0.loc15_14.2 [symbolic = %impl.elem0.loc15_14.1 (constants.%impl.elem0.804)]
 // CHECK:STDOUT:     %return.param: ref @J2.F2.%impl.elem0.loc15_14.1 (%impl.elem0.804) = out_param call_param0
@@ -419,6 +420,7 @@ interface C {
 // CHECK:STDOUT: generic fn @J2.F2(@J2.%Self: %J2.type) {
 // CHECK:STDOUT:   %Self: %J2.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.4d7)]
 // CHECK:STDOUT:   %Self.binding.as_type: type = symbolic_binding_type Self, 0, %Self [symbolic = %Self.binding.as_type (constants.%Self.binding.as_type)]
+// CHECK:STDOUT:   %.loc15_14.1: require_specific_def_type = require_specific_def @V.binding.as_type.as.I2.impl(%Self) [symbolic = %.loc15_14.1 (constants.%.6cb)]
 // CHECK:STDOUT:   %I2.lookup_impl_witness: <witness> = lookup_impl_witness %Self, @I2 [symbolic = %I2.lookup_impl_witness (constants.%I2.lookup_impl_witness.1de)]
 // CHECK:STDOUT:   %I2.facet.loc15_14.1: %I2.type = facet_value %Self.binding.as_type, (%I2.lookup_impl_witness) [symbolic = %I2.facet.loc15_14.1 (constants.%I2.facet)]
 // CHECK:STDOUT:   %impl.elem0.loc15_14.1: type = impl_witness_access %I2.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc15_14.1 (constants.%impl.elem0.804)]
@@ -450,6 +452,7 @@ interface C {
 // CHECK:STDOUT: specific @J2.F2(constants.%Self.4d7) {
 // CHECK:STDOUT:   %Self => constants.%Self.4d7
 // CHECK:STDOUT:   %Self.binding.as_type => constants.%Self.binding.as_type
+// CHECK:STDOUT:   %.loc15_14.1 => constants.%.6cb
 // CHECK:STDOUT:   %I2.lookup_impl_witness => constants.%I2.lookup_impl_witness.1de
 // CHECK:STDOUT:   %I2.facet.loc15_14.1 => constants.%I2.facet
 // CHECK:STDOUT:   %impl.elem0.loc15_14.1 => constants.%impl.elem0.804

+ 5 - 3
toolchain/check/testdata/interface/fail_todo_define_default_fn_out_of_line.carbon

@@ -227,6 +227,7 @@ fn Interface.C.F[self: Self](U:! type, u: U*) -> U* { return u; }
 // CHECK:STDOUT:   %require_complete.886: <witness> = require_complete_type %C [symbolic]
 // CHECK:STDOUT:   %Copy.type: type = facet_type <@Copy> [concrete]
 // CHECK:STDOUT:   %Copy.Op.type: type = fn_type @Copy.Op [concrete]
+// CHECK:STDOUT:   %.f91: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%U.b88) [symbolic]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness.7dd: <witness> = lookup_impl_witness %ptr.262, @Copy [symbolic]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr.262, (%Copy.lookup_impl_witness.7dd) [symbolic]
 // CHECK:STDOUT:   %.2d0: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet [symbolic]
@@ -347,16 +348,17 @@ fn Interface.C.F[self: Self](U:! type, u: U*) -> U* { return u; }
 // CHECK:STDOUT: !definition:
 // CHECK:STDOUT:   %require_complete.loc20_47: <witness> = require_complete_type %ptr.loc14_36.1 [symbolic = %require_complete.loc20_47 (constants.%require_complete.88b)]
 // CHECK:STDOUT:   %require_complete.loc20_22: <witness> = require_complete_type %C [symbolic = %require_complete.loc20_22 (constants.%require_complete.886)]
+// CHECK:STDOUT:   %.loc20_62.2: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%U.loc14_22.1) [symbolic = %.loc20_62.2 (constants.%.f91)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr.loc14_36.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.7dd)]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr.loc14_36.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet)]
-// CHECK:STDOUT:   %.loc20_62.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc20_62.2 (constants.%.2d0)]
-// CHECK:STDOUT:   %impl.elem0.loc20_62.2: @C.F.%.loc20_62.2 (%.2d0) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc20_62.2 (constants.%impl.elem0.720)]
+// CHECK:STDOUT:   %.loc20_62.3: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc20_62.3 (constants.%.2d0)]
+// CHECK:STDOUT:   %impl.elem0.loc20_62.2: @C.F.%.loc20_62.3 (%.2d0) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc20_62.2 (constants.%impl.elem0.720)]
 // CHECK:STDOUT:   %specific_impl_fn.loc20_62.2: <specific function> = specific_impl_function %impl.elem0.loc20_62.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc20_62.2 (constants.%specific_impl_fn.b1c)]
 // CHECK:STDOUT:
 // CHECK:STDOUT:   fn(%self.param.loc20: @C.F.%C (%C), %u.param.loc20: @C.F.%ptr.loc14_36.1 (%ptr.262)) -> @C.F.%ptr.loc14_36.1 (%ptr.262) {
 // CHECK:STDOUT:   !entry:
 // CHECK:STDOUT:     %u.ref: @C.F.%ptr.loc14_36.1 (%ptr.262) = name_ref u, %u.loc20
-// CHECK:STDOUT:     %impl.elem0.loc20_62.1: @C.F.%.loc20_62.2 (%.2d0) = impl_witness_access constants.%Copy.lookup_impl_witness.7dd, element0 [symbolic = %impl.elem0.loc20_62.2 (constants.%impl.elem0.720)]
+// CHECK:STDOUT:     %impl.elem0.loc20_62.1: @C.F.%.loc20_62.3 (%.2d0) = impl_witness_access constants.%Copy.lookup_impl_witness.7dd, element0 [symbolic = %impl.elem0.loc20_62.2 (constants.%impl.elem0.720)]
 // CHECK:STDOUT:     %bound_method.loc20_62.1: <bound method> = bound_method %u.ref, %impl.elem0.loc20_62.1
 // CHECK:STDOUT:     %specific_impl_fn.loc20_62.1: <specific function> = specific_impl_function %impl.elem0.loc20_62.1, @Copy.Op(constants.%Copy.facet) [symbolic = %specific_impl_fn.loc20_62.2 (constants.%specific_impl_fn.b1c)]
 // CHECK:STDOUT:     %bound_method.loc20_62.2: <bound method> = bound_method %u.ref, %specific_impl_fn.loc20_62.1

+ 348 - 0
toolchain/check/testdata/interface/final.carbon

@@ -0,0 +1,348 @@
+// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
+// Exceptions. See /LICENSE for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/convert.carbon
+//
+// AUTOUPDATE
+// TIP: To test this file alone, run:
+// TIP:   bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/interface/final.carbon
+// TIP: To dump output, run:
+// TIP:   bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/interface/final.carbon
+
+// --- require_complete_impl.carbon
+//@include-in-dumps
+library "[[@TEST_NAME]]";
+
+interface I { fn F(); }
+interface J {}
+
+final impl forall [T:! J] T as I { fn F() {} }
+
+// This is creating an indirection where the `final impl` requires an indirect
+// instantiation by the caller.
+fn UseI(T:! I) { T.F(); }
+fn UseJ(T:! J) { UseI(T); }
+
+class C {}
+impl C as J {}
+fn Use() { UseJ(C); }
+
+// CHECK:STDOUT: --- require_complete_impl.carbon
+// CHECK:STDOUT:
+// CHECK:STDOUT: constants {
+// CHECK:STDOUT:   %I.type: type = facet_type <@I> [concrete]
+// CHECK:STDOUT:   %Self.9f2: %I.type = symbolic_binding Self, 0 [symbolic]
+// CHECK:STDOUT:   %I.F.type: type = fn_type @I.F [concrete]
+// CHECK:STDOUT:   %empty_tuple.type: type = tuple_type () [concrete]
+// CHECK:STDOUT:   %I.F: %I.F.type = struct_value () [concrete]
+// CHECK:STDOUT:   %I.assoc_type: type = assoc_entity_type @I [concrete]
+// CHECK:STDOUT:   %assoc0: %I.assoc_type = assoc_entity element0, @I.%I.F.decl [concrete]
+// CHECK:STDOUT:   %J.type: type = facet_type <@J> [concrete]
+// CHECK:STDOUT:   %Self.dc6: %J.type = symbolic_binding Self, 0 [symbolic]
+// CHECK:STDOUT:   %type: type = facet_type <type> [concrete]
+// CHECK:STDOUT:   %.Self: %type = symbolic_binding .Self [symbolic_self]
+// CHECK:STDOUT:   %T.dc6: %J.type = symbolic_binding T, 0 [symbolic]
+// CHECK:STDOUT:   %pattern_type.84b: type = pattern_type %J.type [concrete]
+// CHECK:STDOUT:   %T.binding.as_type.1fa: type = symbolic_binding_type T, 0, %T.dc6 [symbolic]
+// CHECK:STDOUT:   %I.impl_witness.2d8: <witness> = impl_witness file.%I.impl_witness_table, @T.binding.as_type.as.I.impl(%T.dc6) [symbolic]
+// CHECK:STDOUT:   %T.binding.as_type.as.I.impl.F.type.0a0: type = fn_type @T.binding.as_type.as.I.impl.F, @T.binding.as_type.as.I.impl(%T.dc6) [symbolic]
+// CHECK:STDOUT:   %T.binding.as_type.as.I.impl.F.793: %T.binding.as_type.as.I.impl.F.type.0a0 = struct_value () [symbolic]
+// CHECK:STDOUT:   %I.facet.238: %I.type = facet_value %T.binding.as_type.1fa, (%I.impl_witness.2d8) [symbolic]
+// CHECK:STDOUT:   %T.9f2: %I.type = symbolic_binding T, 0 [symbolic]
+// CHECK:STDOUT:   %pattern_type.09a: type = pattern_type %I.type [concrete]
+// CHECK:STDOUT:   %UseI.type: type = fn_type @UseI [concrete]
+// CHECK:STDOUT:   %UseI: %UseI.type = struct_value () [concrete]
+// CHECK:STDOUT:   %T.binding.as_type.bcb: type = symbolic_binding_type T, 0, %T.9f2 [symbolic]
+// CHECK:STDOUT:   %I.lookup_impl_witness: <witness> = lookup_impl_witness %T.9f2, @I [symbolic]
+// CHECK:STDOUT:   %.258: type = fn_type_with_self_type %I.F.type, %T.9f2 [symbolic]
+// CHECK:STDOUT:   %impl.elem0: %.258 = impl_witness_access %I.lookup_impl_witness, element0 [symbolic]
+// CHECK:STDOUT:   %specific_impl_fn: <specific function> = specific_impl_function %impl.elem0, @I.F(%T.9f2) [symbolic]
+// CHECK:STDOUT:   %UseJ.type: type = fn_type @UseJ [concrete]
+// CHECK:STDOUT:   %UseJ: %UseJ.type = struct_value () [concrete]
+// CHECK:STDOUT:   %.f34: require_specific_def_type = require_specific_def @T.binding.as_type.as.I.impl(%T.dc6) [symbolic]
+// CHECK:STDOUT:   %UseI.specific_fn.6e9: <specific function> = specific_function %UseI, @UseI(%I.facet.238) [symbolic]
+// CHECK:STDOUT:   %C: type = class_type @C [concrete]
+// CHECK:STDOUT:   %empty_struct_type: type = struct_type {} [concrete]
+// CHECK:STDOUT:   %complete_type: <witness> = complete_type_witness %empty_struct_type [concrete]
+// CHECK:STDOUT:   %J.impl_witness: <witness> = impl_witness file.%J.impl_witness_table [concrete]
+// CHECK:STDOUT:   %Use.type: type = fn_type @Use [concrete]
+// CHECK:STDOUT:   %Use: %Use.type = struct_value () [concrete]
+// CHECK:STDOUT:   %J.facet: %J.type = facet_value %C, (%J.impl_witness) [concrete]
+// CHECK:STDOUT:   %UseJ.specific_fn: <specific function> = specific_function %UseJ, @UseJ(%J.facet) [concrete]
+// CHECK:STDOUT:   %.1ec: type = fn_type_with_self_type %I.F.type, %I.facet.238 [symbolic]
+// CHECK:STDOUT:   %T.binding.as_type.as.I.impl.F.specific_fn.4f0: <specific function> = specific_function %T.binding.as_type.as.I.impl.F.793, @T.binding.as_type.as.I.impl.F(%T.dc6) [symbolic]
+// CHECK:STDOUT:   %I.impl_witness.2d2: <witness> = impl_witness file.%I.impl_witness_table, @T.binding.as_type.as.I.impl(%J.facet) [concrete]
+// CHECK:STDOUT:   %T.binding.as_type.as.I.impl.F.type.4e6: type = fn_type @T.binding.as_type.as.I.impl.F, @T.binding.as_type.as.I.impl(%J.facet) [concrete]
+// CHECK:STDOUT:   %T.binding.as_type.as.I.impl.F.1e2: %T.binding.as_type.as.I.impl.F.type.4e6 = struct_value () [concrete]
+// CHECK:STDOUT:   %.12b: require_specific_def_type = require_specific_def @T.binding.as_type.as.I.impl(%J.facet) [concrete]
+// CHECK:STDOUT:   %I.facet.8a0: %I.type = facet_value %C, (%I.impl_witness.2d2) [concrete]
+// CHECK:STDOUT:   %UseI.specific_fn.aab: <specific function> = specific_function %UseI, @UseI(%I.facet.8a0) [concrete]
+// CHECK:STDOUT:   %.df0: type = fn_type_with_self_type %I.F.type, %I.facet.8a0 [concrete]
+// CHECK:STDOUT:   %T.binding.as_type.as.I.impl.F.specific_fn.662: <specific function> = specific_function %T.binding.as_type.as.I.impl.F.1e2, @T.binding.as_type.as.I.impl.F(%J.facet) [concrete]
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: imports {
+// CHECK:STDOUT:   %Core: <namespace> = namespace file.%Core.import, [concrete] {
+// CHECK:STDOUT:     import Core//prelude
+// CHECK:STDOUT:     import Core//prelude/...
+// CHECK:STDOUT:   }
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: file {
+// CHECK:STDOUT:   package: <namespace> = namespace [concrete] {
+// CHECK:STDOUT:     .Core = imports.%Core
+// CHECK:STDOUT:     .I = %I.decl
+// CHECK:STDOUT:     .J = %J.decl
+// CHECK:STDOUT:     .UseI = %UseI.decl
+// CHECK:STDOUT:     .UseJ = %UseJ.decl
+// CHECK:STDOUT:     .C = %C.decl
+// CHECK:STDOUT:     .Use = %Use.decl
+// CHECK:STDOUT:   }
+// CHECK:STDOUT:   %Core.import = import Core
+// CHECK:STDOUT:   %I.decl: type = interface_decl @I [concrete = constants.%I.type] {} {}
+// CHECK:STDOUT:   %J.decl: type = interface_decl @J [concrete = constants.%J.type] {} {}
+// CHECK:STDOUT:   impl_decl @T.binding.as_type.as.I.impl [concrete] {
+// CHECK:STDOUT:     %T.patt: %pattern_type.84b = symbolic_binding_pattern T, 0 [concrete]
+// CHECK:STDOUT:   } {
+// CHECK:STDOUT:     %T.ref: %J.type = name_ref T, %T.loc7_20.2 [symbolic = %T.loc7_20.1 (constants.%T.dc6)]
+// CHECK:STDOUT:     %T.as_type: type = facet_access_type %T.ref [symbolic = %T.binding.as_type (constants.%T.binding.as_type.1fa)]
+// CHECK:STDOUT:     %.loc7_27: type = converted %T.ref, %T.as_type [symbolic = %T.binding.as_type (constants.%T.binding.as_type.1fa)]
+// CHECK:STDOUT:     %I.ref: type = name_ref I, file.%I.decl [concrete = constants.%I.type]
+// CHECK:STDOUT:     %.loc7_24: type = splice_block %J.ref [concrete = constants.%J.type] {
+// CHECK:STDOUT:       %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self]
+// CHECK:STDOUT:       %J.ref: type = name_ref J, file.%J.decl [concrete = constants.%J.type]
+// CHECK:STDOUT:     }
+// CHECK:STDOUT:     %T.loc7_20.2: %J.type = symbolic_binding T, 0 [symbolic = %T.loc7_20.1 (constants.%T.dc6)]
+// CHECK:STDOUT:   }
+// CHECK:STDOUT:   %I.impl_witness_table = impl_witness_table (@T.binding.as_type.as.I.impl.%T.binding.as_type.as.I.impl.F.decl), @T.binding.as_type.as.I.impl [concrete]
+// CHECK:STDOUT:   %I.impl_witness: <witness> = impl_witness %I.impl_witness_table, @T.binding.as_type.as.I.impl(constants.%T.dc6) [symbolic = @T.binding.as_type.as.I.impl.%I.impl_witness (constants.%I.impl_witness.2d8)]
+// CHECK:STDOUT:   %UseI.decl: %UseI.type = fn_decl @UseI [concrete = constants.%UseI] {
+// CHECK:STDOUT:     %T.patt: %pattern_type.09a = symbolic_binding_pattern T, 0 [concrete]
+// CHECK:STDOUT:   } {
+// CHECK:STDOUT:     %.loc11_13: type = splice_block %I.ref [concrete = constants.%I.type] {
+// CHECK:STDOUT:       %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self]
+// CHECK:STDOUT:       %I.ref: type = name_ref I, file.%I.decl [concrete = constants.%I.type]
+// CHECK:STDOUT:     }
+// CHECK:STDOUT:     %T.loc11_9.2: %I.type = symbolic_binding T, 0 [symbolic = %T.loc11_9.1 (constants.%T.9f2)]
+// CHECK:STDOUT:   }
+// CHECK:STDOUT:   %UseJ.decl: %UseJ.type = fn_decl @UseJ [concrete = constants.%UseJ] {
+// CHECK:STDOUT:     %T.patt: %pattern_type.84b = symbolic_binding_pattern T, 0 [concrete]
+// CHECK:STDOUT:   } {
+// CHECK:STDOUT:     %.loc12_13: type = splice_block %J.ref [concrete = constants.%J.type] {
+// CHECK:STDOUT:       %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self]
+// CHECK:STDOUT:       %J.ref: type = name_ref J, file.%J.decl [concrete = constants.%J.type]
+// CHECK:STDOUT:     }
+// CHECK:STDOUT:     %T.loc12_9.2: %J.type = symbolic_binding T, 0 [symbolic = %T.loc12_9.1 (constants.%T.dc6)]
+// CHECK:STDOUT:   }
+// CHECK:STDOUT:   %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
+// CHECK:STDOUT:   impl_decl @C.as.J.impl [concrete] {} {
+// CHECK:STDOUT:     %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C]
+// CHECK:STDOUT:     %J.ref: type = name_ref J, file.%J.decl [concrete = constants.%J.type]
+// CHECK:STDOUT:   }
+// CHECK:STDOUT:   %J.impl_witness_table = impl_witness_table (), @C.as.J.impl [concrete]
+// CHECK:STDOUT:   %J.impl_witness: <witness> = impl_witness %J.impl_witness_table [concrete = constants.%J.impl_witness]
+// CHECK:STDOUT:   %Use.decl: %Use.type = fn_decl @Use [concrete = constants.%Use] {} {}
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: interface @I {
+// CHECK:STDOUT:   %Self: %I.type = symbolic_binding Self, 0 [symbolic = constants.%Self.9f2]
+// CHECK:STDOUT:   %I.F.decl: %I.F.type = fn_decl @I.F [concrete = constants.%I.F] {} {}
+// CHECK:STDOUT:   %assoc0: %I.assoc_type = assoc_entity element0, %I.F.decl [concrete = constants.%assoc0]
+// CHECK:STDOUT:
+// CHECK:STDOUT: !members:
+// CHECK:STDOUT:   .Self = %Self
+// CHECK:STDOUT:   .F = %assoc0
+// CHECK:STDOUT:   witness = (%I.F.decl)
+// CHECK:STDOUT:
+// CHECK:STDOUT: !requires:
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: interface @J {
+// CHECK:STDOUT:   %Self: %J.type = symbolic_binding Self, 0 [symbolic = constants.%Self.dc6]
+// CHECK:STDOUT:
+// CHECK:STDOUT: !members:
+// CHECK:STDOUT:   .Self = %Self
+// CHECK:STDOUT:   witness = ()
+// CHECK:STDOUT:
+// CHECK:STDOUT: !requires:
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: generic impl @T.binding.as_type.as.I.impl(%T.loc7_20.2: %J.type) {
+// CHECK:STDOUT:   %T.loc7_20.1: %J.type = symbolic_binding T, 0 [symbolic = %T.loc7_20.1 (constants.%T.dc6)]
+// CHECK:STDOUT:   %T.binding.as_type: type = symbolic_binding_type T, 0, %T.loc7_20.1 [symbolic = %T.binding.as_type (constants.%T.binding.as_type.1fa)]
+// CHECK:STDOUT:   %I.impl_witness: <witness> = impl_witness file.%I.impl_witness_table, @T.binding.as_type.as.I.impl(%T.loc7_20.1) [symbolic = %I.impl_witness (constants.%I.impl_witness.2d8)]
+// CHECK:STDOUT:
+// CHECK:STDOUT: !definition:
+// CHECK:STDOUT:   %T.binding.as_type.as.I.impl.F.type: type = fn_type @T.binding.as_type.as.I.impl.F, @T.binding.as_type.as.I.impl(%T.loc7_20.1) [symbolic = %T.binding.as_type.as.I.impl.F.type (constants.%T.binding.as_type.as.I.impl.F.type.0a0)]
+// CHECK:STDOUT:   %T.binding.as_type.as.I.impl.F: @T.binding.as_type.as.I.impl.%T.binding.as_type.as.I.impl.F.type (%T.binding.as_type.as.I.impl.F.type.0a0) = struct_value () [symbolic = %T.binding.as_type.as.I.impl.F (constants.%T.binding.as_type.as.I.impl.F.793)]
+// CHECK:STDOUT:
+// CHECK:STDOUT:   impl: %.loc7_27 as %I.ref {
+// CHECK:STDOUT:     %T.binding.as_type.as.I.impl.F.decl: @T.binding.as_type.as.I.impl.%T.binding.as_type.as.I.impl.F.type (%T.binding.as_type.as.I.impl.F.type.0a0) = fn_decl @T.binding.as_type.as.I.impl.F [symbolic = @T.binding.as_type.as.I.impl.%T.binding.as_type.as.I.impl.F (constants.%T.binding.as_type.as.I.impl.F.793)] {} {}
+// CHECK:STDOUT:
+// CHECK:STDOUT:   !members:
+// CHECK:STDOUT:     .F = %T.binding.as_type.as.I.impl.F.decl
+// CHECK:STDOUT:     witness = file.%I.impl_witness
+// CHECK:STDOUT:   }
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: impl @C.as.J.impl: %C.ref as %J.ref {
+// CHECK:STDOUT: !members:
+// CHECK:STDOUT:   witness = file.%J.impl_witness
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: class @C {
+// CHECK:STDOUT:   %complete_type: <witness> = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type]
+// CHECK:STDOUT:   complete_type_witness = %complete_type
+// CHECK:STDOUT:
+// CHECK:STDOUT: !members:
+// CHECK:STDOUT:   .Self = constants.%C
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: generic fn @I.F(@I.%Self: %I.type) {
+// CHECK:STDOUT:   fn();
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: generic fn @T.binding.as_type.as.I.impl.F(@T.binding.as_type.as.I.impl.%T.loc7_20.2: %J.type) {
+// CHECK:STDOUT: !definition:
+// CHECK:STDOUT:
+// CHECK:STDOUT:   fn() {
+// CHECK:STDOUT:   !entry:
+// CHECK:STDOUT:     return
+// CHECK:STDOUT:   }
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: generic fn @UseI(%T.loc11_9.2: %I.type) {
+// CHECK:STDOUT:   %T.loc11_9.1: %I.type = symbolic_binding T, 0 [symbolic = %T.loc11_9.1 (constants.%T.9f2)]
+// CHECK:STDOUT:
+// CHECK:STDOUT: !definition:
+// CHECK:STDOUT:   %T.binding.as_type: type = symbolic_binding_type T, 0, %T.loc11_9.1 [symbolic = %T.binding.as_type (constants.%T.binding.as_type.bcb)]
+// CHECK:STDOUT:   %I.lookup_impl_witness: <witness> = lookup_impl_witness %T.loc11_9.1, @I [symbolic = %I.lookup_impl_witness (constants.%I.lookup_impl_witness)]
+// CHECK:STDOUT:   %.loc11_19.2: type = fn_type_with_self_type constants.%I.F.type, %T.loc11_9.1 [symbolic = %.loc11_19.2 (constants.%.258)]
+// CHECK:STDOUT:   %impl.elem0.loc11_19.2: @UseI.%.loc11_19.2 (%.258) = impl_witness_access %I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc11_19.2 (constants.%impl.elem0)]
+// CHECK:STDOUT:   %specific_impl_fn.loc11_19.2: <specific function> = specific_impl_function %impl.elem0.loc11_19.2, @I.F(%T.loc11_9.1) [symbolic = %specific_impl_fn.loc11_19.2 (constants.%specific_impl_fn)]
+// CHECK:STDOUT:
+// CHECK:STDOUT:   fn() {
+// CHECK:STDOUT:   !entry:
+// CHECK:STDOUT:     %T.ref: %I.type = name_ref T, %T.loc11_9.2 [symbolic = %T.loc11_9.1 (constants.%T.9f2)]
+// CHECK:STDOUT:     %F.ref: %I.assoc_type = name_ref F, @I.%assoc0 [concrete = constants.%assoc0]
+// CHECK:STDOUT:     %T.as_type: type = facet_access_type %T.ref [symbolic = %T.binding.as_type (constants.%T.binding.as_type.bcb)]
+// CHECK:STDOUT:     %.loc11_19.1: type = converted %T.ref, %T.as_type [symbolic = %T.binding.as_type (constants.%T.binding.as_type.bcb)]
+// CHECK:STDOUT:     %impl.elem0.loc11_19.1: @UseI.%.loc11_19.2 (%.258) = impl_witness_access constants.%I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc11_19.2 (constants.%impl.elem0)]
+// CHECK:STDOUT:     %specific_impl_fn.loc11_19.1: <specific function> = specific_impl_function %impl.elem0.loc11_19.1, @I.F(constants.%T.9f2) [symbolic = %specific_impl_fn.loc11_19.2 (constants.%specific_impl_fn)]
+// CHECK:STDOUT:     %.loc11_22: init %empty_tuple.type = call %specific_impl_fn.loc11_19.1()
+// CHECK:STDOUT:     return
+// CHECK:STDOUT:   }
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: generic fn @UseJ(%T.loc12_9.2: %J.type) {
+// CHECK:STDOUT:   %T.loc12_9.1: %J.type = symbolic_binding T, 0 [symbolic = %T.loc12_9.1 (constants.%T.dc6)]
+// CHECK:STDOUT:
+// CHECK:STDOUT: !definition:
+// CHECK:STDOUT:   %T.binding.as_type: type = symbolic_binding_type T, 0, %T.loc12_9.1 [symbolic = %T.binding.as_type (constants.%T.binding.as_type.1fa)]
+// CHECK:STDOUT:   %.loc12_24.2: require_specific_def_type = require_specific_def @T.binding.as_type.as.I.impl(%T.loc12_9.1) [symbolic = %.loc12_24.2 (constants.%.f34)]
+// CHECK:STDOUT:   %I.impl_witness: <witness> = impl_witness file.%I.impl_witness_table, @T.binding.as_type.as.I.impl(%T.loc12_9.1) [symbolic = %I.impl_witness (constants.%I.impl_witness.2d8)]
+// CHECK:STDOUT:   %I.facet.loc12_24.2: %I.type = facet_value %T.binding.as_type, (%I.impl_witness) [symbolic = %I.facet.loc12_24.2 (constants.%I.facet.238)]
+// CHECK:STDOUT:   %UseI.specific_fn.loc12_18.2: <specific function> = specific_function constants.%UseI, @UseI(%I.facet.loc12_24.2) [symbolic = %UseI.specific_fn.loc12_18.2 (constants.%UseI.specific_fn.6e9)]
+// CHECK:STDOUT:
+// CHECK:STDOUT:   fn() {
+// CHECK:STDOUT:   !entry:
+// CHECK:STDOUT:     %UseI.ref: %UseI.type = name_ref UseI, file.%UseI.decl [concrete = constants.%UseI]
+// CHECK:STDOUT:     %T.ref: %J.type = name_ref T, %T.loc12_9.2 [symbolic = %T.loc12_9.1 (constants.%T.dc6)]
+// CHECK:STDOUT:     %T.as_type: type = facet_access_type %T.ref [symbolic = %T.binding.as_type (constants.%T.binding.as_type.1fa)]
+// CHECK:STDOUT:     %I.facet.loc12_24.1: %I.type = facet_value %T.as_type, (constants.%I.impl_witness.2d8) [symbolic = %I.facet.loc12_24.2 (constants.%I.facet.238)]
+// CHECK:STDOUT:     %.loc12_24.1: %I.type = converted %T.ref, %I.facet.loc12_24.1 [symbolic = %I.facet.loc12_24.2 (constants.%I.facet.238)]
+// CHECK:STDOUT:     %UseI.specific_fn.loc12_18.1: <specific function> = specific_function %UseI.ref, @UseI(constants.%I.facet.238) [symbolic = %UseI.specific_fn.loc12_18.2 (constants.%UseI.specific_fn.6e9)]
+// CHECK:STDOUT:     %UseI.call: init %empty_tuple.type = call %UseI.specific_fn.loc12_18.1()
+// CHECK:STDOUT:     return
+// CHECK:STDOUT:   }
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: fn @Use() {
+// CHECK:STDOUT: !entry:
+// CHECK:STDOUT:   %UseJ.ref: %UseJ.type = name_ref UseJ, file.%UseJ.decl [concrete = constants.%UseJ]
+// CHECK:STDOUT:   %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C]
+// CHECK:STDOUT:   %J.facet: %J.type = facet_value %C.ref, (constants.%J.impl_witness) [concrete = constants.%J.facet]
+// CHECK:STDOUT:   %.loc16: %J.type = converted %C.ref, %J.facet [concrete = constants.%J.facet]
+// CHECK:STDOUT:   %UseJ.specific_fn: <specific function> = specific_function %UseJ.ref, @UseJ(constants.%J.facet) [concrete = constants.%UseJ.specific_fn]
+// CHECK:STDOUT:   %UseJ.call: init %empty_tuple.type = call %UseJ.specific_fn()
+// CHECK:STDOUT:   return
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: specific @I.F(constants.%Self.9f2) {}
+// CHECK:STDOUT:
+// CHECK:STDOUT: specific @T.binding.as_type.as.I.impl(constants.%T.dc6) {
+// CHECK:STDOUT:   %T.loc7_20.1 => constants.%T.dc6
+// CHECK:STDOUT:   %T.binding.as_type => constants.%T.binding.as_type.1fa
+// CHECK:STDOUT:   %I.impl_witness => constants.%I.impl_witness.2d8
+// CHECK:STDOUT:
+// CHECK:STDOUT: !definition:
+// CHECK:STDOUT:   %T.binding.as_type.as.I.impl.F.type => constants.%T.binding.as_type.as.I.impl.F.type.0a0
+// CHECK:STDOUT:   %T.binding.as_type.as.I.impl.F => constants.%T.binding.as_type.as.I.impl.F.793
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: specific @T.binding.as_type.as.I.impl.F(constants.%T.dc6) {
+// CHECK:STDOUT: !definition:
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: specific @I.F(constants.%I.facet.238) {}
+// CHECK:STDOUT:
+// CHECK:STDOUT: specific @UseI(constants.%T.9f2) {
+// CHECK:STDOUT:   %T.loc11_9.1 => constants.%T.9f2
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: specific @I.F(constants.%T.9f2) {}
+// CHECK:STDOUT:
+// CHECK:STDOUT: specific @UseJ(constants.%T.dc6) {
+// CHECK:STDOUT:   %T.loc12_9.1 => constants.%T.dc6
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: specific @UseI(constants.%I.facet.238) {
+// CHECK:STDOUT:   %T.loc11_9.1 => constants.%I.facet.238
+// CHECK:STDOUT:
+// CHECK:STDOUT: !definition:
+// CHECK:STDOUT:   %T.binding.as_type => constants.%T.binding.as_type.1fa
+// CHECK:STDOUT:   %I.lookup_impl_witness => constants.%I.impl_witness.2d8
+// CHECK:STDOUT:   %.loc11_19.2 => constants.%.1ec
+// CHECK:STDOUT:   %impl.elem0.loc11_19.2 => constants.%T.binding.as_type.as.I.impl.F.793
+// CHECK:STDOUT:   %specific_impl_fn.loc11_19.2 => constants.%T.binding.as_type.as.I.impl.F.specific_fn.4f0
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: specific @UseJ(constants.%J.facet) {
+// CHECK:STDOUT:   %T.loc12_9.1 => constants.%J.facet
+// CHECK:STDOUT:
+// CHECK:STDOUT: !definition:
+// CHECK:STDOUT:   %T.binding.as_type => constants.%C
+// CHECK:STDOUT:   %.loc12_24.2 => constants.%.12b
+// CHECK:STDOUT:   %I.impl_witness => constants.%I.impl_witness.2d2
+// CHECK:STDOUT:   %I.facet.loc12_24.2 => constants.%I.facet.8a0
+// CHECK:STDOUT:   %UseI.specific_fn.loc12_18.2 => constants.%UseI.specific_fn.aab
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: specific @T.binding.as_type.as.I.impl(constants.%J.facet) {
+// CHECK:STDOUT:   %T.loc7_20.1 => constants.%J.facet
+// CHECK:STDOUT:   %T.binding.as_type => constants.%C
+// CHECK:STDOUT:   %I.impl_witness => constants.%I.impl_witness.2d2
+// CHECK:STDOUT:
+// CHECK:STDOUT: !definition:
+// CHECK:STDOUT:   %T.binding.as_type.as.I.impl.F.type => constants.%T.binding.as_type.as.I.impl.F.type.4e6
+// CHECK:STDOUT:   %T.binding.as_type.as.I.impl.F => constants.%T.binding.as_type.as.I.impl.F.1e2
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: specific @UseI(constants.%I.facet.8a0) {
+// CHECK:STDOUT:   %T.loc11_9.1 => constants.%I.facet.8a0
+// CHECK:STDOUT:
+// CHECK:STDOUT: !definition:
+// CHECK:STDOUT:   %T.binding.as_type => constants.%C
+// CHECK:STDOUT:   %I.lookup_impl_witness => constants.%I.impl_witness.2d2
+// CHECK:STDOUT:   %.loc11_19.2 => constants.%.df0
+// CHECK:STDOUT:   %impl.elem0.loc11_19.2 => constants.%T.binding.as_type.as.I.impl.F.1e2
+// CHECK:STDOUT:   %specific_impl_fn.loc11_19.2 => constants.%T.binding.as_type.as.I.impl.F.specific_fn.662
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: specific @I.F(constants.%I.facet.8a0) {}
+// CHECK:STDOUT:
+// CHECK:STDOUT: specific @T.binding.as_type.as.I.impl.F(constants.%J.facet) {
+// CHECK:STDOUT: !definition:
+// CHECK:STDOUT: }
+// CHECK:STDOUT:

+ 22 - 10
toolchain/check/testdata/interface/generic_method.carbon

@@ -141,6 +141,7 @@ fn CallIndirect() {
 // CHECK:STDOUT:   %Copy.Op.type: type = fn_type @Copy.Op [concrete]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.type.75bcbe.1: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.d9f) [symbolic]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.692ac2.1: %ptr.as.Copy.impl.Op.type.75bcbe.1 = struct_value () [symbolic]
+// CHECK:STDOUT:   %.dcd: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%U.d9f) [symbolic]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness.c66: <witness> = lookup_impl_witness %ptr.4f0b5c.1, @Copy [symbolic]
 // CHECK:STDOUT:   %Copy.facet.747: %Copy.type = facet_value %ptr.4f0b5c.1, (%Copy.lookup_impl_witness.c66) [symbolic]
 // CHECK:STDOUT:   %.89d: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.747 [symbolic]
@@ -167,6 +168,7 @@ fn CallIndirect() {
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.cee: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.352) [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.056: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.cee = struct_value () [concrete]
 // CHECK:STDOUT:   %complete_type.05d: <witness> = complete_type_witness %tuple.type.092 [concrete]
+// CHECK:STDOUT:   %.d23: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.352) [concrete]
 // CHECK:STDOUT:   %Destroy.facet.272: %Destroy.type = facet_value %tuple.type.092, (%Destroy.impl_witness.cc1) [concrete]
 // CHECK:STDOUT:   %.30d: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.272 [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.7b8: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.056, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.352) [concrete]
@@ -191,6 +193,7 @@ fn CallIndirect() {
 // CHECK:STDOUT:   %Destroy.impl_witness.7b0: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.a42) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.c7f: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.a42) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.8d9: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.c7f = struct_value () [symbolic]
+// CHECK:STDOUT:   %.984: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.a42) [symbolic]
 // CHECK:STDOUT:   %Destroy.facet.ac7: %Destroy.type = facet_value %tuple.type.86a, (%Destroy.impl_witness.7b0) [symbolic]
 // CHECK:STDOUT:   %.47a: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.ac7 [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.b2a: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.8d9, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.a42) [symbolic]
@@ -202,6 +205,7 @@ fn CallIndirect() {
 // CHECK:STDOUT:   %Copy.impl_witness.f1c: <witness> = impl_witness imports.%Copy.impl_witness_table.67d, @ptr.as.Copy.impl(%Z) [concrete]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.type.31e: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%Z) [concrete]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.525: %ptr.as.Copy.impl.Op.type.31e = struct_value () [concrete]
+// CHECK:STDOUT:   %.f24: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%Z) [concrete]
 // CHECK:STDOUT:   %Copy.facet.347: %Copy.type = facet_value %ptr.fb6, (%Copy.impl_witness.f1c) [concrete]
 // CHECK:STDOUT:   %.90e: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.347 [concrete]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.specific_fn: <specific function> = specific_function %ptr.as.Copy.impl.Op.525, @ptr.as.Copy.impl.Op(%Z) [concrete]
@@ -404,10 +408,11 @@ fn CallIndirect() {
 // CHECK:STDOUT:   %require_complete.loc16_25: <witness> = require_complete_type %tuple.type.loc16 [symbolic = %require_complete.loc16_25 (constants.%require_complete.dc0)]
 // CHECK:STDOUT:   %require_complete.loc16_19: <witness> = require_complete_type %ptr.loc16_22.1 [symbolic = %require_complete.loc16_19 (constants.%require_complete.482d3f.1)]
 // CHECK:STDOUT:   %tuple.type.loc17: type = tuple_type (constants.%empty_struct_type, constants.%empty_struct_type, %ptr.loc16_22.1) [symbolic = %tuple.type.loc17 (constants.%tuple.type.f88)]
+// CHECK:STDOUT:   %.loc17_21.2: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%U.loc16_8.1) [symbolic = %.loc17_21.2 (constants.%.dcd)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr.loc16_22.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.c66)]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr.loc16_22.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.747)]
-// CHECK:STDOUT:   %.loc17_21.2: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc17_21.2 (constants.%.89d)]
-// CHECK:STDOUT:   %impl.elem0.loc17_21.2: @Y.as.A.impl.F.%.loc17_21.2 (%.89d) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc17_21.2 (constants.%impl.elem0.928)]
+// CHECK:STDOUT:   %.loc17_21.3: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc17_21.3 (constants.%.89d)]
+// CHECK:STDOUT:   %impl.elem0.loc17_21.2: @Y.as.A.impl.F.%.loc17_21.3 (%.89d) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc17_21.2 (constants.%impl.elem0.928)]
 // CHECK:STDOUT:   %specific_impl_fn.loc17_21.2: <specific function> = specific_impl_function %impl.elem0.loc17_21.2, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc17_21.2 (constants.%specific_impl_fn.6a1)]
 // CHECK:STDOUT:
 // CHECK:STDOUT:   fn(%u.param: @Y.as.A.impl.F.%ptr.loc16_22.1 (%ptr.4f0b5c.1)) -> %return.param: @Y.as.A.impl.F.%tuple.type.loc16 (%tuple.type.576) {
@@ -422,7 +427,7 @@ fn CallIndirect() {
 // CHECK:STDOUT:     %tuple.elem1: ref %Y = tuple_access %return, element1
 // CHECK:STDOUT:     %.loc17_18.2: init %Y = class_init (), %tuple.elem1 [concrete = constants.%Y.val]
 // CHECK:STDOUT:     %.loc17_22.3: init %Y = converted %.loc17_18.1, %.loc17_18.2 [concrete = constants.%Y.val]
-// CHECK:STDOUT:     %impl.elem0.loc17_21.1: @Y.as.A.impl.F.%.loc17_21.2 (%.89d) = impl_witness_access constants.%Copy.lookup_impl_witness.c66, element0 [symbolic = %impl.elem0.loc17_21.2 (constants.%impl.elem0.928)]
+// CHECK:STDOUT:     %impl.elem0.loc17_21.1: @Y.as.A.impl.F.%.loc17_21.3 (%.89d) = impl_witness_access constants.%Copy.lookup_impl_witness.c66, element0 [symbolic = %impl.elem0.loc17_21.2 (constants.%impl.elem0.928)]
 // CHECK:STDOUT:     %bound_method.loc17_21.1: <bound method> = bound_method %u.ref, %impl.elem0.loc17_21.1
 // CHECK:STDOUT:     %specific_impl_fn.loc17_21.1: <specific function> = specific_impl_function %impl.elem0.loc17_21.1, @Copy.Op(constants.%Copy.facet.747) [symbolic = %specific_impl_fn.loc17_21.2 (constants.%specific_impl_fn.6a1)]
 // CHECK:STDOUT:     %bound_method.loc17_21.2: <bound method> = bound_method %u.ref, %specific_impl_fn.loc17_21.1
@@ -485,9 +490,10 @@ fn CallIndirect() {
 // CHECK:STDOUT:   %tuple.type: type = tuple_type (constants.%X, %T.binding.as_type, constants.%ptr.fb6) [symbolic = %tuple.type (constants.%tuple.type.86a)]
 // CHECK:STDOUT:   %require_complete: <witness> = require_complete_type %tuple.type [symbolic = %require_complete (constants.%require_complete.93d)]
 // CHECK:STDOUT:   %facet_value: %type_where = facet_value %tuple.type, () [symbolic = %facet_value (constants.%facet_value.a42)]
+// CHECK:STDOUT:   %.loc28_12.4: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %.loc28_12.4 (constants.%.984)]
 // CHECK:STDOUT:   %Destroy.impl_witness: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.7b0)]
 // CHECK:STDOUT:   %Destroy.facet: %Destroy.type = facet_value %tuple.type, (%Destroy.impl_witness) [symbolic = %Destroy.facet (constants.%Destroy.facet.ac7)]
-// CHECK:STDOUT:   %.loc28_12.4: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc28_12.4 (constants.%.47a)]
+// CHECK:STDOUT:   %.loc28_12.5: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc28_12.5 (constants.%.47a)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.type (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.c7f)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op: @CallGeneric.%DestroyT.binding.as_type.as.Destroy.impl.Op.type (%DestroyT.binding.as_type.as.Destroy.impl.Op.type.c7f) = struct_value () [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.8d9)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.loc28: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.loc28 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.b2a)]
@@ -514,7 +520,7 @@ fn CallIndirect() {
 // CHECK:STDOUT:     %.loc28_12.1: ref @CallGeneric.%tuple.type (%tuple.type.86a) = temporary_storage
 // CHECK:STDOUT:     %.loc28_12.2: init @CallGeneric.%tuple.type (%tuple.type.86a) = call %specific_impl_fn.loc28_4.1(%addr) to %.loc28_12.1
 // CHECK:STDOUT:     %.loc28_12.3: ref @CallGeneric.%tuple.type (%tuple.type.86a) = temporary %.loc28_12.1, %.loc28_12.2
-// CHECK:STDOUT:     %impl.elem0.loc28_12: @CallGeneric.%.loc28_12.4 (%.47a) = impl_witness_access constants.%Destroy.impl_witness.7b0, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.8d9)]
+// CHECK:STDOUT:     %impl.elem0.loc28_12: @CallGeneric.%.loc28_12.5 (%.47a) = impl_witness_access constants.%Destroy.impl_witness.7b0, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.8d9)]
 // CHECK:STDOUT:     %bound_method.loc28_12.1: <bound method> = bound_method %.loc28_12.3, %impl.elem0.loc28_12
 // CHECK:STDOUT:     %specific_fn: <specific function> = specific_function %impl.elem0.loc28_12, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value.a42) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.loc28 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.b2a)]
 // CHECK:STDOUT:     %bound_method.loc28_12.2: <bound method> = bound_method %.loc28_12.3, %specific_fn
@@ -603,9 +609,10 @@ fn CallIndirect() {
 // CHECK:STDOUT:   %require_complete.loc16_25 => constants.%complete_type.05d
 // CHECK:STDOUT:   %require_complete.loc16_19 => constants.%complete_type.d3e
 // CHECK:STDOUT:   %tuple.type.loc17 => constants.%tuple.type.953
+// CHECK:STDOUT:   %.loc17_21.2 => constants.%.f24
 // CHECK:STDOUT:   %Copy.lookup_impl_witness => constants.%Copy.impl_witness.f1c
 // CHECK:STDOUT:   %Copy.facet => constants.%Copy.facet.347
-// CHECK:STDOUT:   %.loc17_21.2 => constants.%.90e
+// CHECK:STDOUT:   %.loc17_21.3 => constants.%.90e
 // CHECK:STDOUT:   %impl.elem0.loc17_21.2 => constants.%ptr.as.Copy.impl.Op.525
 // CHECK:STDOUT:   %specific_impl_fn.loc17_21.2 => constants.%ptr.as.Copy.impl.Op.specific_fn
 // CHECK:STDOUT: }
@@ -640,9 +647,10 @@ fn CallIndirect() {
 // CHECK:STDOUT:   %tuple.type => constants.%tuple.type.092
 // CHECK:STDOUT:   %require_complete => constants.%complete_type.05d
 // CHECK:STDOUT:   %facet_value => constants.%facet_value.352
+// CHECK:STDOUT:   %.loc28_12.4 => constants.%.d23
 // CHECK:STDOUT:   %Destroy.impl_witness => constants.%Destroy.impl_witness.cc1
 // CHECK:STDOUT:   %Destroy.facet => constants.%Destroy.facet.272
-// CHECK:STDOUT:   %.loc28_12.4 => constants.%.30d
+// CHECK:STDOUT:   %.loc28_12.5 => constants.%.30d
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.cee
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.056
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.loc28 => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.7b8
@@ -753,6 +761,7 @@ fn CallIndirect() {
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.5cd: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.71a) [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.472: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.5cd = struct_value () [concrete]
 // CHECK:STDOUT:   %complete_type.aa8: <witness> = complete_type_witness %tuple.type.415 [concrete]
+// CHECK:STDOUT:   %.a06: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.71a) [concrete]
 // CHECK:STDOUT:   %Destroy.facet.b37: %Destroy.type = facet_value %tuple.type.415, (%Destroy.impl_witness.c75) [concrete]
 // CHECK:STDOUT:   %.322: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.b37 [concrete]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.12b: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.472, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.71a) [concrete]
@@ -778,6 +787,7 @@ fn CallIndirect() {
 // CHECK:STDOUT:   %Destroy.impl_witness.cd1: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.185) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type.a5d: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.185) [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.a08: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.a5d = struct_value () [symbolic]
+// CHECK:STDOUT:   %.1ce: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.185) [symbolic]
 // CHECK:STDOUT:   %Destroy.facet.1b6: %Destroy.type = facet_value %tuple.type.bf3, (%Destroy.impl_witness.cd1) [symbolic]
 // CHECK:STDOUT:   %.cce: type = fn_type_with_self_type %Destroy.Op.type, %Destroy.facet.1b6 [symbolic]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.760: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op.a08, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value.185) [symbolic]
@@ -1082,9 +1092,10 @@ fn CallIndirect() {
 // CHECK:STDOUT:   %tuple.type: type = tuple_type (constants.%X, %T.binding.as_type, constants.%Z) [symbolic = %tuple.type (constants.%tuple.type.bf3)]
 // CHECK:STDOUT:   %require_complete: <witness> = require_complete_type %tuple.type [symbolic = %require_complete (constants.%require_complete.4e9)]
 // CHECK:STDOUT:   %facet_value: %type_where = facet_value %tuple.type, () [symbolic = %facet_value (constants.%facet_value.185)]
+// CHECK:STDOUT:   %.loc28_12.4: require_specific_def_type = require_specific_def @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %.loc28_12.4 (constants.%.1ce)]
 // CHECK:STDOUT:   %Destroy.impl_witness: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.cd1)]
 // CHECK:STDOUT:   %Destroy.facet: %Destroy.type = facet_value %tuple.type, (%Destroy.impl_witness) [symbolic = %Destroy.facet (constants.%Destroy.facet.1b6)]
-// CHECK:STDOUT:   %.loc28_12.4: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc28_12.4 (constants.%.cce)]
+// CHECK:STDOUT:   %.loc28_12.5: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc28_12.5 (constants.%.cce)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.type (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.a5d)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op: @CallGeneric.%DestroyT.binding.as_type.as.Destroy.impl.Op.type (%DestroyT.binding.as_type.as.Destroy.impl.Op.type.a5d) = struct_value () [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.a08)]
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.loc28: <specific function> = specific_function %DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl.Op(%facet_value) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.loc28 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.760)]
@@ -1108,7 +1119,7 @@ fn CallIndirect() {
 // CHECK:STDOUT:     %.loc28_11.6: %Z = acquire_value %.loc28_11.5
 // CHECK:STDOUT:     %.loc28_12.2: init @CallGeneric.%tuple.type (%tuple.type.bf3) = call %specific_impl_fn.loc28_4.1(%.loc28_11.6) to %.loc28_12.1
 // CHECK:STDOUT:     %.loc28_12.3: ref @CallGeneric.%tuple.type (%tuple.type.bf3) = temporary %.loc28_12.1, %.loc28_12.2
-// CHECK:STDOUT:     %impl.elem0.loc28_12: @CallGeneric.%.loc28_12.4 (%.cce) = impl_witness_access constants.%Destroy.impl_witness.cd1, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.a08)]
+// CHECK:STDOUT:     %impl.elem0.loc28_12: @CallGeneric.%.loc28_12.5 (%.cce) = impl_witness_access constants.%Destroy.impl_witness.cd1, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.a08)]
 // CHECK:STDOUT:     %bound_method.loc28_12.1: <bound method> = bound_method %.loc28_12.3, %impl.elem0.loc28_12
 // CHECK:STDOUT:     %specific_fn: <specific function> = specific_function %impl.elem0.loc28_12, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value.185) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.loc28 (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.760)]
 // CHECK:STDOUT:     %bound_method.loc28_12.2: <bound method> = bound_method %.loc28_12.3, %specific_fn
@@ -1288,9 +1299,10 @@ fn CallIndirect() {
 // CHECK:STDOUT:   %tuple.type => constants.%tuple.type.415
 // CHECK:STDOUT:   %require_complete => constants.%complete_type.aa8
 // CHECK:STDOUT:   %facet_value => constants.%facet_value.71a
+// CHECK:STDOUT:   %.loc28_12.4 => constants.%.a06
 // CHECK:STDOUT:   %Destroy.impl_witness => constants.%Destroy.impl_witness.c75
 // CHECK:STDOUT:   %Destroy.facet => constants.%Destroy.facet.b37
-// CHECK:STDOUT:   %.loc28_12.4 => constants.%.322
+// CHECK:STDOUT:   %.loc28_12.5 => constants.%.322
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.type => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.5cd
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.472
 // CHECK:STDOUT:   %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.loc28 => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.12b

+ 5 - 3
toolchain/check/testdata/interface/member_lookup.carbon

@@ -80,6 +80,7 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 {
 // CHECK:STDOUT:   %Copy.Op.type: type = fn_type @Copy.Op [concrete]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.type.75b: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%T.d9f) [symbolic]
 // CHECK:STDOUT:   %ptr.as.Copy.impl.Op.692: %ptr.as.Copy.impl.Op.type.75b = struct_value () [symbolic]
+// CHECK:STDOUT:   %.dcd: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.d9f) [symbolic]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness.c66: <witness> = lookup_impl_witness %ptr.4f0, @Copy [symbolic]
 // CHECK:STDOUT:   %Copy.facet.747: %Copy.type = facet_value %ptr.4f0, (%Copy.lookup_impl_witness.c66) [symbolic]
 // CHECK:STDOUT:   %.89d: type = fn_type_with_self_type %Copy.Op.type, %Copy.facet.747 [symbolic]
@@ -232,10 +233,11 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 {
 // CHECK:STDOUT:   %Interface.lookup_impl_witness: <witness> = lookup_impl_witness %I.loc8_28.1, @Interface, @Interface(%T.loc8_18.1) [symbolic = %Interface.lookup_impl_witness (constants.%Interface.lookup_impl_witness.8cd)]
 // CHECK:STDOUT:   %impl.elem0.loc9_11.3: @AccessGeneric.%ptr.loc8_50.1 (%ptr.4f0) = impl_witness_access %Interface.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc9_11.3 (constants.%impl.elem0.2bc)]
 // CHECK:STDOUT:   %require_complete.loc9_13: <witness> = require_complete_type %ptr.loc8_50.1 [symbolic = %require_complete.loc9_13 (constants.%require_complete.482)]
+// CHECK:STDOUT:   %.loc9_11.4: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%T.loc8_18.1) [symbolic = %.loc9_11.4 (constants.%.dcd)]
 // CHECK:STDOUT:   %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr.loc8_50.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.c66)]
 // CHECK:STDOUT:   %Copy.facet: %Copy.type = facet_value %ptr.loc8_50.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet.747)]
-// CHECK:STDOUT:   %.loc9_11.4: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc9_11.4 (constants.%.89d)]
-// CHECK:STDOUT:   %impl.elem0.loc9_11.4: @AccessGeneric.%.loc9_11.4 (%.89d) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc9_11.4 (constants.%impl.elem0.928)]
+// CHECK:STDOUT:   %.loc9_11.5: type = fn_type_with_self_type constants.%Copy.Op.type, %Copy.facet [symbolic = %.loc9_11.5 (constants.%.89d)]
+// CHECK:STDOUT:   %impl.elem0.loc9_11.4: @AccessGeneric.%.loc9_11.5 (%.89d) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc9_11.4 (constants.%impl.elem0.928)]
 // CHECK:STDOUT:   %bound_method.loc9_11.3: <bound method> = bound_method %impl.elem0.loc9_11.3, %impl.elem0.loc9_11.4 [symbolic = %bound_method.loc9_11.3 (constants.%bound_method.f64)]
 // CHECK:STDOUT:   %specific_impl_fn.loc9_11.2: <specific function> = specific_impl_function %impl.elem0.loc9_11.4, @Copy.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc9_11.2 (constants.%specific_impl_fn.6a1)]
 // CHECK:STDOUT:   %bound_method.loc9_11.4: <bound method> = bound_method %impl.elem0.loc9_11.3, %specific_impl_fn.loc9_11.2 [symbolic = %bound_method.loc9_11.4 (constants.%bound_method.930)]
@@ -248,7 +250,7 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 {
 // CHECK:STDOUT:     %I.as_type: type = facet_access_type %I.ref [symbolic = %I.binding.as_type (constants.%I.binding.as_type.594)]
 // CHECK:STDOUT:     %.loc9_11.2: type = converted %I.ref, %I.as_type [symbolic = %I.binding.as_type (constants.%I.binding.as_type.594)]
 // CHECK:STDOUT:     %impl.elem0.loc9_11.1: @AccessGeneric.%ptr.loc8_50.1 (%ptr.4f0) = impl_witness_access constants.%Interface.lookup_impl_witness.8cd, element0 [symbolic = %impl.elem0.loc9_11.3 (constants.%impl.elem0.2bc)]
-// CHECK:STDOUT:     %impl.elem0.loc9_11.2: @AccessGeneric.%.loc9_11.4 (%.89d) = impl_witness_access constants.%Copy.lookup_impl_witness.c66, element0 [symbolic = %impl.elem0.loc9_11.4 (constants.%impl.elem0.928)]
+// CHECK:STDOUT:     %impl.elem0.loc9_11.2: @AccessGeneric.%.loc9_11.5 (%.89d) = impl_witness_access constants.%Copy.lookup_impl_witness.c66, element0 [symbolic = %impl.elem0.loc9_11.4 (constants.%impl.elem0.928)]
 // CHECK:STDOUT:     %bound_method.loc9_11.1: <bound method> = bound_method %impl.elem0.loc9_11.1, %impl.elem0.loc9_11.2 [symbolic = %bound_method.loc9_11.3 (constants.%bound_method.f64)]
 // CHECK:STDOUT:     %specific_impl_fn.loc9_11.1: <specific function> = specific_impl_function %impl.elem0.loc9_11.2, @Copy.Op(constants.%Copy.facet.747) [symbolic = %specific_impl_fn.loc9_11.2 (constants.%specific_impl_fn.6a1)]
 // CHECK:STDOUT:     %bound_method.loc9_11.2: <bound method> = bound_method %impl.elem0.loc9_11.1, %specific_impl_fn.loc9_11.1 [symbolic = %bound_method.loc9_11.4 (constants.%bound_method.930)]

+ 3 - 2
toolchain/check/type_completion.cpp

@@ -193,8 +193,9 @@ class TypeCompleter {
              SemIR::CharLiteralType, SemIR::ErrorInst, SemIR::FacetType,
              SemIR::FloatLiteralType, SemIR::FloatType, SemIR::IntType,
              SemIR::IntLiteralType, SemIR::NamespaceType, SemIR::PatternType,
-             SemIR::PointerType, SemIR::SpecificFunctionType, SemIR::TypeType,
-             SemIR::VtableType, SemIR::WitnessType>())
+             SemIR::PointerType, SemIR::RequireSpecificDefinitionType,
+             SemIR::SpecificFunctionType, SemIR::TypeType, SemIR::VtableType,
+             SemIR::WitnessType>())
   auto BuildInfoForInst(SemIR::TypeId type_id, InstT /*inst*/) const
       -> SemIR::CompleteTypeInfo {
     return {.value_repr = MakeCopyValueRepr(type_id)};

+ 4 - 4
toolchain/driver/testdata/stdin.carbon

@@ -32,7 +32,7 @@
 // CHECK:STDOUT:   import_ir_insts: {}
 // CHECK:STDOUT:   clang_decls:     {}
 // CHECK:STDOUT:   name_scopes:
-// CHECK:STDOUT:     name_scope0:     {inst: instD, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {}}
+// CHECK:STDOUT:     name_scope0:     {inst: instE, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {}}
 // CHECK:STDOUT:   entity_names:    {}
 // CHECK:STDOUT:   cpp_global_vars: {}
 // CHECK:STDOUT:   functions:       {}
@@ -49,10 +49,10 @@
 // CHECK:STDOUT:     'type(inst(NamespaceType))':
 // CHECK:STDOUT:       value_repr:      {kind: copy, type: type(inst(NamespaceType))}
 // CHECK:STDOUT:   insts:
-// CHECK:STDOUT:     instD:           {kind: Namespace, arg0: name_scope0, arg1: inst<none>, type: type(inst(NamespaceType))}
+// CHECK:STDOUT:     instE:           {kind: Namespace, arg0: name_scope0, arg1: inst<none>, type: type(inst(NamespaceType))}
 // CHECK:STDOUT:   constant_values:
 // CHECK:STDOUT:     values:
-// CHECK:STDOUT:       instD:           concrete_constant(instD)
+// CHECK:STDOUT:       instE:           concrete_constant(instE)
 // CHECK:STDOUT:     symbolic_constants: {}
 // CHECK:STDOUT:   inst_blocks:
 // CHECK:STDOUT:     inst_block_empty: {}
@@ -60,7 +60,7 @@
 // CHECK:STDOUT:     imports:         {}
 // CHECK:STDOUT:     global_init:     {}
 // CHECK:STDOUT:     inst_block60000004:
-// CHECK:STDOUT:       0:               instD
+// CHECK:STDOUT:       0:               instE
 // CHECK:STDOUT: ...
 // CHECK:STDOUT: --- -
 // CHECK:STDOUT:

+ 2 - 1
toolchain/lower/file_context.cpp

@@ -935,7 +935,8 @@ template <typename InstT>
            SemIR::FunctionTypeWithSelfType, SemIR::GenericClassType,
            SemIR::GenericInterfaceType, SemIR::GenericNamedConstraintType,
            SemIR::InstType, SemIR::IntLiteralType, SemIR::NamespaceType,
-           SemIR::WhereExpr, SemIR::WitnessType, SemIR::UnboundElementType>())
+           SemIR::RequireSpecificDefinitionType, SemIR::UnboundElementType,
+           SemIR::WhereExpr, SemIR::WitnessType>())
 static auto BuildTypeForInst(FileContext& context, InstT /*inst*/)
     -> llvm::Type* {
   // Return an empty struct as a placeholder.

+ 1 - 0
toolchain/lower/mangler.cpp

@@ -90,6 +90,7 @@ auto Mangler::MangleInverseQualifiedNameScope(llvm::raw_ostream& os,
           case SemIR::FloatLiteralType::Kind:
           case SemIR::IntLiteralType::Kind:
           case SemIR::NamespaceType::Kind:
+          case SemIR::RequireSpecificDefinitionType::Kind:
           case SemIR::SpecificFunctionType::Kind:
           case SemIR::TypeType::Kind:
           case SemIR::VtableType::Kind:

+ 12 - 12
toolchain/lower/testdata/array/iterate.carbon

@@ -48,11 +48,11 @@ fn F() {
 // CHECK:STDOUT: for.next:                                         ; preds = %for.body, %entry
 // CHECK:STDOUT:   call void @llvm.lifetime.start.p0(ptr %.loc17_19.1.temp), !dbg !8
 // CHECK:STDOUT:   call void @"_CNext.f06e388f4a5bd5ec:Iterate.Core.a21f6adcc8abe06c"(ptr %.loc17_19.1.temp, ptr %.loc16_43.3.temp, ptr %var), !dbg !8
-// CHECK:STDOUT:   %Optional.HasValue.call = call i1 @_CHasValue.Optional.Core.c1b882a73b8b9531(ptr %.loc17_19.1.temp), !dbg !8
+// CHECK:STDOUT:   %Optional.HasValue.call = call i1 @_CHasValue.Optional.Core.9a253b43086de47c(ptr %.loc17_19.1.temp), !dbg !8
 // CHECK:STDOUT:   br i1 %Optional.HasValue.call, label %for.body, label %for.done, !dbg !8
 // CHECK:STDOUT:
 // CHECK:STDOUT: for.body:                                         ; preds = %for.next
-// CHECK:STDOUT:   %Optional.Get.call = call i32 @_CGet.Optional.Core.c1b882a73b8b9531(ptr %.loc17_19.1.temp), !dbg !8
+// CHECK:STDOUT:   %Optional.Get.call = call i32 @_CGet.Optional.Core.9a253b43086de47c(ptr %.loc17_19.1.temp), !dbg !8
 // CHECK:STDOUT:   call void @_CG.Main(i32 %Optional.Get.call), !dbg !9
 // CHECK:STDOUT:   br label %for.next, !dbg !10
 // CHECK:STDOUT:
@@ -83,22 +83,22 @@ fn F() {
 // CHECK:STDOUT:   %5 = sub i32 %4, 1, !dbg !19
 // CHECK:STDOUT:   %array.index = getelementptr inbounds [6 x i32], ptr %self, i32 0, i32 %5, !dbg !20
 // CHECK:STDOUT:   %6 = load i32, ptr %array.index, align 4, !dbg !20
-// CHECK:STDOUT:   call void @_CSome.Optional.Core.c1b882a73b8b9531(ptr %return, i32 %6), !dbg !21
+// CHECK:STDOUT:   call void @_CSome.Optional.Core.9a253b43086de47c(ptr %return, i32 %6), !dbg !21
 // CHECK:STDOUT:   ret void, !dbg !22
 // CHECK:STDOUT:
 // CHECK:STDOUT: 7:                                                ; preds = %0
-// CHECK:STDOUT:   call void @_CNone.Optional.Core.c1b882a73b8b9531(ptr %return), !dbg !23
+// CHECK:STDOUT:   call void @_CNone.Optional.Core.9a253b43086de47c(ptr %return), !dbg !23
 // CHECK:STDOUT:   ret void, !dbg !24
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr i1 @_CHasValue.Optional.Core.c1b882a73b8b9531(ptr %self) #0 !dbg !25 {
+// CHECK:STDOUT: define linkonce_odr i1 @_CHasValue.Optional.Core.9a253b43086de47c(ptr %self) #0 !dbg !25 {
 // CHECK:STDOUT:   %1 = call i1 @"_CHas.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr %self), !dbg !27
 // CHECK:STDOUT:   ret i1 %1, !dbg !28
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr i32 @_CGet.Optional.Core.c1b882a73b8b9531(ptr %self) #0 !dbg !29 {
+// CHECK:STDOUT: define linkonce_odr i32 @_CGet.Optional.Core.9a253b43086de47c(ptr %self) #0 !dbg !29 {
 // CHECK:STDOUT:   %1 = call i32 @"_CGet.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr %self), !dbg !30
 // CHECK:STDOUT:   ret i32 %1, !dbg !31
 // CHECK:STDOUT: }
@@ -110,13 +110,13 @@ fn F() {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr void @_CSome.Optional.Core.c1b882a73b8b9531(ptr sret({ i32, i1 }) %return, i32 %value) #0 !dbg !36 {
+// CHECK:STDOUT: define linkonce_odr void @_CSome.Optional.Core.9a253b43086de47c(ptr sret({ i32, i1 }) %return, i32 %value) #0 !dbg !36 {
 // CHECK:STDOUT:   call void @"_CSome.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr %return, i32 %value), !dbg !37
 // CHECK:STDOUT:   ret void, !dbg !38
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr void @_CNone.Optional.Core.c1b882a73b8b9531(ptr sret({ i32, i1 }) %return) #0 !dbg !39 {
+// CHECK:STDOUT: define linkonce_odr void @_CNone.Optional.Core.9a253b43086de47c(ptr sret({ i32, i1 }) %return) #0 !dbg !39 {
 // CHECK:STDOUT:   call void @"_CNone.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr %return), !dbg !40
 // CHECK:STDOUT:   ret void, !dbg !41
 // CHECK:STDOUT: }
@@ -202,21 +202,21 @@ fn F() {
 // CHECK:STDOUT: !22 = !DILocation(line: 27, column: 7, scope: !15)
 // CHECK:STDOUT: !23 = !DILocation(line: 29, column: 14, scope: !15)
 // CHECK:STDOUT: !24 = !DILocation(line: 29, column: 7, scope: !15)
-// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "HasValue", linkageName: "_CHasValue.Optional.Core.c1b882a73b8b9531", scope: null, file: !26, line: 32, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "HasValue", linkageName: "_CHasValue.Optional.Core.9a253b43086de47c", scope: null, file: !26, line: 32, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !26 = !DIFile(filename: "{{.*}}/prelude/types/optional.carbon", directory: "")
 // CHECK:STDOUT: !27 = !DILocation(line: 33, column: 12, scope: !25)
 // CHECK:STDOUT: !28 = !DILocation(line: 33, column: 5, scope: !25)
-// CHECK:STDOUT: !29 = distinct !DISubprogram(name: "Get", linkageName: "_CGet.Optional.Core.c1b882a73b8b9531", scope: null, file: !26, line: 35, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !29 = distinct !DISubprogram(name: "Get", linkageName: "_CGet.Optional.Core.9a253b43086de47c", scope: null, file: !26, line: 35, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !30 = !DILocation(line: 36, column: 12, scope: !29)
 // CHECK:STDOUT: !31 = !DILocation(line: 36, column: 5, scope: !29)
 // CHECK:STDOUT: !32 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !33, line: 339, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !33 = !DIFile(filename: "{{.*}}/prelude/types/int.carbon", directory: "")
 // CHECK:STDOUT: !34 = !DILocation(line: 341, column: 5, scope: !32)
 // CHECK:STDOUT: !35 = !DILocation(line: 339, column: 3, scope: !32)
-// CHECK:STDOUT: !36 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.Optional.Core.c1b882a73b8b9531", scope: null, file: !26, line: 29, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !36 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.Optional.Core.9a253b43086de47c", scope: null, file: !26, line: 29, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !37 = !DILocation(line: 30, column: 12, scope: !36)
 // CHECK:STDOUT: !38 = !DILocation(line: 30, column: 5, scope: !36)
-// CHECK:STDOUT: !39 = distinct !DISubprogram(name: "None", linkageName: "_CNone.Optional.Core.c1b882a73b8b9531", scope: null, file: !26, line: 26, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !39 = distinct !DISubprogram(name: "None", linkageName: "_CNone.Optional.Core.9a253b43086de47c", scope: null, file: !26, line: 26, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !40 = !DILocation(line: 27, column: 12, scope: !39)
 // CHECK:STDOUT: !41 = !DILocation(line: 27, column: 5, scope: !39)
 // CHECK:STDOUT: !42 = distinct !DISubprogram(name: "Has", linkageName: "_CHas.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899", scope: null, file: !26, line: 112, type: !5, spFlags: DISPFlagDefinition, unit: !2)

+ 9 - 9
toolchain/lower/testdata/for/bindings.carbon

@@ -55,13 +55,13 @@ fn For() {
 // CHECK:STDOUT: for.next:                                         ; preds = %for.body, %entry
 // CHECK:STDOUT:   call void @llvm.lifetime.start.p0(ptr %.loc29_33.1.temp), !dbg !8
 // CHECK:STDOUT:   call void @"_CNext.EmptyRange.Main:Iterate.Core.a862d5c8b748242e"(ptr %.loc29_33.1.temp, ptr %r.var, ptr %var), !dbg !8
-// CHECK:STDOUT:   %Optional.HasValue.call = call i1 @_CHasValue.Optional.Core.7a2fd2277130880e(ptr %.loc29_33.1.temp), !dbg !8
+// CHECK:STDOUT:   %Optional.HasValue.call = call i1 @_CHasValue.Optional.Core.5497e08686bb6191(ptr %.loc29_33.1.temp), !dbg !8
 // CHECK:STDOUT:   br i1 %Optional.HasValue.call, label %for.body, label %for.done, !dbg !8
 // CHECK:STDOUT:
 // CHECK:STDOUT: for.body:                                         ; preds = %for.next
 // CHECK:STDOUT:   call void @llvm.lifetime.start.p0(ptr %n.var), !dbg !9
 // CHECK:STDOUT:   call void @llvm.lifetime.start.p0(ptr %.loc29_33.8.temp), !dbg !8
-// CHECK:STDOUT:   call void @_CGet.Optional.Core.7a2fd2277130880e(ptr %.loc29_33.8.temp, ptr %.loc29_33.1.temp), !dbg !8
+// CHECK:STDOUT:   call void @_CGet.Optional.Core.5497e08686bb6191(ptr %.loc29_33.8.temp, ptr %.loc29_33.1.temp), !dbg !8
 // CHECK:STDOUT:   %tuple.elem0.tuple.elem = getelementptr inbounds nuw { i32, i32 }, ptr %.loc29_33.8.temp, i32 0, i32 0, !dbg !8
 // CHECK:STDOUT:   %tuple.elem1.tuple.elem = getelementptr inbounds nuw { i32, i32 }, ptr %.loc29_33.8.temp, i32 0, i32 1, !dbg !8
 // CHECK:STDOUT:   %.loc29_33.11 = load i32, ptr %tuple.elem0.tuple.elem, align 4, !dbg !8
@@ -89,24 +89,24 @@ fn For() {
 // CHECK:STDOUT: ; Function Attrs: nounwind
 // CHECK:STDOUT: define linkonce_odr void @"_CNext.EmptyRange.Main:Iterate.Core.a862d5c8b748242e"(ptr sret({ { i32, i32 }, i1 }) %return, ptr %self, ptr %cursor) #0 !dbg !15 {
 // CHECK:STDOUT: entry:
-// CHECK:STDOUT:   call void @_CNone.Optional.Core.7a2fd2277130880e(ptr %return), !dbg !16
+// CHECK:STDOUT:   call void @_CNone.Optional.Core.5497e08686bb6191(ptr %return), !dbg !16
 // CHECK:STDOUT:   ret void, !dbg !17
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr i1 @_CHasValue.Optional.Core.7a2fd2277130880e(ptr %self) #0 !dbg !18 {
+// CHECK:STDOUT: define linkonce_odr i1 @_CHasValue.Optional.Core.5497e08686bb6191(ptr %self) #0 !dbg !18 {
 // CHECK:STDOUT:   %1 = call i1 @"_CHas.225258f1a45e9386:OptionalStorage.Core.a862d5c8b748242e"(ptr %self), !dbg !20
 // CHECK:STDOUT:   ret i1 %1, !dbg !21
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr void @_CGet.Optional.Core.7a2fd2277130880e(ptr sret({ i32, i32 }) %return, ptr %self) #0 !dbg !22 {
+// CHECK:STDOUT: define linkonce_odr void @_CGet.Optional.Core.5497e08686bb6191(ptr sret({ i32, i32 }) %return, ptr %self) #0 !dbg !22 {
 // CHECK:STDOUT:   call void @"_CGet.225258f1a45e9386:OptionalStorage.Core.a862d5c8b748242e"(ptr %return, ptr %self), !dbg !23
 // CHECK:STDOUT:   ret void, !dbg !24
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr void @_CNone.Optional.Core.7a2fd2277130880e(ptr sret({ { i32, i32 }, i1 }) %return) #0 !dbg !25 {
+// CHECK:STDOUT: define linkonce_odr void @_CNone.Optional.Core.5497e08686bb6191(ptr sret({ { i32, i32 }, i1 }) %return) #0 !dbg !25 {
 // CHECK:STDOUT:   call void @"_CNone.225258f1a45e9386:OptionalStorage.Core.a862d5c8b748242e"(ptr %return), !dbg !26
 // CHECK:STDOUT:   ret void, !dbg !27
 // CHECK:STDOUT: }
@@ -174,14 +174,14 @@ fn For() {
 // CHECK:STDOUT: !15 = distinct !DISubprogram(name: "Next", linkageName: "_CNext.EmptyRange.Main:Iterate.Core.a862d5c8b748242e", scope: null, file: !3, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !16 = !DILocation(line: 19, column: 14, scope: !15)
 // CHECK:STDOUT: !17 = !DILocation(line: 19, column: 7, scope: !15)
-// CHECK:STDOUT: !18 = distinct !DISubprogram(name: "HasValue", linkageName: "_CHasValue.Optional.Core.7a2fd2277130880e", scope: null, file: !19, line: 32, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !18 = distinct !DISubprogram(name: "HasValue", linkageName: "_CHasValue.Optional.Core.5497e08686bb6191", scope: null, file: !19, line: 32, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !19 = !DIFile(filename: "{{.*}}/prelude/types/optional.carbon", directory: "")
 // CHECK:STDOUT: !20 = !DILocation(line: 33, column: 12, scope: !18)
 // CHECK:STDOUT: !21 = !DILocation(line: 33, column: 5, scope: !18)
-// CHECK:STDOUT: !22 = distinct !DISubprogram(name: "Get", linkageName: "_CGet.Optional.Core.7a2fd2277130880e", scope: null, file: !19, line: 35, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !22 = distinct !DISubprogram(name: "Get", linkageName: "_CGet.Optional.Core.5497e08686bb6191", scope: null, file: !19, line: 35, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !23 = !DILocation(line: 36, column: 12, scope: !22)
 // CHECK:STDOUT: !24 = !DILocation(line: 36, column: 5, scope: !22)
-// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "None", linkageName: "_CNone.Optional.Core.7a2fd2277130880e", scope: null, file: !19, line: 26, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "None", linkageName: "_CNone.Optional.Core.5497e08686bb6191", scope: null, file: !19, line: 26, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !26 = !DILocation(line: 27, column: 12, scope: !25)
 // CHECK:STDOUT: !27 = !DILocation(line: 27, column: 5, scope: !25)
 // CHECK:STDOUT: !28 = distinct !DISubprogram(name: "Has", linkageName: "_CHas.225258f1a45e9386:OptionalStorage.Core.a862d5c8b748242e", scope: null, file: !19, line: 112, type: !5, spFlags: DISPFlagDefinition, unit: !2)

+ 30 - 30
toolchain/lower/testdata/for/break_continue.carbon

@@ -49,11 +49,11 @@ fn For() {
 // CHECK:STDOUT: for.next:                                         ; preds = %if.else.loc22, %if.then.loc22, %entry
 // CHECK:STDOUT:   call void @llvm.lifetime.start.p0(ptr %.loc20_33.1.temp), !dbg !8
 // CHECK:STDOUT:   call void @"_CNext.IntRange.Core:Iterate.Core.be1e879c1ad406d8"(ptr %.loc20_33.1.temp, ptr %.loc20_32.1.temp, ptr %var), !dbg !8
-// CHECK:STDOUT:   %Optional.HasValue.call = call i1 @_CHasValue.Optional.Core.c1b882a73b8b9531(ptr %.loc20_33.1.temp), !dbg !8
+// CHECK:STDOUT:   %Optional.HasValue.call = call i1 @_CHasValue.Optional.Core.8d367a24b9d8bb7c(ptr %.loc20_33.1.temp), !dbg !8
 // CHECK:STDOUT:   br i1 %Optional.HasValue.call, label %for.body, label %for.done, !dbg !8
 // CHECK:STDOUT:
 // CHECK:STDOUT: for.body:                                         ; preds = %for.next
-// CHECK:STDOUT:   %Optional.Get.call = call i32 @_CGet.Optional.Core.c1b882a73b8b9531(ptr %.loc20_33.1.temp), !dbg !8
+// CHECK:STDOUT:   %Optional.Get.call = call i32 @_CGet.Optional.Core.8d367a24b9d8bb7c(ptr %.loc20_33.1.temp), !dbg !8
 // CHECK:STDOUT:   %F.call = call i1 @_CF.Main(), !dbg !9
 // CHECK:STDOUT:   br i1 %F.call, label %if.then.loc21, label %if.else.loc21, !dbg !10
 // CHECK:STDOUT:
@@ -102,23 +102,23 @@ fn For() {
 // CHECK:STDOUT: 6:                                                ; preds = %0
 // CHECK:STDOUT:   call void @"_COp.Int.Core:Inc.Core.be1e879c1ad406d8"(ptr %cursor), !dbg !28
 // CHECK:STDOUT:   %7 = load i32, ptr %1, align 4, !dbg !29
-// CHECK:STDOUT:   call void @_CSome.Optional.Core.c1b882a73b8b9531(ptr %return, i32 %7), !dbg !30
+// CHECK:STDOUT:   call void @_CSome.Optional.Core.8d367a24b9d8bb7c(ptr %return, i32 %7), !dbg !30
 // CHECK:STDOUT:   ret void, !dbg !31
 // CHECK:STDOUT:
 // CHECK:STDOUT: 8:                                                ; preds = %0
-// CHECK:STDOUT:   call void @_CNone.Optional.Core.c1b882a73b8b9531(ptr %return), !dbg !32
+// CHECK:STDOUT:   call void @_CNone.Optional.Core.8d367a24b9d8bb7c(ptr %return), !dbg !32
 // CHECK:STDOUT:   ret void, !dbg !33
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr i1 @_CHasValue.Optional.Core.c1b882a73b8b9531(ptr %self) #0 !dbg !34 {
-// CHECK:STDOUT:   %1 = call i1 @"_CHas.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr %self), !dbg !36
+// CHECK:STDOUT: define linkonce_odr i1 @_CHasValue.Optional.Core.8d367a24b9d8bb7c(ptr %self) #0 !dbg !34 {
+// CHECK:STDOUT:   %1 = call i1 @"_CHas.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9"(ptr %self), !dbg !36
 // CHECK:STDOUT:   ret i1 %1, !dbg !37
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr i32 @_CGet.Optional.Core.c1b882a73b8b9531(ptr %self) #0 !dbg !38 {
-// CHECK:STDOUT:   %1 = call i32 @"_CGet.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr %self), !dbg !39
+// CHECK:STDOUT: define linkonce_odr i32 @_CGet.Optional.Core.8d367a24b9d8bb7c(ptr %self) #0 !dbg !38 {
+// CHECK:STDOUT:   %1 = call i32 @"_CGet.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9"(ptr %self), !dbg !39
 // CHECK:STDOUT:   ret i32 %1, !dbg !40
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
@@ -126,24 +126,24 @@ fn For() {
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
 // CHECK:STDOUT: define linkonce_odr void @"_COp.Int.Core:Inc.Core.be1e879c1ad406d8"(ptr %self) #0 !dbg !41 {
-// CHECK:STDOUT:   call void @"_COp:thunk.Int.Core:AddAssignWith.Core.5dfb78ae56583d8e"(ptr %self, i32 1), !dbg !43
+// CHECK:STDOUT:   call void @"_COp:thunk.Int.Core:AddAssignWith.Core.ff11a2fb54eea08a"(ptr %self, i32 1), !dbg !43
 // CHECK:STDOUT:   ret void, !dbg !44
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr void @_CSome.Optional.Core.c1b882a73b8b9531(ptr sret({ i32, i1 }) %return, i32 %value) #0 !dbg !45 {
-// CHECK:STDOUT:   call void @"_CSome.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr %return, i32 %value), !dbg !46
+// CHECK:STDOUT: define linkonce_odr void @_CSome.Optional.Core.8d367a24b9d8bb7c(ptr sret({ i32, i1 }) %return, i32 %value) #0 !dbg !45 {
+// CHECK:STDOUT:   call void @"_CSome.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9"(ptr %return, i32 %value), !dbg !46
 // CHECK:STDOUT:   ret void, !dbg !47
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr void @_CNone.Optional.Core.c1b882a73b8b9531(ptr sret({ i32, i1 }) %return) #0 !dbg !48 {
-// CHECK:STDOUT:   call void @"_CNone.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr %return), !dbg !49
+// CHECK:STDOUT: define linkonce_odr void @_CNone.Optional.Core.8d367a24b9d8bb7c(ptr sret({ i32, i1 }) %return) #0 !dbg !48 {
+// CHECK:STDOUT:   call void @"_CNone.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9"(ptr %return), !dbg !49
 // CHECK:STDOUT:   ret void, !dbg !50
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr i1 @"_CHas.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr %value) #0 !dbg !51 {
+// CHECK:STDOUT: define linkonce_odr i1 @"_CHas.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9"(ptr %value) #0 !dbg !51 {
 // CHECK:STDOUT:   %has_value = getelementptr inbounds nuw { i32, i1 }, ptr %value, i32 0, i32 1, !dbg !52
 // CHECK:STDOUT:   %1 = load i8, ptr %has_value, align 1, !dbg !52
 // CHECK:STDOUT:   %2 = trunc i8 %1 to i1, !dbg !52
@@ -151,15 +151,15 @@ fn For() {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr i32 @"_CGet.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr %value) #0 !dbg !54 {
+// CHECK:STDOUT: define linkonce_odr i32 @"_CGet.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9"(ptr %value) #0 !dbg !54 {
 // CHECK:STDOUT:   %value1 = getelementptr inbounds nuw { i32, i1 }, ptr %value, i32 0, i32 0, !dbg !55
 // CHECK:STDOUT:   %1 = load i32, ptr %value1, align 4, !dbg !55
 // CHECK:STDOUT:   ret i32 %1, !dbg !56
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: alwaysinline nounwind
-// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.Core:AddAssignWith.Core.5dfb78ae56583d8e"(ptr %self, i32 %other) #2 !dbg !57 {
-// CHECK:STDOUT:   %1 = call i32 @"_CConvert.225258f1a45e9386:ImplicitAs.Core.5450dc8e8b8e0899"(i32 %other), !dbg !58
+// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.Core:AddAssignWith.Core.ff11a2fb54eea08a"(ptr %self, i32 %other) #2 !dbg !57 {
+// CHECK:STDOUT:   %1 = call i32 @"_CConvert.225258f1a45e9386:ImplicitAs.Core.c798a30c8da4d6f9"(i32 %other), !dbg !58
 // CHECK:STDOUT:   %2 = load i32, ptr %self, align 4, !dbg !59
 // CHECK:STDOUT:   %3 = add i32 %2, %1, !dbg !59
 // CHECK:STDOUT:   store i32 %3, ptr %self, align 4, !dbg !59
@@ -167,7 +167,7 @@ fn For() {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr void @"_CSome.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr sret({ i32, i1 }) %return, i32 %self) #0 !dbg !60 {
+// CHECK:STDOUT: define linkonce_odr void @"_CSome.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9"(ptr sret({ i32, i1 }) %return, i32 %self) #0 !dbg !60 {
 // CHECK:STDOUT:   %value = getelementptr inbounds nuw { i32, i1 }, ptr %return, i32 0, i32 0, !dbg !61
 // CHECK:STDOUT:   store i32 %self, ptr %value, align 4, !dbg !61
 // CHECK:STDOUT:   %has_value = getelementptr inbounds nuw { i32, i1 }, ptr %return, i32 0, i32 1, !dbg !62
@@ -176,14 +176,14 @@ fn For() {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr void @"_CNone.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr sret({ i32, i1 }) %return) #0 !dbg !64 {
+// CHECK:STDOUT: define linkonce_odr void @"_CNone.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9"(ptr sret({ i32, i1 }) %return) #0 !dbg !64 {
 // CHECK:STDOUT:   %has_value = getelementptr inbounds nuw { i32, i1 }, ptr %return, i32 0, i32 1, !dbg !65
 // CHECK:STDOUT:   store i8 0, ptr %has_value, align 1, !dbg !65
 // CHECK:STDOUT:   ret void, !dbg !66
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.225258f1a45e9386:ImplicitAs.Core.5450dc8e8b8e0899"(i32 %self) #0 !dbg !67 {
+// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.225258f1a45e9386:ImplicitAs.Core.c798a30c8da4d6f9"(i32 %self) #0 !dbg !67 {
 // CHECK:STDOUT:   ret i32 %self, !dbg !69
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
@@ -231,39 +231,39 @@ fn For() {
 // CHECK:STDOUT: !31 = !DILocation(line: 30, column: 9, scope: !22)
 // CHECK:STDOUT: !32 = !DILocation(line: 32, column: 16, scope: !22)
 // CHECK:STDOUT: !33 = !DILocation(line: 32, column: 9, scope: !22)
-// CHECK:STDOUT: !34 = distinct !DISubprogram(name: "HasValue", linkageName: "_CHasValue.Optional.Core.c1b882a73b8b9531", scope: null, file: !35, line: 32, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !34 = distinct !DISubprogram(name: "HasValue", linkageName: "_CHasValue.Optional.Core.8d367a24b9d8bb7c", scope: null, file: !35, line: 32, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !35 = !DIFile(filename: "{{.*}}/prelude/types/optional.carbon", directory: "")
 // CHECK:STDOUT: !36 = !DILocation(line: 33, column: 12, scope: !34)
 // CHECK:STDOUT: !37 = !DILocation(line: 33, column: 5, scope: !34)
-// CHECK:STDOUT: !38 = distinct !DISubprogram(name: "Get", linkageName: "_CGet.Optional.Core.c1b882a73b8b9531", scope: null, file: !35, line: 35, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !38 = distinct !DISubprogram(name: "Get", linkageName: "_CGet.Optional.Core.8d367a24b9d8bb7c", scope: null, file: !35, line: 35, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !39 = !DILocation(line: 36, column: 12, scope: !38)
 // CHECK:STDOUT: !40 = !DILocation(line: 36, column: 5, scope: !38)
 // CHECK:STDOUT: !41 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !42, line: 339, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !42 = !DIFile(filename: "{{.*}}/prelude/types/int.carbon", directory: "")
 // CHECK:STDOUT: !43 = !DILocation(line: 341, column: 5, scope: !41)
 // CHECK:STDOUT: !44 = !DILocation(line: 339, column: 3, scope: !41)
-// CHECK:STDOUT: !45 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.Optional.Core.c1b882a73b8b9531", scope: null, file: !35, line: 29, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !45 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.Optional.Core.8d367a24b9d8bb7c", scope: null, file: !35, line: 29, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !46 = !DILocation(line: 30, column: 12, scope: !45)
 // CHECK:STDOUT: !47 = !DILocation(line: 30, column: 5, scope: !45)
-// CHECK:STDOUT: !48 = distinct !DISubprogram(name: "None", linkageName: "_CNone.Optional.Core.c1b882a73b8b9531", scope: null, file: !35, line: 26, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !48 = distinct !DISubprogram(name: "None", linkageName: "_CNone.Optional.Core.8d367a24b9d8bb7c", scope: null, file: !35, line: 26, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !49 = !DILocation(line: 27, column: 12, scope: !48)
 // CHECK:STDOUT: !50 = !DILocation(line: 27, column: 5, scope: !48)
-// CHECK:STDOUT: !51 = distinct !DISubprogram(name: "Has", linkageName: "_CHas.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899", scope: null, file: !35, line: 112, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !51 = distinct !DISubprogram(name: "Has", linkageName: "_CHas.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9", scope: null, file: !35, line: 112, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !52 = !DILocation(line: 113, column: 12, scope: !51)
 // CHECK:STDOUT: !53 = !DILocation(line: 113, column: 5, scope: !51)
-// CHECK:STDOUT: !54 = distinct !DISubprogram(name: "Get", linkageName: "_CGet.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899", scope: null, file: !35, line: 115, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !54 = distinct !DISubprogram(name: "Get", linkageName: "_CGet.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9", scope: null, file: !35, line: 115, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !55 = !DILocation(line: 116, column: 12, scope: !54)
 // CHECK:STDOUT: !56 = !DILocation(line: 116, column: 5, scope: !54)
-// CHECK:STDOUT: !57 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.Core:AddAssignWith.Core.5dfb78ae56583d8e", scope: null, file: !42, line: 275, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !57 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.Core:AddAssignWith.Core.ff11a2fb54eea08a", scope: null, file: !42, line: 275, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !58 = !DILocation(line: 4294967295, scope: !57)
 // CHECK:STDOUT: !59 = !DILocation(line: 275, column: 3, scope: !57)
-// CHECK:STDOUT: !60 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899", scope: null, file: !35, line: 104, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !60 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9", scope: null, file: !35, line: 104, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !61 = !DILocation(line: 108, column: 5, scope: !60)
 // CHECK:STDOUT: !62 = !DILocation(line: 109, column: 5, scope: !60)
 // CHECK:STDOUT: !63 = !DILocation(line: 110, column: 5, scope: !60)
-// CHECK:STDOUT: !64 = distinct !DISubprogram(name: "None", linkageName: "_CNone.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899", scope: null, file: !35, line: 99, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !64 = distinct !DISubprogram(name: "None", linkageName: "_CNone.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9", scope: null, file: !35, line: 99, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !65 = !DILocation(line: 101, column: 5, scope: !64)
 // CHECK:STDOUT: !66 = !DILocation(line: 102, column: 5, scope: !64)
-// CHECK:STDOUT: !67 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.225258f1a45e9386:ImplicitAs.Core.5450dc8e8b8e0899", scope: null, file: !68, line: 24, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !67 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.225258f1a45e9386:ImplicitAs.Core.c798a30c8da4d6f9", scope: null, file: !68, line: 24, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !68 = !DIFile(filename: "{{.*}}/prelude/operators/as.carbon", directory: "")
 // CHECK:STDOUT: !69 = !DILocation(line: 24, column: 38, scope: !67)

+ 30 - 30
toolchain/lower/testdata/for/for.carbon

@@ -50,11 +50,11 @@ fn For() {
 // CHECK:STDOUT: for.next:                                         ; preds = %for.body, %entry
 // CHECK:STDOUT:   call void @llvm.lifetime.start.p0(ptr %.loc21_33.1.temp), !dbg !8
 // CHECK:STDOUT:   call void @"_CNext.IntRange.Core:Iterate.Core.be1e879c1ad406d8"(ptr %.loc21_33.1.temp, ptr %.loc21_32.1.temp, ptr %var), !dbg !8
-// CHECK:STDOUT:   %Optional.HasValue.call = call i1 @_CHasValue.Optional.Core.c1b882a73b8b9531(ptr %.loc21_33.1.temp), !dbg !8
+// CHECK:STDOUT:   %Optional.HasValue.call = call i1 @_CHasValue.Optional.Core.8d367a24b9d8bb7c(ptr %.loc21_33.1.temp), !dbg !8
 // CHECK:STDOUT:   br i1 %Optional.HasValue.call, label %for.body, label %for.done, !dbg !8
 // CHECK:STDOUT:
 // CHECK:STDOUT: for.body:                                         ; preds = %for.next
-// CHECK:STDOUT:   %Optional.Get.call = call i32 @_CGet.Optional.Core.c1b882a73b8b9531(ptr %.loc21_33.1.temp), !dbg !8
+// CHECK:STDOUT:   %Optional.Get.call = call i32 @_CGet.Optional.Core.8d367a24b9d8bb7c(ptr %.loc21_33.1.temp), !dbg !8
 // CHECK:STDOUT:   call void @_CG.Main(), !dbg !10
 // CHECK:STDOUT:   br label %for.next, !dbg !11
 // CHECK:STDOUT:
@@ -90,23 +90,23 @@ fn For() {
 // CHECK:STDOUT: 6:                                                ; preds = %0
 // CHECK:STDOUT:   call void @"_COp.Int.Core:Inc.Core.be1e879c1ad406d8"(ptr %cursor), !dbg !24
 // CHECK:STDOUT:   %7 = load i32, ptr %1, align 4, !dbg !25
-// CHECK:STDOUT:   call void @_CSome.Optional.Core.c1b882a73b8b9531(ptr %return, i32 %7), !dbg !26
+// CHECK:STDOUT:   call void @_CSome.Optional.Core.8d367a24b9d8bb7c(ptr %return, i32 %7), !dbg !26
 // CHECK:STDOUT:   ret void, !dbg !27
 // CHECK:STDOUT:
 // CHECK:STDOUT: 8:                                                ; preds = %0
-// CHECK:STDOUT:   call void @_CNone.Optional.Core.c1b882a73b8b9531(ptr %return), !dbg !28
+// CHECK:STDOUT:   call void @_CNone.Optional.Core.8d367a24b9d8bb7c(ptr %return), !dbg !28
 // CHECK:STDOUT:   ret void, !dbg !29
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr i1 @_CHasValue.Optional.Core.c1b882a73b8b9531(ptr %self) #0 !dbg !30 {
-// CHECK:STDOUT:   %1 = call i1 @"_CHas.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr %self), !dbg !32
+// CHECK:STDOUT: define linkonce_odr i1 @_CHasValue.Optional.Core.8d367a24b9d8bb7c(ptr %self) #0 !dbg !30 {
+// CHECK:STDOUT:   %1 = call i1 @"_CHas.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9"(ptr %self), !dbg !32
 // CHECK:STDOUT:   ret i1 %1, !dbg !33
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr i32 @_CGet.Optional.Core.c1b882a73b8b9531(ptr %self) #0 !dbg !34 {
-// CHECK:STDOUT:   %1 = call i32 @"_CGet.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr %self), !dbg !35
+// CHECK:STDOUT: define linkonce_odr i32 @_CGet.Optional.Core.8d367a24b9d8bb7c(ptr %self) #0 !dbg !34 {
+// CHECK:STDOUT:   %1 = call i32 @"_CGet.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9"(ptr %self), !dbg !35
 // CHECK:STDOUT:   ret i32 %1, !dbg !36
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
@@ -114,24 +114,24 @@ fn For() {
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
 // CHECK:STDOUT: define linkonce_odr void @"_COp.Int.Core:Inc.Core.be1e879c1ad406d8"(ptr %self) #0 !dbg !37 {
-// CHECK:STDOUT:   call void @"_COp:thunk.Int.Core:AddAssignWith.Core.5dfb78ae56583d8e"(ptr %self, i32 1), !dbg !39
+// CHECK:STDOUT:   call void @"_COp:thunk.Int.Core:AddAssignWith.Core.ff11a2fb54eea08a"(ptr %self, i32 1), !dbg !39
 // CHECK:STDOUT:   ret void, !dbg !40
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr void @_CSome.Optional.Core.c1b882a73b8b9531(ptr sret({ i32, i1 }) %return, i32 %value) #0 !dbg !41 {
-// CHECK:STDOUT:   call void @"_CSome.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr %return, i32 %value), !dbg !42
+// CHECK:STDOUT: define linkonce_odr void @_CSome.Optional.Core.8d367a24b9d8bb7c(ptr sret({ i32, i1 }) %return, i32 %value) #0 !dbg !41 {
+// CHECK:STDOUT:   call void @"_CSome.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9"(ptr %return, i32 %value), !dbg !42
 // CHECK:STDOUT:   ret void, !dbg !43
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr void @_CNone.Optional.Core.c1b882a73b8b9531(ptr sret({ i32, i1 }) %return) #0 !dbg !44 {
-// CHECK:STDOUT:   call void @"_CNone.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr %return), !dbg !45
+// CHECK:STDOUT: define linkonce_odr void @_CNone.Optional.Core.8d367a24b9d8bb7c(ptr sret({ i32, i1 }) %return) #0 !dbg !44 {
+// CHECK:STDOUT:   call void @"_CNone.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9"(ptr %return), !dbg !45
 // CHECK:STDOUT:   ret void, !dbg !46
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr i1 @"_CHas.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr %value) #0 !dbg !47 {
+// CHECK:STDOUT: define linkonce_odr i1 @"_CHas.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9"(ptr %value) #0 !dbg !47 {
 // CHECK:STDOUT:   %has_value = getelementptr inbounds nuw { i32, i1 }, ptr %value, i32 0, i32 1, !dbg !48
 // CHECK:STDOUT:   %1 = load i8, ptr %has_value, align 1, !dbg !48
 // CHECK:STDOUT:   %2 = trunc i8 %1 to i1, !dbg !48
@@ -139,15 +139,15 @@ fn For() {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr i32 @"_CGet.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr %value) #0 !dbg !50 {
+// CHECK:STDOUT: define linkonce_odr i32 @"_CGet.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9"(ptr %value) #0 !dbg !50 {
 // CHECK:STDOUT:   %value1 = getelementptr inbounds nuw { i32, i1 }, ptr %value, i32 0, i32 0, !dbg !51
 // CHECK:STDOUT:   %1 = load i32, ptr %value1, align 4, !dbg !51
 // CHECK:STDOUT:   ret i32 %1, !dbg !52
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: alwaysinline nounwind
-// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.Core:AddAssignWith.Core.5dfb78ae56583d8e"(ptr %self, i32 %other) #2 !dbg !53 {
-// CHECK:STDOUT:   %1 = call i32 @"_CConvert.225258f1a45e9386:ImplicitAs.Core.5450dc8e8b8e0899"(i32 %other), !dbg !54
+// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.Core:AddAssignWith.Core.ff11a2fb54eea08a"(ptr %self, i32 %other) #2 !dbg !53 {
+// CHECK:STDOUT:   %1 = call i32 @"_CConvert.225258f1a45e9386:ImplicitAs.Core.c798a30c8da4d6f9"(i32 %other), !dbg !54
 // CHECK:STDOUT:   %2 = load i32, ptr %self, align 4, !dbg !55
 // CHECK:STDOUT:   %3 = add i32 %2, %1, !dbg !55
 // CHECK:STDOUT:   store i32 %3, ptr %self, align 4, !dbg !55
@@ -155,7 +155,7 @@ fn For() {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr void @"_CSome.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr sret({ i32, i1 }) %return, i32 %self) #0 !dbg !56 {
+// CHECK:STDOUT: define linkonce_odr void @"_CSome.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9"(ptr sret({ i32, i1 }) %return, i32 %self) #0 !dbg !56 {
 // CHECK:STDOUT:   %value = getelementptr inbounds nuw { i32, i1 }, ptr %return, i32 0, i32 0, !dbg !57
 // CHECK:STDOUT:   store i32 %self, ptr %value, align 4, !dbg !57
 // CHECK:STDOUT:   %has_value = getelementptr inbounds nuw { i32, i1 }, ptr %return, i32 0, i32 1, !dbg !58
@@ -164,14 +164,14 @@ fn For() {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr void @"_CNone.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899"(ptr sret({ i32, i1 }) %return) #0 !dbg !60 {
+// CHECK:STDOUT: define linkonce_odr void @"_CNone.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9"(ptr sret({ i32, i1 }) %return) #0 !dbg !60 {
 // CHECK:STDOUT:   %has_value = getelementptr inbounds nuw { i32, i1 }, ptr %return, i32 0, i32 1, !dbg !61
 // CHECK:STDOUT:   store i8 0, ptr %has_value, align 1, !dbg !61
 // CHECK:STDOUT:   ret void, !dbg !62
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; Function Attrs: nounwind
-// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.225258f1a45e9386:ImplicitAs.Core.5450dc8e8b8e0899"(i32 %self) #0 !dbg !63 {
+// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.225258f1a45e9386:ImplicitAs.Core.c798a30c8da4d6f9"(i32 %self) #0 !dbg !63 {
 // CHECK:STDOUT:   ret i32 %self, !dbg !65
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
@@ -215,39 +215,39 @@ fn For() {
 // CHECK:STDOUT: !27 = !DILocation(line: 30, column: 9, scope: !18)
 // CHECK:STDOUT: !28 = !DILocation(line: 32, column: 16, scope: !18)
 // CHECK:STDOUT: !29 = !DILocation(line: 32, column: 9, scope: !18)
-// CHECK:STDOUT: !30 = distinct !DISubprogram(name: "HasValue", linkageName: "_CHasValue.Optional.Core.c1b882a73b8b9531", scope: null, file: !31, line: 32, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !30 = distinct !DISubprogram(name: "HasValue", linkageName: "_CHasValue.Optional.Core.8d367a24b9d8bb7c", scope: null, file: !31, line: 32, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !31 = !DIFile(filename: "{{.*}}/prelude/types/optional.carbon", directory: "")
 // CHECK:STDOUT: !32 = !DILocation(line: 33, column: 12, scope: !30)
 // CHECK:STDOUT: !33 = !DILocation(line: 33, column: 5, scope: !30)
-// CHECK:STDOUT: !34 = distinct !DISubprogram(name: "Get", linkageName: "_CGet.Optional.Core.c1b882a73b8b9531", scope: null, file: !31, line: 35, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !34 = distinct !DISubprogram(name: "Get", linkageName: "_CGet.Optional.Core.8d367a24b9d8bb7c", scope: null, file: !31, line: 35, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !35 = !DILocation(line: 36, column: 12, scope: !34)
 // CHECK:STDOUT: !36 = !DILocation(line: 36, column: 5, scope: !34)
 // CHECK:STDOUT: !37 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !38, line: 339, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !38 = !DIFile(filename: "{{.*}}/prelude/types/int.carbon", directory: "")
 // CHECK:STDOUT: !39 = !DILocation(line: 341, column: 5, scope: !37)
 // CHECK:STDOUT: !40 = !DILocation(line: 339, column: 3, scope: !37)
-// CHECK:STDOUT: !41 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.Optional.Core.c1b882a73b8b9531", scope: null, file: !31, line: 29, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !41 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.Optional.Core.8d367a24b9d8bb7c", scope: null, file: !31, line: 29, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !42 = !DILocation(line: 30, column: 12, scope: !41)
 // CHECK:STDOUT: !43 = !DILocation(line: 30, column: 5, scope: !41)
-// CHECK:STDOUT: !44 = distinct !DISubprogram(name: "None", linkageName: "_CNone.Optional.Core.c1b882a73b8b9531", scope: null, file: !31, line: 26, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !44 = distinct !DISubprogram(name: "None", linkageName: "_CNone.Optional.Core.8d367a24b9d8bb7c", scope: null, file: !31, line: 26, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !45 = !DILocation(line: 27, column: 12, scope: !44)
 // CHECK:STDOUT: !46 = !DILocation(line: 27, column: 5, scope: !44)
-// CHECK:STDOUT: !47 = distinct !DISubprogram(name: "Has", linkageName: "_CHas.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899", scope: null, file: !31, line: 112, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !47 = distinct !DISubprogram(name: "Has", linkageName: "_CHas.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9", scope: null, file: !31, line: 112, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !48 = !DILocation(line: 113, column: 12, scope: !47)
 // CHECK:STDOUT: !49 = !DILocation(line: 113, column: 5, scope: !47)
-// CHECK:STDOUT: !50 = distinct !DISubprogram(name: "Get", linkageName: "_CGet.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899", scope: null, file: !31, line: 115, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !50 = distinct !DISubprogram(name: "Get", linkageName: "_CGet.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9", scope: null, file: !31, line: 115, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !51 = !DILocation(line: 116, column: 12, scope: !50)
 // CHECK:STDOUT: !52 = !DILocation(line: 116, column: 5, scope: !50)
-// CHECK:STDOUT: !53 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.Core:AddAssignWith.Core.5dfb78ae56583d8e", scope: null, file: !38, line: 275, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !53 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.Core:AddAssignWith.Core.ff11a2fb54eea08a", scope: null, file: !38, line: 275, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !54 = !DILocation(line: 4294967295, scope: !53)
 // CHECK:STDOUT: !55 = !DILocation(line: 275, column: 3, scope: !53)
-// CHECK:STDOUT: !56 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899", scope: null, file: !31, line: 104, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !56 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9", scope: null, file: !31, line: 104, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !57 = !DILocation(line: 108, column: 5, scope: !56)
 // CHECK:STDOUT: !58 = !DILocation(line: 109, column: 5, scope: !56)
 // CHECK:STDOUT: !59 = !DILocation(line: 110, column: 5, scope: !56)
-// CHECK:STDOUT: !60 = distinct !DISubprogram(name: "None", linkageName: "_CNone.225258f1a45e9386:OptionalStorage.Core.5450dc8e8b8e0899", scope: null, file: !31, line: 99, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !60 = distinct !DISubprogram(name: "None", linkageName: "_CNone.225258f1a45e9386:OptionalStorage.Core.c798a30c8da4d6f9", scope: null, file: !31, line: 99, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !61 = !DILocation(line: 101, column: 5, scope: !60)
 // CHECK:STDOUT: !62 = !DILocation(line: 102, column: 5, scope: !60)
-// CHECK:STDOUT: !63 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.225258f1a45e9386:ImplicitAs.Core.5450dc8e8b8e0899", scope: null, file: !64, line: 24, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !63 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.225258f1a45e9386:ImplicitAs.Core.c798a30c8da4d6f9", scope: null, file: !64, line: 24, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !64 = !DIFile(filename: "{{.*}}/prelude/operators/as.carbon", directory: "")
 // CHECK:STDOUT: !65 = !DILocation(line: 24, column: 38, scope: !63)

+ 2 - 0
toolchain/sem_ir/inst_kind.def

@@ -110,6 +110,8 @@ CARBON_SEM_IR_INST_KIND(RefParamPattern)
 CARBON_SEM_IR_INST_KIND(RefineTypeAction)
 CARBON_SEM_IR_INST_KIND(RequireCompleteType)
 CARBON_SEM_IR_INST_KIND(RequireImplsDecl)
+CARBON_SEM_IR_INST_KIND(RequireSpecificDefinition)
+CARBON_SEM_IR_INST_KIND(RequireSpecificDefinitionType)
 CARBON_SEM_IR_INST_KIND(RequirementBaseFacetType)
 CARBON_SEM_IR_INST_KIND(RequirementEquivalent)
 CARBON_SEM_IR_INST_KIND(RequirementImpls)

+ 1 - 0
toolchain/sem_ir/singleton_insts.h

@@ -23,6 +23,7 @@ static constexpr std::array SingletonInstKinds = {
     InstKind::InstType,
     InstKind::IntLiteralType,
     InstKind::NamespaceType,
+    InstKind::RequireSpecificDefinitionType,
     InstKind::SpecificFunctionType,
     InstKind::VtableType,
     InstKind::WitnessType,

+ 1 - 0
toolchain/sem_ir/type_iterator.cpp

@@ -101,6 +101,7 @@ auto TypeIterator::ProcessTypeId(TypeId type_id) -> std::optional<Step> {
     case ImplWitnessAccess::Kind:
     case IntLiteralType::Kind:
     case NamespaceType::Kind:
+    case RequireSpecificDefinitionType::Kind:
     case TypeType::Kind:
     case WitnessType::Kind: {
       return Step::ConcreteType{.type_id = type_id};

+ 18 - 0
toolchain/sem_ir/typed_insts.h

@@ -1366,6 +1366,24 @@ struct RequireImplsDecl {
   DeclInstBlockId decl_block_id;
 };
 
+// As part of a generic region, requires that an `impl` which is initially part
+// of a symbolic specific be defined once a concrete specific is formed.
+struct RequireSpecificDefinition {
+  static constexpr auto Kind =
+      InstKind::RequireSpecificDefinition.Define<Parse::NodeId>(
+          {.ir_name = "require_specific_def",
+           .constant_kind = InstConstantKind::Conditional,
+           .is_lowered = false});
+  // Always the builtin `RequireSpecificDefinitionType` type.
+  TypeId type_id;
+  SemIR::SpecificId specific_id;
+};
+
+// A dedicated type for `RequireSpecificDefinition`.
+using RequireSpecificDefinitionType =
+    SingletonTypeInst<InstKind::RequireSpecificDefinitionType,
+                      "require_specific_def_type">;
+
 // A requirement that `.Self` implements a facet type, specified as the first
 // operand of a `where` expression. This is always the first requirement in a
 // requirement block for a `where` expression.