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