Skip to content

Commit 6723a45

Browse files
authored
Merge pull request #58417 from tshortli/unavailable-extension-potentially-unavailable
Sema: Avoid diagnosing potential unavailability of type components of unavailable decls
2 parents a66257e + 6f8057d commit 6723a45

File tree

4 files changed

+137
-6
lines changed

4 files changed

+137
-6
lines changed

lib/Sema/TypeCheckAccess.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1583,6 +1583,11 @@ class DeclAvailabilityChecker : public DeclVisitor<DeclAvailabilityChecker> {
15831583
// Don't bother checking errors.
15841584
if (type && type->hasError())
15851585
return;
1586+
1587+
// If the decl which references this type is unavailable on the current
1588+
// platform, don't diagnose the availability of the type.
1589+
if (AvailableAttr::isUnavailable(context))
1590+
return;
15861591

15871592
DeclAvailabilityFlags flags = None;
15881593

test/Sema/availability_versions.swift

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,9 @@ enum CompassPoint {
547547
case WithPotentiallyUnavailablePayload(p : EnumIntroducedOn10_52) // expected-error {{'EnumIntroducedOn10_52' is only available in macOS 10.52 or newer}}
548548

549549
case WithPotentiallyUnavailablePayload1(p : EnumIntroducedOn10_52), WithPotentiallyUnavailablePayload2(p : EnumIntroducedOn10_52) // expected-error 2{{'EnumIntroducedOn10_52' is only available in macOS 10.52 or newer}}
550+
551+
@available(OSX, unavailable)
552+
case WithPotentiallyUnavailablePayload3(p : EnumIntroducedOn10_52)
550553
}
551554

552555
@available(OSX, introduced: 10.52)
@@ -712,7 +715,7 @@ func classViaTypeParameter() {
712715
// Potentially unavailable class used in declarations
713716

714717
class ClassWithDeclarationsOfPotentiallyUnavailableClasses {
715-
// expected-note@-1 5{{add @available attribute to enclosing class}}
718+
// expected-note@-1 6{{add @available attribute to enclosing class}}
716719

717720
@available(OSX, introduced: 10.51)
718721
init() {}
@@ -738,11 +741,20 @@ class ClassWithDeclarationsOfPotentiallyUnavailableClasses {
738741
return ClassAvailableOn10_51() // expected-error {{'ClassAvailableOn10_51' is only available in macOS 10.51 or newer}}
739742
// expected-note@-1 {{add 'if #available' version check}}
740743
}
744+
745+
@available(OSX, unavailable)
746+
func unavailableMethodWithPotentiallyUnavailableParameterType(_ o : ClassAvailableOn10_51) {}
741747

742748
@available(OSX, introduced: 10.51)
743749
func potentiallyUnavailableMethodWithPotentiallyUnavailableReturnType() -> ClassAvailableOn10_51 {
744750
return ClassAvailableOn10_51()
745751
}
752+
753+
@available(OSX, unavailable)
754+
func unavailableMethodWithPotentiallyUnavailableReturnType() -> ClassAvailableOn10_51 {
755+
guard #available(OSX 10.51, *) else { fatalError() }
756+
return ClassAvailableOn10_51()
757+
}
746758

747759
func methodWithPotentiallyUnavailableLocalDeclaration() {
748760
// expected-note@-1 {{add @available attribute to enclosing instance method}}
@@ -754,6 +766,12 @@ class ClassWithDeclarationsOfPotentiallyUnavailableClasses {
754766
func potentiallyUnavailableMethodWithPotentiallyUnavailableLocalDeclaration() {
755767
let _ : ClassAvailableOn10_51 = methodWithPotentiallyUnavailableReturnType()
756768
}
769+
770+
@available(OSX, unavailable)
771+
func unavailableMethodWithPotentiallyUnavailableLocalDeclaration() {
772+
let _ : ClassAvailableOn10_51 = methodWithPotentiallyUnavailableReturnType() // expected-error {{'ClassAvailableOn10_51' is only available in macOS 10.51 or newer}}
773+
// expected-note@-1 {{add 'if #available' version check}}
774+
}
757775
}
758776

759777
func referToPotentiallyUnavailableStaticProperty() {
@@ -770,6 +788,10 @@ class ClassExtendingPotentiallyUnavailableClass : ClassAvailableOn10_51 { // exp
770788
class PotentiallyUnavailableClassExtendingPotentiallyUnavailableClass : ClassAvailableOn10_51 {
771789
}
772790

791+
@available(OSX, unavailable)
792+
class UnavailableClassExtendingPotentiallyUnavailableClass : ClassAvailableOn10_51 {
793+
}
794+
773795
// Method availability is contravariant
774796

775797
class SuperWithAlwaysAvailableMembers {
@@ -857,6 +879,17 @@ class SubWithLargerMemberAvailability : SuperWithLimitedMemberAvailability {
857879
}
858880
}
859881

882+
@available(OSX, unavailable)
883+
class UnavailableSubWithLargerMemberAvailability : SuperWithLimitedMemberAvailability {
884+
override func someMethod() {
885+
}
886+
887+
override var someProperty: Int {
888+
get { return 5 }
889+
set(newVal) {}
890+
}
891+
}
892+
860893
// Inheritance and availability
861894

862895
@available(OSX, introduced: 10.51)
@@ -875,10 +908,18 @@ protocol ProtocolAvailableOn10_9InheritingFromProtocolAvailableOn10_51 : Protoco
875908
protocol ProtocolAvailableOn10_51InheritingFromProtocolAvailableOn10_9 : ProtocolAvailableOn10_9 {
876909
}
877910

911+
@available(OSX, unavailable)
912+
protocol UnavailableProtocolInheritingFromProtocolAvailableOn10_51 : ProtocolAvailableOn10_51 {
913+
}
914+
878915
@available(OSX, introduced: 10.9)
879916
class SubclassAvailableOn10_9OfClassAvailableOn10_51 : ClassAvailableOn10_51 { // expected-error {{'ClassAvailableOn10_51' is only available in macOS 10.51 or newer}}
880917
}
881918

919+
@available(OSX, unavailable)
920+
class UnavailableSubclassOfClassAvailableOn10_51 : ClassAvailableOn10_51 {
921+
}
922+
882923
// We allow nominal types to conform to protocols that are less available than the types themselves.
883924
@available(OSX, introduced: 10.9)
884925
class ClassAvailableOn10_9AdoptingProtocolAvailableOn10_51 : ProtocolAvailableOn10_51 {
@@ -896,7 +937,7 @@ func castToPotentiallyUnavailableProtocol() {
896937
}
897938

898939
@available(OSX, introduced: 10.9)
899-
class SubclassAvailableOn10_9OfClassAvailableOn10_51AlsoAdoptingProtocolAvailableOn10_51 : ClassAvailableOn10_51 { // expected-error {{'ClassAvailableOn10_51' is only available in macOS 10.51 or newer}}
940+
class SubclassAvailableOn10_9OfClassAvailableOn10_51AlsoAdoptingProtocolAvailableOn10_51 : ClassAvailableOn10_51, ProtocolAvailableOn10_51 { // expected-error {{'ClassAvailableOn10_51' is only available in macOS 10.51 or newer}}
900941
}
901942

902943
class SomeGenericClass<T> { }
@@ -905,27 +946,48 @@ class SomeGenericClass<T> { }
905946
class SubclassAvailableOn10_9OfSomeGenericClassOfProtocolAvailableOn10_51 : SomeGenericClass<ProtocolAvailableOn10_51> { // expected-error {{'ProtocolAvailableOn10_51' is only available in macOS 10.51 or newer}}
906947
}
907948

949+
@available(OSX, unavailable)
950+
class UnavailableSubclassOfSomeGenericClassOfProtocolAvailableOn10_51 : SomeGenericClass<ProtocolAvailableOn10_51> {
951+
}
952+
908953
func GenericWhereClause<T>(_ t: T) where T: ProtocolAvailableOn10_51 { // expected-error * {{'ProtocolAvailableOn10_51' is only available in macOS 10.51 or newer}}
909954
// expected-note@-1 * {{add @available attribute to enclosing global function}}
910955
}
911956

957+
@available(OSX, unavailable)
958+
func UnavailableGenericWhereClause<T>(_ t: T) where T: ProtocolAvailableOn10_51 {
959+
}
960+
912961
func GenericSignature<T : ProtocolAvailableOn10_51>(_ t: T) { // expected-error * {{'ProtocolAvailableOn10_51' is only available in macOS 10.51 or newer}}
913962
// expected-note@-1 * {{add @available attribute to enclosing global function}}
914963
}
915964

965+
@available(OSX, unavailable)
966+
func UnavailableGenericSignature<T : ProtocolAvailableOn10_51>(_ t: T) {
967+
}
968+
916969
struct GenericType<T> { // expected-note {{add @available attribute to enclosing generic struct}}
917970
func nonGenericWhereClause() where T : ProtocolAvailableOn10_51 {} // expected-error {{'ProtocolAvailableOn10_51' is only available in macOS 10.51 or newer}}
918971
// expected-note@-1 {{add @available attribute to enclosing instance method}}
972+
973+
@available(OSX, unavailable)
974+
func unavailableNonGenericWhereClause() where T : ProtocolAvailableOn10_51 {}
919975

920976
struct NestedType where T : ProtocolAvailableOn10_51 {} // expected-error {{'ProtocolAvailableOn10_51' is only available in macOS 10.51 or newer}}
921977
// expected-note@-1 2{{add @available attribute to enclosing struct}}
978+
979+
@available(OSX, unavailable)
980+
struct UnavailableNestedType where T : ProtocolAvailableOn10_51 {}
922981
}
923982

924983
// Extensions
925984

926985
extension ClassAvailableOn10_51 { } // expected-error {{'ClassAvailableOn10_51' is only available in macOS 10.51 or newer}}
927986
// expected-note@-1 {{add @available attribute to enclosing extension}}
928987

988+
@available(OSX, unavailable)
989+
extension ClassAvailableOn10_51 { }
990+
929991
@available(OSX, introduced: 10.51)
930992
extension ClassAvailableOn10_51 {
931993
func m() {
@@ -957,7 +1019,6 @@ extension ClassToExtend {
9571019
// We allow protocol extensions for protocols that are less available than the
9581020
// conforming class.
9591021
extension ClassToExtend : ProtocolAvailableOn10_51 {
960-
9611022
}
9621023

9631024
@available(OSX, introduced: 10.51)

test/attr/attr_availability_transitive_osx.swift

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,42 @@ extension Outer {
110110
}
111111

112112
@available(OSX, unavailable)
113-
struct NotOnOSX {
113+
struct NotOnOSX { // expected-note {{'NotOnOSX' has been explicitly marked unavailable here}}
114114
var osx_init_osx = osx() // OK
115115
lazy var osx_lazy_osx = osx() // OK
116116
var osx_init_multi1_osx = osx(), osx_init_multi2_osx = osx() // OK
117117
var (osx_init_deconstruct1_osx, osx_init_deconstruct2_osx) = osx_pair() // OK
118118
var (_, osx_init_deconstruct2_only_osx) = osx_pair() // OK
119119
var (osx_init_deconstruct1_only_osx, _) = osx_pair() // OK
120120
}
121+
122+
@available(OSX, unavailable)
123+
extension NotOnOSX {
124+
func osx_call_osx() {
125+
osx() // OK
126+
}
127+
128+
func osx_call_osx_extension() {
129+
osx_extension() // OK; osx_extension is only unavailable if -application-extension is passed.
130+
}
131+
}
132+
133+
@available(OSXApplicationExtension, unavailable)
134+
extension NotOnOSX { } // expected-error {{'NotOnOSX' is unavailable in macOS}}
135+
136+
@available(OSXApplicationExtension, unavailable)
137+
struct NotOnOSXApplicationExtension { }
138+
139+
@available(OSX, unavailable)
140+
extension NotOnOSXApplicationExtension { } // OK; NotOnOSXApplicationExtension is only unavailable if -application-extension is passed.
141+
142+
@available(OSXApplicationExtension, unavailable)
143+
extension NotOnOSXApplicationExtension {
144+
func osx_call_osx() {
145+
osx() // expected-error {{'osx()' is unavailable in macOS}}
146+
}
147+
148+
func osx_call_osx_extension() {
149+
osx_extension() // OK
150+
}
151+
}

test/attr/attr_availability_transitive_osx_extension.swift

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
// Allow referencing unavailable API in situations where the caller is marked unavailable in the same circumstances.
55

66
@available(OSX, unavailable)
7-
func osx() {} // expected-note 2{{'osx()' has been explicitly marked unavailable here}}
7+
func osx() {} // expected-note 3{{'osx()' has been explicitly marked unavailable here}}
88

99
@available(OSXApplicationExtension, unavailable)
10-
func osx_extension() {} // expected-note 2{{'osx_extension()' has been explicitly marked unavailable here}}
10+
func osx_extension() {} // expected-note 3{{'osx_extension()' has been explicitly marked unavailable here}}
1111

1212
func call_osx_extension() {
1313
osx_extension() // expected-error {{'osx_extension()' is unavailable}}
@@ -35,3 +35,37 @@ func osx_extension_call_osx_extension() {
3535
func osx_extension_call_osx() {
3636
osx() // expected-error {{'osx()' is unavailable}}
3737
}
38+
39+
@available(OSX, unavailable)
40+
struct NotOnOSX { }
41+
42+
@available(OSX, unavailable)
43+
extension NotOnOSX {
44+
func osx_call_osx() {
45+
osx() // OK
46+
}
47+
48+
func osx_call_osx_extension() {
49+
osx_extension() // expected-error {{'osx_extension()' is unavailable in application extensions for macOS}}
50+
}
51+
}
52+
53+
@available(OSXApplicationExtension, unavailable)
54+
extension NotOnOSX { }
55+
56+
@available(OSXApplicationExtension, unavailable)
57+
struct NotOnOSXApplicationExtension { }
58+
59+
@available(OSX, unavailable)
60+
extension NotOnOSXApplicationExtension { }
61+
62+
@available(OSXApplicationExtension, unavailable)
63+
extension NotOnOSXApplicationExtension {
64+
func osx_call_osx() {
65+
osx() // expected-error {{'osx()' is unavailable in macOS}}
66+
}
67+
68+
func osx_call_osx_extension() {
69+
osx_extension() // OK
70+
}
71+
}

0 commit comments

Comments
 (0)