@@ -2200,13 +2200,19 @@ static Decl *getEnclosingDeclForDecl(Decl *D) {
22002200}
22012201
22022202static std::optional<std::pair<SemanticAvailableAttr, const Decl *>>
2203- getSemanticAvailableRangeDeclAndAttr (const Decl *decl) {
2204- if (auto attr = decl->getAvailableAttrForPlatformIntroduction (
2205- /* checkExtension=*/ false ))
2206- return std::make_pair (*attr, decl);
2203+ getSemanticAvailableRangeDeclAndAttr (const Decl *decl,
2204+ AvailabilityDomain domain) {
2205+ auto &ctx = decl->getASTContext ();
2206+ AvailabilityConstraintFlags flags =
2207+ AvailabilityConstraintFlag::SkipEnclosingExtension;
2208+ if (auto constraint = swift::getAvailabilityConstraintForDeclInDomain (
2209+ decl, AvailabilityContext::forAlwaysAvailable (ctx), domain, flags)) {
2210+ if (constraint->isPotentiallyAvailable ())
2211+ return std::make_pair (constraint->getAttr (), decl);
2212+ }
22072213
22082214 if (auto *parent = decl->parentDeclForAvailability ())
2209- return getSemanticAvailableRangeDeclAndAttr (parent);
2215+ return getSemanticAvailableRangeDeclAndAttr (parent, domain );
22102216
22112217 return std::nullopt ;
22122218}
@@ -2300,7 +2306,7 @@ void AttributeChecker::visitAvailableAttr(AvailableAttr *parsedAttr) {
23002306
23012307 if (auto *parent = getEnclosingDeclForDecl (D)) {
23022308 if (auto enclosingAvailable =
2303- getSemanticAvailableRangeDeclAndAttr (parent)) {
2309+ getSemanticAvailableRangeDeclAndAttr (parent, attr-> getDomain () )) {
23042310 SemanticAvailableAttr enclosingAttr = enclosingAvailable->first ;
23052311 const Decl *enclosingDecl = enclosingAvailable->second ;
23062312 enclosingIntroducedRange = enclosingAttr.getIntroducedRange (Ctx);
@@ -5245,8 +5251,8 @@ void AttributeChecker::checkBackDeployedAttrs(
52455251 // If it's not, the attribute doesn't make sense since the back deployment
52465252 // fallback could never be executed at runtime.
52475253 if (auto availableRangeAttrPair =
5248- getSemanticAvailableRangeDeclAndAttr (VD)) {
5249- auto beforeDomain = Attr-> getAvailabilityDomain () ;
5254+ getSemanticAvailableRangeDeclAndAttr (VD, Domain )) {
5255+ auto beforeDomain = Domain ;
52505256 auto beforeVersion = Attr->getVersion ();
52515257 auto availableAttr = availableRangeAttrPair.value ().first ;
52525258 auto introVersion = availableAttr.getIntroduced ().value ();
0 commit comments