AST: Fix Decl::isUnreachableAtRuntime() for obsolete decls in unavailable decls.

This commit is contained in:
Allan Shortlidge
2024-11-30 17:57:14 -08:00
parent 31cc6b8f54
commit 71afa86b6c
3 changed files with 65 additions and 20 deletions

View File

@@ -716,16 +716,27 @@ bool Decl::isUnreachableAtRuntime() const {
if (isa<ClangModuleUnit>(getDeclContext()->getModuleScopeContext()))
return false;
auto unavailableAttrAndDecl =
getSemanticUnavailableAttr(/*ignoreAppExtensions=*/true);
if (!unavailableAttrAndDecl)
if (auto *parent =
AvailabilityInference::parentDeclForInferredAvailability(this)) {
if (parent->isUnreachableAtRuntime())
return true;
}
auto *unavailableAttr = getUnavailableAttr(/*ignoreAppExtensions=*/true);
if (!unavailableAttr)
return false;
// getSemanticUnavailableAttr() can return an @available attribute that makes
// its declaration unavailable conditionally due to deployment target. Only
// getUnavailableAttr() can return an @available attribute that is
// obsoleted for certain deployment targets or language modes. These decls
// can still be reached by code in other modules that is compiled with
// a different deployment target or language mode.
if (!unavailableAttr->isUnconditionallyUnavailable())
return false;
// getUnavailableAttr() can return an @available attribute that makes its
// declaration unavailable conditionally due to deployment target. Only
// stub or skip a declaration that is unavailable regardless of deployment
// target.
auto *unavailableAttr = unavailableAttrAndDecl->first;
if (!unavailableAttr->isUnconditionallyUnavailable())
return false;

View File

@@ -1,35 +1,38 @@
// 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
// 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
// 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
// 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
// CHECK-NO-STRIP-DAG: s4Test29unavailableFuncWithNestedType
// CHECK-NO-STRIP-DAG: s4Test29unavailableFuncWithNestedTypeyyF0E10InFunction
// CHECK-NO-STRIP: s4Test29unavailableFuncWithNestedTypeyyF
// CHECK-STRIP-NOT: s4Test29unavailableFuncWithNestedTypeyyF
@available(*, unavailable)
public func unavailableFuncWithNestedType() {
struct NestedInFunction {
// s4Test29unavailableFuncWithNestedTypeyyF0E10InFunctionL_VADycfC
init() {}
}
_ = NestedInFunction()
}
// CHECK-NO-STRIP: s4Test29unavailableFuncWithNestedTypeyyF0E10InFunctionL_VADycfC
// CHECK-STRIP-NOT: s4Test29unavailableFuncWithNestedTypeyyF0E10InFunctionL_VADycfC
// CHECK-NO-STRIP-DAG: s4Test37unavailableFuncWithNestedObsoleteType
// CHECK-NO-STRIP-DAG: s4Test37unavailableFuncWithNestedObsoleteTypeyyF0E10InFunction
@available(*, unavailable)
public func unavailableFuncWithNestedObsoleteType() {
@available(swift, obsoleted: 4)
struct NestedInFunction {
init() {}
}
}
public struct S {}
// CHECK-NO-STRIP-DAG: s4Test1SV17NestedInExtension
extension S {
@available(*, unavailable)
public struct NestedInExtension {
// CHECK-NO-STRIP: s4Test1SV17NestedInExtensionV6methodyyF
// CHECK-STRIP-NOT: s4Test1SV17NestedInExtensionV6methodyyF
public func method() {}
}
}
// CHECK-NO-STRIP: s4Test1SV17NestedInExtensionVMa
// CHECK-STRIP-NOT: s4Test1SV17NestedInExtensionVMa
// CHECK-NO-STRIP: s4Test29unavailableFuncWithNestedTypeyyF0E10InFunctionL_VMa
// CHECK-STRIP-NOT: s4Test29unavailableFuncWithNestedTypeyyF0E10InFunctionL_VMa

View File

@@ -12,6 +12,37 @@ public func unavailableFunc() -> S {
return S()
}
// CHECK-LABEL: sil{{.*}}@$s4Test025unavailableFuncWithNestedC0yyF
// CHECK: [[FNREF:%.*]] = function_ref @$[[DIAGNOSEFN:(ss31_diagnoseUnavailableCodeReacheds5NeverOyF|ss31_diagnoseUnavailableCodeReacheds5NeverOyFTwb)]] : $@convention(thin) () -> Never
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
// CHECK: function_ref @$s4Test025unavailableFuncWithNestedC0yyF6nestedL_SiyF
// CHECK: } // end sil function '$s4Test025unavailableFuncWithNestedC0yyF'
@available(*, unavailable)
public func unavailableFuncWithNestedFunc() {
func nested() -> Int { 1 }
_ = nested()
}
// CHECK-LABEL: sil{{.*}}@$s4Test025unavailableFuncWithNestedC0yyF6nestedL_SiyF
// CHECK: [[FNREF:%.*]] = function_ref @$[[DIAGNOSEFN:(ss31_diagnoseUnavailableCodeReacheds5NeverOyF|ss31_diagnoseUnavailableCodeReacheds5NeverOyFTwb)]] : $@convention(thin) () -> Never
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
// CHECK: } // end sil function '$s4Test025unavailableFuncWithNestedC0yyF6nestedL_SiyF'
// CHECK-LABEL: sil{{.*}}@$s4Test033unavailableFuncWithObsoleteNestedC0yyF
// CHECK: [[FNREF:%.*]] = function_ref @$[[DIAGNOSEFN:(ss31_diagnoseUnavailableCodeReacheds5NeverOyF|ss31_diagnoseUnavailableCodeReacheds5NeverOyFTwb)]] : $@convention(thin) () -> Never
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
// CHECK: } // end sil function '$s4Test033unavailableFuncWithObsoleteNestedC0yyF'
@available(*, unavailable)
public func unavailableFuncWithObsoleteNestedFunc() {
@available(swift, obsoleted: 1)
func nested() -> Int { 1 }
}
// CHECK-LABEL: sil{{.*}}@$s4Test033unavailableFuncWithObsoleteNestedC0yyF6nestedL_SiyF
// CHECK: [[FNREF:%.*]] = function_ref @$[[DIAGNOSEFN:(ss31_diagnoseUnavailableCodeReacheds5NeverOyF|ss31_diagnoseUnavailableCodeReacheds5NeverOyFTwb)]] : $@convention(thin) () -> Never
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
// CHECK: } // end sil function '$s4Test033unavailableFuncWithObsoleteNestedC0yyF6nestedL_SiyF'
enum SomeError: Error { case generic }
// CHECK-LABEL: sil{{.*}}@$s4Test23unavailableThrowingFuncyyKF