Skip to content

Commit a3f8cf9

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 9e54917 commit a3f8cf9

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)