Skip to content

Commit f5bae41

Browse files
committed
AST: Diagnose unrecognized platforms as errors with CustomAvailability enabled.
When the CustomAvailability experimental feature is enabled, make it an error to specify an unrecognized availability domain name. Also, add these diagnostics to a diagnostic group so that developers can control their behavior when they are warnings. Resolves rdar://152741624.
1 parent 4051ea2 commit f5bae41

9 files changed

+42
-15
lines changed

include/swift/AST/DiagnosticGroups.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
GROUP(no_group, "")
4242

4343
GROUP(ActorIsolatedCall, "actor-isolated-call")
44+
GROUP(AvailabilityUnrecognizedName, "availability-unrecognized-name")
4445
GROUP(ClangDeclarationImport, "clang-declaration-import")
4546
GROUP(ConformanceIsolation, "conformance-isolation")
4647
GROUP(DeprecatedDeclaration, "deprecated-declaration")

include/swift/AST/DiagnosticsSema.def

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6836,11 +6836,12 @@ ERROR(availability_must_occur_alone, none,
68366836
(AvailabilityDomain, bool))
68376837
ERROR(availability_unexpected_version, none,
68386838
"unexpected version number for %0", (AvailabilityDomain))
6839-
WARNING(availability_unrecognized_platform_name,
6840-
PointsToFirstBadToken, "unrecognized platform name %0", (Identifier))
6841-
WARNING(availability_suggest_platform_name,
6842-
PointsToFirstBadToken, "unrecognized platform name %0;"
6843-
" did you mean '%1'?",
6839+
GROUPED_ERROR(availability_unrecognized_platform_name,
6840+
AvailabilityUnrecognizedName, PointsToFirstBadToken,
6841+
"unrecognized platform name %0", (Identifier))
6842+
GROUPED_ERROR(availability_suggest_platform_name,
6843+
AvailabilityUnrecognizedName, PointsToFirstBadToken,
6844+
"unrecognized platform name %0; did you mean '%1'?",
68446845
(Identifier, StringRef))
68456846
WARNING(availability_unsupported_version_number, none,
68466847
"'%0' is not a supported version number", (llvm::VersionTuple))

lib/AST/AvailabilityDomain.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -368,22 +368,29 @@ AvailabilityDomainOrIdentifier::lookUpInDeclContext(
368368
domain = results.front();
369369
}
370370

371+
bool hasCustomAvailability =
372+
ctx.LangOpts.hasFeature(Feature::CustomAvailability);
373+
371374
if (!domain) {
372375
auto domainString = identifier.str();
376+
bool downgradeErrors =
377+
!hasCustomAvailability || declContext->isInSwiftinterface();
373378
if (auto suggestion = closestCorrectedPlatformString(domainString)) {
374379
diags
375380
.diagnose(loc, diag::availability_suggest_platform_name, identifier,
376381
*suggestion)
382+
.limitBehaviorIf(downgradeErrors, DiagnosticBehavior::Warning)
377383
.fixItReplace(SourceRange(loc), *suggestion);
378384
} else {
379-
diags.diagnose(loc, diag::availability_unrecognized_platform_name,
380-
identifier);
385+
diags
386+
.diagnose(loc, diag::availability_unrecognized_platform_name,
387+
identifier)
388+
.limitBehaviorIf(downgradeErrors, DiagnosticBehavior::Warning);
381389
}
382390
return std::nullopt;
383391
}
384392

385-
if (domain->isCustom() &&
386-
!ctx.LangOpts.hasFeature(Feature::CustomAvailability) &&
393+
if (domain->isCustom() && !hasCustomAvailability &&
387394
!declContext->isInSwiftinterface()) {
388395
diags.diagnose(loc, diag::attr_availability_requires_custom_availability,
389396
*domain);

test/ClangImporter/Inputs/availability_custom_domains_other.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Seas
22

3-
@available(Arctic) // expected-warning {{unrecognized platform name 'Arctic'}}
3+
@available(Arctic) // expected-error {{unrecognized platform name 'Arctic'}}
44
func availableInArctic() { }
55

66
@available(Mediterranean)

test/ClangImporter/availability_custom_domains.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func availableInPacific() { }
4444
func unavailableInColorado() { } // expected-note {{'unavailableInColorado()' has been explicitly marked unavailable here}}
4545

4646
// The Seas module is only imported directly by the other source file.
47-
@available(Baltic) // expected-warning {{unrecognized platform name 'Baltic'}}
47+
@available(Baltic) // expected-error {{unrecognized platform name 'Baltic'}}
4848
func availableInBaltic() { } // expected-note {{did you mean 'availableInBaltic'}}
4949

5050
func testSwiftDecls() {

test/Parse/availability_query_custom_domains.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@
99
if #available(EnabledDomain) { }
1010
if #available(DisabledDomain) { }
1111
if #available(DynamicDomain) { }
12-
if #available(UnknownDomain) { } // expected-warning {{unrecognized platform name 'UnknownDomain'}}
12+
if #available(UnknownDomain) { } // expected-error {{unrecognized platform name 'UnknownDomain'}}
1313
// expected-error@-1 {{condition required for target platform}}
1414

1515
if #unavailable(EnabledDomain) { }
1616
if #unavailable(DisabledDomain) { }
1717
if #unavailable(DynamicDomain) { }
18-
if #unavailable(UnknownDomain) { } // expected-warning {{unrecognized platform name 'UnknownDomain'}}
18+
if #unavailable(UnknownDomain) { } // expected-error {{unrecognized platform name 'UnknownDomain'}}
1919

2020
if #available(EnabledDomain 1.0) { } // expected-error {{unexpected version number for EnabledDomain}}
2121
if #available(EnabledDomain, DisabledDomain) { } // expected-error {{EnabledDomain availability must be specified alone}}

test/Sema/availability_custom_domains.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func deprecatedInDynamicDomain() { }
2626
@available(DynamicDomain, unavailable)
2727
func unavailableInDynamicDomain() { } // expected-note * {{'unavailableInDynamicDomain()' has been explicitly marked unavailable here}}
2828

29-
@available(UnknownDomain) // expected-warning {{unrecognized platform name 'UnknownDomain'}}
29+
@available(UnknownDomain) // expected-error {{unrecognized platform name 'UnknownDomain'}}
3030
func availableInUnknownDomain() { }
3131

3232
func testDeployment() {

test/attr/attr_availability_custom_domains.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,5 @@ func deprecatedInRedefinedDomain() { }
5757
@available(DynamicDomain)
5858
func availableInDynamicDomain() { }
5959

60-
@available(UnknownDomain) // expected-warning {{unrecognized platform name 'UnknownDomain'}}
60+
@available(UnknownDomain) // expected-error {{unrecognized platform name 'UnknownDomain'}}
6161
func availableInUnknownDomain() { }
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Unrecognized availability platforms (AvailabilityUnrecognizedName)
2+
3+
Warnings that identify unrecognized platform names in `@available` attributes and `if #available` statements.
4+
5+
## Overview
6+
7+
The `AvailabilityUnrecognizedName` group covers warnings emitted when the platform name specified in an availability related construct is unrecognized by the compiler:
8+
9+
```
10+
@available(NotAValidPlatform, introduced: 1.0) // warning: unrecognized platform name 'NotAValidPlatform'
11+
public func function() {
12+
if #available(NotAValidPlatform 2.0, *) { // warning: unrecognized platform name 'NotAValidPlatform'
13+
// ...
14+
}
15+
}
16+
```
17+
18+
Availability specifications with unrecognized platform names in `@available` attributes and `#available` queries are ignored by the compiler.

0 commit comments

Comments
 (0)