15 #ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SVALVISITOR_H
16 #define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SVALVISITOR_H
28 template <
typename ImplClass,
typename RetTy =
void>
class SValVisitor {
31 #define DISPATCH(NAME, CLASS) \
32 return static_cast<ImplClass *>(this)->Visit ## NAME(V.castAs<CLASS>())
38 #define BASIC_SVAL(Id, Parent) case SVal::Id ## Kind: DISPATCH(Id, Id);
39 #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def"
42 #define LOC_SVAL(Id, Parent) \
43 case loc::Id ## Kind: DISPATCH(Loc ## Id, loc :: Id);
44 #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def"
46 llvm_unreachable(
"Unknown Loc sub-kind!");
47 case SVal::NonLocKind:
49 #define NONLOC_SVAL(Id, Parent) \
50 case nonloc::Id ## Kind: DISPATCH(NonLoc ## Id, nonloc :: Id);
51 #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def"
53 llvm_unreachable(
"Unknown NonLoc sub-kind!");
55 llvm_unreachable(
"Unknown SVal kind!");
58 #define BASIC_SVAL(Id, Parent) \
59 RetTy Visit ## Id(Id V) { DISPATCH(Parent, Id); }
60 #define ABSTRACT_SVAL(Id, Parent) \
61 BASIC_SVAL(Id, Parent)
62 #define LOC_SVAL(Id, Parent) \
63 RetTy VisitLoc ## Id(loc::Id V) { DISPATCH(Parent, Parent); }
64 #define NONLOC_SVAL(Id, Parent) \
65 RetTy VisitNonLoc ## Id(nonloc::Id V) { DISPATCH(Parent, Parent); }
66 #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def"
79 #define DISPATCH(CLASS) \
80 return static_cast<ImplClass *>(this)->Visit ## CLASS(cast<CLASS>(S))
85 #define SYMBOL(Id, Parent) \
86 case SymExpr::Id ## Kind: DISPATCH(Id);
87 #include "clang/StaticAnalyzer/Core/PathSensitive/Symbols.def"
89 llvm_unreachable(
"Unknown SymExpr kind!");
94 #define SYMBOL(Id, Parent) RetTy Visit ## Id(const Id *S) { DISPATCH(Parent); }
95 #define ABSTRACT_SYMBOL(Id, Parent) SYMBOL(Id, Parent)
96 #include "clang/StaticAnalyzer/Core/PathSensitive/Symbols.def"
109 #define DISPATCH(CLASS) \
110 return static_cast<ImplClass *>(this)->Visit ## CLASS(cast<CLASS>(R))
115 #define REGION(Id, Parent) case MemRegion::Id ## Kind: DISPATCH(Id);
116 #include "clang/StaticAnalyzer/Core/PathSensitive/Regions.def"
118 llvm_unreachable(
"Unknown MemRegion kind!");
123 #define REGION(Id, Parent) \
124 RetTy Visit ## Id(const Id *R) { DISPATCH(Parent); }
125 #define ABSTRACT_REGION(Id, Parent) \
127 #include "clang/StaticAnalyzer/Core/PathSensitive/Regions.def"
137 template <
typename ImplClass,
typename RetTy =
void>
MemRegion - The root abstract class for all memory regions.
MemRegionVisitor - this class implements a simple visitor for MemRegion subclasses.
BaseKind getBaseKind() const
FullSValVisitor - a convenient mixed visitor for all three: SVal, SymExpr and MemRegion subclasses...
SymExprVisitor - this class implements a simple visitor for SymExpr subclasses.
RetTy VisitMemRegion(const MemRegion *R)
RetTy Visit(const MemRegion *R)
RetTy VisitSymExpr(SymbolRef S)
SValVisitor - this class implements a simple visitor for SVal subclasses.
SVal - This represents a symbolic expression, which can be either an L-value or an R-value...
unsigned getSubKind() const