@@ -572,8 +572,9 @@ static bool constraintIndicatesRuntimeUnavailability(
572572 }
573573}
574574
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) {
577578 // Don't trust unavailability on declarations from Clang modules.
578579 if (isa<ClangModuleUnit>(decl->getDeclContext ()->getModuleScopeContext ()))
579580 return DeclRuntimeAvailability::PotentiallyAvailable;
@@ -630,30 +631,34 @@ static DeclRuntimeAvailability getDeclRuntimeAvailability(const Decl *decl) {
630631 return DeclRuntimeAvailability::PotentiallyAvailable;
631632}
632633
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+
633642DeclRuntimeAvailability
634643DeclRuntimeAvailabilityRequest::evaluate (Evaluator &evaluator,
635644 const Decl *decl) const {
636645 auto inherited = DeclRuntimeAvailability::PotentiallyAvailable;
637646 if (auto *parent =
638647 AvailabilityInference::parentDeclForInferredAvailability (decl)) {
639- inherited = evaluateOrDefault (
640- evaluator, DeclRuntimeAvailabilityRequest{parent}, inherited);
648+ inherited = getDeclRuntimeAvailability (parent);
641649 }
642650
643- // If the inherited semantic availability is already maximally unavailable
651+ // If the inherited runtime availability is already maximally unavailable
644652 // then skip computing unavailability for this declaration.
645653 if (inherited == DeclRuntimeAvailability::AlwaysUnavailableABICompatible)
646654 return DeclRuntimeAvailability::AlwaysUnavailableABICompatible;
647655
648- auto availability = getDeclRuntimeAvailability (decl);
656+ auto availability = computeDeclRuntimeAvailability (decl);
649657 return std::max (inherited, availability);
650658}
651659
652660bool Decl::isUnreachableAtRuntime () const {
653- auto availability = evaluateOrDefault (
654- getASTContext ().evaluator , DeclRuntimeAvailabilityRequest{this },
655- DeclRuntimeAvailability::PotentiallyAvailable);
656- return availability ==
661+ return getDeclRuntimeAvailability (this ) >=
657662 DeclRuntimeAvailability::AlwaysUnavailableABICompatible;
658663}
659664
@@ -666,13 +671,15 @@ getEffectiveUnavailableDeclOptimization(ASTContext &ctx) {
666671}
667672
668673bool 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+
671676 if (getEffectiveUnavailableDeclOptimization (getASTContext ()) !=
672677 UnavailableDeclOptimization::Complete)
673678 return true ;
674679
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;
676683}
677684
678685bool Decl::requiresUnavailableDeclABICompatibilityStubs () const {
0 commit comments