File indexing completed on 2026-05-10 08:36:34
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef LLVM_CLANG_AST_EVALUATEDEXPRVISITOR_H
0015 #define LLVM_CLANG_AST_EVALUATEDEXPRVISITOR_H
0016
0017 #include "clang/AST/DeclCXX.h"
0018 #include "clang/AST/Expr.h"
0019 #include "clang/AST/ExprCXX.h"
0020 #include "clang/AST/StmtVisitor.h"
0021 #include "llvm/ADT/STLExtras.h"
0022
0023 namespace clang {
0024
0025 class ASTContext;
0026
0027
0028
0029 template<template <typename> class Ptr, typename ImplClass>
0030 class EvaluatedExprVisitorBase : public StmtVisitorBase<Ptr, ImplClass, void> {
0031 protected:
0032 const ASTContext &Context;
0033
0034 public:
0035
0036
0037 bool shouldVisitDiscardedStmt() const { return true; }
0038 #define PTR(CLASS) typename Ptr<CLASS>::type
0039
0040 explicit EvaluatedExprVisitorBase(const ASTContext &Context) : Context(Context) { }
0041
0042
0043
0044 void VisitDeclRefExpr(PTR(DeclRefExpr) E) { }
0045 void VisitOffsetOfExpr(PTR(OffsetOfExpr) E) { }
0046 void VisitUnaryExprOrTypeTraitExpr(PTR(UnaryExprOrTypeTraitExpr) E) { }
0047 void VisitExpressionTraitExpr(PTR(ExpressionTraitExpr) E) { }
0048 void VisitBlockExpr(PTR(BlockExpr) E) { }
0049 void VisitCXXUuidofExpr(PTR(CXXUuidofExpr) E) { }
0050 void VisitCXXNoexceptExpr(PTR(CXXNoexceptExpr) E) { }
0051
0052 void VisitMemberExpr(PTR(MemberExpr) E) {
0053
0054 return this->Visit(E->getBase());
0055 }
0056
0057 void VisitChooseExpr(PTR(ChooseExpr) E) {
0058
0059 if (E->getCond()->isValueDependent())
0060 return;
0061
0062 return this->Visit(E->getChosenSubExpr());
0063 }
0064
0065 void VisitGenericSelectionExpr(PTR(GenericSelectionExpr) E) {
0066
0067
0068
0069 if (E->isResultDependent())
0070 return;
0071
0072
0073 return this->Visit(E->getResultExpr());
0074 }
0075
0076 void VisitDesignatedInitExpr(PTR(DesignatedInitExpr) E) {
0077
0078
0079 return this->Visit(E->getInit());
0080 }
0081
0082 void VisitCXXTypeidExpr(PTR(CXXTypeidExpr) E) {
0083 if (E->isPotentiallyEvaluated())
0084 return this->Visit(E->getExprOperand());
0085 }
0086
0087 void VisitCallExpr(PTR(CallExpr) CE) {
0088 if (!CE->isUnevaluatedBuiltinCall(Context))
0089 return getDerived().VisitExpr(CE);
0090 }
0091
0092 void VisitLambdaExpr(PTR(LambdaExpr) LE) {
0093
0094 for (LambdaExpr::const_capture_init_iterator I = LE->capture_init_begin(),
0095 E = LE->capture_init_end();
0096 I != E; ++I)
0097 if (*I)
0098 this->Visit(*I);
0099 }
0100
0101
0102
0103 void VisitStmt(PTR(Stmt) S) {
0104 for (auto *SubStmt : S->children())
0105 if (SubStmt)
0106 this->Visit(SubStmt);
0107 }
0108
0109 void VisitIfStmt(PTR(IfStmt) If) {
0110 if (!getDerived().shouldVisitDiscardedStmt()) {
0111 if (auto SubStmt = If->getNondiscardedCase(Context)) {
0112 if (*SubStmt)
0113 this->Visit(*SubStmt);
0114 return;
0115 }
0116 }
0117
0118 getDerived().VisitStmt(If);
0119 }
0120
0121 ImplClass &getDerived() { return *static_cast<ImplClass *>(this); }
0122
0123 #undef PTR
0124 };
0125
0126
0127 template <typename ImplClass>
0128 class EvaluatedExprVisitor
0129 : public EvaluatedExprVisitorBase<std::add_pointer, ImplClass> {
0130 public:
0131 explicit EvaluatedExprVisitor(const ASTContext &Context)
0132 : EvaluatedExprVisitorBase<std::add_pointer, ImplClass>(Context) {}
0133 };
0134
0135
0136 template <typename ImplClass>
0137 class ConstEvaluatedExprVisitor
0138 : public EvaluatedExprVisitorBase<llvm::make_const_ptr, ImplClass> {
0139 public:
0140 explicit ConstEvaluatedExprVisitor(const ASTContext &Context)
0141 : EvaluatedExprVisitorBase<llvm::make_const_ptr, ImplClass>(Context) {}
0142 };
0143 }
0144
0145 #endif