[clang] [Clang][HLSL] Add environment parameter to availability attribute (PR #89809)
Chris B via cfe-commits
cfe-commits at lists.llvm.org
Tue May 14 08:10:33 PDT 2024
================
@@ -772,40 +816,58 @@ void DiagnoseUnguardedAvailability::DiagnoseDeclAvailability(
const AvailabilityAttr *AA =
getAttrForPlatform(SemaRef.getASTContext(), OffendingDecl);
+ bool EnvironmentMatchesOrNone =
+ hasMatchingEnvironmentOrNone(SemaRef.getASTContext(), AA);
VersionTuple Introduced = AA->getIntroduced();
- if (AvailabilityStack.back() >= Introduced)
+ if (EnvironmentMatchesOrNone && AvailabilityStack.back() >= Introduced)
return;
// If the context of this function is less available than D, we should not
// emit a diagnostic.
- if (!ShouldDiagnoseAvailabilityInContext(SemaRef, Result, Introduced, Ctx,
+ if (!ShouldDiagnoseAvailabilityInContext(SemaRef, Result, Introduced,
+ AA->getEnvironment(), Ctx,
OffendingDecl))
return;
// We would like to emit the diagnostic even if -Wunguarded-availability is
// not specified for deployment targets >= to iOS 11 or equivalent or
// for declarations that were introduced in iOS 11 (macOS 10.13, ...) or
// later.
- unsigned DiagKind =
- shouldDiagnoseAvailabilityByDefault(
- SemaRef.Context,
- SemaRef.Context.getTargetInfo().getPlatformMinVersion(), Introduced)
- ? diag::warn_unguarded_availability_new
- : diag::warn_unguarded_availability;
-
- std::string PlatformName(AvailabilityAttr::getPrettyPlatformName(
- SemaRef.getASTContext().getTargetInfo().getPlatformName()));
-
- SemaRef.Diag(Range.getBegin(), DiagKind)
- << Range << D << PlatformName << Introduced.getAsString();
+ bool UseNewDiagKind = shouldDiagnoseAvailabilityByDefault(
+ SemaRef.Context,
+ SemaRef.Context.getTargetInfo().getPlatformMinVersion(), Introduced);
+
+ const TargetInfo &TI = SemaRef.getASTContext().getTargetInfo();
+ std::string PlatformName(
+ AvailabilityAttr::getPrettyPlatformName(TI.getPlatformName()));
+ llvm::StringRef TargetEnvironment(AvailabilityAttr::getPrettyEnviromentName(
+ TI.getTriple().getEnvironmentName()));
+ llvm::StringRef AttrEnvironment =
+ AA->getEnvironment() ? AvailabilityAttr::getPrettyEnviromentName(
+ AA->getEnvironment()->getName())
+ : "";
+ bool UseEnvironment =
+ (!AttrEnvironment.empty() && !TargetEnvironment.empty());
+
+ if (EnvironmentMatchesOrNone) {
+ unsigned DiagKind = UseNewDiagKind ? diag::warn_unguarded_availability_new
+ : diag::warn_unguarded_availability;
+ SemaRef.Diag(Range.getBegin(), DiagKind)
+ << Range << D << PlatformName << Introduced.getAsString()
+ << UseEnvironment << TargetEnvironment;
+ } else {
+ unsigned DiagKind =
+ UseNewDiagKind ? diag::warn_unguarded_availability_unavailable_new
+ : diag::warn_unguarded_availability_unavailable;
+ SemaRef.Diag(Range.getBegin(), DiagKind) << Range << D;
+ }
----------------
llvm-beanz wrote:
We can do a similar thing here too. Something like:
```suggestion
unsigned Warning =
EnvironmentMatchesOrNone
? (UseNewDiagKind ? diag::warn_unguarded_availability_new
: diag::warn_unguarded_availability)
: (UseNewDiagKind
? diag::warn_unguarded_availability_unavailable_new
: diag::warn_unguarded_availability_unavailable);
SemaRef.Diag(Range.getBegin(), DiagKind)
<< Range << D << PlatformName << Introduced.getAsString()
<< UseEnvironment << TargetEnvironment;
```
https://github.com/llvm/llvm-project/pull/89809
More information about the cfe-commits
mailing list