Skip to content

Commit 8ef0952

Browse files
committed
Error on duplicate module names in Swift module maps
Duplicate module names on search paths produces an error, but providing duplicate module names in a Swift explicit module map file does not, instead the first entry will be chosen. Modify the module map parser to error on duplicated module names as well.
1 parent 6a6cc48 commit 8ef0952

File tree

2 files changed

+122
-4
lines changed

2 files changed

+122
-4
lines changed

include/swift/Frontend/ModuleInterfaceLoader.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,7 @@ class ExplicitModuleMapParser {
414414
if (moduleName.empty())
415415
return true;
416416

417+
bool didInsert;
417418
if (swiftModulePath.has_value()) {
418419
assert((clangModuleMapPath.empty() &&
419420
clangModulePath.empty()) &&
@@ -425,7 +426,7 @@ class ExplicitModuleMapParser {
425426
isFramework,
426427
isSystem,
427428
swiftModuleCacheKey);
428-
swiftModuleMap.try_emplace(moduleName, std::move(entry));
429+
didInsert = swiftModuleMap.try_emplace(moduleName, std::move(entry)).second;
429430
} else {
430431
assert((!clangModuleMapPath.empty() ||
431432
!clangModulePath.empty()) &&
@@ -436,10 +437,10 @@ class ExplicitModuleMapParser {
436437
isSystem,
437438
isBridgingHeaderDependency,
438439
clangModuleCacheKey);
439-
clangModuleMap.try_emplace(moduleName, std::move(entry));
440+
didInsert = clangModuleMap.try_emplace(moduleName, std::move(entry)).second;
440441
}
441-
442-
return false;
442+
// Prevent duplicate module names.
443+
return !didInsert;
443444
}
444445

445446
llvm::StringSaver Saver;
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
// UNSUPPORTED: OS=windows-msvc
2+
// RUN: %empty-directory(%t)
3+
// RUN: mkdir -p %t/clang-module-cache
4+
// RUN: mkdir -p %t/inputs
5+
// RUN: echo "public func foo() {}" >> %t/foo.swift
6+
// RUN: %target-swift-frontend -emit-module -emit-module-path %t/inputs/Foo.swiftmodule -emit-module-doc-path %t/inputs/Foo.swiftdoc -emit-module-source-info -emit-module-source-info-path %t/inputs/Foo.swiftsourceinfo -module-cache-path %t.module-cache %t/foo.swift -module-name Foo
7+
// RUN: %target-swift-emit-pcm -module-name SwiftShims %swift-lib-dir/swift/shims/module.modulemap -o %t/inputs/SwiftShims.pcm
8+
// RUN: %target-swift-emit-pcm -module-name _SwiftConcurrencyShims %swift-lib-dir/swift/shims/module.modulemap -o %t/inputs/_SwiftConcurrencyShims.pcm
9+
10+
// RUN: echo "[{" > %/t/inputs/map_with_duped_swift_module.json
11+
// RUN: echo "\"moduleName\": \"Foo\"," >> %/t/inputs/map_with_duped_swift_module.json
12+
// RUN: echo "\"modulePath\": \"%/t/inputs/Foo.swiftmodule\"," >> %/t/inputs/map_with_duped_swift_module.json
13+
// RUN: echo "\"docPath\": \"%/t/inputs/Foo.swiftdoc\"," >> %/t/inputs/map_with_duped_swift_module.json
14+
// RUN: echo "\"sourceInfoPath\": \"%/t/inputs/Foo.swiftsourceinfo\"," >> %/t/inputs/map_with_duped_swift_module.json
15+
// RUN: echo "\"isFramework\": false" >> %/t/inputs/map_with_duped_swift_module.json
16+
// RUN: echo "}," >> %/t/inputs/map_with_duped_swift_module.json
17+
// RUN: echo "{" >> %/t/inputs/map_with_duped_swift_module.json
18+
// RUN: echo "\"moduleName\": \"Swift\"," >> %/t/inputs/map_with_duped_swift_module.json
19+
// RUN: echo "\"modulePath\": \"%/stdlib_module\"," >> %/t/inputs/map_with_duped_swift_module.json
20+
// RUN: echo "\"isFramework\": false" >> %/t/inputs/map_with_duped_swift_module.json
21+
// RUN: echo "}," >> %/t/inputs/map_with_duped_swift_module.json
22+
// RUN: echo "{" >> %/t/inputs/map_with_duped_swift_module.json
23+
// RUN: echo "\"moduleName\": \"Swift\"," >> %/t/inputs/map_with_duped_swift_module.json
24+
// RUN: echo "\"modulePath\": \"%/stdlib_module\"," >> %/t/inputs/map_with_duped_swift_module.json
25+
// RUN: echo "\"isFramework\": false" >> %/t/inputs/map_with_duped_swift_module.json
26+
// RUN: echo "}," >> %/t/inputs/map_with_duped_swift_module.json
27+
// RUN: echo "{" >> %/t/inputs/map_with_duped_swift_module.json
28+
// RUN: echo "\"moduleName\": \"SwiftOnoneSupport\"," >> %/t/inputs/map_with_duped_swift_module.json
29+
// RUN: echo "\"modulePath\": \"%/ononesupport_module\"," >> %/t/inputs/map_with_duped_swift_module.json
30+
// RUN: echo "\"isFramework\": false" >> %/t/inputs/map_with_duped_swift_module.json
31+
// RUN: echo "}," >> %/t/inputs/map_with_duped_swift_module.json
32+
// RUN: echo "{" >> %/t/inputs/map_with_duped_swift_module.json
33+
// RUN: echo "\"moduleName\": \"_Concurrency\"," >> %/t/inputs/map_with_duped_swift_module.json
34+
// RUN: echo "\"modulePath\": \"%/concurrency_module\"," >> %/t/inputs/map_with_duped_swift_module.json
35+
// RUN: echo "\"isFramework\": false" >> %/t/inputs/map_with_duped_swift_module.json
36+
// RUN: echo "}," >> %/t/inputs/map_with_duped_swift_module.json
37+
// RUN: echo "{" >> %/t/inputs/map_with_duped_swift_module.json
38+
// RUN: echo "\"moduleName\": \"_StringProcessing\"," >> %/t/inputs/map_with_duped_swift_module.json
39+
// RUN: echo "\"modulePath\": \"%/string_processing_module\"," >> %/t/inputs/map_with_duped_swift_module.json
40+
// RUN: echo "\"isFramework\": false" >> %/t/inputs/map_with_duped_swift_module.json
41+
// RUN: echo "}," >> %/t/inputs/map_with_duped_swift_module.json
42+
// RUN: echo "{" >> %/t/inputs/map_with_duped_swift_module.json
43+
// RUN: echo "\"moduleName\": \"SwiftShims\"," >> %/t/inputs/map_with_duped_swift_module.json
44+
// RUN: echo "\"isFramework\": false," >> %/t/inputs/map_with_duped_swift_module.json
45+
// RUN: echo "\"clangModuleMapPath\": \"%swift-lib-dir/swift/shims/module.modulemap\"," >> %/t/inputs/map_with_duped_swift_module.json
46+
// RUN: echo "\"clangModulePath\": \"%t/inputs/SwiftShims.pcm\"" >> %/t/inputs/map_with_duped_swift_module.json
47+
// RUN: echo "}," >> %/t/inputs/map_with_duped_swift_module.json
48+
// RUN: echo "{" >> %/t/inputs/map_with_duped_swift_module.json
49+
// RUN: echo "\"moduleName\": \"_SwiftConcurrencyShims\"," >> %/t/inputs/map_with_duped_swift_module.json
50+
// RUN: echo "\"isFramework\": false," >> %/t/inputs/map_with_duped_swift_module.json
51+
// RUN: echo "\"clangModuleMapPath\": \"%swift-lib-dir/swift/shims/module.modulemap\"," >> %/t/inputs/map_with_duped_swift_module.json
52+
// RUN: echo "\"clangModulePath\": \"%t/inputs/_SwiftConcurrencyShims.pcm\"" >> %/t/inputs/map_with_duped_swift_module.json
53+
// RUN: echo "}," >> %/t/inputs/map_with_duped_swift_module.json
54+
// RUN: echo "{" >> %/t/inputs/map_with_duped_swift_module.json
55+
// RUN: echo "\"moduleName\": \"Distributed\"," >> %/t/inputs/map_with_duped_swift_module.json
56+
// RUN: echo "\"modulePath\": \"%/distributed_module\"," >> %/t/inputs/map_with_duped_swift_module.json
57+
// RUN: echo "\"isFramework\": false" >> %/t/inputs/map_with_duped_swift_module.json
58+
// RUN: echo "}]" >> %/t/inputs/map_with_duped_swift_module.json
59+
60+
// RUN: not %target-swift-frontend -typecheck %s -explicit-swift-module-map-file %t/inputs/map_with_duped_swift_module.json -disable-implicit-swift-modules -disable-implicit-concurrency-module-import
61+
62+
// RUN: echo "[{" > %/t/inputs/map_with_duped_clang_module.json
63+
// RUN: echo "\"moduleName\": \"Foo\"," >> %/t/inputs/map_with_duped_clang_module.json
64+
// RUN: echo "\"modulePath\": \"%/t/inputs/Foo.swiftmodule\"," >> %/t/inputs/map_with_duped_clang_module.json
65+
// RUN: echo "\"docPath\": \"%/t/inputs/Foo.swiftdoc\"," >> %/t/inputs/map_with_duped_clang_module.json
66+
// RUN: echo "\"sourceInfoPath\": \"%/t/inputs/Foo.swiftsourceinfo\"," >> %/t/inputs/map_with_duped_clang_module.json
67+
// RUN: echo "\"isFramework\": false" >> %/t/inputs/map_with_duped_clang_module.json
68+
// RUN: echo "}," >> %/t/inputs/map_with_duped_clang_module.json
69+
// RUN: echo "{" >> %/t/inputs/map_with_duped_clang_module.json
70+
// RUN: echo "\"moduleName\": \"Swift\"," >> %/t/inputs/map_with_duped_clang_module.json
71+
// RUN: echo "\"modulePath\": \"%/stdlib_module\"," >> %/t/inputs/map_with_duped_clang_module.json
72+
// RUN: echo "\"isFramework\": false" >> %/t/inputs/map_with_duped_clang_module.json
73+
// RUN: echo "}," >> %/t/inputs/map_with_duped_clang_module.json
74+
// RUN: echo "{" >> %/t/inputs/map_with_duped_clang_module.json
75+
// RUN: echo "\"moduleName\": \"SwiftOnoneSupport\"," >> %/t/inputs/map_with_duped_clang_module.json
76+
// RUN: echo "\"modulePath\": \"%/ononesupport_module\"," >> %/t/inputs/map_with_duped_clang_module.json
77+
// RUN: echo "\"isFramework\": false" >> %/t/inputs/map_with_duped_clang_module.json
78+
// RUN: echo "}," >> %/t/inputs/map_with_duped_clang_module.json
79+
// RUN: echo "{" >> %/t/inputs/map_with_duped_clang_module.json
80+
// RUN: echo "\"moduleName\": \"_Concurrency\"," >> %/t/inputs/map_with_duped_clang_module.json
81+
// RUN: echo "\"modulePath\": \"%/concurrency_module\"," >> %/t/inputs/map_with_duped_clang_module.json
82+
// RUN: echo "\"isFramework\": false" >> %/t/inputs/map_with_duped_clang_module.json
83+
// RUN: echo "}," >> %/t/inputs/map_with_duped_clang_module.json
84+
// RUN: echo "{" >> %/t/inputs/map_with_duped_clang_module.json
85+
// RUN: echo "\"moduleName\": \"_StringProcessing\"," >> %/t/inputs/map_with_duped_clang_module.json
86+
// RUN: echo "\"modulePath\": \"%/string_processing_module\"," >> %/t/inputs/map_with_duped_clang_module.json
87+
// RUN: echo "\"isFramework\": false" >> %/t/inputs/map_with_duped_clang_module.json
88+
// RUN: echo "}," >> %/t/inputs/map_with_duped_clang_module.json
89+
// RUN: echo "{" >> %/t/inputs/map_with_duped_clang_module.json
90+
// RUN: echo "\"moduleName\": \"SwiftShims\"," >> %/t/inputs/map_with_duped_clang_module.json
91+
// RUN: echo "\"isFramework\": false," >> %/t/inputs/map_with_duped_clang_module.json
92+
// RUN: echo "\"clangModuleMapPath\": \"%swift-lib-dir/swift/shims/module.modulemap\"," >> %/t/inputs/map_with_duped_clang_module.json
93+
// RUN: echo "\"clangModulePath\": \"%t/inputs/SwiftShims.pcm\"" >> %/t/inputs/map_with_duped_clang_module.json
94+
// RUN: echo "}," >> %/t/inputs/map_with_duped_clang_module.json
95+
// RUN: echo "{" >> %/t/inputs/map_with_duped_clang_module.json
96+
// RUN: echo "\"moduleName\": \"SwiftShims\"," >> %/t/inputs/map_with_duped_clang_module.json
97+
// RUN: echo "\"isFramework\": false," >> %/t/inputs/map_with_duped_clang_module.json
98+
// RUN: echo "\"clangModuleMapPath\": \"%swift-lib-dir/swift/shims/module.modulemap\"," >> %/t/inputs/map_with_duped_clang_module.json
99+
// RUN: echo "\"clangModulePath\": \"%t/inputs/SwiftShims.pcm\"" >> %/t/inputs/map_with_duped_clang_module.json
100+
// RUN: echo "}," >> %/t/inputs/map_with_duped_clang_module.json
101+
// RUN: echo "{" >> %/t/inputs/map_with_duped_clang_module.json
102+
// RUN: echo "\"moduleName\": \"_SwiftConcurrencyShims\"," >> %/t/inputs/map_with_duped_clang_module.json
103+
// RUN: echo "\"isFramework\": false," >> %/t/inputs/map_with_duped_clang_module.json
104+
// RUN: echo "\"clangModuleMapPath\": \"%swift-lib-dir/swift/shims/module.modulemap\"," >> %/t/inputs/map_with_duped_clang_module.json
105+
// RUN: echo "\"clangModulePath\": \"%t/inputs/_SwiftConcurrencyShims.pcm\"" >> %/t/inputs/map_with_duped_clang_module.json
106+
// RUN: echo "}," >> %/t/inputs/map_with_duped_clang_module.json
107+
// RUN: echo "{" >> %/t/inputs/map_with_duped_clang_module.json
108+
// RUN: echo "\"moduleName\": \"Distributed\"," >> %/t/inputs/map_with_duped_clang_module.json
109+
// RUN: echo "\"modulePath\": \"%/distributed_module\"," >> %/t/inputs/map_with_duped_clang_module.json
110+
// RUN: echo "\"isFramework\": false" >> %/t/inputs/map_with_duped_clang_module.json
111+
// RUN: echo "}]" >> %/t/inputs/map_with_duped_clang_module.json
112+
113+
// RUN: not %target-swift-frontend -typecheck %s -explicit-swift-module-map-file %t/inputs/map_with_duped_clang_module.json -disable-implicit-swift-modules -disable-implicit-concurrency-module-import
114+
115+
#if canImport(Foo)
116+
import Foo
117+
#endif

0 commit comments

Comments
 (0)