diff --git a/clang-tools-extra/clang-tidy/bugprone/UncheckedOptionalAccessCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/UncheckedOptionalAccessCheck.cpp --- a/clang-tools-extra/clang-tidy/bugprone/UncheckedOptionalAccessCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/UncheckedOptionalAccessCheck.cpp @@ -59,10 +59,11 @@ BlockToOutputState = dataflow::runDataflowAnalysis( *Context, Analysis, Env, [&ASTCtx, &Diagnoser, &Diagnostics]( - const Stmt *Stmt, + const CFGStmt &Stmt, const DataflowAnalysisState &State) mutable { - auto StmtDiagnostics = Diagnoser.diagnose(ASTCtx, Stmt, State.Env); + auto StmtDiagnostics = + Diagnoser.diagnose(ASTCtx, Stmt.getStmt(), State.Env); llvm::move(StmtDiagnostics, std::back_inserter(Diagnostics)); }); if (!BlockToOutputState) diff --git a/clang/include/clang/Analysis/FlowSensitive/DataflowAnalysis.h b/clang/include/clang/Analysis/FlowSensitive/DataflowAnalysis.h --- a/clang/include/clang/Analysis/FlowSensitive/DataflowAnalysis.h +++ b/clang/include/clang/Analysis/FlowSensitive/DataflowAnalysis.h @@ -125,14 +125,14 @@ runDataflowAnalysis( const ControlFlowContext &CFCtx, AnalysisT &Analysis, const Environment &InitEnv, - std::function &)> + std::function &)> PostVisitStmt = nullptr) { - std::function + std::function PostVisitStmtClosure = nullptr; if (PostVisitStmt != nullptr) { PostVisitStmtClosure = [&PostVisitStmt]( - const Stmt *Stmt, + const CFGStmt &Stmt, const TypeErasedDataflowAnalysisState &State) { auto *Lattice = llvm::any_cast(&State.Lattice.Value); diff --git a/clang/include/clang/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.h b/clang/include/clang/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.h --- a/clang/include/clang/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.h +++ b/clang/include/clang/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.h @@ -138,7 +138,8 @@ runTypeErasedDataflowAnalysis( const ControlFlowContext &CFCtx, TypeErasedDataflowAnalysis &Analysis, const Environment &InitEnv, - std::function + std::function PostVisitStmt = nullptr); } // namespace dataflow diff --git a/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp b/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp --- a/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp +++ b/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp @@ -333,7 +333,8 @@ runTypeErasedDataflowAnalysis( const ControlFlowContext &CFCtx, TypeErasedDataflowAnalysis &Analysis, const Environment &InitEnv, - std::function + std::function PostVisitStmt) { PostOrderCFGView POV(&CFCtx.getCFG()); ForwardDataflowWorklist Worklist(CFCtx.getCFG(), &POV); @@ -398,12 +399,9 @@ // Skip blocks that were not evaluated. if (!BlockStates[Block->getBlockID()]) continue; - transferBlock( - CFCtx, BlockStates, *Block, InitEnv, Analysis, - [&PostVisitStmt](const clang::CFGStmt &Stmt, - const TypeErasedDataflowAnalysisState &State) { - PostVisitStmt(Stmt.getStmt(), State); - }); + + transferBlock(CFCtx, BlockStates, *Block, InitEnv, Analysis, + PostVisitStmt); } } diff --git a/clang/unittests/Analysis/FlowSensitive/TestingSupport.h b/clang/unittests/Analysis/FlowSensitive/TestingSupport.h --- a/clang/unittests/Analysis/FlowSensitive/TestingSupport.h +++ b/clang/unittests/Analysis/FlowSensitive/TestingSupport.h @@ -76,7 +76,7 @@ llvm::StringRef Code, ast_matchers::internal::Matcher TargetFuncMatcher, std::function MakeAnalysis, - std::function PostVisitStmt, std::function VerifyResults, ArrayRef Args, @@ -112,11 +112,11 @@ Environment Env(DACtx, *F); auto Analysis = MakeAnalysis(Context, Env); - std::function + std::function PostVisitStmtClosure = nullptr; if (PostVisitStmt != nullptr) { PostVisitStmtClosure = [&PostVisitStmt, &Context]( - const Stmt *Stmt, + const CFGStmt &Stmt, const TypeErasedDataflowAnalysisState &State) { PostVisitStmt(Context, Stmt, State); }; diff --git a/clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp b/clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp --- a/clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp @@ -1245,9 +1245,10 @@ return UncheckedOptionalAccessModel(Ctx, Options); }, [&Diagnostics, Diagnoser = UncheckedOptionalAccessDiagnoser(Options)]( - ASTContext &Ctx, const Stmt *Stmt, + ASTContext &Ctx, const CFGStmt &Stmt, const TypeErasedDataflowAnalysisState &State) mutable { - auto StmtDiagnostics = Diagnoser.diagnose(Ctx, Stmt, State.Env); + auto StmtDiagnostics = + Diagnoser.diagnose(Ctx, Stmt.getStmt(), State.Env); llvm::move(StmtDiagnostics, std::back_inserter(Diagnostics)); }, [&Diagnostics](AnalysisData AnalysisData) {