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 @@ -63,9 +63,15 @@ using Lattice = LatticeT; explicit DataflowAnalysis(ASTContext &Context) : Context(Context) {} + + /// Deprecated. Use the `DataflowAnalysisOptions` constructor instead. explicit DataflowAnalysis(ASTContext &Context, bool ApplyBuiltinTransfer) : TypeErasedDataflowAnalysis(ApplyBuiltinTransfer), Context(Context) {} + explicit DataflowAnalysis(ASTContext &Context, + DataflowAnalysisOptions Options) + : TypeErasedDataflowAnalysis(Options), Context(Context) {} + ASTContext &getASTContext() final { return Context; } TypeErasedLattice typeErasedInitialElement() final { 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 @@ -24,13 +24,17 @@ class NoopAnalysis : public DataflowAnalysis { public: + /// Deprecated. Use the `DataflowAnalysisOptions` constructor instead. + NoopAnalysis(ASTContext &Context, bool ApplyBuiltinTransfer) + : DataflowAnalysis(Context, + ApplyBuiltinTransfer) {} + /// `ApplyBuiltinTransfer` controls whether to run the built-in transfer /// functions that model memory during the analysis. Their results are not /// used by `NoopAnalysis`, but tests that need to inspect the environment /// should enable them. - NoopAnalysis(ASTContext &Context, bool ApplyBuiltinTransfer) - : DataflowAnalysis(Context, - ApplyBuiltinTransfer) {} + NoopAnalysis(ASTContext &Context, DataflowAnalysisOptions Options) + : DataflowAnalysis(Context, Options) {} static NoopLattice initialElement() { return {}; } 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 @@ -30,6 +30,14 @@ namespace clang { namespace dataflow { +struct DataflowAnalysisOptions { + /// Determines whether to apply the built-in transfer functions. + // FIXME: Remove this option once the framework supports composing analyses + // (at which point the built-in transfer functions can be simply a standalone + // analysis). + bool ApplyBuiltinTransfer = true; +}; + /// Type-erased lattice element container. /// /// Requirements: @@ -42,16 +50,17 @@ /// Type-erased base class for dataflow analyses built on a single lattice type. class TypeErasedDataflowAnalysis : public Environment::ValueModel { - /// Determines whether to apply the built-in transfer functions. - // FIXME: Remove this option once the framework supports composing analyses - // (at which point the built-in transfer functions can be simply a standalone - // analysis). - bool ApplyBuiltinTransfer; + DataflowAnalysisOptions Options; public: - TypeErasedDataflowAnalysis() : ApplyBuiltinTransfer(true) {} + TypeErasedDataflowAnalysis() : Options({}) {} + + /// Deprecated. Use the `DataflowAnalysisOptions` constructor instead. TypeErasedDataflowAnalysis(bool ApplyBuiltinTransfer) - : ApplyBuiltinTransfer(ApplyBuiltinTransfer) {} + : Options({ApplyBuiltinTransfer}) {} + + TypeErasedDataflowAnalysis(DataflowAnalysisOptions Options) + : Options(Options) {} virtual ~TypeErasedDataflowAnalysis() {} @@ -80,7 +89,7 @@ /// Determines whether to apply the built-in transfer functions, which model /// the heap and stack in the `Environment`. - bool applyBuiltinTransfer() const { return ApplyBuiltinTransfer; } + bool applyBuiltinTransfer() const { return Options.ApplyBuiltinTransfer; } }; /// Type-erased model of the program at a given program point.