33#include "llvm/ADT/StringMap.h"
38using ::clang::ast_matchers::MatchFinder;
45 while (!NamespaceNames.empty() && NS) {
46 if (NS->
getName() != NamespaceNames.consume_back())
48 NS = dyn_cast_or_null<NamespaceDecl>(NS->
getParent());
50 return NamespaceNames.empty() && !NS;
59 if (RD->getName() == Name)
60 if (
const auto *N = dyn_cast_or_null<NamespaceDecl>(RD->getDeclContext()))
66 return isTypeNamed(
Type, {
"absl",
"internal_statusor"},
"OperatorBase");
75 return OkVal !=
nullptr && Env.
proves(OkVal->formula());
88 if (!RD->hasDefinition())
90 for (
const auto &
Base : RD->bases())
102 return ofClass(
hasName(
"::absl::Status"));
162 "::absl::AbortedError",
"::absl::AlreadyExistsError",
163 "::absl::CancelledError",
"::absl::DataLossError",
164 "::absl::DeadlineExceededError",
"::absl::FailedPreconditionError",
165 "::absl::InternalError",
"::absl::InvalidArgumentError",
166 "::absl::NotFoundError",
"::absl::OutOfRangeError",
167 "::absl::PermissionDeniedError",
"::absl::ResourceExhaustedError",
168 "::absl::UnauthenticatedError",
"::absl::UnavailableError",
169 "::absl::UnimplementedError",
"::absl::UnknownError"))));
190 hasArgument(1,
anyOf(hasType(hasUnqualifiedDesugaredType(
191 type(equalsBoundNode(
"T")))),
192 nullPointerConstant())));
200 anyOf(hasType(hasCanonicalType(
type(equalsBoundNode(
"T")))),
201 nullPointerConstant(),
203 "std::in_place_t"))))));
263 parameterCountIs(0), isConst(),
270 parameterCountIs(0), isConst(),
289 .CaseOfCFGStmt<CXXMemberCallExpr>(
300 .CaseOfCFGStmt<CXXOperatorCallExpr>(
322 return DiagnoseMatchSwitch(Elt, Ctx, State.Env);
341 hasTemplateArgument(0, refersToType(
type().bind(
"T"))));
352 hasName(
"absl::internal_statusor::OperatorBase"));
397 if (StatusOrLoc ==
nullptr)
401 State.Env.setValue(*
Expr, OkVal);
409 if (StatusOrLoc ==
nullptr)
414 if (State.Env.getValue(
locForOk(StatusLoc)) ==
nullptr)
418 copyRecord(StatusLoc, State.Env.getResultObjectLocation(*
Expr), State.Env);
420 State.Env.setStorageLocation(*
Expr, StatusLoc);
428 if (StatusLoc ==
nullptr)
432 State.Env.setValue(*
Expr, *Val);
440 assert(
Expr->getNumArgs() == 1);
441 auto *Arg =
Expr->getArg(0);
443 Arg->isPRValue() ? &State.Env.getResultObjectLocation(*Arg)
446 if (ThisLoc ==
nullptr || ArgRecord ==
nullptr)
449 auto &ThisOkVal =
valForOk(*ThisLoc, State.Env);
450 auto &ArgOkVal =
valForOk(*ArgRecord, State.Env);
451 auto &A = State.Env.arena();
452 auto &NewVal = State.Env.makeAtomicBoolValue();
453 State.Env.assume(A.makeImplies(A.makeNot(ThisOkVal.formula()),
454 A.makeNot(NewVal.formula())));
455 State.Env.assume(A.makeImplies(NewVal.formula(), ArgOkVal.formula()));
456 State.Env.setValue(
locForOk(*ThisLoc), NewVal);
462 auto &A = Env.
arena();
472 auto &LhsOkVal =
valForOk(LhsStatusLoc, Env);
473 auto &RhsOkVal =
valForOk(RhsStatusLoc, Env);
478 Env.
assume(A.makeImplies(A.makeAnd(LhsOkVal.formula(), RhsOkVal.formula()),
482 Res.formula(), A.makeEquals(LhsOkVal.formula(), RhsOkVal.formula())));
491 auto &A = Env.
arena();
507 res.formula(), A.makeEquals(LhsOkVal.formula(), RhsOkVal.formula())));
518 if (LhsStatusOrLoc ==
nullptr)
521 if (RhsStatusOrLoc ==
nullptr)
528 if (LhsStatusLoc ==
nullptr)
532 if (RhsStatusLoc ==
nullptr)
545 if (LhsAndRhsVal ==
nullptr)
549 State.Env.setValue(*
Expr, State.Env.makeNot(*LhsAndRhsVal));
551 State.Env.setValue(*
Expr, *LhsAndRhsVal);
557 return dyn_cast<RecordStorageLocation>(&PointerVal->getPointeeLoc());
572 if (LhsStatusOrLoc ==
nullptr || RhsStatusOrLoc ==
nullptr)
581 if (LhsStatusLoc ==
nullptr || RhsStatusLoc ==
nullptr)
583 auto &LhsOkVal =
valForOk(*LhsStatusLoc, Env);
584 auto &RhsOkVal =
valForOk(*RhsStatusLoc, Env);
586 auto &A = Env.
arena();
588 Res.formula(), A.makeEquals(LhsOkVal.formula(), RhsOkVal.formula())));
597 if (LhsAndRhsVal ==
nullptr)
601 State.Env.setValue(*
Expr, State.Env.makeNot(*LhsAndRhsVal));
603 State.Env.setValue(*
Expr, *LhsAndRhsVal);
611 State.Env.assume(OkVal.formula());
619 auto &A = State.Env.arena();
620 State.Env.assume(A.makeNot(OkVal.formula()));
628 if (StatusOrLoc ==
nullptr)
632 State.Env.assume(OkVal.formula());
638 assert(
Expr->getNumArgs() > 1);
641 if (StatusOrLoc ==
nullptr)
645 State.Env.assume(OkVal.formula());
653 State.Env.assume(OkVal.formula());
662 if (State.Env.getValue(
locForOk(StatusLoc)) ==
nullptr)
671 if (State.Env.getValue(
locForOk(StatusLoc)) ==
nullptr)
678 assert(
Expr->getNumArgs() == 1);
681 auto *ArgLoc = State.Env.getStorageLocation(*
Expr->getArg(0));
682 if (ArgLoc ==
nullptr)
685 State.Env.setStorageLocation(*
Expr, *ArgLoc);
691 assert(
Expr->getNumArgs() > 2);
694 if (EqVal ==
nullptr)
700 State.Env.setValue(*
Expr, State.Env.makeNot(*EqVal));
706 assert(
Expr->getNumArgs() == 1);
709 if (ArgLoc ==
nullptr)
712 if (State.Env.getValue(
locForOk(*ArgLoc)) ==
nullptr)
715 auto &ExprVal = State.Env.create<
PointerValue>(*ArgLoc);
716 State.Env.setValue(*
Expr, ExprVal);
722 assert(
Expr->getNumArgs() == 1);
725 if (ArgLoc ==
nullptr)
730 if (State.Env.getValue(
locForOk(StatusLoc)) ==
nullptr)
733 auto &ExprVal = State.Env.create<
PointerValue>(StatusLoc);
734 State.Env.setValue(*
Expr, ExprVal);
740 if (
auto *SubExprVal =
741 dyn_cast_or_null<BoolValue>(State.Env.getValue(*
Expr->getSubExpr())))
742 State.Env.setValue(*
Expr, *SubExprVal);
750 if (StatusOrLoc !=
nullptr &&
762 if (DirectCallee ==
nullptr)
765 State.Lattice.getOrCreateConstMethodReturnStorageLocation(
767 initializeStatusOr(cast<RecordStorageLocation>(Loc), State.Env);
770 auto &ResultLoc = State.Env.getResultObjectLocation(*
Expr);
773 State.Env.setStorageLocation(*
Expr, Loc);
789 auto *Val = State.Lattice.getOrCreateConstMethodReturnValue(*
RecordLoc,
Expr,
791 State.Env.setValue(*
Expr, *Val);
805 auto *
RecordLoc = cast_or_null<RecordStorageLocation>(
806 State.Env.getStorageLocation(*
Expr->getArg(0)));
820 auto *
RecordLoc = cast_or_null<RecordStorageLocation>(
821 State.Env.getStorageLocation(*
Expr->getArg(0)));
830 State.Lattice.clearConstMethodReturnValues(*
RecordLoc);
831 State.Lattice.clearConstMethodReturnStorageLocations(*
RecordLoc);
848 auto *
RecordLoc = cast_or_null<RecordStorageLocation>(
849 State.Env.getStorageLocation(*
Expr->getArg(0)));
857 if (
auto *PointerVal = dyn_cast_or_null<PointerValue>(Env.
getValue(E)))
858 return dyn_cast_or_null<RecordStorageLocation>(
859 &PointerVal->getPointeeLoc());
867 return std::move(Builder)
883 .CaseOfCFGStmt<CXXOperatorCallExpr>(
890 .CaseOfCFGStmt<BinaryOperator>(
897 .CaseOfCFGStmt<BinaryOperator>(
932 .CaseOfCFGStmt<CXXOperatorCallExpr>(
941 .CaseOfCFGStmt<CXXMemberCallExpr>(
949 .CaseOfCFGStmt<CXXMemberCallExpr>(
963 .CaseOfCFGStmt<CXXMemberCallExpr>(
984 .CaseOfCFGStmt<ImplicitCastExpr>(
1004 Env.getDataflowAnalysisContext().setSyntheticFieldCallback(
1005 [StatusType](
QualType Ty) -> llvm::StringMap<QualType> {
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
llvm::MachO::RecordLoc RecordLoc
Defines the clang::SourceLocation class and associated facilities.
C Language Family Type Representation.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const SmallVectorImpl< Type * > & getTypes() const
A builtin binary operation expression such as "x + y" or "x <= y".
Represents a top-level expression in a basic block.
Represents a call to a C++ constructor.
Represents a call to a member function that may be written either with member call syntax (e....
SourceLocation getExprLoc() const LLVM_READONLY
A call to an overloaded operator written using operator syntax.
Represents a C++ struct/union/class.
bool hasDefinition() const
bool isDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is derived from the class Base.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
Represents a class template specialization, which refers to a class template with a given set of temp...
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the class template specialization.
DeclContext * getParent()
getParent - Returns the containing DeclContext.
ASTContext & getASTContext() const LLVM_READONLY
This represents one expression.
Represents a function declaration or definition.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Represent a C++ namespace.
A (possibly-)qualified type.
const TemplateArgument & get(unsigned Idx) const
Retrieve the template argument at a given index.
QualType getAsType() const
Retrieve the type for a type template argument.
The base class of the type hierarchy.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isPointerType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Collects cases of a "match switch": a collection of matchers paired with callbacks,...
ASTContext & getASTContext() final
DataflowAnalysis(ASTContext &Context)
CachedConstAccessorsLattice< NoopLattice > Lattice
Holds the state of the program (store and heap) at a given program point.
StorageLocation * getStorageLocation(const ValueDecl &D) const
Returns the storage location assigned to D in the environment, or null if D isn't assigned a storage ...
BoolValue & makeAtomicBoolValue() const
Returns an atomic boolean value.
bool proves(const Formula &) const
Returns true if the formula is always true when this point is reached.
Value * getValue(const StorageLocation &Loc) const
Returns the value assigned to Loc in the environment or null if Loc isn't assigned a value in the env...
void assume(const Formula &)
Record a fact that must be true if this point in the program is reached.
void setValue(const StorageLocation &Loc, Value &Val)
Assigns Val as the value of Loc in the environment.
std::enable_if_t< std::is_base_of_v< StorageLocation, T >, T * > get(const ValueDecl &D) const
Returns the result of casting getStorageLocation(...) to a subclass of StorageLocation (using cast_or...
Models a symbolic pointer. Specifically, any value of type T*.
A storage location for a record (struct, class, or union).
StorageLocation & getSyntheticField(llvm::StringRef Name) const
Returns the storage location for the synthetic field Name.
Base class for elements of the local variable store and of the heap.
Base class for all values computed by abstract interpretation.
UncheckedStatusOrAccessDiagnoser(UncheckedStatusOrAccessModelOptions Options={})
llvm::SmallVector< SourceLocation > operator()(const CFGElement &Elt, ASTContext &Ctx, const TransferStateForDiagnostics< UncheckedStatusOrAccessModel::Lattice > &State)
UncheckedStatusOrAccessModel(ASTContext &Ctx, Environment &Env)
void transfer(const CFGElement &Elt, Lattice &L, Environment &Env)
internal::Matcher< QualType > TypeMatcher
const internal::VariadicOperatorMatcherFunc< 1, 1 > unless
Matches if the provided matcher does not match.
internal::Matcher< Decl > DeclarationMatcher
Types of matchers for the top-level classes in the AST class hierarchy.
const internal::VariadicDynCastAllOfMatcher< Stmt, ImplicitCastExpr > implicitCastExpr
Matches the implicit cast nodes of Clang's AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, CallExpr > callExpr
Matches call expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, NamedDecl > namedDecl
Matches a declaration of anything that could have a name.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicFunction< internal::Matcher< NamedDecl >, StringRef, internal::hasAnyNameFunc > hasAnyName
Matches NamedDecl nodes that have any of the specified names.
internal::Matcher< Stmt > StatementMatcher
const internal::VariadicDynCastAllOfMatcher< Stmt, BinaryOperator > binaryOperator
Matches binary operator expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXConstructExpr > cxxConstructExpr
Matches constructor call expressions (including implicit ones).
const internal::VariadicDynCastAllOfMatcher< Decl, ClassTemplateSpecializationDecl > classTemplateSpecializationDecl
Matches C++ class template specializations.
const internal::VariadicDynCastAllOfMatcher< Decl, FunctionDecl > functionDecl
Matches function declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, CXXRecordDecl > cxxRecordDecl
Matches C++ class declarations.
internal::PolymorphicMatcher< internal::HasDeclarationMatcher, void(internal::HasDeclarationSupportedTypes), internal::Matcher< Decl > > hasDeclaration(const internal::Matcher< Decl > &InnerMatcher)
Matches a node if the declaration associated with that node matches the given matcher.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
const internal::VariadicOperatorMatcherFunc< 2, std::numeric_limits< unsigned >::max()> anyOf
Matches if any of the given matchers matches.
const internal::VariadicAllOfMatcher< QualType > qualType
Matches QualTypes in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXThisExpr > cxxThisExpr
Matches implicit and explicit this expressions.
static void transferLoggingCheckEqImpl(const CallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
static void transferStatusOrReturningCall(const CallExpr *Expr, LatticeTransferState &State)
static void transferValueAssignmentCall(const CXXOperatorCallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
TransferState< UncheckedStatusOrAccessModel::Lattice > LatticeTransferState
static ClassTemplateSpecializationDecl * getStatusOrBaseClass(const QualType &Ty)
static bool isStatusOrOperatorBaseType(QualType Type)
static void transferConstStatusOrAccessorMemberCall(const CXXMemberCallExpr *Expr, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
static auto isStatusMemberCallWithName(llvm::StringRef member_name)
static auto buildDiagnoseMatchSwitch(const UncheckedStatusOrAccessModelOptions &Options)
static auto isStatusOrValueConstructor()
static auto isConstStatusOrAccessorMemberCall()
static auto isComparisonOperatorCall(llvm::StringRef operator_name)
RecordStorageLocation & locForStatus(RecordStorageLocation &StatusOrLoc)
static auto isLoggingCheckEqImpl()
static void transferNotOkStatusCall(const CallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
static BoolValue * evaluateStatusEquality(RecordStorageLocation &LhsStatusLoc, RecordStorageLocation &RhsStatusLoc, Environment &Env)
static void transferStatusConstructor(const CXXConstructExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
static BoolValue * evaluateStatusOrEquality(RecordStorageLocation &LhsStatusOrLoc, RecordStorageLocation &RhsStatusOrLoc, Environment &Env)
static auto isNonConstMemberOperatorCall()
static auto isStatusOrOperatorCallWithName(llvm::StringRef operator_name)
static void transferNonConstMemberOperatorCall(const CXXOperatorCallExpr *Expr, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
static void transferValueConstructor(const CXXConstructExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
static auto isOkStatusCall()
static void transferComparisonOperator(const CXXOperatorCallExpr *Expr, LatticeTransferState &State, bool IsNegative)
static void transferConstStatusOrPointerAccessorMemberCall(const CXXMemberCallExpr *Expr, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
clang::ast_matchers::DeclarationMatcher statusOrClass()
static auto isConstStatusOrAccessorMemberOperatorCall()
static void transferOkStatusCall(const CallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
static auto isPointerComparisonOperatorCall(std::string operator_name)
clang::ast_matchers::TypeMatcher statusOrType()
static auto isStatusConstructor()
static bool isSafeUnwrap(RecordStorageLocation *StatusOrLoc, const Environment &Env)
static void transferPointerComparisonOperator(const BinaryOperator *Expr, LatticeTransferState &State, bool IsNegative)
static void transferNonConstMemberCall(const CXXMemberCallExpr *Expr, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
static void transferStatusOrOkCall(const CXXMemberCallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
static bool namespaceEquals(const NamespaceDecl *NS, clang::ArrayRef< clang::StringRef > NamespaceNames)
static bool isTypeNamed(QualType Type, clang::ArrayRef< clang::StringRef > NS, StringRef Name)
static void transferStatusOrConstructor(const CXXConstructExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
static void transferLoggingGetReferenceableValueCall(const CallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
static auto valueOperatorCall()
clang::ast_matchers::DeclarationMatcher statusClass()
static auto ofClassStatus()
static RecordStorageLocation * getSmartPtrLikeStorageLocation(const Expr &E, const Environment &Env)
static void handleNonConstMemberCall(const CallExpr *Expr, RecordStorageLocation *RecordLoc, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
BoolValue & initializeStatusOr(RecordStorageLocation &StatusOrLoc, Environment &Env)
static void transferAsStatusCallWithStatusOr(const CallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
static auto possiblyReferencedStatusOrType()
static auto isLoggingGetReferenceableValueCall()
QualType findStatusType(const ASTContext &Ctx)
BoolValue & initializeStatus(RecordStorageLocation &StatusLoc, Environment &Env)
static void transferPointerToBoolean(const ImplicitCastExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
llvm::StringMap< QualType > getSyntheticFields(QualType Ty, QualType StatusType, const CXXRecordDecl &RD)
StorageLocation & locForOk(RecordStorageLocation &StatusLoc)
static auto isAsStatusCallWithStatusOr()
static auto isNonConstMemberCall()
static void transferConstStatusOrPointerAccessorMemberOperatorCall(const CXXOperatorCallExpr *Expr, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
static void handleConstStatusOrPointerAccessorMemberCall(const CallExpr *Expr, RecordStorageLocation *RecordLoc, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
static auto isStatusOrMemberCallWithName(llvm::StringRef member_name)
static auto isConstStatusOrPointerAccessorMemberOperatorCall()
static BoolValue * evaluateEquality(const Expr *LhsExpr, const Expr *RhsExpr, Environment &Env)
static auto isConstStatusOrPointerAccessorMemberCall()
static void transferStatusCall(const CXXMemberCallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
static clang::ast_matchers::TypeMatcher statusType()
static void transferStatusOkCall(const CXXMemberCallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
static void transferEmplaceCall(const CXXMemberCallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
static auto isStatusOrValueAssignmentCall()
static void transferAsStatusCallWithStatus(const CallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
static auto isStatusOrConstructor()
static BoolValue * evaluatePointerEquality(const Expr *LhsExpr, const Expr *RhsExpr, Environment &Env)
static QualType getStatusOrValueType(ClassTemplateSpecializationDecl *TRD)
static RecordStorageLocation * getPointeeLocation(const Expr &Expr, Environment &Env)
static auto isAsStatusCallWithStatus()
BoolValue & valForOk(RecordStorageLocation &StatusLoc, Environment &Env)
bool isStatusOrType(QualType Type)
static auto isNotOkStatusCall()
static void transferConstStatusOrAccessorMemberOperatorCall(const CXXOperatorCallExpr *Expr, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
static void transferStatusUpdateCall(const CXXMemberCallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
static bool doHandleConstStatusOrAccessorMemberCall(const CallExpr *Expr, RecordStorageLocation *RecordLoc, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
CFGMatchSwitch< LatticeTransferState > buildTransferMatchSwitch(ASTContext &Ctx, CFGMatchSwitchBuilder< LatticeTransferState > Builder)
static void handleConstStatusOrAccessorMemberCall(const CallExpr *Expr, RecordStorageLocation *RecordLoc, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
bool isStatusType(QualType Type)
clang::ast_matchers::DeclarationMatcher statusOrOperatorBaseClass()
ast_matchers::StatementMatcher isSmartPointerLikeValueMethodCall(clang::StringRef MethodName="value")
void transferSmartPointerLikeCachedDeref(const CallExpr *DerefExpr, RecordStorageLocation *SmartPointerLoc, TransferState< LatticeT > &State, llvm::function_ref< void(StorageLocation &)> InitializeLoc)
A transfer function for operator* (and value) calls that can be cached.
ast_matchers::StatementMatcher isPointerLikeOperatorStar()
Matchers: For now, these match on any class with an operator* or operator-> where the return types ha...
void copyRecord(RecordStorageLocation &Src, RecordStorageLocation &Dst, Environment &Env, QualType TypeToCopy=QualType())
Copies a record (struct, class, or union) from Src to Dst.
void transferSmartPointerLikeCachedGet(const CallExpr *GetExpr, RecordStorageLocation *SmartPointerLoc, TransferState< LatticeT > &State, llvm::function_ref< void(StorageLocation &)> InitializeLoc)
A transfer function for operator-> (and get) calls that can be cached.
internal::Matcher< NamedDecl > hasName(StringRef Name)
Matches NamedDecl nodes that have the specified name.
std::function< Result(const CFGElement &, ASTContext &, State &)> CFGMatchSwitch
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXMemberCallExpr > cxxMemberCallExpr
Matches member call expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXOperatorCallExpr > cxxOperatorCallExpr
Matches overloaded operator calls.
const AstTypeMatcher< PointerType > pointerType
internal::PolymorphicMatcher< internal::HasOverloadedOperatorNameMatcher, AST_POLYMORPHIC_SUPPORTED_TYPES(CXXOperatorCallExpr, FunctionDecl), std::vector< std::string > > hasOverloadedOperatorName(StringRef Name)
Matches overloaded operator names.
RecordStorageLocation * getImplicitObjectLocation(const CXXMemberCallExpr &MCE, const Environment &Env)
Returns the storage location for the implicit object of a CXXMemberCallExpr, or null if none is defin...
const internal::VariadicDynCastAllOfMatcher< Decl, CXXMethodDecl > cxxMethodDecl
Matches method declarations.
ast_matchers::StatementMatcher isSmartPointerLikeGetMethodCall(clang::StringRef MethodName="get")
ast_matchers::StatementMatcher isPointerLikeOperatorArrow()
const AstTypeMatcher< ReferenceType > referenceType
@ Result
The result type of a method or function.
U cast(CodeGen::Address addr)
Contains all information for a given match.
A read-only version of TransferState.
Contains all information for a given match.