https://github.com/bazuzi created https://github.com/llvm/llvm-project/pull/98490
These are not "original initializers"; the single node underneath represents the initializing node. >From 8f51730d1f4bbca740a01b89780b6ed9bee3c3d7 Mon Sep 17 00:00:00 2001 From: Samira Bazuzi <baz...@google.com> Date: Thu, 11 Jul 2024 09:56:17 -0400 Subject: [PATCH] Propagate the result object location for CXXDefaultInitExpr. These are not "original initializers"; the single node underneath represents the initializing node. --- .../lib/Analysis/FlowSensitive/DataflowEnvironment.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp b/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp index 7c88917faf9c6..f734168e647bd 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 @@ class ResultObjectVisitor : public AnalysisASTVisitor<ResultObjectVisitor> { // 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 @@ class ResultObjectVisitor : public AnalysisASTVisitor<ResultObjectVisitor> { 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()); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits