#include "clang/Analysis/Analyses/ExprMutationAnalyzer.h"
#include "clang/AST/Expr.h"
#include "clang/AST/OperationKinds.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/ASTMatchers/ASTMatchers.h"
#include "llvm/ADT/STLExtras.h"
namespace clang {
usingnamespaceast_matchers;
static bool canExprResolveTo(const Expr *Source, const Expr *Target) { … }
namespace {
AST_MATCHER_P(LambdaExpr, hasCaptureInit, const Expr *, E) { … }
AST_MATCHER_P(CXXForRangeStmt, hasRangeStmt,
ast_matchers::internal::Matcher<DeclStmt>, InnerMatcher) { … }
AST_MATCHER_P(Stmt, canResolveToExpr, const Stmt *, Inner) { … }
AST_MATCHER_P(InitListExpr, hasAnyInit, ast_matchers::internal::Matcher<Expr>,
InnerMatcher) { … }
const ast_matchers::internal::VariadicDynCastAllOfMatcher<Stmt, CXXTypeidExpr>
cxxTypeidExpr;
AST_MATCHER(CXXTypeidExpr, isPotentiallyEvaluated) { … }
AST_MATCHER(CXXMemberCallExpr, isConstCallee) { … }
AST_MATCHER_P(GenericSelectionExpr, hasControllingExpr,
ast_matchers::internal::Matcher<Expr>, InnerMatcher) { … }
template <typename T>
ast_matchers::internal::Matcher<T>
findFirst(const ast_matchers::internal::Matcher<T> &Matcher) { … }
const auto nonConstReferenceType = …;
const auto nonConstPointerType = …;
const auto isMoveOnly = …;
template <class T> struct NodeID;
template <> struct NodeID<Expr> { … };
template <> struct NodeID<Decl> { … };
constexpr StringRef NodeID<Expr>::value;
constexpr StringRef NodeID<Decl>::value;
template <class T,
class F = const Stmt *(ExprMutationAnalyzer::Analyzer::*)(const T *)>
const Stmt *tryEachMatch(ArrayRef<ast_matchers::BoundNodes> Matches,
ExprMutationAnalyzer::Analyzer *Analyzer, F Finder) { … }
}
const Stmt *ExprMutationAnalyzer::Analyzer::findMutation(const Expr *Exp) { … }
const Stmt *ExprMutationAnalyzer::Analyzer::findMutation(const Decl *Dec) { … }
const Stmt *
ExprMutationAnalyzer::Analyzer::findPointeeMutation(const Expr *Exp) { … }
const Stmt *
ExprMutationAnalyzer::Analyzer::findPointeeMutation(const Decl *Dec) { … }
const Stmt *ExprMutationAnalyzer::Analyzer::findMutationMemoized(
const Expr *Exp, llvm::ArrayRef<MutationFinder> Finders,
Memoized::ResultMap &MemoizedResults) { … }
const Stmt *
ExprMutationAnalyzer::Analyzer::tryEachDeclRef(const Decl *Dec,
MutationFinder Finder) { … }
bool ExprMutationAnalyzer::Analyzer::isUnevaluated(const Stmt *Exp,
const Stmt &Stm,
ASTContext &Context) { … }
bool ExprMutationAnalyzer::Analyzer::isUnevaluated(const Expr *Exp) { … }
const Stmt *
ExprMutationAnalyzer::Analyzer::findExprMutation(ArrayRef<BoundNodes> Matches) { … }
const Stmt *
ExprMutationAnalyzer::Analyzer::findDeclMutation(ArrayRef<BoundNodes> Matches) { … }
const Stmt *ExprMutationAnalyzer::Analyzer::findExprPointeeMutation(
ArrayRef<ast_matchers::BoundNodes> Matches) { … }
const Stmt *ExprMutationAnalyzer::Analyzer::findDeclPointeeMutation(
ArrayRef<ast_matchers::BoundNodes> Matches) { … }
const Stmt *
ExprMutationAnalyzer::Analyzer::findDirectMutation(const Expr *Exp) { … }
const Stmt *
ExprMutationAnalyzer::Analyzer::findMemberMutation(const Expr *Exp) { … }
const Stmt *
ExprMutationAnalyzer::Analyzer::findArrayElementMutation(const Expr *Exp) { … }
const Stmt *ExprMutationAnalyzer::Analyzer::findCastMutation(const Expr *Exp) { … }
const Stmt *
ExprMutationAnalyzer::Analyzer::findRangeLoopMutation(const Expr *Exp) { … }
const Stmt *
ExprMutationAnalyzer::Analyzer::findReferenceMutation(const Expr *Exp) { … }
const Stmt *
ExprMutationAnalyzer::Analyzer::findFunctionArgMutation(const Expr *Exp) { … }
FunctionParmMutationAnalyzer::FunctionParmMutationAnalyzer(
const FunctionDecl &Func, ASTContext &Context,
ExprMutationAnalyzer::Memoized &Memorized)
: … { … }
const Stmt *
FunctionParmMutationAnalyzer::findMutation(const ParmVarDecl *Parm) { … }
}