================
@@ -0,0 +1,256 @@
+// RUN: %clang_cc1 -fsyntax-only -fblocks -fcxx-exceptions -std=c++20 -verify 
%s
+// These are in a separate file because errors (e.g. incompatible attributes) 
currently prevent
+// the FXAnalysis pass from running at all.
+
+// This diagnostic is re-enabled and exercised in isolation later in this file.
+#pragma clang diagnostic ignored "-Wperf-constraint-implies-noexcept"
+
+// --- CONSTRAINTS ---
+
+void nb1() [[clang::nonblocking]]
+{
+       int *pInt = new int; // expected-warning {{'nonblocking' function must 
not allocate or deallocate memory}}
+       delete pInt; // expected-warning {{'nonblocking' function must not 
allocate or deallocate memory}}
+}
+
+void nb2() [[clang::nonblocking]]
+{
+       static int global; // expected-warning {{'nonblocking' function must 
not have static locals}}
+}
+
+void nb3() [[clang::nonblocking]]
+{
+       try {
+               throw 42; // expected-warning {{'nonblocking' function must not 
throw or catch exceptions}}
+       }
+       catch (...) { // expected-warning {{'nonblocking' function must not 
throw or catch exceptions}}
+       }
+}
+
----------------
dougsonos wrote:

I got this far:

```
def warn_func_effect_violation : Warning<
  "'%0' %select{function|constructor|destructor|constructor's member 
initializer|lambda|block}1 "
  "must not %select{allocate or deallocate memory|throw or catch exceptions|"
  "have static local variables|use thread-local variables|access ObjC methods 
or properties}2">,
  InGroup<FunctionEffects>;
def note_func_effect_violation : Note<
  "%select{function|constructor|destructor|member initializer|lambda|block}0 
cannot be inferred '%1' because it "
  "%select{allocates or deallocates memory|throws or catches exceptions|"
  "has a static local variable|uses a thread-local variable|"
  "accesses an ObjC method or property}2">;
def warn_func_effect_calls_func_without_effect : Warning<
  "'%0' function must not call non-'%0' function '%1'">,
  InGroup<FunctionEffects>;
def note_func_effect_calls_func_without_effect : Note<
  "function cannot be inferred '%0' because it calls non-'%0' function '%1'">;
```

Notice that the first two have customized "function".  The second and 
subsequent ones (there's another 6) could do the same thing but they'd have to 
duplicate those large '%select{}`s. Possibly my aversion to copy/pasting is 
excessive. But then again I can see other diagnostics that use "function" and 
could possibly be better if they used the more specific terms too... thus the 
slippery slope.

https://github.com/llvm/llvm-project/pull/99656
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to