================ @@ -793,3 +806,202 @@ void test13() { } } // namespace GH100526 + +namespace lifetime_capture_by { +struct X { + const int *x; + void captureInt(const int& x [[clang::lifetime_capture_by(this)]]) { this->x = &x; } + void captureSV(std::string_view sv [[clang::lifetime_capture_by(this)]]); +}; +/////////////////////////// +// Detect dangling cases. +/////////////////////////// +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); + +std::string_view substr(const std::string& s [[clang::lifetimebound]]); +std::string_view strcopy(const std::string& s); + +void captureSV(std::string_view s [[clang::lifetime_capture_by(x)]], X& x); +void captureRValSV(std::string_view&& sv [[clang::lifetime_capture_by(x)]], X& x); +void noCaptureSV(std::string_view sv, X& x); +void captureS(const std::string& s [[clang::lifetime_capture_by(x)]], X& x); +void captureRValS(std::string&& s [[clang::lifetime_capture_by(x)]], X& x); + +const std::string& getLB(const std::string& s[[clang::lifetimebound]]); +const std::string& getLB(std::string_view sv[[clang::lifetimebound]]); +const std::string* getPointerLB(const std::string& s[[clang::lifetimebound]]); +const std::string* getPointerNoLB(const std::string& s); + +void capturePointer(const std::string* sp [[clang::lifetime_capture_by(x)]], X& x); + +struct ThisIsCaptured { + void capture(X& x) [[clang::lifetime_capture_by(x)]]; + void bar(X& x) [[clang::lifetime_capture_by(abcd)]]; // expected-error {{'lifetime_capture_by' attribute argument 'abcd' is not a known function parameter}} ---------------- usx95 wrote:
Done. https://github.com/llvm/llvm-project/pull/115921 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits