ExprCXX.h revision b859f35459ae3e1188d1e1b86df08d649695fd86
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 CXXTempVarDecl;
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  VarDecl *VD;
462  CXXConstructorDecl *Constructor;
463
464  bool Elidable;
465
466  Stmt **Args;
467  unsigned NumArgs;
468
469
470protected:
471  CXXConstructExpr(ASTContext &C, StmtClass SC, VarDecl *vd, QualType T,
472                   CXXConstructorDecl *d, bool elidable,
473                   Expr **args, unsigned numargs);
474  ~CXXConstructExpr() { }
475
476public:
477  static CXXConstructExpr *Create(ASTContext &C, VarDecl *VD, QualType T,
478                                  CXXConstructorDecl *D, bool Elidable,
479                                  Expr **Args, unsigned NumArgs);
480
481  void Destroy(ASTContext &C);
482
483  VarDecl* getVarDecl() const { return VD; }
484  CXXConstructorDecl* getConstructor() const { return Constructor; }
485
486  /// \brief Whether this construction is elidable.
487  bool isElidable() const { return Elidable; }
488
489  typedef ExprIterator arg_iterator;
490  typedef ConstExprIterator const_arg_iterator;
491
492  arg_iterator arg_begin() { return Args; }
493  arg_iterator arg_end() { return Args + NumArgs; }
494  const_arg_iterator arg_begin() const { return Args; }
495  const_arg_iterator arg_end() const { return Args + NumArgs; }
496
497  unsigned getNumArgs() const { return NumArgs; }
498
499  virtual SourceRange getSourceRange() const { return SourceRange(); }
500
501  static bool classof(const Stmt *T) {
502    return T->getStmtClass() == CXXConstructExprClass ||
503      T->getStmtClass() == CXXTemporaryObjectExprClass;
504  }
505  static bool classof(const CXXConstructExpr *) { return true; }
506
507  // Iterators
508  virtual child_iterator child_begin();
509  virtual child_iterator child_end();
510};
511
512/// CXXFunctionalCastExpr - Represents an explicit C++ type conversion
513/// that uses "functional" notion (C++ [expr.type.conv]). Example: @c
514/// x = int(0.5);
515class CXXFunctionalCastExpr : public ExplicitCastExpr {
516  SourceLocation TyBeginLoc;
517  SourceLocation RParenLoc;
518public:
519  CXXFunctionalCastExpr(QualType ty, QualType writtenTy,
520                        SourceLocation tyBeginLoc, Expr *castExpr,
521                        SourceLocation rParenLoc) :
522    ExplicitCastExpr(CXXFunctionalCastExprClass, ty, castExpr, writtenTy),
523    TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {}
524
525  SourceLocation getTypeBeginLoc() const { return TyBeginLoc; }
526  SourceLocation getRParenLoc() const { return RParenLoc; }
527
528  virtual SourceRange getSourceRange() const {
529    return SourceRange(TyBeginLoc, RParenLoc);
530  }
531  static bool classof(const Stmt *T) {
532    return T->getStmtClass() == CXXFunctionalCastExprClass;
533  }
534  static bool classof(const CXXFunctionalCastExpr *) { return true; }
535};
536
537/// @brief Represents a C++ functional cast expression that builds a
538/// temporary object.
539///
540/// This expression type represents a C++ "functional" cast
541/// (C++[expr.type.conv]) with N != 1 arguments that invokes a
542/// constructor to build a temporary object. If N == 0 but no
543/// constructor will be called (because the functional cast is
544/// performing a value-initialized an object whose class type has no
545/// user-declared constructors), CXXZeroInitValueExpr will represent
546/// the functional cast. Finally, with N == 1 arguments the functional
547/// cast expression will be represented by CXXFunctionalCastExpr.
548/// Example:
549/// @code
550/// struct X { X(int, float); }
551///
552/// X create_X() {
553///   return X(1, 3.14f); // creates a CXXTemporaryObjectExpr
554/// };
555/// @endcode
556class CXXTemporaryObjectExpr : public CXXConstructExpr {
557  SourceLocation TyBeginLoc;
558  SourceLocation RParenLoc;
559
560public:
561  CXXTemporaryObjectExpr(ASTContext &C, VarDecl *vd,
562                         CXXConstructorDecl *Cons, QualType writtenTy,
563                         SourceLocation tyBeginLoc, Expr **Args,
564                         unsigned NumArgs, SourceLocation rParenLoc);
565
566  ~CXXTemporaryObjectExpr() { }
567
568  SourceLocation getTypeBeginLoc() const { return TyBeginLoc; }
569  SourceLocation getRParenLoc() const { return RParenLoc; }
570
571  virtual SourceRange getSourceRange() const {
572    return SourceRange(TyBeginLoc, RParenLoc);
573  }
574  static bool classof(const Stmt *T) {
575    return T->getStmtClass() == CXXTemporaryObjectExprClass;
576  }
577  static bool classof(const CXXTemporaryObjectExpr *) { return true; }
578};
579
580/// CXXZeroInitValueExpr - [C++ 5.2.3p2]
581/// Expression "T()" which creates a value-initialized rvalue of type
582/// T, which is either a non-class type or a class type without any
583/// user-defined constructors.
584///
585class CXXZeroInitValueExpr : public Expr {
586  SourceLocation TyBeginLoc;
587  SourceLocation RParenLoc;
588
589public:
590  CXXZeroInitValueExpr(QualType ty, SourceLocation tyBeginLoc,
591                       SourceLocation rParenLoc ) :
592    Expr(CXXZeroInitValueExprClass, ty, false, false),
593    TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {}
594
595  SourceLocation getTypeBeginLoc() const { return TyBeginLoc; }
596  SourceLocation getRParenLoc() const { return RParenLoc; }
597
598  /// @brief Whether this initialization expression was
599  /// implicitly-generated.
600  bool isImplicit() const {
601    return TyBeginLoc.isInvalid() && RParenLoc.isInvalid();
602  }
603
604  virtual SourceRange getSourceRange() const {
605    return SourceRange(TyBeginLoc, RParenLoc);
606  }
607
608  CXXZeroInitValueExpr* Clone(ASTContext &C) const;
609
610  static bool classof(const Stmt *T) {
611    return T->getStmtClass() == CXXZeroInitValueExprClass;
612  }
613  static bool classof(const CXXZeroInitValueExpr *) { return true; }
614
615  // Iterators
616  virtual child_iterator child_begin();
617  virtual child_iterator child_end();
618};
619
620/// CXXConditionDeclExpr - Condition declaration of a if/switch/while/for
621/// statement, e.g: "if (int x = f()) {...}".
622/// The main difference with DeclRefExpr is that CXXConditionDeclExpr owns the
623/// decl that it references.
624///
625class CXXConditionDeclExpr : public DeclRefExpr {
626public:
627  CXXConditionDeclExpr(SourceLocation startLoc,
628                       SourceLocation eqLoc, VarDecl *var)
629    : DeclRefExpr(CXXConditionDeclExprClass, var,
630                  var->getType().getNonReferenceType(), startLoc,
631                  var->getType()->isDependentType(),
632                  /*FIXME:integral constant?*/
633                    var->getType()->isDependentType()) {}
634
635  virtual void Destroy(ASTContext& Ctx);
636
637  SourceLocation getStartLoc() const { return getLocation(); }
638
639  VarDecl *getVarDecl() { return cast<VarDecl>(getDecl()); }
640  const VarDecl *getVarDecl() const { return cast<VarDecl>(getDecl()); }
641
642  virtual SourceRange getSourceRange() const {
643    return SourceRange(getStartLoc(), getVarDecl()->getInit()->getLocEnd());
644  }
645
646  static bool classof(const Stmt *T) {
647    return T->getStmtClass() == CXXConditionDeclExprClass;
648  }
649  static bool classof(const CXXConditionDeclExpr *) { return true; }
650
651  // Iterators
652  virtual child_iterator child_begin();
653  virtual child_iterator child_end();
654};
655
656/// CXXNewExpr - A new expression for memory allocation and constructor calls,
657/// e.g: "new CXXNewExpr(foo)".
658class CXXNewExpr : public Expr {
659  // Was the usage ::new, i.e. is the global new to be used?
660  bool GlobalNew : 1;
661  // Was the form (type-id) used? Otherwise, it was new-type-id.
662  bool ParenTypeId : 1;
663  // Is there an initializer? If not, built-ins are uninitialized, else they're
664  // value-initialized.
665  bool Initializer : 1;
666  // Do we allocate an array? If so, the first SubExpr is the size expression.
667  bool Array : 1;
668  // The number of placement new arguments.
669  unsigned NumPlacementArgs : 14;
670  // The number of constructor arguments. This may be 1 even for non-class
671  // types; use the pseudo copy constructor.
672  unsigned NumConstructorArgs : 14;
673  // Contains an optional array size expression, any number of optional
674  // placement arguments, and any number of optional constructor arguments,
675  // in that order.
676  Stmt **SubExprs;
677  // Points to the allocation function used.
678  FunctionDecl *OperatorNew;
679  // Points to the deallocation function used in case of error. May be null.
680  FunctionDecl *OperatorDelete;
681  // Points to the constructor used. Cannot be null if AllocType is a record;
682  // it would still point at the default constructor (even an implicit one).
683  // Must be null for all other types.
684  CXXConstructorDecl *Constructor;
685
686  SourceLocation StartLoc;
687  SourceLocation EndLoc;
688
689public:
690  CXXNewExpr(bool globalNew, FunctionDecl *operatorNew, Expr **placementArgs,
691             unsigned numPlaceArgs, bool ParenTypeId, Expr *arraySize,
692             CXXConstructorDecl *constructor, bool initializer,
693             Expr **constructorArgs, unsigned numConsArgs,
694             FunctionDecl *operatorDelete, QualType ty,
695             SourceLocation startLoc, SourceLocation endLoc);
696  ~CXXNewExpr() {
697    delete[] SubExprs;
698  }
699
700  QualType getAllocatedType() const {
701    assert(getType()->isPointerType());
702    return getType()->getAsPointerType()->getPointeeType();
703  }
704
705  FunctionDecl *getOperatorNew() const { return OperatorNew; }
706  FunctionDecl *getOperatorDelete() const { return OperatorDelete; }
707  CXXConstructorDecl *getConstructor() const { return Constructor; }
708
709  bool isArray() const { return Array; }
710  Expr *getArraySize() {
711    return Array ? cast<Expr>(SubExprs[0]) : 0;
712  }
713  const Expr *getArraySize() const {
714    return Array ? cast<Expr>(SubExprs[0]) : 0;
715  }
716
717  unsigned getNumPlacementArgs() const { return NumPlacementArgs; }
718  Expr *getPlacementArg(unsigned i) {
719    assert(i < NumPlacementArgs && "Index out of range");
720    return cast<Expr>(SubExprs[Array + i]);
721  }
722  const Expr *getPlacementArg(unsigned i) const {
723    assert(i < NumPlacementArgs && "Index out of range");
724    return cast<Expr>(SubExprs[Array + i]);
725  }
726
727  bool isGlobalNew() const { return GlobalNew; }
728  bool isParenTypeId() const { return ParenTypeId; }
729  bool hasInitializer() const { return Initializer; }
730
731  unsigned getNumConstructorArgs() const { return NumConstructorArgs; }
732  Expr *getConstructorArg(unsigned i) {
733    assert(i < NumConstructorArgs && "Index out of range");
734    return cast<Expr>(SubExprs[Array + NumPlacementArgs + i]);
735  }
736  const Expr *getConstructorArg(unsigned i) const {
737    assert(i < NumConstructorArgs && "Index out of range");
738    return cast<Expr>(SubExprs[Array + NumPlacementArgs + i]);
739  }
740
741  typedef ExprIterator arg_iterator;
742  typedef ConstExprIterator const_arg_iterator;
743
744  arg_iterator placement_arg_begin() {
745    return SubExprs + Array;
746  }
747  arg_iterator placement_arg_end() {
748    return SubExprs + Array + getNumPlacementArgs();
749  }
750  const_arg_iterator placement_arg_begin() const {
751    return SubExprs + Array;
752  }
753  const_arg_iterator placement_arg_end() const {
754    return SubExprs + Array + getNumPlacementArgs();
755  }
756
757  arg_iterator constructor_arg_begin() {
758    return SubExprs + Array + getNumPlacementArgs();
759  }
760  arg_iterator constructor_arg_end() {
761    return SubExprs + Array + getNumPlacementArgs() + getNumConstructorArgs();
762  }
763  const_arg_iterator constructor_arg_begin() const {
764    return SubExprs + Array + getNumPlacementArgs();
765  }
766  const_arg_iterator constructor_arg_end() const {
767    return SubExprs + Array + getNumPlacementArgs() + getNumConstructorArgs();
768  }
769
770  virtual SourceRange getSourceRange() const {
771    return SourceRange(StartLoc, EndLoc);
772  }
773
774  static bool classof(const Stmt *T) {
775    return T->getStmtClass() == CXXNewExprClass;
776  }
777  static bool classof(const CXXNewExpr *) { return true; }
778
779  // Iterators
780  virtual child_iterator child_begin();
781  virtual child_iterator child_end();
782};
783
784/// CXXDeleteExpr - A delete expression for memory deallocation and destructor
785/// calls, e.g. "delete[] pArray".
786class CXXDeleteExpr : public Expr {
787  // Is this a forced global delete, i.e. "::delete"?
788  bool GlobalDelete : 1;
789  // Is this the array form of delete, i.e. "delete[]"?
790  bool ArrayForm : 1;
791  // Points to the operator delete overload that is used. Could be a member.
792  FunctionDecl *OperatorDelete;
793  // The pointer expression to be deleted.
794  Stmt *Argument;
795  // Location of the expression.
796  SourceLocation Loc;
797public:
798  CXXDeleteExpr(QualType ty, bool globalDelete, bool arrayForm,
799                FunctionDecl *operatorDelete, Expr *arg, SourceLocation loc)
800    : Expr(CXXDeleteExprClass, ty, false, false), GlobalDelete(globalDelete),
801      ArrayForm(arrayForm), OperatorDelete(operatorDelete), Argument(arg),
802      Loc(loc) { }
803
804  bool isGlobalDelete() const { return GlobalDelete; }
805  bool isArrayForm() const { return ArrayForm; }
806
807  FunctionDecl *getOperatorDelete() const { return OperatorDelete; }
808
809  Expr *getArgument() { return cast<Expr>(Argument); }
810  const Expr *getArgument() const { return cast<Expr>(Argument); }
811
812  virtual SourceRange getSourceRange() const {
813    return SourceRange(Loc, Argument->getLocEnd());
814  }
815
816  static bool classof(const Stmt *T) {
817    return T->getStmtClass() == CXXDeleteExprClass;
818  }
819  static bool classof(const CXXDeleteExpr *) { return true; }
820
821  // Iterators
822  virtual child_iterator child_begin();
823  virtual child_iterator child_end();
824};
825
826/// \brief Represents the name of a function that has not been
827/// resolved to any declaration.
828///
829/// Unresolved function names occur when a function name is
830/// encountered prior to an open parentheses ('(') in a C++ function
831/// call, and the function name itself did not resolve to a
832/// declaration. These function names can only be resolved when they
833/// form the postfix-expression of a function call, so that
834/// argument-dependent lookup finds declarations corresponding to
835/// these functions.
836
837/// @code
838/// template<typename T> void f(T x) {
839///   g(x); // g is an unresolved function name (that is also a dependent name)
840/// }
841/// @endcode
842class UnresolvedFunctionNameExpr : public Expr {
843  /// The name that was present in the source
844  DeclarationName Name;
845
846  /// The location of this name in the source code
847  SourceLocation Loc;
848
849public:
850  UnresolvedFunctionNameExpr(DeclarationName N, QualType T, SourceLocation L)
851    : Expr(UnresolvedFunctionNameExprClass, T, false, false), Name(N), Loc(L) { }
852
853  /// \brief Retrieves the name that occurred in the source code.
854  DeclarationName getName() const { return Name; }
855
856  /// getLocation - Retrieves the location in the source code where
857  /// the name occurred.
858  SourceLocation getLocation() const { return Loc; }
859
860  virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
861
862  UnresolvedFunctionNameExpr* Clone(ASTContext &C) const;
863
864  static bool classof(const Stmt *T) {
865    return T->getStmtClass() == UnresolvedFunctionNameExprClass;
866  }
867  static bool classof(const UnresolvedFunctionNameExpr *) { return true; }
868
869  // Iterators
870  virtual child_iterator child_begin();
871  virtual child_iterator child_end();
872};
873
874/// UnaryTypeTraitExpr - A GCC or MS unary type trait, as used in the
875/// implementation of TR1/C++0x type trait templates.
876/// Example:
877/// __is_pod(int) == true
878/// __is_enum(std::string) == false
879class UnaryTypeTraitExpr : public Expr {
880  /// UTT - The trait.
881  UnaryTypeTrait UTT;
882
883  /// Loc - The location of the type trait keyword.
884  SourceLocation Loc;
885
886  /// RParen - The location of the closing paren.
887  SourceLocation RParen;
888
889  /// QueriedType - The type we're testing.
890  QualType QueriedType;
891
892public:
893  UnaryTypeTraitExpr(SourceLocation loc, UnaryTypeTrait utt, QualType queried,
894                     SourceLocation rparen, QualType ty)
895    : Expr(UnaryTypeTraitExprClass, ty, false, queried->isDependentType()),
896      UTT(utt), Loc(loc), RParen(rparen), QueriedType(queried) { }
897
898  virtual SourceRange getSourceRange() const { return SourceRange(Loc, RParen);}
899
900  UnaryTypeTrait getTrait() const { return UTT; }
901
902  QualType getQueriedType() const { return QueriedType; }
903
904  bool EvaluateTrait() const;
905
906  static bool classof(const Stmt *T) {
907    return T->getStmtClass() == UnaryTypeTraitExprClass;
908  }
909  static bool classof(const UnaryTypeTraitExpr *) { return true; }
910
911  // Iterators
912  virtual child_iterator child_begin();
913  virtual child_iterator child_end();
914};
915
916/// QualifiedDeclRefExpr - A reference to a declared variable,
917/// function, enum, etc., that includes a qualification, e.g.,
918/// "N::foo".
919class QualifiedDeclRefExpr : public DeclRefExpr {
920  /// QualifierRange - The source range that covers the
921  /// nested-name-specifier.
922  SourceRange QualifierRange;
923
924  /// \brief The nested-name-specifier that qualifies this declaration
925  /// name.
926  NestedNameSpecifier *NNS;
927
928public:
929  QualifiedDeclRefExpr(NamedDecl *d, QualType t, SourceLocation l, bool TD,
930                       bool VD, SourceRange R, NestedNameSpecifier *NNS)
931    : DeclRefExpr(QualifiedDeclRefExprClass, d, t, l, TD, VD),
932      QualifierRange(R), NNS(NNS) { }
933
934  /// \brief Retrieve the source range of the nested-name-specifier.
935  SourceRange getQualifierRange() const { return QualifierRange; }
936
937  /// \brief Retrieve the nested-name-specifier that qualifies this
938  /// declaration.
939  NestedNameSpecifier *getQualifier() const { return NNS; }
940
941  virtual SourceRange getSourceRange() const {
942    return SourceRange(QualifierRange.getBegin(), getLocation());
943  }
944
945  static bool classof(const Stmt *T) {
946    return T->getStmtClass() == QualifiedDeclRefExprClass;
947  }
948  static bool classof(const QualifiedDeclRefExpr *) { return true; }
949};
950
951/// \brief A qualified reference to a name whose declaration cannot
952/// yet be resolved.
953///
954/// UnresolvedDeclRefExpr is similar to QualifiedDeclRefExpr in that
955/// it expresses a qualified reference to a declaration such as
956/// X<T>::value. The difference, however, is that an
957/// UnresolvedDeclRefExpr node is used only within C++ templates when
958/// the qualification (e.g., X<T>::) refers to a dependent type. In
959/// this case, X<T>::value cannot resolve to a declaration because the
960/// declaration will differ from on instantiation of X<T> to the
961/// next. Therefore, UnresolvedDeclRefExpr keeps track of the
962/// qualifier (X<T>::) and the name of the entity being referenced
963/// ("value"). Such expressions will instantiate to
964/// QualifiedDeclRefExprs.
965class UnresolvedDeclRefExpr : public Expr {
966  /// The name of the entity we will be referencing.
967  DeclarationName Name;
968
969  /// Location of the name of the declaration we're referencing.
970  SourceLocation Loc;
971
972  /// QualifierRange - The source range that covers the
973  /// nested-name-specifier.
974  SourceRange QualifierRange;
975
976  /// \brief The nested-name-specifier that qualifies this unresolved
977  /// declaration name.
978  NestedNameSpecifier *NNS;
979
980public:
981  UnresolvedDeclRefExpr(DeclarationName N, QualType T, SourceLocation L,
982                        SourceRange R, NestedNameSpecifier *NNS)
983    : Expr(UnresolvedDeclRefExprClass, T, true, true),
984      Name(N), Loc(L), QualifierRange(R), NNS(NNS) { }
985
986  /// \brief Retrieve the name that this expression refers to.
987  DeclarationName getDeclName() const { return Name; }
988
989  /// \brief Retrieve the location of the name within the expression.
990  SourceLocation getLocation() const { return Loc; }
991
992  /// \brief Retrieve the source range of the nested-name-specifier.
993  SourceRange getQualifierRange() const { return QualifierRange; }
994
995  /// \brief Retrieve the nested-name-specifier that qualifies this
996  /// declaration.
997  NestedNameSpecifier *getQualifier() const { return NNS; }
998
999  virtual SourceRange getSourceRange() const {
1000    return SourceRange(QualifierRange.getBegin(), getLocation());
1001  }
1002
1003  static bool classof(const Stmt *T) {
1004    return T->getStmtClass() == UnresolvedDeclRefExprClass;
1005  }
1006  static bool classof(const UnresolvedDeclRefExpr *) { return true; }
1007
1008  virtual StmtIterator child_begin();
1009  virtual StmtIterator child_end();
1010};
1011
1012class CXXExprWithTemporaries : public Expr {
1013  Stmt *SubExpr;
1014
1015  CXXTempVarDecl **Decls;
1016  unsigned NumDecls;
1017
1018public:
1019  CXXExprWithTemporaries(Expr *subexpr, CXXTempVarDecl **decls,
1020                         unsigned numdecls);
1021  ~CXXExprWithTemporaries();
1022
1023  const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
1024  Expr *getSubExpr() { return cast<Expr>(SubExpr); }
1025
1026  virtual SourceRange getSourceRange() const { return SourceRange(); }
1027
1028  // Implement isa/cast/dyncast/etc.
1029  static bool classof(const Stmt *T) {
1030    return T->getStmtClass() == CXXExprWithTemporariesClass;
1031  }
1032  static bool classof(const CXXExprWithTemporaries *) { return true; }
1033
1034  // Iterators
1035  virtual child_iterator child_begin();
1036  virtual child_iterator child_end();
1037};
1038
1039/// \brief Describes an explicit type conversion that uses functional
1040/// notion but could not be resolved because one or more arguments are
1041/// type-dependent.
1042///
1043/// The explicit type conversions expressed by
1044/// CXXUnresolvedConstructExpr have the form \c T(a1, a2, ..., aN),
1045/// where \c T is some type and \c a1, a2, ..., aN are values, and
1046/// either \C T is a dependent type or one or more of the \c a's is
1047/// type-dependent. For example, this would occur in a template such
1048/// as:
1049///
1050/// \code
1051///   template<typename T, typename A1>
1052///   inline T make_a(const A1& a1) {
1053///     return T(a1);
1054///   }
1055/// \endcode
1056///
1057/// When the returned expression is instantiated, it may resolve to a
1058/// constructor call, conversion function call, or some kind of type
1059/// conversion.
1060class CXXUnresolvedConstructExpr : public Expr {
1061  /// \brief The starting location of the type
1062  SourceLocation TyBeginLoc;
1063
1064  /// \brief The type being constructed.
1065  QualType Type;
1066
1067  /// \brief The location of the left parentheses ('(').
1068  SourceLocation LParenLoc;
1069
1070  /// \brief The location of the right parentheses (')').
1071  SourceLocation RParenLoc;
1072
1073  /// \brief The number of arguments used to construct the type.
1074  unsigned NumArgs;
1075
1076  CXXUnresolvedConstructExpr(SourceLocation TyBegin,
1077                             QualType T,
1078                             SourceLocation LParenLoc,
1079                             Expr **Args,
1080                             unsigned NumArgs,
1081                             SourceLocation RParenLoc);
1082
1083public:
1084  static CXXUnresolvedConstructExpr *Create(ASTContext &C,
1085                                            SourceLocation TyBegin,
1086                                            QualType T,
1087                                            SourceLocation LParenLoc,
1088                                            Expr **Args,
1089                                            unsigned NumArgs,
1090                                            SourceLocation RParenLoc);
1091
1092  /// \brief Retrieve the source location where the type begins.
1093  SourceLocation getTypeBeginLoc() const { return TyBeginLoc; }
1094  void setTypeBeginLoc(SourceLocation L) { TyBeginLoc = L; }
1095
1096  /// \brief Retrieve the type that is being constructed, as specified
1097  /// in the source code.
1098  QualType getTypeAsWritten() const { return Type; }
1099  void setTypeAsWritten(QualType T) { Type = T; }
1100
1101  /// \brief Retrieve the location of the left parentheses ('(') that
1102  /// precedes the argument list.
1103  SourceLocation getLParenLoc() const { return LParenLoc; }
1104  void setLParenLoc(SourceLocation L) { LParenLoc = L; }
1105
1106  /// \brief Retrieve the location of the right parentheses (')') that
1107  /// follows the argument list.
1108  SourceLocation getRParenLoc() const { return RParenLoc; }
1109  void setRParenLoc(SourceLocation L) { RParenLoc = L; }
1110
1111  /// \brief Retrieve the number of arguments.
1112  unsigned arg_size() const { return NumArgs; }
1113
1114  typedef Expr** arg_iterator;
1115  arg_iterator arg_begin() { return reinterpret_cast<Expr**>(this + 1); }
1116  arg_iterator arg_end() { return arg_begin() + NumArgs; }
1117
1118  Expr *getArg(unsigned I) {
1119    assert(I < NumArgs && "Argument index out-of-range");
1120    return *(arg_begin() + I);
1121  }
1122
1123  virtual SourceRange getSourceRange() const {
1124    return SourceRange(TyBeginLoc, RParenLoc);
1125  }
1126  static bool classof(const Stmt *T) {
1127    return T->getStmtClass() == CXXUnresolvedConstructExprClass;
1128  }
1129  static bool classof(const CXXUnresolvedConstructExpr *) { return true; }
1130
1131  // Iterators
1132  virtual child_iterator child_begin();
1133  virtual child_iterator child_end();
1134};
1135
1136/// \brief
1137class CXXUnresolvedMemberExpr : public Expr {
1138  /// \brief The expression for the base pointer or class reference,
1139  /// e.g., the \c x in x.f.
1140  Stmt *Base;
1141
1142  /// \brief Whether this member expression used the '->' operator or
1143  /// the '.' operator.
1144  bool IsArrow;
1145
1146  /// \brief The location of the '->' or '.' operator.
1147  SourceLocation OperatorLoc;
1148
1149  /// \brief The member to which this member expression refers, which
1150  /// can be name, overloaded operator, or destructor.
1151  /// FIXME: could also be a template-id, and we might have a
1152  /// nested-name-specifier as well.
1153  DeclarationName Member;
1154
1155  /// \brief The location of the member name.
1156  SourceLocation MemberLoc;
1157
1158public:
1159  CXXUnresolvedMemberExpr(ASTContext &C,
1160                          Expr *Base, bool IsArrow,
1161                          SourceLocation OperatorLoc,
1162                          DeclarationName Member,
1163                          SourceLocation MemberLoc)
1164    : Expr(CXXUnresolvedMemberExprClass, C.DependentTy, true, true),
1165      Base(Base), IsArrow(IsArrow), OperatorLoc(OperatorLoc),
1166      Member(Member), MemberLoc(MemberLoc) { }
1167
1168  /// \brief Retrieve the base object of this member expressions,
1169  /// e.g., the \c x in \c x.m.
1170  Expr *getBase() { return cast<Expr>(Base); }
1171  void setBase(Expr *E) { Base = E; }
1172
1173  /// \brief Determine whether this member expression used the '->'
1174  /// operator; otherwise, it used the '.' operator.
1175  bool isArrow() const { return IsArrow; }
1176  void setArrow(bool A) { IsArrow = A; }
1177
1178  /// \brief Retrieve the location of the '->' or '.' operator.
1179  SourceLocation getOperatorLoc() const { return OperatorLoc; }
1180  void setOperatorLoc(SourceLocation L) { OperatorLoc = L; }
1181
1182  /// \brief Retrieve the name of the member that this expression
1183  /// refers to.
1184  DeclarationName getMember() const { return Member; }
1185  void setMember(DeclarationName N) { Member = N; }
1186
1187  // \brief Retrieve the location of the name of the member that this
1188  // expression refers to.
1189  SourceLocation getMemberLoc() const { return MemberLoc; }
1190  void setMemberLoc(SourceLocation L) { MemberLoc = L; }
1191
1192  virtual SourceRange getSourceRange() const {
1193    return SourceRange(Base->getSourceRange().getBegin(),
1194                       MemberLoc);
1195  }
1196  static bool classof(const Stmt *T) {
1197    return T->getStmtClass() == CXXUnresolvedMemberExprClass;
1198  }
1199  static bool classof(const CXXUnresolvedMemberExpr *) { return true; }
1200
1201  // Iterators
1202  virtual child_iterator child_begin();
1203  virtual child_iterator child_end();
1204};
1205
1206}  // end namespace clang
1207
1208#endif
1209