Skip to content

Commit 75b2750

Browse files
committed
AST: Fix Decl::isUnreachableAtRuntime() for obsolete decls in unavailable decls.
1 parent e131682 commit 75b2750

File tree

3 files changed

+65
-20
lines changed

3 files changed

+65
-20
lines changed

lib/AST/Availability.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -716,16 +716,27 @@ bool Decl::isUnreachableAtRuntime() const {
716716
if (isa<ClangModuleUnit>(getDeclContext()->getModuleScopeContext()))
717717
return false;
718718

719-
auto unavailableAttrAndDecl =
720-
getSemanticUnavailableAttr(/*ignoreAppExtensions=*/true);
721-
if (!unavailableAttrAndDecl)
719+
if (auto *parent =
720+
AvailabilityInference::parentDeclForInferredAvailability(this)) {
721+
if (parent->isUnreachableAtRuntime())
722+
return true;
723+
}
724+
725+
auto *unavailableAttr = getUnavailableAttr(/*ignoreAppExtensions=*/true);
726+
if (!unavailableAttr)
727+
return false;
728+
729+
// getUnavailableAttr() can return an @available attribute that is
730+
// obsoleted for certain deployment targets or language modes. These decls
731+
// can still be reached by code in other modules that is compiled with
732+
// a different deployment target or language mode.
733+
if (!unavailableAttr->isUnconditionallyUnavailable())
722734
return false;
723735

724-
// getSemanticUnavailableAttr() can return an @available attribute that makes
725-
// its declaration unavailable conditionally due to deployment target. Only
736+
// getUnavailableAttr() can return an @available attribute that makes its
737+
// declaration unavailable conditionally due to deployment target. Only
726738
// stub or skip a declaration that is unavailable regardless of deployment
727739
// target.
728-
auto *unavailableAttr = unavailableAttrAndDecl->first;
729740
if (!unavailableAttr->isUnconditionallyUnavailable())
730741
return false;
731742

test/IRGen/unavailable_decl_optimization_complete_nested_type.swift

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,38 @@
1-
// RUN: %target-swift-frontend -parse-as-library -module-name Test -validate-tbd-against-ir=missing -unavailable-decl-optimization=none %s -emit-ir | %FileCheck %s --check-prefixes=CHECK,CHECK-NO-STRIP
1+
// RUN: %target-swift-frontend -parse-as-library -module-name Test -validate-tbd-against-ir=missing -unavailable-decl-optimization=none %s -emit-ir | %FileCheck %s --check-prefixes=CHECK-NO-STRIP
22

3-
// RUN: %target-swift-frontend -parse-as-library -module-name Test -validate-tbd-against-ir=missing -unavailable-decl-optimization=complete %s -emit-ir | %FileCheck %s --check-prefixes=CHECK,CHECK-STRIP
3+
// RUN: %target-swift-frontend -parse-as-library -module-name Test -validate-tbd-against-ir=missing -unavailable-decl-optimization=complete %s -emit-ir | %FileCheck %s --implicit-check-not=unavailableFuncWithNestedObsoleteType --implicit-check-not=unavailableFuncWithNestedType --implicit-check-not=NestedInExtension
4+
5+
// CHECK-NO-STRIP-DAG: s4Test29unavailableFuncWithNestedType
6+
// CHECK-NO-STRIP-DAG: s4Test29unavailableFuncWithNestedTypeyyF0E10InFunction
47

5-
// CHECK-NO-STRIP: s4Test29unavailableFuncWithNestedTypeyyF
6-
// CHECK-STRIP-NOT: s4Test29unavailableFuncWithNestedTypeyyF
78
@available(*, unavailable)
89
public func unavailableFuncWithNestedType() {
910
struct NestedInFunction {
10-
// s4Test29unavailableFuncWithNestedTypeyyF0E10InFunctionL_VADycfC
1111
init() {}
1212
}
1313

1414
_ = NestedInFunction()
1515
}
1616

17-
// CHECK-NO-STRIP: s4Test29unavailableFuncWithNestedTypeyyF0E10InFunctionL_VADycfC
18-
// CHECK-STRIP-NOT: s4Test29unavailableFuncWithNestedTypeyyF0E10InFunctionL_VADycfC
17+
// CHECK-NO-STRIP-DAG: s4Test37unavailableFuncWithNestedObsoleteType
18+
// CHECK-NO-STRIP-DAG: s4Test37unavailableFuncWithNestedObsoleteTypeyyF0E10InFunction
19+
20+
@available(*, unavailable)
21+
public func unavailableFuncWithNestedObsoleteType() {
22+
@available(swift, obsoleted: 4)
23+
struct NestedInFunction {
24+
init() {}
25+
}
26+
}
1927

2028
public struct S {}
2129

30+
// CHECK-NO-STRIP-DAG: s4Test1SV17NestedInExtension
31+
2232
extension S {
2333
@available(*, unavailable)
2434
public struct NestedInExtension {
25-
// CHECK-NO-STRIP: s4Test1SV17NestedInExtensionV6methodyyF
26-
// CHECK-STRIP-NOT: s4Test1SV17NestedInExtensionV6methodyyF
2735
public func method() {}
2836
}
2937
}
3038

31-
// CHECK-NO-STRIP: s4Test1SV17NestedInExtensionVMa
32-
// CHECK-STRIP-NOT: s4Test1SV17NestedInExtensionVMa
33-
34-
// CHECK-NO-STRIP: s4Test29unavailableFuncWithNestedTypeyyF0E10InFunctionL_VMa
35-
// CHECK-STRIP-NOT: s4Test29unavailableFuncWithNestedTypeyyF0E10InFunctionL_VMa

test/SILGen/unavailable_decl_optimization_stub.swift

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

15+
// CHECK-LABEL: sil{{.*}}@$s4Test025unavailableFuncWithNestedC0yyF
16+
// CHECK: [[FNREF:%.*]] = function_ref @$[[DIAGNOSEFN:(ss31_diagnoseUnavailableCodeReacheds5NeverOyF|ss31_diagnoseUnavailableCodeReacheds5NeverOyFTwb)]] : $@convention(thin) () -> Never
17+
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
18+
// CHECK: function_ref @$s4Test025unavailableFuncWithNestedC0yyF6nestedL_SiyF
19+
// CHECK: } // end sil function '$s4Test025unavailableFuncWithNestedC0yyF'
20+
@available(*, unavailable)
21+
public func unavailableFuncWithNestedFunc() {
22+
func nested() -> Int { 1 }
23+
_ = nested()
24+
}
25+
26+
// CHECK-LABEL: sil{{.*}}@$s4Test025unavailableFuncWithNestedC0yyF6nestedL_SiyF
27+
// CHECK: [[FNREF:%.*]] = function_ref @$[[DIAGNOSEFN:(ss31_diagnoseUnavailableCodeReacheds5NeverOyF|ss31_diagnoseUnavailableCodeReacheds5NeverOyFTwb)]] : $@convention(thin) () -> Never
28+
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
29+
// CHECK: } // end sil function '$s4Test025unavailableFuncWithNestedC0yyF6nestedL_SiyF'
30+
31+
// CHECK-LABEL: sil{{.*}}@$s4Test033unavailableFuncWithObsoleteNestedC0yyF
32+
// CHECK: [[FNREF:%.*]] = function_ref @$[[DIAGNOSEFN:(ss31_diagnoseUnavailableCodeReacheds5NeverOyF|ss31_diagnoseUnavailableCodeReacheds5NeverOyFTwb)]] : $@convention(thin) () -> Never
33+
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
34+
// CHECK: } // end sil function '$s4Test033unavailableFuncWithObsoleteNestedC0yyF'
35+
@available(*, unavailable)
36+
public func unavailableFuncWithObsoleteNestedFunc() {
37+
@available(swift, obsoleted: 1)
38+
func nested() -> Int { 1 }
39+
}
40+
41+
// CHECK-LABEL: sil{{.*}}@$s4Test033unavailableFuncWithObsoleteNestedC0yyF6nestedL_SiyF
42+
// CHECK: [[FNREF:%.*]] = function_ref @$[[DIAGNOSEFN:(ss31_diagnoseUnavailableCodeReacheds5NeverOyF|ss31_diagnoseUnavailableCodeReacheds5NeverOyFTwb)]] : $@convention(thin) () -> Never
43+
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
44+
// CHECK: } // end sil function '$s4Test033unavailableFuncWithObsoleteNestedC0yyF6nestedL_SiyF'
45+
1546
enum SomeError: Error { case generic }
1647

1748
// CHECK-LABEL: sil{{.*}}@$s4Test23unavailableThrowingFuncyyKF

0 commit comments

Comments
 (0)