xazax.hun added inline comments.
================ Comment at: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp:248-258 + for (unsigned ArgIndex = 0; ArgIndex < NumArgs; ++ParamIt, ++ArgIndex) { assert(ParamIt != FuncDecl->param_end()); - const Expr *Arg = *ArgIt; - auto *ArgLoc = Env.getStorageLocation(*Arg, SkipPast::Reference); + const Expr *Arg; + if (const auto *ConstructExpr = dyn_cast<CXXConstructExpr>(Call)) { + Arg = ConstructExpr->getArg(ArgIndex); + } else if (const auto *NonConstructExpr = dyn_cast<CallExpr>(Call)) { ---------------- samestep wrote: > xazax.hun wrote: > > I think the more idiomatic solution in Clang is to create an ArrayRef for > > the arguments from the `ConstructExpr` and the `CallExpr`. The args should > > be stored in a continuous memory area in both cases so you should be able > > to create the ArrayRef in constant time and you would no longer need to > > have these pesky if statements in your loop. > Ah OK, thanks! How should I do that? I was previously using iterators but it > looked like the types were different between `CallExpr` and > `CXXConstructExpr`, so I switched away from iterators in this patch; is there > an easy way to make the `ArrayRef`? Here is an example: https://github.com/llvm/llvm-project/blob/main/clang/lib/Sema/SemaInit.cpp#L7086 Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D131438/new/ https://reviews.llvm.org/D131438 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits