Skip to content

Commit a7464e9

Browse files
authored
Merge pull request #23511 from jrose-apple/test-tube
Treat "lookup into immediately imported modules" as a special case rdar://problem/48890959
2 parents 8a849b3 + 84e56c0 commit a7464e9

File tree

10 files changed

+409
-188
lines changed

10 files changed

+409
-188
lines changed

lib/AST/ModuleNameLookup.cpp

Lines changed: 362 additions & 182 deletions
Large diffs are not rendered by default.

lib/Sema/NameBinding.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -220,32 +220,37 @@ void NameBinder::addImport(
220220
assert(!M->getFiles().empty() &&
221221
isa<ClangModuleUnit>(M->getFiles().front()));
222222
topLevelModule = M;
223+
} else if (topLevelModule == SF.getParentModule()) {
224+
// This can happen when compiling a mixed-source framework (or overlay)
225+
// that imports a submodule of its C part.
226+
topLevelModule = nullptr;
223227
}
224228
}
225229

226230
auto *testableAttr = ID->getAttrs().getAttribute<TestableAttr>();
227-
if (testableAttr && !topLevelModule->isTestingEnabled() &&
231+
if (testableAttr && topLevelModule &&
232+
!topLevelModule->isTestingEnabled() &&
228233
!topLevelModule->isNonSwiftModule() &&
229234
Context.LangOpts.EnableTestableAttrRequiresTestableModule) {
230235
diagnose(ID->getModulePath().front().second, diag::module_not_testable,
231-
topLevelModule->getName());
236+
ID->getModulePath().front().first);
232237
testableAttr->setInvalid();
233238
}
234239

235240
auto *privateImportAttr = ID->getAttrs().getAttribute<PrivateImportAttr>();
236241
StringRef privateImportFileName;
237242
if (privateImportAttr) {
238-
if (!topLevelModule->arePrivateImportsEnabled()) {
243+
if (!topLevelModule || !topLevelModule->arePrivateImportsEnabled()) {
239244
diagnose(ID->getModulePath().front().second,
240245
diag::module_not_compiled_for_private_import,
241-
topLevelModule->getName());
246+
ID->getModulePath().front().first);
242247
privateImportAttr->setInvalid();
243248
} else {
244249
privateImportFileName = privateImportAttr->getSourceFile();
245250
}
246251
}
247252

248-
if (SF.getParentModule()->isResilient() &&
253+
if (SF.getParentModule()->isResilient() && topLevelModule &&
249254
!topLevelModule->isResilient() &&
250255
!topLevelModule->isNonSwiftModule() &&
251256
!ID->getAttrs().hasAttribute<ImplementationOnlyAttr>()) {
@@ -277,7 +282,7 @@ void NameBinder::addImport(
277282
imports.push_back(SourceFile::ImportedModuleDesc(
278283
{ID->getDeclPath(), M}, options, privateImportFileName));
279284

280-
if (topLevelModule != M)
285+
if (topLevelModule && topLevelModule != M)
281286
imports.push_back(SourceFile::ImportedModuleDesc(
282287
{ID->getDeclPath(), topLevelModule}, options, privateImportFileName));
283288

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
extern void topLevel();
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
extern void fromSubmodule();
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module Mixed {
2+
header "Mixed.h"
3+
export *
4+
5+
explicit module Submodule {
6+
header "Submodule.h"
7+
export *
8+
}
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -verify -I %S/Inputs/submodule -module-name Mixed %s
2+
3+
@_exported import Mixed
4+
@_exported import Mixed.Submodule
5+
6+
func test() {
7+
_ = topLevel()
8+
_ = fromSubmodule()
9+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
internal func t1() {}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
internal func t2() {}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
@_exported import TestableVersusIndirect1
2+
@_exported import TestableVersusIndirect2
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-swift-frontend -emit-module -enable-testing -o %t/TestableVersusIndirect1.swiftmodule %S/Inputs/TestableVersusIndirect1.swift
3+
// RUN: %target-swift-frontend -emit-module -enable-testing -o %t/TestableVersusIndirect2.swiftmodule %S/Inputs/TestableVersusIndirect2.swift
4+
// RUN: %target-swift-frontend -emit-module -I %t -o %t/TestableVersusIndirectImporter.swiftmodule %S/Inputs/TestableVersusIndirectImporter.swift
5+
// RUN: %target-swift-frontend -typecheck -I %t %s
6+
7+
@testable import TestableVersusIndirect1
8+
import TestableVersusIndirectImporter
9+
@testable import TestableVersusIndirect2
10+
11+
t1()
12+
t2()

0 commit comments

Comments
 (0)