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