@@ -2200,13 +2200,19 @@ static Decl *getEnclosingDeclForDecl(Decl *D) {
2200
2200
}
2201
2201
2202
2202
static 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
+ }
2207
2213
2208
2214
if (auto *parent = decl->parentDeclForAvailability ())
2209
- return getSemanticAvailableRangeDeclAndAttr (parent);
2215
+ return getSemanticAvailableRangeDeclAndAttr (parent, domain );
2210
2216
2211
2217
return std::nullopt;
2212
2218
}
@@ -2300,7 +2306,7 @@ void AttributeChecker::visitAvailableAttr(AvailableAttr *parsedAttr) {
2300
2306
2301
2307
if (auto *parent = getEnclosingDeclForDecl (D)) {
2302
2308
if (auto enclosingAvailable =
2303
- getSemanticAvailableRangeDeclAndAttr (parent)) {
2309
+ getSemanticAvailableRangeDeclAndAttr (parent, attr-> getDomain () )) {
2304
2310
SemanticAvailableAttr enclosingAttr = enclosingAvailable->first ;
2305
2311
const Decl *enclosingDecl = enclosingAvailable->second ;
2306
2312
enclosingIntroducedRange = enclosingAttr.getIntroducedRange (Ctx);
@@ -5245,8 +5251,8 @@ void AttributeChecker::checkBackDeployedAttrs(
5245
5251
// If it's not, the attribute doesn't make sense since the back deployment
5246
5252
// fallback could never be executed at runtime.
5247
5253
if (auto availableRangeAttrPair =
5248
- getSemanticAvailableRangeDeclAndAttr (VD)) {
5249
- auto beforeDomain = Attr-> getAvailabilityDomain () ;
5254
+ getSemanticAvailableRangeDeclAndAttr (VD, Domain )) {
5255
+ auto beforeDomain = Domain ;
5250
5256
auto beforeVersion = Attr->getVersion ();
5251
5257
auto availableAttr = availableRangeAttrPair.value ().first ;
5252
5258
auto introVersion = availableAttr.getIntroduced ().value ();
0 commit comments