Skip to content

Commit b410ebd

Browse files
authored
Fix destruction of generic types (#5943)
The self access is important; for the test `generic_class.carbon` being added to `toolchain/check/testdata/class/destroy_calls.carbon`, it was using `%T.as.Destroy` instead of `%D.as.Destroy`, indicating the default blank impl was being used instead of the type-specific version. That test is trying to focus on the issue, but the delta is visible in a couple other files in this PR, for example `toolchain/check/testdata/class/generic/init.carbon`. I'm separately working on getting rid of the default impl, which is how I noticed this.
1 parent 694c00c commit b410ebd

File tree

176 files changed

+3000
-2570
lines changed

Some content is hidden

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

176 files changed

+3000
-2570
lines changed

toolchain/check/implicit_type_impls.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,24 @@ static auto TryDeclareImpl(Context& context, SemIR::LocId loc_id,
2525
SemIR::TypeId self_type_id,
2626
SemIR::InstId interface_id)
2727
-> std::pair<SemIR::ImplId, SemIR::InstId> {
28+
StartGenericDecl(context);
29+
30+
// Build the implicit access to the enclosing `Self`.
31+
// TODO: This mirrors code in handle_impl that also suggests using
32+
// BuildNameRef.
33+
auto self_inst_id = AddTypeInst(
34+
context, loc_id,
35+
SemIR::NameRef{.type_id = SemIR::TypeType::TypeId,
36+
.name_id = SemIR::NameId::SelfType,
37+
.value_id = context.types().GetInstId(self_type_id)});
38+
AddNameToLookup(context, SemIR::NameId::SelfType, self_inst_id);
39+
2840
auto impl_decl_id = AddPlaceholderInst(
2941
context,
3042
SemIR::LocIdAndInst::UncheckedLoc(
3143
loc_id, SemIR::ImplDecl{.impl_id = SemIR::ImplId::None,
3244
.decl_block_id = SemIR::InstBlockId::Empty}));
3345

34-
auto self_id = context.types().GetInstId(self_type_id);
3546
auto constraint_id = ExprAsType(context, loc_id, interface_id).inst_id;
3647

3748
SemIR::Impl impl = {
@@ -50,14 +61,13 @@ static auto TryDeclareImpl(Context& context, SemIR::LocId loc_id,
5061
.first_owning_decl_id = impl_decl_id,
5162
},
5263
{
53-
.self_id = self_id,
64+
.self_id = self_inst_id,
5465
.constraint_id = constraint_id,
5566
.interface =
5667
CheckConstraintIsInterface(context, impl_decl_id, constraint_id),
5768
.is_final = true,
5869
}};
5970

60-
StartGenericDecl(context);
6171
return StartImplDecl(context, loc_id,
6272
/*implicit_params_loc_id=*/SemIR::LocId::None, impl,
6373
/*is_definition=*/true, /*extend_impl=*/std::nullopt);

toolchain/check/testdata/basics/dump_sem_ir_ranges.carbon

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,15 +186,15 @@ fn F();
186186
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
187187
// CHECK:STDOUT: }
188188
// CHECK:STDOUT:
189-
// CHECK:STDOUT: impl @A.as.Destroy.impl: constants.%A as constants.%Destroy.type {
189+
// CHECK:STDOUT: impl @A.as.Destroy.impl: @A.%Self.ref as constants.%Destroy.type {
190190
// CHECK:STDOUT: <elided>
191191
// CHECK:STDOUT:
192192
// CHECK:STDOUT: !members:
193193
// CHECK:STDOUT: .Op = %A.as.Destroy.impl.Op.decl
194194
// CHECK:STDOUT: witness = @A.%Destroy.impl_witness
195195
// CHECK:STDOUT: }
196196
// CHECK:STDOUT:
197-
// CHECK:STDOUT: impl @C.as.Destroy.impl: constants.%C as constants.%Destroy.type {
197+
// CHECK:STDOUT: impl @C.as.Destroy.impl: @C.%Self.ref as constants.%Destroy.type {
198198
// CHECK:STDOUT: %C.as.Destroy.impl.Op.decl: %C.as.Destroy.impl.Op.type = fn_decl @C.as.Destroy.impl.Op [concrete = constants.%C.as.Destroy.impl.Op] {
199199
// CHECK:STDOUT: %self.patt: %pattern_type.44a = binding_pattern self [concrete]
200200
// CHECK:STDOUT: %self.param_patt: %pattern_type.44a = value_param_pattern %self.patt, call_param0 [concrete]
@@ -225,6 +225,7 @@ fn F();
225225
// CHECK:STDOUT: class @C {
226226
// CHECK:STDOUT: %C.I.decl: %C.I.type = fn_decl @C.I [concrete = constants.%C.I] {} {}
227227
// CHECK:STDOUT: <elided>
228+
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C]
228229
// CHECK:STDOUT: impl_decl @C.as.Destroy.impl [concrete] {} {}
229230
// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@C.as.Destroy.impl.%C.as.Destroy.impl.Op.decl), @C.as.Destroy.impl [concrete]
230231
// CHECK:STDOUT: %Destroy.impl_witness: <witness> = impl_witness %Destroy.impl_witness_table [concrete = constants.%Destroy.impl_witness.edd]

toolchain/check/testdata/class/access_modifers.carbon

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ class A {
228228
// CHECK:STDOUT: %Run.decl: %Run.type = fn_decl @Run [concrete = constants.%Run] {} {}
229229
// CHECK:STDOUT: }
230230
// CHECK:STDOUT:
231-
// CHECK:STDOUT: impl @Circle.as.Destroy.impl: constants.%Circle as constants.%Destroy.type {
231+
// CHECK:STDOUT: impl @Circle.as.Destroy.impl: @Circle.%Self.ref as constants.%Destroy.type {
232232
// CHECK:STDOUT: %Circle.as.Destroy.impl.Op.decl: %Circle.as.Destroy.impl.Op.type = fn_decl @Circle.as.Destroy.impl.Op [concrete = constants.%Circle.as.Destroy.impl.Op] {
233233
// CHECK:STDOUT: %self.patt: %pattern_type.f32 = binding_pattern self [concrete]
234234
// CHECK:STDOUT: %self.param_patt: %pattern_type.f32 = value_param_pattern %self.patt, call_param0 [concrete]
@@ -281,6 +281,7 @@ class A {
281281
// CHECK:STDOUT: %return.param: ref %Circle = out_param call_param0
282282
// CHECK:STDOUT: %return: ref %Circle = return_slot %return.param
283283
// CHECK:STDOUT: }
284+
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Circle [concrete = constants.%Circle]
284285
// CHECK:STDOUT: impl_decl @Circle.as.Destroy.impl [concrete] {} {}
285286
// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Circle.as.Destroy.impl.%Circle.as.Destroy.impl.Op.decl), @Circle.as.Destroy.impl [concrete]
286287
// CHECK:STDOUT: %Destroy.impl_witness: <witness> = impl_witness %Destroy.impl_witness_table [concrete = constants.%Destroy.impl_witness.2a8]
@@ -409,7 +410,7 @@ class A {
409410
// CHECK:STDOUT: %Run.decl: %Run.type = fn_decl @Run [concrete = constants.%Run] {} {}
410411
// CHECK:STDOUT: }
411412
// CHECK:STDOUT:
412-
// CHECK:STDOUT: impl @A.as.Destroy.impl: constants.%A as constants.%Destroy.type {
413+
// CHECK:STDOUT: impl @A.as.Destroy.impl: @A.%Self.ref as constants.%Destroy.type {
413414
// CHECK:STDOUT: %A.as.Destroy.impl.Op.decl: %A.as.Destroy.impl.Op.type = fn_decl @A.as.Destroy.impl.Op [concrete = constants.%A.as.Destroy.impl.Op] {
414415
// CHECK:STDOUT: %self.patt: %pattern_type.5f8 = binding_pattern self [concrete]
415416
// CHECK:STDOUT: %self.param_patt: %pattern_type.5f8 = value_param_pattern %self.patt, call_param0 [concrete]
@@ -429,6 +430,7 @@ class A {
429430
// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32]
430431
// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32]
431432
// CHECK:STDOUT: %.loc5: %A.elem = field_decl x, element0 [concrete]
433+
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%A [concrete = constants.%A]
432434
// CHECK:STDOUT: impl_decl @A.as.Destroy.impl [concrete] {} {}
433435
// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@A.as.Destroy.impl.%A.as.Destroy.impl.Op.decl), @A.as.Destroy.impl [concrete]
434436
// CHECK:STDOUT: %Destroy.impl_witness: <witness> = impl_witness %Destroy.impl_witness_table [concrete = constants.%Destroy.impl_witness]
@@ -526,7 +528,7 @@ class A {
526528
// CHECK:STDOUT: %Circle.decl: type = class_decl @Circle [concrete = constants.%Circle] {} {}
527529
// CHECK:STDOUT: }
528530
// CHECK:STDOUT:
529-
// CHECK:STDOUT: impl @Circle.as.Destroy.impl: constants.%Circle as constants.%Destroy.type {
531+
// CHECK:STDOUT: impl @Circle.as.Destroy.impl: @Circle.%Self.ref as constants.%Destroy.type {
530532
// CHECK:STDOUT: %Circle.as.Destroy.impl.Op.decl: %Circle.as.Destroy.impl.Op.type = fn_decl @Circle.as.Destroy.impl.Op [concrete = constants.%Circle.as.Destroy.impl.Op] {
531533
// CHECK:STDOUT: %self.patt: %pattern_type.f32 = binding_pattern self [concrete]
532534
// CHECK:STDOUT: %self.param_patt: %pattern_type.f32 = value_param_pattern %self.patt, call_param0 [concrete]
@@ -583,6 +585,7 @@ class A {
583585
// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1
584586
// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param
585587
// CHECK:STDOUT: }
588+
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Circle [concrete = constants.%Circle]
586589
// CHECK:STDOUT: impl_decl @Circle.as.Destroy.impl [concrete] {} {}
587590
// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Circle.as.Destroy.impl.%Circle.as.Destroy.impl.Op.decl), @Circle.as.Destroy.impl [concrete]
588591
// CHECK:STDOUT: %Destroy.impl_witness: <witness> = impl_witness %Destroy.impl_witness_table [concrete = constants.%Destroy.impl_witness.2a8]
@@ -701,7 +704,7 @@ class A {
701704
// CHECK:STDOUT: %x: %i32 = bind_name x, @__global_init.%x.ref
702705
// CHECK:STDOUT: }
703706
// CHECK:STDOUT:
704-
// CHECK:STDOUT: impl @A.as.Destroy.impl: constants.%A as constants.%Destroy.type {
707+
// CHECK:STDOUT: impl @A.as.Destroy.impl: @A.%Self.ref as constants.%Destroy.type {
705708
// CHECK:STDOUT: %A.as.Destroy.impl.Op.decl: %A.as.Destroy.impl.Op.type = fn_decl @A.as.Destroy.impl.Op [concrete = constants.%A.as.Destroy.impl.Op] {
706709
// CHECK:STDOUT: %self.patt: %pattern_type.5f8 = binding_pattern self [concrete]
707710
// CHECK:STDOUT: %self.param_patt: %pattern_type.5f8 = value_param_pattern %self.patt, call_param0 [concrete]
@@ -734,6 +737,7 @@ class A {
734737
// CHECK:STDOUT: %.loc5_16.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_5.0f6]
735738
// CHECK:STDOUT: %.loc5_16.2: %i32 = converted %int_5, %.loc5_16.1 [concrete = constants.%int_5.0f6]
736739
// CHECK:STDOUT: %x: %i32 = bind_name x, %.loc5_16.2
740+
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%A [concrete = constants.%A]
737741
// CHECK:STDOUT: impl_decl @A.as.Destroy.impl [concrete] {} {}
738742
// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@A.as.Destroy.impl.%A.as.Destroy.impl.Op.decl), @A.as.Destroy.impl [concrete]
739743
// CHECK:STDOUT: %Destroy.impl_witness: <witness> = impl_witness %Destroy.impl_witness_table [concrete = constants.%Destroy.impl_witness.b44]
@@ -833,7 +837,7 @@ class A {
833837
// CHECK:STDOUT: %y: %i32 = bind_name y, <error> [concrete = <error>]
834838
// CHECK:STDOUT: }
835839
// CHECK:STDOUT:
836-
// CHECK:STDOUT: impl @A.as.Destroy.impl: constants.%A as constants.%Destroy.type {
840+
// CHECK:STDOUT: impl @A.as.Destroy.impl: @A.%Self.ref as constants.%Destroy.type {
837841
// CHECK:STDOUT: %A.as.Destroy.impl.Op.decl: %A.as.Destroy.impl.Op.type = fn_decl @A.as.Destroy.impl.Op [concrete = constants.%A.as.Destroy.impl.Op] {
838842
// CHECK:STDOUT: %self.patt: %pattern_type.5f8 = binding_pattern self [concrete]
839843
// CHECK:STDOUT: %self.param_patt: %pattern_type.5f8 = value_param_pattern %self.patt, call_param0 [concrete]
@@ -882,6 +886,7 @@ class A {
882886
// CHECK:STDOUT: %.loc6_24.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc6 [concrete = constants.%int_5.0f6]
883887
// CHECK:STDOUT: %.loc6_24.2: %i32 = converted %int_5.loc6, %.loc6_24.1 [concrete = constants.%int_5.0f6]
884888
// CHECK:STDOUT: %y: %i32 = bind_name y, %.loc6_24.2
889+
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%A [concrete = constants.%A]
885890
// CHECK:STDOUT: impl_decl @A.as.Destroy.impl [concrete] {} {}
886891
// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@A.as.Destroy.impl.%A.as.Destroy.impl.Op.decl), @A.as.Destroy.impl [concrete]
887892
// CHECK:STDOUT: %Destroy.impl_witness: <witness> = impl_witness %Destroy.impl_witness_table [concrete = constants.%Destroy.impl_witness.b44]
@@ -943,7 +948,7 @@ class A {
943948
// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {}
944949
// CHECK:STDOUT: }
945950
// CHECK:STDOUT:
946-
// CHECK:STDOUT: impl @A.as.Destroy.impl: constants.%A as constants.%Destroy.type {
951+
// CHECK:STDOUT: impl @A.as.Destroy.impl: @A.%Self.ref as constants.%Destroy.type {
947952
// CHECK:STDOUT: %A.as.Destroy.impl.Op.decl: %A.as.Destroy.impl.Op.type = fn_decl @A.as.Destroy.impl.Op [concrete = constants.%A.as.Destroy.impl.Op] {
948953
// CHECK:STDOUT: %self.patt: %pattern_type.5f8 = binding_pattern self [concrete]
949954
// CHECK:STDOUT: %self.param_patt: %pattern_type.5f8 = value_param_pattern %self.patt, call_param0 [concrete]
@@ -962,6 +967,7 @@ class A {
962967
// CHECK:STDOUT: class @A {
963968
// CHECK:STDOUT: %A.F.decl: %A.F.type = fn_decl @A.F [concrete = constants.%A.F] {} {}
964969
// CHECK:STDOUT: %A.G.decl: %A.G.type = fn_decl @A.G [concrete = constants.%A.G] {} {}
970+
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%A [concrete = constants.%A]
965971
// CHECK:STDOUT: impl_decl @A.as.Destroy.impl [concrete] {} {}
966972
// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@A.as.Destroy.impl.%A.as.Destroy.impl.Op.decl), @A.as.Destroy.impl [concrete]
967973
// CHECK:STDOUT: %Destroy.impl_witness: <witness> = impl_witness %Destroy.impl_witness_table [concrete = constants.%Destroy.impl_witness]

toolchain/check/testdata/class/adapter/adapt.carbon

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ interface I {
124124
// CHECK:STDOUT: %StructAdapter.decl: type = class_decl @StructAdapter [concrete = constants.%StructAdapter] {} {}
125125
// CHECK:STDOUT: }
126126
// CHECK:STDOUT:
127-
// CHECK:STDOUT: impl @SomeClass.as.Destroy.impl: constants.%SomeClass as constants.%Destroy.type {
127+
// CHECK:STDOUT: impl @SomeClass.as.Destroy.impl: @SomeClass.%Self.ref as constants.%Destroy.type {
128128
// CHECK:STDOUT: %SomeClass.as.Destroy.impl.Op.decl: %SomeClass.as.Destroy.impl.Op.type = fn_decl @SomeClass.as.Destroy.impl.Op [concrete = constants.%SomeClass.as.Destroy.impl.Op] {
129129
// CHECK:STDOUT: %self.patt: %pattern_type.a47 = binding_pattern self [concrete]
130130
// CHECK:STDOUT: %self.param_patt: %pattern_type.a47 = value_param_pattern %self.patt, call_param0 [concrete]
@@ -140,7 +140,7 @@ interface I {
140140
// CHECK:STDOUT: witness = @SomeClass.%Destroy.impl_witness
141141
// CHECK:STDOUT: }
142142
// CHECK:STDOUT:
143-
// CHECK:STDOUT: impl @SomeClassAdapter.as.Destroy.impl: constants.%SomeClassAdapter as constants.%Destroy.type {
143+
// CHECK:STDOUT: impl @SomeClassAdapter.as.Destroy.impl: @SomeClassAdapter.%Self.ref as constants.%Destroy.type {
144144
// CHECK:STDOUT: %SomeClassAdapter.as.Destroy.impl.Op.decl: %SomeClassAdapter.as.Destroy.impl.Op.type = fn_decl @SomeClassAdapter.as.Destroy.impl.Op [concrete = constants.%SomeClassAdapter.as.Destroy.impl.Op] {
145145
// CHECK:STDOUT: %self.patt: %pattern_type.76d = binding_pattern self [concrete]
146146
// CHECK:STDOUT: %self.param_patt: %pattern_type.76d = value_param_pattern %self.patt, call_param0 [concrete]
@@ -156,7 +156,7 @@ interface I {
156156
// CHECK:STDOUT: witness = @SomeClassAdapter.%Destroy.impl_witness
157157
// CHECK:STDOUT: }
158158
// CHECK:STDOUT:
159-
// CHECK:STDOUT: impl @StructAdapter.as.Destroy.impl: constants.%StructAdapter as constants.%Destroy.type {
159+
// CHECK:STDOUT: impl @StructAdapter.as.Destroy.impl: @StructAdapter.%Self.ref as constants.%Destroy.type {
160160
// CHECK:STDOUT: %StructAdapter.as.Destroy.impl.Op.decl: %StructAdapter.as.Destroy.impl.Op.type = fn_decl @StructAdapter.as.Destroy.impl.Op [concrete = constants.%StructAdapter.as.Destroy.impl.Op] {
161161
// CHECK:STDOUT: %self.patt: %pattern_type.671 = binding_pattern self [concrete]
162162
// CHECK:STDOUT: %self.param_patt: %pattern_type.671 = value_param_pattern %self.patt, call_param0 [concrete]
@@ -179,6 +179,7 @@ interface I {
179179
// CHECK:STDOUT: %int_32.loc6: Core.IntLiteral = int_value 32 [concrete = constants.%int_32]
180180
// CHECK:STDOUT: %i32.loc6: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32]
181181
// CHECK:STDOUT: %.loc6: %SomeClass.elem = field_decl b, element1 [concrete]
182+
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%SomeClass [concrete = constants.%SomeClass]
182183
// CHECK:STDOUT: impl_decl @SomeClass.as.Destroy.impl [concrete] {} {}
183184
// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@SomeClass.as.Destroy.impl.%SomeClass.as.Destroy.impl.Op.decl), @SomeClass.as.Destroy.impl [concrete]
184185
// CHECK:STDOUT: %Destroy.impl_witness: <witness> = impl_witness %Destroy.impl_witness_table [concrete = constants.%Destroy.impl_witness.ab1]
@@ -194,6 +195,7 @@ interface I {
194195
// CHECK:STDOUT: class @SomeClassAdapter {
195196
// CHECK:STDOUT: %SomeClass.ref: type = name_ref SomeClass, file.%SomeClass.decl [concrete = constants.%SomeClass]
196197
// CHECK:STDOUT: adapt_decl %SomeClass.ref [concrete]
198+
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%SomeClassAdapter [concrete = constants.%SomeClassAdapter]
197199
// CHECK:STDOUT: impl_decl @SomeClassAdapter.as.Destroy.impl [concrete] {} {}
198200
// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@SomeClassAdapter.as.Destroy.impl.%SomeClassAdapter.as.Destroy.impl.Op.decl), @SomeClassAdapter.as.Destroy.impl [concrete]
199201
// CHECK:STDOUT: %Destroy.impl_witness: <witness> = impl_witness %Destroy.impl_witness_table [concrete = constants.%Destroy.impl_witness.84c]
@@ -212,6 +214,7 @@ interface I {
212214
// CHECK:STDOUT: %i32.loc14_23: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32]
213215
// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete = constants.%struct_type.a.b]
214216
// CHECK:STDOUT: adapt_decl %struct_type.a.b [concrete]
217+
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%StructAdapter [concrete = constants.%StructAdapter]
215218
// CHECK:STDOUT: impl_decl @StructAdapter.as.Destroy.impl [concrete] {} {}
216219
// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@StructAdapter.as.Destroy.impl.%StructAdapter.as.Destroy.impl.Op.decl), @StructAdapter.as.Destroy.impl [concrete]
217220
// CHECK:STDOUT: %Destroy.impl_witness: <witness> = impl_witness %Destroy.impl_witness_table [concrete = constants.%Destroy.impl_witness.6e0]
@@ -283,7 +286,7 @@ interface I {
283286
// CHECK:STDOUT: }
284287
// CHECK:STDOUT: }
285288
// CHECK:STDOUT:
286-
// CHECK:STDOUT: impl @Adapted.as.Destroy.impl: constants.%Adapted as constants.%Destroy.type {
289+
// CHECK:STDOUT: impl @Adapted.as.Destroy.impl: @Adapted.%Self.ref as constants.%Destroy.type {
287290
// CHECK:STDOUT: %Adapted.as.Destroy.impl.Op.decl: %Adapted.as.Destroy.impl.Op.type = fn_decl @Adapted.as.Destroy.impl.Op [concrete = constants.%Adapted.as.Destroy.impl.Op] {
288291
// CHECK:STDOUT: %self.patt: %pattern_type.c04 = binding_pattern self [concrete]
289292
// CHECK:STDOUT: %self.param_patt: %pattern_type.c04 = value_param_pattern %self.patt, call_param0 [concrete]
@@ -299,7 +302,7 @@ interface I {
299302
// CHECK:STDOUT: witness = @Adapted.%Destroy.impl_witness
300303
// CHECK:STDOUT: }
301304
// CHECK:STDOUT:
302-
// CHECK:STDOUT: impl @AdaptNotExtend.as.Destroy.impl: constants.%AdaptNotExtend as constants.%Destroy.type {
305+
// CHECK:STDOUT: impl @AdaptNotExtend.as.Destroy.impl: @AdaptNotExtend.%Self.ref as constants.%Destroy.type {
303306
// CHECK:STDOUT: %AdaptNotExtend.as.Destroy.impl.Op.decl: %AdaptNotExtend.as.Destroy.impl.Op.type = fn_decl @AdaptNotExtend.as.Destroy.impl.Op [concrete = constants.%AdaptNotExtend.as.Destroy.impl.Op] {
304307
// CHECK:STDOUT: %self.patt: %pattern_type.73e = binding_pattern self [concrete]
305308
// CHECK:STDOUT: %self.param_patt: %pattern_type.73e = value_param_pattern %self.patt, call_param0 [concrete]
@@ -317,6 +320,7 @@ interface I {
317320
// CHECK:STDOUT:
318321
// CHECK:STDOUT: class @Adapted {
319322
// CHECK:STDOUT: %Adapted.F.decl: %Adapted.F.type = fn_decl @Adapted.F [concrete = constants.%Adapted.F] {} {}
323+
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Adapted [concrete = constants.%Adapted]
320324
// CHECK:STDOUT: impl_decl @Adapted.as.Destroy.impl [concrete] {} {}
321325
// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@Adapted.as.Destroy.impl.%Adapted.as.Destroy.impl.Op.decl), @Adapted.as.Destroy.impl [concrete]
322326
// CHECK:STDOUT: %Destroy.impl_witness: <witness> = impl_witness %Destroy.impl_witness_table [concrete = constants.%Destroy.impl_witness.d23]
@@ -331,6 +335,7 @@ interface I {
331335
// CHECK:STDOUT: class @AdaptNotExtend {
332336
// CHECK:STDOUT: %Adapted.ref: type = name_ref Adapted, file.%Adapted.decl [concrete = constants.%Adapted]
333337
// CHECK:STDOUT: adapt_decl %Adapted.ref [concrete]
338+
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%AdaptNotExtend [concrete = constants.%AdaptNotExtend]
334339
// CHECK:STDOUT: impl_decl @AdaptNotExtend.as.Destroy.impl [concrete] {} {}
335340
// CHECK:STDOUT: %Destroy.impl_witness_table = impl_witness_table (@AdaptNotExtend.as.Destroy.impl.%AdaptNotExtend.as.Destroy.impl.Op.decl), @AdaptNotExtend.as.Destroy.impl [concrete]
336341
// CHECK:STDOUT: %Destroy.impl_witness: <witness> = impl_witness %Destroy.impl_witness_table [concrete = constants.%Destroy.impl_witness.f9b]

0 commit comments

Comments
 (0)