@@ -572,8 +572,9 @@ static bool constraintIndicatesRuntimeUnavailability(
572
572
}
573
573
}
574
574
575
- // / Computes the `DeclRuntimeAvailability` value for `decl`.
576
- static DeclRuntimeAvailability getDeclRuntimeAvailability (const Decl *decl) {
575
+ // / Computes the `DeclRuntimeAvailability` value for `decl` in isolation.
576
+ static DeclRuntimeAvailability
577
+ computeDeclRuntimeAvailability (const Decl *decl) {
577
578
// Don't trust unavailability on declarations from Clang modules.
578
579
if (isa<ClangModuleUnit>(decl->getDeclContext ()->getModuleScopeContext ()))
579
580
return DeclRuntimeAvailability::PotentiallyAvailable;
@@ -630,30 +631,34 @@ static DeclRuntimeAvailability getDeclRuntimeAvailability(const Decl *decl) {
630
631
return DeclRuntimeAvailability::PotentiallyAvailable;
631
632
}
632
633
634
+ // / Determines the `DeclRuntimeAvailability` value for `decl` via
635
+ // / `DeclRuntimeAvailabilityRequest`.
636
+ static DeclRuntimeAvailability getDeclRuntimeAvailability (const Decl *decl) {
637
+ return evaluateOrDefault (decl->getASTContext ().evaluator ,
638
+ DeclRuntimeAvailabilityRequest{decl},
639
+ DeclRuntimeAvailability::PotentiallyAvailable);
640
+ }
641
+
633
642
DeclRuntimeAvailability
634
643
DeclRuntimeAvailabilityRequest::evaluate (Evaluator &evaluator,
635
644
const Decl *decl) const {
636
645
auto inherited = DeclRuntimeAvailability::PotentiallyAvailable;
637
646
if (auto *parent =
638
647
AvailabilityInference::parentDeclForInferredAvailability (decl)) {
639
- inherited = evaluateOrDefault (
640
- evaluator, DeclRuntimeAvailabilityRequest{parent}, inherited);
648
+ inherited = getDeclRuntimeAvailability (parent);
641
649
}
642
650
643
- // If the inherited semantic availability is already maximally unavailable
651
+ // If the inherited runtime availability is already maximally unavailable
644
652
// then skip computing unavailability for this declaration.
645
653
if (inherited == DeclRuntimeAvailability::AlwaysUnavailableABICompatible)
646
654
return DeclRuntimeAvailability::AlwaysUnavailableABICompatible;
647
655
648
- auto availability = getDeclRuntimeAvailability (decl);
656
+ auto availability = computeDeclRuntimeAvailability (decl);
649
657
return std::max (inherited, availability);
650
658
}
651
659
652
660
bool Decl::isUnreachableAtRuntime () const {
653
- auto availability = evaluateOrDefault (
654
- getASTContext ().evaluator , DeclRuntimeAvailabilityRequest{this },
655
- DeclRuntimeAvailability::PotentiallyAvailable);
656
- return availability ==
661
+ return getDeclRuntimeAvailability (this ) >=
657
662
DeclRuntimeAvailability::AlwaysUnavailableABICompatible;
658
663
}
659
664
@@ -666,13 +671,15 @@ getEffectiveUnavailableDeclOptimization(ASTContext &ctx) {
666
671
}
667
672
668
673
bool Decl::isAvailableDuringLowering () const {
669
- // Unconditionally unavailable declarations should be skipped during lowering
670
- // when -unavailable-decl-optimization=complete is specified.
674
+ auto availability = getDeclRuntimeAvailability ( this );
675
+
671
676
if (getEffectiveUnavailableDeclOptimization (getASTContext ()) !=
672
677
UnavailableDeclOptimization::Complete)
673
678
return true ;
674
679
675
- return !isUnreachableAtRuntime ();
680
+ // All unreachable declarations should be skipped during lowering
681
+ // when -unavailable-decl-optimization=complete is specified.
682
+ return availability < DeclRuntimeAvailability::AlwaysUnavailableABICompatible;
676
683
}
677
684
678
685
bool Decl::requiresUnavailableDeclABICompatibilityStubs () const {
0 commit comments