@@ -674,15 +674,12 @@ static StringRef getRealizedPlatform(const AvailabilityAttr *A,
674674static AvailabilityResult CheckAvailability (ASTContext &Context,
675675 const AvailabilityAttr *A,
676676 std::string *Message,
677+ StringRef TargetPlatform,
677678 VersionTuple EnclosingVersion) {
678- if (EnclosingVersion.empty ())
679- EnclosingVersion = Context.getTargetInfo ().getPlatformMinVersion ();
680-
681679 if (EnclosingVersion.empty ())
682680 return AR_Available;
683681
684682 StringRef ActualPlatform = A->getPlatform ()->getName ();
685- StringRef TargetPlatform = Context.getTargetInfo ().getPlatformName ();
686683
687684 // Match the platform name.
688685 if (getRealizedPlatform (A, Context) != TargetPlatform)
@@ -779,9 +776,21 @@ static AvailabilityResult CheckAvailability(ASTContext &Context,
779776AvailabilityResult Decl::getAvailability (std::string *Message,
780777 VersionTuple EnclosingVersion,
781778 StringRef *RealizedPlatform) const {
779+ const TargetInfo &TI = getASTContext ().getTargetInfo ();
780+ return getAvailability (TI .getPlatformName (),
781+ EnclosingVersion.empty () ? TI .getPlatformMinVersion ()
782+ : EnclosingVersion,
783+ Message, RealizedPlatform);
784+ }
785+
786+ AvailabilityResult Decl::getAvailability (StringRef Platform,
787+ const VersionTuple &PlatformMinVersion,
788+ std::string *Message,
789+ StringRef *RealizedPlatform) const {
782790 if (auto *FTD = dyn_cast<FunctionTemplateDecl>(this ))
783- return FTD ->getTemplatedDecl ()->getAvailability (Message, EnclosingVersion,
784- RealizedPlatform);
791+ return FTD ->getTemplatedDecl ()->getAvailability (
792+ Platform, PlatformMinVersion, Message, RealizedPlatform);
793+
785794
786795 AvailabilityResult Result = AR_Available;
787796 std::string ResultMessage;
@@ -806,8 +815,8 @@ AvailabilityResult Decl::getAvailability(std::string *Message,
806815
807816 if (const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
808817 Availability = Availability->getEffectiveAttr ();
809- AvailabilityResult AR = CheckAvailability (getASTContext (), Availability,
810- Message, EnclosingVersion );
818+ AvailabilityResult AR = CheckAvailability (
819+ getASTContext (), Availability, Message, Platform, PlatformMinVersion );
811820
812821 if (AR == AR_Unavailable) {
813822 if (RealizedPlatform)
@@ -844,6 +853,26 @@ VersionTuple Decl::getVersionIntroduced() const {
844853 return {};
845854}
846855
856+ bool Decl::isDeprecatedInAnyTargetPlatform (std::string *Message) const {
857+ const TargetInfo &TI = getASTContext ().getTargetInfo ();
858+ return getAvailability (TI .getPlatformName (), TI .getPlatformMinVersion ()) ==
859+ AR_Deprecated ||
860+ (TI .hasTargetVariantPlatform () &&
861+ getAvailability (TI .getTargetVariantPlatform (),
862+ TI .getTargetVariantPlatformMinVersion ()) ==
863+ AR_Deprecated);
864+ }
865+
866+ bool Decl::isUnavailabledForAllTargetPlatforms () const {
867+ const TargetInfo &TI = getASTContext ().getTargetInfo ();
868+ return getAvailability (TI .getPlatformName (), TI .getPlatformMinVersion ()) ==
869+ AR_Unavailable &&
870+ (!getASTContext ().getTargetInfo ().hasTargetVariantPlatform () ||
871+ getAvailability (TI .getTargetVariantPlatform (),
872+ TI .getTargetVariantPlatformMinVersion ()) ==
873+ AR_Unavailable);
874+ }
875+
847876bool Decl::canBeWeakImported (bool &IsDefinition) const {
848877 IsDefinition = false ;
849878
@@ -878,14 +907,21 @@ bool Decl::isWeakImported() const {
878907 if (!canBeWeakImported (IsDefinition))
879908 return false ;
880909
910+ const TargetInfo &TI = getASTContext ().getTargetInfo ();
881911 for (const auto *A : getMostRecentDecl ()->attrs ()) {
882912 if (isa<WeakImportAttr>(A))
883913 return true ;
884914
885915 if (const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
886916 Availability = Availability->getEffectiveAttr ();
887917 if (CheckAvailability (getASTContext (), Availability, nullptr ,
888- VersionTuple ()) == AR_NotYetIntroduced)
918+ TI .getPlatformName (), TI .getPlatformMinVersion ()) ==
919+ AR_NotYetIntroduced ||
920+ (TI .hasTargetVariantPlatform () &&
921+ CheckAvailability (getASTContext (), Availability, nullptr ,
922+ TI .getTargetVariantPlatform (),
923+ TI .getTargetVariantPlatformMinVersion ()) ==
924+ AR_NotYetIntroduced))
889925 return true ;
890926 }
891927 }
0 commit comments