Skip to content

Commit 6ab32cf

Browse files
committed
Sema: Parameterize potential unavailability diagnostics to allow no version.
This allows `X is only available in` diagnostics to be emitted for potential unavailability in domains that do not support versioning.
1 parent 0bf464b commit 6ab32cf

File tree

2 files changed

+26
-33
lines changed

2 files changed

+26
-33
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6823,20 +6823,15 @@ NOTE(availability_decl_more_than_enclosing_here, none,
68236823
"enclosing scope requires availability of %0 %1 or newer",
68246824
(AvailabilityDomain, AvailabilityRange))
68256825

6826-
ERROR(availability_decl_only_version_newer, none,
6827-
"%0 is only available in %1 %2 or newer",
6828-
(const ValueDecl *, AvailabilityDomain, AvailabilityRange))
6829-
6830-
ERROR(availability_decl_only_version_newer_for_clients, none,
6831-
"%0 is only available in %1 %2 or newer; clients of %3 may have a lower"
6832-
" deployment target",
6833-
(const ValueDecl *, AvailabilityDomain, AvailabilityRange, ModuleDecl *))
6826+
ERROR(availability_decl_only_in, none,
6827+
"%0 is only available in %1%select{| %3 or newer}2",
6828+
(const ValueDecl *, AvailabilityDomain, bool, AvailabilityRange))
68346829

6835-
WARNING(availability_decl_only_version_newer_for_clients_warn, none,
6836-
"%0 is only available in %1 %2 or newer; clients of %3 may have a lower"
6837-
" deployment target",
6838-
(const ValueDecl *, AvailabilityDomain, AvailabilityRange,
6839-
ModuleDecl *))
6830+
ERROR(availability_decl_only_in_for_clients, none,
6831+
"%0 is only available in %1%select{| %3 or newer}2"
6832+
"%select{|; clients of %4 may have a lower deployment target}2",
6833+
(const ValueDecl *, AvailabilityDomain, bool, AvailabilityRange,
6834+
ModuleDecl *))
68406835

68416836
ERROR(availability_opaque_types_only_version_newer, none,
68426837
"'some' return types are only available in %0 %1 or newer",
@@ -6884,9 +6879,10 @@ FIXIT(insert_available_attr,
68846879
"@available(%0 %1, *)\n%2",
68856880
(StringRef, StringRef, StringRef))
68866881

6887-
ERROR(availability_inout_accessor_only_version_newer, none,
6888-
"cannot pass as inout because %0 is only available in %1 %2 or newer",
6889-
(const ValueDecl *, AvailabilityDomain, AvailabilityRange))
6882+
ERROR(availability_inout_accessor_only_in, none,
6883+
"cannot pass as inout because %0 is only available in %1"
6884+
"%select{| %3 or newer}2",
6885+
(const ValueDecl *, AvailabilityDomain, bool, AvailabilityRange))
68906886

68916887
ERROR(availability_query_required_for_platform, none,
68926888
"condition required for target platform '%0'", (StringRef))

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2248,27 +2248,23 @@ static Diagnostic getPotentialUnavailabilityDiagnostic(
22482248
bool WarnBeforeDeploymentTarget, bool &IsError) {
22492249
ASTContext &Context = ReferenceDC->getASTContext();
22502250

2251-
if (!Availability.hasMinimumVersion()) {
2252-
// FIXME: [availability] Need a version-less diagnostic.
2253-
return Diagnostic(diag::availability_decl_only_version_newer, D, Domain,
2254-
AvailabilityRange(llvm::VersionTuple()));
2255-
}
2256-
22572251
if (requiresDeploymentTargetOrEarlier(Domain, Availability, Context)) {
22582252
// The required OS version is at or before the deployment target so this
22592253
// diagnostic should indicate that the decl could be unavailable to clients
22602254
// of the module containing the reference.
22612255
IsError = !WarnBeforeDeploymentTarget;
22622256

2263-
return Diagnostic(
2264-
IsError ? diag::availability_decl_only_version_newer_for_clients
2265-
: diag::availability_decl_only_version_newer_for_clients_warn,
2266-
D, Domain, Availability, ReferenceDC->getParentModule());
2257+
auto diag = Diagnostic(diag::availability_decl_only_in_for_clients, D,
2258+
Domain, Availability.hasMinimumVersion(),
2259+
Availability, ReferenceDC->getParentModule());
2260+
if (!IsError)
2261+
diag.setBehaviorLimit(DiagnosticBehavior::Warning);
2262+
return diag;
22672263
}
22682264

22692265
IsError = true;
2270-
return Diagnostic(diag::availability_decl_only_version_newer, D, Domain,
2271-
Availability);
2266+
return Diagnostic(diag::availability_decl_only_in, D, Domain,
2267+
Availability.hasMinimumVersion(), Availability);
22722268
}
22732269

22742270
// Emits a diagnostic for a reference to a declaration that is potentially
@@ -2311,13 +2307,14 @@ static void diagnosePotentialAccessorUnavailability(
23112307

23122308
assert(Accessor->isGetterOrSetter());
23132309

2314-
auto &diag = ForInout ? diag::availability_inout_accessor_only_version_newer
2315-
: diag::availability_decl_only_version_newer;
2310+
auto &diag = ForInout ? diag::availability_inout_accessor_only_in
2311+
: diag::availability_decl_only_in;
23162312

23172313
{
2318-
auto Err = Context.Diags.diagnose(ReferenceRange.Start, diag, Accessor,
2319-
Context.getTargetAvailabilityDomain(),
2320-
Availability);
2314+
auto Err =
2315+
Context.Diags.diagnose(ReferenceRange.Start, diag, Accessor,
2316+
Context.getTargetAvailabilityDomain(),
2317+
Availability.hasMinimumVersion(), Availability);
23212318

23222319
// Direct a fixit to the error if an existing guard is nearly-correct
23232320
if (fixAvailabilityByNarrowingNearbyVersionCheck(

0 commit comments

Comments
 (0)