mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
AST: Fix Decl::isUnreachableAtRuntime() for obsolete decls in unavailable decls.
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user