================ @@ -467,6 +467,41 @@ struct TransferFunctions : public StmtVisitor<TransferFunctions> { AllValuesAreNoReturn = false; } } + + void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *CE) { + if (CE->getOperator() == OO_Call && CE->getNumArgs() > 0) { + Expr *Obj = CE->getArg(0)->IgnoreParenCasts(); + if (auto *MTE = dyn_cast<MaterializeTemporaryExpr>(Obj)) + Obj = MTE->getSubExpr(); + if (auto *DRE = dyn_cast<DeclRefExpr>(Obj)) { + auto *D = dyn_cast<VarDecl>(DRE->getDecl()); + if (D->hasInit()) + Obj = D->getInit(); + } + Visit(Obj); + } + } + + void VisitLambdaExpr(LambdaExpr *LE) { + for (const LambdaCapture &Capture : LE->captures()) + if (Capture.capturesVariable()) + if (const VarDecl *VD = dyn_cast<VarDecl>(Capture.getCapturedVar())) + if (VD == Var) + if (Capture.getCaptureKind() == LCK_ByRef) + AllValuesAreNoReturn = false; + } + + void VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *MTE) { + Visit(MTE->getSubExpr()); + } + + void VisitExprWithCleanups(FullExpr *FE) { + Visit(FE->getSubExpr()); + } + + void VisitCXXConstructExpr(CXXConstructExpr *CE) { + Visit(CE->getArg(0)); ---------------- erichkeane wrote:
This doesn't seem right at all. the 'this' argument in a `CXXConstructExpr ` does NOT get placed in the 0 arg (in fact, they are not present), so you can't assume 0 exists here. AND it isn't really clear why the 0 arg is important here, but others arent? https://github.com/llvm/llvm-project/pull/155213 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits