From 51f5499420e3e2344c1e6c3eff4764c4ec0b47ca Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Fri, 18 Jan 2008 00:38:55 +0000 Subject: [PATCH] Changed DataflowSolver to always associated recorded dataflow values with the position *before* a statement, regardless of whether we are doing a forward or backwards analysis. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46151 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Analysis/FlowSensitive/DataflowSolver.h | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/include/clang/Analysis/FlowSensitive/DataflowSolver.h b/include/clang/Analysis/FlowSensitive/DataflowSolver.h index 24ef6bb0ba..15f7107f26 100644 --- a/include/clang/Analysis/FlowSensitive/DataflowSolver.h +++ b/include/clang/Analysis/FlowSensitive/DataflowSolver.h @@ -235,10 +235,18 @@ private: /// ProcessBlock - Process the transfer functions for a given block. void ProcessBlock(const CFGBlock* B, bool recordStmtValues) { - for (StmtItr I=ItrTraits::StmtBegin(B), E=ItrTraits::StmtEnd(B); I!=E;++I) { - if (recordStmtValues) D.getStmtDataMap()[*I] = TF.getVal(); - TF.BlockStmt_Visit(const_cast(*I)); - } + for (StmtItr I=ItrTraits::StmtBegin(B), E=ItrTraits::StmtEnd(B); I!=E;++I) + ProcessStmt(*I, recordStmtValues, AnalysisDirTag()); + } + + void ProcessStmt(const Stmt* S, bool record, dataflow::forward_analysis_tag) { + if (record) D.getStmtDataMap()[S] = TF.getVal(); + TF.BlockStmt_Visit(const_cast(S)); + } + + void ProcessStmt(const Stmt* S, bool record, dataflow::backward_analysis_tag){ + TF.BlockStmt_Visit(const_cast(S)); + if (record) D.getStmtDataMap()[S] = TF.getVal(); } /// UpdateEdges - After processing the transfer functions for a -- 2.40.0