ExprCXX.h revision ff6b3d64c9f07155f1414411b8451d7bf8937c62
1//===--- ExprCXX.h - Classes for representing expressions -------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//  This file defines the Expr interface and subclasses for C++ expressions.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_AST_EXPRCXX_H
15#define LLVM_CLANG_AST_EXPRCXX_H
16
17#include "clang/Basic/TypeTraits.h"
18#include "clang/AST/Expr.h"
19#include "clang/AST/Decl.h"
20
21namespace clang {
22
23  class CXXConstructorDecl;
24  class CXXDestructorDecl;
25  class CXXTemporary;
26
27//===--------------------------------------------------------------------===//
28// C++ Expressions.
29//===--------------------------------------------------------------------===//
30
31/// \brief A call to an overloaded operator written using operator
32/// syntax.
33///
34/// Represents a call to an overloaded operator written using operator
35/// syntax, e.g., "x + y" or "*p". While semantically equivalent to a
36/// normal call, this AST node provides better information about the
37/// syntactic representation of the call.
38///
39/// In a C++ template, this expression node kind will be used whenever
40/// any of the arguments are type-dependent. In this case, the
41/// function itself will be a (possibly empty) set of functions and
42/// function templates that were found by name lookup at template
43/// definition time.
44class CXXOperatorCallExpr : public CallExpr {
45  /// \brief The overloaded operator.
46  OverloadedOperatorKind Operator;
47
48public:
49  CXXOperatorCallExpr(ASTContext& C, OverloadedOperatorKind Op, Expr *fn,
50                      Expr **args, unsigned numargs, QualType t,
51                      SourceLocation operatorloc)
52    : CallExpr(C, CXXOperatorCallExprClass, fn, args, numargs, t, operatorloc),
53      Operator(Op) {}
54
55  /// getOperator - Returns the kind of overloaded operator that this
56  /// expression refers to.
57  OverloadedOperatorKind getOperator() const { return Operator; }
58
59  /// getOperatorLoc - Returns the location of the operator symbol in
60  /// the expression. When @c getOperator()==OO_Call, this is the
61  /// location of the right parentheses; when @c
62  /// getOperator()==OO_Subscript, this is the location of the right
63  /// bracket.
64  SourceLocation getOperatorLoc() const { return getRParenLoc(); }
65
66  virtual SourceRange getSourceRange() const;
67
68  static bool classof(const Stmt *T) {
69    return T->getStmtClass() == CXXOperatorCallExprClass;
70  }
71  static bool classof(const CXXOperatorCallExpr *) { return true; }
72};
73
74/// CXXMemberCallExpr - Represents a call to a member function that
75/// may be written either with member call syntax (e.g., "obj.func()"
76/// or "objptr->func()") or with normal function-call syntax
77/// ("func()") within a member function that ends up calling a member
78/// function. The callee in either case is a MemberExpr that contains
79/// both the object argument and the member function, while the
80/// arguments are the arguments within the parentheses (not including
81/// the object argument).
82class CXXMemberCallExpr : public CallExpr {
83public:
84  CXXMemberCallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs,
85                    QualType t, SourceLocation rparenloc)
86    : CallExpr(C, CXXMemberCallExprClass, fn, args, numargs, t, rparenloc) {}
87
88  /// getImplicitObjectArgument - Retrieves the implicit object
89  /// argument for the member call. For example, in "x.f(5)", this
90  /// operation would return "x".
91  Expr *getImplicitObjectArgument();
92
93  static bool classof(const Stmt *T) {
94    return T->getStmtClass() == CXXMemberCallExprClass;
95  }
96  static bool classof(const CXXMemberCallExpr *) { return true; }
97};
98
99/// CXXNamedCastExpr - Abstract class common to all of the C++ "named"
100/// casts, @c static_cast, @c dynamic_cast, @c reinterpret_cast, or @c
101/// const_cast.
102///
103/// This abstract class is inherited by all of the classes
104/// representing "named" casts, e.g., CXXStaticCastExpr,
105/// CXXDynamicCastExpr, CXXReinterpretCastExpr, and CXXConstCastExpr.
106class CXXNamedCastExpr : public ExplicitCastExpr {
107private:
108  SourceLocation Loc; // the location of the casting op
109
110protected:
111  CXXNamedCastExpr(StmtClass SC, QualType ty, Expr *op, QualType writtenTy,
112                   SourceLocation l)
113    : ExplicitCastExpr(SC, ty, op, writtenTy), Loc(l) {}
114
115public:
116  const char *getCastName() const;
117
118  /// \brief Retrieve the location of the cast operator keyword, e.g.,
119  /// "static_cast".
120  SourceLocation getOperatorLoc() const { return Loc; }
121  void setOperatorLoc(SourceLocation L) { Loc = L; }
122
123  virtual SourceRange getSourceRange() const {
124    return SourceRange(Loc, getSubExpr()->getSourceRange().getEnd());
125  }
126  static bool classof(const Stmt *T) {
127    switch (T->getStmtClass()) {
128    case CXXNamedCastExprClass:
129    case CXXStaticCastExprClass:
130    case CXXDynamicCastExprClass:
131    case CXXReinterpretCastExprClass:
132    case CXXConstCastExprClass:
133      return true;
134    default:
135      return false;
136    }
137  }
138  static bool classof(const CXXNamedCastExpr *) { return true; }
139};
140
141/// CXXStaticCastExpr - A C++ @c static_cast expression (C++ [expr.static.cast]).
142///
143/// This expression node represents a C++ static cast, e.g.,
144/// @c static_cast<int>(1.0).
145class CXXStaticCastExpr : public CXXNamedCastExpr {
146public:
147  CXXStaticCastExpr(QualType ty, Expr *op, QualType writtenTy, SourceLocation l)
148    : CXXNamedCastExpr(CXXStaticCastExprClass, ty, op, writtenTy, l) {}
149
150  static bool classof(const Stmt *T) {
151    return T->getStmtClass() == CXXStaticCastExprClass;
152  }
153  static bool classof(const CXXStaticCastExpr *) { return true; }
154};
155
156/// CXXDynamicCastExpr - A C++ @c dynamic_cast expression
157/// (C++ [expr.dynamic.cast]), which may perform a run-time check to
158/// determine how to perform the type cast.
159///
160/// This expression node represents a dynamic cast, e.g.,
161/// @c dynamic_cast<Derived*>(BasePtr).
162class CXXDynamicCastExpr : public CXXNamedCastExpr {
163public:
164  CXXDynamicCastExpr(QualType ty, Expr *op, QualType writtenTy, SourceLocation l)
165    : CXXNamedCastExpr(CXXDynamicCastExprClass, ty, op, writtenTy, l) {}
166
167  static bool classof(const Stmt *T) {
168    return T->getStmtClass() == CXXDynamicCastExprClass;
169  }
170  static bool classof(const CXXDynamicCastExpr *) { return true; }
171};
172
173/// CXXReinterpretCastExpr - A C++ @c reinterpret_cast expression (C++
174/// [expr.reinterpret.cast]), which provides a differently-typed view
175/// of a value but performs no actual work at run time.
176///
177/// This expression node represents a reinterpret cast, e.g.,
178/// @c reinterpret_cast<int>(VoidPtr).
179class CXXReinterpretCastExpr : public CXXNamedCastExpr {
180public:
181  CXXReinterpretCastExpr(QualType ty, Expr *op, QualType writtenTy,
182                         SourceLocation l)
183    : CXXNamedCastExpr(CXXReinterpretCastExprClass, ty, op, writtenTy, l) {}
184
185  static bool classof(const Stmt *T) {
186    return T->getStmtClass() == CXXReinterpretCastExprClass;
187  }
188  static bool classof(const CXXReinterpretCastExpr *) { return true; }
189};
190
191/// CXXConstCastExpr - A C++ @c const_cast expression (C++ [expr.const.cast]),
192/// which can remove type qualifiers but does not change the underlying value.
193///
194/// This expression node represents a const cast, e.g.,
195/// @c const_cast<char*>(PtrToConstChar).
196class CXXConstCastExpr : public CXXNamedCastExpr {
197public:
198  CXXConstCastExpr(QualType ty, Expr *op, QualType writtenTy,
199                   SourceLocation l)
200    : CXXNamedCastExpr(CXXConstCastExprClass, ty, op, writtenTy, l) {}
201
202  static bool classof(const Stmt *T) {
203    return T->getStmtClass() == CXXConstCastExprClass;
204  }
205  static bool classof(const CXXConstCastExpr *) { return true; }
206};
207
208/// CXXBoolLiteralExpr - [C++ 2.13.5] C++ Boolean Literal.
209///
210class CXXBoolLiteralExpr : public Expr {
211  bool Value;
212  SourceLocation Loc;
213public:
214  CXXBoolLiteralExpr(bool val, QualType Ty, SourceLocation l) :
215    Expr(CXXBoolLiteralExprClass, Ty), Value(val), Loc(l) {}
216
217  CXXBoolLiteralExpr* Clone(ASTContext &C) const;
218
219  bool getValue() const { return Value; }
220
221  virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
222
223  static bool classof(const Stmt *T) {
224    return T->getStmtClass() == CXXBoolLiteralExprClass;
225  }
226  static bool classof(const CXXBoolLiteralExpr *) { return true; }
227
228  // Iterators
229  virtual child_iterator child_begin();
230  virtual child_iterator child_end();
231};
232
233/// CXXNullPtrLiteralExpr - [C++0x 2.14.7] C++ Pointer Literal
234class CXXNullPtrLiteralExpr : public Expr {
235  SourceLocation Loc;
236public:
237  CXXNullPtrLiteralExpr(QualType Ty, SourceLocation l) :
238    Expr(CXXNullPtrLiteralExprClass, Ty), Loc(l) {}
239
240  CXXNullPtrLiteralExpr* Clone(ASTContext &C) const;
241
242  virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
243
244  static bool classof(const Stmt *T) {
245    return T->getStmtClass() == CXXNullPtrLiteralExprClass;
246  }
247  static bool classof(const CXXNullPtrLiteralExpr *) { return true; }
248
249  virtual child_iterator child_begin();
250  virtual child_iterator child_end();
251};
252
253/// CXXTypeidExpr - A C++ @c typeid expression (C++ [expr.typeid]), which gets
254/// the type_info that corresponds to the supplied type, or the (possibly
255/// dynamic) type of the supplied expression.
256///
257/// This represents code like @c typeid(int) or @c typeid(*objPtr)
258class CXXTypeidExpr : public Expr {
259private:
260  bool isTypeOp : 1;
261  union {
262    void *Ty;
263    Stmt *Ex;
264  } Operand;
265  SourceRange Range;
266
267public:
268  CXXTypeidExpr(bool isTypeOp, void *op, QualType Ty, const SourceRange r) :
269      Expr(CXXTypeidExprClass, Ty,
270        // typeid is never type-dependent (C++ [temp.dep.expr]p4)
271        false,
272        // typeid is value-dependent if the type or expression are dependent
273        (isTypeOp ? QualType::getFromOpaquePtr(op)->isDependentType()
274                  : static_cast<Expr*>(op)->isValueDependent())),
275      isTypeOp(isTypeOp), Range(r) {
276    if (isTypeOp)
277      Operand.Ty = op;
278    else
279      // op was an Expr*, so cast it back to that to be safe
280      Operand.Ex = static_cast<Expr*>(op);
281  }
282
283  bool isTypeOperand() const { return isTypeOp; }
284  QualType getTypeOperand() const {
285    assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
286    return QualType::getFromOpaquePtr(Operand.Ty);
287  }
288  Expr* getExprOperand() const {
289    assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)");
290    return static_cast<Expr*>(Operand.Ex);
291  }
292
293  virtual SourceRange getSourceRange() const {
294    return Range;
295  }
296  static bool classof(const Stmt *T) {
297    return T->getStmtClass() == CXXTypeidExprClass;
298  }
299  static bool classof(const CXXTypeidExpr *) { return true; }
300
301  // Iterators
302  virtual child_iterator child_begin();
303  virtual child_iterator child_end();
304};
305
306/// CXXThisExpr - Represents the "this" expression in C++, which is a
307/// pointer to the object on which the current member function is
308/// executing (C++ [expr.prim]p3). Example:
309///
310/// @code
311/// class Foo {
312/// public:
313///   void bar();
314///   void test() { this->bar(); }
315/// };
316/// @endcode
317class CXXThisExpr : public Expr {
318  SourceLocation Loc;
319
320public:
321  CXXThisExpr(SourceLocation L, QualType Type)
322    : Expr(CXXThisExprClass, Type,
323           // 'this' is type-dependent if the class type of the enclosing
324           // member function is dependent (C++ [temp.dep.expr]p2)
325           Type->isDependentType(), Type->isDependentType()),
326      Loc(L) { }
327
328  virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
329
330  static bool classof(const Stmt *T) {
331    return T->getStmtClass() == CXXThisExprClass;
332  }
333  static bool classof(const CXXThisExpr *) { return true; }
334
335  // Iterators
336  virtual child_iterator child_begin();
337  virtual child_iterator child_end();
338};
339
340///  CXXThrowExpr - [C++ 15] C++ Throw Expression.  This handles
341///  'throw' and 'throw' assignment-expression.  When
342///  assignment-expression isn't present, Op will be null.
343///
344class CXXThrowExpr : public Expr {
345  Stmt *Op;
346  SourceLocation ThrowLoc;
347public:
348  // Ty is the void type which is used as the result type of the
349  // exepression.  The l is the location of the throw keyword.  expr
350  // can by null, if the optional expression to throw isn't present.
351  CXXThrowExpr(Expr *expr, QualType Ty, SourceLocation l) :
352    Expr(CXXThrowExprClass, Ty, false, false), Op(expr), ThrowLoc(l) {}
353  const Expr *getSubExpr() const { return cast_or_null<Expr>(Op); }
354  Expr *getSubExpr() { return cast_or_null<Expr>(Op); }
355  void setSubExpr(Expr *E) { Op = E; }
356
357  SourceLocation getThrowLoc() const { return ThrowLoc; }
358  void setThrowLoc(SourceLocation L) { ThrowLoc = L; }
359
360  virtual SourceRange getSourceRange() const {
361    if (getSubExpr() == 0)
362      return SourceRange(ThrowLoc, ThrowLoc);
363    return SourceRange(ThrowLoc, getSubExpr()->getSourceRange().getEnd());
364  }
365
366  static bool classof(const Stmt *T) {
367    return T->getStmtClass() == CXXThrowExprClass;
368  }
369  static bool classof(const CXXThrowExpr *) { return true; }
370
371  // Iterators
372  virtual child_iterator child_begin();
373  virtual child_iterator child_end();
374};
375
376/// CXXDefaultArgExpr - C++ [dcl.fct.default]. This wraps up a
377/// function call argument that was created from the corresponding
378/// parameter's default argument, when the call did not explicitly
379/// supply arguments for all of the parameters.
380class CXXDefaultArgExpr : public Expr {
381  ParmVarDecl *Param;
382public:
383  // Param is the parameter whose default argument is used by this
384  // expression.
385  explicit CXXDefaultArgExpr(ParmVarDecl *param)
386    : Expr(CXXDefaultArgExprClass,
387           param->hasUnparsedDefaultArg()? param->getType().getNonReferenceType()
388                                         : param->getDefaultArg()->getType()),
389      Param(param) { }
390
391  // Retrieve the parameter that the argument was created from.
392  const ParmVarDecl *getParam() const { return Param; }
393  ParmVarDecl *getParam() { return Param; }
394
395  // Retrieve the actual argument to the function call.
396  const Expr *getExpr() const { return Param->getDefaultArg(); }
397  Expr *getExpr() { return Param->getDefaultArg(); }
398
399  virtual SourceRange getSourceRange() const {
400    // Default argument expressions have no representation in the
401    // source, so they have an empty source range.
402    return SourceRange();
403  }
404
405  static bool classof(const Stmt *T) {
406    return T->getStmtClass() == CXXDefaultArgExprClass;
407  }
408  static bool classof(const CXXDefaultArgExpr *) { return true; }
409
410  // Iterators
411  virtual child_iterator child_begin();
412  virtual child_iterator child_end();
413};
414
415/// CXXTemporary - Represents a C++ temporary.
416class CXXTemporary {
417  /// Destructor - The destructor that needs to be called.
418  const CXXDestructorDecl *Destructor;
419
420  CXXTemporary(const CXXDestructorDecl *destructor)
421    : Destructor(destructor) { }
422
423public:
424  static CXXTemporary *Create(ASTContext &C,
425                              const CXXDestructorDecl *Destructor);
426};
427
428/// CXXBindTemporaryExpr - Represents binding an expression to a temporary,
429/// so its destructor can be called later.
430class CXXBindTemporaryExpr : public Expr {
431  CXXTemporary *Temp;
432
433  Stmt *SubExpr;
434
435  CXXBindTemporaryExpr(CXXTemporary *temp, Expr* subexpr)
436   : Expr(CXXBindTemporaryExprClass,
437          subexpr->getType()), Temp(temp), SubExpr(subexpr) { }
438
439public:
440  static CXXBindTemporaryExpr *Create(ASTContext &C, CXXTemporary *Temp,
441                                      Expr* SubExpr);
442
443  const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
444  Expr *getSubExpr() { return cast<Expr>(SubExpr); }
445
446  virtual SourceRange getSourceRange() const { return SourceRange(); }
447
448  // Implement isa/cast/dyncast/etc.
449  static bool classof(const Stmt *T) {
450    return T->getStmtClass() == CXXBindTemporaryExprClass;
451  }
452  static bool classof(const CXXBindTemporaryExpr *) { return true; }
453
454  // Iterators
455  virtual child_iterator child_begin();
456  virtual child_iterator child_end();
457};
458
459/// CXXConstructExpr - Represents a call to a C++ constructor.
460class CXXConstructExpr : public Expr {
461  CXXConstructorDecl *Constructor;
462
463  bool Elidable;
464
465  Stmt **Args;
466  unsigned NumArgs;
467
468
469protected:
470  CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
471                   CXXConstructorDecl *d, bool elidable,
472                   Expr **args, unsigned numargs);
473  ~CXXConstructExpr() { }
474
475public:
476  static CXXConstructExpr *Create(ASTContext &C, QualType T,
477                                  CXXConstructorDecl *D, bool Elidable,
478                                  Expr **Args, unsigned NumArgs);
479
480  void Destroy(ASTContext &C);
481
482  CXXConstructorDecl* getConstructor() const { return Constructor; }
483
484  /// \brief Whether this construction is elidable.
485  bool isElidable() const { return Elidable; }
486
487  typedef ExprIterator arg_iterator;
488  typedef ConstExprIterator const_arg_iterator;
489
490  arg_iterator arg_begin() { return Args; }
491  arg_iterator arg_end() { return Args + NumArgs; }
492  const_arg_iterator arg_begin() const { return Args; }
493  const_arg_iterator arg_end() const { return Args + NumArgs; }
494
495  unsigned getNumArgs() const { return NumArgs; }
496
497  virtual SourceRange getSourceRange() const { return SourceRange(); }
498
499  static bool classof(const Stmt *T) {
500    return T->getStmtClass() == CXXConstructExprClass ||
501      T->getStmtClass() == CXXTemporaryObjectExprClass;
502  }
503  static bool classof(const CXXConstructExpr *) { return true; }
504
505  // Iterators
506  virtual child_iterator child_begin();
507  virtual child_iterator child_end();
508};
509
510/// CXXFunctionalCastExpr - Represents an explicit C++ type conversion
511/// that uses "functional" notion (C++ [expr.type.conv]). Example: @c
512/// x = int(0.5);
513class CXXFunctionalCastExpr : public ExplicitCastExpr {
514  SourceLocation TyBeginLoc;
515  SourceLocation RParenLoc;
516public:
517  CXXFunctionalCastExpr(QualType ty, QualType writtenTy,
518                        SourceLocation tyBeginLoc, Expr *castExpr,
519                        SourceLocation rParenLoc) :
520    ExplicitCastExpr(CXXFunctionalCastExprClass, ty, castExpr, writtenTy),
521    TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {}
522
523  SourceLocation getTypeBeginLoc() const { return TyBeginLoc; }
524  SourceLocation getRParenLoc() const { return RParenLoc; }
525
526  virtual SourceRange getSourceRange() const {
527    return SourceRange(TyBeginLoc, RParenLoc);
528  }
529  static bool classof(const Stmt *T) {
530    return T->getStmtClass() == CXXFunctionalCastExprClass;
531  }
532  static bool classof(const CXXFunctionalCastExpr *) { return true; }
533};
534
535/// @brief Represents a C++ functional cast expression that builds a
536/// temporary object.
537///
538/// This expression type represents a C++ "functional" cast
539/// (C++[expr.type.conv]) with N != 1 arguments that invokes a
540/// constructor to build a temporary object. If N == 0 but no
541/// constructor will be called (because the functional cast is
542/// performing a value-initialized an object whose class type has no
543/// user-declared constructors), CXXZeroInitValueExpr will represent
544/// the functional cast. Finally, with N == 1 arguments the functional
545/// cast expression will be represented by CXXFunctionalCastExpr.
546/// Example:
547/// @code
548/// struct X { X(int, float); }
549///
550/// X create_X() {
551///   return X(1, 3.14f); // creates a CXXTemporaryObjectExpr
552/// };
553/// @endcode
554class CXXTemporaryObjectExpr : public CXXConstructExpr {
555  SourceLocation TyBeginLoc;
556  SourceLocation RParenLoc;
557
558public:
559  CXXTemporaryObjectExpr(ASTContext &C, CXXConstructorDecl *Cons,
560                         QualType writtenTy, SourceLocation tyBeginLoc,
561                         Expr **Args,unsigned NumArgs,
562                         SourceLocation rParenLoc);
563
564  ~CXXTemporaryObjectExpr() { }
565
566  SourceLocation getTypeBeginLoc() const { return TyBeginLoc; }
567  SourceLocation getRParenLoc() const { return RParenLoc; }
568
569  virtual SourceRange getSourceRange() const {
570    return SourceRange(TyBeginLoc, RParenLoc);
571  }
572  static bool classof(const Stmt *T) {
573    return T->getStmtClass() == CXXTemporaryObjectExprClass;
574  }
575  static bool classof(const CXXTemporaryObjectExpr *) { return true; }
576};
577
578/// CXXZeroInitValueExpr - [C++ 5.2.3p2]
579/// Expression "T()" which creates a value-initialized rvalue of type
580/// T, which is either a non-class type or a class type without any
581/// user-defined constructors.
582///
583class CXXZeroInitValueExpr : public Expr {
584  SourceLocation TyBeginLoc;
585  SourceLocation RParenLoc;
586
587public:
588  CXXZeroInitValueExpr(QualType ty, SourceLocation tyBeginLoc,
589                       SourceLocation rParenLoc ) :
590    Expr(CXXZeroInitValueExprClass, ty, false, false),
591    TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {}
592
593  SourceLocation getTypeBeginLoc() const { return TyBeginLoc; }
594  SourceLocation getRParenLoc() const { return RParenLoc; }
595
596  /// @brief Whether this initialization expression was
597  /// implicitly-generated.
598  bool isImplicit() const {
599    return TyBeginLoc.isInvalid() && RParenLoc.isInvalid();
600  }
601
602  virtual SourceRange getSourceRange() const {
603    return SourceRange(TyBeginLoc, RParenLoc);
604  }
605
606  CXXZeroInitValueExpr* Clone(ASTContext &C) const;
607
608  static bool classof(const Stmt *T) {
609    return T->getStmtClass() == CXXZeroInitValueExprClass;
610  }
611  static bool classof(const CXXZeroInitValueExpr *) { return true; }
612
613  // Iterators
614  virtual child_iterator child_begin();
615  virtual child_iterator child_end();
616};
617
618/// CXXConditionDeclExpr - Condition declaration of a if/switch/while/for
619/// statement, e.g: "if (int x = f()) {...}".
620/// The main difference with DeclRefExpr is that CXXConditionDeclExpr owns the
621/// decl that it references.
622///
623class CXXConditionDeclExpr : public DeclRefExpr {
624public:
625  CXXConditionDeclExpr(SourceLocation startLoc,
626                       SourceLocation eqLoc, VarDecl *var)
627    : DeclRefExpr(CXXConditionDeclExprClass, var,
628                  var->getType().getNonReferenceType(), startLoc,
629                  var->getType()->isDependentType(),
630                  /*FIXME:integral constant?*/
631                    var->getType()->isDependentType()) {}
632
633  virtual void Destroy(ASTContext& Ctx);
634
635  SourceLocation getStartLoc() const { return getLocation(); }
636
637  VarDecl *getVarDecl() { return cast<VarDecl>(getDecl()); }
638  const VarDecl *getVarDecl() const { return cast<VarDecl>(getDecl()); }
639
640  virtual SourceRange getSourceRange() const {
641    return SourceRange(getStartLoc(), getVarDecl()->getInit()->getLocEnd());
642  }
643
644  static bool classof(const Stmt *T) {
645    return T->getStmtClass() == CXXConditionDeclExprClass;
646  }
647  static bool classof(const CXXConditionDeclExpr *) { return true; }
648
649  // Iterators
650  virtual child_iterator child_begin();
651  virtual child_iterator child_end();
652};
653
654/// CXXNewExpr - A new expression for memory allocation and constructor calls,
655/// e.g: "new CXXNewExpr(foo)".
656class CXXNewExpr : public Expr {
657  // Was the usage ::new, i.e. is the global new to be used?
658  bool GlobalNew : 1;
659  // Was the form (type-id) used? Otherwise, it was new-type-id.
660  bool ParenTypeId : 1;
661  // Is there an initializer? If not, built-ins are uninitialized, else they're
662  // value-initialized.
663  bool Initializer : 1;
664  // Do we allocate an array? If so, the first SubExpr is the size expression.
665  bool Array : 1;
666  // The number of placement new arguments.
667  unsigned NumPlacementArgs : 14;
668  // The number of constructor arguments. This may be 1 even for non-class
669  // types; use the pseudo copy constructor.
670  unsigned NumConstructorArgs : 14;
671  // Contains an optional array size expression, any number of optional
672  // placement arguments, and any number of optional constructor arguments,
673  // in that order.
674  Stmt **SubExprs;
675  // Points to the allocation function used.
676  FunctionDecl *OperatorNew;
677  // Points to the deallocation function used in case of error. May be null.
678  FunctionDecl *OperatorDelete;
679  // Points to the constructor used. Cannot be null if AllocType is a record;
680  // it would still point at the default constructor (even an implicit one).
681  // Must be null for all other types.
682  CXXConstructorDecl *Constructor;
683
684  SourceLocation StartLoc;
685  SourceLocation EndLoc;
686
687public:
688  CXXNewExpr(bool globalNew, FunctionDecl *operatorNew, Expr **placementArgs,
689             unsigned numPlaceArgs, bool ParenTypeId, Expr *arraySize,
690             CXXConstructorDecl *constructor, bool initializer,
691             Expr **constructorArgs, unsigned numConsArgs,
692             FunctionDecl *operatorDelete, QualType ty,
693             SourceLocation startLoc, SourceLocation endLoc);
694  ~CXXNewExpr() {
695    delete[] SubExprs;
696  }
697
698  QualType getAllocatedType() const {
699    assert(getType()->isPointerType());
700    return getType()->getAsPointerType()->getPointeeType();
701  }
702
703  FunctionDecl *getOperatorNew() const { return OperatorNew; }
704  FunctionDecl *getOperatorDelete() const { return OperatorDelete; }
705  CXXConstructorDecl *getConstructor() const { return Constructor; }
706
707  bool isArray() const { return Array; }
708  Expr *getArraySize() {
709    return Array ? cast<Expr>(SubExprs[0]) : 0;
710  }
711  const Expr *getArraySize() const {
712    return Array ? cast<Expr>(SubExprs[0]) : 0;
713  }
714
715  unsigned getNumPlacementArgs() const { return NumPlacementArgs; }
716  Expr *getPlacementArg(unsigned i) {
717    assert(i < NumPlacementArgs && "Index out of range");
718    return cast<Expr>(SubExprs[Array + i]);
719  }
720  const Expr *getPlacementArg(unsigned i) const {
721    assert(i < NumPlacementArgs && "Index out of range");
722    return cast<Expr>(SubExprs[Array + i]);
723  }
724
725  bool isGlobalNew() const { return GlobalNew; }
726  bool isParenTypeId() const { return ParenTypeId; }
727  bool hasInitializer() const { return Initializer; }
728
729  unsigned getNumConstructorArgs() const { return NumConstructorArgs; }
730  Expr *getConstructorArg(unsigned i) {
731    assert(i < NumConstructorArgs && "Index out of range");
732    return cast<Expr>(SubExprs[Array + NumPlacementArgs + i]);
733  }
734  const Expr *getConstructorArg(unsigned i) const {
735    assert(i < NumConstructorArgs && "Index out of range");
736    return cast<Expr>(SubExprs[Array + NumPlacementArgs + i]);
737  }
738
739  typedef ExprIterator arg_iterator;
740  typedef ConstExprIterator const_arg_iterator;
741
742  arg_iterator placement_arg_begin() {
743    return SubExprs + Array;
744  }
745  arg_iterator placement_arg_end() {
746    return SubExprs + Array + getNumPlacementArgs();
747  }
748  const_arg_iterator placement_arg_begin() const {
749    return SubExprs + Array;
750  }
751  const_arg_iterator placement_arg_end() const {
752    return SubExprs + Array + getNumPlacementArgs();
753  }
754
755  arg_iterator constructor_arg_begin() {
756    return SubExprs + Array + getNumPlacementArgs();
757  }
758  arg_iterator constructor_arg_end() {
759    return SubExprs + Array + getNumPlacementArgs() + getNumConstructorArgs();
760  }
761  const_arg_iterator constructor_arg_begin() const {
762    return SubExprs + Array + getNumPlacementArgs();
763  }
764  const_arg_iterator constructor_arg_end() const {
765    return SubExprs + Array + getNumPlacementArgs() + getNumConstructorArgs();
766  }
767
768  virtual SourceRange getSourceRange() const {
769    return SourceRange(StartLoc, EndLoc);
770  }
771
772  static bool classof(const Stmt *T) {
773    return T->getStmtClass() == CXXNewExprClass;
774  }
775  static bool classof(const CXXNewExpr *) { return true; }
776
777  // Iterators
778  virtual child_iterator child_begin();
779  virtual child_iterator child_end();
780};
781
782/// CXXDeleteExpr - A delete expression for memory deallocation and destructor
783/// calls, e.g. "delete[] pArray".
784class CXXDeleteExpr : public Expr {
785  // Is this a forced global delete, i.e. "::delete"?
786  bool GlobalDelete : 1;
787  // Is this the array form of delete, i.e. "delete[]"?
788  bool ArrayForm : 1;
789  // Points to the operator delete overload that is used. Could be a member.
790  FunctionDecl *OperatorDelete;
791  // The pointer expression to be deleted.
792  Stmt *Argument;
793  // Location of the expression.
794  SourceLocation Loc;
795public:
796  CXXDeleteExpr(QualType ty, bool globalDelete, bool arrayForm,
797                FunctionDecl *operatorDelete, Expr *arg, SourceLocation loc)
798    : Expr(CXXDeleteExprClass, ty, false, false), GlobalDelete(globalDelete),
799      ArrayForm(arrayForm), OperatorDelete(operatorDelete), Argument(arg),
800      Loc(loc) { }
801
802  bool isGlobalDelete() const { return GlobalDelete; }
803  bool isArrayForm() const { return ArrayForm; }
804
805  FunctionDecl *getOperatorDelete() const { return OperatorDelete; }
806
807  Expr *getArgument() { return cast<Expr>(Argument); }
808  const Expr *getArgument() const { return cast<Expr>(Argument); }
809
810  virtual SourceRange getSourceRange() const {
811    return SourceRange(Loc, Argument->getLocEnd());
812  }
813
814  static bool classof(const Stmt *T) {
815    return T->getStmtClass() == CXXDeleteExprClass;
816  }
817  static bool classof(const CXXDeleteExpr *) { return true; }
818
819  // Iterators
820  virtual child_iterator child_begin();
821  virtual child_iterator child_end();
822};
823
824/// \brief Represents the name of a function that has not been
825/// resolved to any declaration.
826///
827/// Unresolved function names occur when a function name is
828/// encountered prior to an open parentheses ('(') in a C++ function
829/// call, and the function name itself did not resolve to a
830/// declaration. These function names can only be resolved when they
831/// form the postfix-expression of a function call, so that
832/// argument-dependent lookup finds declarations corresponding to
833/// these functions.
834
835/// @code
836/// template<typename T> void f(T x) {
837///   g(x); // g is an unresolved function name (that is also a dependent name)
838/// }
839/// @endcode
840class UnresolvedFunctionNameExpr : public Expr {
841  /// The name that was present in the source
842  DeclarationName Name;
843
844  /// The location of this name in the source code
845  SourceLocation Loc;
846
847public:
848  UnresolvedFunctionNameExpr(DeclarationName N, QualType T, SourceLocation L)
849    : Expr(UnresolvedFunctionNameExprClass, T, false, false), Name(N), Loc(L) { }
850
851  /// \brief Retrieves the name that occurred in the source code.
852  DeclarationName getName() const { return Name; }
853
854  /// getLocation - Retrieves the location in the source code where
855  /// the name occurred.
856  SourceLocation getLocation() const { return Loc; }
857
858  virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
859
860  UnresolvedFunctionNameExpr* Clone(ASTContext &C) const;
861
862  static bool classof(const Stmt *T) {
863    return T->getStmtClass() == UnresolvedFunctionNameExprClass;
864  }
865  static bool classof(const UnresolvedFunctionNameExpr *) { return true; }
866
867  // Iterators
868  virtual child_iterator child_begin();
869  virtual child_iterator child_end();
870};
871
872/// UnaryTypeTraitExpr - A GCC or MS unary type trait, as used in the
873/// implementation of TR1/C++0x type trait templates.
874/// Example:
875/// __is_pod(int) == true
876/// __is_enum(std::string) == false
877class UnaryTypeTraitExpr : public Expr {
878  /// UTT - The trait.
879  UnaryTypeTrait UTT;
880
881  /// Loc - The location of the type trait keyword.
882  SourceLocation Loc;
883
884  /// RParen - The location of the closing paren.
885  SourceLocation RParen;
886
887  /// QueriedType - The type we're testing.
888  QualType QueriedType;
889
890public:
891  UnaryTypeTraitExpr(SourceLocation loc, UnaryTypeTrait utt, QualType queried,
892                     SourceLocation rparen, QualType ty)
893    : Expr(UnaryTypeTraitExprClass, ty, false, queried->isDependentType()),
894      UTT(utt), Loc(loc), RParen(rparen), QueriedType(queried) { }
895
896  virtual SourceRange getSourceRange() const { return SourceRange(Loc, RParen);}
897
898  UnaryTypeTrait getTrait() const { return UTT; }
899
900  QualType getQueriedType() const { return QueriedType; }
901
902  bool EvaluateTrait() const;
903
904  static bool classof(const Stmt *T) {
905    return T->getStmtClass() == UnaryTypeTraitExprClass;
906  }
907  static bool classof(const UnaryTypeTraitExpr *) { return true; }
908
909  // Iterators
910  virtual child_iterator child_begin();
911  virtual child_iterator child_end();
912};
913
914/// QualifiedDeclRefExpr - A reference to a declared variable,
915/// function, enum, etc., that includes a qualification, e.g.,
916/// "N::foo".
917class QualifiedDeclRefExpr : public DeclRefExpr {
918  /// QualifierRange - The source range that covers the
919  /// nested-name-specifier.
920  SourceRange QualifierRange;
921
922  /// \brief The nested-name-specifier that qualifies this declaration
923  /// name.
924  NestedNameSpecifier *NNS;
925
926public:
927  QualifiedDeclRefExpr(NamedDecl *d, QualType t, SourceLocation l, bool TD,
928                       bool VD, SourceRange R, NestedNameSpecifier *NNS)
929    : DeclRefExpr(QualifiedDeclRefExprClass, d, t, l, TD, VD),
930      QualifierRange(R), NNS(NNS) { }
931
932  /// \brief Retrieve the source range of the nested-name-specifier.
933  SourceRange getQualifierRange() const { return QualifierRange; }
934
935  /// \brief Retrieve the nested-name-specifier that qualifies this
936  /// declaration.
937  NestedNameSpecifier *getQualifier() const { return NNS; }
938
939  virtual SourceRange getSourceRange() const {
940    return SourceRange(QualifierRange.getBegin(), getLocation());
941  }
942
943  static bool classof(const Stmt *T) {
944    return T->getStmtClass() == QualifiedDeclRefExprClass;
945  }
946  static bool classof(const QualifiedDeclRefExpr *) { return true; }
947};
948
949/// \brief A qualified reference to a name whose declaration cannot
950/// yet be resolved.
951///
952/// UnresolvedDeclRefExpr is similar to QualifiedDeclRefExpr in that
953/// it expresses a qualified reference to a declaration such as
954/// X<T>::value. The difference, however, is that an
955/// UnresolvedDeclRefExpr node is used only within C++ templates when
956/// the qualification (e.g., X<T>::) refers to a dependent type. In
957/// this case, X<T>::value cannot resolve to a declaration because the
958/// declaration will differ from on instantiation of X<T> to the
959/// next. Therefore, UnresolvedDeclRefExpr keeps track of the
960/// qualifier (X<T>::) and the name of the entity being referenced
961/// ("value"). Such expressions will instantiate to
962/// QualifiedDeclRefExprs.
963class UnresolvedDeclRefExpr : public Expr {
964  /// The name of the entity we will be referencing.
965  DeclarationName Name;
966
967  /// Location of the name of the declaration we're referencing.
968  SourceLocation Loc;
969
970  /// QualifierRange - The source range that covers the
971  /// nested-name-specifier.
972  SourceRange QualifierRange;
973
974  /// \brief The nested-name-specifier that qualifies this unresolved
975  /// declaration name.
976  NestedNameSpecifier *NNS;
977
978public:
979  UnresolvedDeclRefExpr(DeclarationName N, QualType T, SourceLocation L,
980                        SourceRange R, NestedNameSpecifier *NNS)
981    : Expr(UnresolvedDeclRefExprClass, T, true, true),
982      Name(N), Loc(L), QualifierRange(R), NNS(NNS) { }
983
984  /// \brief Retrieve the name that this expression refers to.
985  DeclarationName getDeclName() const { return Name; }
986
987  /// \brief Retrieve the location of the name within the expression.
988  SourceLocation getLocation() const { return Loc; }
989
990  /// \brief Retrieve the source range of the nested-name-specifier.
991  SourceRange getQualifierRange() const { return QualifierRange; }
992
993  /// \brief Retrieve the nested-name-specifier that qualifies this
994  /// declaration.
995  NestedNameSpecifier *getQualifier() const { return NNS; }
996
997  virtual SourceRange getSourceRange() const {
998    return SourceRange(QualifierRange.getBegin(), getLocation());
999  }
1000
1001  static bool classof(const Stmt *T) {
1002    return T->getStmtClass() == UnresolvedDeclRefExprClass;
1003  }
1004  static bool classof(const UnresolvedDeclRefExpr *) { return true; }
1005
1006  virtual StmtIterator child_begin();
1007  virtual StmtIterator child_end();
1008};
1009
1010class CXXExprWithTemporaries : public Expr {
1011  Stmt *SubExpr;
1012
1013  CXXTemporary **Temps;
1014  unsigned NumTemps;
1015
1016public:
1017  CXXExprWithTemporaries(Expr *subexpr, CXXTemporary **temps,
1018                         unsigned numtemps);
1019  ~CXXExprWithTemporaries();
1020
1021  const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
1022  Expr *getSubExpr() { return cast<Expr>(SubExpr); }
1023
1024  virtual SourceRange getSourceRange() const { return SourceRange(); }
1025
1026  // Implement isa/cast/dyncast/etc.
1027  static bool classof(const Stmt *T) {
1028    return T->getStmtClass() == CXXExprWithTemporariesClass;
1029  }
1030  static bool classof(const CXXExprWithTemporaries *) { return true; }
1031
1032  // Iterators
1033  virtual child_iterator child_begin();
1034  virtual child_iterator child_end();
1035};
1036
1037/// \brief Describes an explicit type conversion that uses functional
1038/// notion but could not be resolved because one or more arguments are
1039/// type-dependent.
1040///
1041/// The explicit type conversions expressed by
1042/// CXXUnresolvedConstructExpr have the form \c T(a1, a2, ..., aN),
1043/// where \c T is some type and \c a1, a2, ..., aN are values, and
1044/// either \C T is a dependent type or one or more of the \c a's is
1045/// type-dependent. For example, this would occur in a template such
1046/// as:
1047///
1048/// \code
1049///   template<typename T, typename A1>
1050///   inline T make_a(const A1& a1) {
1051///     return T(a1);
1052///   }
1053/// \endcode
1054///
1055/// When the returned expression is instantiated, it may resolve to a
1056/// constructor call, conversion function call, or some kind of type
1057/// conversion.
1058class CXXUnresolvedConstructExpr : public Expr {
1059  /// \brief The starting location of the type
1060  SourceLocation TyBeginLoc;
1061
1062  /// \brief The type being constructed.
1063  QualType Type;
1064
1065  /// \brief The location of the left parentheses ('(').
1066  SourceLocation LParenLoc;
1067
1068  /// \brief The location of the right parentheses (')').
1069  SourceLocation RParenLoc;
1070
1071  /// \brief The number of arguments used to construct the type.
1072  unsigned NumArgs;
1073
1074  CXXUnresolvedConstructExpr(SourceLocation TyBegin,
1075                             QualType T,
1076                             SourceLocation LParenLoc,
1077                             Expr **Args,
1078                             unsigned NumArgs,
1079                             SourceLocation RParenLoc);
1080
1081public:
1082  static CXXUnresolvedConstructExpr *Create(ASTContext &C,
1083                                            SourceLocation TyBegin,
1084                                            QualType T,
1085                                            SourceLocation LParenLoc,
1086                                            Expr **Args,
1087                                            unsigned NumArgs,
1088                                            SourceLocation RParenLoc);
1089
1090  /// \brief Retrieve the source location where the type begins.
1091  SourceLocation getTypeBeginLoc() const { return TyBeginLoc; }
1092  void setTypeBeginLoc(SourceLocation L) { TyBeginLoc = L; }
1093
1094  /// \brief Retrieve the type that is being constructed, as specified
1095  /// in the source code.
1096  QualType getTypeAsWritten() const { return Type; }
1097  void setTypeAsWritten(QualType T) { Type = T; }
1098
1099  /// \brief Retrieve the location of the left parentheses ('(') that
1100  /// precedes the argument list.
1101  SourceLocation getLParenLoc() const { return LParenLoc; }
1102  void setLParenLoc(SourceLocation L) { LParenLoc = L; }
1103
1104  /// \brief Retrieve the location of the right parentheses (')') that
1105  /// follows the argument list.
1106  SourceLocation getRParenLoc() const { return RParenLoc; }
1107  void setRParenLoc(SourceLocation L) { RParenLoc = L; }
1108
1109  /// \brief Retrieve the number of arguments.
1110  unsigned arg_size() const { return NumArgs; }
1111
1112  typedef Expr** arg_iterator;
1113  arg_iterator arg_begin() { return reinterpret_cast<Expr**>(this + 1); }
1114  arg_iterator arg_end() { return arg_begin() + NumArgs; }
1115
1116  Expr *getArg(unsigned I) {
1117    assert(I < NumArgs && "Argument index out-of-range");
1118    return *(arg_begin() + I);
1119  }
1120
1121  virtual SourceRange getSourceRange() const {
1122    return SourceRange(TyBeginLoc, RParenLoc);
1123  }
1124  static bool classof(const Stmt *T) {
1125    return T->getStmtClass() == CXXUnresolvedConstructExprClass;
1126  }
1127  static bool classof(const CXXUnresolvedConstructExpr *) { return true; }
1128
1129  // Iterators
1130  virtual child_iterator child_begin();
1131  virtual child_iterator child_end();
1132};
1133
1134/// \brief
1135class CXXUnresolvedMemberExpr : public Expr {
1136  /// \brief The expression for the base pointer or class reference,
1137  /// e.g., the \c x in x.f.
1138  Stmt *Base;
1139
1140  /// \brief Whether this member expression used the '->' operator or
1141  /// the '.' operator.
1142  bool IsArrow;
1143
1144  /// \brief The location of the '->' or '.' operator.
1145  SourceLocation OperatorLoc;
1146
1147  /// \brief The member to which this member expression refers, which
1148  /// can be name, overloaded operator, or destructor.
1149  /// FIXME: could also be a template-id, and we might have a
1150  /// nested-name-specifier as well.
1151  DeclarationName Member;
1152
1153  /// \brief The location of the member name.
1154  SourceLocation MemberLoc;
1155
1156public:
1157  CXXUnresolvedMemberExpr(ASTContext &C,
1158                          Expr *Base, bool IsArrow,
1159                          SourceLocation OperatorLoc,
1160                          DeclarationName Member,
1161                          SourceLocation MemberLoc)
1162    : Expr(CXXUnresolvedMemberExprClass, C.DependentTy, true, true),
1163      Base(Base), IsArrow(IsArrow), OperatorLoc(OperatorLoc),
1164      Member(Member), MemberLoc(MemberLoc) { }
1165
1166  /// \brief Retrieve the base object of this member expressions,
1167  /// e.g., the \c x in \c x.m.
1168  Expr *getBase() { return cast<Expr>(Base); }
1169  void setBase(Expr *E) { Base = E; }
1170
1171  /// \brief Determine whether this member expression used the '->'
1172  /// operator; otherwise, it used the '.' operator.
1173  bool isArrow() const { return IsArrow; }
1174  void setArrow(bool A) { IsArrow = A; }
1175
1176  /// \brief Retrieve the location of the '->' or '.' operator.
1177  SourceLocation getOperatorLoc() const { return OperatorLoc; }
1178  void setOperatorLoc(SourceLocation L) { OperatorLoc = L; }
1179
1180  /// \brief Retrieve the name of the member that this expression
1181  /// refers to.
1182  DeclarationName getMember() const { return Member; }
1183  void setMember(DeclarationName N) { Member = N; }
1184
1185  // \brief Retrieve the location of the name of the member that this
1186  // expression refers to.
1187  SourceLocation getMemberLoc() const { return MemberLoc; }
1188  void setMemberLoc(SourceLocation L) { MemberLoc = L; }
1189
1190  virtual SourceRange getSourceRange() const {
1191    return SourceRange(Base->getSourceRange().getBegin(),
1192                       MemberLoc);
1193  }
1194  static bool classof(const Stmt *T) {
1195    return T->getStmtClass() == CXXUnresolvedMemberExprClass;
1196  }
1197  static bool classof(const CXXUnresolvedMemberExpr *) { return true; }
1198
1199  // Iterators
1200  virtual child_iterator child_begin();
1201  virtual child_iterator child_end();
1202};
1203
1204}  // end namespace clang
1205
1206#endif
1207