aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
diff options
context:
space:
mode:
authormartinboehme <mboehme@google.com>2024-04-18 09:23:03 +0200
committerGitHub <noreply@github.com>2024-04-18 09:23:03 +0200
commitb5f2cecf833f8d08197cda80ac684c250b8fa0f9 (patch)
tree93ec180a0d476721f27cb3d6323295d8e315a674 /clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
parentfcdb2203e05002f0488221f6a0cab42e1a34f8fc (diff)
downloadllvm-b5f2cecf833f8d08197cda80ac684c250b8fa0f9.zip
llvm-b5f2cecf833f8d08197cda80ac684c250b8fa0f9.tar.gz
llvm-b5f2cecf833f8d08197cda80ac684c250b8fa0f9.tar.bz2
Revert "[clang][dataflow] Refactor `PropagateResultObject()` with a switch statement." (#89176)
Reverts llvm/llvm-project#88865 There were failing tests in the CI that I didn't notice. Sorry.
Diffstat (limited to 'clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp')
-rw-r--r--clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp86
1 files changed, 36 insertions, 50 deletions
diff --git a/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp b/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
index e5aaa8f..3f1600d 100644
--- a/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
+++ b/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
@@ -414,52 +414,25 @@ 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).
- 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);
+ 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)) {
return;
}
- case Stmt::BinaryConditionalOperatorClass:
- case Stmt::ConditionalOperatorClass: {
- auto *Cond = cast<AbstractConditionalOperator>(E);
- PropagateResultObject(Cond->getTrueExpr(), Loc);
- PropagateResultObject(Cond->getFalseExpr(), Loc);
- return;
- }
- case Stmt::StmtExprClass: {
- auto *SE = cast<StmtExpr>(E);
- PropagateResultObject(cast<Expr>(SE->getSubStmt()->body_back()), Loc);
+ if (auto *Op = dyn_cast<BinaryOperator>(E);
+ Op && Op->getOpcode() == BO_Cmp) {
+ // Builtin `<=>` returns a `std::strong_ordering` object.
return;
}
- case Stmt::InitListExprClass: {
- auto *InitList = cast<InitListExpr>(E);
+
+ if (auto *InitList = dyn_cast<InitListExpr>(E)) {
if (!InitList->isSemanticForm())
return;
if (InitList->isTransparent()) {
@@ -489,20 +462,33 @@ public:
}
return;
}
- 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);
+
+ if (auto *Op = dyn_cast<BinaryOperator>(E); Op && Op->isCommaOp()) {
+ PropagateResultObject(Op->getRHS(), 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: