Skip to content

Commit 1f25ea5

Browse files
authored
Fix two issues with typealiases in protocol extensions (#20654)
- The GenericSignatureBuilder assumed it didn't have to look in protocol extensions to resolve member types. - Serialization was incorrectly filtering out such typealiases when trying to resolve a cross-module reference to one. rdar://problem/46103190
1 parent f56af4e commit 1f25ea5

File tree

7 files changed

+50
-9
lines changed

7 files changed

+50
-9
lines changed

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2119,9 +2119,7 @@ TypeDecl *EquivalenceClass::lookupNestedType(
21192119
ProtocolDecl *proto = conforms.first;
21202120

21212121
// Look for an associated type and/or concrete type with this name.
2122-
auto flags = OptionSet<NominalTypeDecl::LookupDirectFlags>();
2123-
flags |= NominalTypeDecl::LookupDirectFlags::IgnoreNewExtensions;
2124-
for (auto member : proto->lookupDirect(name, flags)) {
2122+
for (auto member : proto->lookupDirect(name)) {
21252123
// If this is an associated type, record whether it is the best
21262124
// associated type we've seen thus far.
21272125
if (auto assocType = dyn_cast<AssociatedTypeDecl>(member)) {

lib/Serialization/Deserialization.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1414,9 +1414,9 @@ ModuleFile::resolveCrossReference(ModuleDecl *baseModule, uint32_t pathLen) {
14141414
IdentifierID IID;
14151415
IdentifierID privateDiscriminator;
14161416
bool importedFromClang = false;
1417+
bool inProtocolExt = false;
14171418
XRefTypePathPieceLayout::readRecord(scratch, IID, privateDiscriminator,
1418-
/*inProtocolExt*/None,
1419-
importedFromClang);
1419+
inProtocolExt, importedFromClang);
14201420
if (privateDiscriminator)
14211421
goto giveUpFastPath;
14221422

@@ -1446,9 +1446,8 @@ ModuleFile::resolveCrossReference(ModuleDecl *baseModule, uint32_t pathLen) {
14461446
if (nestedType) {
14471447
SmallVector<ValueDecl *, 1> singleValueBuffer{nestedType};
14481448
filterValues(/*expectedTy*/Type(), extensionModule, genericSig,
1449-
/*isType*/true, /*inProtocolExt*/false,
1450-
importedFromClang, /*isStatic*/false, /*ctorInit*/None,
1451-
singleValueBuffer);
1449+
/*isType*/true, inProtocolExt, importedFromClang,
1450+
/*isStatic*/false, /*ctorInit*/None, singleValueBuffer);
14521451
if (!singleValueBuffer.empty()) {
14531452
values.assign({nestedType});
14541453
++NumNestedTypeShortcuts;

lib/Serialization/Serialization.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1888,10 +1888,12 @@ void Serializer::writeCrossReference(const DeclContext *DC, uint32_t pathLen) {
18881888
discriminator = containingFile->getDiscriminatorForPrivateValue(generic);
18891889
}
18901890

1891+
bool isProtocolExt = DC->getParent()->getExtendedProtocolDecl();
1892+
18911893
XRefTypePathPieceLayout::emitRecord(Out, ScratchRecord, abbrCode,
18921894
addDeclBaseNameRef(generic->getName()),
18931895
addDeclBaseNameRef(discriminator),
1894-
/*inProtocolExtension*/false,
1896+
isProtocolExt,
18951897
generic->hasClangNode());
18961898
break;
18971899
}

test/multifile/typealias/one-module/Inputs/library.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,9 @@ public enum Result<T, U>
55
}
66

77
public typealias GenericResult<T> = Result<T, Error>
8+
9+
public protocol Rdar46103190 {}
10+
extension Rdar46103190 {
11+
public typealias Alias = String
12+
public typealias Map<K: Hashable> = [K: Self]
13+
}

test/multifile/typealias/one-module/main.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,18 @@
55

66
func testFunction<T>(withCompletion completion: (Result<T, Error>) -> Void) { }
77
testFunction { (result: GenericResult<Int>) in }
8+
9+
extension Rdar46103190 {
10+
public typealias AnotherAlias = Self.Alias
11+
public typealias StringMap = Map<String>
12+
}
13+
14+
typealias Rdar46103190Alias<R: Rdar46103190> = R.Map<String>
15+
16+
struct Rdar46103190Impl: Rdar46103190 {}
17+
18+
func test46103190() {
19+
let _: String = Rdar46103190Impl.AnotherAlias()
20+
let _: [String: Rdar46103190Impl] = Rdar46103190Impl.StringMap()
21+
let _: [String: Rdar46103190Impl] = Rdar46103190Alias()
22+
}

test/multifile/typealias/two-modules/Inputs/library.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,9 @@ public enum Result<T, U>
55
}
66

77
public typealias GenericResult<T> = Result<T, Error>
8+
9+
public protocol Rdar46103190 {}
10+
extension Rdar46103190 {
11+
public typealias Alias = String
12+
public typealias Map<K: Hashable> = [K: Self]
13+
}

test/multifile/typealias/two-modules/main.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,18 @@ import library
1313

1414
func testFunction<T>(withCompletion completion: (Result<T, Error>) -> Void) { }
1515
testFunction { (result: GenericResult<Int>) in }
16+
17+
extension Rdar46103190 {
18+
public typealias AnotherAlias = Self.Alias
19+
public typealias StringMap = Map<String>
20+
}
21+
22+
typealias Rdar46103190Alias<R: Rdar46103190> = R.Map<String>
23+
24+
struct Rdar46103190Impl: Rdar46103190 {}
25+
26+
func test46103190() {
27+
let _: String = Rdar46103190Impl.AnotherAlias()
28+
let _: [String: Rdar46103190Impl] = Rdar46103190Impl.StringMap()
29+
let _: [String: Rdar46103190Impl] = Rdar46103190Alias()
30+
}

0 commit comments

Comments
 (0)