diff options
author | Samira Bazuzi <bazuzi@google.com> | 2024-07-13 03:38:49 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-13 00:38:49 -0700 |
commit | 3fed312d2bca7d44734ace75d18890675da0f89b (patch) | |
tree | 1889aefc1be33e80d7f670c8c998ec7fec8de218 /clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp | |
parent | 1fe406fffe11dad0457a4d214ce67bf492196145 (diff) | |
download | llvm-3fed312d2bca7d44734ace75d18890675da0f89b.zip llvm-3fed312d2bca7d44734ace75d18890675da0f89b.tar.gz llvm-3fed312d2bca7d44734ace75d18890675da0f89b.tar.bz2 |
[clang][dataflow]Propagate the result object location for CXXDefaultInitExpr. (#98490)
These are not "original initializers"; the single node underneath
represents the initializing node.
Diffstat (limited to 'clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp')
-rw-r--r-- | clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp b/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp index 7c88917..f734168 100644 --- a/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp +++ b/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp @@ -15,6 +15,7 @@ #include "clang/Analysis/FlowSensitive/DataflowEnvironment.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclCXX.h" +#include "clang/AST/ExprCXX.h" #include "clang/AST/RecursiveASTVisitor.h" #include "clang/AST/Stmt.h" #include "clang/AST/Type.h" @@ -414,8 +415,8 @@ public: // lowest-level AST node that initializes a given object, and nothing // below them can initialize the same object (or part of it). if (isa<CXXConstructExpr>(E) || isa<CallExpr>(E) || isa<LambdaExpr>(E) || - isa<CXXDefaultArgExpr>(E) || isa<CXXDefaultInitExpr>(E) || - isa<CXXStdInitializerListExpr>(E) || isa<AtomicExpr>(E) || + isa<CXXDefaultArgExpr>(E) || isa<CXXStdInitializerListExpr>(E) || + isa<AtomicExpr>(E) || // We treat `BuiltinBitCastExpr` as an "original initializer" too as // it may not even be casting from a record type -- and even if it is, // the two objects are in general of unrelated type. @@ -463,6 +464,11 @@ public: return; } + if (auto *DIE = dyn_cast<CXXDefaultInitExpr>(E)) { + PropagateResultObject(DIE->getExpr(), Loc); + return; + } + // All other expression nodes that propagate a record prvalue should have // exactly one child. SmallVector<Stmt *, 1> Children(E->child_begin(), E->child_end()); |