================
@@ -878,6 +878,65 @@ void FactsGenerator::handleImplicitObjectFieldUses(const
Expr *Call,
});
}
+void FactsGenerator::handleLifetimeCaptureBy(const FunctionDecl *FD,
+ ArrayRef<const Expr *> Args) {
+ if (Args.empty())
+ return;
+ // FIXME: Add support for capture_by on constructors.
+ if (isa<CXXConstructorDecl>(FD))
+ return;
+ const auto *Method = dyn_cast<CXXMethodDecl>(FD);
+ bool IsInstance =
+ Method && Method->isInstance() && !isa<CXXConstructorDecl>(FD);
+ auto getArgCaptureBy = [FD,
+ IsInstance](unsigned I) -> LifetimeCaptureByAttr * {
+ const ParmVarDecl *PVD = nullptr;
+ if (IsInstance) {
+ // FIXME: Add support for I == 0 i.e. capture_by on function declarations
+ if (I > 0 && I - 1 < FD->getNumParams())
+ PVD = FD->getParamDecl(I - 1);
+ } else {
+ if (I < FD->getNumParams())
+ PVD = FD->getParamDecl(I);
+ }
+ return PVD ? PVD->getAttr<LifetimeCaptureByAttr>() : nullptr;
+ };
+ for (unsigned I = 0; I < Args.size(); ++I) {
+ const LifetimeCaptureByAttr *Attr = getArgCaptureBy(I);
+ if (!Attr)
+ continue;
+ OriginList *CapturedOriginList = getOriginsList(*Args[I]);
+ if (!CapturedOriginList)
+ continue;
+ if (isGslPointerType(Args[I]->getType())) {
+ assert(!Args[I]->isGLValue() || CapturedOriginList->getLength() >= 2);
+ CapturedOriginList = getRValueOrigins(Args[I], CapturedOriginList);
+ }
+ if (!CapturedOriginList)
+ continue;
+ for (int CapturedByIdx : Attr->params()) {
----------------
kashika0112 wrote:
I tried implementing this test case:
```cpp
void captureIntoTwo(View& v1, View& v2,
View s [[clang::lifetime_capture_by(v1, v2)]]);
void captured_by_multiple_params() {
View v1, v2;
{
MyObj local;
captureIntoTwo(v1, v2, local); // expected-warning {{local variable
'local' does not live long enough}}
} // expected-note {{destroyed here}}
(void)v1; // expected-note {{later used here}}
(void)v2;
}
```
Is it the expectation to generate a separate warning for (void)v2 as well.
Although I think it is possible that for the local variable, the usage of only
one of the diagnostics are being issued. (Note: Warnings for v2 are also issued
if used first).
https://github.com/llvm/llvm-project/pull/196884
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits