ExprCXX.h revision 17330019f05966762bc952840ef1926b9becb145
194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata//===--- ExprCXX.h - Classes for representing expressions -------*- C++ -*-===// 294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata// 3d8286ed3496bcd69cd4796f57a5b5c04859d2378Petr Machata// The LLVM Compiler Infrastructure 494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata// 594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata// This file is distributed under the University of Illinois Open Source 694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata// License. See LICENSE.TXT for details. 794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata// 894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata//===----------------------------------------------------------------------===// 994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata// 1094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata// This file defines the Expr interface and subclasses for C++ expressions. 1194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata// 1294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata//===----------------------------------------------------------------------===// 1394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 1494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata#ifndef LLVM_CLANG_AST_EXPRCXX_H 1594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata#define LLVM_CLANG_AST_EXPRCXX_H 1694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 1794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata#include "clang/Basic/TypeTraits.h" 1894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata#include "clang/AST/Expr.h" 1994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata#include "clang/AST/Decl.h" 2094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 2194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatanamespace clang { 2294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 2394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata class CXXConstructorDecl; 24caccda07541df0790887311d898405b2e4d78a5fPetr Machata 25caccda07541df0790887311d898405b2e4d78a5fPetr Machata//===--------------------------------------------------------------------===// 267bafff09cc66e23519512a54e2d1ebd3664a1a70Steve Fink// C++ Expressions. 275e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes//===--------------------------------------------------------------------===// 2894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 2994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// CXXOperatorCallExpr - Represents a call to an overloaded operator 3094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// written using operator syntax, e.g., "x + y" or "*p". While 3194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// semantically equivalent to a normal call, this AST node provides 32307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata/// better information about the syntactic representation of the call. 33caccda07541df0790887311d898405b2e4d78a5fPetr Machataclass CXXOperatorCallExpr : public CallExpr { 345e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedespublic: 351721fc956dfe30fd5dc5a49238c376ccbfdfd9d9Petr Machata CXXOperatorCallExpr(Expr *fn, Expr **args, unsigned numargs, QualType t, 3694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata SourceLocation operatorloc) 37caccda07541df0790887311d898405b2e4d78a5fPetr Machata : CallExpr(CXXOperatorCallExprClass, fn, args, numargs, t, operatorloc) { } 38caccda07541df0790887311d898405b2e4d78a5fPetr Machata 39caccda07541df0790887311d898405b2e4d78a5fPetr Machata /// getOperator - Returns the kind of overloaded operator that this 40000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata /// expression refers to. 41caccda07541df0790887311d898405b2e4d78a5fPetr Machata OverloadedOperatorKind getOperator() const; 42d7b2292789462475ead5986c2dea25a0b8623f7dPetr Machata 435e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes /// getOperatorLoc - Returns the location of the operator symbol in 4494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata /// the expression. When @c getOperator()==OO_Call, this is the 4594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata /// location of the right parentheses; when @c 4694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata /// getOperator()==OO_Subscript, this is the location of the right 4794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata /// bracket. 4894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata SourceLocation getOperatorLoc() const { return getRParenLoc(); } 4994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 5094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata virtual SourceRange getSourceRange() const; 5194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 5294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata static bool classof(const Stmt *T) { 5394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata return T->getStmtClass() == CXXOperatorCallExprClass; 5494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata } 5594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata static bool classof(const CXXOperatorCallExpr *) { return true; } 56a413e5b8880de643a83ad124d078091c0956fe1dJuan Cespedes}; 5765b53df7fa2577c4138aef86c115873eab684a0aSteve Fink 5894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// CXXMemberCallExpr - Represents a call to a member function that 5994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// may be written either with member call syntax (e.g., "obj.func()" 6094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// or "objptr->func()") or with normal function-call syntax 6194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// ("func()") within a member function that ends up calling a member 6294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// function. The callee in either case is a MemberExpr that contains 6394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// both the object argument and the member function, while the 6494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// arguments are the arguments within the parentheses (not including 6594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// the object argument). 6694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machataclass CXXMemberCallExpr : public CallExpr { 6794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatapublic: 6894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata CXXMemberCallExpr(Expr *fn, Expr **args, unsigned numargs, QualType t, 69e773f634dc1283a47786788e747aa5217f61c6fcPetr Machata SourceLocation rparenloc) 7094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata : CallExpr(CXXMemberCallExprClass, fn, args, numargs, t, rparenloc) { } 7194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 72c1e4186bc03fff3ddc2682bc10b11075381a950bPetr Machata /// getImplicitObjectArgument - Retrieves the implicit object 7394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata /// argument for the member call. For example, in "x.f(5)", this 74e773f634dc1283a47786788e747aa5217f61c6fcPetr Machata /// operation would return "x". 7594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata Expr *getImplicitObjectArgument(); 76e773f634dc1283a47786788e747aa5217f61c6fcPetr Machata 7794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata static bool classof(const Stmt *T) { 7894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata return T->getStmtClass() == CXXMemberCallExprClass; 79e773f634dc1283a47786788e747aa5217f61c6fcPetr Machata } 8094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata static bool classof(const CXXMemberCallExpr *) { return true; } 81e773f634dc1283a47786788e747aa5217f61c6fcPetr Machata}; 8294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 8394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// CXXNamedCastExpr - Abstract class common to all of the C++ "named" 8494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// casts, @c static_cast, @c dynamic_cast, @c reinterpret_cast, or @c 8594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// const_cast. 8694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// 8794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// This abstract class is inherited by all of the classes 8894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// representing "named" casts, e.g., CXXStaticCastExpr, 8994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// CXXDynamicCastExpr, CXXReinterpretCastExpr, and CXXConstCastExpr. 9094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machataclass CXXNamedCastExpr : public ExplicitCastExpr { 9194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machataprivate: 92e773f634dc1283a47786788e747aa5217f61c6fcPetr Machata SourceLocation Loc; // the location of the casting op 9394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 9494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machataprotected: 9594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata CXXNamedCastExpr(StmtClass SC, QualType ty, Expr *op, QualType writtenTy, 9694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata SourceLocation l) 9794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata : ExplicitCastExpr(SC, ty, op, writtenTy), Loc(l) {} 9894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 9994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatapublic: 10094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata const char *getCastName() const; 10194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 10294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata virtual SourceRange getSourceRange() const { 10394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata return SourceRange(Loc, getSubExpr()->getSourceRange().getEnd()); 10494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata } 10594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata static bool classof(const Stmt *T) { 10694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata switch (T->getStmtClass()) { 10794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata case CXXNamedCastExprClass: 10894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata case CXXStaticCastExprClass: 10994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata case CXXDynamicCastExprClass: 11094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata case CXXReinterpretCastExprClass: 11194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata case CXXConstCastExprClass: 11294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata return true; 1136a48a6d7f428cd7f0796477a3892603a83fcce99Steve Fink default: 1146a48a6d7f428cd7f0796477a3892603a83fcce99Steve Fink return false; 11594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata } 11694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata } 117f13505251e6402460f6cc7ec84e0d8ca91607b4fJuan Cespedes static bool classof(const CXXNamedCastExpr *) { return true; } 11894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 11994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata virtual void EmitImpl(llvm::Serializer& S) const; 12094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata static CXXNamedCastExpr *CreateImpl(llvm::Deserializer& D, ASTContext& C, 12194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata StmtClass SC); 122adec201a52c240cf4b533c05106aedddc911ca76Petr Machata}; 12394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 12494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// CXXStaticCastExpr - A C++ @c static_cast expression (C++ [expr.static.cast]). 12594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// 1261150bc4b812f0150e832607b8724b023d6d7d575Steve Fink/// This expression node represents a C++ static cast, e.g., 127a413e5b8880de643a83ad124d078091c0956fe1dJuan Cespedes/// @c static_cast<int>(1.0). 128f13505251e6402460f6cc7ec84e0d8ca91607b4fJuan Cespedesclass CXXStaticCastExpr : public CXXNamedCastExpr { 129c00837c2928da53a3515b107399b742ea157e78aPetr Machatapublic: 13094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata CXXStaticCastExpr(QualType ty, Expr *op, QualType writtenTy, SourceLocation l) 13194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata : CXXNamedCastExpr(CXXStaticCastExprClass, ty, op, writtenTy, l) {} 13294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 13394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata static bool classof(const Stmt *T) { 13494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata return T->getStmtClass() == CXXStaticCastExprClass; 13594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata } 13694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata static bool classof(const CXXStaticCastExpr *) { return true; } 13794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata}; 13894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 13994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// CXXDynamicCastExpr - A C++ @c dynamic_cast expression 14094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// (C++ [expr.dynamic.cast]), which may perform a run-time check to 14194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// determine how to perform the type cast. 14294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// 14394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// This expression node represents a dynamic cast, e.g., 14494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// @c dynamic_cast<Derived*>(BasePtr). 14594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machataclass CXXDynamicCastExpr : public CXXNamedCastExpr { 14694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatapublic: 14794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata CXXDynamicCastExpr(QualType ty, Expr *op, QualType writtenTy, SourceLocation l) 14894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata : CXXNamedCastExpr(CXXDynamicCastExprClass, ty, op, writtenTy, l) {} 14994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 15094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata static bool classof(const Stmt *T) { 15194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata return T->getStmtClass() == CXXDynamicCastExprClass; 15294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata } 15394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata static bool classof(const CXXDynamicCastExpr *) { return true; } 15494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata}; 15594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 15694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// CXXReinterpretCastExpr - A C++ @c reinterpret_cast expression (C++ 15794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// [expr.reinterpret.cast]), which provides a differently-typed view 15894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// of a value but performs no actual work at run time. 15994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// 16094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// This expression node represents a reinterpret cast, e.g., 16194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// @c reinterpret_cast<int>(VoidPtr). 16294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machataclass CXXReinterpretCastExpr : public CXXNamedCastExpr { 16394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatapublic: 16494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata CXXReinterpretCastExpr(QualType ty, Expr *op, QualType writtenTy, 16594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata SourceLocation l) 16694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata : CXXNamedCastExpr(CXXReinterpretCastExprClass, ty, op, writtenTy, l) {} 167987d27b3e97b208874ca967d536dc862dae2bd43Petr Machata 168a413e5b8880de643a83ad124d078091c0956fe1dJuan Cespedes static bool classof(const Stmt *T) { 169a413e5b8880de643a83ad124d078091c0956fe1dJuan Cespedes return T->getStmtClass() == CXXReinterpretCastExprClass; 170987d27b3e97b208874ca967d536dc862dae2bd43Petr Machata } 171e3f4a984db115979e09414b7281da98399dd8949Petr Machata static bool classof(const CXXReinterpretCastExpr *) { return true; } 172e3f4a984db115979e09414b7281da98399dd8949Petr Machata}; 173e3f4a984db115979e09414b7281da98399dd8949Petr Machata 174c00837c2928da53a3515b107399b742ea157e78aPetr Machata/// CXXConstCastExpr - A C++ @c const_cast expression (C++ [expr.const.cast]), 175c00837c2928da53a3515b107399b742ea157e78aPetr Machata/// which can remove type qualifiers but does not change the underlying value. 176c00837c2928da53a3515b107399b742ea157e78aPetr Machata/// 177c00837c2928da53a3515b107399b742ea157e78aPetr Machata/// This expression node represents a const cast, e.g., 178c00837c2928da53a3515b107399b742ea157e78aPetr Machata/// @c const_cast<char*>(PtrToConstChar). 179c00837c2928da53a3515b107399b742ea157e78aPetr Machataclass CXXConstCastExpr : public CXXNamedCastExpr { 180c00837c2928da53a3515b107399b742ea157e78aPetr Machatapublic: 181c00837c2928da53a3515b107399b742ea157e78aPetr Machata CXXConstCastExpr(QualType ty, Expr *op, QualType writtenTy, 182c00837c2928da53a3515b107399b742ea157e78aPetr Machata SourceLocation l) 183c00837c2928da53a3515b107399b742ea157e78aPetr Machata : CXXNamedCastExpr(CXXConstCastExprClass, ty, op, writtenTy, l) {} 184c00837c2928da53a3515b107399b742ea157e78aPetr Machata 185c00837c2928da53a3515b107399b742ea157e78aPetr Machata static bool classof(const Stmt *T) { 186e3f4a984db115979e09414b7281da98399dd8949Petr Machata return T->getStmtClass() == CXXConstCastExprClass; 187e3f4a984db115979e09414b7281da98399dd8949Petr Machata } 188e3f4a984db115979e09414b7281da98399dd8949Petr Machata static bool classof(const CXXConstCastExpr *) { return true; } 189adec201a52c240cf4b533c05106aedddc911ca76Petr Machata}; 190c00837c2928da53a3515b107399b742ea157e78aPetr Machata 191e3f4a984db115979e09414b7281da98399dd8949Petr Machata/// CXXBoolLiteralExpr - [C++ 2.13.5] C++ Boolean Literal. 19294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// 193e3f4a984db115979e09414b7281da98399dd8949Petr Machataclass CXXBoolLiteralExpr : public Expr { 19494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata bool Value; 195e4b3263fb2b32eb5ee0f693fc223ed8c363fbd69Steve Fink SourceLocation Loc; 196e4b3263fb2b32eb5ee0f693fc223ed8c363fbd69Steve Finkpublic: 197f13505251e6402460f6cc7ec84e0d8ca91607b4fJuan Cespedes CXXBoolLiteralExpr(bool val, QualType Ty, SourceLocation l) : 198f197727e6247be1ee08d2a667931aee20512ae18Petr Machata Expr(CXXBoolLiteralExprClass, Ty), Value(val), Loc(l) {} 199f197727e6247be1ee08d2a667931aee20512ae18Petr Machata 200f197727e6247be1ee08d2a667931aee20512ae18Petr Machata bool getValue() const { return Value; } 201f197727e6247be1ee08d2a667931aee20512ae18Petr Machata 202f197727e6247be1ee08d2a667931aee20512ae18Petr Machata virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 203f197727e6247be1ee08d2a667931aee20512ae18Petr Machata 204f197727e6247be1ee08d2a667931aee20512ae18Petr Machata static bool classof(const Stmt *T) { 205f197727e6247be1ee08d2a667931aee20512ae18Petr Machata return T->getStmtClass() == CXXBoolLiteralExprClass; 206f197727e6247be1ee08d2a667931aee20512ae18Petr Machata } 207f197727e6247be1ee08d2a667931aee20512ae18Petr Machata static bool classof(const CXXBoolLiteralExpr *) { return true; } 208f197727e6247be1ee08d2a667931aee20512ae18Petr Machata 20994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata // Iterators 21094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata virtual child_iterator child_begin(); 21194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata virtual child_iterator child_end(); 21294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata}; 21394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 21494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// CXXTypeidExpr - A C++ @c typeid expression (C++ [expr.typeid]), which gets 21594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// the type_info that corresponds to the supplied type, or the (possibly 216f197727e6247be1ee08d2a667931aee20512ae18Petr Machata/// dynamic) type of the supplied expression. 21794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// 21894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// This represents code like @c typeid(int) or @c typeid(*objPtr) 21994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machataclass CXXTypeidExpr : public Expr { 220f197727e6247be1ee08d2a667931aee20512ae18Petr Machataprivate: 22194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata bool isTypeOp : 1; 22294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata union { 223a413e5b8880de643a83ad124d078091c0956fe1dJuan Cespedes void *Ty; 2247bafff09cc66e23519512a54e2d1ebd3664a1a70Steve Fink Stmt *Ex; 2257bafff09cc66e23519512a54e2d1ebd3664a1a70Steve Fink } Operand; 226f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machata SourceRange Range; 227f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machata 228f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machatapublic: 229f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machata CXXTypeidExpr(bool isTypeOp, void *op, QualType Ty, const SourceRange r) : 230f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machata Expr(CXXTypeidExprClass, Ty), isTypeOp(isTypeOp), Range(r) { 231f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machata if (isTypeOp) 232f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machata Operand.Ty = op; 233f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machata else 234f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machata // op was an Expr*, so cast it back to that to be safe 235f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machata Operand.Ex = static_cast<Stmt*>(op); 236f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machata } 237f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machata 238f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machata bool isTypeOperand() const { return isTypeOp; } 239f13505251e6402460f6cc7ec84e0d8ca91607b4fJuan Cespedes QualType getTypeOperand() const { 24094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)"); 24194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata return QualType::getFromOpaquePtr(Operand.Ty); 24294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata } 24394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata Expr* getExprOperand() const { 24494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)"); 245f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machata return static_cast<Expr*>(Operand.Ex); 246f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machata } 24794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 24894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata virtual SourceRange getSourceRange() const { 24994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata return Range; 25094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata } 25194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata static bool classof(const Stmt *T) { 252f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machata return T->getStmtClass() == CXXTypeidExprClass; 253f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machata } 254f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machata static bool classof(const CXXTypeidExpr *) { return true; } 255f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machata 2568904cdcbac783406d6f6d601d8447961b67068cePetr Machata // Iterators 25794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata virtual child_iterator child_begin(); 25894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata virtual child_iterator child_end(); 259f7c46bba61bb830e5a283ef8b0174f33c3989821Petr Machata 26094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata virtual void EmitImpl(llvm::Serializer& S) const; 261a413e5b8880de643a83ad124d078091c0956fe1dJuan Cespedes static CXXTypeidExpr* CreateImpl(llvm::Deserializer& D, ASTContext& C); 26294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata}; 26394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 26494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// CXXThisExpr - Represents the "this" expression in C++, which is a 26594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// pointer to the object on which the current member function is 2666a3e24dc1709530e59dd6ae3e91ced1c221fe1b9Steve Fink/// executing (C++ [expr.prim]p3). Example: 267d8286ed3496bcd69cd4796f57a5b5c04859d2378Petr Machata/// 26894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// @code 26994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// class Foo { 27094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// public: 27126c0c9413c2558c3f95cb466b3734ea5ba57444dPetr Machata/// void bar(); 272d8286ed3496bcd69cd4796f57a5b5c04859d2378Petr Machata/// void test() { this->bar(); } 27326c0c9413c2558c3f95cb466b3734ea5ba57444dPetr Machata/// }; 274307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata/// @endcode 275307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machataclass CXXThisExpr : public Expr { 276307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata SourceLocation Loc; 277307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata 278307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machatapublic: 279307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata CXXThisExpr(SourceLocation L, QualType Type) 280307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata : Expr(CXXThisExprClass, Type), Loc(L) { } 281307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata 282307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 283307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata 2846248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machata static bool classof(const Stmt *T) { 2856248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machata return T->getStmtClass() == CXXThisExprClass; 2866248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machata } 287307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata static bool classof(const CXXThisExpr *) { return true; } 2886248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machata 2896248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machata // Iterators 2906248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machata virtual child_iterator child_begin(); 2916248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machata virtual child_iterator child_end(); 2926248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machata 2936248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machata virtual void EmitImpl(llvm::Serializer& S) const; 2946248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machata static CXXThisExpr* CreateImpl(llvm::Deserializer& D, ASTContext& C); 2956248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machata}; 2966248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machata 2976248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machata/// CXXThrowExpr - [C++ 15] C++ Throw Expression. This handles 2986248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machata/// 'throw' and 'throw' assignment-expression. When 2996248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machata/// assignment-expression isn't present, Op will be null. 3006248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machata/// 3016248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machataclass CXXThrowExpr : public Expr { 3026248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machata Stmt *Op; 3036248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machata SourceLocation ThrowLoc; 3046248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machatapublic: 3056248a0ac394b2aa3b2267eaa1220a90b609b6f86Petr Machata // Ty is the void type which is used as the result type of the 306307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata // exepression. The l is the location of the throw keyword. expr 307307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata // can by null, if the optional expression to throw isn't present. 308307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata CXXThrowExpr(Expr *expr, QualType Ty, SourceLocation l) : 309307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata Expr(CXXThrowExprClass, Ty), Op(expr), ThrowLoc(l) {} 310307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata const Expr *getSubExpr() const { return cast_or_null<Expr>(Op); } 311307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata Expr *getSubExpr() { return cast_or_null<Expr>(Op); } 312307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata 313307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata virtual SourceRange getSourceRange() const { 314307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata if (getSubExpr() == 0) 315307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata return SourceRange(ThrowLoc, ThrowLoc); 316307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata return SourceRange(ThrowLoc, getSubExpr()->getSourceRange().getEnd()); 317307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata } 318307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata 319307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata static bool classof(const Stmt *T) { 320307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata return T->getStmtClass() == CXXThrowExprClass; 321307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata } 322307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata static bool classof(const CXXThrowExpr *) { return true; } 323307b90b158b79ba3aae61d5c6612b4769b10be5fPetr Machata 32494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata // Iterators 32526c0c9413c2558c3f95cb466b3734ea5ba57444dPetr Machata virtual child_iterator child_begin(); 32626c0c9413c2558c3f95cb466b3734ea5ba57444dPetr Machata virtual child_iterator child_end(); 32726c0c9413c2558c3f95cb466b3734ea5ba57444dPetr Machata}; 32826c0c9413c2558c3f95cb466b3734ea5ba57444dPetr Machata 32926c0c9413c2558c3f95cb466b3734ea5ba57444dPetr Machata/// CXXDefaultArgExpr - C++ [dcl.fct.default]. This wraps up a 33026c0c9413c2558c3f95cb466b3734ea5ba57444dPetr Machata/// function call argument that was created from the corresponding 3318904cdcbac783406d6f6d601d8447961b67068cePetr Machata/// parameter's default argument, when the call did not explicitly 33226c0c9413c2558c3f95cb466b3734ea5ba57444dPetr Machata/// supply arguments for all of the parameters. 33326c0c9413c2558c3f95cb466b3734ea5ba57444dPetr Machataclass CXXDefaultArgExpr : public Expr { 334c28410e3f4bb4d40e48d58440800fbb080b2e3d6Petr Machata ParmVarDecl *Param; 3358904cdcbac783406d6f6d601d8447961b67068cePetr Machatapublic: 3366a3e24dc1709530e59dd6ae3e91ced1c221fe1b9Steve Fink // Param is the parameter whose default argument is used by this 3376a3e24dc1709530e59dd6ae3e91ced1c221fe1b9Steve Fink // expression. 33894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata explicit CXXDefaultArgExpr(ParmVarDecl *param) 33994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata : Expr(CXXDefaultArgExprClass, 34094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata param->hasUnparsedDefaultArg()? param->getType().getNonReferenceType() 34194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata : param->getDefaultArg()->getType()), 34294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata Param(param) { } 34394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 34494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata // Retrieve the parameter that the argument was created from. 34594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata const ParmVarDecl *getParam() const { return Param; } 34694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata ParmVarDecl *getParam() { return Param; } 34794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 34894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata // Retrieve the actual argument to the function call. 34994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata const Expr *getExpr() const { return Param->getDefaultArg(); } 350c00837c2928da53a3515b107399b742ea157e78aPetr Machata Expr *getExpr() { return Param->getDefaultArg(); } 35194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 35294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata virtual SourceRange getSourceRange() const { 35394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata // Default argument expressions have no representation in the 35494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata // source, so they have an empty source range. 35594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata return SourceRange(); 35694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata } 357a77b267abb870c935f9b4187ca31409fa5eb9dcbPeter Wu 35831af32cfcd61671cbb5e567870103766b3231521Petr Machata static bool classof(const Stmt *T) { 359d7b2292789462475ead5986c2dea25a0b8623f7dPetr Machata return T->getStmtClass() == CXXDefaultArgExprClass; 360d7b2292789462475ead5986c2dea25a0b8623f7dPetr Machata } 36194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata static bool classof(const CXXDefaultArgExpr *) { return true; } 36294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 36394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata // Iterators 36494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata virtual child_iterator child_begin(); 36594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata virtual child_iterator child_end(); 3665e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes 36794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata // Serialization 36894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata virtual void EmitImpl(llvm::Serializer& S) const; 36994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata static CXXDefaultArgExpr* CreateImpl(llvm::Deserializer& D, 37094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata ASTContext& C); 37194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata}; 37294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 37394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// CXXFunctionalCastExpr - Represents an explicit C++ type conversion 37494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// that uses "functional" notion (C++ [expr.type.conv]). Example: @c 37594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// x = int(0.5); 37694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machataclass CXXFunctionalCastExpr : public ExplicitCastExpr { 37794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata SourceLocation TyBeginLoc; 37894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata SourceLocation RParenLoc; 37994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatapublic: 38094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata CXXFunctionalCastExpr(QualType ty, QualType writtenTy, 381f6ec08afb96292fd3c802c1f633d8de249664c72Petr Machata SourceLocation tyBeginLoc, Expr *castExpr, 3828904cdcbac783406d6f6d601d8447961b67068cePetr Machata SourceLocation rParenLoc) : 38394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata ExplicitCastExpr(CXXFunctionalCastExprClass, ty, castExpr, writtenTy), 38494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {} 38594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 38694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata SourceLocation getTypeBeginLoc() const { return TyBeginLoc; } 38794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata SourceLocation getRParenLoc() const { return RParenLoc; } 38894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 38994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata virtual SourceRange getSourceRange() const { 39094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata return SourceRange(TyBeginLoc, RParenLoc); 39194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata } 39294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata static bool classof(const Stmt *T) { 39394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata return T->getStmtClass() == CXXFunctionalCastExprClass; 39494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata } 39531af32cfcd61671cbb5e567870103766b3231521Petr Machata static bool classof(const CXXFunctionalCastExpr *) { return true; } 39631af32cfcd61671cbb5e567870103766b3231521Petr Machata 397ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata virtual void EmitImpl(llvm::Serializer& S) const; 398ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata static CXXFunctionalCastExpr * 39994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata CreateImpl(llvm::Deserializer& D, ASTContext& C); 40094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata}; 4012d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand 40294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// @brief Represents a C++ functional cast expression that builds a 40394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// temporary object. 40494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// 4052d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand/// This expression type represents a C++ "functional" cast 4062d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand/// (C++[expr.type.conv]) with N != 1 arguments that invokes a 407ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata/// constructor to build a temporary object. If N == 0 but no 40894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// constructor will be called (because the functional cast is 40994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// performing a value-initialized an object whose class type has no 41094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// user-declared constructors), CXXZeroInitValueExpr will represent 4112d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand/// the functional cast. Finally, with N == 1 arguments the functional 412e773f634dc1283a47786788e747aa5217f61c6fcPetr Machata/// cast expression will be represented by CXXFunctionalCastExpr. 413ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata/// Example: 414ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata/// @code 41594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/// struct X { X(int, float); } 4162d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand/// 417e773f634dc1283a47786788e747aa5217f61c6fcPetr Machata/// X create_X() { 418c00837c2928da53a3515b107399b742ea157e78aPetr Machata/// return X(1, 3.14f); // creates a CXXTemporaryObjectExpr 419c00837c2928da53a3515b107399b742ea157e78aPetr Machata/// }; 420e773f634dc1283a47786788e747aa5217f61c6fcPetr Machata/// @endcode 42194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machataclass CXXTemporaryObjectExpr : public Expr { 42294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata SourceLocation TyBeginLoc; 42394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata SourceLocation RParenLoc; 424f197727e6247be1ee08d2a667931aee20512ae18Petr Machata CXXConstructorDecl *Constructor; 42594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata Stmt **Args; 426e4b3263fb2b32eb5ee0f693fc223ed8c363fbd69Steve Fink unsigned NumArgs; 42794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 42894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatapublic: 4297bafff09cc66e23519512a54e2d1ebd3664a1a70Steve Fink CXXTemporaryObjectExpr(CXXConstructorDecl *Cons, QualType writtenTy, 430d8286ed3496bcd69cd4796f57a5b5c04859d2378Petr Machata SourceLocation tyBeginLoc, Expr **Args, 431d8286ed3496bcd69cd4796f57a5b5c04859d2378Petr Machata unsigned NumArgs, SourceLocation rParenLoc); 43294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 43394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata ~CXXTemporaryObjectExpr(); 43494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 4357bafff09cc66e23519512a54e2d1ebd3664a1a70Steve Fink SourceLocation getTypeBeginLoc() const { return TyBeginLoc; } 43694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata SourceLocation getRParenLoc() const { return RParenLoc; } 43794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 43894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata typedef ExprIterator arg_iterator; 439e3f4a984db115979e09414b7281da98399dd8949Petr Machata typedef ConstExprIterator const_arg_iterator; 4405e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes 44194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata arg_iterator arg_begin() { return Args; } 4425e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes arg_iterator arg_end() { return Args + NumArgs; } 44331af32cfcd61671cbb5e567870103766b3231521Petr Machata const_arg_iterator arg_begin() const { return Args; } 44431af32cfcd61671cbb5e567870103766b3231521Petr Machata const_arg_iterator arg_end() const { return Args + NumArgs; } 44531af32cfcd61671cbb5e567870103766b3231521Petr Machata 44631af32cfcd61671cbb5e567870103766b3231521Petr Machata virtual SourceRange getSourceRange() const { 44731af32cfcd61671cbb5e567870103766b3231521Petr Machata return SourceRange(TyBeginLoc, RParenLoc); 448e773f634dc1283a47786788e747aa5217f61c6fcPetr Machata } 449e773f634dc1283a47786788e747aa5217f61c6fcPetr Machata static bool classof(const Stmt *T) { 45031af32cfcd61671cbb5e567870103766b3231521Petr Machata return T->getStmtClass() == CXXTemporaryObjectExprClass; 45131af32cfcd61671cbb5e567870103766b3231521Petr Machata } 45231af32cfcd61671cbb5e567870103766b3231521Petr Machata static bool classof(const CXXTemporaryObjectExpr *) { return true; } 45331af32cfcd61671cbb5e567870103766b3231521Petr Machata 45431af32cfcd61671cbb5e567870103766b3231521Petr Machata // Iterators 455ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata virtual child_iterator child_begin(); 456ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata virtual child_iterator child_end(); 457ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata 458ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata virtual void EmitImpl(llvm::Serializer& S) const; 459ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata static CXXTemporaryObjectExpr *CreateImpl(llvm::Deserializer& D, ASTContext& C); 460ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata}; 461ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata 462ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata/// CXXZeroInitValueExpr - [C++ 5.2.3p2] 463ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata/// Expression "T()" which creates a value-initialized rvalue of type 464ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata/// T, which is either a non-class type or a class type without any 465ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata/// user-defined constructors. 466ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata/// 467ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machataclass CXXZeroInitValueExpr : public Expr { 468ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata SourceLocation TyBeginLoc; 469ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata SourceLocation RParenLoc; 470ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata 471ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machatapublic: 472ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata CXXZeroInitValueExpr(QualType ty, SourceLocation tyBeginLoc, 473ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata SourceLocation rParenLoc ) : 474ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata Expr(CXXZeroInitValueExprClass, ty), 475ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {} 476ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata 477ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata SourceLocation getTypeBeginLoc() const { return TyBeginLoc; } 478ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata SourceLocation getRParenLoc() const { return RParenLoc; } 479ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata 480ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata /// @brief Whether this initialization expression was 481ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata /// implicitly-generated. 482ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata bool isImplicit() const { 483ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata return TyBeginLoc.isInvalid() && RParenLoc.isInvalid(); 484ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata } 485ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata 486ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata virtual SourceRange getSourceRange() const { 487ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata return SourceRange(TyBeginLoc, RParenLoc); 488ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata } 489ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata 490ce034981e2880eecb8a196c78182dfb4ae67850fPetr Machata static bool classof(const Stmt *T) { 491b781916d24d6ee96842c818b5e18af31808d427dPetr Machata return T->getStmtClass() == CXXZeroInitValueExprClass; 492b781916d24d6ee96842c818b5e18af31808d427dPetr Machata } 493b781916d24d6ee96842c818b5e18af31808d427dPetr Machata static bool classof(const CXXZeroInitValueExpr *) { return true; } 494ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 495ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata // Iterators 496ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata virtual child_iterator child_begin(); 497ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata virtual child_iterator child_end(); 498ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 499ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata virtual void EmitImpl(llvm::Serializer& S) const; 500ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata static CXXZeroInitValueExpr * 501ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata CreateImpl(llvm::Deserializer& D, ASTContext& C); 502ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata}; 503ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 504ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata/// CXXConditionDeclExpr - Condition declaration of a if/switch/while/for 505ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata/// statement, e.g: "if (int x = f()) {...}". 506b781916d24d6ee96842c818b5e18af31808d427dPetr Machata/// The main difference with DeclRefExpr is that CXXConditionDeclExpr owns the 507b781916d24d6ee96842c818b5e18af31808d427dPetr Machata/// decl that it references. 508b781916d24d6ee96842c818b5e18af31808d427dPetr Machata/// 509b781916d24d6ee96842c818b5e18af31808d427dPetr Machataclass CXXConditionDeclExpr : public DeclRefExpr { 510b781916d24d6ee96842c818b5e18af31808d427dPetr Machatapublic: 511b781916d24d6ee96842c818b5e18af31808d427dPetr Machata CXXConditionDeclExpr(SourceLocation startLoc, 512b781916d24d6ee96842c818b5e18af31808d427dPetr Machata SourceLocation eqLoc, VarDecl *var) 513b781916d24d6ee96842c818b5e18af31808d427dPetr Machata : DeclRefExpr(CXXConditionDeclExprClass, var, 514b781916d24d6ee96842c818b5e18af31808d427dPetr Machata var->getType().getNonReferenceType(), startLoc) {} 515b781916d24d6ee96842c818b5e18af31808d427dPetr Machata 516e3f4a984db115979e09414b7281da98399dd8949Petr Machata virtual void Destroy(ASTContext& Ctx); 517e3f4a984db115979e09414b7281da98399dd8949Petr Machata 518e3f4a984db115979e09414b7281da98399dd8949Petr Machata SourceLocation getStartLoc() const { return getLocation(); } 51938fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata 52038fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata VarDecl *getVarDecl() { return cast<VarDecl>(getDecl()); } 52138fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata const VarDecl *getVarDecl() const { return cast<VarDecl>(getDecl()); } 52238fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata 52338fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata virtual SourceRange getSourceRange() const { 52438fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata return SourceRange(getStartLoc(), getVarDecl()->getInit()->getLocEnd()); 52538fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata } 52638fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata 52738fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata static bool classof(const Stmt *T) { 52838fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata return T->getStmtClass() == CXXConditionDeclExprClass; 52938fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata } 530e773f634dc1283a47786788e747aa5217f61c6fcPetr Machata static bool classof(const CXXConditionDeclExpr *) { return true; } 53138fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata 53238fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata // Iterators 53338fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata virtual child_iterator child_begin(); 53438fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata virtual child_iterator child_end(); 53538fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata 53638fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata // FIXME: Implement these. 53738fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata //virtual void EmitImpl(llvm::Serializer& S) const; 53838fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata //static CXXConditionDeclExpr * 53938fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata // CreateImpl(llvm::Deserializer& D, ASTContext& C); 54038fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata}; 54138fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata 54238fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata/// CXXNewExpr - A new expression for memory allocation and constructor calls, 54338fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata/// e.g: "new CXXNewExpr(foo)". 54438fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machataclass CXXNewExpr : public Expr { 54538fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata // Was the usage ::new, i.e. is the global new to be used? 54638fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata bool GlobalNew : 1; 54738fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata // Was the form (type-id) used? Otherwise, it was new-type-id. 54838fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata bool ParenTypeId : 1; 54938fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata // Is there an initializer? If not, built-ins are uninitialized, else they're 55038fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata // value-initialized. 55138fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata bool Initializer : 1; 55238fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata // Do we allocate an array? If so, the first SubExpr is the size expression. 55338fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata bool Array : 1; 554c00837c2928da53a3515b107399b742ea157e78aPetr Machata // The number of placement new arguments. 555c00837c2928da53a3515b107399b742ea157e78aPetr Machata unsigned NumPlacementArgs : 14; 556c00837c2928da53a3515b107399b742ea157e78aPetr Machata // The number of constructor arguments. This may be 1 even for non-class 557c00837c2928da53a3515b107399b742ea157e78aPetr Machata // types; use the pseudo copy constructor. 558c00837c2928da53a3515b107399b742ea157e78aPetr Machata unsigned NumConstructorArgs : 14; 559c00837c2928da53a3515b107399b742ea157e78aPetr Machata // Contains an optional array size expression, any number of optional 560c00837c2928da53a3515b107399b742ea157e78aPetr Machata // placement arguments, and any number of optional constructor arguments, 561c00837c2928da53a3515b107399b742ea157e78aPetr Machata // in that order. 562c00837c2928da53a3515b107399b742ea157e78aPetr Machata Stmt **SubExprs; 563c00837c2928da53a3515b107399b742ea157e78aPetr Machata // Points to the allocation function used. 564c00837c2928da53a3515b107399b742ea157e78aPetr Machata FunctionDecl *OperatorNew; 565c00837c2928da53a3515b107399b742ea157e78aPetr Machata // Points to the deallocation function used in case of error. May be null. 566c00837c2928da53a3515b107399b742ea157e78aPetr Machata FunctionDecl *OperatorDelete; 567c00837c2928da53a3515b107399b742ea157e78aPetr Machata // Points to the constructor used. Cannot be null if AllocType is a record; 568c00837c2928da53a3515b107399b742ea157e78aPetr Machata // it would still point at the default constructor (even an implicit one). 569c00837c2928da53a3515b107399b742ea157e78aPetr Machata // Must be null for all other types. 570c00837c2928da53a3515b107399b742ea157e78aPetr Machata CXXConstructorDecl *Constructor; 571c00837c2928da53a3515b107399b742ea157e78aPetr Machata 572c00837c2928da53a3515b107399b742ea157e78aPetr Machata SourceLocation StartLoc; 573c00837c2928da53a3515b107399b742ea157e78aPetr Machata SourceLocation EndLoc; 574c00837c2928da53a3515b107399b742ea157e78aPetr Machata 575c00837c2928da53a3515b107399b742ea157e78aPetr Machata // Deserialization constructor 576c00837c2928da53a3515b107399b742ea157e78aPetr Machata CXXNewExpr(QualType ty, bool globalNew, bool parenTypeId, bool initializer, 577c00837c2928da53a3515b107399b742ea157e78aPetr Machata bool array, unsigned numPlaceArgs, unsigned numConsArgs, 578c00837c2928da53a3515b107399b742ea157e78aPetr Machata Stmt **subExprs, FunctionDecl *operatorNew, 579c00837c2928da53a3515b107399b742ea157e78aPetr Machata FunctionDecl *operatorDelete, CXXConstructorDecl *constructor, 580c00837c2928da53a3515b107399b742ea157e78aPetr Machata SourceLocation startLoc, SourceLocation endLoc) 581c00837c2928da53a3515b107399b742ea157e78aPetr Machata : Expr(CXXNewExprClass, ty), GlobalNew(globalNew), ParenTypeId(parenTypeId), 582c00837c2928da53a3515b107399b742ea157e78aPetr Machata Initializer(initializer), Array(array), NumPlacementArgs(numPlaceArgs), 583c00837c2928da53a3515b107399b742ea157e78aPetr Machata NumConstructorArgs(numConsArgs), SubExprs(subExprs), 584c00837c2928da53a3515b107399b742ea157e78aPetr Machata OperatorNew(operatorNew), OperatorDelete(operatorDelete), 585c00837c2928da53a3515b107399b742ea157e78aPetr Machata Constructor(constructor), StartLoc(startLoc), EndLoc(endLoc) 586c00837c2928da53a3515b107399b742ea157e78aPetr Machata { } 587c00837c2928da53a3515b107399b742ea157e78aPetr Machatapublic: 588c00837c2928da53a3515b107399b742ea157e78aPetr Machata CXXNewExpr(bool globalNew, FunctionDecl *operatorNew, Expr **placementArgs, 589c00837c2928da53a3515b107399b742ea157e78aPetr Machata unsigned numPlaceArgs, bool ParenTypeId, Expr *arraySize, 590c00837c2928da53a3515b107399b742ea157e78aPetr Machata CXXConstructorDecl *constructor, bool initializer, 591c00837c2928da53a3515b107399b742ea157e78aPetr Machata Expr **constructorArgs, unsigned numConsArgs, 592c00837c2928da53a3515b107399b742ea157e78aPetr Machata FunctionDecl *operatorDelete, QualType ty, 593caccda07541df0790887311d898405b2e4d78a5fPetr Machata SourceLocation startLoc, SourceLocation endLoc); 594caccda07541df0790887311d898405b2e4d78a5fPetr Machata ~CXXNewExpr() { 595caccda07541df0790887311d898405b2e4d78a5fPetr Machata delete[] SubExprs; 596caccda07541df0790887311d898405b2e4d78a5fPetr Machata } 597caccda07541df0790887311d898405b2e4d78a5fPetr Machata 598c00837c2928da53a3515b107399b742ea157e78aPetr Machata QualType getAllocatedType() const { 59938fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata assert(getType()->isPointerType()); 60038fb49b852374d749bc91f1b8d91a2b5b2a57a10Petr Machata return getType()->getAsPointerType()->getPointeeType(); 601e3f4a984db115979e09414b7281da98399dd8949Petr Machata } 602e3f4a984db115979e09414b7281da98399dd8949Petr Machata 603e3f4a984db115979e09414b7281da98399dd8949Petr Machata FunctionDecl *getOperatorNew() const { return OperatorNew; } 604e3f4a984db115979e09414b7281da98399dd8949Petr Machata FunctionDecl *getOperatorDelete() const { return OperatorDelete; } 605e3f4a984db115979e09414b7281da98399dd8949Petr Machata CXXConstructorDecl *getConstructor() const { return Constructor; } 606e3f4a984db115979e09414b7281da98399dd8949Petr Machata 607e3f4a984db115979e09414b7281da98399dd8949Petr Machata bool isArray() const { return Array; } 608e3f4a984db115979e09414b7281da98399dd8949Petr Machata Expr *getArraySize() { 609e3f4a984db115979e09414b7281da98399dd8949Petr Machata return Array ? cast<Expr>(SubExprs[0]) : 0; 610e3f4a984db115979e09414b7281da98399dd8949Petr Machata } 611c00837c2928da53a3515b107399b742ea157e78aPetr Machata const Expr *getArraySize() const { 612c00837c2928da53a3515b107399b742ea157e78aPetr Machata return Array ? cast<Expr>(SubExprs[0]) : 0; 613c00837c2928da53a3515b107399b742ea157e78aPetr Machata } 614c00837c2928da53a3515b107399b742ea157e78aPetr Machata 615c00837c2928da53a3515b107399b742ea157e78aPetr Machata unsigned getNumPlacementArgs() const { return NumPlacementArgs; } 616c00837c2928da53a3515b107399b742ea157e78aPetr Machata Expr *getPlacementArg(unsigned i) { 617c00837c2928da53a3515b107399b742ea157e78aPetr Machata assert(i < NumPlacementArgs && "Index out of range"); 618c00837c2928da53a3515b107399b742ea157e78aPetr Machata return cast<Expr>(SubExprs[Array + i]); 619c00837c2928da53a3515b107399b742ea157e78aPetr Machata } 620c00837c2928da53a3515b107399b742ea157e78aPetr Machata const Expr *getPlacementArg(unsigned i) const { 621c00837c2928da53a3515b107399b742ea157e78aPetr Machata assert(i < NumPlacementArgs && "Index out of range"); 622c00837c2928da53a3515b107399b742ea157e78aPetr Machata return cast<Expr>(SubExprs[Array + i]); 623c00837c2928da53a3515b107399b742ea157e78aPetr Machata } 624c00837c2928da53a3515b107399b742ea157e78aPetr Machata 625c00837c2928da53a3515b107399b742ea157e78aPetr Machata bool isGlobalNew() const { return GlobalNew; } 626e3f4a984db115979e09414b7281da98399dd8949Petr Machata bool isParenTypeId() const { return ParenTypeId; } 627e3f4a984db115979e09414b7281da98399dd8949Petr Machata bool hasInitializer() const { return Initializer; } 628e3f4a984db115979e09414b7281da98399dd8949Petr Machata 629e3f4a984db115979e09414b7281da98399dd8949Petr Machata unsigned getNumConstructorArgs() const { return NumConstructorArgs; } 630c00837c2928da53a3515b107399b742ea157e78aPetr Machata Expr *getConstructorArg(unsigned i) { 631c00837c2928da53a3515b107399b742ea157e78aPetr Machata assert(i < NumConstructorArgs && "Index out of range"); 632c00837c2928da53a3515b107399b742ea157e78aPetr Machata return cast<Expr>(SubExprs[Array + NumPlacementArgs + i]); 633e3f4a984db115979e09414b7281da98399dd8949Petr Machata } 634e3f4a984db115979e09414b7281da98399dd8949Petr Machata const Expr *getConstructorArg(unsigned i) const { 635e3f4a984db115979e09414b7281da98399dd8949Petr Machata assert(i < NumConstructorArgs && "Index out of range"); 636e3f4a984db115979e09414b7281da98399dd8949Petr Machata return cast<Expr>(SubExprs[Array + NumPlacementArgs + i]); 637e3f4a984db115979e09414b7281da98399dd8949Petr Machata } 638e3f4a984db115979e09414b7281da98399dd8949Petr Machata 639c00837c2928da53a3515b107399b742ea157e78aPetr Machata typedef ExprIterator arg_iterator; 640c00837c2928da53a3515b107399b742ea157e78aPetr Machata typedef ConstExprIterator const_arg_iterator; 641c00837c2928da53a3515b107399b742ea157e78aPetr Machata 642c00837c2928da53a3515b107399b742ea157e78aPetr Machata arg_iterator placement_arg_begin() { 643c00837c2928da53a3515b107399b742ea157e78aPetr Machata return SubExprs + Array; 644e3f4a984db115979e09414b7281da98399dd8949Petr Machata } 645e3f4a984db115979e09414b7281da98399dd8949Petr Machata arg_iterator placement_arg_end() { 646e3f4a984db115979e09414b7281da98399dd8949Petr Machata return SubExprs + Array + getNumPlacementArgs(); 647e3f4a984db115979e09414b7281da98399dd8949Petr Machata } 648e3f4a984db115979e09414b7281da98399dd8949Petr Machata const_arg_iterator placement_arg_begin() const { 649e3f4a984db115979e09414b7281da98399dd8949Petr Machata return SubExprs + Array; 650e3f4a984db115979e09414b7281da98399dd8949Petr Machata } 651e3f4a984db115979e09414b7281da98399dd8949Petr Machata const_arg_iterator placement_arg_end() const { 652e3f4a984db115979e09414b7281da98399dd8949Petr Machata return SubExprs + Array + getNumPlacementArgs(); 653e3f4a984db115979e09414b7281da98399dd8949Petr Machata } 654e3f4a984db115979e09414b7281da98399dd8949Petr Machata 655e3f4a984db115979e09414b7281da98399dd8949Petr Machata arg_iterator constructor_arg_begin() { 656e3f4a984db115979e09414b7281da98399dd8949Petr Machata return SubExprs + Array + getNumPlacementArgs(); 657e3f4a984db115979e09414b7281da98399dd8949Petr Machata } 658e3f4a984db115979e09414b7281da98399dd8949Petr Machata arg_iterator constructor_arg_end() { 659ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata return SubExprs + Array + getNumPlacementArgs() + getNumConstructorArgs(); 660ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata } 661ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata const_arg_iterator constructor_arg_begin() const { 662ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata return SubExprs + Array + getNumPlacementArgs(); 663ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata } 664ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata const_arg_iterator constructor_arg_end() const { 665ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata return SubExprs + Array + getNumPlacementArgs() + getNumConstructorArgs(); 666ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata } 667ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 668ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata virtual SourceRange getSourceRange() const { 669ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata return SourceRange(StartLoc, EndLoc); 670ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata } 671ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 672ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata static bool classof(const Stmt *T) { 673ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata return T->getStmtClass() == CXXNewExprClass; 674ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata } 675ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata static bool classof(const CXXNewExpr *) { return true; } 676ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 677ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata // Iterators 678ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata virtual child_iterator child_begin(); 679ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata virtual child_iterator child_end(); 680ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 681ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata virtual void EmitImpl(llvm::Serializer& S) const; 682ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata static CXXNewExpr* CreateImpl(llvm::Deserializer& D, ASTContext& C); 683ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata}; 684ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 685ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata/// CXXDeleteExpr - A delete expression for memory deallocation and destructor 686ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata/// calls, e.g. "delete[] pArray". 687ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machataclass CXXDeleteExpr : public Expr { 688ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata // Is this a forced global delete, i.e. "::delete"? 689ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata bool GlobalDelete : 1; 690ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata // Is this the array form of delete, i.e. "delete[]"? 691ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata bool ArrayForm : 1; 692ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata // Points to the operator delete overload that is used. Could be a member. 693ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata FunctionDecl *OperatorDelete; 694ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata // The pointer expression to be deleted. 695ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata Stmt *Argument; 696ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata // Location of the expression. 697ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata SourceLocation Loc; 698ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machatapublic: 699ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata CXXDeleteExpr(QualType ty, bool globalDelete, bool arrayForm, 700ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata FunctionDecl *operatorDelete, Expr *arg, SourceLocation loc) 701ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata : Expr(CXXDeleteExprClass, ty), GlobalDelete(globalDelete), 702ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata ArrayForm(arrayForm), OperatorDelete(operatorDelete), Argument(arg), 703ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata Loc(loc) { } 704ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 705ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata bool isGlobalDelete() const { return GlobalDelete; } 706ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata bool isArrayForm() const { return ArrayForm; } 707ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 708ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata FunctionDecl *getOperatorDelete() const { return OperatorDelete; } 709ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 710ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata Expr *getArgument() { return cast<Expr>(Argument); } 711ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata const Expr *getArgument() const { return cast<Expr>(Argument); } 712ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 713ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata virtual SourceRange getSourceRange() const { 714ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata return SourceRange(Loc, Argument->getLocEnd()); 715ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata } 716ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 717ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata static bool classof(const Stmt *T) { 718ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata return T->getStmtClass() == CXXDeleteExprClass; 719ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata } 720ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata static bool classof(const CXXDeleteExpr *) { return true; } 721ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 722ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata // Iterators 723ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata virtual child_iterator child_begin(); 724ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata virtual child_iterator child_end(); 7256bb420106f77ef8f134a1d4c001668e832f96cc9Andrey Zonov 726ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata virtual void EmitImpl(llvm::Serializer& S) const; 727ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata static CXXDeleteExpr * CreateImpl(llvm::Deserializer& D, ASTContext& C); 728ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata}; 729ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 730ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata/// \brief Represents the name of a function that has not been 731ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata/// resolved to any declaration. 732ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata/// 733ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata/// Unresolved function names occur when a function name is 734ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata/// encountered prior to an open parentheses ('(') in a C++ function 735ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata/// call, and the function name itself did not resolve to a 736ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata/// declaration. These function names can only be resolved when they 737ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata/// form the postfix-expression of a function call, so that 738ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata/// argument-dependent lookup finds declarations corresponding to 739ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata/// these functions. 740ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 741ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata/// @code 742ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata/// template<typename T> void f(T x) { 743ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata/// g(x); // g is an unresolved function name (that is also a dependent name) 744ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata/// } 745ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata/// @endcode 746ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machataclass UnresolvedFunctionNameExpr : public Expr { 747ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata /// The name that was present in the source 748ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata DeclarationName Name; 749ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 750ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata /// The location of this name in the source code 751ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata SourceLocation Loc; 752ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 753ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machatapublic: 754ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata UnresolvedFunctionNameExpr(DeclarationName N, QualType T, SourceLocation L) 755ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata : Expr(UnresolvedFunctionNameExprClass, T, false, false), Name(N), Loc(L) { } 756ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 757ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata /// \brief Retrieves the name that occurred in the source code. 758ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata DeclarationName getName() const { return Name; } 759ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 760ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata /// getLocation - Retrieves the location in the source code where 761ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata /// the name occurred. 762ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata SourceLocation getLocation() const { return Loc; } 763ec4ab256e5c7fe1596dd90a3c8e8d4b052ca1207Petr Machata 764 virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 765 766 static bool classof(const Stmt *T) { 767 return T->getStmtClass() == UnresolvedFunctionNameExprClass; 768 } 769 static bool classof(const UnresolvedFunctionNameExpr *) { return true; } 770 771 // Iterators 772 virtual child_iterator child_begin(); 773 virtual child_iterator child_end(); 774 775 virtual void EmitImpl(llvm::Serializer& S) const; 776 static UnresolvedFunctionNameExpr *CreateImpl(llvm::Deserializer& D, ASTContext& C); 777}; 778 779/// UnaryTypeTraitExpr - A GCC or MS unary type trait, as used in the 780/// implementation of TR1/C++0x type trait templates. 781/// Example: 782/// __is_pod(int) == true 783/// __is_enum(std::string) == false 784class UnaryTypeTraitExpr : public Expr { 785 /// UTT - The trait. 786 UnaryTypeTrait UTT; 787 788 /// Loc - The location of the type trait keyword. 789 SourceLocation Loc; 790 791 /// RParen - The location of the closing paren. 792 SourceLocation RParen; 793 794 /// QueriedType - The type we're testing. 795 QualType QueriedType; 796 797public: 798 UnaryTypeTraitExpr(SourceLocation loc, UnaryTypeTrait utt, QualType queried, 799 SourceLocation rparen, QualType ty) 800 : Expr(UnaryTypeTraitExprClass, ty, false, queried->isDependentType()), 801 UTT(utt), Loc(loc), RParen(rparen), QueriedType(queried) { } 802 803 virtual SourceRange getSourceRange() const { return SourceRange(Loc, RParen);} 804 805 UnaryTypeTrait getTrait() const { return UTT; } 806 807 QualType getQueriedType() const { return QueriedType; } 808 809 bool Evaluate() const; 810 811 static bool classof(const Stmt *T) { 812 return T->getStmtClass() == UnaryTypeTraitExprClass; 813 } 814 static bool classof(const UnaryTypeTraitExpr *) { return true; } 815 816 // Iterators 817 virtual child_iterator child_begin(); 818 virtual child_iterator child_end(); 819 820 virtual void EmitImpl(llvm::Serializer& S) const; 821 static UnaryTypeTraitExpr *CreateImpl(llvm::Deserializer& D, ASTContext& C); 822}; 823 824/// QualifiedDeclRefExpr - A reference to a declared variable, 825/// function, enum, etc., that includes a qualification, e.g., 826/// "N::foo". 827class QualifiedDeclRefExpr : public DeclRefExpr { 828 /// NestedNameLoc - The location of the beginning of the 829 /// nested-name-specifier that qualifies this declaration. 830 SourceLocation NestedNameLoc; 831 832public: 833 QualifiedDeclRefExpr(NamedDecl *d, QualType t, SourceLocation l, bool TD, 834 bool VD, SourceLocation nnl) 835 : DeclRefExpr(QualifiedDeclRefExprClass, d, t, l, TD, VD), 836 NestedNameLoc(nnl) { } 837 838 virtual SourceRange getSourceRange() const { 839 return SourceRange(NestedNameLoc, getLocation()); 840 } 841 842 static bool classof(const Stmt *T) { 843 return T->getStmtClass() == QualifiedDeclRefExprClass; 844 } 845 static bool classof(const QualifiedDeclRefExpr *) { return true; } 846 847 virtual void EmitImpl(llvm::Serializer& S) const; 848 static QualifiedDeclRefExpr* CreateImpl(llvm::Deserializer& D, ASTContext& C); 849}; 850 851} // end namespace clang 852 853#endif 854