Skip to content

Commit eee122c

Browse files
committed
ModuleInterface: Resolve inherited types when recording indirect conformances.
Previously, indirect public conformances provided by conforming to an internal protocol could be skipped in a `.swiftinterface` in lazy typechecking mode since inherited types might not be resolved before collecting the indirect conformances.
1 parent 435f623 commit eee122c

File tree

5 files changed

+28
-2
lines changed

5 files changed

+28
-2
lines changed

lib/Frontend/ModuleInterfaceSupport.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -483,15 +483,16 @@ class InheritedProtocolCollector {
483483
bool skipExtra = false) {
484484
llvm::Optional<AvailableAttrList> availableAttrs;
485485

486-
for (InheritedEntry inherited : directlyInherited.getEntries()) {
487-
Type inheritedTy = inherited.getType();
486+
for (int i : directlyInherited.getIndices()) {
487+
Type inheritedTy = directlyInherited.getResolvedType(i);
488488
if (!inheritedTy || !inheritedTy->isExistentialType())
489489
continue;
490490

491491
bool canPrintNormally = canPrintProtocolTypeNormally(inheritedTy, D);
492492
if (!canPrintNormally && skipExtra)
493493
continue;
494494

495+
auto inherited = directlyInherited.getEntry(i);
495496
ExistentialLayout layout = inheritedTy->getExistentialLayout();
496497
for (ProtocolDecl *protoDecl : layout.getProtocols()) {
497498
if (canPrintNormally)

test/Inputs/lazy_typecheck.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ protocol InternalProto {
6262
func badReq() -> DoesNotExist // expected-error {{cannot find type 'DoesNotExist' in scope}}
6363
}
6464

65+
protocol InternalProtoConformingToPublicProto: PublicProto {
66+
func internalReq() -> DoesNotExist // expected-error {{cannot find type 'DoesNotExist' in scope}}
67+
}
68+
6569
public struct PublicStruct {
6670
// FIXME: Test properties
6771

@@ -130,6 +134,13 @@ public struct PublicStructConformingToPublicProto: PublicProto {
130134
}
131135
}
132136

137+
public struct PublicStructIndirectlyConformingToPublicProto: InternalProtoConformingToPublicProto {
138+
public init() {}
139+
public func req() -> Int {
140+
return true // expected-error {{cannot convert return expression of type 'Bool' to return type 'Int'}}
141+
}
142+
}
143+
133144
public class PublicClassConformingToPublicProto: PublicProto {
134145
public init() {}
135146
public func req() -> Int {

test/Inputs/lazy_typecheck_client.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,14 @@ func testPublicClass() {
3939
func testConformances() {
4040
let array: [any PublicProto] = [
4141
PublicStructConformingToPublicProto(),
42+
PublicStructIndirectlyConformingToPublicProto(),
4243
PublicClassConformingToPublicProto(),
4344
"string",
4445
PublicClassInheritingConformanceToPublicProto(),
4546
]
4647

4748
for x in array {
4849
_ = x.req()
50+
constrainedGenericPublicFunction(x)
4951
}
5052
}

test/ModuleInterface/lazy-typecheck.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@
5353
// CHECK: public init()
5454
// CHECK: public func req() -> Swift.Int
5555
// CHECK: }
56+
// CHECK: public struct PublicStructIndirectlyConformingToPublicProto {
57+
// CHECK: public init()
58+
// CHECK: public func req() -> Swift.Int
59+
// CHECK: }
5660
// CHECK: public class PublicClassConformingToPublicProto : lazy_typecheck.PublicProto {
5761
// CHECK: public init()
5862
// CHECK: public func req() -> Swift.Int
@@ -70,3 +74,4 @@
7074
// CHECK: public func req() throws -> Swift.Int
7175
// CHECK: }
7276
// CHECK: #endif
77+
// CHECK: extension lazy_typecheck.PublicStructIndirectlyConformingToPublicProto : lazy_typecheck.PublicProto {}

test/TBD/lazy-typecheck.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@ exports:
4949
'_$s14lazy_typecheck034PublicClassInheritingConformanceToC5ProtoCN',
5050
'_$s14lazy_typecheck034PublicClassInheritingConformanceToC5ProtoCfD',
5151
'_$s14lazy_typecheck034PublicClassInheritingConformanceToC5ProtoCfd',
52+
'_$s14lazy_typecheck034PublicStructIndirectlyConformingToC5ProtoV3reqSiyF',
53+
'_$s14lazy_typecheck034PublicStructIndirectlyConformingToC5ProtoVAA0cH0AAMc',
54+
'_$s14lazy_typecheck034PublicStructIndirectlyConformingToC5ProtoVAA0cH0AAWP',
55+
'_$s14lazy_typecheck034PublicStructIndirectlyConformingToC5ProtoVACycfC',
56+
'_$s14lazy_typecheck034PublicStructIndirectlyConformingToC5ProtoVMa',
57+
'_$s14lazy_typecheck034PublicStructIndirectlyConformingToC5ProtoVMn',
58+
'_$s14lazy_typecheck034PublicStructIndirectlyConformingToC5ProtoVN',
5259
'_$s14lazy_typecheck10publicFuncSiyF', '_$s14lazy_typecheck11PublicClassC06publicD6MethodyyFZTj',
5360
'_$s14lazy_typecheck11PublicClassC06publicD6MethodyyFZTq',
5461
'_$s14lazy_typecheck11PublicClassC12publicMethodSiyFTj', '_$s14lazy_typecheck11PublicClassC12publicMethodSiyFTq',

0 commit comments

Comments
 (0)