ExprCXX.h revision 02bbfa33590dfe3107e801fb526b7ab0bdfd00ee
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- ExprCXX.h - Classes for representing expressions -------*- C++ -*-===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  This file defines the Expr interface and subclasses for C++ expressions.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef LLVM_CLANG_AST_EXPRCXX_H
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define LLVM_CLANG_AST_EXPRCXX_H
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl#include "clang/Basic/TypeTraits.h"
185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/Expr.h"
19c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/AST/Decl.h"
205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang {
225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
234c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  class CXXConstructorDecl;
2402bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  class CXXTempVarDecl;
254c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
261060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek//===--------------------------------------------------------------------===//
271060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek// C++ Expressions.
281060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek//===--------------------------------------------------------------------===//
291060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek
303fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// \brief A call to an overloaded operator written using operator
313fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// syntax.
323fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor///
333fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// Represents a call to an overloaded operator written using operator
343fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// syntax, e.g., "x + y" or "*p". While semantically equivalent to a
353fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// normal call, this AST node provides better information about the
363fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// syntactic representation of the call.
373fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor///
383fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// In a C++ template, this expression node kind will be used whenever
393fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// any of the arguments are type-dependent. In this case, the
403fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// function itself will be a (possibly empty) set of functions and
413fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// function templates that were found by name lookup at template
423fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// definition time.
43b4609806e9232593ece09ce08b630836e825865cDouglas Gregorclass CXXOperatorCallExpr : public CallExpr {
44063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  /// \brief The overloaded operator.
45063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  OverloadedOperatorKind Operator;
46063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor
47b4609806e9232593ece09ce08b630836e825865cDouglas Gregorpublic:
48063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  CXXOperatorCallExpr(ASTContext& C, OverloadedOperatorKind Op, Expr *fn,
49063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor                      Expr **args, unsigned numargs, QualType t,
50063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor                      SourceLocation operatorloc)
51063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    : CallExpr(C, CXXOperatorCallExprClass, fn, args, numargs, t, operatorloc),
52063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor      Operator(Op) {}
53b4609806e9232593ece09ce08b630836e825865cDouglas Gregor
54b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  /// getOperator - Returns the kind of overloaded operator that this
55b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  /// expression refers to.
56063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  OverloadedOperatorKind getOperator() const { return Operator; }
57b4609806e9232593ece09ce08b630836e825865cDouglas Gregor
58b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  /// getOperatorLoc - Returns the location of the operator symbol in
59b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  /// the expression. When @c getOperator()==OO_Call, this is the
60b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  /// location of the right parentheses; when @c
61b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  /// getOperator()==OO_Subscript, this is the location of the right
62b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  /// bracket.
63b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  SourceLocation getOperatorLoc() const { return getRParenLoc(); }
64b4609806e9232593ece09ce08b630836e825865cDouglas Gregor
65b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  virtual SourceRange getSourceRange() const;
66b4609806e9232593ece09ce08b630836e825865cDouglas Gregor
67b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  static bool classof(const Stmt *T) {
68b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    return T->getStmtClass() == CXXOperatorCallExprClass;
69b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  }
70b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  static bool classof(const CXXOperatorCallExpr *) { return true; }
71b4609806e9232593ece09ce08b630836e825865cDouglas Gregor};
72b4609806e9232593ece09ce08b630836e825865cDouglas Gregor
7388a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// CXXMemberCallExpr - Represents a call to a member function that
7488a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// may be written either with member call syntax (e.g., "obj.func()"
7588a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// or "objptr->func()") or with normal function-call syntax
7688a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// ("func()") within a member function that ends up calling a member
7788a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// function. The callee in either case is a MemberExpr that contains
7888a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// both the object argument and the member function, while the
7988a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// arguments are the arguments within the parentheses (not including
8088a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// the object argument).
8188a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregorclass CXXMemberCallExpr : public CallExpr {
8288a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregorpublic:
83668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek  CXXMemberCallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs,
84668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek                    QualType t, SourceLocation rparenloc)
85668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek    : CallExpr(C, CXXMemberCallExprClass, fn, args, numargs, t, rparenloc) {}
8688a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor
8788a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor  /// getImplicitObjectArgument - Retrieves the implicit object
8888a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor  /// argument for the member call. For example, in "x.f(5)", this
8988a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor  /// operation would return "x".
9088a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor  Expr *getImplicitObjectArgument();
9188a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor
9288a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor  static bool classof(const Stmt *T) {
9388a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor    return T->getStmtClass() == CXXMemberCallExprClass;
9488a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor  }
9588a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor  static bool classof(const CXXMemberCallExpr *) { return true; }
9688a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor};
9788a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor
9849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// CXXNamedCastExpr - Abstract class common to all of the C++ "named"
9949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// casts, @c static_cast, @c dynamic_cast, @c reinterpret_cast, or @c
10049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// const_cast.
10149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor///
10249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This abstract class is inherited by all of the classes
10349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// representing "named" casts, e.g., CXXStaticCastExpr,
10449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// CXXDynamicCastExpr, CXXReinterpretCastExpr, and CXXConstCastExpr.
10549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorclass CXXNamedCastExpr : public ExplicitCastExpr {
1061060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekprivate:
1071060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  SourceLocation Loc; // the location of the casting op
10849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
10949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorprotected:
11049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  CXXNamedCastExpr(StmtClass SC, QualType ty, Expr *op, QualType writtenTy,
11149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor                   SourceLocation l)
11249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    : ExplicitCastExpr(SC, ty, op, writtenTy), Loc(l) {}
11349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
1141060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic:
11549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  const char *getCastName() const;
11649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
1171060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  virtual SourceRange getSourceRange() const {
1181060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek    return SourceRange(Loc, getSubExpr()->getSourceRange().getEnd());
1191060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  }
1201060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  static bool classof(const Stmt *T) {
12149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    switch (T->getStmtClass()) {
12249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    case CXXNamedCastExprClass:
12349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    case CXXStaticCastExprClass:
12449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    case CXXDynamicCastExprClass:
12549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    case CXXReinterpretCastExprClass:
12649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    case CXXConstCastExprClass:
12749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor      return true;
12849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    default:
12949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor      return false;
13049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    }
1311060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  }
13249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  static bool classof(const CXXNamedCastExpr *) { return true; }
13349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor};
13449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
13549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// CXXStaticCastExpr - A C++ @c static_cast expression (C++ [expr.static.cast]).
13649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor///
13749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This expression node represents a C++ static cast, e.g.,
13849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// @c static_cast<int>(1.0).
13949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorclass CXXStaticCastExpr : public CXXNamedCastExpr {
14049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorpublic:
14149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  CXXStaticCastExpr(QualType ty, Expr *op, QualType writtenTy, SourceLocation l)
14249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    : CXXNamedCastExpr(CXXStaticCastExprClass, ty, op, writtenTy, l) {}
14349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
14449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  static bool classof(const Stmt *T) {
14549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    return T->getStmtClass() == CXXStaticCastExprClass;
14649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  }
14749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  static bool classof(const CXXStaticCastExpr *) { return true; }
14849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor};
14949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
15049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// CXXDynamicCastExpr - A C++ @c dynamic_cast expression
15149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// (C++ [expr.dynamic.cast]), which may perform a run-time check to
15249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// determine how to perform the type cast.
15349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor///
15449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This expression node represents a dynamic cast, e.g.,
15549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// @c dynamic_cast<Derived*>(BasePtr).
15649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorclass CXXDynamicCastExpr : public CXXNamedCastExpr {
15749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorpublic:
15849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  CXXDynamicCastExpr(QualType ty, Expr *op, QualType writtenTy, SourceLocation l)
15949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    : CXXNamedCastExpr(CXXDynamicCastExprClass, ty, op, writtenTy, l) {}
16049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
16149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  static bool classof(const Stmt *T) {
16249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    return T->getStmtClass() == CXXDynamicCastExprClass;
16349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  }
16449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  static bool classof(const CXXDynamicCastExpr *) { return true; }
16549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor};
16649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
16749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// CXXReinterpretCastExpr - A C++ @c reinterpret_cast expression (C++
16849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// [expr.reinterpret.cast]), which provides a differently-typed view
16949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// of a value but performs no actual work at run time.
17049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor///
17149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This expression node represents a reinterpret cast, e.g.,
17249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// @c reinterpret_cast<int>(VoidPtr).
17349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorclass CXXReinterpretCastExpr : public CXXNamedCastExpr {
17449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorpublic:
17549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  CXXReinterpretCastExpr(QualType ty, Expr *op, QualType writtenTy,
17649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor                         SourceLocation l)
17749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    : CXXNamedCastExpr(CXXReinterpretCastExprClass, ty, op, writtenTy, l) {}
17849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
17949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  static bool classof(const Stmt *T) {
18049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    return T->getStmtClass() == CXXReinterpretCastExprClass;
18149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  }
18249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  static bool classof(const CXXReinterpretCastExpr *) { return true; }
18349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor};
18449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
18549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// CXXConstCastExpr - A C++ @c const_cast expression (C++ [expr.const.cast]),
18649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// which can remove type qualifiers but does not change the underlying value.
18749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor///
18849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This expression node represents a const cast, e.g.,
18949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// @c const_cast<char*>(PtrToConstChar).
19049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorclass CXXConstCastExpr : public CXXNamedCastExpr {
19149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorpublic:
19249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  CXXConstCastExpr(QualType ty, Expr *op, QualType writtenTy,
19349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor                   SourceLocation l)
19449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    : CXXNamedCastExpr(CXXConstCastExprClass, ty, op, writtenTy, l) {}
19549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
19649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  static bool classof(const Stmt *T) {
19749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    return T->getStmtClass() == CXXConstCastExprClass;
19849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  }
19949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  static bool classof(const CXXConstCastExpr *) { return true; }
2001060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek};
2011060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek
2021060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// CXXBoolLiteralExpr - [C++ 2.13.5] C++ Boolean Literal.
2031060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek///
2041060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekclass CXXBoolLiteralExpr : public Expr {
2051060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  bool Value;
2061060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  SourceLocation Loc;
2071060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic:
2081060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  CXXBoolLiteralExpr(bool val, QualType Ty, SourceLocation l) :
2091060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek    Expr(CXXBoolLiteralExprClass, Ty), Value(val), Loc(l) {}
2101060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek
2111060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  bool getValue() const { return Value; }
2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2131060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2151060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  static bool classof(const Stmt *T) {
2161060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek    return T->getStmtClass() == CXXBoolLiteralExprClass;
2171060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  }
2181060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  static bool classof(const CXXBoolLiteralExpr *) { return true; }
2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2201060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  // Iterators
2211060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  virtual child_iterator child_begin();
2221060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  virtual child_iterator child_end();
2231060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek};
2241060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek
225c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl/// CXXTypeidExpr - A C++ @c typeid expression (C++ [expr.typeid]), which gets
226c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl/// the type_info that corresponds to the supplied type, or the (possibly
227c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl/// dynamic) type of the supplied expression.
228c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl///
229c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl/// This represents code like @c typeid(int) or @c typeid(*objPtr)
230c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlclass CXXTypeidExpr : public Expr {
231c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlprivate:
232c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  bool isTypeOp : 1;
233d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl  union {
234d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl    void *Ty;
235d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl    Stmt *Ex;
236d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl  } Operand;
237c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  SourceRange Range;
238c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl
239c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlpublic:
240c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  CXXTypeidExpr(bool isTypeOp, void *op, QualType Ty, const SourceRange r) :
2412850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl      Expr(CXXTypeidExprClass, Ty,
2422850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl        // typeid is never type-dependent (C++ [temp.dep.expr]p4)
2432850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl        false,
2442850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl        // typeid is value-dependent if the type or expression are dependent
2452850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl        (isTypeOp ? QualType::getFromOpaquePtr(op)->isDependentType()
2462850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl                  : static_cast<Expr*>(op)->isValueDependent())),
2472850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl      isTypeOp(isTypeOp), Range(r) {
248d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl    if (isTypeOp)
249d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl      Operand.Ty = op;
250d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl    else
251d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl      // op was an Expr*, so cast it back to that to be safe
2522850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl      Operand.Ex = static_cast<Expr*>(op);
253d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl  }
254c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl
255c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  bool isTypeOperand() const { return isTypeOp; }
256c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  QualType getTypeOperand() const {
257c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl    assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
258d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl    return QualType::getFromOpaquePtr(Operand.Ty);
259c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  }
260c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  Expr* getExprOperand() const {
261c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl    assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)");
262d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl    return static_cast<Expr*>(Operand.Ex);
263c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  }
264c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl
265c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  virtual SourceRange getSourceRange() const {
266c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl    return Range;
267c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  }
268c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  static bool classof(const Stmt *T) {
269c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl    return T->getStmtClass() == CXXTypeidExprClass;
270c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  }
271c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  static bool classof(const CXXTypeidExpr *) { return true; }
272c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl
273c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  // Iterators
274c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  virtual child_iterator child_begin();
275c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  virtual child_iterator child_end();
276c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl};
277c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl
278796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// CXXThisExpr - Represents the "this" expression in C++, which is a
279796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// pointer to the object on which the current member function is
280796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// executing (C++ [expr.prim]p3). Example:
281796da18402f286b897782a298ae3b20c459c102eDouglas Gregor///
282796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// @code
283796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// class Foo {
284796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// public:
285796da18402f286b897782a298ae3b20c459c102eDouglas Gregor///   void bar();
286796da18402f286b897782a298ae3b20c459c102eDouglas Gregor///   void test() { this->bar(); }
287796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// };
288796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// @endcode
289796da18402f286b897782a298ae3b20c459c102eDouglas Gregorclass CXXThisExpr : public Expr {
290796da18402f286b897782a298ae3b20c459c102eDouglas Gregor  SourceLocation Loc;
291796da18402f286b897782a298ae3b20c459c102eDouglas Gregor
292796da18402f286b897782a298ae3b20c459c102eDouglas Gregorpublic:
293796da18402f286b897782a298ae3b20c459c102eDouglas Gregor  CXXThisExpr(SourceLocation L, QualType Type)
2942850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl    : Expr(CXXThisExprClass, Type,
2952850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl           // 'this' is type-dependent if the class type of the enclosing
2962850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl           // member function is dependent (C++ [temp.dep.expr]p2)
2972850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl           Type->isDependentType(), Type->isDependentType()),
2982850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl      Loc(L) { }
299796da18402f286b897782a298ae3b20c459c102eDouglas Gregor
300796da18402f286b897782a298ae3b20c459c102eDouglas Gregor  virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
301796da18402f286b897782a298ae3b20c459c102eDouglas Gregor
302796da18402f286b897782a298ae3b20c459c102eDouglas Gregor  static bool classof(const Stmt *T) {
303796da18402f286b897782a298ae3b20c459c102eDouglas Gregor    return T->getStmtClass() == CXXThisExprClass;
304796da18402f286b897782a298ae3b20c459c102eDouglas Gregor  }
305796da18402f286b897782a298ae3b20c459c102eDouglas Gregor  static bool classof(const CXXThisExpr *) { return true; }
306796da18402f286b897782a298ae3b20c459c102eDouglas Gregor
307796da18402f286b897782a298ae3b20c459c102eDouglas Gregor  // Iterators
308796da18402f286b897782a298ae3b20c459c102eDouglas Gregor  virtual child_iterator child_begin();
309796da18402f286b897782a298ae3b20c459c102eDouglas Gregor  virtual child_iterator child_end();
310796da18402f286b897782a298ae3b20c459c102eDouglas Gregor};
311796da18402f286b897782a298ae3b20c459c102eDouglas Gregor
3121060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek///  CXXThrowExpr - [C++ 15] C++ Throw Expression.  This handles
3131060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek///  'throw' and 'throw' assignment-expression.  When
3141060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek///  assignment-expression isn't present, Op will be null.
3151060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek///
3161060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekclass CXXThrowExpr : public Expr {
3171060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  Stmt *Op;
3181060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  SourceLocation ThrowLoc;
3191060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic:
3201060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  // Ty is the void type which is used as the result type of the
3211060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  // exepression.  The l is the location of the throw keyword.  expr
3221060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  // can by null, if the optional expression to throw isn't present.
3231060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  CXXThrowExpr(Expr *expr, QualType Ty, SourceLocation l) :
3242850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl    Expr(CXXThrowExprClass, Ty, false, false), Op(expr), ThrowLoc(l) {}
3251060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  const Expr *getSubExpr() const { return cast_or_null<Expr>(Op); }
3261060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  Expr *getSubExpr() { return cast_or_null<Expr>(Op); }
3271060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek
3281060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  virtual SourceRange getSourceRange() const {
3291060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek    if (getSubExpr() == 0)
3301060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek      return SourceRange(ThrowLoc, ThrowLoc);
3311060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek    return SourceRange(ThrowLoc, getSubExpr()->getSourceRange().getEnd());
3321060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  }
3331060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek
3341060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  static bool classof(const Stmt *T) {
3351060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek    return T->getStmtClass() == CXXThrowExprClass;
3361060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  }
3371060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  static bool classof(const CXXThrowExpr *) { return true; }
3381060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek
3391060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  // Iterators
3401060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  virtual child_iterator child_begin();
3411060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  virtual child_iterator child_end();
3421060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek};
3431060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek
3441060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// CXXDefaultArgExpr - C++ [dcl.fct.default]. This wraps up a
3451060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// function call argument that was created from the corresponding
3461060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// parameter's default argument, when the call did not explicitly
3471060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// supply arguments for all of the parameters.
3481060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekclass CXXDefaultArgExpr : public Expr {
3491060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  ParmVarDecl *Param;
3501060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic:
3511060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  // Param is the parameter whose default argument is used by this
3521060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  // expression.
3531060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  explicit CXXDefaultArgExpr(ParmVarDecl *param)
35461366e9cd41a6dbde4e66416dac21269c8ac1d94Douglas Gregor    : Expr(CXXDefaultArgExprClass,
35561366e9cd41a6dbde4e66416dac21269c8ac1d94Douglas Gregor           param->hasUnparsedDefaultArg()? param->getType().getNonReferenceType()
35661366e9cd41a6dbde4e66416dac21269c8ac1d94Douglas Gregor                                         : param->getDefaultArg()->getType()),
3571060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek      Param(param) { }
3581060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek
3591060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  // Retrieve the parameter that the argument was created from.
3601060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  const ParmVarDecl *getParam() const { return Param; }
3611060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  ParmVarDecl *getParam() { return Param; }
3621060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek
3631060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  // Retrieve the actual argument to the function call.
3641060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  const Expr *getExpr() const { return Param->getDefaultArg(); }
3651060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  Expr *getExpr() { return Param->getDefaultArg(); }
3661060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek
3671060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  virtual SourceRange getSourceRange() const {
3681060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek    // Default argument expressions have no representation in the
3691060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek    // source, so they have an empty source range.
3701060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek    return SourceRange();
3711060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  }
3721060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek
3731060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  static bool classof(const Stmt *T) {
3741060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek    return T->getStmtClass() == CXXDefaultArgExprClass;
3751060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  }
3761060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  static bool classof(const CXXDefaultArgExpr *) { return true; }
3771060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek
3781060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  // Iterators
3791060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  virtual child_iterator child_begin();
3801060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek  virtual child_iterator child_end();
3811060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek};
382987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis
38315ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson/// CXXConstructExpr - Represents a call to a C++ constructor.
38415ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlssonclass CXXConstructExpr : public Expr {
38515ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  VarDecl *VD;
38615ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  CXXConstructorDecl *Constructor;
38715ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson
38815ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  bool Elidable;
38915ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson
39015ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  Stmt **Args;
39115ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  unsigned NumArgs;
39215ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson
39315ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson
394bd6734e5f6432ce0cc07171c490ffaa094796198Anders Carlssonprotected:
395bd6734e5f6432ce0cc07171c490ffaa094796198Anders Carlsson  CXXConstructExpr(ASTContext &C, StmtClass SC, VarDecl *vd, QualType T,
396bd6734e5f6432ce0cc07171c490ffaa094796198Anders Carlsson                   CXXConstructorDecl *d, bool elidable,
397bd6734e5f6432ce0cc07171c490ffaa094796198Anders Carlsson                   Expr **args, unsigned numargs);
398524fa13fd81e88533c7a1d4b1232c0de2c97dc7cAnders Carlsson  ~CXXConstructExpr() { }
399bd6734e5f6432ce0cc07171c490ffaa094796198Anders Carlsson
40015ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlssonpublic:
40115ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  static CXXConstructExpr *Create(ASTContext &C, VarDecl *VD, QualType T,
40215ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson                                  CXXConstructorDecl *D, bool Elidable,
40315ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson                                  Expr **Args, unsigned NumArgs);
40415ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson
40515ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  void Destroy(ASTContext &C);
40615ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson
40715ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  const VarDecl* getVarDecl() const { return VD; }
40815ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  const CXXConstructorDecl* getConstructor() const { return Constructor; }
40915ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson
41015ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  typedef ExprIterator arg_iterator;
41115ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  typedef ConstExprIterator const_arg_iterator;
41215ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson
41315ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  arg_iterator arg_begin() { return Args; }
41415ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  arg_iterator arg_end() { return Args + NumArgs; }
41515ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  const_arg_iterator arg_begin() const { return Args; }
41615ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  const_arg_iterator arg_end() const { return Args + NumArgs; }
41715ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson
41815ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  unsigned getNumArgs() const { return NumArgs; }
41915ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson
42015ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  virtual SourceRange getSourceRange() const { return SourceRange(); }
42115ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson
42215ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  static bool classof(const Stmt *T) {
423524fa13fd81e88533c7a1d4b1232c0de2c97dc7cAnders Carlsson    return T->getStmtClass() == CXXConstructExprClass ||
424524fa13fd81e88533c7a1d4b1232c0de2c97dc7cAnders Carlsson      T->getStmtClass() == CXXTemporaryObjectExprClass;
42515ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  }
42615ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  static bool classof(const CXXConstructExpr *) { return true; }
42715ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson
42815ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  // Iterators
42915ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  virtual child_iterator child_begin();
43015ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson  virtual child_iterator child_end();
43115ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson};
43215ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson
43349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// CXXFunctionalCastExpr - Represents an explicit C++ type conversion
43449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// that uses "functional" notion (C++ [expr.type.conv]). Example: @c
43549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// x = int(0.5);
43649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorclass CXXFunctionalCastExpr : public ExplicitCastExpr {
437987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  SourceLocation TyBeginLoc;
438987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  SourceLocation RParenLoc;
439987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidispublic:
44049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  CXXFunctionalCastExpr(QualType ty, QualType writtenTy,
44149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor                        SourceLocation tyBeginLoc, Expr *castExpr,
442987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis                        SourceLocation rParenLoc) :
44349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    ExplicitCastExpr(CXXFunctionalCastExprClass, ty, castExpr, writtenTy),
444987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis    TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {}
445987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis
446987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  SourceLocation getTypeBeginLoc() const { return TyBeginLoc; }
447987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  SourceLocation getRParenLoc() const { return RParenLoc; }
448987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis
449987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  virtual SourceRange getSourceRange() const {
450987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis    return SourceRange(TyBeginLoc, RParenLoc);
451987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  }
452987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  static bool classof(const Stmt *T) {
453987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis    return T->getStmtClass() == CXXFunctionalCastExprClass;
454987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  }
455987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  static bool classof(const CXXFunctionalCastExpr *) { return true; }
456987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis};
457987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis
458506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// @brief Represents a C++ functional cast expression that builds a
459506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// temporary object.
460506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor///
461506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// This expression type represents a C++ "functional" cast
462506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// (C++[expr.type.conv]) with N != 1 arguments that invokes a
463506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// constructor to build a temporary object. If N == 0 but no
464506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// constructor will be called (because the functional cast is
465506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// performing a value-initialized an object whose class type has no
466506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// user-declared constructors), CXXZeroInitValueExpr will represent
467506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// the functional cast. Finally, with N == 1 arguments the functional
468506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// cast expression will be represented by CXXFunctionalCastExpr.
469506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// Example:
470506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// @code
471506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// struct X { X(int, float); }
472506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor///
473506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// X create_X() {
474506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor///   return X(1, 3.14f); // creates a CXXTemporaryObjectExpr
475506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// };
476506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// @endcode
477524fa13fd81e88533c7a1d4b1232c0de2c97dc7cAnders Carlssonclass CXXTemporaryObjectExpr : public CXXConstructExpr {
478506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  SourceLocation TyBeginLoc;
479506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  SourceLocation RParenLoc;
480506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor
481506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregorpublic:
48209c4abb1057f0eb53a9c2b5c2f22b1472362156eAnders Carlsson  CXXTemporaryObjectExpr(ASTContext &C, VarDecl *vd,
48326de54983e7977fad615c94012f2f67d0d1cf404Anders Carlsson                         CXXConstructorDecl *Cons, QualType writtenTy,
484506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor                         SourceLocation tyBeginLoc, Expr **Args,
485506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor                         unsigned NumArgs, SourceLocation rParenLoc);
486506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor
487524fa13fd81e88533c7a1d4b1232c0de2c97dc7cAnders Carlsson  ~CXXTemporaryObjectExpr() { }
488506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor
489506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  SourceLocation getTypeBeginLoc() const { return TyBeginLoc; }
490506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  SourceLocation getRParenLoc() const { return RParenLoc; }
491ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor
492506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  virtual SourceRange getSourceRange() const {
493506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor    return SourceRange(TyBeginLoc, RParenLoc);
494506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  }
495506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  static bool classof(const Stmt *T) {
496506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor    return T->getStmtClass() == CXXTemporaryObjectExprClass;
497506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  }
498506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  static bool classof(const CXXTemporaryObjectExpr *) { return true; }
499506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor};
500506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor
501987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis/// CXXZeroInitValueExpr - [C++ 5.2.3p2]
502506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// Expression "T()" which creates a value-initialized rvalue of type
503506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// T, which is either a non-class type or a class type without any
504506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// user-defined constructors.
505987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis///
506987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidisclass CXXZeroInitValueExpr : public Expr {
507987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  SourceLocation TyBeginLoc;
508987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  SourceLocation RParenLoc;
509987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis
510987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidispublic:
511987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  CXXZeroInitValueExpr(QualType ty, SourceLocation tyBeginLoc,
512987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis                       SourceLocation rParenLoc ) :
513987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis    Expr(CXXZeroInitValueExprClass, ty),
514987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis    TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {}
515987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis
516987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  SourceLocation getTypeBeginLoc() const { return TyBeginLoc; }
517987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  SourceLocation getRParenLoc() const { return RParenLoc; }
518987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis
5194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  /// @brief Whether this initialization expression was
5204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  /// implicitly-generated.
5214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  bool isImplicit() const {
5224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    return TyBeginLoc.isInvalid() && RParenLoc.isInvalid();
5234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  }
5244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor
525987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  virtual SourceRange getSourceRange() const {
526987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis    return SourceRange(TyBeginLoc, RParenLoc);
527987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  }
528987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis
529987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  static bool classof(const Stmt *T) {
530987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis    return T->getStmtClass() == CXXZeroInitValueExprClass;
531987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  }
532987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  static bool classof(const CXXZeroInitValueExpr *) { return true; }
533987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis
534987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  // Iterators
535987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  virtual child_iterator child_begin();
536987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  virtual child_iterator child_end();
537987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis};
538987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis
5399e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis/// CXXConditionDeclExpr - Condition declaration of a if/switch/while/for
5409e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis/// statement, e.g: "if (int x = f()) {...}".
5419e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis/// The main difference with DeclRefExpr is that CXXConditionDeclExpr owns the
5429e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis/// decl that it references.
5439e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis///
5449e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidisclass CXXConditionDeclExpr : public DeclRefExpr {
5459e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidispublic:
5469e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis  CXXConditionDeclExpr(SourceLocation startLoc,
5479e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis                       SourceLocation eqLoc, VarDecl *var)
5489d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor    : DeclRefExpr(CXXConditionDeclExprClass, var,
5499d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor                  var->getType().getNonReferenceType(), startLoc) {}
5509e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis
5519e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis  virtual void Destroy(ASTContext& Ctx);
5529e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis
5539e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis  SourceLocation getStartLoc() const { return getLocation(); }
5549e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis
5559e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis  VarDecl *getVarDecl() { return cast<VarDecl>(getDecl()); }
5569e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis  const VarDecl *getVarDecl() const { return cast<VarDecl>(getDecl()); }
5579e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis
5589e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis  virtual SourceRange getSourceRange() const {
5599e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis    return SourceRange(getStartLoc(), getVarDecl()->getInit()->getLocEnd());
5609e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis  }
5619e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis
5629e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis  static bool classof(const Stmt *T) {
5639e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis    return T->getStmtClass() == CXXConditionDeclExprClass;
5649e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis  }
5659e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis  static bool classof(const CXXConditionDeclExpr *) { return true; }
5669e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis
5679e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis  // Iterators
5689e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis  virtual child_iterator child_begin();
5699e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis  virtual child_iterator child_end();
5709e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis};
5719e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis
5724c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl/// CXXNewExpr - A new expression for memory allocation and constructor calls,
5734c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl/// e.g: "new CXXNewExpr(foo)".
5744c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlclass CXXNewExpr : public Expr {
5754c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  // Was the usage ::new, i.e. is the global new to be used?
5764c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  bool GlobalNew : 1;
5774c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  // Was the form (type-id) used? Otherwise, it was new-type-id.
5784c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  bool ParenTypeId : 1;
5794c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  // Is there an initializer? If not, built-ins are uninitialized, else they're
5804c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  // value-initialized.
5814c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  bool Initializer : 1;
582cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl  // Do we allocate an array? If so, the first SubExpr is the size expression.
583cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl  bool Array : 1;
5844c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  // The number of placement new arguments.
5854c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  unsigned NumPlacementArgs : 14;
5864c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  // The number of constructor arguments. This may be 1 even for non-class
5874c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  // types; use the pseudo copy constructor.
588cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl  unsigned NumConstructorArgs : 14;
589cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl  // Contains an optional array size expression, any number of optional
590cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl  // placement arguments, and any number of optional constructor arguments,
591cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl  // in that order.
5924c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  Stmt **SubExprs;
5934c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  // Points to the allocation function used.
5944c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  FunctionDecl *OperatorNew;
5954c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  // Points to the deallocation function used in case of error. May be null.
5964c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  FunctionDecl *OperatorDelete;
5974c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  // Points to the constructor used. Cannot be null if AllocType is a record;
5984c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  // it would still point at the default constructor (even an implicit one).
5994c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  // Must be null for all other types.
6004c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  CXXConstructorDecl *Constructor;
6014c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
6024c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  SourceLocation StartLoc;
6034c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  SourceLocation EndLoc;
6044c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
6054c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlpublic:
6064c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  CXXNewExpr(bool globalNew, FunctionDecl *operatorNew, Expr **placementArgs,
607cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl             unsigned numPlaceArgs, bool ParenTypeId, Expr *arraySize,
6084c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl             CXXConstructorDecl *constructor, bool initializer,
6094c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl             Expr **constructorArgs, unsigned numConsArgs,
6104c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl             FunctionDecl *operatorDelete, QualType ty,
6114c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl             SourceLocation startLoc, SourceLocation endLoc);
6124c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  ~CXXNewExpr() {
6134c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    delete[] SubExprs;
6144c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
6154c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
616cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl  QualType getAllocatedType() const {
617cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl    assert(getType()->isPointerType());
618cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl    return getType()->getAsPointerType()->getPointeeType();
619cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl  }
6204c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
6214c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  FunctionDecl *getOperatorNew() const { return OperatorNew; }
6224c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  FunctionDecl *getOperatorDelete() const { return OperatorDelete; }
6234c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  CXXConstructorDecl *getConstructor() const { return Constructor; }
6244c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
625cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl  bool isArray() const { return Array; }
626cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl  Expr *getArraySize() {
627cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl    return Array ? cast<Expr>(SubExprs[0]) : 0;
628cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl  }
629cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl  const Expr *getArraySize() const {
630cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl    return Array ? cast<Expr>(SubExprs[0]) : 0;
631cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl  }
632cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl
6334c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  unsigned getNumPlacementArgs() const { return NumPlacementArgs; }
6344c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  Expr *getPlacementArg(unsigned i) {
6354c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    assert(i < NumPlacementArgs && "Index out of range");
636cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl    return cast<Expr>(SubExprs[Array + i]);
6374c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
6384c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  const Expr *getPlacementArg(unsigned i) const {
6394c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    assert(i < NumPlacementArgs && "Index out of range");
640cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl    return cast<Expr>(SubExprs[Array + i]);
6414c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
6424c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
6434c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  bool isGlobalNew() const { return GlobalNew; }
6444c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  bool isParenTypeId() const { return ParenTypeId; }
6454c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  bool hasInitializer() const { return Initializer; }
6464c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
6474c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  unsigned getNumConstructorArgs() const { return NumConstructorArgs; }
6484c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  Expr *getConstructorArg(unsigned i) {
6494c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    assert(i < NumConstructorArgs && "Index out of range");
650cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl    return cast<Expr>(SubExprs[Array + NumPlacementArgs + i]);
6514c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
6524c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  const Expr *getConstructorArg(unsigned i) const {
6534c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    assert(i < NumConstructorArgs && "Index out of range");
654cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl    return cast<Expr>(SubExprs[Array + NumPlacementArgs + i]);
6554c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
6564c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
6574c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  typedef ExprIterator arg_iterator;
6584c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  typedef ConstExprIterator const_arg_iterator;
6594c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
6604c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  arg_iterator placement_arg_begin() {
661cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl    return SubExprs + Array;
6624c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
6634c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  arg_iterator placement_arg_end() {
664cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl    return SubExprs + Array + getNumPlacementArgs();
6654c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
6664c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  const_arg_iterator placement_arg_begin() const {
667cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl    return SubExprs + Array;
6684c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
6694c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  const_arg_iterator placement_arg_end() const {
670cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl    return SubExprs + Array + getNumPlacementArgs();
6714c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
6724c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
6734c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  arg_iterator constructor_arg_begin() {
674cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl    return SubExprs + Array + getNumPlacementArgs();
6754c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
6764c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  arg_iterator constructor_arg_end() {
677cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl    return SubExprs + Array + getNumPlacementArgs() + getNumConstructorArgs();
6784c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
6794c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  const_arg_iterator constructor_arg_begin() const {
680cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl    return SubExprs + Array + getNumPlacementArgs();
6814c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
6824c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  const_arg_iterator constructor_arg_end() const {
683cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl    return SubExprs + Array + getNumPlacementArgs() + getNumConstructorArgs();
6844c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
6854c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
6864c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  virtual SourceRange getSourceRange() const {
6874c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    return SourceRange(StartLoc, EndLoc);
6884c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
6894c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
6904c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  static bool classof(const Stmt *T) {
6914c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    return T->getStmtClass() == CXXNewExprClass;
6924c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
6934c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  static bool classof(const CXXNewExpr *) { return true; }
6944c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
6954c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  // Iterators
6964c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  virtual child_iterator child_begin();
6974c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  virtual child_iterator child_end();
6984c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl};
6994c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
7004c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl/// CXXDeleteExpr - A delete expression for memory deallocation and destructor
7014c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl/// calls, e.g. "delete[] pArray".
7024c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlclass CXXDeleteExpr : public Expr {
7034c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  // Is this a forced global delete, i.e. "::delete"?
7044c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  bool GlobalDelete : 1;
7054c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  // Is this the array form of delete, i.e. "delete[]"?
7064c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  bool ArrayForm : 1;
7074c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  // Points to the operator delete overload that is used. Could be a member.
7084c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  FunctionDecl *OperatorDelete;
7094c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  // The pointer expression to be deleted.
7104c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  Stmt *Argument;
7114c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  // Location of the expression.
7124c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  SourceLocation Loc;
7134c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlpublic:
7144c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  CXXDeleteExpr(QualType ty, bool globalDelete, bool arrayForm,
7154c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl                FunctionDecl *operatorDelete, Expr *arg, SourceLocation loc)
7162850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl    : Expr(CXXDeleteExprClass, ty, false, false), GlobalDelete(globalDelete),
7174c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl      ArrayForm(arrayForm), OperatorDelete(operatorDelete), Argument(arg),
7184c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl      Loc(loc) { }
7194c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
7204c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  bool isGlobalDelete() const { return GlobalDelete; }
7214c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  bool isArrayForm() const { return ArrayForm; }
7224c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
7234c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  FunctionDecl *getOperatorDelete() const { return OperatorDelete; }
7244c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
7254c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  Expr *getArgument() { return cast<Expr>(Argument); }
7264c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  const Expr *getArgument() const { return cast<Expr>(Argument); }
7274c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
7284c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  virtual SourceRange getSourceRange() const {
7294c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    return SourceRange(Loc, Argument->getLocEnd());
7304c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
7314c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
7324c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  static bool classof(const Stmt *T) {
7334c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    return T->getStmtClass() == CXXDeleteExprClass;
7344c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
7354c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  static bool classof(const CXXDeleteExpr *) { return true; }
7364c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
7374c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  // Iterators
7384c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  virtual child_iterator child_begin();
7394c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  virtual child_iterator child_end();
7404c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl};
7414c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
74217330019f05966762bc952840ef1926b9becb145Douglas Gregor/// \brief Represents the name of a function that has not been
74317330019f05966762bc952840ef1926b9becb145Douglas Gregor/// resolved to any declaration.
74417330019f05966762bc952840ef1926b9becb145Douglas Gregor///
74517330019f05966762bc952840ef1926b9becb145Douglas Gregor/// Unresolved function names occur when a function name is
74617330019f05966762bc952840ef1926b9becb145Douglas Gregor/// encountered prior to an open parentheses ('(') in a C++ function
74717330019f05966762bc952840ef1926b9becb145Douglas Gregor/// call, and the function name itself did not resolve to a
74817330019f05966762bc952840ef1926b9becb145Douglas Gregor/// declaration. These function names can only be resolved when they
74917330019f05966762bc952840ef1926b9becb145Douglas Gregor/// form the postfix-expression of a function call, so that
75017330019f05966762bc952840ef1926b9becb145Douglas Gregor/// argument-dependent lookup finds declarations corresponding to
75117330019f05966762bc952840ef1926b9becb145Douglas Gregor/// these functions.
75217330019f05966762bc952840ef1926b9becb145Douglas Gregor
7535c37de788529cd9180f22069970737a7208bd625Douglas Gregor/// @code
7545c37de788529cd9180f22069970737a7208bd625Douglas Gregor/// template<typename T> void f(T x) {
75517330019f05966762bc952840ef1926b9becb145Douglas Gregor///   g(x); // g is an unresolved function name (that is also a dependent name)
7565c37de788529cd9180f22069970737a7208bd625Douglas Gregor/// }
7575c37de788529cd9180f22069970737a7208bd625Douglas Gregor/// @endcode
75817330019f05966762bc952840ef1926b9becb145Douglas Gregorclass UnresolvedFunctionNameExpr : public Expr {
75917330019f05966762bc952840ef1926b9becb145Douglas Gregor  /// The name that was present in the source
76017330019f05966762bc952840ef1926b9becb145Douglas Gregor  DeclarationName Name;
7615c37de788529cd9180f22069970737a7208bd625Douglas Gregor
76217330019f05966762bc952840ef1926b9becb145Douglas Gregor  /// The location of this name in the source code
7635c37de788529cd9180f22069970737a7208bd625Douglas Gregor  SourceLocation Loc;
7645c37de788529cd9180f22069970737a7208bd625Douglas Gregor
7655c37de788529cd9180f22069970737a7208bd625Douglas Gregorpublic:
76617330019f05966762bc952840ef1926b9becb145Douglas Gregor  UnresolvedFunctionNameExpr(DeclarationName N, QualType T, SourceLocation L)
76717330019f05966762bc952840ef1926b9becb145Douglas Gregor    : Expr(UnresolvedFunctionNameExprClass, T, false, false), Name(N), Loc(L) { }
7685c37de788529cd9180f22069970737a7208bd625Douglas Gregor
76917330019f05966762bc952840ef1926b9becb145Douglas Gregor  /// \brief Retrieves the name that occurred in the source code.
77017330019f05966762bc952840ef1926b9becb145Douglas Gregor  DeclarationName getName() const { return Name; }
7715c37de788529cd9180f22069970737a7208bd625Douglas Gregor
7725c37de788529cd9180f22069970737a7208bd625Douglas Gregor  /// getLocation - Retrieves the location in the source code where
7735c37de788529cd9180f22069970737a7208bd625Douglas Gregor  /// the name occurred.
7745c37de788529cd9180f22069970737a7208bd625Douglas Gregor  SourceLocation getLocation() const { return Loc; }
7755c37de788529cd9180f22069970737a7208bd625Douglas Gregor
7765c37de788529cd9180f22069970737a7208bd625Douglas Gregor  virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
7775c37de788529cd9180f22069970737a7208bd625Douglas Gregor
7785c37de788529cd9180f22069970737a7208bd625Douglas Gregor  static bool classof(const Stmt *T) {
77917330019f05966762bc952840ef1926b9becb145Douglas Gregor    return T->getStmtClass() == UnresolvedFunctionNameExprClass;
7805c37de788529cd9180f22069970737a7208bd625Douglas Gregor  }
78117330019f05966762bc952840ef1926b9becb145Douglas Gregor  static bool classof(const UnresolvedFunctionNameExpr *) { return true; }
7825c37de788529cd9180f22069970737a7208bd625Douglas Gregor
7835c37de788529cd9180f22069970737a7208bd625Douglas Gregor  // Iterators
7845c37de788529cd9180f22069970737a7208bd625Douglas Gregor  virtual child_iterator child_begin();
7855c37de788529cd9180f22069970737a7208bd625Douglas Gregor  virtual child_iterator child_end();
7865c37de788529cd9180f22069970737a7208bd625Douglas Gregor};
7875c37de788529cd9180f22069970737a7208bd625Douglas Gregor
78864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl/// UnaryTypeTraitExpr - A GCC or MS unary type trait, as used in the
78964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl/// implementation of TR1/C++0x type trait templates.
79064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl/// Example:
79164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl/// __is_pod(int) == true
79264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl/// __is_enum(std::string) == false
79364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redlclass UnaryTypeTraitExpr : public Expr {
79464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  /// UTT - The trait.
79564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  UnaryTypeTrait UTT;
79664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
79764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  /// Loc - The location of the type trait keyword.
79864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  SourceLocation Loc;
79964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
80064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  /// RParen - The location of the closing paren.
80164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  SourceLocation RParen;
80264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
80364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  /// QueriedType - The type we're testing.
80464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  QualType QueriedType;
80564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
80664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redlpublic:
80764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  UnaryTypeTraitExpr(SourceLocation loc, UnaryTypeTrait utt, QualType queried,
80864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl                     SourceLocation rparen, QualType ty)
80964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl    : Expr(UnaryTypeTraitExprClass, ty, false, queried->isDependentType()),
81064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl      UTT(utt), Loc(loc), RParen(rparen), QueriedType(queried) { }
81164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
81264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  virtual SourceRange getSourceRange() const { return SourceRange(Loc, RParen);}
81364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
81464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  UnaryTypeTrait getTrait() const { return UTT; }
81564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
81664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  QualType getQueriedType() const { return QueriedType; }
81764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
818c87a282e7b80c055088fc51bdbe8fc73da64d4f8Daniel Dunbar  bool EvaluateTrait() const;
81964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
82064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  static bool classof(const Stmt *T) {
82164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl    return T->getStmtClass() == UnaryTypeTraitExprClass;
82264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  }
82364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  static bool classof(const UnaryTypeTraitExpr *) { return true; }
82464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
82564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  // Iterators
82664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  virtual child_iterator child_begin();
82764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  virtual child_iterator child_end();
82864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl};
82964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
8301a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor/// QualifiedDeclRefExpr - A reference to a declared variable,
8311a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor/// function, enum, etc., that includes a qualification, e.g.,
8321a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor/// "N::foo".
8331a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregorclass QualifiedDeclRefExpr : public DeclRefExpr {
834bad351822117eaf280081494e3dbe4a06c0dbfcfDouglas Gregor  /// QualifierRange - The source range that covers the
835bad351822117eaf280081494e3dbe4a06c0dbfcfDouglas Gregor  /// nested-name-specifier.
836bad351822117eaf280081494e3dbe4a06c0dbfcfDouglas Gregor  SourceRange QualifierRange;
837bad351822117eaf280081494e3dbe4a06c0dbfcfDouglas Gregor
838ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  /// \brief The nested-name-specifier that qualifies this declaration
839ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  /// name.
840ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  NestedNameSpecifier *NNS;
841bad351822117eaf280081494e3dbe4a06c0dbfcfDouglas Gregor
842bad351822117eaf280081494e3dbe4a06c0dbfcfDouglas Gregorpublic:
843ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  QualifiedDeclRefExpr(NamedDecl *d, QualType t, SourceLocation l, bool TD,
844ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor                       bool VD, SourceRange R, NestedNameSpecifier *NNS)
845ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    : DeclRefExpr(QualifiedDeclRefExprClass, d, t, l, TD, VD),
846ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor      QualifierRange(R), NNS(NNS) { }
847bad351822117eaf280081494e3dbe4a06c0dbfcfDouglas Gregor
848bad351822117eaf280081494e3dbe4a06c0dbfcfDouglas Gregor  /// \brief Retrieve the source range of the nested-name-specifier.
849bad351822117eaf280081494e3dbe4a06c0dbfcfDouglas Gregor  SourceRange getQualifierRange() const { return QualifierRange; }
850bad351822117eaf280081494e3dbe4a06c0dbfcfDouglas Gregor
851ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  /// \brief Retrieve the nested-name-specifier that qualifies this
852ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  /// declaration.
853ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  NestedNameSpecifier *getQualifier() const { return NNS; }
8541a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor
8551a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor  virtual SourceRange getSourceRange() const {
856bad351822117eaf280081494e3dbe4a06c0dbfcfDouglas Gregor    return SourceRange(QualifierRange.getBegin(), getLocation());
8571a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor  }
8581a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor
8591a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor  static bool classof(const Stmt *T) {
8601a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor    return T->getStmtClass() == QualifiedDeclRefExprClass;
8611a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor  }
8621a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor  static bool classof(const QualifiedDeclRefExpr *) { return true; }
8631a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor};
8641a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor
8655953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// \brief A qualified reference to a name whose declaration cannot
8665953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// yet be resolved.
8675953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor///
8685953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// UnresolvedDeclRefExpr is similar to QualifiedDeclRefExpr in that
8695953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// it expresses a qualified reference to a declaration such as
8705953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// X<T>::value. The difference, however, is that an
8715953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// UnresolvedDeclRefExpr node is used only within C++ templates when
8725953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// the qualification (e.g., X<T>::) refers to a dependent type. In
8735953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// this case, X<T>::value cannot resolve to a declaration because the
8745953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// declaration will differ from on instantiation of X<T> to the
875ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor/// next. Therefore, UnresolvedDeclRefExpr keeps track of the
876ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor/// qualifier (X<T>::) and the name of the entity being referenced
877ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor/// ("value"). Such expressions will instantiate to
878ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor/// QualifiedDeclRefExprs.
8795953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregorclass UnresolvedDeclRefExpr : public Expr {
8805953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  /// The name of the entity we will be referencing.
8815953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  DeclarationName Name;
8825953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
8835953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  /// Location of the name of the declaration we're referencing.
8845953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  SourceLocation Loc;
8855953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
8865953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  /// QualifierRange - The source range that covers the
8875953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  /// nested-name-specifier.
8885953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  SourceRange QualifierRange;
8895953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
890ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  /// \brief The nested-name-specifier that qualifies this unresolved
891ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  /// declaration name.
892ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  NestedNameSpecifier *NNS;
8935953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
8945953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregorpublic:
895ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  UnresolvedDeclRefExpr(DeclarationName N, QualType T, SourceLocation L,
896ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor                        SourceRange R, NestedNameSpecifier *NNS)
897ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    : Expr(UnresolvedDeclRefExprClass, T, true, true),
898ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor      Name(N), Loc(L), QualifierRange(R), NNS(NNS) { }
8995953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
9005953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  /// \brief Retrieve the name that this expression refers to.
9015953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  DeclarationName getDeclName() const { return Name; }
9025953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
9035953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  /// \brief Retrieve the location of the name within the expression.
9045953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  SourceLocation getLocation() const { return Loc; }
9055953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
9065953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  /// \brief Retrieve the source range of the nested-name-specifier.
9075953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  SourceRange getQualifierRange() const { return QualifierRange; }
9085953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
909ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  /// \brief Retrieve the nested-name-specifier that qualifies this
910ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  /// declaration.
911ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  NestedNameSpecifier *getQualifier() const { return NNS; }
9125953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
9135953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  virtual SourceRange getSourceRange() const {
9145953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor    return SourceRange(QualifierRange.getBegin(), getLocation());
9155953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  }
9165953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
9175953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  static bool classof(const Stmt *T) {
9185953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor    return T->getStmtClass() == UnresolvedDeclRefExprClass;
9195953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  }
9205953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  static bool classof(const UnresolvedDeclRefExpr *) { return true; }
9215953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
9225953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  virtual StmtIterator child_begin();
9235953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  virtual StmtIterator child_end();
9245953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor};
9255953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
926e349bea668622ef31bd51a229960a73d69940709Anders Carlsson/// CXXDestroyExpr - Represents an implicit call to a C++ destructor.
92719d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlssonclass CXXDestroyExpr : public Expr {
92819d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson  VarDecl *VD;
92919d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson
93019d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson  CXXDestroyExpr(VarDecl* vd, QualType T)
93119d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson  : Expr(CXXDestroyExprClass, T, false, vd->getType()->isDependentType()),
93219d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson    VD(vd) { }
93319d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson
93419d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlssonpublic:
93519d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson  static CXXDestroyExpr *Create(ASTContext &C, VarDecl *vd);
93619d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson
93719d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson  virtual SourceRange getSourceRange() const { return SourceRange(); }
93819d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson
93919d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson  // Implement isa/cast/dyncast/etc.
94019d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson  static bool classof(const Stmt *T) {
94119d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson    return T->getStmtClass() == CXXDestroyExprClass;
94219d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson  }
94319d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson  static bool classof(const CXXDestroyExpr *) { return true; }
94419d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson
94519d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson  // Iterators
94619d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson  virtual child_iterator child_begin();
94719d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson  virtual child_iterator child_end();
94819d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson};
94919d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson
95002bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlssonclass CXXExprWithCleanup : public Expr {
95102bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  Stmt *SubExpr;
95202bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson
95302bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  CXXTempVarDecl **Decls;
95402bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  unsigned NumDecls;
95502bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson
95602bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlssonpublic:
95702bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  CXXExprWithCleanup(Expr *subexpr, CXXTempVarDecl **decls, unsigned numdecls);
95802bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  ~CXXExprWithCleanup();
95902bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson
96002bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
96102bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  Expr *getSubExpr() { return cast<Expr>(SubExpr); }
96202bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson
96302bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  virtual SourceRange getSourceRange() const { return SourceRange(); }
96402bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson
96502bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  // Implement isa/cast/dyncast/etc.
96602bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  static bool classof(const Stmt *T) {
96702bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson    return T->getStmtClass() == CXXExprWithCleanupClass;
96802bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  }
96902bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  static bool classof(const CXXExprWithCleanup *) { return true; }
97002bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson
97102bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  // Iterators
97202bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  virtual child_iterator child_begin();
97302bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  virtual child_iterator child_end();
97402bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson};
97502bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson
9765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}  // end namespace clang
9775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
9785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif
979