Skip to content

Commit c0500e8

Browse files
committed
WIP
1 parent 9c598e8 commit c0500e8

File tree

4 files changed

+35
-8
lines changed

4 files changed

+35
-8
lines changed

lib/AST/AvailabilitySpec.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,22 +29,32 @@ AvailabilitySpec *AvailabilitySpec::createWildcard(ASTContext &ctx,
2929
/*VersionStartLoc=*/{});
3030
}
3131

32+
static SourceRange getSpecSourceRange(SourceLoc domainLoc,
33+
SourceRange versionRange) {
34+
if (domainLoc.isInvalid())
35+
return SourceRange();
36+
37+
if (versionRange.isValid())
38+
return SourceRange(domainLoc, versionRange.End);
39+
40+
return SourceRange(domainLoc);
41+
}
42+
3243
AvailabilitySpec *AvailabilitySpec::createForDomain(ASTContext &ctx,
3344
AvailabilityDomain domain,
3445
SourceLoc loc,
3546
llvm::VersionTuple version,
3647
SourceRange versionRange) {
37-
DEBUG_ASSERT(!version.empty());
38-
return new (ctx) AvailabilitySpec(domain, SourceRange(loc, versionRange.End),
39-
version, versionRange.Start);
48+
return new (ctx)
49+
AvailabilitySpec(domain, getSpecSourceRange(loc, versionRange), version,
50+
versionRange.Start);
4051
}
4152

4253
AvailabilitySpec *AvailabilitySpec::createForDomainIdentifier(
4354
ASTContext &ctx, Identifier domainIdentifier, SourceLoc loc,
4455
llvm::VersionTuple version, SourceRange versionRange) {
45-
DEBUG_ASSERT(!version.empty());
4656
return new (ctx)
47-
AvailabilitySpec(domainIdentifier, SourceRange(loc, versionRange.End),
57+
AvailabilitySpec(domainIdentifier, getSpecSourceRange(loc, versionRange),
4858
version, versionRange.Start);
4959
}
5060

lib/Parse/ParseExpr.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3715,9 +3715,11 @@ ParserResult<AvailabilitySpec> Parser::parseAvailabilitySpec() {
37153715
llvm::VersionTuple Version;
37163716
SourceRange VersionRange;
37173717

3718-
if (parseVersionTuple(Version, VersionRange,
3719-
diag::avail_query_expected_version_number)) {
3720-
return nullptr;
3718+
if (Tok.isAny(tok::integer_literal, tok::floating_literal)) {
3719+
if (parseVersionTuple(Version, VersionRange,
3720+
diag::avail_query_expected_version_number)) {
3721+
return nullptr;
3722+
}
37213723
}
37223724

37233725
return makeParserResult(AvailabilitySpec::createForDomainIdentifier(

test/attr/attr_availability_custom_domains.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,16 @@ func test() {
3838
deprecatedInRedefinedDomain() // expected-warning {{'deprecatedInRedefinedDomain()' is deprecated: Use something else}}
3939
availableInDynamicDomain() // FIXME: [availability] should be diagnosed
4040
availableInUnknownDomain() // Ok
41+
42+
if #available(EnabledDomain) {}
43+
if #available(RedefinedDomain) {}
44+
if #available(DisabledDomain) {}
45+
if #available(DynamicDomain) {}
46+
if #available(UnknownDomain) {} // expected-warning {{unrecognized platform name 'UnknownDomain'}}
47+
48+
if #unavailable(EnabledDomain) {}
49+
if #unavailable(RedefinedDomain) {}
50+
if #unavailable(DisabledDomain) {}
51+
if #unavailable(DynamicDomain) {}
52+
if #unavailable(UnknownDomain) {} // expected-warning {{unrecognized platform name 'UnknownDomain'}}
4153
}

test/attr/attr_availability_custom_domains_experimental_feature_required.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,6 @@
33

44
@available(SomeDomain, unavailable) // expected-error {{'SomeDomain' requires -enable-experimental-feature CustomAvailability}}
55
func availableInSomeDomain() { }
6+
7+
if #available(SomeDomain) {} // expected-error {{'SomeDomain' requires -enable-experimental-feature CustomAvailability}}
8+
if #unavailable(SomeDomain) {} // expected-error {{'SomeDomain' requires -enable-experimental-feature CustomAvailability}}

0 commit comments

Comments
 (0)