Skip to content

Commit a66257e

Browse files
authored
Merge pull request #58426 from tshortli/require-explicit-availability-unavailable-extension
Sema: Skip members of unavailable extensions for `-require-explicit-availability`
2 parents ff387ae + a3f8cf9 commit a66257e

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3924,11 +3924,14 @@ static bool declNeedsExplicitAvailability(const Decl *decl) {
39243924
decl->isImplicit())
39253925
return false;
39263926

3927+
// Skip unavailable decls.
3928+
if (AvailableAttr::isUnavailable(decl))
3929+
return false;
3930+
39273931
// Warn on decls without an introduction version.
39283932
auto &ctx = decl->getASTContext();
39293933
auto safeRangeUnderApprox = AvailabilityInference::availableRange(decl, ctx);
3930-
return !safeRangeUnderApprox.getOSVersion().hasLowerEndpoint() &&
3931-
!decl->getAttrs().isUnavailable(ctx);
3934+
return !safeRangeUnderApprox.getOSVersion().hasLowerEndpoint();
39323935
}
39333936

39343937
void swift::checkExplicitAvailability(Decl *decl) {

test/attr/require_explicit_availability.swift

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ public struct S { // expected-warning {{public declarations should have an avail
77
public func method() { }
88
}
99

10+
@available(macOS, unavailable)
11+
public struct UnavailableStruct {
12+
public func okMethod() { }
13+
}
14+
1015
public func foo() { bar() } // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
1116

1217
@usableFromInline
@@ -41,10 +46,25 @@ public func +(lhs: S, rhs: S) -> S { } // expected-warning {{public declarations
4146

4247
public enum E { } // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
4348

49+
@available(macOS, unavailable)
50+
public enum UnavailableEnum {
51+
case caseOk
52+
}
53+
4454
public class C { } // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
4555

56+
@available(macOS, unavailable)
57+
public class UnavailableClass {
58+
public func okMethod() { }
59+
}
60+
4661
public protocol P { } // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
4762

63+
@available(macOS, unavailable)
64+
public protocol UnavailableProto {
65+
func requirementOk()
66+
}
67+
4868
private protocol PrivateProto { }
4969

5070
extension S { // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
@@ -56,11 +76,19 @@ extension S {
5676
public func okWhenTheExtensionHasAttribute() { }
5777
}
5878

79+
@available(macOS, unavailable)
80+
extension S {
81+
public func okWhenTheExtensionIsUnavailable() { }
82+
}
83+
5984
extension S {
6085
internal func dontWarnWithoutPublicMembers() { }
6186
private func dontWarnWithoutPublicMembers1() { }
6287
}
6388

89+
// An empty extension should be ok.
90+
extension S { }
91+
6492
extension S : P { // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
6593
}
6694

@@ -96,6 +124,9 @@ public var publicVar = S() // expected-warning {{public declarations should have
96124
@available(macOS 10.10, *)
97125
public var publicVarOk = S()
98126

127+
@available(macOS, unavailable)
128+
public var unavailablePublicVarOk = S()
129+
99130
public var (a, b) = (S(), S()) // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
100131

101132
@available(macOS 10.10, *)
@@ -112,6 +143,11 @@ public var implicitGetOk: S {
112143
return S()
113144
}
114145

146+
@available(macOS, unavailable)
147+
public var unavailableImplicitGetOk: S {
148+
return S()
149+
}
150+
115151
public var computed: S { // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
116152
get { return S() }
117153
set { }

0 commit comments

Comments
 (0)