Skip to content

Commit 01f5855

Browse files
committed
IRGen: Don't emit lazy accessor for witness table of conformance involving DynamicSelfType
Fixes <https://bugs.swift.org/browse/SR-9295>.
1 parent c29f8f0 commit 01f5855

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

lib/IRGen/GenProto.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1100,7 +1100,8 @@ class AccessorConformanceInfo : public ConformanceInfo {
11001100
llvm::Value *getTable(IRGenFunction &IGF,
11011101
llvm::Value **typeMetadataCache) const override {
11021102
// If we're looking up a dependent type, we can't cache the result.
1103-
if (Conformance->getType()->hasArchetype()) {
1103+
if (Conformance->getType()->hasArchetype() ||
1104+
Conformance->getType()->hasDynamicSelfType()) {
11041105
return emitWitnessTableAccessorCall(IGF, Conformance,
11051106
typeMetadataCache);
11061107
}

test/IRGen/dynamic_self_metadata.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,18 @@
1212
}
1313
// CHECK-LABEL: define hidden swiftcc void @"$s21dynamic_self_metadata2idyxxlF"
1414

15+
protocol P {
16+
associatedtype T
17+
}
18+
19+
extension P {
20+
func f() {}
21+
}
22+
23+
struct G<T> : P {
24+
var t: T
25+
}
26+
1527
class C {
1628
class func fromMetatype() -> Self? { return nil }
1729
// CHECK-LABEL: define hidden swiftcc i64 @"$s21dynamic_self_metadata1CC12fromMetatypeACXDSgyFZ"(%swift.type* swiftself)
@@ -30,4 +42,17 @@ class C {
3042
// CHECK: [[T0:%.+]] = call swiftcc %swift.metadata_response @"$sSqMa"(i64 0, %swift.type* [[TYPE1]])
3143
// CHECK: [[TYPE2:%.+]] = extractvalue %swift.metadata_response [[T0]], 0
3244
// CHECK: call swiftcc void @"$s21dynamic_self_metadata2idyxxlF"({{.*}}, %swift.type* [[TYPE2]])
45+
46+
func dynamicSelfConformingType() -> Self? {
47+
_ = G(t: self).f()
48+
return nil
49+
}
50+
// CHECK-LABEL: define hidden swiftcc i64 @"$s21dynamic_self_metadata1CC0A18SelfConformingTypeACXDSgyF"(%T21dynamic_self_metadata1CC* swiftself)
51+
// CHECK: [[SELF:%.*]] = bitcast %T21dynamic_self_metadata1CC* %0 to %objc_object*
52+
// CHECK: [[SELF_TYPE:%.*]] = call %swift.type* @swift_getObjectType(%objc_object* [[SELF]])
53+
// CHECK: [[SELF:%.*]] = bitcast %T21dynamic_self_metadata1CC* %0 to %objc_object*
54+
// CHECK: [[SELF_TYPE:%.*]] = call %swift.type* @swift_getObjectType(%objc_object* [[SELF]])
55+
// CHECK: [[METADATA_RESPONSE:%.*]] = call swiftcc %swift.metadata_response @"$s21dynamic_self_metadata1GVMa"(i64 0, %swift.type* [[SELF_TYPE]])
56+
// CHECK: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[METADATA_RESPONSE]], 0
57+
// CHECK: call i8** @swift_getWitnessTable(%swift.protocol_conformance_descriptor* bitcast ({{.*}} @"$s21dynamic_self_metadata1GVyxGAA1PAAMc" to %swift.protocol_conformance_descriptor*), %swift.type* [[METADATA]], i8*** undef)
3358
}

0 commit comments

Comments
 (0)