Skip to content

Commit 8cb20c3

Browse files
committed
AST: Fix a crash when handling duplicate available attrs.
1 parent c21c9b0 commit 8cb20c3

File tree

3 files changed

+24
-3
lines changed

3 files changed

+24
-3
lines changed

lib/AST/AvailabilityConstraint.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,14 @@ static bool constraintIsStronger(const AvailabilityConstraint &lhs,
8181

8282
case AvailabilityConstraint::Reason::Obsoleted:
8383
// Pick the larger obsoleted range.
84-
return *lhs.getAttr().getObsoleted() < *rhs.getAttr().getObsoleted();
84+
return lhs.getAttr().getObsoleted().value() <
85+
rhs.getAttr().getObsoleted().value();
8586

8687
case AvailabilityConstraint::Reason::UnavailableForDeployment:
8788
case AvailabilityConstraint::Reason::PotentiallyUnavailable:
8889
// Pick the smaller introduced range.
89-
return *lhs.getAttr().getIntroduced() > *rhs.getAttr().getIntroduced();
90+
return lhs.getAttr().getIntroduced().value_or(llvm::VersionTuple()) >
91+
rhs.getAttr().getIntroduced().value_or(llvm::VersionTuple());
9092
}
9193
}
9294

test/Availability/availability_custom_domains.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,15 @@ func unavailableInDynamicDomain() { } // expected-note * {{'unavailableInDynamic
2929
@available(UnknownDomain) // expected-error {{unrecognized platform name 'UnknownDomain'}}
3030
func availableInUnknownDomain() { }
3131

32-
func testDeployment() { // expected-note 2 {{add '@available' attribute to enclosing global function}}
32+
@available(EnabledDomain)
33+
@available(EnabledDomain)
34+
func availableInEnabledDomainTwice() { }
35+
36+
@available(EnabledDomain)
37+
@available(EnabledDomain, unavailable)
38+
func availableAndUnavailableInEnabledDomain() { } // expected-note {{'availableAndUnavailableInEnabledDomain()' has been explicitly marked unavailable here}}
39+
40+
func testDeployment() { // expected-note 3 {{add '@available' attribute to enclosing global function}}
3341
alwaysAvailable()
3442
availableInEnabledDomain() // expected-error {{'availableInEnabledDomain()' is only available in EnabledDomain}}
3543
// expected-note@-1 {{add 'if #available' version check}}
@@ -40,6 +48,9 @@ func testDeployment() { // expected-note 2 {{add '@available' attribute to enclo
4048
availableInDynamicDomain() // expected-error {{'availableInDynamicDomain()' is only available in DynamicDomain}}
4149
// expected-note@-1 {{add 'if #available' version check}}
4250
availableInUnknownDomain()
51+
availableInEnabledDomainTwice() // expected-error {{'availableInEnabledDomainTwice()' is only available in EnabledDomain}}
52+
// expected-note@-1 {{add 'if #available' version check}}
53+
availableAndUnavailableInEnabledDomain() // expected-error {{'availableAndUnavailableInEnabledDomain()' is unavailable}}
4354
}
4455

4556
func testIfAvailable(_ truthy: Bool) { // expected-note 9 {{add '@available' attribute to enclosing global function}}

test/attr/attr_availability_custom_domains.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,11 @@ func availableInDynamicDomain() { }
5959

6060
@available(UnknownDomain) // expected-error {{unrecognized platform name 'UnknownDomain'}}
6161
func availableInUnknownDomain() { }
62+
63+
@available(EnabledDomain)
64+
@available(EnabledDomain)
65+
func availableInEnabledDomainTwice() { }
66+
67+
@available(EnabledDomain)
68+
@available(EnabledDomain, unavailable)
69+
func availableAndUnavailableInEnabledDomain() { }

0 commit comments

Comments
 (0)