Skip to content

Commit 7436be5

Browse files
authored
Merge pull request #82083 from tshortli/diagnose-unrecognized-availability-domains-as-errors-6.2
[6.2] AST: Diagnose unrecognized platforms as errors with `CustomAvailability` enabled
2 parents 1e46328 + f5bae41 commit 7436be5

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
@@ -6838,11 +6838,12 @@ ERROR(availability_must_occur_alone, none,
68386838
(AvailabilityDomain, bool))
68396839
ERROR(availability_unexpected_version, none,
68406840
"unexpected version number for %0", (AvailabilityDomain))
6841-
WARNING(availability_unrecognized_platform_name,
6842-
PointsToFirstBadToken, "unrecognized platform name %0", (Identifier))
6843-
WARNING(availability_suggest_platform_name,
6844-
PointsToFirstBadToken, "unrecognized platform name %0;"
6845-
" did you mean '%1'?",
6841+
GROUPED_ERROR(availability_unrecognized_platform_name,
6842+
AvailabilityUnrecognizedName, PointsToFirstBadToken,
6843+
"unrecognized platform name %0", (Identifier))
6844+
GROUPED_ERROR(availability_suggest_platform_name,
6845+
AvailabilityUnrecognizedName, PointsToFirstBadToken,
6846+
"unrecognized platform name %0; did you mean '%1'?",
68466847
(Identifier, StringRef))
68476848
WARNING(availability_unsupported_version_number, none,
68486849
"'%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)