ExprCXX.h revision 39da0b8145eaec7da7004f9b3645c5c9f4f63b1d
1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov//===--- ExprCXX.h - Classes for representing expressions -------*- C++ -*-===// 2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// The LLVM Compiler Infrastructure 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This file is distributed under the University of Illinois Open Source 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// License. See LICENSE.TXT for details. 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//===----------------------------------------------------------------------===// 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This file defines the Expr interface and subclasses for C++ expressions. 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//===----------------------------------------------------------------------===// 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef LLVM_CLANG_AST_EXPRCXX_H 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define LLVM_CLANG_AST_EXPRCXX_H 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "clang/Basic/TypeTraits.h" 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "clang/AST/Expr.h" 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "clang/AST/Decl.h" 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownnamespace clang { 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown class CXXConstructorDecl; 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown class CXXDestructorDecl; 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown class CXXMethodDecl; 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown class CXXTemporary; 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//===--------------------------------------------------------------------===// 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// C++ Expressions. 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//===--------------------------------------------------------------------===// 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// \brief A call to an overloaded operator written using operator 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// syntax. 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// Represents a call to an overloaded operator written using operator 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// syntax, e.g., "x + y" or "*p". While semantically equivalent to a 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// normal call, this AST node provides better information about the 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// syntactic representation of the call. 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// In a C++ template, this expression node kind will be used whenever 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// any of the arguments are type-dependent. In this case, the 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// function itself will be a (possibly empty) set of functions and 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// function templates that were found by name lookup at template 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// definition time. 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXOperatorCallExpr : public CallExpr { 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief The overloaded operator. 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown OverloadedOperatorKind Operator; 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXOperatorCallExpr(ASTContext& C, OverloadedOperatorKind Op, Expr *fn, 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr **args, unsigned numargs, QualType t, 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation operatorloc) 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : CallExpr(C, CXXOperatorCallExprClass, fn, args, numargs, t, operatorloc), 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Operator(Op) {} 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown explicit CXXOperatorCallExpr(ASTContext& C, EmptyShell Empty) : 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CallExpr(C, CXXOperatorCallExprClass, Empty) { } 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// getOperator - Returns the kind of overloaded operator that this 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// expression refers to. 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown OverloadedOperatorKind getOperator() const { return Operator; } 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void setOperator(OverloadedOperatorKind Kind) { Operator = Kind; } 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// getOperatorLoc - Returns the location of the operator symbol in 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// the expression. When @c getOperator()==OO_Call, this is the 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// location of the right parentheses; when @c 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// getOperator()==OO_Subscript, this is the location of the right 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// bracket. 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation getOperatorLoc() const { return getRParenLoc(); } 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const; 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXOperatorCallExprClass; 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXOperatorCallExpr *) { return true; } 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXMemberCallExpr - Represents a call to a member function that 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// may be written either with member call syntax (e.g., "obj.func()" 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// or "objptr->func()") or with normal function-call syntax 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// ("func()") within a member function that ends up calling a member 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// function. The callee in either case is a MemberExpr that contains 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// both the object argument and the member function, while the 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// arguments are the arguments within the parentheses (not including 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// the object argument). 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXMemberCallExpr : public CallExpr { 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXMemberCallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs, 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown QualType t, SourceLocation rparenloc) 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : CallExpr(C, CXXMemberCallExprClass, fn, args, numargs, t, rparenloc) {} 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// getImplicitObjectArgument - Retrieves the implicit object 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// argument for the member call. For example, in "x.f(5)", this 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// operation would return "x". 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr *getImplicitObjectArgument(); 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXMemberCallExprClass; 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXMemberCallExpr *) { return true; } 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXNamedCastExpr - Abstract class common to all of the C++ "named" 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// casts, @c static_cast, @c dynamic_cast, @c reinterpret_cast, or @c 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// const_cast. 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// This abstract class is inherited by all of the classes 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// representing "named" casts, e.g., CXXStaticCastExpr, 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXDynamicCastExpr, CXXReinterpretCastExpr, and CXXConstCastExpr. 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXNamedCastExpr : public ExplicitCastExpr { 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownprivate: 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation Loc; // the location of the casting op 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownprotected: 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXNamedCastExpr(StmtClass SC, QualType ty, const CastInfo &info, Expr *op, 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown QualType writtenTy, SourceLocation l) 118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : ExplicitCastExpr(SC, ty, info, op, writtenTy), Loc(l) {} 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const char *getCastName() const; 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieve the location of the cast operator keyword, e.g., 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// "static_cast". 125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation getOperatorLoc() const { return Loc; } 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void setOperatorLoc(SourceLocation L) { Loc = L; } 127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { 129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SourceRange(Loc, getSubExpr()->getSourceRange().getEnd()); 130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (T->getStmtClass()) { 133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case CXXNamedCastExprClass: 134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case CXXStaticCastExprClass: 135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case CXXDynamicCastExprClass: 136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case CXXReinterpretCastExprClass: 137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case CXXConstCastExprClass: 138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return true; 139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return false; 141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXNamedCastExpr *) { return true; } 144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXStaticCastExpr - A C++ @c static_cast expression (C++ [expr.static.cast]). 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// This expression node represents a C++ static cast, e.g., 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// @c static_cast<int>(1.0). 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXStaticCastExpr : public CXXNamedCastExpr { 151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXStaticCastExpr(QualType ty, const CastInfo &info, Expr *op, 153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown QualType writtenTy, SourceLocation l) 154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : CXXNamedCastExpr(CXXStaticCastExprClass, ty, info, op, writtenTy, l) {} 155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXStaticCastExprClass; 158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXStaticCastExpr *) { return true; } 160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXDynamicCastExpr - A C++ @c dynamic_cast expression 163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// (C++ [expr.dynamic.cast]), which may perform a run-time check to 164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// determine how to perform the type cast. 165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// This expression node represents a dynamic cast, e.g., 167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// @c dynamic_cast<Derived*>(BasePtr). 168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXDynamicCastExpr : public CXXNamedCastExpr { 169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXDynamicCastExpr(QualType ty, CastKind kind, Expr *op, QualType writtenTy, 171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation l) 172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : CXXNamedCastExpr(CXXDynamicCastExprClass, ty, kind, op, writtenTy, l) {} 173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXDynamicCastExprClass; 176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXDynamicCastExpr *) { return true; } 178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXReinterpretCastExpr - A C++ @c reinterpret_cast expression (C++ 181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// [expr.reinterpret.cast]), which provides a differently-typed view 182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// of a value but performs no actual work at run time. 183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// This expression node represents a reinterpret cast, e.g., 185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// @c reinterpret_cast<int>(VoidPtr). 186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXReinterpretCastExpr : public CXXNamedCastExpr { 187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXReinterpretCastExpr(QualType ty, Expr *op, QualType writtenTy, 189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation l) 190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : CXXNamedCastExpr(CXXReinterpretCastExprClass, ty, CK_BitCast, op, 191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown writtenTy, l) {} 192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXReinterpretCastExprClass; 195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXReinterpretCastExpr *) { return true; } 197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXConstCastExpr - A C++ @c const_cast expression (C++ [expr.const.cast]), 200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// which can remove type qualifiers but does not change the underlying value. 201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// This expression node represents a const cast, e.g., 203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// @c const_cast<char*>(PtrToConstChar). 204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXConstCastExpr : public CXXNamedCastExpr { 205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXConstCastExpr(QualType ty, Expr *op, QualType writtenTy, 207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation l) 208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : CXXNamedCastExpr(CXXConstCastExprClass, ty, CK_NoOp, op, writtenTy, l) {} 209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXConstCastExprClass; 212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXConstCastExpr *) { return true; } 214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXBoolLiteralExpr - [C++ 2.13.5] C++ Boolean Literal. 217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXBoolLiteralExpr : public Expr { 219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool Value; 220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation Loc; 221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXBoolLiteralExpr(bool val, QualType Ty, SourceLocation l) : 223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr(CXXBoolLiteralExprClass, Ty), Value(val), Loc(l) {} 224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool getValue() const { return Value; } 226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXBoolLiteralExprClass; 231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXBoolLiteralExpr *) { return true; } 233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Iterators 235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_begin(); 236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_end(); 237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXNullPtrLiteralExpr - [C++0x 2.14.7] C++ Pointer Literal 240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXNullPtrLiteralExpr : public Expr { 241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation Loc; 242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXNullPtrLiteralExpr(QualType Ty, SourceLocation l) : 244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr(CXXNullPtrLiteralExprClass, Ty), Loc(l) {} 245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXNullPtrLiteralExprClass; 250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXNullPtrLiteralExpr *) { return true; } 252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_begin(); 254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_end(); 255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXTypeidExpr - A C++ @c typeid expression (C++ [expr.typeid]), which gets 258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// the type_info that corresponds to the supplied type, or the (possibly 259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// dynamic) type of the supplied expression. 260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// This represents code like @c typeid(int) or @c typeid(*objPtr) 262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXTypeidExpr : public Expr { 263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownprivate: 264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool isTypeOp : 1; 265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown union { 266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void *Ty; 267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Stmt *Ex; 268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Operand; 269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceRange Range; 270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXTypeidExpr(bool isTypeOp, void *op, QualType Ty, const SourceRange r) : 273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr(CXXTypeidExprClass, Ty, 274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // typeid is never type-dependent (C++ [temp.dep.expr]p4) 275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown false, 276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // typeid is value-dependent if the type or expression are dependent 277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (isTypeOp ? QualType::getFromOpaquePtr(op)->isDependentType() 278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : static_cast<Expr*>(op)->isValueDependent())), 279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown isTypeOp(isTypeOp), Range(r) { 280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (isTypeOp) 281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Operand.Ty = op; 282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else 283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // op was an Expr*, so cast it back to that to be safe 284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Operand.Ex = static_cast<Expr*>(op); 285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool isTypeOperand() const { return isTypeOp; } 288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown QualType getTypeOperand() const { 289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)"); 290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return QualType::getFromOpaquePtr(Operand.Ty); 291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr* getExprOperand() const { 293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)"); 294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return static_cast<Expr*>(Operand.Ex); 295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { 298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return Range; 299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXTypeidExprClass; 302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXTypeidExpr *) { return true; } 304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Iterators 306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_begin(); 307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_end(); 308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXThisExpr - Represents the "this" expression in C++, which is a 311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// pointer to the object on which the current member function is 312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// executing (C++ [expr.prim]p3). Example: 313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// @code 315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// class Foo { 316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// public: 317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// void bar(); 318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// void test() { this->bar(); } 319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// }; 320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// @endcode 321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXThisExpr : public Expr { 322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation Loc; 323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXThisExpr(SourceLocation L, QualType Type) 326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : Expr(CXXThisExprClass, Type, 327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // 'this' is type-dependent if the class type of the enclosing 328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // member function is dependent (C++ [temp.dep.expr]p2) 329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Type->isDependentType(), Type->isDependentType()), 330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Loc(L) { } 331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXThisExprClass; 336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXThisExpr *) { return true; } 338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Iterators 340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_begin(); 341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_end(); 342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXThrowExpr - [C++ 15] C++ Throw Expression. This handles 345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 'throw' and 'throw' assignment-expression. When 346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// assignment-expression isn't present, Op will be null. 347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXThrowExpr : public Expr { 349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Stmt *Op; 350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation ThrowLoc; 351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Ty is the void type which is used as the result type of the 353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // exepression. The l is the location of the throw keyword. expr 354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // can by null, if the optional expression to throw isn't present. 355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXThrowExpr(Expr *expr, QualType Ty, SourceLocation l) : 356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr(CXXThrowExprClass, Ty, false, false), Op(expr), ThrowLoc(l) {} 357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const Expr *getSubExpr() const { return cast_or_null<Expr>(Op); } 358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr *getSubExpr() { return cast_or_null<Expr>(Op); } 359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void setSubExpr(Expr *E) { Op = E; } 360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation getThrowLoc() const { return ThrowLoc; } 362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void setThrowLoc(SourceLocation L) { ThrowLoc = L; } 363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { 365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (getSubExpr() == 0) 366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SourceRange(ThrowLoc, ThrowLoc); 367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SourceRange(ThrowLoc, getSubExpr()->getSourceRange().getEnd()); 368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXThrowExprClass; 372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXThrowExpr *) { return true; } 374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Iterators 376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_begin(); 377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_end(); 378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXDefaultArgExpr - C++ [dcl.fct.default]. This wraps up a 381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// function call argument that was created from the corresponding 382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// parameter's default argument, when the call did not explicitly 383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// supply arguments for all of the parameters. 384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXDefaultArgExpr : public Expr { 385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ParmVarDecl *Param; 386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownprotected: 388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXDefaultArgExpr(StmtClass SC, ParmVarDecl *param) 389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : Expr(SC, param->hasUnparsedDefaultArg() ? 390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown param->getType().getNonReferenceType() 391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : param->getDefaultArg()->getType()), 392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Param(param) { } 393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Param is the parameter whose default argument is used by this 396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // expression. 397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static CXXDefaultArgExpr *Create(ASTContext &C, ParmVarDecl *Param) { 398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return new (C) CXXDefaultArgExpr(CXXDefaultArgExprClass, Param); 399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Retrieve the parameter that the argument was created from. 402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const ParmVarDecl *getParam() const { return Param; } 403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ParmVarDecl *getParam() { return Param; } 404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Retrieve the actual argument to the function call. 406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const Expr *getExpr() const { return Param->getDefaultArg(); } 407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr *getExpr() { return Param->getDefaultArg(); } 408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { 410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Default argument expressions have no representation in the 411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // source, so they have an empty source range. 412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SourceRange(); 413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXDefaultArgExprClass; 417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXDefaultArgExpr *) { return true; } 419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Iterators 421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_begin(); 422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_end(); 423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXTemporary - Represents a C++ temporary. 426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXTemporary { 427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// Destructor - The destructor that needs to be called. 428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const CXXDestructorDecl *Destructor; 429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXTemporary(const CXXDestructorDecl *destructor) 431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : Destructor(destructor) { } 432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ~CXXTemporary() { } 433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static CXXTemporary *Create(ASTContext &C, 436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const CXXDestructorDecl *Destructor); 437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void Destroy(ASTContext &Ctx); 439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const CXXDestructorDecl *getDestructor() const { return Destructor; } 441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXBindTemporaryExpr - Represents binding an expression to a temporary, 444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// so its destructor can be called later. 445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXBindTemporaryExpr : public Expr { 446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXTemporary *Temp; 447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Stmt *SubExpr; 449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXBindTemporaryExpr(CXXTemporary *temp, Expr* subexpr) 451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : Expr(CXXBindTemporaryExprClass, 452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown subexpr->getType()), Temp(temp), SubExpr(subexpr) { } 453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ~CXXBindTemporaryExpr() { } 454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownprotected: 456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual void DoDestroy(ASTContext &C); 457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static CXXBindTemporaryExpr *Create(ASTContext &C, CXXTemporary *Temp, 460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr* SubExpr); 461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXTemporary *getTemporary() { return Temp; } 463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const CXXTemporary *getTemporary() const { return Temp; } 464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const Expr *getSubExpr() const { return cast<Expr>(SubExpr); } 466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr *getSubExpr() { return cast<Expr>(SubExpr); } 467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void setSubExpr(Expr *E) { SubExpr = E; } 468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { return SourceRange(); } 470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Implement isa/cast/dyncast/etc. 472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXBindTemporaryExprClass; 474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXBindTemporaryExpr *) { return true; } 476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Iterators 478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_begin(); 479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_end(); 480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXConstructExpr - Represents a call to a C++ constructor. 483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXConstructExpr : public Expr { 484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXConstructorDecl *Constructor; 485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool Elidable; 487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Stmt **Args; 489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned NumArgs; 490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownprotected: 492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T, 493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXConstructorDecl *d, bool elidable, 494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr **args, unsigned numargs); 495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ~CXXConstructExpr() { } 496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual void DoDestroy(ASTContext &C); 498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Construct an empty C++ construction expression that will store 501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \p numargs arguments. 502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXConstructExpr(EmptyShell Empty, ASTContext &C, unsigned numargs); 503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static CXXConstructExpr *Create(ASTContext &C, QualType T, 505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXConstructorDecl *D, bool Elidable, 506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr **Args, unsigned NumArgs); 507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXConstructorDecl* getConstructor() const { return Constructor; } 510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void setConstructor(CXXConstructorDecl *C) { Constructor = C; } 511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Whether this construction is elidable. 513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool isElidable() const { return Elidable; } 514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void setElidable(bool E) { Elidable = E; } 515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown typedef ExprIterator arg_iterator; 517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown typedef ConstExprIterator const_arg_iterator; 518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown arg_iterator arg_begin() { return Args; } 520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown arg_iterator arg_end() { return Args + NumArgs; } 521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const_arg_iterator arg_begin() const { return Args; } 522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const_arg_iterator arg_end() const { return Args + NumArgs; } 523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned getNumArgs() const { return NumArgs; } 525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// getArg - Return the specified argument. 527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr *getArg(unsigned Arg) { 528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(Arg < NumArgs && "Arg access out of range!"); 529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return cast<Expr>(Args[Arg]); 530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const Expr *getArg(unsigned Arg) const { 532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(Arg < NumArgs && "Arg access out of range!"); 533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return cast<Expr>(Args[Arg]); 534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// setArg - Set the specified argument. 537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void setArg(unsigned Arg, Expr *ArgExpr) { 538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(Arg < NumArgs && "Arg access out of range!"); 539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Args[Arg] = ArgExpr; 540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { return SourceRange(); } 543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXConstructExprClass || 546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown T->getStmtClass() == CXXTemporaryObjectExprClass; 547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXConstructExpr *) { return true; } 549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Iterators 551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_begin(); 552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_end(); 553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXFunctionalCastExpr - Represents an explicit C++ type conversion 556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// that uses "functional" notion (C++ [expr.type.conv]). Example: @c 557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// x = int(0.5); 558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXFunctionalCastExpr : public ExplicitCastExpr { 559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation TyBeginLoc; 560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation RParenLoc; 561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXFunctionalCastExpr(QualType ty, QualType writtenTy, 563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation tyBeginLoc, CastKind kind, 564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr *castExpr, SourceLocation rParenLoc) 565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : ExplicitCastExpr(CXXFunctionalCastExprClass, ty, kind, castExpr, 566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown writtenTy), 567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {} 568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation getTypeBeginLoc() const { return TyBeginLoc; } 570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation getRParenLoc() const { return RParenLoc; } 571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { 573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SourceRange(TyBeginLoc, RParenLoc); 574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXFunctionalCastExprClass; 577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXFunctionalCastExpr *) { return true; } 579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// @brief Represents a C++ functional cast expression that builds a 582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// temporary object. 583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// This expression type represents a C++ "functional" cast 585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// (C++[expr.type.conv]) with N != 1 arguments that invokes a 586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// constructor to build a temporary object. If N == 0 but no 587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// constructor will be called (because the functional cast is 588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// performing a value-initialized an object whose class type has no 589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// user-declared constructors), CXXZeroInitValueExpr will represent 590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// the functional cast. Finally, with N == 1 arguments the functional 591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// cast expression will be represented by CXXFunctionalCastExpr. 592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// Example: 593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// @code 594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// struct X { X(int, float); } 595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// X create_X() { 597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// return X(1, 3.14f); // creates a CXXTemporaryObjectExpr 598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// }; 599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// @endcode 600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXTemporaryObjectExpr : public CXXConstructExpr { 601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation TyBeginLoc; 602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation RParenLoc; 603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXTemporaryObjectExpr(ASTContext &C, CXXConstructorDecl *Cons, 606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown QualType writtenTy, SourceLocation tyBeginLoc, 607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr **Args,unsigned NumArgs, 608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation rParenLoc); 609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ~CXXTemporaryObjectExpr() { } 611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation getTypeBeginLoc() const { return TyBeginLoc; } 613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation getRParenLoc() const { return RParenLoc; } 614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { 616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SourceRange(TyBeginLoc, RParenLoc); 617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXTemporaryObjectExprClass; 620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXTemporaryObjectExpr *) { return true; } 622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXZeroInitValueExpr - [C++ 5.2.3p2] 625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// Expression "T()" which creates a value-initialized rvalue of type 626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// T, which is either a non-class type or a class type without any 627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// user-defined constructors. 628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXZeroInitValueExpr : public Expr { 630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation TyBeginLoc; 631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation RParenLoc; 632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXZeroInitValueExpr(QualType ty, SourceLocation tyBeginLoc, 635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation rParenLoc ) : 636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr(CXXZeroInitValueExprClass, ty, false, false), 637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {} 638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation getTypeBeginLoc() const { return TyBeginLoc; } 640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation getRParenLoc() const { return RParenLoc; } 641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// @brief Whether this initialization expression was 643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// implicitly-generated. 644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool isImplicit() const { 645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return TyBeginLoc.isInvalid() && RParenLoc.isInvalid(); 646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { 649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SourceRange(TyBeginLoc, RParenLoc); 650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXZeroInitValueExprClass; 654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXZeroInitValueExpr *) { return true; } 656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Iterators 658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_begin(); 659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_end(); 660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXConditionDeclExpr - Condition declaration of a if/switch/while/for 663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// statement, e.g: "if (int x = f()) {...}". 664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// The main difference with DeclRefExpr is that CXXConditionDeclExpr owns the 665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// decl that it references. 666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXConditionDeclExpr : public DeclRefExpr { 668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXConditionDeclExpr(SourceLocation startLoc, 670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation eqLoc, VarDecl *var) 671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : DeclRefExpr(CXXConditionDeclExprClass, var, 672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown var->getType().getNonReferenceType(), startLoc, 673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown var->getType()->isDependentType(), 674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /*FIXME:integral constant?*/ 675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown var->getType()->isDependentType()) {} 676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation getStartLoc() const { return getLocation(); } 678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VarDecl *getVarDecl() { return cast<VarDecl>(getDecl()); } 680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const VarDecl *getVarDecl() const { return cast<VarDecl>(getDecl()); } 681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { 683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SourceRange(getStartLoc(), getVarDecl()->getInit()->getLocEnd()); 684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXConditionDeclExprClass; 688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXConditionDeclExpr *) { return true; } 690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Iterators 692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_begin(); 693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_end(); 694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXNewExpr - A new expression for memory allocation and constructor calls, 697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// e.g: "new CXXNewExpr(foo)". 698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXNewExpr : public Expr { 699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Was the usage ::new, i.e. is the global new to be used? 700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool GlobalNew : 1; 701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Was the form (type-id) used? Otherwise, it was new-type-id. 702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ParenTypeId : 1; 703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Is there an initializer? If not, built-ins are uninitialized, else they're 704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // value-initialized. 705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool Initializer : 1; 706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Do we allocate an array? If so, the first SubExpr is the size expression. 707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool Array : 1; 708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // The number of placement new arguments. 709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned NumPlacementArgs : 14; 710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // The number of constructor arguments. This may be 1 even for non-class 711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // types; use the pseudo copy constructor. 712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned NumConstructorArgs : 14; 713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Contains an optional array size expression, any number of optional 714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // placement arguments, and any number of optional constructor arguments, 715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // in that order. 716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Stmt **SubExprs; 717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Points to the allocation function used. 718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown FunctionDecl *OperatorNew; 719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Points to the deallocation function used in case of error. May be null. 720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown FunctionDecl *OperatorDelete; 721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Points to the constructor used. Cannot be null if AllocType is a record; 722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // it would still point at the default constructor (even an implicit one). 723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Must be null for all other types. 724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXConstructorDecl *Constructor; 725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation StartLoc; 727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation EndLoc; 728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXNewExpr(bool globalNew, FunctionDecl *operatorNew, Expr **placementArgs, 731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned numPlaceArgs, bool ParenTypeId, Expr *arraySize, 732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXConstructorDecl *constructor, bool initializer, 733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr **constructorArgs, unsigned numConsArgs, 734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown FunctionDecl *operatorDelete, QualType ty, 735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation startLoc, SourceLocation endLoc); 736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ~CXXNewExpr() { 737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown delete[] SubExprs; 738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown QualType getAllocatedType() const { 741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(getType()->isPointerType()); 742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return getType()->getAs<PointerType>()->getPointeeType(); 743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown FunctionDecl *getOperatorNew() const { return OperatorNew; } 746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown FunctionDecl *getOperatorDelete() const { return OperatorDelete; } 747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXConstructorDecl *getConstructor() const { return Constructor; } 748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool isArray() const { return Array; } 750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr *getArraySize() { 751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return Array ? cast<Expr>(SubExprs[0]) : 0; 752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const Expr *getArraySize() const { 754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return Array ? cast<Expr>(SubExprs[0]) : 0; 755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned getNumPlacementArgs() const { return NumPlacementArgs; } 758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr *getPlacementArg(unsigned i) { 759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(i < NumPlacementArgs && "Index out of range"); 760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return cast<Expr>(SubExprs[Array + i]); 761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const Expr *getPlacementArg(unsigned i) const { 763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(i < NumPlacementArgs && "Index out of range"); 764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return cast<Expr>(SubExprs[Array + i]); 765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool isGlobalNew() const { return GlobalNew; } 768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool isParenTypeId() const { return ParenTypeId; } 769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool hasInitializer() const { return Initializer; } 770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned getNumConstructorArgs() const { return NumConstructorArgs; } 772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr *getConstructorArg(unsigned i) { 773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(i < NumConstructorArgs && "Index out of range"); 774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return cast<Expr>(SubExprs[Array + NumPlacementArgs + i]); 775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const Expr *getConstructorArg(unsigned i) const { 777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(i < NumConstructorArgs && "Index out of range"); 778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return cast<Expr>(SubExprs[Array + NumPlacementArgs + i]); 779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown typedef ExprIterator arg_iterator; 782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown typedef ConstExprIterator const_arg_iterator; 783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown arg_iterator placement_arg_begin() { 785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SubExprs + Array; 786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown arg_iterator placement_arg_end() { 788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SubExprs + Array + getNumPlacementArgs(); 789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const_arg_iterator placement_arg_begin() const { 791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SubExprs + Array; 792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const_arg_iterator placement_arg_end() const { 794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SubExprs + Array + getNumPlacementArgs(); 795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown arg_iterator constructor_arg_begin() { 798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SubExprs + Array + getNumPlacementArgs(); 799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown arg_iterator constructor_arg_end() { 801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SubExprs + Array + getNumPlacementArgs() + getNumConstructorArgs(); 802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const_arg_iterator constructor_arg_begin() const { 804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SubExprs + Array + getNumPlacementArgs(); 805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const_arg_iterator constructor_arg_end() const { 807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SubExprs + Array + getNumPlacementArgs() + getNumConstructorArgs(); 808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { 811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SourceRange(StartLoc, EndLoc); 812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXNewExprClass; 816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXNewExpr *) { return true; } 818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Iterators 820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_begin(); 821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_end(); 822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// CXXDeleteExpr - A delete expression for memory deallocation and destructor 825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// calls, e.g. "delete[] pArray". 826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXDeleteExpr : public Expr { 827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Is this a forced global delete, i.e. "::delete"? 828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool GlobalDelete : 1; 829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Is this the array form of delete, i.e. "delete[]"? 830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ArrayForm : 1; 831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Points to the operator delete overload that is used. Could be a member. 832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown FunctionDecl *OperatorDelete; 833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // The pointer expression to be deleted. 834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Stmt *Argument; 835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Location of the expression. 836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation Loc; 837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXDeleteExpr(QualType ty, bool globalDelete, bool arrayForm, 839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown FunctionDecl *operatorDelete, Expr *arg, SourceLocation loc) 840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : Expr(CXXDeleteExprClass, ty, false, false), GlobalDelete(globalDelete), 841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ArrayForm(arrayForm), OperatorDelete(operatorDelete), Argument(arg), 842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Loc(loc) { } 843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool isGlobalDelete() const { return GlobalDelete; } 845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool isArrayForm() const { return ArrayForm; } 846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown FunctionDecl *getOperatorDelete() const { return OperatorDelete; } 848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr *getArgument() { return cast<Expr>(Argument); } 850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const Expr *getArgument() const { return cast<Expr>(Argument); } 851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { 853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SourceRange(Loc, Argument->getLocEnd()); 854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXDeleteExprClass; 858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXDeleteExpr *) { return true; } 860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Iterators 862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_begin(); 863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_end(); 864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// \brief Represents a C++ pseudo-destructor (C++ [expr.pseudo]). 867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// Example: 869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// \code 871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// template<typename T> 872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// void destroy(T* ptr) { 873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// ptr->~T(); 874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// } 875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// \endcode 876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// When the template is parsed, the expression \c ptr->~T will be stored as 878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// a member reference expression. If it then instantiated with a scalar type 879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// as a template argument for T, the resulting expression will be a 880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// pseudo-destructor expression. 881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXPseudoDestructorExpr : public Expr { 882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief The base expression (that is being destroyed). 883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Stmt *Base; 884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Whether the operator was an arrow ('->'); otherwise, it was a 886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// period ('.'). 887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool IsArrow : 1; 888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief The location of the '.' or '->' operator. 890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation OperatorLoc; 891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief The nested-name-specifier that follows the operator, if present. 893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NestedNameSpecifier *Qualifier; 894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief The source range that covers the nested-name-specifier, if 896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// present. 897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceRange QualifierRange; 898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief The type being destroyed. 900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown QualType DestroyedType; 901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief The location of the type after the '~'. 903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation DestroyedTypeLoc; 904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXPseudoDestructorExpr(ASTContext &Context, 907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr *Base, bool isArrow, SourceLocation OperatorLoc, 908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NestedNameSpecifier *Qualifier, 909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceRange QualifierRange, 910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown QualType DestroyedType, 911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation DestroyedTypeLoc) 912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : Expr(CXXPseudoDestructorExprClass, 913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Context.getPointerType(Context.getFunctionType(Context.VoidTy, 0, 0, 914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown false, 0)), 915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /*isTypeDependent=*/false, 916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /*isValueDependent=*/Base->isValueDependent()), 917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Base(static_cast<Stmt *>(Base)), IsArrow(isArrow), 918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown OperatorLoc(OperatorLoc), Qualifier(Qualifier), 919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown QualifierRange(QualifierRange), DestroyedType(DestroyedType), 920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DestroyedTypeLoc(DestroyedTypeLoc) { } 921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void setBase(Expr *E) { Base = E; } 923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Expr *getBase() const { return cast<Expr>(Base); } 924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Determines whether this member expression actually had 926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// a C++ nested-name-specifier prior to the name of the member, e.g., 927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// x->Base::foo. 928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool hasQualifier() const { return Qualifier != 0; } 929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief If the member name was qualified, retrieves the source range of 931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// the nested-name-specifier that precedes the member name. Otherwise, 932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// returns an empty source range. 933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceRange getQualifierRange() const { return QualifierRange; } 934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief If the member name was qualified, retrieves the 936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// nested-name-specifier that precedes the member name. Otherwise, returns 937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// NULL. 938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NestedNameSpecifier *getQualifier() const { return Qualifier; } 939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Determine whether this pseudo-destructor expression was written 941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// using an '->' (otherwise, it used a '.'). 942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool isArrow() const { return IsArrow; } 943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void setArrow(bool A) { IsArrow = A; } 944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieve the location of the '.' or '->' operator. 946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation getOperatorLoc() const { return OperatorLoc; } 947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieve the type that is being destroyed. 949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown QualType getDestroyedType() const { return DestroyedType; } 950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieve the location of the type being destroyed. 952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation getDestroyedTypeLoc() const { return DestroyedTypeLoc; } 953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { 955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SourceRange(Base->getLocStart(), DestroyedTypeLoc); 956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == CXXPseudoDestructorExprClass; 960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const CXXPseudoDestructorExpr *) { return true; } 962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Iterators 964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_begin(); 965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_end(); 966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// \brief Represents the name of a function that has not been 969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// resolved to any declaration. 970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// Unresolved function names occur when a function name is 972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// encountered prior to an open parentheses ('(') in a C++ function 973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// call, and the function name itself did not resolve to a 974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// declaration. These function names can only be resolved when they 975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// form the postfix-expression of a function call, so that 976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// argument-dependent lookup finds declarations corresponding to 977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// these functions. 978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// @code 980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// template<typename T> void f(T x) { 981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// g(x); // g is an unresolved function name (that is also a dependent name) 982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// } 983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// @endcode 984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass UnresolvedFunctionNameExpr : public Expr { 985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// The name that was present in the source 986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DeclarationName Name; 987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// The location of this name in the source code 989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation Loc; 990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UnresolvedFunctionNameExpr(DeclarationName N, QualType T, SourceLocation L) 993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : Expr(UnresolvedFunctionNameExprClass, T, false, false), Name(N), Loc(L) { } 994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieves the name that occurred in the source code. 996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DeclarationName getName() const { return Name; } 997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// getLocation - Retrieves the location in the source code where 999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// the name occurred. 1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation getLocation() const { return Loc; } 1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == UnresolvedFunctionNameExprClass; 1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const UnresolvedFunctionNameExpr *) { return true; } 1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Iterators 1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_begin(); 1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_end(); 1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// UnaryTypeTraitExpr - A GCC or MS unary type trait, as used in the 1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// implementation of TR1/C++0x type trait templates. 1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// Example: 1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// __is_pod(int) == true 1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// __is_enum(std::string) == false 1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass UnaryTypeTraitExpr : public Expr { 1020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// UTT - The trait. 1021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UnaryTypeTrait UTT; 1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// Loc - The location of the type trait keyword. 1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation Loc; 1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// RParen - The location of the closing paren. 1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation RParen; 1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// QueriedType - The type we're testing. 1030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown QualType QueriedType; 1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 1033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UnaryTypeTraitExpr(SourceLocation loc, UnaryTypeTrait utt, QualType queried, 1034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation rparen, QualType ty) 1035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : Expr(UnaryTypeTraitExprClass, ty, false, queried->isDependentType()), 1036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UTT(utt), Loc(loc), RParen(rparen), QueriedType(queried) { } 1037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { return SourceRange(Loc, RParen);} 1039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UnaryTypeTrait getTrait() const { return UTT; } 1041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown QualType getQueriedType() const { return QueriedType; } 1043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool EvaluateTrait(ASTContext&) const; 1045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 1047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == UnaryTypeTraitExprClass; 1048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const UnaryTypeTraitExpr *) { return true; } 1050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Iterators 1052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_begin(); 1053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_end(); 1054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 1055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// QualifiedDeclRefExpr - A reference to a declared variable, 1057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// function, enum, etc., that includes a qualification, e.g., 1058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// "N::foo". 1059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass QualifiedDeclRefExpr : public DeclRefExpr { 1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// QualifierRange - The source range that covers the 1061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// nested-name-specifier. 1062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceRange QualifierRange; 1063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief The nested-name-specifier that qualifies this declaration 1065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// name. 1066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NestedNameSpecifier *NNS; 1067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 1069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown QualifiedDeclRefExpr(NamedDecl *d, QualType t, SourceLocation l, bool TD, 1070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool VD, SourceRange R, NestedNameSpecifier *NNS) 1071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : DeclRefExpr(QualifiedDeclRefExprClass, d, t, l, TD, VD), 1072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown QualifierRange(R), NNS(NNS) { } 1073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieve the source range of the nested-name-specifier. 1075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceRange getQualifierRange() const { return QualifierRange; } 1076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieve the nested-name-specifier that qualifies this 1078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// declaration. 1079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NestedNameSpecifier *getQualifier() const { return NNS; } 1080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { 1082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SourceRange(QualifierRange.getBegin(), getLocation()); 1083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 1086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == QualifiedDeclRefExprClass; 1087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const QualifiedDeclRefExpr *) { return true; } 1089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 1090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// \brief A qualified reference to a name whose declaration cannot 1092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// yet be resolved. 1093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// 1094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// UnresolvedDeclRefExpr is similar to QualifiedDeclRefExpr in that 1095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// it expresses a qualified reference to a declaration such as 1096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// X<T>::value. The difference, however, is that an 1097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// UnresolvedDeclRefExpr node is used only within C++ templates when 1098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// the qualification (e.g., X<T>::) refers to a dependent type. In 1099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// this case, X<T>::value cannot resolve to a declaration because the 1100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// declaration will differ from on instantiation of X<T> to the 1101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// next. Therefore, UnresolvedDeclRefExpr keeps track of the 1102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// qualifier (X<T>::) and the name of the entity being referenced 1103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// ("value"). Such expressions will instantiate to 1104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// QualifiedDeclRefExprs. 1105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass UnresolvedDeclRefExpr : public Expr { 1106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// The name of the entity we will be referencing. 1107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DeclarationName Name; 1108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// Location of the name of the declaration we're referencing. 1110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation Loc; 1111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// QualifierRange - The source range that covers the 1113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// nested-name-specifier. 1114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceRange QualifierRange; 1115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief The nested-name-specifier that qualifies this unresolved 1117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// declaration name. 1118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NestedNameSpecifier *NNS; 1119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Whether this expr is an address of (&) operand. 1121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool IsAddressOfOperand; 1122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 1124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UnresolvedDeclRefExpr(DeclarationName N, QualType T, SourceLocation L, 1125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceRange R, NestedNameSpecifier *NNS, 1126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool IsAddressOfOperand) 1127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : Expr(UnresolvedDeclRefExprClass, T, true, true), 1128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Name(N), Loc(L), QualifierRange(R), NNS(NNS), 1129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown IsAddressOfOperand(IsAddressOfOperand) { } 1130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieve the name that this expression refers to. 1132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DeclarationName getDeclName() const { return Name; } 1133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieve the location of the name within the expression. 1135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation getLocation() const { return Loc; } 1136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieve the source range of the nested-name-specifier. 1138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceRange getQualifierRange() const { return QualifierRange; } 1139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieve the nested-name-specifier that qualifies this 1141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// declaration. 1142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NestedNameSpecifier *getQualifier() const { return NNS; } 1143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieve whether this is an address of (&) operand. 1145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool isAddressOfOperand() const { return IsAddressOfOperand; } 1147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { 1148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SourceRange(QualifierRange.getBegin(), getLocation()); 1149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 1152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == UnresolvedDeclRefExprClass; 1153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const UnresolvedDeclRefExpr *) { return true; } 1155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual StmtIterator child_begin(); 1157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual StmtIterator child_end(); 1158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 1159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// \brief An expression that refers to a C++ template-id, such as 1161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// @c isa<FunctionDecl>. 1162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass TemplateIdRefExpr : public Expr { 1163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief If this template-id was qualified-id, e.g., @c std::sort<int>, 1164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// this nested name specifier contains the @c std::. 1165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NestedNameSpecifier *Qualifier; 1166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief If this template-id was a qualified-id, e.g., @c std::sort<int>, 1168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// this covers the source code range of the @c std::. 1169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceRange QualifierRange; 1170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief The actual template to which this template-id refers. 1172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown TemplateName Template; 1173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief The source location of the template name. 1175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation TemplateNameLoc; 1176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief The source location of the left angle bracket ('<'); 1178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation LAngleLoc; 1179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief The source location of the right angle bracket ('>'); 1181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation RAngleLoc; 1182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief The number of template arguments in TemplateArgs. 1184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned NumTemplateArgs; 1185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown TemplateIdRefExpr(QualType T, 1187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NestedNameSpecifier *Qualifier, SourceRange QualifierRange, 1188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown TemplateName Template, SourceLocation TemplateNameLoc, 1189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation LAngleLoc, 1190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const TemplateArgument *TemplateArgs, 1191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned NumTemplateArgs, 1192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation RAngleLoc); 1193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual void DoDestroy(ASTContext &Context); 1195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 1197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static TemplateIdRefExpr * 1198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Create(ASTContext &Context, QualType T, 1199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NestedNameSpecifier *Qualifier, SourceRange QualifierRange, 1200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown TemplateName Template, SourceLocation TemplateNameLoc, 1201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation LAngleLoc, const TemplateArgument *TemplateArgs, 1202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned NumTemplateArgs, SourceLocation RAngleLoc); 1203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieve the nested name specifier used to qualify the name of 1205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// this template-id, e.g., the "std::sort" in @c std::sort<int>, or NULL 1206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// if this template-id was an unqualified-id. 1207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NestedNameSpecifier *getQualifier() const { return Qualifier; } 1208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieve the source range describing the nested name specifier 1210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// used to qualified the name of this template-id, if the name was qualified. 1211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceRange getQualifierRange() const { return QualifierRange; } 1212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieve the name of the template referenced, e.g., "sort" in 1214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// @c std::sort<int>; 1215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown TemplateName getTemplateName() const { return Template; } 1216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieve the location of the name of the template referenced, e.g., 1218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// the location of "sort" in @c std::sort<int>. 1219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation getTemplateNameLoc() const { return TemplateNameLoc; } 1220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieve the location of the left angle bracket following the 1222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// template name ('<'). 1223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation getLAngleLoc() const { return LAngleLoc; } 1224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieve the template arguments provided as part of this 1226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// template-id. 1227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const TemplateArgument *getTemplateArgs() const { 1228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return reinterpret_cast<const TemplateArgument *>(this + 1); 1229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieve the number of template arguments provided as part of this 1232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// template-id. 1233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned getNumTemplateArgs() const { return NumTemplateArgs; } 1234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// \brief Retrieve the location of the right angle bracket following the 1236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /// template arguments ('>'). 1237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SourceLocation getRAngleLoc() const { return RAngleLoc; } 1238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual SourceRange getSourceRange() const { 1240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return SourceRange(Qualifier? QualifierRange.getBegin() : TemplateNameLoc, 1241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown RAngleLoc); 1242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Iterators 1245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_begin(); 1246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual child_iterator child_end(); 1247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const Stmt *T) { 1249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return T->getStmtClass() == TemplateIdRefExprClass; 1250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static bool classof(const TemplateIdRefExpr *) { return true; } 1252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 1253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclass CXXExprWithTemporaries : public Expr { 1255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Stmt *SubExpr; 1256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXTemporary **Temps; 1258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned NumTemps; 1259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ShouldDestroyTemps; 1261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CXXExprWithTemporaries(Expr *SubExpr, CXXTemporary **Temps, 1263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned NumTemps, bool ShouldDestroyTemps); 1264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ~CXXExprWithTemporaries(); 1265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownprotected: 1267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown virtual void DoDestroy(ASTContext &C); 1268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpublic: 1270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static CXXExprWithTemporaries *Create(ASTContext &C, Expr *SubExpr, 1271 CXXTemporary **Temps, unsigned NumTemps, 1272 bool ShouldDestroyTemporaries); 1273 1274 unsigned getNumTemporaries() const { return NumTemps; } 1275 CXXTemporary *getTemporary(unsigned i) { 1276 assert(i < NumTemps && "Index out of range"); 1277 return Temps[i]; 1278 } 1279 const CXXTemporary *getTemporary(unsigned i) const { 1280 assert(i < NumTemps && "Index out of range"); 1281 return Temps[i]; 1282 } 1283 1284 bool shouldDestroyTemporaries() const { return ShouldDestroyTemps; } 1285 1286 void removeLastTemporary() { NumTemps--; } 1287 1288 Expr *getSubExpr() { return cast<Expr>(SubExpr); } 1289 const Expr *getSubExpr() const { return cast<Expr>(SubExpr); } 1290 void setSubExpr(Expr *E) { SubExpr = E; } 1291 1292 virtual SourceRange getSourceRange() const { return SourceRange(); } 1293 1294 // Implement isa/cast/dyncast/etc. 1295 static bool classof(const Stmt *T) { 1296 return T->getStmtClass() == CXXExprWithTemporariesClass; 1297 } 1298 static bool classof(const CXXExprWithTemporaries *) { return true; } 1299 1300 // Iterators 1301 virtual child_iterator child_begin(); 1302 virtual child_iterator child_end(); 1303}; 1304 1305/// \brief Describes an explicit type conversion that uses functional 1306/// notion but could not be resolved because one or more arguments are 1307/// type-dependent. 1308/// 1309/// The explicit type conversions expressed by 1310/// CXXUnresolvedConstructExpr have the form \c T(a1, a2, ..., aN), 1311/// where \c T is some type and \c a1, a2, ..., aN are values, and 1312/// either \C T is a dependent type or one or more of the \c a's is 1313/// type-dependent. For example, this would occur in a template such 1314/// as: 1315/// 1316/// \code 1317/// template<typename T, typename A1> 1318/// inline T make_a(const A1& a1) { 1319/// return T(a1); 1320/// } 1321/// \endcode 1322/// 1323/// When the returned expression is instantiated, it may resolve to a 1324/// constructor call, conversion function call, or some kind of type 1325/// conversion. 1326class CXXUnresolvedConstructExpr : public Expr { 1327 /// \brief The starting location of the type 1328 SourceLocation TyBeginLoc; 1329 1330 /// \brief The type being constructed. 1331 QualType Type; 1332 1333 /// \brief The location of the left parentheses ('('). 1334 SourceLocation LParenLoc; 1335 1336 /// \brief The location of the right parentheses (')'). 1337 SourceLocation RParenLoc; 1338 1339 /// \brief The number of arguments used to construct the type. 1340 unsigned NumArgs; 1341 1342 CXXUnresolvedConstructExpr(SourceLocation TyBegin, 1343 QualType T, 1344 SourceLocation LParenLoc, 1345 Expr **Args, 1346 unsigned NumArgs, 1347 SourceLocation RParenLoc); 1348 1349public: 1350 static CXXUnresolvedConstructExpr *Create(ASTContext &C, 1351 SourceLocation TyBegin, 1352 QualType T, 1353 SourceLocation LParenLoc, 1354 Expr **Args, 1355 unsigned NumArgs, 1356 SourceLocation RParenLoc); 1357 1358 /// \brief Retrieve the source location where the type begins. 1359 SourceLocation getTypeBeginLoc() const { return TyBeginLoc; } 1360 void setTypeBeginLoc(SourceLocation L) { TyBeginLoc = L; } 1361 1362 /// \brief Retrieve the type that is being constructed, as specified 1363 /// in the source code. 1364 QualType getTypeAsWritten() const { return Type; } 1365 void setTypeAsWritten(QualType T) { Type = T; } 1366 1367 /// \brief Retrieve the location of the left parentheses ('(') that 1368 /// precedes the argument list. 1369 SourceLocation getLParenLoc() const { return LParenLoc; } 1370 void setLParenLoc(SourceLocation L) { LParenLoc = L; } 1371 1372 /// \brief Retrieve the location of the right parentheses (')') that 1373 /// follows the argument list. 1374 SourceLocation getRParenLoc() const { return RParenLoc; } 1375 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 1376 1377 /// \brief Retrieve the number of arguments. 1378 unsigned arg_size() const { return NumArgs; } 1379 1380 typedef Expr** arg_iterator; 1381 arg_iterator arg_begin() { return reinterpret_cast<Expr**>(this + 1); } 1382 arg_iterator arg_end() { return arg_begin() + NumArgs; } 1383 1384 Expr *getArg(unsigned I) { 1385 assert(I < NumArgs && "Argument index out-of-range"); 1386 return *(arg_begin() + I); 1387 } 1388 1389 virtual SourceRange getSourceRange() const { 1390 return SourceRange(TyBeginLoc, RParenLoc); 1391 } 1392 static bool classof(const Stmt *T) { 1393 return T->getStmtClass() == CXXUnresolvedConstructExprClass; 1394 } 1395 static bool classof(const CXXUnresolvedConstructExpr *) { return true; } 1396 1397 // Iterators 1398 virtual child_iterator child_begin(); 1399 virtual child_iterator child_end(); 1400}; 1401 1402/// \brief Represents a C++ member access expression where the actual member 1403/// referenced could not be resolved, e.g., because the base expression or the 1404/// member name was dependent. 1405class CXXUnresolvedMemberExpr : public Expr { 1406 /// \brief The expression for the base pointer or class reference, 1407 /// e.g., the \c x in x.f. 1408 Stmt *Base; 1409 1410 /// \brief Whether this member expression used the '->' operator or 1411 /// the '.' operator. 1412 bool IsArrow : 1; 1413 1414 /// \brief Whether this member expression has explicitly-specified template 1415 /// arguments. 1416 bool HasExplicitTemplateArgumentList : 1; 1417 1418 /// \brief The location of the '->' or '.' operator. 1419 SourceLocation OperatorLoc; 1420 1421 /// \brief The nested-name-specifier that precedes the member name, if any. 1422 NestedNameSpecifier *Qualifier; 1423 1424 /// \brief The source range covering the nested name specifier. 1425 SourceRange QualifierRange; 1426 1427 /// \brief In a qualified member access expression such as t->Base::f, this 1428 /// member stores the resolves of name lookup in the context of the member 1429 /// access expression, to be used at instantiation time. 1430 /// 1431 /// FIXME: This member, along with the Qualifier and QualifierRange, could 1432 /// be stuck into a structure that is optionally allocated at the end of 1433 /// the CXXUnresolvedMemberExpr, to save space in the common case. 1434 NamedDecl *FirstQualifierFoundInScope; 1435 1436 /// \brief The member to which this member expression refers, which 1437 /// can be name, overloaded operator, or destructor. 1438 /// FIXME: could also be a template-id 1439 DeclarationName Member; 1440 1441 /// \brief The location of the member name. 1442 SourceLocation MemberLoc; 1443 1444 /// \brief Retrieve the explicit template argument list that followed the 1445 /// member template name, if any. 1446 ExplicitTemplateArgumentList *getExplicitTemplateArgumentList() { 1447 if (!HasExplicitTemplateArgumentList) 1448 return 0; 1449 1450 return reinterpret_cast<ExplicitTemplateArgumentList *>(this + 1); 1451 } 1452 1453 /// \brief Retrieve the explicit template argument list that followed the 1454 /// member template name, if any. 1455 const ExplicitTemplateArgumentList *getExplicitTemplateArgumentList() const { 1456 return const_cast<CXXUnresolvedMemberExpr *>(this) 1457 ->getExplicitTemplateArgumentList(); 1458 } 1459 1460 CXXUnresolvedMemberExpr(ASTContext &C, 1461 Expr *Base, bool IsArrow, 1462 SourceLocation OperatorLoc, 1463 NestedNameSpecifier *Qualifier, 1464 SourceRange QualifierRange, 1465 NamedDecl *FirstQualifierFoundInScope, 1466 DeclarationName Member, 1467 SourceLocation MemberLoc, 1468 bool HasExplicitTemplateArgs, 1469 SourceLocation LAngleLoc, 1470 const TemplateArgument *TemplateArgs, 1471 unsigned NumTemplateArgs, 1472 SourceLocation RAngleLoc); 1473 1474public: 1475 CXXUnresolvedMemberExpr(ASTContext &C, 1476 Expr *Base, bool IsArrow, 1477 SourceLocation OperatorLoc, 1478 NestedNameSpecifier *Qualifier, 1479 SourceRange QualifierRange, 1480 NamedDecl *FirstQualifierFoundInScope, 1481 DeclarationName Member, 1482 SourceLocation MemberLoc) 1483 : Expr(CXXUnresolvedMemberExprClass, C.DependentTy, true, true), 1484 Base(Base), IsArrow(IsArrow), HasExplicitTemplateArgumentList(false), 1485 OperatorLoc(OperatorLoc), 1486 Qualifier(Qualifier), QualifierRange(QualifierRange), 1487 FirstQualifierFoundInScope(FirstQualifierFoundInScope), 1488 Member(Member), MemberLoc(MemberLoc) { } 1489 1490 static CXXUnresolvedMemberExpr * 1491 Create(ASTContext &C, 1492 Expr *Base, bool IsArrow, 1493 SourceLocation OperatorLoc, 1494 NestedNameSpecifier *Qualifier, 1495 SourceRange QualifierRange, 1496 NamedDecl *FirstQualifierFoundInScope, 1497 DeclarationName Member, 1498 SourceLocation MemberLoc, 1499 bool HasExplicitTemplateArgs, 1500 SourceLocation LAngleLoc, 1501 const TemplateArgument *TemplateArgs, 1502 unsigned NumTemplateArgs, 1503 SourceLocation RAngleLoc); 1504 1505 /// \brief Retrieve the base object of this member expressions, 1506 /// e.g., the \c x in \c x.m. 1507 Expr *getBase() { return cast<Expr>(Base); } 1508 void setBase(Expr *E) { Base = E; } 1509 1510 /// \brief Determine whether this member expression used the '->' 1511 /// operator; otherwise, it used the '.' operator. 1512 bool isArrow() const { return IsArrow; } 1513 void setArrow(bool A) { IsArrow = A; } 1514 1515 /// \brief Retrieve the location of the '->' or '.' operator. 1516 SourceLocation getOperatorLoc() const { return OperatorLoc; } 1517 void setOperatorLoc(SourceLocation L) { OperatorLoc = L; } 1518 1519 /// \brief Retrieve the nested-name-specifier that qualifies the member 1520 /// name. 1521 NestedNameSpecifier *getQualifier() const { return Qualifier; } 1522 1523 /// \brief Retrieve the source range covering the nested-name-specifier 1524 /// that qualifies the member name. 1525 SourceRange getQualifierRange() const { return QualifierRange; } 1526 1527 /// \brief Retrieve the first part of the nested-name-specifier that was 1528 /// found in the scope of the member access expression when the member access 1529 /// was initially parsed. 1530 /// 1531 /// This function only returns a useful result when member access expression 1532 /// uses a qualified member name, e.g., "x.Base::f". Here, the declaration 1533 /// returned by this function describes what was found by unqualified name 1534 /// lookup for the identifier "Base" within the scope of the member access 1535 /// expression itself. At template instantiation time, this information is 1536 /// combined with the results of name lookup into the type of the object 1537 /// expression itself (the class type of x). 1538 NamedDecl *getFirstQualifierFoundInScope() const { 1539 return FirstQualifierFoundInScope; 1540 } 1541 1542 /// \brief Retrieve the name of the member that this expression 1543 /// refers to. 1544 DeclarationName getMember() const { return Member; } 1545 void setMember(DeclarationName N) { Member = N; } 1546 1547 // \brief Retrieve the location of the name of the member that this 1548 // expression refers to. 1549 SourceLocation getMemberLoc() const { return MemberLoc; } 1550 void setMemberLoc(SourceLocation L) { MemberLoc = L; } 1551 1552 /// \brief Determines whether this member expression actually had a C++ 1553 /// template argument list explicitly specified, e.g., x.f<int>. 1554 bool hasExplicitTemplateArgumentList() { 1555 return HasExplicitTemplateArgumentList; 1556 } 1557 1558 /// \brief Retrieve the location of the left angle bracket following the 1559 /// member name ('<'), if any. 1560 SourceLocation getLAngleLoc() const { 1561 if (!HasExplicitTemplateArgumentList) 1562 return SourceLocation(); 1563 1564 return getExplicitTemplateArgumentList()->LAngleLoc; 1565 } 1566 1567 /// \brief Retrieve the template arguments provided as part of this 1568 /// template-id. 1569 const TemplateArgument *getTemplateArgs() const { 1570 if (!HasExplicitTemplateArgumentList) 1571 return 0; 1572 1573 return getExplicitTemplateArgumentList()->getTemplateArgs(); 1574 } 1575 1576 /// \brief Retrieve the number of template arguments provided as part of this 1577 /// template-id. 1578 unsigned getNumTemplateArgs() const { 1579 if (!HasExplicitTemplateArgumentList) 1580 return 0; 1581 1582 return getExplicitTemplateArgumentList()->NumTemplateArgs; 1583 } 1584 1585 /// \brief Retrieve the location of the right angle bracket following the 1586 /// template arguments ('>'). 1587 SourceLocation getRAngleLoc() const { 1588 if (!HasExplicitTemplateArgumentList) 1589 return SourceLocation(); 1590 1591 return getExplicitTemplateArgumentList()->RAngleLoc; 1592 } 1593 1594 virtual SourceRange getSourceRange() const { 1595 if (HasExplicitTemplateArgumentList) 1596 return SourceRange(Base->getSourceRange().getBegin(), 1597 getRAngleLoc()); 1598 1599 return SourceRange(Base->getSourceRange().getBegin(), 1600 MemberLoc); 1601 } 1602 1603 static bool classof(const Stmt *T) { 1604 return T->getStmtClass() == CXXUnresolvedMemberExprClass; 1605 } 1606 static bool classof(const CXXUnresolvedMemberExpr *) { return true; } 1607 1608 // Iterators 1609 virtual child_iterator child_begin(); 1610 virtual child_iterator child_end(); 1611}; 1612 1613} // end namespace clang 1614 1615#endif 1616