AST: Fix a crash when handling duplicate available attrs.

This commit is contained in:
Allan Shortlidge
2025-07-25 15:14:53 -07:00
parent c21c9b0f32
commit 8cb20c3f4e
3 changed files with 24 additions and 3 deletions

View File

@@ -81,12 +81,14 @@ static bool constraintIsStronger(const AvailabilityConstraint &lhs,
case AvailabilityConstraint::Reason::Obsoleted:
// Pick the larger obsoleted range.
return *lhs.getAttr().getObsoleted() < *rhs.getAttr().getObsoleted();
return lhs.getAttr().getObsoleted().value() <
rhs.getAttr().getObsoleted().value();
case AvailabilityConstraint::Reason::UnavailableForDeployment:
case AvailabilityConstraint::Reason::PotentiallyUnavailable:
// Pick the smaller introduced range.
return *lhs.getAttr().getIntroduced() > *rhs.getAttr().getIntroduced();
return lhs.getAttr().getIntroduced().value_or(llvm::VersionTuple()) >
rhs.getAttr().getIntroduced().value_or(llvm::VersionTuple());
}
}

View File

@@ -29,7 +29,15 @@ func unavailableInDynamicDomain() { } // expected-note * {{'unavailableInDynamic
@available(UnknownDomain) // expected-error {{unrecognized platform name 'UnknownDomain'}}
func availableInUnknownDomain() { }
func testDeployment() { // expected-note 2 {{add '@available' attribute to enclosing global function}}
@available(EnabledDomain)
@available(EnabledDomain)
func availableInEnabledDomainTwice() { }
@available(EnabledDomain)
@available(EnabledDomain, unavailable)
func availableAndUnavailableInEnabledDomain() { } // expected-note {{'availableAndUnavailableInEnabledDomain()' has been explicitly marked unavailable here}}
func testDeployment() { // expected-note 3 {{add '@available' attribute to enclosing global function}}
alwaysAvailable()
availableInEnabledDomain() // expected-error {{'availableInEnabledDomain()' is only available in EnabledDomain}}
// expected-note@-1 {{add 'if #available' version check}}
@@ -40,6 +48,9 @@ func testDeployment() { // expected-note 2 {{add '@available' attribute to enclo
availableInDynamicDomain() // expected-error {{'availableInDynamicDomain()' is only available in DynamicDomain}}
// expected-note@-1 {{add 'if #available' version check}}
availableInUnknownDomain()
availableInEnabledDomainTwice() // expected-error {{'availableInEnabledDomainTwice()' is only available in EnabledDomain}}
// expected-note@-1 {{add 'if #available' version check}}
availableAndUnavailableInEnabledDomain() // expected-error {{'availableAndUnavailableInEnabledDomain()' is unavailable}}
}
func testIfAvailable(_ truthy: Bool) { // expected-note 9 {{add '@available' attribute to enclosing global function}}

View File

@@ -59,3 +59,11 @@ func availableInDynamicDomain() { }
@available(UnknownDomain) // expected-error {{unrecognized platform name 'UnknownDomain'}}
func availableInUnknownDomain() { }
@available(EnabledDomain)
@available(EnabledDomain)
func availableInEnabledDomainTwice() { }
@available(EnabledDomain)
@available(EnabledDomain, unavailable)
func availableAndUnavailableInEnabledDomain() { }