28#include "llvm/Support/Casting.h"
29#include "llvm/Support/Compiler.h"
30#include "llvm/Support/ErrorHandling.h"
31#include "llvm/Support/raw_ostream.h"
47 if (std::optional<loc::MemRegionVal>
X = getAs<loc::MemRegionVal>()) {
50 if (
const auto *FD = dyn_cast<FunctionDecl>(CTR->getDecl()))
54 if (
auto X = getAs<nonloc::PointerToMember>()) {
55 if (
const auto *MD = dyn_cast_or_null<CXXMethodDecl>(
X->getDecl()))
73 : dyn_cast<SymbolicRegion>(R->StripCasts()))
74 return SymR->getSymbol();
81 std::optional<loc::MemRegionVal>
X = getAs<loc::MemRegionVal>();
88 while (
const auto *SR = dyn_cast<SubRegion>(R)) {
89 if (
const auto *SymR = dyn_cast<SymbolicRegion>(SR))
90 return SymR->getSymbol();
92 R = SR->getSuperRegion();
106 if (std::optional<nonloc::SymbolVal>
X = getAs<nonloc::SymbolVal>())
107 return X->getSymbol();
113 if (
auto CI = getAs<nonloc::ConcreteInt>())
114 return CI->getValue().get();
115 if (
auto CI = getAs<loc::ConcreteInt>())
116 return CI->getValue().get();
121 if (std::optional<loc::MemRegionVal>
X = getAs<loc::MemRegionVal>())
122 return X->getRegion();
124 if (std::optional<nonloc::LocAsInteger>
X = getAs<nonloc::LocAsInteger>())
125 return X->getLoc().getAsRegion();
131class TypeRetrievingVisitor
137 TypeRetrievingVisitor(
const ASTContext &Context) : Context(Context) {}
145 template <
class ConcreteInt>
QualType VisitConcreteInt(ConcreteInt CI) {
146 const llvm::APSInt &
Value = CI.getValue();
147 if (1 ==
Value.getBitWidth())
182 TypeRetrievingVisitor TRV{Context};
183 return TRV.Visit(*
this);
199 return getPTMData().isNull();
203 const auto PTMD = this->getPTMData();
208 if (
const auto *NDP = dyn_cast<const NamedDecl *>(PTMD))
211 ND = cast<const PointerToMemberData *>(PTMD)->getDeclaratorDecl();