Merge pull request #21891 from apple/revert-21436-revert-5.0-right-on-target
[5.0] Re-apply "[Serialization] Use full target architectures for swiftmodule files"
diff --git a/lib/AST/GenericSignatureBuilder.cpp b/lib/AST/GenericSignatureBuilder.cpp
index 1f8b345..60205de 100644
--- a/lib/AST/GenericSignatureBuilder.cpp
+++ b/lib/AST/GenericSignatureBuilder.cpp
@@ -2031,9 +2031,7 @@
ProtocolDecl *proto = conforms.first;
// Look for an associated type and/or concrete type with this name.
- auto flags = OptionSet<NominalTypeDecl::LookupDirectFlags>();
- flags |= NominalTypeDecl::LookupDirectFlags::IgnoreNewExtensions;
- for (auto member : proto->lookupDirect(name, flags)) {
+ for (auto member : proto->lookupDirect(name)) {
// If this is an associated type, record whether it is the best
// associated type we've seen thus far.
if (auto assocType = dyn_cast<AssociatedTypeDecl>(member)) {
diff --git a/lib/Serialization/Deserialization.cpp b/lib/Serialization/Deserialization.cpp
index 4b162fe..0f2dfae 100644
--- a/lib/Serialization/Deserialization.cpp
+++ b/lib/Serialization/Deserialization.cpp
@@ -1138,21 +1138,20 @@
return None;
}
-/// Determine whether the two modules are re-exported to the same module.
-static bool reExportedToSameModule(const ModuleDecl *fromModule,
- const ModuleDecl *toModule) {
+static bool isReExportedToModule(const ValueDecl *value,
+ const ModuleDecl *expectedModule) {
+ const DeclContext *valueDC = value->getDeclContext();
auto fromClangModule
- = dyn_cast<ClangModuleUnit>(fromModule->getFiles().front());
+ = dyn_cast<ClangModuleUnit>(valueDC->getModuleScopeContext());
if (!fromClangModule)
return false;
+ std::string exportedName = fromClangModule->getExportedModuleName();
auto toClangModule
- = dyn_cast<ClangModuleUnit>(toModule->getFiles().front());
- if (!toClangModule)
- return false;
-
- return fromClangModule->getExportedModuleName() ==
- toClangModule->getExportedModuleName();
+ = dyn_cast<ClangModuleUnit>(expectedModule->getFiles().front());
+ if (toClangModule)
+ return exportedName == toClangModule->getExportedModuleName();
+ return exportedName == expectedModule->getName().str();
}
/// Remove values from \p values that don't match the expected type or module.
@@ -1195,7 +1194,7 @@
// module to the original definition in a base module.
if (expectedModule && !value->hasClangNode() &&
value->getModuleContext() != expectedModule &&
- !reExportedToSameModule(value->getModuleContext(), expectedModule))
+ !isReExportedToModule(value, expectedModule))
return true;
// If we're expecting a member within a constrained extension with a
@@ -1349,6 +1348,7 @@
if (entry.Kind != llvm::BitstreamEntry::Record)
return Identifier();
+ scratch.clear();
unsigned recordID = DeclTypeCursor.readRecord(entry.ID, scratch,
&blobData);
switch (recordID) {
@@ -1414,9 +1414,9 @@
IdentifierID IID;
IdentifierID privateDiscriminator;
bool importedFromClang = false;
+ bool inProtocolExt = false;
XRefTypePathPieceLayout::readRecord(scratch, IID, privateDiscriminator,
- /*inProtocolExt*/None,
- importedFromClang);
+ inProtocolExt, importedFromClang);
if (privateDiscriminator)
goto giveUpFastPath;
@@ -1446,9 +1446,8 @@
if (nestedType) {
SmallVector<ValueDecl *, 1> singleValueBuffer{nestedType};
filterValues(/*expectedTy*/Type(), extensionModule, genericSig,
- /*isType*/true, /*inProtocolExt*/false,
- importedFromClang, /*isStatic*/false, /*ctorInit*/None,
- singleValueBuffer);
+ /*isType*/true, inProtocolExt, importedFromClang,
+ /*isStatic*/false, /*ctorInit*/None, singleValueBuffer);
if (!singleValueBuffer.empty()) {
values.assign({nestedType});
++NumNestedTypeShortcuts;
diff --git a/lib/Serialization/Serialization.cpp b/lib/Serialization/Serialization.cpp
index f40a9ad..a7d9a2a 100644
--- a/lib/Serialization/Serialization.cpp
+++ b/lib/Serialization/Serialization.cpp
@@ -1894,10 +1894,12 @@
discriminator = containingFile->getDiscriminatorForPrivateValue(generic);
}
+ bool isProtocolExt = DC->getParent()->getExtendedProtocolDecl();
+
XRefTypePathPieceLayout::emitRecord(Out, ScratchRecord, abbrCode,
addDeclBaseNameRef(generic->getName()),
addDeclBaseNameRef(discriminator),
- /*inProtocolExtension*/false,
+ isProtocolExt,
generic->hasClangNode());
break;
}
diff --git a/test/ClangImporter/private_frameworks.swift b/test/ClangImporter/private_frameworks.swift
index fe36da2..733ec81 100644
--- a/test/ClangImporter/private_frameworks.swift
+++ b/test/ClangImporter/private_frameworks.swift
@@ -12,7 +12,7 @@
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) -emit-sil -o /dev/null -F %S/Inputs/privateframeworks/withprivate -swift-version 4 %s -import-objc-header %S/Inputs/privateframeworks/bridging-somekitcore.h -verify
// Use the overlay without private frameworks.
-// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) -emit-sil -o /dev/null -F %S/Inputs/privateframeworks/withoutprivate -I %t -swift-version 4 -import-objc-header %S/Inputs/privateframeworks/bridging-somekit.h %s
+// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) -emit-sil -o /dev/null -F %S/Inputs/privateframeworks/withoutprivate -swift-version 4 -import-objc-header %S/Inputs/privateframeworks/bridging-somekit.h %s
// Build the overlay with public frameworks.
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) -emit-module -F %S/Inputs/privateframeworks/withoutprivate -o %t %S/Inputs/privateframeworks/overlay/SomeKit.swift
@@ -21,7 +21,18 @@
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) -emit-sil -o /dev/null -F %S/Inputs/privateframeworks/withprivate -swift-version 4 %s -import-objc-header %S/Inputs/privateframeworks/bridging-somekitcore.h -verify
// Use the overlay without private frameworks.
-// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) -emit-sil -o /dev/null -F %S/Inputs/privateframeworks/withoutprivate -I %t -swift-version 4 %s -import-objc-header %S/Inputs/privateframeworks/bridging-somekit.h
+// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) -emit-sil -o /dev/null -F %S/Inputs/privateframeworks/withoutprivate -swift-version 4 %s -import-objc-header %S/Inputs/privateframeworks/bridging-somekit.h
+
+// Use something that uses the overlay.
+// RUN: echo 'import private_frameworks; testErrorConformance()' > %t/main.swift
+
+// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) -emit-module -o %t -F %S/Inputs/privateframeworks/withprivate -swift-version 4 %s -import-objc-header %S/Inputs/privateframeworks/bridging-somekitcore.h
+// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) -emit-sil -o /dev/null -F %S/Inputs/privateframeworks/withprivate %t/main.swift -verify
+// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) -emit-sil -o /dev/null -F %S/Inputs/privateframeworks/withoutprivate %t/main.swift -verify
+
+// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) -emit-module -o %t -F %S/Inputs/privateframeworks/withoutprivate -swift-version 4 %s -import-objc-header %S/Inputs/privateframeworks/bridging-somekit.h
+// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) -emit-sil -o /dev/null -F %S/Inputs/privateframeworks/withprivate %t/main.swift -verify
+// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) -emit-sil -o /dev/null -F %S/Inputs/privateframeworks/withoutprivate %t/main.swift -verify
// REQUIRES: objc_interop
@@ -50,3 +61,6 @@
SomeKit.someKitOtherGlobalFunc()
someKitOtherGlobalFunc()
}
+
+public struct ErrorsOnly<T: Error> {}
+public func testErrorConformance(_ code: ErrorsOnly<SKWidget.Error>? = nil) {}
diff --git a/test/multifile/typealias/one-module/Inputs/library.swift b/test/multifile/typealias/one-module/Inputs/library.swift
index 756a569..fdbb5ef 100644
--- a/test/multifile/typealias/one-module/Inputs/library.swift
+++ b/test/multifile/typealias/one-module/Inputs/library.swift
@@ -5,3 +5,9 @@
}
public typealias GenericResult<T> = Result<T, Error>
+
+public protocol Rdar46103190 {}
+extension Rdar46103190 {
+ public typealias Alias = String
+ public typealias Map<K: Hashable> = [K: Self]
+}
diff --git a/test/multifile/typealias/one-module/main.swift b/test/multifile/typealias/one-module/main.swift
index 73ca7b4..e7cf483 100644
--- a/test/multifile/typealias/one-module/main.swift
+++ b/test/multifile/typealias/one-module/main.swift
@@ -5,3 +5,18 @@
func testFunction<T>(withCompletion completion: (Result<T, Error>) -> Void) { }
testFunction { (result: GenericResult<Int>) in }
+
+extension Rdar46103190 {
+ public typealias AnotherAlias = Self.Alias
+ public typealias StringMap = Map<String>
+}
+
+typealias Rdar46103190Alias<R: Rdar46103190> = R.Map<String>
+
+struct Rdar46103190Impl: Rdar46103190 {}
+
+func test46103190() {
+ let _: String = Rdar46103190Impl.AnotherAlias()
+ let _: [String: Rdar46103190Impl] = Rdar46103190Impl.StringMap()
+ let _: [String: Rdar46103190Impl] = Rdar46103190Alias()
+}
diff --git a/test/multifile/typealias/two-modules/Inputs/library.swift b/test/multifile/typealias/two-modules/Inputs/library.swift
index 756a569..fdbb5ef 100644
--- a/test/multifile/typealias/two-modules/Inputs/library.swift
+++ b/test/multifile/typealias/two-modules/Inputs/library.swift
@@ -5,3 +5,9 @@
}
public typealias GenericResult<T> = Result<T, Error>
+
+public protocol Rdar46103190 {}
+extension Rdar46103190 {
+ public typealias Alias = String
+ public typealias Map<K: Hashable> = [K: Self]
+}
diff --git a/test/multifile/typealias/two-modules/main.swift b/test/multifile/typealias/two-modules/main.swift
index a48c80a..5fee338 100644
--- a/test/multifile/typealias/two-modules/main.swift
+++ b/test/multifile/typealias/two-modules/main.swift
@@ -14,3 +14,18 @@
func testFunction<T>(withCompletion completion: (Result<T, Error>) -> Void) { }
testFunction { (result: GenericResult<Int>) in }
+
+extension Rdar46103190 {
+ public typealias AnotherAlias = Self.Alias
+ public typealias StringMap = Map<String>
+}
+
+typealias Rdar46103190Alias<R: Rdar46103190> = R.Map<String>
+
+struct Rdar46103190Impl: Rdar46103190 {}
+
+func test46103190() {
+ let _: String = Rdar46103190Impl.AnotherAlias()
+ let _: [String: Rdar46103190Impl] = Rdar46103190Impl.StringMap()
+ let _: [String: Rdar46103190Impl] = Rdar46103190Alias()
+}