Skip to content

Commit e682a66

Browse files
authored
Avoid adding extraneous local instructions while importing witness table entries (#6180)
When deducing arguments for generic parameters of an `impl`, the deduction calls `Convert` on the input arguments. Often, the input argument is a facet, and needs to be converted to a type via FacetAccessType in order to produce a different facet. These instructions end up being added to the semir, but only their constant values are needed for the resulting specific returned from Deduce. In the best case, these extra instructions are just noise in the semir, or they just cause instruction names to get differentiated with larger suffixes. In the worst case, these extra instructions contain references to instructions from a generic context, and leak them out of that generic context and into another. In particular, when importing a LookupImplWitness instruction, the re-evaluation of it can do deduce (when the lookup is against a generic `impl`). The instructions created in Deduce are not part of the import, and end up referring to imported instructions from the local context, which leads to confusion in the toolchain, and can crash. The `import_self_specific.carbon` test demonstrates this. It causes the `I.F` function to be imported from the `I` interface when building the witness table for the `impl`. Doing so imports the specific of `C` which includes a LookupImplWitness for `Self.Accoc` in `I`. The `Self` is a BindSymbolicName with generic binding index 0, in `I`. When Convert creates instructions in the generic `impl forall D`, however, they end up referencing and including this BindSymbolicName into its eval block. But the generic binding 0 in the `impl` is a very different thing (a value of type `E`). This confusion leads to crashes.
1 parent 1fe3316 commit e682a66

File tree

172 files changed

+1372
-1803
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

172 files changed

+1372
-1803
lines changed

toolchain/check/deduce.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -613,10 +613,23 @@ auto DeduceImplArguments(Context& context, SemIR::LocId loc_id,
613613
context.constant_values().GetInstId(self_id));
614614
deduction.Add(impl.interface.specific_id, constraint_specific_id);
615615

616-
if (!deduction.Deduce() || !deduction.CheckDeductionIsComplete()) {
616+
// TODO: Deduce has side effects in the semir by generating `Converted`
617+
// instructions, and may also introduce intermediate states like
618+
// `FacetAccessType`. We should stop generating those when deducing for impl
619+
// lookup, but for now we discard them by pushing an InstBlock on the stack
620+
// and dropping it right after. We also need to avoid adding those dropped
621+
// instructions to any enclosing generic, so we push a fresh generic region.
622+
context.inst_block_stack().Push();
623+
context.generic_region_stack().Push({.generic_id = SemIR::GenericId::None});
624+
625+
bool success = deduction.Deduce() && deduction.CheckDeductionIsComplete();
626+
627+
context.generic_region_stack().Pop();
628+
context.inst_block_stack().PopAndDiscard();
629+
630+
if (!success) {
617631
return SemIR::SpecificId::None;
618632
}
619-
620633
return deduction.MakeSpecific();
621634
}
622635

toolchain/check/impl.cpp

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -484,24 +484,15 @@ static auto ExtendImpl(Context& context, Parse::NodeId extend_node,
484484
static auto DiagnoseUnusedGenericBinding(Context& context, SemIR::LocId loc_id,
485485
SemIR::LocId implicit_params_loc_id,
486486
SemIR::ImplId impl_id) -> void {
487-
auto deduced_specific_id = SemIR::SpecificId::None;
488-
489487
auto& impl = context.impls().Get(impl_id);
490488
if (!impl.generic_id.has_value() ||
491489
impl.witness_id == SemIR::ErrorInst::InstId) {
492490
return;
493491
}
494492

495-
// TODO: Deduce has side effects in the semir by generating `Converted`
496-
// instructions which we will not use here. We should stop generating
497-
// those when deducing for impl lookup, but for now we discard them by
498-
// pushing an InstBlock on the stack and dropping it right after.
499-
context.inst_block_stack().Push();
500-
deduced_specific_id = DeduceImplArguments(
493+
auto deduced_specific_id = DeduceImplArguments(
501494
context, loc_id, impl, context.constant_values().Get(impl.self_id),
502495
impl.interface.specific_id);
503-
context.inst_block_stack().PopAndDiscard();
504-
505496
if (deduced_specific_id.has_value()) {
506497
// Deduction succeeded, all bindings were used.
507498
return;

toolchain/check/import_ref.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3654,9 +3654,26 @@ auto LoadImportRef(Context& context, SemIR::InstId inst_id) -> void {
36543654
// Resolve will assign the constant.
36553655
auto load_ir_inst = indirect_insts.pop_back_val();
36563656
ImportRefResolver resolver(&context, load_ir_inst.ir_id());
3657+
3658+
// Loading an import ref creates local constants from the import ones, but
3659+
// shouldn't be generating novel instructions in the semir as a side effect of
3660+
// that process. Doing so in a generic context would also cause them to end up
3661+
// in the eval block, which would be doubly wrong.
3662+
context.inst_block_stack().Push();
3663+
36573664
auto type_id = resolver.ResolveType(load_type_id);
36583665
auto constant_id = resolver.Resolve(load_ir_inst.inst_id());
36593666

3667+
CARBON_CHECK(
3668+
context.inst_block_stack().PeekCurrentBlockContents().empty(),
3669+
"Importing an instruction shouldn't add new instructions to the "
3670+
"local inst block. Found {0} new instructions, first is {1}: {2}.",
3671+
context.inst_block_stack().PeekCurrentBlockContents().size(),
3672+
context.inst_block_stack().PeekCurrentBlockContents().front(),
3673+
context.insts().Get(
3674+
context.inst_block_stack().PeekCurrentBlockContents().front()));
3675+
context.inst_block_stack().PopAndDiscard();
3676+
36603677
// Replace the ImportRefUnloaded instruction with ImportRefLoaded. This
36613678
// doesn't use ReplacePlaceholderImportedInst because it would trigger
36623679
// TryEvalInst, which we want to avoid with ImportRefs.

toolchain/check/testdata/array/basics.carbon

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,8 @@ var a: array(1, 1);
211211
// CHECK:STDOUT: %F.call.loc10_40: init %tuple.type.734 = call %F.ref.loc10_38() to %.loc10_41.2
212212
// CHECK:STDOUT: %.loc10_41.3: %tuple.type.14a = tuple_literal (%F.call.loc10_35, %F.call.loc10_40)
213213
// CHECK:STDOUT: %.loc10_41.4: init %array_type = array_init (%F.call.loc10_35, %F.call.loc10_40) to %v.var
214-
// CHECK:STDOUT: %.loc10_3.1: init %array_type = converted %.loc10_41.3, %.loc10_41.4
215-
// CHECK:STDOUT: assign %v.var, %.loc10_3.1
214+
// CHECK:STDOUT: %.loc10_3: init %array_type = converted %.loc10_41.3, %.loc10_41.4
215+
// CHECK:STDOUT: assign %v.var, %.loc10_3
216216
// CHECK:STDOUT: %.loc10_28: type = splice_block %array_type [concrete = constants.%array_type] {
217217
// CHECK:STDOUT: %C.ref.loc10_17: type = name_ref C, file.%C.decl [concrete = constants.%C]
218218
// CHECK:STDOUT: %C.ref.loc10_20: type = name_ref C, file.%C.decl [concrete = constants.%C]
@@ -223,8 +223,6 @@ var a: array(1, 1);
223223
// CHECK:STDOUT: %array_type: type = array_type %int_2, %.loc10_24.2 [concrete = constants.%array_type]
224224
// CHECK:STDOUT: }
225225
// CHECK:STDOUT: %v: ref %array_type = bind_name v, %v.var
226-
// CHECK:STDOUT: %facet_value: %type_where = facet_value constants.%array_type, () [concrete = constants.%facet_value]
227-
// CHECK:STDOUT: %.loc10_3.2: %type_where = converted constants.%array_type, %facet_value [concrete = constants.%facet_value]
228226
// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound: <bound method> = bound_method %v.var, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.9cb
229227
// CHECK:STDOUT: <elided>
230228
// CHECK:STDOUT: %bound_method: <bound method> = bound_method %v.var, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn
@@ -286,15 +284,11 @@ var a: array(1, 1);
286284
// CHECK:STDOUT: %.loc8_21.6: type = converted %.loc8_21.2, constants.%tuple.type [concrete = constants.%tuple.type]
287285
// CHECK:STDOUT: }
288286
// CHECK:STDOUT: %b: ref %tuple.type = bind_name b, %b.var
289-
// CHECK:STDOUT: %facet_value.loc8: %type_where = facet_value constants.%tuple.type, () [concrete = constants.%facet_value.c7f]
290-
// CHECK:STDOUT: %.loc8_3: %type_where = converted constants.%tuple.type, %facet_value.loc8 [concrete = constants.%facet_value.c7f]
291287
// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound.loc8: <bound method> = bound_method %b.var, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.7c8
292288
// CHECK:STDOUT: <elided>
293289
// CHECK:STDOUT: %bound_method.loc8: <bound method> = bound_method %b.var, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.1
294290
// CHECK:STDOUT: %addr.loc8: %ptr.7fe = addr_of %b.var
295291
// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.call.loc8: init %empty_tuple.type = call %bound_method.loc8(%addr.loc8)
296-
// CHECK:STDOUT: %facet_value.loc7: %type_where = facet_value constants.%array_type, () [concrete = constants.%facet_value.4cf]
297-
// CHECK:STDOUT: %.loc7_3: %type_where = converted constants.%array_type, %facet_value.loc7 [concrete = constants.%facet_value.4cf]
298292
// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound.loc7: <bound method> = bound_method %a.var, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.433
299293
// CHECK:STDOUT: <elided>
300294
// CHECK:STDOUT: %bound_method.loc7: <bound method> = bound_method %a.var, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.2
@@ -347,24 +341,20 @@ var a: array(1, 1);
347341
// CHECK:STDOUT: %.loc8_27.4: init %empty_tuple.type = tuple_init () to %.loc8_27.3 [concrete = constants.%empty_tuple]
348342
// CHECK:STDOUT: %.loc8_27.5: init %empty_tuple.type = converted %tuple.elem0, %.loc8_27.4 [concrete = constants.%empty_tuple]
349343
// CHECK:STDOUT: %.loc8_27.6: init %array_type = array_init (%.loc8_27.5) to %t.var [concrete = constants.%array]
350-
// CHECK:STDOUT: %.loc8_3.1: init %array_type = converted %F.call, %.loc8_27.6 [concrete = constants.%array]
351-
// CHECK:STDOUT: assign %t.var, %.loc8_3.1
344+
// CHECK:STDOUT: %.loc8_3: init %array_type = converted %F.call, %.loc8_27.6 [concrete = constants.%array]
345+
// CHECK:STDOUT: assign %t.var, %.loc8_3
352346
// CHECK:STDOUT: %.loc8_21: type = splice_block %array_type [concrete = constants.%array_type] {
353347
// CHECK:STDOUT: %.loc8_17.1: %empty_tuple.type = tuple_literal ()
354348
// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1]
355349
// CHECK:STDOUT: %.loc8_17.2: type = converted %.loc8_17.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type]
356350
// CHECK:STDOUT: %array_type: type = array_type %int_1, %.loc8_17.2 [concrete = constants.%array_type]
357351
// CHECK:STDOUT: }
358352
// CHECK:STDOUT: %t: ref %array_type = bind_name t, %t.var
359-
// CHECK:STDOUT: %facet_value.loc8_27: %type_where = facet_value constants.%tuple.type, () [concrete = constants.%facet_value.132]
360-
// CHECK:STDOUT: %.loc8_27.7: %type_where = converted constants.%tuple.type, %facet_value.loc8_27 [concrete = constants.%facet_value.132]
361353
// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound.loc8_27: <bound method> = bound_method %.loc8_27.2, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.a49
362354
// CHECK:STDOUT: <elided>
363355
// CHECK:STDOUT: %bound_method.loc8_27: <bound method> = bound_method %.loc8_27.2, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.1
364356
// CHECK:STDOUT: %addr.loc8_27: %ptr.652 = addr_of %.loc8_27.2
365357
// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.call.loc8_27: init %empty_tuple.type = call %bound_method.loc8_27(%addr.loc8_27)
366-
// CHECK:STDOUT: %facet_value.loc8_3: %type_where = facet_value constants.%array_type, () [concrete = constants.%facet_value.c1b]
367-
// CHECK:STDOUT: %.loc8_3.2: %type_where = converted constants.%array_type, %facet_value.loc8_3 [concrete = constants.%facet_value.c1b]
368358
// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound.loc8_3: <bound method> = bound_method %t.var, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.f33
369359
// CHECK:STDOUT: <elided>
370360
// CHECK:STDOUT: %bound_method.loc8_3: <bound method> = bound_method %t.var, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.2

toolchain/check/testdata/array/import.carbon

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,6 @@ fn F() -> array(i32, 1) {
107107
// CHECK:STDOUT: %specific_fn: <specific function> = specific_function %impl.elem0, @Int.as.Copy.impl.Op(constants.%int_32) [concrete = constants.%Int.as.Copy.impl.Op.specific_fn]
108108
// CHECK:STDOUT: %bound_method.loc6_15.2: <bound method> = bound_method %.loc6_15.2, %specific_fn
109109
// CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc6_15.2(%.loc6_15.2)
110-
// CHECK:STDOUT: %facet_value: %type_where = facet_value constants.%array_type, () [concrete = constants.%facet_value]
111-
// CHECK:STDOUT: %.loc6_12.3: %type_where = converted constants.%array_type, %facet_value [concrete = constants.%facet_value]
112110
// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound: <bound method> = bound_method %.loc6_12.2, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.ce8
113111
// CHECK:STDOUT: <elided>
114112
// CHECK:STDOUT: %bound_method.loc6_12: <bound method> = bound_method %.loc6_12.2, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn

toolchain/check/testdata/array/index_not_literal.carbon

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,6 @@ fn F(a: array({}, 3)) -> {} {
171171
// CHECK:STDOUT: %.loc10_23.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc10_23 [concrete = constants.%int_1.5d2]
172172
// CHECK:STDOUT: %.loc10_23.2: %i32 = converted %int_1.loc10_23, %.loc10_23.1 [concrete = constants.%int_1.5d2]
173173
// CHECK:STDOUT: %F.call: init %i32 = call %F.ref(%.loc10_20.15, %.loc10_23.2)
174-
// CHECK:STDOUT: %facet_value: %type_where = facet_value constants.%array_type, () [concrete = constants.%facet_value]
175-
// CHECK:STDOUT: %.loc10_20.16: %type_where = converted constants.%array_type, %facet_value [concrete = constants.%facet_value]
176174
// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound: <bound method> = bound_method %.loc10_20.14, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.cff
177175
// CHECK:STDOUT: <elided>
178176
// CHECK:STDOUT: %bound_method.loc10_20.7: <bound method> = bound_method %.loc10_20.14, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn

toolchain/check/testdata/array/init_dependent_bound.carbon

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -110,13 +110,13 @@ fn H() { G(3); }
110110
// CHECK:STDOUT: %require_complete.loc7_22: <witness> = require_complete_type %array_type.loc7_22.2 [symbolic = %require_complete.loc7_22 (constants.%require_complete.b7f)]
111111
// CHECK:STDOUT: %pattern_type: type = pattern_type %array_type.loc7_22.2 [symbolic = %pattern_type (constants.%pattern_type.d48)]
112112
// CHECK:STDOUT: %array: @G.%array_type.loc7_22.2 (%array_type.281) = tuple_value () [symbolic = %array (constants.%array.2ed)]
113-
// CHECK:STDOUT: %facet_value.loc7_3.2: %type_where = facet_value %array_type.loc7_22.2, () [symbolic = %facet_value.loc7_3.2 (constants.%facet_value.bf1)]
114-
// CHECK:STDOUT: %Destroy.impl_witness: <witness> = impl_witness imports.%Destroy.impl_witness_table, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.loc7_3.2) [symbolic = %Destroy.impl_witness (constants.%Destroy.impl_witness.5dc)]
113+
// CHECK:STDOUT: %facet_value: %type_where = facet_value %array_type.loc7_22.2, () [symbolic = %facet_value (constants.%facet_value.bf1)]
114+
// 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.5dc)]
115115
// CHECK:STDOUT: %Destroy.facet: %Destroy.type = facet_value %array_type.loc7_22.2, (%Destroy.impl_witness) [symbolic = %Destroy.facet (constants.%Destroy.facet.b30)]
116-
// CHECK:STDOUT: %.loc7_3.3: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc7_3.3 (constants.%.dc4)]
117-
// 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.loc7_3.2) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.type (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.90e)]
116+
// CHECK:STDOUT: %.loc7_3.2: type = fn_type_with_self_type constants.%Destroy.Op.type, %Destroy.facet [symbolic = %.loc7_3.2 (constants.%.dc4)]
117+
// 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.90e)]
118118
// 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.90e) = struct_value () [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.84c)]
119-
// 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.loc7_3.2) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.9d2)]
119+
// 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.9d2)]
120120
// CHECK:STDOUT: %ptr: type = ptr_type %array_type.loc7_22.2 [symbolic = %ptr (constants.%ptr.e06)]
121121
// CHECK:STDOUT: %require_complete.loc7_3: <witness> = require_complete_type %ptr [symbolic = %require_complete.loc7_3 (constants.%require_complete.662)]
122122
// CHECK:STDOUT:
@@ -137,9 +137,7 @@ fn H() { G(3); }
137137
// CHECK:STDOUT: %array_type.loc7_22.1: type = array_type %int_0, %T.ref [symbolic = %array_type.loc7_22.2 (constants.%array_type.281)]
138138
// CHECK:STDOUT: }
139139
// CHECK:STDOUT: %arr: ref @G.%array_type.loc7_22.2 (%array_type.281) = bind_name arr, %arr.var
140-
// CHECK:STDOUT: %facet_value.loc7_3.1: %type_where = facet_value constants.%array_type.281, () [symbolic = %facet_value.loc7_3.2 (constants.%facet_value.bf1)]
141-
// CHECK:STDOUT: %.loc7_3.2: %type_where = converted constants.%array_type.281, %facet_value.loc7_3.1 [symbolic = %facet_value.loc7_3.2 (constants.%facet_value.bf1)]
142-
// CHECK:STDOUT: %impl.elem0: @G.%.loc7_3.3 (%.dc4) = impl_witness_access constants.%Destroy.impl_witness.5dc, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.84c)]
140+
// CHECK:STDOUT: %impl.elem0: @G.%.loc7_3.2 (%.dc4) = impl_witness_access constants.%Destroy.impl_witness.5dc, element0 [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.84c)]
143141
// CHECK:STDOUT: %bound_method.loc7_3.1: <bound method> = bound_method %arr.var, %impl.elem0
144142
// CHECK:STDOUT: %specific_fn: <specific function> = specific_function %impl.elem0, @DestroyT.binding.as_type.as.Destroy.impl.Op(constants.%facet_value.bf1) [symbolic = %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn (constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.9d2)]
145143
// CHECK:STDOUT: %bound_method.loc7_3.2: <bound method> = bound_method %arr.var, %specific_fn
@@ -161,10 +159,10 @@ fn H() { G(3); }
161159
// CHECK:STDOUT: %require_complete.loc7_22 => constants.%complete_type.ed6
162160
// CHECK:STDOUT: %pattern_type => constants.%pattern_type.9c8
163161
// CHECK:STDOUT: %array => constants.%array.2e5
164-
// CHECK:STDOUT: %facet_value.loc7_3.2 => constants.%facet_value.cba
162+
// CHECK:STDOUT: %facet_value => constants.%facet_value.cba
165163
// CHECK:STDOUT: %Destroy.impl_witness => constants.%Destroy.impl_witness.f4d
166164
// CHECK:STDOUT: %Destroy.facet => constants.%Destroy.facet.84e
167-
// CHECK:STDOUT: %.loc7_3.3 => constants.%.d5d
165+
// CHECK:STDOUT: %.loc7_3.2 => constants.%.d5d
168166
// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.type => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.type.ac2
169167
// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.155
170168
// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn => constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.e21

0 commit comments

Comments
 (0)