Skip to content

Commit 6c72664

Browse files
authored
Merge pull request swiftlang#34087 from xymus/inherit-unavailability
[Sema] Consider inherited platform unavailability to silence diagnostics Unavailability inherited by a platform wasn't taken into account when reporting the use of unavailable types imported from Objective-C in unavailable code. This likely forced uses to write an explicit `@available(macCatalyst, unavailable)` even when a `@available(iOS, unavailable)` was present. rdar://68597591
2 parents f190342 + 14e6772 commit 6c72664

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1566,7 +1566,10 @@ static bool isInsideCompatibleUnavailableDeclaration(
15661566
auto IsUnavailable = [platform](const Decl *D) {
15671567
auto EnclosingUnavailable =
15681568
D->getAttrs().getUnavailable(D->getASTContext());
1569-
return EnclosingUnavailable && EnclosingUnavailable->Platform == platform;
1569+
return EnclosingUnavailable &&
1570+
(EnclosingUnavailable->Platform == platform ||
1571+
inheritsAvailabilityFromPlatform(platform,
1572+
EnclosingUnavailable->Platform));
15701573
};
15711574

15721575
return someEnclosingDeclMatches(ReferenceRange, ReferenceDC, IsUnavailable);

test/attr/attr_availability_maccatalyst.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,3 +140,27 @@ protocol P: Builtin.AnyObject {
140140
}
141141

142142
extension X: P {}
143+
144+
// Test platform inheritance for iOS unavailability.
145+
// rdar://68597591
146+
147+
@available(iOS, unavailable)
148+
public struct UnavailableOniOS { } // expected-note 2 {{'UnavailableOniOS' has been explicitly marked unavailable here}}
149+
150+
@available(iOS, unavailable)
151+
func unavailableOniOS(_ p: UnavailableOniOS) { } // ok
152+
153+
func functionUsingAnUnavailableType(_ p: UnavailableOniOS) { } // expected-error {{'UnavailableOniOS' is unavailable in iOS}}
154+
155+
public extension UnavailableOniOS { } // expected-error {{'UnavailableOniOS' is unavailable in iOS}}
156+
157+
@available(iOS, unavailable)
158+
public extension UnavailableOniOS { // ok
159+
func someMethod(_ p: UnavailableOniOS) { }
160+
}
161+
162+
@available(iOS, unavailable)
163+
@available(macCatalyst, introduced: 13.0)
164+
public struct AvailableOnMacCatalyst { }
165+
166+
public extension AvailableOnMacCatalyst { } // ok

0 commit comments

Comments
 (0)