1717#include " clang/AST/ASTContext.h"
1818#include " clang/Analysis/CFG.h"
1919#include " clang/Analysis/FlowSensitive/CFGMatchSwitch.h"
20+ #include " clang/Analysis/FlowSensitive/CachedConstAccessorsLattice.h"
2021#include " clang/Analysis/FlowSensitive/DataflowAnalysis.h"
2122#include " clang/Analysis/FlowSensitive/DataflowEnvironment.h"
2223#include " clang/Analysis/FlowSensitive/NoopLattice.h"
@@ -39,23 +40,28 @@ struct UncheckedOptionalAccessModelOptions {
3940 bool IgnoreSmartPointerDereference = false ;
4041};
4142
43+ using UncheckedOptionalAccessLattice = CachedConstAccessorsLattice<NoopLattice>;
44+
4245// / Dataflow analysis that models whether optionals hold values or not.
4346// /
4447// / Models the `std::optional`, `absl::optional`, and `base::Optional` types.
4548class UncheckedOptionalAccessModel
46- : public DataflowAnalysis<UncheckedOptionalAccessModel, NoopLattice> {
49+ : public DataflowAnalysis<UncheckedOptionalAccessModel,
50+ UncheckedOptionalAccessLattice> {
4751public:
4852 UncheckedOptionalAccessModel (ASTContext &Ctx, dataflow::Environment &Env);
4953
5054 // / Returns a matcher for the optional classes covered by this model.
5155 static ast_matchers::DeclarationMatcher optionalClassDecl ();
5256
53- static NoopLattice initialElement () { return {}; }
57+ static UncheckedOptionalAccessLattice initialElement () { return {}; }
5458
55- void transfer (const CFGElement &Elt, NoopLattice &L, Environment &Env);
59+ void transfer (const CFGElement &Elt, UncheckedOptionalAccessLattice &L,
60+ Environment &Env);
5661
5762private:
58- CFGMatchSwitch<TransferState<NoopLattice>> TransferMatchSwitch;
63+ CFGMatchSwitch<TransferState<UncheckedOptionalAccessLattice>>
64+ TransferMatchSwitch;
5965};
6066
6167class UncheckedOptionalAccessDiagnoser {
@@ -65,7 +71,8 @@ class UncheckedOptionalAccessDiagnoser {
6571
6672 llvm::SmallVector<SourceLocation>
6773 operator ()(const CFGElement &Elt, ASTContext &Ctx,
68- const TransferStateForDiagnostics<NoopLattice> &State) {
74+ const TransferStateForDiagnostics<UncheckedOptionalAccessLattice>
75+ &State) {
6976 return DiagnoseMatchSwitch (Elt, Ctx, State.Env );
7077 }
7178
0 commit comments