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 @@ -41,7 +41,7 @@ /// must provide the following public members: /// * `LatticeT initialElement()` - returns a lattice element that models the /// initial state of a basic block; -/// * `void transfer(const CFGElement *, LatticeT &, Environment &)` - applies +/// * `void transfer(const CFGElement &, LatticeT &, Environment &)` - applies /// the analysis transfer function for a given CFG element and lattice /// element. /// @@ -122,8 +122,7 @@ void transferTypeErased(const CFGElement &Element, TypeErasedLattice &E, Environment &Env) final { Lattice &L = llvm::any_cast(E.Value); - // FIXME: change the contract of `transfer` to take a reference. - static_cast(this)->transfer(&Element, L, Env); + static_cast(this)->transfer(Element, L, Env); } void transferBranchTypeErased(bool Branch, const Stmt *Stmt, @@ -239,7 +238,7 @@ class DataflowModel : public Environment::ValueModel { public: /// Return value indicates whether the model processed the `Element`. - virtual bool transfer(const CFGElement *Element, Environment &Env) = 0; + virtual bool transfer(const CFGElement &Element, Environment &Env) = 0; }; } // namespace dataflow diff --git a/clang/include/clang/Analysis/FlowSensitive/Models/ChromiumCheckModel.h b/clang/include/clang/Analysis/FlowSensitive/Models/ChromiumCheckModel.h --- a/clang/include/clang/Analysis/FlowSensitive/Models/ChromiumCheckModel.h +++ b/clang/include/clang/Analysis/FlowSensitive/Models/ChromiumCheckModel.h @@ -13,7 +13,6 @@ #define CLANG_ANALYSIS_FLOWSENSITIVE_MODELS_CHROMIUMCHECKMODEL_H #include "clang/AST/DeclCXX.h" -#include "clang/AST/Stmt.h" #include "clang/Analysis/FlowSensitive/DataflowAnalysis.h" #include "clang/Analysis/FlowSensitive/DataflowEnvironment.h" #include "llvm/ADT/DenseSet.h" @@ -26,7 +25,7 @@ class ChromiumCheckModel : public DataflowModel { public: ChromiumCheckModel() = default; - bool transfer(const CFGElement *Element, Environment &Env) override; + bool transfer(const CFGElement &Element, Environment &Env) override; private: /// Declarations for `::logging::CheckError::.*Check`, lazily initialized. diff --git a/clang/include/clang/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.h b/clang/include/clang/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.h --- a/clang/include/clang/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.h +++ b/clang/include/clang/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.h @@ -52,7 +52,7 @@ static NoopLattice initialElement() { return {}; } - void transfer(const CFGElement *Elt, NoopLattice &L, Environment &Env); + void transfer(const CFGElement &Elt, NoopLattice &L, Environment &Env); ComparisonResult compare(QualType Type, const Value &Val1, const Environment &Env1, const Value &Val2, diff --git a/clang/include/clang/Analysis/FlowSensitive/NoopAnalysis.h b/clang/include/clang/Analysis/FlowSensitive/NoopAnalysis.h --- a/clang/include/clang/Analysis/FlowSensitive/NoopAnalysis.h +++ b/clang/include/clang/Analysis/FlowSensitive/NoopAnalysis.h @@ -38,7 +38,7 @@ static NoopLattice initialElement() { return {}; } - void transfer(const CFGElement *E, NoopLattice &L, Environment &Env) {} + void transfer(const CFGElement &E, NoopLattice &L, Environment &Env) {} }; } // namespace dataflow 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 @@ -104,6 +104,7 @@ /// @param Stmt The condition which is responsible for the split in the CFG. /// @param Branch True if the edge goes to the basic block where the /// condition is true. + // FIXME: Change `Stmt` argument to a reference. virtual void transferBranchTypeErased(bool Branch, const Stmt *, TypeErasedLattice &, Environment &) = 0; diff --git a/clang/lib/Analysis/FlowSensitive/Models/ChromiumCheckModel.cpp b/clang/lib/Analysis/FlowSensitive/Models/ChromiumCheckModel.cpp --- a/clang/lib/Analysis/FlowSensitive/Models/ChromiumCheckModel.cpp +++ b/clang/lib/Analysis/FlowSensitive/Models/ChromiumCheckModel.cpp @@ -50,8 +50,8 @@ return CheckDecls.contains(&D); } -bool ChromiumCheckModel::transfer(const CFGElement *Element, Environment &Env) { - auto CS = Element->getAs(); +bool ChromiumCheckModel::transfer(const CFGElement &Element, Environment &Env) { + auto CS = Element.getAs(); if (!CS) return false; auto Stmt = CS->getStmt(); diff --git a/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp b/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp --- a/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp +++ b/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp @@ -832,10 +832,10 @@ : DataflowAnalysis(Ctx), TransferMatchSwitch(buildTransferMatchSwitch()) {} -void UncheckedOptionalAccessModel::transfer(const CFGElement *Elt, +void UncheckedOptionalAccessModel::transfer(const CFGElement &Elt, NoopLattice &L, Environment &Env) { LatticeTransferState State(L, Env); - TransferMatchSwitch(*Elt, getASTContext(), State); + TransferMatchSwitch(Elt, getASTContext(), State); } ComparisonResult UncheckedOptionalAccessModel::compare( diff --git a/clang/unittests/Analysis/FlowSensitive/ChromiumCheckModelTest.cpp b/clang/unittests/Analysis/FlowSensitive/ChromiumCheckModelTest.cpp --- a/clang/unittests/Analysis/FlowSensitive/ChromiumCheckModelTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/ChromiumCheckModelTest.cpp @@ -118,7 +118,7 @@ static NoopLattice initialElement() { return NoopLattice(); } - void transfer(const CFGElement *E, NoopLattice &, Environment &Env) { + void transfer(const CFGElement &E, NoopLattice &, Environment &Env) { M.transfer(E, Env); } diff --git a/clang/unittests/Analysis/FlowSensitive/MultiVarConstantPropagationTest.cpp b/clang/unittests/Analysis/FlowSensitive/MultiVarConstantPropagationTest.cpp --- a/clang/unittests/Analysis/FlowSensitive/MultiVarConstantPropagationTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/MultiVarConstantPropagationTest.cpp @@ -133,9 +133,9 @@ return ConstantPropagationLattice::bottom(); } - void transfer(const CFGElement *E, ConstantPropagationLattice &Vars, + void transfer(const CFGElement &E, ConstantPropagationLattice &Vars, Environment &Env) { - auto CS = E->getAs(); + auto CS = E.getAs(); if (!CS) return; auto S = CS->getStmt(); diff --git a/clang/unittests/Analysis/FlowSensitive/SignAnalysisTest.cpp b/clang/unittests/Analysis/FlowSensitive/SignAnalysisTest.cpp --- a/clang/unittests/Analysis/FlowSensitive/SignAnalysisTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/SignAnalysisTest.cpp @@ -330,9 +330,9 @@ static NoopLattice initialElement() { return {}; } - void transfer(const CFGElement *Elt, NoopLattice &L, Environment &Env) { + void transfer(const CFGElement &Elt, NoopLattice &L, Environment &Env) { LatticeTransferState State(L, Env); - TransferMatchSwitch(*Elt, getASTContext(), State); + TransferMatchSwitch(Elt, getASTContext(), State); } bool merge(QualType Type, const Value &Val1, const Environment &Env1, const Value &Val2, const Environment &Env2, Value &MergedVal, diff --git a/clang/unittests/Analysis/FlowSensitive/SingleVarConstantPropagationTest.cpp b/clang/unittests/Analysis/FlowSensitive/SingleVarConstantPropagationTest.cpp --- a/clang/unittests/Analysis/FlowSensitive/SingleVarConstantPropagationTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/SingleVarConstantPropagationTest.cpp @@ -124,9 +124,9 @@ return ConstantPropagationLattice::bottom(); } - void transfer(const CFGElement *E, ConstantPropagationLattice &Element, + void transfer(const CFGElement &E, ConstantPropagationLattice &Element, Environment &Env) { - auto CS = E->getAs(); + auto CS = E.getAs(); if (!CS) return; auto S = CS->getStmt(); diff --git a/clang/unittests/Analysis/FlowSensitive/TransferBranchTest.cpp b/clang/unittests/Analysis/FlowSensitive/TransferBranchTest.cpp --- a/clang/unittests/Analysis/FlowSensitive/TransferBranchTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/TransferBranchTest.cpp @@ -44,7 +44,7 @@ explicit TestPropagationAnalysis(ASTContext &Context) : DataflowAnalysis(Context) {} static TestLattice initialElement() { return TestLattice::bottom(); } - void transfer(const CFGElement *, TestLattice &, Environment &) {} + void transfer(const CFGElement &, TestLattice &, Environment &) {} void transferBranch(bool Branch, const Stmt *S, TestLattice &L, Environment &Env) { L.Branch = Branch; diff --git a/clang/unittests/Analysis/FlowSensitive/TypeErasedDataflowAnalysisTest.cpp b/clang/unittests/Analysis/FlowSensitive/TypeErasedDataflowAnalysisTest.cpp --- a/clang/unittests/Analysis/FlowSensitive/TypeErasedDataflowAnalysisTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/TypeErasedDataflowAnalysisTest.cpp @@ -112,7 +112,7 @@ static NonConvergingLattice initialElement() { return {0}; } - void transfer(const CFGElement *, NonConvergingLattice &E, Environment &) { + void transfer(const CFGElement &, NonConvergingLattice &E, Environment &) { ++E.State; } }; @@ -194,8 +194,8 @@ static FunctionCallLattice initialElement() { return {}; } - void transfer(const CFGElement *Elt, FunctionCallLattice &E, Environment &) { - auto CS = Elt->getAs(); + void transfer(const CFGElement &Elt, FunctionCallLattice &E, Environment &) { + auto CS = Elt.getAs(); if (!CS) return; const auto *S = CS->getStmt(); @@ -350,8 +350,8 @@ static NoopLattice initialElement() { return {}; } - void transfer(const CFGElement *Elt, NoopLattice &, Environment &Env) { - auto CS = Elt->getAs(); + void transfer(const CFGElement &Elt, NoopLattice &, Environment &Env) { + auto CS = Elt.getAs(); if (!CS) return; const auto *S = CS->getStmt(); @@ -508,8 +508,8 @@ static NoopLattice initialElement() { return {}; } - void transfer(const CFGElement *Elt, NoopLattice &, Environment &Env) { - auto CS = Elt->getAs(); + void transfer(const CFGElement &Elt, NoopLattice &, Environment &Env) { + auto CS = Elt.getAs(); if (!CS) return; const Stmt *S = CS->getStmt(); @@ -1202,8 +1202,8 @@ static NoopLattice initialElement() { return {}; } - void transfer(const CFGElement *Elt, NoopLattice &, Environment &Env) { - auto CS = Elt->getAs(); + void transfer(const CFGElement &Elt, NoopLattice &, Environment &Env) { + auto CS = Elt.getAs(); if (!CS) return; const Stmt *S = CS->getStmt();