Skip to content

Commit 88d9fe6

Browse files
authored
Merge pull request swiftlang#83799 from tshortli/obsolete-in-version-of-swift-ambiguity
AST: Allow obsoletion in Swift version to disambiguate overloads consistently
2 parents b8df3c8 + 5ae0ad6 commit 88d9fe6

File tree

3 files changed

+69
-54
lines changed

3 files changed

+69
-54
lines changed

lib/AST/AvailabilityConstraint.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -155,20 +155,20 @@ static bool canIgnoreConstraintInUnavailableContexts(
155155
const AvailabilityConstraintFlags flags) {
156156
auto domain = constraint.getDomain();
157157

158-
switch (constraint.getReason()) {
159-
case AvailabilityConstraint::Reason::UnavailableUnconditionally:
160-
if (flags.contains(AvailabilityConstraintFlag::
161-
AllowUniversallyUnavailableInCompatibleContexts))
162-
return true;
163-
164-
// Always reject uses of universally unavailable declarations, regardless
165-
// of context, since there are no possible compilation configurations in
166-
// which they are available. However, make an exception for types and
167-
// conformances, which can sometimes be awkward to avoid references to.
158+
// Always reject uses of universally unavailable declarations, regardless
159+
// of context, since there are no possible compilation configurations in
160+
// which they are available. However, make an exception for types and
161+
// conformances, which can sometimes be awkward to avoid references to.
162+
if (!flags.contains(AvailabilityConstraintFlag::
163+
AllowUniversallyUnavailableInCompatibleContexts)) {
168164
if (!isa<TypeDecl>(decl) && !isa<ExtensionDecl>(decl)) {
169165
if (domain.isUniversal() || domain.isSwiftLanguage())
170166
return false;
171167
}
168+
}
169+
170+
switch (constraint.getReason()) {
171+
case AvailabilityConstraint::Reason::UnavailableUnconditionally:
172172
return true;
173173

174174
case AvailabilityConstraint::Reason::Unintroduced:

test/SILGen/availability_overloads.swift

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,19 +52,34 @@ public class BeforeAndAfter {
5252

5353

5454
// Make sure we can generate calls to these overloads, too
55-
_ = BeforeAndAfter(foo: ())
56-
_ = try BeforeAndAfter()
57-
_ = try BeforeAndAfter.foo()
58-
_ = BeforeAndAfter.computed
59-
BeforeAndAfter.computed = 10
60-
_ = try BeforeAndAfter().computed
61-
try BeforeAndAfter().computed = 10
55+
public func testLocal() throws {
56+
_ = BeforeAndAfter(foo: ())
57+
_ = try BeforeAndAfter()
58+
_ = try BeforeAndAfter.foo()
59+
_ = BeforeAndAfter.computed
60+
BeforeAndAfter.computed = 10
61+
_ = try BeforeAndAfter().computed
62+
try BeforeAndAfter().computed = 10
63+
}
64+
65+
@available(swift, obsoleted: 4.0)
66+
public func testLocalObsoleted() throws {
67+
_ = BeforeAndAfter(foo: ())
68+
_ = try BeforeAndAfter()
69+
_ = try BeforeAndAfter.foo()
70+
_ = BeforeAndAfter.computed
71+
BeforeAndAfter.computed = 10
72+
_ = try BeforeAndAfter().computed
73+
try BeforeAndAfter().computed = 10
74+
}
6275

6376
// Same thing but in a different module
64-
_ = BeforeAndAfterOther(foo: ())
65-
_ = try BeforeAndAfterOther()
66-
_ = try BeforeAndAfterOther.foo()
67-
_ = BeforeAndAfterOther.computed
68-
BeforeAndAfterOther.computed = 10
69-
_ = try BeforeAndAfterOther().computed
70-
try BeforeAndAfterOther().computed = 10
77+
public func testOtherModule() throws {
78+
_ = BeforeAndAfterOther(foo: ())
79+
_ = try BeforeAndAfterOther()
80+
_ = try BeforeAndAfterOther.foo()
81+
_ = BeforeAndAfterOther.computed
82+
BeforeAndAfterOther.computed = 10
83+
_ = try BeforeAndAfterOther().computed
84+
try BeforeAndAfterOther().computed = 10
85+
}

test/attr/attr_availability_transitive.swift

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ func never_available_func(
5959
) {
6060
always()
6161
never() // expected-error {{'never()' is unavailable}}
62-
unavailableInSwift4()
63-
availableInFutureSwift()
62+
unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
63+
availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable in Swift}}
6464
}
6565

6666
@available(swift, obsoleted: 4)
@@ -72,8 +72,8 @@ func unavailable_in_swift4_func(
7272
) {
7373
always()
7474
never() // expected-error {{'never()' is unavailable}}
75-
unavailableInSwift4()
76-
availableInFutureSwift()
75+
unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
76+
availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable in Swift}}
7777
}
7878

7979
@available(swift, introduced: 99)
@@ -85,8 +85,8 @@ func introduced_in_future_swift_func(
8585
) {
8686
always()
8787
never() // expected-error {{'never()' is unavailable}}
88-
unavailableInSwift4()
89-
availableInFutureSwift()
88+
unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
89+
availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable in Swift}}
9090
}
9191

9292
// MARK: Global vars
@@ -112,8 +112,8 @@ var never_var: (
112112
) = (
113113
always(),
114114
never(), // expected-error {{'never()' is unavailable}}
115-
unavailableInSwift4(),
116-
availableInFutureSwift(),
115+
unavailableInSwift4(), // expected-error {{'unavailableInSwift4()' is unavailable}}
116+
availableInFutureSwift(), // expected-error {{'availableInFutureSwift()' is unavailable in Swift}}
117117
)
118118

119119
@available(swift, obsoleted: 4)
@@ -125,8 +125,8 @@ var unavailable_in_swift4_var: (
125125
) = (
126126
always(),
127127
never(), // expected-error {{'never()' is unavailable}}
128-
unavailableInSwift4(),
129-
availableInFutureSwift(),
128+
unavailableInSwift4(), // expected-error {{'unavailableInSwift4()' is unavailable}}
129+
availableInFutureSwift(), // expected-error {{'availableInFutureSwift()' is unavailable in Swift}}
130130
)
131131

132132
@available(swift, introduced: 99)
@@ -138,8 +138,8 @@ var available_in_future_swift_var: (
138138
) = (
139139
always(),
140140
never(), // expected-error {{'never()' is unavailable}}
141-
unavailableInSwift4(),
142-
availableInFutureSwift(),
141+
unavailableInSwift4(), // expected-error {{'unavailableInSwift4()' is unavailable}}
142+
availableInFutureSwift(), // expected-error {{'availableInFutureSwift()' is unavailable in Swift}}
143143
)
144144

145145

@@ -159,26 +159,26 @@ struct AlwaysAvailableContainer {
159159
struct NeverAvailableContainer { // expected-note 3 {{'NeverAvailableContainer' has been explicitly marked unavailable here}}
160160
let always_var: AlwaysAvailable = always()
161161
let never_var: NeverAvailable = never() // expected-error {{'never()' is unavailable}}
162-
let unavailable_in_swift4_var: UnavailableInSwift4 = unavailableInSwift4()
163-
let available_in_future_swift_var: AvailableInFutureSwift = availableInFutureSwift()
162+
let unavailable_in_swift4_var: UnavailableInSwift4 = unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
163+
let available_in_future_swift_var: AvailableInFutureSwift = availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable in Swift}}
164164
}
165165

166166
@available(swift, obsoleted: 4)
167167
struct UnavailableInSwift4Container { // expected-note {{'UnavailableInSwift4Container' was obsoleted in Swift 4}}
168168
let always_var: AlwaysAvailable = always()
169169
let never_var: NeverAvailable = never() // expected-error {{'never()' is unavailable}}
170170
// expected-error@-1 {{'NeverAvailable' is unavailable}}
171-
let unavailable_in_swift4_var: UnavailableInSwift4 = unavailableInSwift4()
172-
let available_in_future_swift_var: AvailableInFutureSwift = availableInFutureSwift()
171+
let unavailable_in_swift4_var: UnavailableInSwift4 = unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
172+
let available_in_future_swift_var: AvailableInFutureSwift = availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable in Swift}}
173173
}
174174

175175
@available(swift, introduced: 99)
176176
struct AvailableInFutureSwiftContainer { // expected-note {{'AvailableInFutureSwiftContainer' was introduced in Swift 99}}
177177
let always_var: AlwaysAvailable = always()
178178
let never_var: NeverAvailable = never() // expected-error {{'never()' is unavailable}}
179179
// expected-error@-1 {{'NeverAvailable' is unavailable}}
180-
let unavailable_in_swift4_var: UnavailableInSwift4 = unavailableInSwift4()
181-
let available_in_future_swift_var: AvailableInFutureSwift = availableInFutureSwift()
180+
let unavailable_in_swift4_var: UnavailableInSwift4 = unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
181+
let available_in_future_swift_var: AvailableInFutureSwift = availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable in Swift}}
182182
}
183183

184184
// MARK: Extensions
@@ -229,8 +229,8 @@ extension ExtendMe {
229229
) {
230230
always()
231231
never() // expected-error {{'never()' is unavailable}}
232-
unavailableInSwift4()
233-
availableInFutureSwift()
232+
unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
233+
availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable in Swift}}
234234
}
235235

236236
@available(*, unavailable)
@@ -242,8 +242,8 @@ extension ExtendMe {
242242
) {
243243
always()
244244
never() // expected-error {{'never()' is unavailable}}
245-
unavailableInSwift4()
246-
availableInFutureSwift()
245+
unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
246+
availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable in Swift}}
247247
}
248248

249249
@available(swift, obsoleted: 4)
@@ -255,8 +255,8 @@ extension ExtendMe {
255255
) {
256256
always()
257257
never() // expected-error {{'never()' is unavailable}}
258-
unavailableInSwift4()
259-
availableInFutureSwift()
258+
unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
259+
availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable in Swift}}
260260
}
261261

262262
@available(swift, introduced: 99)
@@ -268,8 +268,8 @@ extension ExtendMe {
268268
) {
269269
always()
270270
never() // expected-error {{'never()' is unavailable}}
271-
unavailableInSwift4()
272-
availableInFutureSwift()
271+
unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
272+
availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable in Swift}}
273273
}
274274
}
275275

@@ -286,8 +286,8 @@ extension ExtendMe {
286286
) {
287287
always()
288288
never() // expected-error {{'never()' is unavailable}}
289-
unavailableInSwift4()
290-
availableInFutureSwift()
289+
unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
290+
availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable in Swift}}
291291
}
292292
}
293293

@@ -304,8 +304,8 @@ extension ExtendMe {
304304
) {
305305
always()
306306
never() // expected-error {{'never()' is unavailable}}
307-
unavailableInSwift4()
308-
availableInFutureSwift()
307+
unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
308+
availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable in Swift}}
309309
}
310310
}
311311

0 commit comments

Comments
 (0)