Skip to content

Commit ad77857

Browse files
committed
Disable preserve-types when using module selectors
The old `-module-interface-preserve-types-as-written` workaround flag prevents module selectors from being printed into module interfaces even when they have been explicitly requested. Disable it and emit a warning when it’s used in combination with `-enable-module-selectors-in-module-interface`. Fixes rdar://166237384.
1 parent ef1470b commit ad77857

File tree

2 files changed

+62
-7
lines changed

2 files changed

+62
-7
lines changed

lib/Frontend/CompilerInvocation.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,13 @@ static void ParseModuleInterfaceArgs(ModuleInterfaceOptions &Opts,
576576
// Any heuristics we might add would go here.
577577
Opts.UseModuleSelectors = false;
578578
}
579+
580+
if (Opts.PreserveTypesAsWritten && Opts.UseModuleSelectors) {
581+
Opts.PreserveTypesAsWritten = false;
582+
diags.diagnose(SourceLoc(), diag::warn_ignore_option_overridden_by,
583+
"-module-interface-preserve-types-as-written",
584+
"-enable-module-selectors-in-module-interface");
585+
}
579586
}
580587

581588
/// Checks if an arg is generally allowed to be included

test/ModuleInterface/module_selector.swift

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,43 +2,65 @@
22

33
// Test with -enable-module-selectors-in-module-interface
44
// RUN: %empty-directory(%t/enabled)
5-
// RUN: %target-swift-emit-module-interface(%t/enabled/TestCase.swiftinterface) %s %clang-importer-sdk -F %clang-importer-sdk-path/frameworks -I %S/Inputs/module_selector -target %target-stable-abi-triple -module-name TestCase -enable-module-selectors-in-module-interface
5+
// RUN: %target-swift-emit-module-interface(%t/enabled/TestCase.swiftinterface) %s %clang-importer-sdk -F %clang-importer-sdk-path/frameworks -I %S/Inputs/module_selector -target %target-stable-abi-triple -module-name TestCase -enable-module-selectors-in-module-interface 2>%t/enabled/stderr.txt
66
// RUN: %FileCheck --input-file %t/enabled/TestCase.swiftinterface %s --check-prefixes CHECK,CHECK-ENABLED
7+
// RUN: %FileCheck --input-file %t/enabled/stderr.txt %s --allow-empty --check-prefix DIAG-PRESERVE-NOT-OVERRIDDEN
78
// RUN: %target-swift-typecheck-module-from-interface(%t/enabled/TestCase.swiftinterface) %clang-importer-sdk -F %clang-importer-sdk-path/frameworks -I %S/Inputs/module_selector -target %target-stable-abi-triple -module-name TestCase
89

910
// Test with -disable-module-selectors-in-module-interface
1011
// RUN: %empty-directory(%t/disabled)
11-
// RUN: %target-swift-emit-module-interface(%t/disabled/TestCase.swiftinterface) %s %clang-importer-sdk -F %clang-importer-sdk-path/frameworks -I %S/Inputs/module_selector -target %target-stable-abi-triple -module-name TestCase -disable-module-selectors-in-module-interface
12+
// RUN: %target-swift-emit-module-interface(%t/disabled/TestCase.swiftinterface) %s %clang-importer-sdk -F %clang-importer-sdk-path/frameworks -I %S/Inputs/module_selector -target %target-stable-abi-triple -module-name TestCase -disable-module-selectors-in-module-interface 2>%t/disabled/stderr.txt
1213
// RUN: %FileCheck --input-file %t/disabled/TestCase.swiftinterface %s --check-prefixes CHECK,CHECK-DISABLED
14+
// RUN: %FileCheck --input-file %t/disabled/stderr.txt %s --allow-empty --check-prefix DIAG-PRESERVE-NOT-OVERRIDDEN
1315
// RUN: %target-swift-typecheck-module-from-interface(%t/disabled/TestCase.swiftinterface) %clang-importer-sdk -F %clang-importer-sdk-path/frameworks -I %S/Inputs/module_selector -target %target-stable-abi-triple -module-name TestCase
1416

1517
// Test default behavior
1618
// RUN: %empty-directory(%t/default)
17-
// RUN: %target-swift-emit-module-interface(%t/default/TestCase.swiftinterface) %s %clang-importer-sdk -F %clang-importer-sdk-path/frameworks -I %S/Inputs/module_selector -target %target-stable-abi-triple -module-name TestCase
19+
// RUN: %target-swift-emit-module-interface(%t/default/TestCase.swiftinterface) %s %clang-importer-sdk -F %clang-importer-sdk-path/frameworks -I %S/Inputs/module_selector -target %target-stable-abi-triple -module-name TestCase 2>%t/default/stderr.txt
1820
// RUN: %FileCheck --input-file %t/default/TestCase.swiftinterface %s --check-prefixes CHECK,CHECK-DISABLED
21+
// RUN: %FileCheck --input-file %t/default/stderr.txt %s --allow-empty --check-prefix DIAG-PRESERVE-NOT-OVERRIDDEN
1922
// RUN: %target-swift-typecheck-module-from-interface(%t/default/TestCase.swiftinterface) %clang-importer-sdk -F %clang-importer-sdk-path/frameworks -I %S/Inputs/module_selector -target %target-stable-abi-triple -module-name TestCase
2023

2124
// Test with -enable-module-selectors-in-module-interface and blocklist
2225
// RUN: %empty-directory(%t/blocked)
23-
// RUN: %target-swift-emit-module-interface(%t/blocked/TestCase.swiftinterface) %s %clang-importer-sdk -F %clang-importer-sdk-path/frameworks -I %S/Inputs/module_selector -target %target-stable-abi-triple -module-name TestCase -enable-module-selectors-in-module-interface -blocklist-file %S/Inputs/module_selector/blocklist.yml
26+
// RUN: %target-swift-emit-module-interface(%t/blocked/TestCase.swiftinterface) %s %clang-importer-sdk -F %clang-importer-sdk-path/frameworks -I %S/Inputs/module_selector -target %target-stable-abi-triple -module-name TestCase -enable-module-selectors-in-module-interface -blocklist-file %S/Inputs/module_selector/blocklist.yml 2>%t/blocked/stderr.txt
2427
// RUN: %FileCheck --input-file %t/blocked/TestCase.swiftinterface %s --check-prefixes CHECK,CHECK-DISABLED
28+
// RUN: %FileCheck --input-file %t/blocked/stderr.txt %s --allow-empty --check-prefix DIAG-PRESERVE-NOT-OVERRIDDEN
2529
// RUN: %target-swift-typecheck-module-from-interface(%t/blocked/TestCase.swiftinterface) %clang-importer-sdk -F %clang-importer-sdk-path/frameworks -I %S/Inputs/module_selector -target %target-stable-abi-triple -module-name TestCase
2630

31+
// Test with -module-interface-preserve-types-as-written and -disable-module-selectors-in-module-interface
32+
// RUN: %empty-directory(%t/disabled-preserve)
33+
// RUN: %target-swift-emit-module-interface(%t/disabled-preserve/TestCase.swiftinterface) %s %clang-importer-sdk -F %clang-importer-sdk-path/frameworks -I %S/Inputs/module_selector -target %target-stable-abi-triple -module-name TestCase -module-interface-preserve-types-as-written -disable-module-selectors-in-module-interface 2>%t/disabled-preserve/stderr.txt
34+
// RUN: %FileCheck --input-file %t/disabled-preserve/TestCase.swiftinterface %s --check-prefixes CHECK,CHECK-PRESERVE
35+
// RUN: %FileCheck --input-file %t/disabled-preserve/stderr.txt %s --allow-empty --check-prefix DIAG-PRESERVE-NOT-OVERRIDDEN
36+
// RUN: %target-swift-typecheck-module-from-interface(%t/disabled-preserve/TestCase.swiftinterface) %clang-importer-sdk -F %clang-importer-sdk-path/frameworks -I %S/Inputs/module_selector -target %target-stable-abi-triple -module-name TestCase
37+
38+
// Test with -module-interface-preserve-types-as-written and -enable-module-selectors-in-module-interface
39+
// RUN: %empty-directory(%t/enabled-preserve)
40+
// RUN: %target-swift-emit-module-interface(%t/enabled-preserve/TestCase.swiftinterface) %s %clang-importer-sdk -F %clang-importer-sdk-path/frameworks -I %S/Inputs/module_selector -target %target-stable-abi-triple -module-name TestCase -module-interface-preserve-types-as-written -enable-module-selectors-in-module-interface 2>%t/enabled-preserve/stderr.txt
41+
// RUN: %FileCheck --input-file %t/enabled-preserve/TestCase.swiftinterface %s --check-prefixes CHECK,CHECK-ENABLED
42+
// RUN: %FileCheck --input-file %t/enabled-preserve/stderr.txt %s --check-prefix DIAG-PRESERVE-OVERRIDDEN
43+
// RUN: %target-swift-typecheck-module-from-interface(%t/enabled-preserve/TestCase.swiftinterface) %clang-importer-sdk -F %clang-importer-sdk-path/frameworks -I %S/Inputs/module_selector -target %target-stable-abi-triple -module-name TestCase
44+
2745
// CHECK: import enums_using_attributes
2846
import enums_using_attributes
2947

3048
// CHECK-LABEL: public struct Struct<T> :
3149
// CHECK-ENABLED-SAME: Swift::Hashable where T : Swift::Hashable {
3250
// CHECK-DISABLED-SAME: Swift.Hashable where T : Swift.Hashable {
51+
// CHECK-PRESERVE-SAME: Hashable where T : Swift.Hashable {
52+
// Preserve quirk: Hashable qualified in constraint?
3353
public struct Struct<T: Hashable>: Hashable {
3454
// CHECK: public let integer:
3555
// CHECK-ENABLED-SAME: Swift::Int
3656
// CHECK-DISABLED-SAME: Swift.Int
57+
// CHECK-PRESERVE-SAME: Int
3758
public let integer: Int = 42
3859

3960
// CHECK: public let enumeration:
4061
// CHECK-ENABLED-SAME: enums_using_attributes::CFEnumWithAttr
4162
// CHECK-DISABLED-SAME: enums_using_attributes.CFEnumWithAttr
63+
// CHECK-PRESERVE-SAME: CFEnumWithAttr
4264
public let enumeration: CFEnumWithAttr = CFEnumWithAttr.first
4365

4466
// CHECK: public let t: T?
@@ -47,31 +69,37 @@ public struct Struct<T: Hashable>: Hashable {
4769
// CHECK: public static func ==
4870
// CHECK-ENABLED-SAME: (a: TestCase::Struct<T>, b: TestCase::Struct<T>) -> Swift::Bool
4971
// CHECK-DISABLED-SAME: (a: TestCase.Struct<T>, b: TestCase.Struct<T>) -> Swift.Bool
72+
// CHECK-PRESERVE-SAME: (a: TestCase.Struct<T>, b: TestCase.Struct<T>) -> Swift.Bool
5073

5174
// CHECK: public func hash
5275
// CHECK-ENABLED-SAME: (into hasher: inout Swift::Hasher)
5376
// CHECK-DISABLED-SAME: (into hasher: inout Swift.Hasher)
77+
// CHECK-PRESERVE-SAME: (into hasher: inout Swift.Hasher)
5478

5579
// CHECK: public var hashValue:
5680
// CHECK-ENABLED-SAME: Swift::Int {
5781
// CHECK-DISABLED-SAME: Swift.Int {
82+
// CHECK-PRESERVE-SAME: Swift.Int {
5883

5984
// CHECK: }
6085
}
6186

6287
// CHECK-ENABLED: extension TestCase::Struct {
6388
// CHECK-DISABLED: extension TestCase.Struct {
89+
// CHECK-PRESERVE: extension Struct {
6490
extension Struct {
6591
// CHECK-LABEL: public enum Nested {
6692
public enum Nested {
6793
// CHECK: case integer
6894
// CHECK-ENABLED-SAME: (Swift::Int)
6995
// CHECK-DISABLED-SAME: (Swift.Int)
96+
// CHECK-PRESERVE-SAME: (Int)
7097
case integer(Int)
7198

7299
// CHECK: case enumeration
73100
// CHECK-ENABLED-SAME: (enums_using_attributes::CFEnumWithAttr)
74101
// CHECK-DISABLED-SAME: (enums_using_attributes.CFEnumWithAttr)
102+
// CHECK-PRESERVE-SAME: (CFEnumWithAttr)
75103
case enumeration(CFEnumWithAttr)
76104

77105
// CHECK: case t(T)
@@ -80,6 +108,7 @@ extension Struct {
80108
// CHECK: case `struct`
81109
// CHECK-ENABLED-SAME: (TestCase::Struct<T>)
82110
// CHECK-DISABLED-SAME: (TestCase.Struct<T>)
111+
// CHECK-PRESERVE-SAME: (Struct)
83112
case `struct`(Struct)
84113

85114
// CHECK: }
@@ -90,25 +119,31 @@ extension Struct {
90119

91120
// CHECK-ENABLED: extension Swift::Int {
92121
// CHECK-DISABLED: extension Swift.Int {
122+
// CHECK-PRESERVE: extension Int {
123+
// Preserve quirk: Int has no module selector?
93124
extension Swift::Int {
94125
// CHECK-LABEL: public enum RetroactiveNested {
95126
public enum RetroactiveNested {}
96127
}
97128

98129
// CHECK-ENABLED: extension Swift::Int.TestCase::RetroactiveNested {
99130
// CHECK-DISABLED: extension Swift.Int.RetroactiveNested {
131+
// CHECK-PRESERVE: extension Int.RetroactiveNested {
100132
extension Int.RetroactiveNested {
101133
public func anchor() {}
102134
}
103135

104136
// CHECK-LABEL: public func fn<T>
105137
// CHECK-ENABLED-SAME: (_: TestCase::Struct<T>, _: TestCase::Struct<T>.TestCase::Nested)
106138
// CHECK-DISABLED-SAME: (_: TestCase.Struct<T>, _: TestCase.Struct<T>.Nested)
139+
// CHECK-PRESERVE-SAME: (_: Struct<T>, _: Struct<T>.Nested)
107140
public func fn<T: Hashable>(_: Struct<T>, _: Struct<T>.Nested) {}
108141

109142
// CHECK-LABEL: public func fn2<T>
110143
// CHECK-ENABLED-SAME: (_: T) where T : Swift::Identifiable, T.ID == TestCase::Struct<Swift::Int>
111144
// CHECK-DISABLED-SAME: (_: T) where T : Swift.Identifiable, T.ID == TestCase.Struct<Swift.Int>
145+
// CHECK-PRESERVE-SAME: (_: T) where T : Swift.Identifiable, T.ID == TestCase.Struct<Swift.Int>
146+
// Preserve quirk: Still qualified in constraints?
112147
@available(SwiftStdlib 5.1, *)
113148
public func fn2<T: Identifiable>(_: T) where T.ID == Struct<Int> {}
114149

@@ -118,22 +153,31 @@ public protocol Proto {
118153
// CHECK: associatedtype AssocType :
119154
// CHECK-ENABLED-SAME: Swift::Identifiable
120155
// CHECK-DISABLED-SAME: Swift.Identifiable
156+
// CHECK-PRESERVE-SAME: Identifiable
121157
associatedtype AssocType: Identifiable
122158

123159
// CHECK: typealias TypeAlias =
124160
// CHECK-ENABLED-SAME: TestCase::Struct<Swift::Int>
125161
// CHECK-DISABLED-SAME: TestCase.Struct<Swift.Int>
162+
// CHECK-PRESERVE-SAME: Struct<Int>
126163
typealias TypeAlias = Struct<Int>
127164

128165
// CHECK: typealias ID =
129-
// CHECK-SAME: Self.AssocType.ID
166+
// CHECK-ENABLED-SAME: Self.AssocType.ID
167+
// CHECK-DISABLED-SAME: Self.AssocType.ID
168+
// CHECK-PRESERVE-SAME: AssocType.ID
130169
typealias ID = AssocType.ID
131170

132-
// CHECK: func requirement() -> Self.AssocType.ID
171+
// CHECK: func requirement() ->
172+
// CHECK-ENABLED-SAME: Self.AssocType.ID
173+
// CHECK-DISABLED-SAME: Self.AssocType.ID
174+
// CHECK-PRESERVE-SAME: AssocType.ID
133175
func requirement() -> AssocType.ID
134176

135177
// CHECK: func requirement2() ->
136-
// CHECK-SAME: Self.TypeAlias.Nested
178+
// CHECK-ENABLED-SAME: Self.TypeAlias.Nested
179+
// CHECK-DISABLED-SAME: Self.TypeAlias.Nested
180+
// CHECK-PRESERVE-SAME: TypeAlias.Nested
137181
func requirement2() -> TypeAlias.Nested
138182

139183
// CHECK: }
@@ -157,15 +201,19 @@ public struct ProtoSet<T: Proto> {
157201
// CHECK: let ids:
158202
// CHECK-ENABLED-SAME: Swift::Set<T.ID>
159203
// CHECK-DISABLED-SAME: Swift.Set<T.ID>
204+
// CHECK-PRESERVE-SAME: Set<T.ID>
160205
public let ids: Set<T.ID>
161206

162207
// CHECK: let texts:
163208
// CHECK-ENABLED-SAME: Swift::Set<T.Text>
164209
// CHECK-DISABLED-SAME: Swift.Set<T.Text>
210+
// CHECK-PRESERVE-SAME: Set<T.Text>
165211
public let texts: Set<T.Text>
166212

167213
// CHECK: let singleText:
168214
// CHECK-SAME: T.Text
169215
public let singleText: T.Text
170216
}
171217

218+
// DIAG-PRESERVE-OVERRIDDEN: warning: ignoring -module-interface-preserve-types-as-written (overridden by -enable-module-selectors-in-module-interface)
219+
// DIAG-PRESERVE-NOT-OVERRIDDEN-NOT: warning: ignoring -module-interface-preserve-types-as-written (overridden by -enable-module-selectors-in-module-interface)

0 commit comments

Comments
 (0)