================
@@ -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()) {
----------------
usx95 wrote:
Thanks. This is working as expected. Whichever appears first becomes
responsible for keeping the expired loan live.
Another identical test swapping v1 and v2 at the use site would be useful to
verify that v2 also has the loans.
https://github.com/llvm/llvm-project/pull/196884
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits