Skip to content

Commit 5601e66

Browse files
committed
Sema: Generalize more-available-than-enclosing-decl diagnostics.
NFC.
1 parent 034c62c commit 5601e66

File tree

2 files changed

+29
-12
lines changed

2 files changed

+29
-12
lines changed

lib/Sema/TypeCheckAttr.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2200,13 +2200,19 @@ static Decl *getEnclosingDeclForDecl(Decl *D) {
22002200
}
22012201

22022202
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+
}
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();

test/Availability/availability_custom_domains.swift

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -231,18 +231,29 @@ func testFixIts() {
231231
// expected-note@-1 {{add 'if #available' version check}}{{3-29=if #available(EnabledDomain) {\n availableInEnabledDomain()\n \} else {\n // Fallback\n \}}}
232232
}
233233

234+
struct Container { }
235+
236+
@available(EnabledDomain)
237+
extension Container {
238+
@available(EnabledDomain)
239+
func redundantlyAvailableInEnabledDomain() { }
240+
241+
@available(EnabledDomain, unavailable)
242+
func unavailableInEnabledDomain() { }
243+
}
244+
234245
protocol P { }
235246

236247
@available(EnabledDomain)
237-
struct AvailableInEnabledDomain: P { }
248+
struct AvailableConformsToP: P { }
238249

239250
@available(EnabledDomain, unavailable)
240-
struct UnavailableInEnabledDomain: P { }
251+
struct UnavailableConformsToP: P { }
241252

242253
func testOpaqueReturnType() -> some P {
243254
if #available(EnabledDomain) { // expected-error {{opaque return type cannot depend on EnabledDomain availability}}
244-
return AvailableInEnabledDomain()
255+
return AvailableConformsToP()
245256
} else {
246-
return UnavailableInEnabledDomain()
257+
return UnavailableConformsToP()
247258
}
248259
}

0 commit comments

Comments
 (0)