Skip to content

Commit 52109f4

Browse files
authored
Merge pull request #58506 from tshortli/require-explicit-availability-unavailable-extension-5.7
[5.7] Sema: Skip members of unavailable extensions for -require-explicit-availability
2 parents eaf561d + e49d269 commit 52109f4

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
@@ -3914,11 +3914,14 @@ static bool declNeedsExplicitAvailability(const Decl *decl) {
39143914
decl->isImplicit())
39153915
return false;
39163916

3917+
// Skip unavailable decls.
3918+
if (AvailableAttr::isUnavailable(decl))
3919+
return false;
3920+
39173921
// Warn on decls without an introduction version.
39183922
auto &ctx = decl->getASTContext();
39193923
auto safeRangeUnderApprox = AvailabilityInference::availableRange(decl, ctx);
3920-
return !safeRangeUnderApprox.getOSVersion().hasLowerEndpoint() &&
3921-
!decl->getAttrs().isUnavailable(ctx);
3924+
return !safeRangeUnderApprox.getOSVersion().hasLowerEndpoint();
39223925
}
39233926

39243927
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)