[clang] [llvm] [clang] Implement lifetime analysis for lifetime_capture_by(X) (PR #115921)
Boaz Brickner via cfe-commits
cfe-commits at lists.llvm.org
Wed Nov 20 03:12:20 PST 2024
================
@@ -0,0 +1,348 @@
+// RUN: %clang_cc1 --std=c++20 -fsyntax-only -Wdangling -Wdangling-field -Wreturn-stack-address -verify %s
+
+#include "Inputs/lifetime-analysis.h"
+
+struct X {
+ const int *x;
+};
+X x;
+
+// ****************************************************************************
+// Capture an integer
+// ****************************************************************************
+namespace capture_int {
+void captureInt(const int &i [[clang::lifetime_capture_by(x)]], X &x);
+void captureRValInt(int &&i [[clang::lifetime_capture_by(x)]], X &x);
+void noCaptureInt(int i [[clang::lifetime_capture_by(x)]], X &x);
+
+void use() {
+ int local;
+ captureInt(1, // expected-warning {{object whose reference is captured by 'x' will be destroyed at the end of the full-expression}}
+ x);
+ captureRValInt(1, x); // expected-warning {{object whose reference is captured by 'x'}}
----------------
bricknerb wrote:
I think it's very helpful for multiple reasons:
1. Documentation perspective: it clarifies what warning is expected and makes use cases.
2. Makes tests easier to search for when copying the warning text.
3. While it doesn't add test coverage, the single case that does check the entire text is also tests for a specific use case, and if we happen to remove it (perhaps it's covered by somewhere else), we might forget to add the full text to a different case and we will lose coverage.
https://github.com/llvm/llvm-project/pull/115921
More information about the cfe-commits
mailing list