14#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SVALVISITOR_H
15#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SVALVISITOR_H
27template <
typename ImplClass,
typename RetTy =
void>
class SValVisitor {
30#define DISPATCH(NAME, CLASS) \
31 return static_cast<ImplClass *>(this)->Visit ## NAME(V.castAs<CLASS>())
36 switch (
V.getBaseKind()) {
37#define BASIC_SVAL(Id, Parent) case SVal::Id ## Kind: DISPATCH(Id, Id);
38#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def"
40 switch (
V.getSubKind()) {
41#define LOC_SVAL(Id, Parent) \
42 case loc::Id ## Kind: DISPATCH(Loc ## Id, loc :: Id);
43#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def"
45 llvm_unreachable(
"Unknown Loc sub-kind!");
46 case SVal::NonLocKind:
47 switch (
V.getSubKind()) {
48#define NONLOC_SVAL(Id, Parent) \
49 case nonloc::Id ## Kind: DISPATCH(NonLoc ## Id, nonloc :: Id);
50#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def"
52 llvm_unreachable(
"Unknown NonLoc sub-kind!");
54 llvm_unreachable(
"Unknown SVal kind!");
57#define BASIC_SVAL(Id, Parent) \
58 RetTy Visit ## Id(Id V) { DISPATCH(Parent, Id); }
59#define ABSTRACT_SVAL(Id, Parent) \
60 BASIC_SVAL(Id, Parent)
61#define LOC_SVAL(Id, Parent) \
62 RetTy VisitLoc ## Id(loc::Id V) { DISPATCH(Parent, Parent); }
63#define NONLOC_SVAL(Id, Parent) \
64 RetTy VisitNonLoc ## Id(nonloc::Id V) { DISPATCH(Parent, Parent); }
65#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def"
78#define DISPATCH(CLASS) \
79 return static_cast<ImplClass *>(this)->Visit ## CLASS(cast<CLASS>(S))
83 switch (S->getKind()) {
84#define SYMBOL(Id, Parent) \
85 case SymExpr::Id ## Kind: DISPATCH(Id);
86#include "clang/StaticAnalyzer/Core/PathSensitive/Symbols.def"
88 llvm_unreachable(
"Unknown SymExpr kind!");
93#define SYMBOL(Id, Parent) RetTy Visit ## Id(const Id *S) { DISPATCH(Parent); }
94#define ABSTRACT_SYMBOL(Id, Parent) SYMBOL(Id, Parent)
95#include "clang/StaticAnalyzer/Core/PathSensitive/Symbols.def"
108#define DISPATCH(CLASS) \
109 return static_cast<ImplClass *>(this)->Visit ## CLASS(cast<CLASS>(R))
114#define REGION(Id, Parent) case MemRegion::Id ## Kind: DISPATCH(Id);
115#include "clang/StaticAnalyzer/Core/PathSensitive/Regions.def"
117 llvm_unreachable(
"Unknown MemRegion kind!");
122#define REGION(Id, Parent) \
123 RetTy Visit ## Id(const Id *R) { DISPATCH(Parent); }
124#define ABSTRACT_REGION(Id, Parent) \
126#include "clang/StaticAnalyzer/Core/PathSensitive/Regions.def"
136template <
typename ImplClass,
typename RetTy =
void>
FullSValVisitor - a convenient mixed visitor for all three: SVal, SymExpr and MemRegion subclasses.
MemRegionVisitor - this class implements a simple visitor for MemRegion subclasses.
RetTy Visit(const MemRegion *R)
RetTy VisitMemRegion(const MemRegion *R)
MemRegion - The root abstract class for all memory regions.
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.
SymExprVisitor - this class implements a simple visitor for SymExpr subclasses.
RetTy VisitSymExpr(SymbolRef S)