[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