diff options
author | martinboehme <mboehme@google.com> | 2024-04-18 09:21:10 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-18 09:21:10 +0200 |
commit | da579ad807bd55c686e1c1c52e0a4bcc259347b4 (patch) | |
tree | 2280e6f9a974a169045ce3e388d0aa9c079db227 /clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp | |
parent | 9760b6b1ecff3d3c43d182ea488fa34a82472a3e (diff) | |
download | llvm-da579ad807bd55c686e1c1c52e0a4bcc259347b4.zip llvm-da579ad807bd55c686e1c1c52e0a4bcc259347b4.tar.gz llvm-da579ad807bd55c686e1c1c52e0a4bcc259347b4.tar.bz2 |
[clang][dataflow] Refactor `PropagateResultObject()` with a switch statement. (#88865)
See also discussion in #88726.
Diffstat (limited to 'clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp')
-rw-r--r-- | clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp | 86 |
1 files changed, 50 insertions, 36 deletions
diff --git a/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp b/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp index 3f1600d..e5aaa8f 100644 --- a/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp +++ b/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp @@ -414,25 +414,52 @@ public: ResultObjectMap[E] = Loc; + switch (E->getStmtClass()) { // The following AST node kinds are "original initializers": They are the // 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) || - // 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. - isa<BuiltinBitCastExpr>(E)) { + case Stmt::CXXConstructExprClass: + case Stmt::CallExprClass: + case Stmt::LambdaExprClass: + case Stmt::CXXDefaultArgExprClass: + case Stmt::CXXDefaultInitExprClass: + case Stmt::CXXStdInitializerListExprClass: + // 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. + case Stmt::BuiltinBitCastExprClass: + return; + case Stmt::BinaryOperatorClass: { + auto *Op = cast<BinaryOperator>(E); + if (Op->getOpcode() == BO_Cmp) { + // Builtin `<=>` returns a `std::strong_ordering` object. We + // consider this to be an "original" initializer too (see above). + return; + } + if (Op->isCommaOp()) { + PropagateResultObject(Op->getRHS(), Loc); + return; + } + // We don't expect any other binary operators to produce a record + // prvalue, so if we get here, we've hit some case we don't know + // about. + assert(false); return; } - if (auto *Op = dyn_cast<BinaryOperator>(E); - Op && Op->getOpcode() == BO_Cmp) { - // Builtin `<=>` returns a `std::strong_ordering` object. + case Stmt::BinaryConditionalOperatorClass: + case Stmt::ConditionalOperatorClass: { + auto *Cond = cast<AbstractConditionalOperator>(E); + PropagateResultObject(Cond->getTrueExpr(), Loc); + PropagateResultObject(Cond->getFalseExpr(), Loc); return; } - - if (auto *InitList = dyn_cast<InitListExpr>(E)) { + case Stmt::StmtExprClass: { + auto *SE = cast<StmtExpr>(E); + PropagateResultObject(cast<Expr>(SE->getSubStmt()->body_back()), Loc); + return; + } + case Stmt::InitListExprClass: { + auto *InitList = cast<InitListExpr>(E); if (!InitList->isSemanticForm()) return; if (InitList->isTransparent()) { @@ -462,33 +489,20 @@ public: } return; } - - if (auto *Op = dyn_cast<BinaryOperator>(E); Op && Op->isCommaOp()) { - PropagateResultObject(Op->getRHS(), Loc); + default: { + // All other expression nodes that propagate a record prvalue should + // have exactly one child. + SmallVector<Stmt *, 1> Children(E->child_begin(), E->child_end()); + LLVM_DEBUG({ + if (Children.size() != 1) + E->dump(); + }); + assert(Children.size() == 1); + for (Stmt *S : Children) + PropagateResultObject(cast<Expr>(S), Loc); return; } - - if (auto *Cond = dyn_cast<AbstractConditionalOperator>(E)) { - PropagateResultObject(Cond->getTrueExpr(), Loc); - PropagateResultObject(Cond->getFalseExpr(), Loc); - return; } - - if (auto *SE = dyn_cast<StmtExpr>(E)) { - PropagateResultObject(cast<Expr>(SE->getSubStmt()->body_back()), 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()); - LLVM_DEBUG({ - if (Children.size() != 1) - E->dump(); - }); - assert(Children.size() == 1); - for (Stmt *S : Children) - PropagateResultObject(cast<Expr>(S), Loc); } private: |