Skip to content

Commit 7c75b26

Browse files
committed
Sema: Make suppression of availability checking for types more consistent.
Availability checking for types was only suppressed when the immediate context for the use of the type was explicitly marked unavailable. Availability is lexical so the checking should be suppressed in the entire scope instead.
1 parent 7797681 commit 7c75b26

7 files changed

+20
-27
lines changed

include/swift/AST/AvailabilityContext.h

+5
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ class AvailabilityContext {
6666
/// returns `nullopt`.
6767
std::optional<PlatformKind> getUnavailablePlatformKind() const;
6868

69+
/// Returns true if this context is unavailable.
70+
bool isUnavailable() const {
71+
return getUnavailablePlatformKind().has_value();
72+
}
73+
6974
/// Returns true if this context is deprecated on the current platform.
7075
bool isDeprecated() const;
7176

lib/Sema/TypeCheckAccess.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -2033,7 +2033,7 @@ class DeclAvailabilityChecker : public DeclVisitor<DeclAvailabilityChecker> {
20332033

20342034
// If the decl which references this type is unavailable on the current
20352035
// platform, don't diagnose the availability of the type.
2036-
if (AvailableAttr::isUnavailable(context))
2036+
if (Where.getAvailability().isUnavailable())
20372037
return;
20382038

20392039
diagnoseTypeAvailability(typeRepr, type, context->getLoc(),

test/Sema/availability_versions.swift

+2-3
Original file line numberDiff line numberDiff line change
@@ -754,7 +754,7 @@ func classViaTypeParameter() {
754754
// Potentially unavailable class used in declarations
755755

756756
class ClassWithDeclarationsOfPotentiallyUnavailableClasses {
757-
// expected-note@-1 6{{add @available attribute to enclosing class}}
757+
// expected-note@-1 5{{add @available attribute to enclosing class}}
758758

759759
@available(OSX, introduced: 51)
760760
init() {}
@@ -808,8 +808,7 @@ class ClassWithDeclarationsOfPotentiallyUnavailableClasses {
808808

809809
@available(OSX, unavailable)
810810
func unavailableMethodWithPotentiallyUnavailableLocalDeclaration() {
811-
let _ : ClassAvailableOn51 = methodWithPotentiallyUnavailableReturnType() // expected-error {{'ClassAvailableOn51' is only available in macOS 51 or newer}}
812-
// expected-note@-1 {{add 'if #available' version check}}
811+
let _ : ClassAvailableOn51 = methodWithPotentiallyUnavailableReturnType()
813812
}
814813
}
815814

test/Sema/property_wrapper_availability.swift

+7-7
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ struct Available51Wrapper<T> {
1717

1818
@available(*, unavailable)
1919
@propertyWrapper
20-
struct UnavailableWrapper<T> { // expected-note 8 {{'UnavailableWrapper' has been explicitly marked unavailable here}}
20+
struct UnavailableWrapper<T> { // expected-note 6 {{'UnavailableWrapper' has been explicitly marked unavailable here}}
2121
var wrappedValue: T
2222
}
2323

@@ -77,8 +77,8 @@ struct UnavailableStruct {
7777
@AlwaysAvailableWrapper var alwaysAvailableExplicit: S
7878
@AlwaysAvailableWrapper var alwaysAvailableInferred = S()
7979

80-
@Available51Wrapper var available51Explicit: S // expected-error {{'Available51Wrapper' is only available in macOS 51 or newer}}
81-
@Available51Wrapper var available51Inferred = S() // expected-error {{'Available51Wrapper' is only available in macOS 51 or newer}}
80+
@Available51Wrapper var available51Explicit: S
81+
@Available51Wrapper var available51Inferred = S()
8282

8383
@UnavailableWrapper var unavailableExplicit: S
8484
@UnavailableWrapper var unavailableInferred = S()
@@ -92,11 +92,11 @@ struct UnavailableOnMacOSStruct {
9292
@AlwaysAvailableWrapper var alwaysAvailableExplicit: S
9393
@AlwaysAvailableWrapper var alwaysAvailableInferred = S()
9494

95-
@Available51Wrapper var available51Explicit: S // expected-error {{'Available51Wrapper' is only available in macOS 51 or newer}}
96-
@Available51Wrapper var available51Inferred = S() // expected-error {{'Available51Wrapper' is only available in macOS 51 or newer}}
95+
@Available51Wrapper var available51Explicit: S
96+
@Available51Wrapper var available51Inferred = S()
9797

98-
@UnavailableWrapper var unavailableExplicit: S // expected-error {{'UnavailableWrapper' is unavailable}}
99-
@UnavailableWrapper var unavailableInferred = S() // expected-error {{'UnavailableWrapper' is unavailable}}
98+
@UnavailableWrapper var unavailableExplicit: S
99+
@UnavailableWrapper var unavailableInferred = S()
100100

101101
@WrappedValueUnavailableOnMacOS var unavailableWrappedValue: S
102102
@WrappedValueAvailable51 var wrappedValueAavailable51: S // expected-error {{'wrappedValue' is only available in macOS 51 or newer}}

test/attr/attr_availability_transitive_osx.swift

-5
Original file line numberDiff line numberDiff line change
@@ -219,21 +219,16 @@ struct NeverAvailableContainer { // expected-note 2 {{'NeverAvailableContainer'
219219
let always_var: AlwaysAvailabile = always()
220220
let never_var: NeverAvailable = never() // expected-error {{'never()' is unavailable}}
221221
let osx_future_var: OSXFutureAvailable = osx_future() // expected-error {{'osx_future()' is only available in macOS 99 or newer}}
222-
// expected-error@-1 {{'OSXFutureAvailable' is only available in macOS 99 or newer}}
223222
let osx_var: OSXUnavailable = osx() // expected-error {{'osx()' is unavailable}}
224-
// expected-error@-1 {{'OSXUnavailable' is unavailable in macOS}}
225223
let osx_ios_var: MultiPlatformUnavailable = osx_ios() // expected-error {{'osx_ios()' is unavailable}}
226-
// expected-error@-1 {{'MultiPlatformUnavailable' is unavailable in macOS}}
227224
let osx_extension_var: OSXAppExtensionsUnavailable = osx_extension()
228225
}
229226

230227
@available(OSX, unavailable)
231228
struct OSXUnavailableContainer { // expected-note 2 {{'OSXUnavailableContainer' has been explicitly marked unavailable here}}
232229
let always_var: AlwaysAvailabile = always()
233230
let never_var: NeverAvailable = never() // expected-error {{'never()' is unavailable}}
234-
// expected-error@-1 {{'NeverAvailable' is unavailable}}
235231
let osx_future_var: OSXFutureAvailable = osx_future() // expected-error {{'osx_future()' is only available in macOS 99 or newer}}
236-
// expected-error@-1 {{'OSXFutureAvailable' is only available in macOS 99 or newer}}
237232
let osx_var: OSXUnavailable = osx()
238233
let osx_ios_var: MultiPlatformUnavailable = osx_ios()
239234
let osx_extension_var: OSXAppExtensionsUnavailable = osx_extension()

test/attr/attr_availability_transitive_osx_appext.swift

-5
Original file line numberDiff line numberDiff line change
@@ -135,25 +135,20 @@ struct AlwaysAvailabileContainer {
135135
struct NeverAvailableContainer { // expected-note {{'NeverAvailableContainer' has been explicitly marked unavailable here}}
136136
let never_var: NeverAvailable = never() // expected-error {{'never()' is unavailable}}
137137
let osx_var: OSXUnavailable = osx() // expected-error {{'osx()' is unavailable}}
138-
// expected-error@-1 {{'OSXUnavailable' is unavailable in macOS}}
139138
let osx_extension_var: OSXAppExtensionsUnavailable = osx_extension() // expected-error {{'osx_extension()' is unavailable in application extensions for macOS}}
140-
// expected-error@-1 {{'OSXAppExtensionsUnavailable' is unavailable in application extensions for macOS}}
141139
}
142140

143141
@available(OSX, unavailable)
144142
struct OSXUnavailableContainer { // expected-note {{'OSXUnavailableContainer' has been explicitly marked unavailable here}}
145143
let never_var: NeverAvailable = never() // expected-error {{'never()' is unavailable}}
146-
// expected-error@-1 {{'NeverAvailable' is unavailable}}
147144
let osx_var: OSXUnavailable = osx()
148145
let osx_extension_var: OSXAppExtensionsUnavailable = osx_extension()
149146
}
150147

151148
@available(OSXApplicationExtension, unavailable)
152149
struct OSXAppExtensionsUnavailableContainer { // expected-note {{'OSXAppExtensionsUnavailableContainer' has been explicitly marked unavailable here}}
153150
let never_var: NeverAvailable = never() // expected-error {{'never()' is unavailable}}
154-
// expected-error@-1 {{'NeverAvailable' is unavailable}}
155151
let osx_var: OSXUnavailable = osx() // expected-error {{'osx()' is unavailable}}
156-
// expected-error@-1 {{'OSXUnavailable' is unavailable in macOS}}
157152
let osx_extension_var: OSXAppExtensionsUnavailable = osx_extension()
158153
}
159154

test/attr/attr_inlinable_available.swift

+5-6
Original file line numberDiff line numberDiff line change
@@ -1159,7 +1159,7 @@ public struct UnavailablePublicStruct {
11591159
cPublic: AtInliningTarget,
11601160
dPublic: BetweenTargets,
11611161
ePublic: AtDeploymentTarget,
1162-
fPublic: AfterDeploymentTarget, // expected-error {{'AfterDeploymentTarget' is only available in macOS 11 or newer}}
1162+
fPublic: AfterDeploymentTarget,
11631163
gPublic: Unavailable
11641164

11651165
public var aPublicInit: Any = NoAvailable(),
@@ -1175,7 +1175,7 @@ public struct UnavailablePublicStruct {
11751175
cInternal: AtInliningTarget = .init(),
11761176
dInternal: BetweenTargets = .init(),
11771177
eInternal: AtDeploymentTarget = .init(),
1178-
fInternal: AfterDeploymentTarget = .init(), // expected-error {{'AfterDeploymentTarget' is only available in macOS 11 or newer}}
1178+
fInternal: AfterDeploymentTarget = .init(),
11791179
gInternal: Unavailable = .init()
11801180
}
11811181

@@ -1562,8 +1562,7 @@ public protocol UnavailableProtoWithAssoc {
15621562
associatedtype C: AtInliningTargetProto
15631563
associatedtype D: BetweenTargetsProto
15641564
associatedtype E: AtDeploymentTargetProto
1565-
associatedtype F: AfterDeploymentTargetProto // expected-error {{'AfterDeploymentTargetProto' is only available in}}
1566-
// expected-note@-1{{add @available attribute to enclosing associated type}}
1565+
associatedtype F: AfterDeploymentTargetProto
15671566
associatedtype G: UnavailableProto
15681567
}
15691568

@@ -1596,7 +1595,7 @@ public enum UnavailableEnumWithTypeAliases {
15961595
public typealias C = AtInliningTarget
15971596
public typealias D = BetweenTargets
15981597
public typealias E = AtDeploymentTarget
1599-
public typealias F = AfterDeploymentTarget // expected-error {{'AfterDeploymentTarget' is only available in macOS 11 or newer}} expected-note {{add @available attribute to enclosing type alias}}
1598+
public typealias F = AfterDeploymentTarget
16001599
public typealias G = Unavailable
16011600
}
16021601

@@ -1688,6 +1687,6 @@ public enum UnavailableEnumWithClasses {
16881687
public class InheritsAtInliningTarget: AtInliningTargetClass {}
16891688
public class InheritsBetweenTargets: BetweenTargetsClass {}
16901689
public class InheritsAtDeploymentTarget: AtDeploymentTargetClass {}
1691-
public class InheritsAfterDeploymentTarget: AfterDeploymentTargetClass {} // expected-error {{'AfterDeploymentTargetClass' is only available in}} expected-note 2 {{add @available attribute to enclosing class}}
1690+
public class InheritsAfterDeploymentTarget: AfterDeploymentTargetClass {}
16921691
public class InheritsUnavailable: UnavailableClass {}
16931692
}

0 commit comments

Comments
 (0)