Skip to content

Commit e390cce

Browse files
committed
AST: Fix runtime unavailability for universally unavailable decls.
The logic that computes whether a decl is unavailable at runtime was allowing `@available` attributes for specific availability domains override `@available(*, unavailable)`. Universally unavailable decls are always unavailable, regardless of their other `@available` attributes.
1 parent 707c4aa commit e390cce

File tree

4 files changed

+44
-10
lines changed

4 files changed

+44
-10
lines changed

lib/AST/Availability.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,10 @@ computeDeclRuntimeAvailability(const Decl *decl) {
623623
continue;
624624

625625
llvm::erase_if(unavailableDomains, [domain](auto unavailableDomain) {
626+
// Unavailability in '*' cannot be superseded by an @available attribute
627+
// for a more specific availability domain.
628+
if (unavailableDomain.isUniversal())
629+
return false;
626630
return unavailableDomain.contains(domain);
627631
});
628632
}

test/SILGen/unavailable_decl_custom_domain.swift

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,15 @@
33
// RUN: -define-enabled-availability-domain EnabledDomain \
44
// RUN: -define-disabled-availability-domain DisabledDomain \
55
// RUN: -define-dynamic-availability-domain DynamicDomain \
6-
// RUN: | %FileCheck %s
7-
8-
// RUN: %target-swift-emit-silgen -module-name Test %s -verify \
9-
// RUN: -enable-experimental-feature CustomAvailability \
10-
// RUN: -define-enabled-availability-domain EnabledDomain \
11-
// RUN: -define-disabled-availability-domain DisabledDomain \
12-
// RUN: -define-dynamic-availability-domain DynamicDomain \
13-
// RUN: -unavailable-decl-optimization=stub \
14-
// RUN: | %FileCheck %s
6+
// RUN: | %FileCheck %s --check-prefixes=CHECK,CHECK-NOOPT
157

168
// RUN: %target-swift-emit-silgen -module-name Test %s -verify \
179
// RUN: -enable-experimental-feature CustomAvailability \
1810
// RUN: -define-enabled-availability-domain EnabledDomain \
1911
// RUN: -define-disabled-availability-domain DisabledDomain \
2012
// RUN: -define-dynamic-availability-domain DynamicDomain \
2113
// RUN: -unavailable-decl-optimization=complete \
22-
// RUN: | %FileCheck %s
14+
// RUN: | %FileCheck %s --check-prefixes=CHECK,CHECK-OPT
2315

2416
// REQUIRES: swift_feature_CustomAvailability
2517

@@ -84,3 +76,25 @@ public func availableInEnabledAndDisabledDomain() { }
8476
@available(DisabledDomain)
8577
@available(EnabledDomain)
8678
public func availableInDisabledAndEnabledDomain() { }
79+
80+
// CHECK-NOOPT: s4Test49availableInEnabledDomainAndUnavailableUniversallyyyF
81+
// CHECK-OPT-NOT: s4Test49availableInEnabledDomainAndUnavailableUniversallyyyF
82+
@available(*, unavailable)
83+
@available(EnabledDomain)
84+
public func availableInEnabledDomainAndUnavailableUniversally() { }
85+
86+
// CHECK-NOT: s4Test40unavailableInEnabledDomainAndUniversallyyyF
87+
@available(*, unavailable)
88+
@available(EnabledDomain, unavailable)
89+
public func unavailableInEnabledDomainAndUniversally() { }
90+
91+
// CHECK-NOT: s4Test50availableInDisabledDomainAndUnavailableUniversallyyyF
92+
@available(*, unavailable)
93+
@available(DisabledDomain)
94+
public func availableInDisabledDomainAndUnavailableUniversally() { }
95+
96+
// CHECK-NOOPT: s4Test41unavailableInDisabledDomainAndUniversallyyyF
97+
// CHECK-OPT-NOT: s4Test41unavailableInDisabledDomainAndUniversallyyyF
98+
@available(*, unavailable)
99+
@available(DisabledDomain, unavailable)
100+
public func unavailableInDisabledDomainAndUniversally() { }

test/SILGen/unavailable_decl_optimization_stub.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,14 @@ public func unavailableFunc() -> S {
1212
return S()
1313
}
1414

15+
// CHECK-LABEL: sil{{.*}}@$s4Test33unavailableFuncIntroducedInSwift5yyF
16+
// CHECK: [[FNREF:%.*]] = function_ref @$[[DIAGNOSEFN:(ss31_diagnoseUnavailableCodeReacheds5NeverOyF|ss31_diagnoseUnavailableCodeReacheds5NeverOyFTwb)]] : $@convention(thin) () -> Never
17+
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
18+
// CHECK: } // end sil function '$s4Test33unavailableFuncIntroducedInSwift5yyF'
19+
@available(*, unavailable)
20+
@available(swift 5)
21+
public func unavailableFuncIntroducedInSwift5() { }
22+
1523
// CHECK-LABEL: sil{{.*}}@$s4Test025unavailableFuncWithNestedC0yyF
1624
// CHECK: [[FNREF:%.*]] = function_ref @$[[DIAGNOSEFN:(ss31_diagnoseUnavailableCodeReacheds5NeverOyF|ss31_diagnoseUnavailableCodeReacheds5NeverOyFTwb)]] : $@convention(thin) () -> Never
1725
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()

test/SILGen/unavailable_decl_optimization_stub_macos.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@ public func unavailableFunc() {}
2424
@available(macOS, unavailable)
2525
public func unavailableOnMacOSFunc() {}
2626

27+
// CHECK-LABEL: sil{{.*}}@$s4Test36unavailableFuncWithMacOSIntroductionyyF
28+
// CHECK: [[FNREF:%.*]] = function_ref @$ss31_diagnoseUnavailableCodeReacheds5NeverOyFTwb : $@convention(thin) () -> Never
29+
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
30+
// CHECK: } // end sil function '$s4Test36unavailableFuncWithMacOSIntroductionyyF'
31+
@available(*, unavailable)
32+
@available(macOS 12.0, *)
33+
public func unavailableFuncWithMacOSIntroduction() {}
34+
2735
// CHECK-LABEL: sil{{.*}}@$s4Test31unavailableOnMacOSExtensionFuncyyF
2836
// CHECK-NOT: _diagnoseUnavailableCodeReached
2937
// CHECK: } // end sil function '$s4Test31unavailableOnMacOSExtensionFuncyyF'

0 commit comments

Comments
 (0)