Skip to content

Commit b460b4b

Browse files
authored
Merge pull request #21892 from jrose-apple/5.0-re-re-exported-module-cleanup
[5.0] [Serialization] Handle re-export of error enums harder
2 parents e8e7ae6 + 44e0b4c commit b460b4b

File tree

2 files changed

+27
-13
lines changed

2 files changed

+27
-13
lines changed

lib/Serialization/Deserialization.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,21 +1138,20 @@ getActualCtorInitializerKind(uint8_t raw) {
11381138
return None;
11391139
}
11401140

1141-
/// Determine whether the two modules are re-exported to the same module.
1142-
static bool reExportedToSameModule(const ModuleDecl *fromModule,
1143-
const ModuleDecl *toModule) {
1141+
static bool isReExportedToModule(const ValueDecl *value,
1142+
const ModuleDecl *expectedModule) {
1143+
const DeclContext *valueDC = value->getDeclContext();
11441144
auto fromClangModule
1145-
= dyn_cast<ClangModuleUnit>(fromModule->getFiles().front());
1145+
= dyn_cast<ClangModuleUnit>(valueDC->getModuleScopeContext());
11461146
if (!fromClangModule)
11471147
return false;
1148+
std::string exportedName = fromClangModule->getExportedModuleName();
11481149

11491150
auto toClangModule
1150-
= dyn_cast<ClangModuleUnit>(toModule->getFiles().front());
1151-
if (!toClangModule)
1152-
return false;
1153-
1154-
return fromClangModule->getExportedModuleName() ==
1155-
toClangModule->getExportedModuleName();
1151+
= dyn_cast<ClangModuleUnit>(expectedModule->getFiles().front());
1152+
if (toClangModule)
1153+
return exportedName == toClangModule->getExportedModuleName();
1154+
return exportedName == expectedModule->getName().str();
11561155
}
11571156

11581157
/// Remove values from \p values that don't match the expected type or module.
@@ -1195,7 +1194,7 @@ static void filterValues(Type expectedTy, ModuleDecl *expectedModule,
11951194
// module to the original definition in a base module.
11961195
if (expectedModule && !value->hasClangNode() &&
11971196
value->getModuleContext() != expectedModule &&
1198-
!reExportedToSameModule(value->getModuleContext(), expectedModule))
1197+
!isReExportedToModule(value, expectedModule))
11991198
return true;
12001199

12011200
// If we're expecting a member within a constrained extension with a
@@ -1349,6 +1348,7 @@ ModuleFile::resolveCrossReference(ModuleDecl *baseModule, uint32_t pathLen) {
13491348
if (entry.Kind != llvm::BitstreamEntry::Record)
13501349
return Identifier();
13511350

1351+
scratch.clear();
13521352
unsigned recordID = DeclTypeCursor.readRecord(entry.ID, scratch,
13531353
&blobData);
13541354
switch (recordID) {

test/ClangImporter/private_frameworks.swift

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// 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
1313

1414
// Use the overlay without private frameworks.
15-
// 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
15+
// 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
1616

1717
// Build the overlay with public frameworks.
1818
// 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 @@
2121
// 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
2222

2323
// Use the overlay without private frameworks.
24-
// 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
24+
// 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
25+
26+
// Use something that uses the overlay.
27+
// RUN: echo 'import private_frameworks; testErrorConformance()' > %t/main.swift
28+
29+
// 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
30+
// 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
31+
// 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
32+
33+
// 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
34+
// 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
35+
// 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
2536

2637
// REQUIRES: objc_interop
2738

@@ -50,3 +61,6 @@ func testGlobals() {
5061
SomeKit.someKitOtherGlobalFunc()
5162
someKitOtherGlobalFunc()
5263
}
64+
65+
public struct ErrorsOnly<T: Error> {}
66+
public func testErrorConformance(_ code: ErrorsOnly<SKWidget.Error>? = nil) {}

0 commit comments

Comments
 (0)