Skip to content

Commit e49d269

Browse files
committed
Sema: When diagnosing required explicit availability, skip members of extensions that have been declared explicitly unavailable. The existing logic only checked for an unavailable attr in the direct attributes of the decl.
Resolves rdar://85429703
1 parent 227b027 commit e49d269

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)