[clang] [clang] Improve the lifetime_capture_by diagnostic on the constructor. (PR #117792)
Haojian Wu via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 28 01:34:18 PST 2024
================
@@ -623,6 +623,26 @@ static void visitFunctionCallArguments(IndirectLocalPath &Path, Expr *Call,
}
if (CheckCoroCall || Callee->getParamDecl(I)->hasAttr<LifetimeBoundAttr>())
VisitLifetimeBoundArg(Callee->getParamDecl(I), Arg);
+ else if (const auto *CaptureAttr =
+ Callee->getParamDecl(I)->getAttr<LifetimeCaptureByAttr>();
+ CaptureAttr && isa<CXXConstructorDecl>(Callee) &&
+ llvm::any_of(CaptureAttr->params(), [](int ArgIdx) {
+ return ArgIdx == LifetimeCaptureByAttr::THIS;
+ }))
+ // `lifetime_capture_by(this)` in a class constructor has the same
+ // semantics as `lifetimebound`:
+ //
+ // struct Foo {
+ // const int& a;
+ // // Equivalent to Foo(const int& t [[clang::lifetimebound]])
+ // Foo(const int& t [[clang::lifetime_capture_by(this)]]) : a(t) {}
+ // };
+ //
+ // In the implementation, `lifetime_capture_by` is treated as an alias for
+ // `lifetimebound` and shares the same code path. This implies the emitted
+ // diagnostics will be emitted under `-Wdangling`, not
+ // `-Wdangling-capture`.
+ VisitLifetimeBoundArg(Callee->getParamDecl(I), Arg);
----------------
hokein wrote:
Done.
https://github.com/llvm/llvm-project/pull/117792
More information about the cfe-commits
mailing list