================
@@ -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}}
+ }
+}
+
----------------
Sirraide wrote:
Sounds good. We can come back to that later (or not if it turns out that the
diagnostic is already obvious enough). I think member initialisers (and maybe
default arguments too; I forgot what we’re doing for those atm) are the main
cases where the location of the code that contains the problem doesn’t make it
obvious where it was invoked from.
https://github.com/llvm/llvm-project/pull/99656
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits