[clang] nonblocking/nonallocating attributes: 2nd pass caller/callee analysis (PR #99656)
Doug Wyatt via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 20 07:27:12 PDT 2024
================
@@ -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:
That's an excellent thought about default arguments; currently there is a confusing diagnostic.
```
int badForDefaultArg();
// warning: 'nonblocking' function must not call non-'nonblocking' function 'badForDefaultArg' [-Wfunction-effects]
// This call site is really in nb21() and we are only trying to infer nonblocking for hasDefaultArg(), not verifying.
void hasDefaultArg(int param = badForDefaultArg()) {
}
void nb21() [[clang::nonblocking]] {
hasDefaultArg();
}
```
https://github.com/llvm/llvm-project/pull/99656
More information about the cfe-commits
mailing list