Home | History | Annotate | Download | only in AST
      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/Basic/ExpressionTraits.h"
     19 #include "clang/AST/Expr.h"
     20 #include "clang/AST/UnresolvedSet.h"
     21 #include "clang/AST/TemplateBase.h"
     22 
     23 namespace clang {
     24 
     25 class CXXConstructorDecl;
     26 class CXXDestructorDecl;
     27 class CXXMethodDecl;
     28 class CXXTemporary;
     29 class TemplateArgumentListInfo;
     30 
     31 //===--------------------------------------------------------------------===//
     32 // C++ Expressions.
     33 //===--------------------------------------------------------------------===//
     34 
     35 /// \brief A call to an overloaded operator written using operator
     36 /// syntax.
     37 ///
     38 /// Represents a call to an overloaded operator written using operator
     39 /// syntax, e.g., "x + y" or "*p". While semantically equivalent to a
     40 /// normal call, this AST node provides better information about the
     41 /// syntactic representation of the call.
     42 ///
     43 /// In a C++ template, this expression node kind will be used whenever
     44 /// any of the arguments are type-dependent. In this case, the
     45 /// function itself will be a (possibly empty) set of functions and
     46 /// function templates that were found by name lookup at template
     47 /// definition time.
     48 class CXXOperatorCallExpr : public CallExpr {
     49   /// \brief The overloaded operator.
     50   OverloadedOperatorKind Operator;
     51 
     52 public:
     53   CXXOperatorCallExpr(ASTContext& C, OverloadedOperatorKind Op, Expr *fn,
     54                       Expr **args, unsigned numargs, QualType t,
     55                       ExprValueKind VK, SourceLocation operatorloc)
     56     : CallExpr(C, CXXOperatorCallExprClass, fn, 0, args, numargs, t, VK,
     57                operatorloc),
     58       Operator(Op) {}
     59   explicit CXXOperatorCallExpr(ASTContext& C, EmptyShell Empty) :
     60     CallExpr(C, CXXOperatorCallExprClass, Empty) { }
     61 
     62 
     63   /// getOperator - Returns the kind of overloaded operator that this
     64   /// expression refers to.
     65   OverloadedOperatorKind getOperator() const { return Operator; }
     66   void setOperator(OverloadedOperatorKind Kind) { Operator = Kind; }
     67 
     68   /// getOperatorLoc - Returns the location of the operator symbol in
     69   /// the expression. When @c getOperator()==OO_Call, this is the
     70   /// location of the right parentheses; when @c
     71   /// getOperator()==OO_Subscript, this is the location of the right
     72   /// bracket.
     73   SourceLocation getOperatorLoc() const { return getRParenLoc(); }
     74 
     75   SourceRange getSourceRange() const;
     76 
     77   static bool classof(const Stmt *T) {
     78     return T->getStmtClass() == CXXOperatorCallExprClass;
     79   }
     80   static bool classof(const CXXOperatorCallExpr *) { return true; }
     81 };
     82 
     83 /// CXXMemberCallExpr - Represents a call to a member function that
     84 /// may be written either with member call syntax (e.g., "obj.func()"
     85 /// or "objptr->func()") or with normal function-call syntax
     86 /// ("func()") within a member function that ends up calling a member
     87 /// function. The callee in either case is a MemberExpr that contains
     88 /// both the object argument and the member function, while the
     89 /// arguments are the arguments within the parentheses (not including
     90 /// the object argument).
     91 class CXXMemberCallExpr : public CallExpr {
     92 public:
     93   CXXMemberCallExpr(ASTContext &C, Expr *fn, Expr **args, unsigned numargs,
     94                     QualType t, ExprValueKind VK, SourceLocation RP)
     95     : CallExpr(C, CXXMemberCallExprClass, fn, 0, args, numargs, t, VK, RP) {}
     96 
     97   CXXMemberCallExpr(ASTContext &C, EmptyShell Empty)
     98     : CallExpr(C, CXXMemberCallExprClass, Empty) { }
     99 
    100   /// getImplicitObjectArgument - Retrieves the implicit object
    101   /// argument for the member call. For example, in "x.f(5)", this
    102   /// operation would return "x".
    103   Expr *getImplicitObjectArgument() const;
    104 
    105   /// Retrieves the declaration of the called method.
    106   CXXMethodDecl *getMethodDecl() const;
    107 
    108   /// getRecordDecl - Retrieves the CXXRecordDecl for the underlying type of
    109   /// the implicit object argument. Note that this is may not be the same
    110   /// declaration as that of the class context of the CXXMethodDecl which this
    111   /// function is calling.
    112   /// FIXME: Returns 0 for member pointer call exprs.
    113   CXXRecordDecl *getRecordDecl();
    114 
    115   static bool classof(const Stmt *T) {
    116     return T->getStmtClass() == CXXMemberCallExprClass;
    117   }
    118   static bool classof(const CXXMemberCallExpr *) { return true; }
    119 };
    120 
    121 /// CUDAKernelCallExpr - Represents a call to a CUDA kernel function.
    122 class CUDAKernelCallExpr : public CallExpr {
    123 private:
    124   enum { CONFIG, END_PREARG };
    125 
    126 public:
    127   CUDAKernelCallExpr(ASTContext &C, Expr *fn, CallExpr *Config,
    128                      Expr **args, unsigned numargs, QualType t,
    129                      ExprValueKind VK, SourceLocation RP)
    130     : CallExpr(C, CUDAKernelCallExprClass, fn, END_PREARG, args, numargs, t, VK,
    131                RP) {
    132     setConfig(Config);
    133   }
    134 
    135   CUDAKernelCallExpr(ASTContext &C, EmptyShell Empty)
    136     : CallExpr(C, CUDAKernelCallExprClass, END_PREARG, Empty) { }
    137 
    138   const CallExpr *getConfig() const {
    139     return cast_or_null<CallExpr>(getPreArg(CONFIG));
    140   }
    141   CallExpr *getConfig() { return cast_or_null<CallExpr>(getPreArg(CONFIG)); }
    142   void setConfig(CallExpr *E) { setPreArg(CONFIG, E); }
    143 
    144   static bool classof(const Stmt *T) {
    145     return T->getStmtClass() == CUDAKernelCallExprClass;
    146   }
    147   static bool classof(const CUDAKernelCallExpr *) { return true; }
    148 };
    149 
    150 /// CXXNamedCastExpr - Abstract class common to all of the C++ "named"
    151 /// casts, @c static_cast, @c dynamic_cast, @c reinterpret_cast, or @c
    152 /// const_cast.
    153 ///
    154 /// This abstract class is inherited by all of the classes
    155 /// representing "named" casts, e.g., CXXStaticCastExpr,
    156 /// CXXDynamicCastExpr, CXXReinterpretCastExpr, and CXXConstCastExpr.
    157 class CXXNamedCastExpr : public ExplicitCastExpr {
    158 private:
    159   SourceLocation Loc; // the location of the casting op
    160   SourceLocation RParenLoc; // the location of the right parenthesis
    161 
    162 protected:
    163   CXXNamedCastExpr(StmtClass SC, QualType ty, ExprValueKind VK,
    164                    CastKind kind, Expr *op, unsigned PathSize,
    165                    TypeSourceInfo *writtenTy, SourceLocation l,
    166                    SourceLocation RParenLoc)
    167     : ExplicitCastExpr(SC, ty, VK, kind, op, PathSize, writtenTy), Loc(l),
    168       RParenLoc(RParenLoc) {}
    169 
    170   explicit CXXNamedCastExpr(StmtClass SC, EmptyShell Shell, unsigned PathSize)
    171     : ExplicitCastExpr(SC, Shell, PathSize) { }
    172 
    173   friend class ASTStmtReader;
    174 
    175 public:
    176   const char *getCastName() const;
    177 
    178   /// \brief Retrieve the location of the cast operator keyword, e.g.,
    179   /// "static_cast".
    180   SourceLocation getOperatorLoc() const { return Loc; }
    181 
    182   /// \brief Retrieve the location of the closing parenthesis.
    183   SourceLocation getRParenLoc() const { return RParenLoc; }
    184 
    185   SourceRange getSourceRange() const {
    186     return SourceRange(Loc, RParenLoc);
    187   }
    188   static bool classof(const Stmt *T) {
    189     switch (T->getStmtClass()) {
    190     case CXXStaticCastExprClass:
    191     case CXXDynamicCastExprClass:
    192     case CXXReinterpretCastExprClass:
    193     case CXXConstCastExprClass:
    194       return true;
    195     default:
    196       return false;
    197     }
    198   }
    199   static bool classof(const CXXNamedCastExpr *) { return true; }
    200 };
    201 
    202 /// CXXStaticCastExpr - A C++ @c static_cast expression (C++ [expr.static.cast]).
    203 ///
    204 /// This expression node represents a C++ static cast, e.g.,
    205 /// @c static_cast<int>(1.0).
    206 class CXXStaticCastExpr : public CXXNamedCastExpr {
    207   CXXStaticCastExpr(QualType ty, ExprValueKind vk, CastKind kind, Expr *op,
    208                     unsigned pathSize, TypeSourceInfo *writtenTy,
    209                     SourceLocation l, SourceLocation RParenLoc)
    210     : CXXNamedCastExpr(CXXStaticCastExprClass, ty, vk, kind, op, pathSize,
    211                        writtenTy, l, RParenLoc) {}
    212 
    213   explicit CXXStaticCastExpr(EmptyShell Empty, unsigned PathSize)
    214     : CXXNamedCastExpr(CXXStaticCastExprClass, Empty, PathSize) { }
    215 
    216 public:
    217   static CXXStaticCastExpr *Create(ASTContext &Context, QualType T,
    218                                    ExprValueKind VK, CastKind K, Expr *Op,
    219                                    const CXXCastPath *Path,
    220                                    TypeSourceInfo *Written, SourceLocation L,
    221                                    SourceLocation RParenLoc);
    222   static CXXStaticCastExpr *CreateEmpty(ASTContext &Context,
    223                                         unsigned PathSize);
    224 
    225   static bool classof(const Stmt *T) {
    226     return T->getStmtClass() == CXXStaticCastExprClass;
    227   }
    228   static bool classof(const CXXStaticCastExpr *) { return true; }
    229 };
    230 
    231 /// CXXDynamicCastExpr - A C++ @c dynamic_cast expression
    232 /// (C++ [expr.dynamic.cast]), which may perform a run-time check to
    233 /// determine how to perform the type cast.
    234 ///
    235 /// This expression node represents a dynamic cast, e.g.,
    236 /// @c dynamic_cast<Derived*>(BasePtr).
    237 class CXXDynamicCastExpr : public CXXNamedCastExpr {
    238   CXXDynamicCastExpr(QualType ty, ExprValueKind VK, CastKind kind,
    239                      Expr *op, unsigned pathSize, TypeSourceInfo *writtenTy,
    240                      SourceLocation l, SourceLocation RParenLoc)
    241     : CXXNamedCastExpr(CXXDynamicCastExprClass, ty, VK, kind, op, pathSize,
    242                        writtenTy, l, RParenLoc) {}
    243 
    244   explicit CXXDynamicCastExpr(EmptyShell Empty, unsigned pathSize)
    245     : CXXNamedCastExpr(CXXDynamicCastExprClass, Empty, pathSize) { }
    246 
    247 public:
    248   static CXXDynamicCastExpr *Create(ASTContext &Context, QualType T,
    249                                     ExprValueKind VK, CastKind Kind, Expr *Op,
    250                                     const CXXCastPath *Path,
    251                                     TypeSourceInfo *Written, SourceLocation L,
    252                                     SourceLocation RParenLoc);
    253 
    254   static CXXDynamicCastExpr *CreateEmpty(ASTContext &Context,
    255                                          unsigned pathSize);
    256 
    257   bool isAlwaysNull() const;
    258 
    259   static bool classof(const Stmt *T) {
    260     return T->getStmtClass() == CXXDynamicCastExprClass;
    261   }
    262   static bool classof(const CXXDynamicCastExpr *) { return true; }
    263 };
    264 
    265 /// CXXReinterpretCastExpr - A C++ @c reinterpret_cast expression (C++
    266 /// [expr.reinterpret.cast]), which provides a differently-typed view
    267 /// of a value but performs no actual work at run time.
    268 ///
    269 /// This expression node represents a reinterpret cast, e.g.,
    270 /// @c reinterpret_cast<int>(VoidPtr).
    271 class CXXReinterpretCastExpr : public CXXNamedCastExpr {
    272   CXXReinterpretCastExpr(QualType ty, ExprValueKind vk, CastKind kind,
    273                          Expr *op, unsigned pathSize,
    274                          TypeSourceInfo *writtenTy, SourceLocation l,
    275                          SourceLocation RParenLoc)
    276     : CXXNamedCastExpr(CXXReinterpretCastExprClass, ty, vk, kind, op,
    277                        pathSize, writtenTy, l, RParenLoc) {}
    278 
    279   CXXReinterpretCastExpr(EmptyShell Empty, unsigned pathSize)
    280     : CXXNamedCastExpr(CXXReinterpretCastExprClass, Empty, pathSize) { }
    281 
    282 public:
    283   static CXXReinterpretCastExpr *Create(ASTContext &Context, QualType T,
    284                                         ExprValueKind VK, CastKind Kind,
    285                                         Expr *Op, const CXXCastPath *Path,
    286                                  TypeSourceInfo *WrittenTy, SourceLocation L,
    287                                         SourceLocation RParenLoc);
    288   static CXXReinterpretCastExpr *CreateEmpty(ASTContext &Context,
    289                                              unsigned pathSize);
    290 
    291   static bool classof(const Stmt *T) {
    292     return T->getStmtClass() == CXXReinterpretCastExprClass;
    293   }
    294   static bool classof(const CXXReinterpretCastExpr *) { return true; }
    295 };
    296 
    297 /// CXXConstCastExpr - A C++ @c const_cast expression (C++ [expr.const.cast]),
    298 /// which can remove type qualifiers but does not change the underlying value.
    299 ///
    300 /// This expression node represents a const cast, e.g.,
    301 /// @c const_cast<char*>(PtrToConstChar).
    302 class CXXConstCastExpr : public CXXNamedCastExpr {
    303   CXXConstCastExpr(QualType ty, ExprValueKind VK, Expr *op,
    304                    TypeSourceInfo *writtenTy, SourceLocation l,
    305                    SourceLocation RParenLoc)
    306     : CXXNamedCastExpr(CXXConstCastExprClass, ty, VK, CK_NoOp, op,
    307                        0, writtenTy, l, RParenLoc) {}
    308 
    309   explicit CXXConstCastExpr(EmptyShell Empty)
    310     : CXXNamedCastExpr(CXXConstCastExprClass, Empty, 0) { }
    311 
    312 public:
    313   static CXXConstCastExpr *Create(ASTContext &Context, QualType T,
    314                                   ExprValueKind VK, Expr *Op,
    315                                   TypeSourceInfo *WrittenTy, SourceLocation L,
    316                                   SourceLocation RParenLoc);
    317   static CXXConstCastExpr *CreateEmpty(ASTContext &Context);
    318 
    319   static bool classof(const Stmt *T) {
    320     return T->getStmtClass() == CXXConstCastExprClass;
    321   }
    322   static bool classof(const CXXConstCastExpr *) { return true; }
    323 };
    324 
    325 /// CXXBoolLiteralExpr - [C++ 2.13.5] C++ Boolean Literal.
    326 ///
    327 class CXXBoolLiteralExpr : public Expr {
    328   bool Value;
    329   SourceLocation Loc;
    330 public:
    331   CXXBoolLiteralExpr(bool val, QualType Ty, SourceLocation l) :
    332     Expr(CXXBoolLiteralExprClass, Ty, VK_RValue, OK_Ordinary, false, false,
    333          false, false),
    334     Value(val), Loc(l) {}
    335 
    336   explicit CXXBoolLiteralExpr(EmptyShell Empty)
    337     : Expr(CXXBoolLiteralExprClass, Empty) { }
    338 
    339   bool getValue() const { return Value; }
    340   void setValue(bool V) { Value = V; }
    341 
    342   SourceRange getSourceRange() const { return SourceRange(Loc); }
    343 
    344   SourceLocation getLocation() const { return Loc; }
    345   void setLocation(SourceLocation L) { Loc = L; }
    346 
    347   static bool classof(const Stmt *T) {
    348     return T->getStmtClass() == CXXBoolLiteralExprClass;
    349   }
    350   static bool classof(const CXXBoolLiteralExpr *) { return true; }
    351 
    352   // Iterators
    353   child_range children() { return child_range(); }
    354 };
    355 
    356 /// CXXNullPtrLiteralExpr - [C++0x 2.14.7] C++ Pointer Literal
    357 class CXXNullPtrLiteralExpr : public Expr {
    358   SourceLocation Loc;
    359 public:
    360   CXXNullPtrLiteralExpr(QualType Ty, SourceLocation l) :
    361     Expr(CXXNullPtrLiteralExprClass, Ty, VK_RValue, OK_Ordinary, false, false,
    362          false, false),
    363     Loc(l) {}
    364 
    365   explicit CXXNullPtrLiteralExpr(EmptyShell Empty)
    366     : Expr(CXXNullPtrLiteralExprClass, Empty) { }
    367 
    368   SourceRange getSourceRange() const { return SourceRange(Loc); }
    369 
    370   SourceLocation getLocation() const { return Loc; }
    371   void setLocation(SourceLocation L) { Loc = L; }
    372 
    373   static bool classof(const Stmt *T) {
    374     return T->getStmtClass() == CXXNullPtrLiteralExprClass;
    375   }
    376   static bool classof(const CXXNullPtrLiteralExpr *) { return true; }
    377 
    378   child_range children() { return child_range(); }
    379 };
    380 
    381 /// CXXTypeidExpr - A C++ @c typeid expression (C++ [expr.typeid]), which gets
    382 /// the type_info that corresponds to the supplied type, or the (possibly
    383 /// dynamic) type of the supplied expression.
    384 ///
    385 /// This represents code like @c typeid(int) or @c typeid(*objPtr)
    386 class CXXTypeidExpr : public Expr {
    387 private:
    388   llvm::PointerUnion<Stmt *, TypeSourceInfo *> Operand;
    389   SourceRange Range;
    390 
    391 public:
    392   CXXTypeidExpr(QualType Ty, TypeSourceInfo *Operand, SourceRange R)
    393     : Expr(CXXTypeidExprClass, Ty, VK_LValue, OK_Ordinary,
    394            // typeid is never type-dependent (C++ [temp.dep.expr]p4)
    395            false,
    396            // typeid is value-dependent if the type or expression are dependent
    397            Operand->getType()->isDependentType(),
    398            Operand->getType()->isInstantiationDependentType(),
    399            Operand->getType()->containsUnexpandedParameterPack()),
    400       Operand(Operand), Range(R) { }
    401 
    402   CXXTypeidExpr(QualType Ty, Expr *Operand, SourceRange R)
    403     : Expr(CXXTypeidExprClass, Ty, VK_LValue, OK_Ordinary,
    404         // typeid is never type-dependent (C++ [temp.dep.expr]p4)
    405            false,
    406         // typeid is value-dependent if the type or expression are dependent
    407            Operand->isTypeDependent() || Operand->isValueDependent(),
    408            Operand->isInstantiationDependent(),
    409            Operand->containsUnexpandedParameterPack()),
    410       Operand(Operand), Range(R) { }
    411 
    412   CXXTypeidExpr(EmptyShell Empty, bool isExpr)
    413     : Expr(CXXTypeidExprClass, Empty) {
    414     if (isExpr)
    415       Operand = (Expr*)0;
    416     else
    417       Operand = (TypeSourceInfo*)0;
    418   }
    419 
    420   bool isTypeOperand() const { return Operand.is<TypeSourceInfo *>(); }
    421 
    422   /// \brief Retrieves the type operand of this typeid() expression after
    423   /// various required adjustments (removing reference types, cv-qualifiers).
    424   QualType getTypeOperand() const;
    425 
    426   /// \brief Retrieve source information for the type operand.
    427   TypeSourceInfo *getTypeOperandSourceInfo() const {
    428     assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
    429     return Operand.get<TypeSourceInfo *>();
    430   }
    431 
    432   void setTypeOperandSourceInfo(TypeSourceInfo *TSI) {
    433     assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
    434     Operand = TSI;
    435   }
    436 
    437   Expr *getExprOperand() const {
    438     assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)");
    439     return static_cast<Expr*>(Operand.get<Stmt *>());
    440   }
    441 
    442   void setExprOperand(Expr *E) {
    443     assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)");
    444     Operand = E;
    445   }
    446 
    447   SourceRange getSourceRange() const { return Range; }
    448   void setSourceRange(SourceRange R) { Range = R; }
    449 
    450   static bool classof(const Stmt *T) {
    451     return T->getStmtClass() == CXXTypeidExprClass;
    452   }
    453   static bool classof(const CXXTypeidExpr *) { return true; }
    454 
    455   // Iterators
    456   child_range children() {
    457     if (isTypeOperand()) return child_range();
    458     Stmt **begin = reinterpret_cast<Stmt**>(&Operand);
    459     return child_range(begin, begin + 1);
    460   }
    461 };
    462 
    463 /// CXXUuidofExpr - A microsoft C++ @c __uuidof expression, which gets
    464 /// the _GUID that corresponds to the supplied type or expression.
    465 ///
    466 /// This represents code like @c __uuidof(COMTYPE) or @c __uuidof(*comPtr)
    467 class CXXUuidofExpr : public Expr {
    468 private:
    469   llvm::PointerUnion<Stmt *, TypeSourceInfo *> Operand;
    470   SourceRange Range;
    471 
    472 public:
    473   CXXUuidofExpr(QualType Ty, TypeSourceInfo *Operand, SourceRange R)
    474     : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary,
    475            false, Operand->getType()->isDependentType(),
    476            Operand->getType()->isInstantiationDependentType(),
    477            Operand->getType()->containsUnexpandedParameterPack()),
    478       Operand(Operand), Range(R) { }
    479 
    480   CXXUuidofExpr(QualType Ty, Expr *Operand, SourceRange R)
    481     : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary,
    482            false, Operand->isTypeDependent(),
    483            Operand->isInstantiationDependent(),
    484            Operand->containsUnexpandedParameterPack()),
    485       Operand(Operand), Range(R) { }
    486 
    487   CXXUuidofExpr(EmptyShell Empty, bool isExpr)
    488     : Expr(CXXUuidofExprClass, Empty) {
    489     if (isExpr)
    490       Operand = (Expr*)0;
    491     else
    492       Operand = (TypeSourceInfo*)0;
    493   }
    494 
    495   bool isTypeOperand() const { return Operand.is<TypeSourceInfo *>(); }
    496 
    497   /// \brief Retrieves the type operand of this __uuidof() expression after
    498   /// various required adjustments (removing reference types, cv-qualifiers).
    499   QualType getTypeOperand() const;
    500 
    501   /// \brief Retrieve source information for the type operand.
    502   TypeSourceInfo *getTypeOperandSourceInfo() const {
    503     assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)");
    504     return Operand.get<TypeSourceInfo *>();
    505   }
    506 
    507   void setTypeOperandSourceInfo(TypeSourceInfo *TSI) {
    508     assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)");
    509     Operand = TSI;
    510   }
    511 
    512   Expr *getExprOperand() const {
    513     assert(!isTypeOperand() && "Cannot call getExprOperand for __uuidof(type)");
    514     return static_cast<Expr*>(Operand.get<Stmt *>());
    515   }
    516 
    517   void setExprOperand(Expr *E) {
    518     assert(!isTypeOperand() && "Cannot call getExprOperand for __uuidof(type)");
    519     Operand = E;
    520   }
    521 
    522   SourceRange getSourceRange() const { return Range; }
    523   void setSourceRange(SourceRange R) { Range = R; }
    524 
    525   static bool classof(const Stmt *T) {
    526     return T->getStmtClass() == CXXUuidofExprClass;
    527   }
    528   static bool classof(const CXXUuidofExpr *) { return true; }
    529 
    530   // Iterators
    531   child_range children() {
    532     if (isTypeOperand()) return child_range();
    533     Stmt **begin = reinterpret_cast<Stmt**>(&Operand);
    534     return child_range(begin, begin + 1);
    535   }
    536 };
    537 
    538 /// CXXThisExpr - Represents the "this" expression in C++, which is a
    539 /// pointer to the object on which the current member function is
    540 /// executing (C++ [expr.prim]p3). Example:
    541 ///
    542 /// @code
    543 /// class Foo {
    544 /// public:
    545 ///   void bar();
    546 ///   void test() { this->bar(); }
    547 /// };
    548 /// @endcode
    549 class CXXThisExpr : public Expr {
    550   SourceLocation Loc;
    551   bool Implicit : 1;
    552 
    553 public:
    554   CXXThisExpr(SourceLocation L, QualType Type, bool isImplicit)
    555     : Expr(CXXThisExprClass, Type, VK_RValue, OK_Ordinary,
    556            // 'this' is type-dependent if the class type of the enclosing
    557            // member function is dependent (C++ [temp.dep.expr]p2)
    558            Type->isDependentType(), Type->isDependentType(),
    559            Type->isInstantiationDependentType(),
    560            /*ContainsUnexpandedParameterPack=*/false),
    561       Loc(L), Implicit(isImplicit) { }
    562 
    563   CXXThisExpr(EmptyShell Empty) : Expr(CXXThisExprClass, Empty) {}
    564 
    565   SourceLocation getLocation() const { return Loc; }
    566   void setLocation(SourceLocation L) { Loc = L; }
    567 
    568   SourceRange getSourceRange() const { return SourceRange(Loc); }
    569 
    570   bool isImplicit() const { return Implicit; }
    571   void setImplicit(bool I) { Implicit = I; }
    572 
    573   static bool classof(const Stmt *T) {
    574     return T->getStmtClass() == CXXThisExprClass;
    575   }
    576   static bool classof(const CXXThisExpr *) { return true; }
    577 
    578   // Iterators
    579   child_range children() { return child_range(); }
    580 };
    581 
    582 ///  CXXThrowExpr - [C++ 15] C++ Throw Expression.  This handles
    583 ///  'throw' and 'throw' assignment-expression.  When
    584 ///  assignment-expression isn't present, Op will be null.
    585 ///
    586 class CXXThrowExpr : public Expr {
    587   Stmt *Op;
    588   SourceLocation ThrowLoc;
    589   /// \brief Whether the thrown variable (if any) is in scope.
    590   unsigned IsThrownVariableInScope : 1;
    591 
    592   friend class ASTStmtReader;
    593 
    594 public:
    595   // Ty is the void type which is used as the result type of the
    596   // exepression.  The l is the location of the throw keyword.  expr
    597   // can by null, if the optional expression to throw isn't present.
    598   CXXThrowExpr(Expr *expr, QualType Ty, SourceLocation l,
    599                bool IsThrownVariableInScope) :
    600     Expr(CXXThrowExprClass, Ty, VK_RValue, OK_Ordinary, false, false,
    601          expr && expr->isInstantiationDependent(),
    602          expr && expr->containsUnexpandedParameterPack()),
    603     Op(expr), ThrowLoc(l), IsThrownVariableInScope(IsThrownVariableInScope) {}
    604   CXXThrowExpr(EmptyShell Empty) : Expr(CXXThrowExprClass, Empty) {}
    605 
    606   const Expr *getSubExpr() const { return cast_or_null<Expr>(Op); }
    607   Expr *getSubExpr() { return cast_or_null<Expr>(Op); }
    608 
    609   SourceLocation getThrowLoc() const { return ThrowLoc; }
    610 
    611   /// \brief Determines whether the variable thrown by this expression (if any!)
    612   /// is within the innermost try block.
    613   ///
    614   /// This information is required to determine whether the NRVO can apply to
    615   /// this variable.
    616   bool isThrownVariableInScope() const { return IsThrownVariableInScope; }
    617 
    618   SourceRange getSourceRange() const {
    619     if (getSubExpr() == 0)
    620       return SourceRange(ThrowLoc, ThrowLoc);
    621     return SourceRange(ThrowLoc, getSubExpr()->getSourceRange().getEnd());
    622   }
    623 
    624   static bool classof(const Stmt *T) {
    625     return T->getStmtClass() == CXXThrowExprClass;
    626   }
    627   static bool classof(const CXXThrowExpr *) { return true; }
    628 
    629   // Iterators
    630   child_range children() {
    631     return child_range(&Op, Op ? &Op+1 : &Op);
    632   }
    633 };
    634 
    635 /// CXXDefaultArgExpr - C++ [dcl.fct.default]. This wraps up a
    636 /// function call argument that was created from the corresponding
    637 /// parameter's default argument, when the call did not explicitly
    638 /// supply arguments for all of the parameters.
    639 class CXXDefaultArgExpr : public Expr {
    640   /// \brief The parameter whose default is being used.
    641   ///
    642   /// When the bit is set, the subexpression is stored after the
    643   /// CXXDefaultArgExpr itself. When the bit is clear, the parameter's
    644   /// actual default expression is the subexpression.
    645   llvm::PointerIntPair<ParmVarDecl *, 1, bool> Param;
    646 
    647   /// \brief The location where the default argument expression was used.
    648   SourceLocation Loc;
    649 
    650   CXXDefaultArgExpr(StmtClass SC, SourceLocation Loc, ParmVarDecl *param)
    651     : Expr(SC,
    652            param->hasUnparsedDefaultArg()
    653              ? param->getType().getNonReferenceType()
    654              : param->getDefaultArg()->getType(),
    655            param->getDefaultArg()->getValueKind(),
    656            param->getDefaultArg()->getObjectKind(), false, false, false, false),
    657       Param(param, false), Loc(Loc) { }
    658 
    659   CXXDefaultArgExpr(StmtClass SC, SourceLocation Loc, ParmVarDecl *param,
    660                     Expr *SubExpr)
    661     : Expr(SC, SubExpr->getType(),
    662            SubExpr->getValueKind(), SubExpr->getObjectKind(),
    663            false, false, false, false),
    664       Param(param, true), Loc(Loc) {
    665     *reinterpret_cast<Expr **>(this + 1) = SubExpr;
    666   }
    667 
    668 public:
    669   CXXDefaultArgExpr(EmptyShell Empty) : Expr(CXXDefaultArgExprClass, Empty) {}
    670 
    671 
    672   // Param is the parameter whose default argument is used by this
    673   // expression.
    674   static CXXDefaultArgExpr *Create(ASTContext &C, SourceLocation Loc,
    675                                    ParmVarDecl *Param) {
    676     return new (C) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param);
    677   }
    678 
    679   // Param is the parameter whose default argument is used by this
    680   // expression, and SubExpr is the expression that will actually be used.
    681   static CXXDefaultArgExpr *Create(ASTContext &C,
    682                                    SourceLocation Loc,
    683                                    ParmVarDecl *Param,
    684                                    Expr *SubExpr);
    685 
    686   // Retrieve the parameter that the argument was created from.
    687   const ParmVarDecl *getParam() const { return Param.getPointer(); }
    688   ParmVarDecl *getParam() { return Param.getPointer(); }
    689 
    690   // Retrieve the actual argument to the function call.
    691   const Expr *getExpr() const {
    692     if (Param.getInt())
    693       return *reinterpret_cast<Expr const * const*> (this + 1);
    694     return getParam()->getDefaultArg();
    695   }
    696   Expr *getExpr() {
    697     if (Param.getInt())
    698       return *reinterpret_cast<Expr **> (this + 1);
    699     return getParam()->getDefaultArg();
    700   }
    701 
    702   /// \brief Retrieve the location where this default argument was actually
    703   /// used.
    704   SourceLocation getUsedLocation() const { return Loc; }
    705 
    706   SourceRange getSourceRange() const {
    707     // Default argument expressions have no representation in the
    708     // source, so they have an empty source range.
    709     return SourceRange();
    710   }
    711 
    712   static bool classof(const Stmt *T) {
    713     return T->getStmtClass() == CXXDefaultArgExprClass;
    714   }
    715   static bool classof(const CXXDefaultArgExpr *) { return true; }
    716 
    717   // Iterators
    718   child_range children() { return child_range(); }
    719 
    720   friend class ASTStmtReader;
    721   friend class ASTStmtWriter;
    722 };
    723 
    724 /// CXXTemporary - Represents a C++ temporary.
    725 class CXXTemporary {
    726   /// Destructor - The destructor that needs to be called.
    727   const CXXDestructorDecl *Destructor;
    728 
    729   CXXTemporary(const CXXDestructorDecl *destructor)
    730     : Destructor(destructor) { }
    731 
    732 public:
    733   static CXXTemporary *Create(ASTContext &C,
    734                               const CXXDestructorDecl *Destructor);
    735 
    736   const CXXDestructorDecl *getDestructor() const { return Destructor; }
    737 };
    738 
    739 /// \brief Represents binding an expression to a temporary.
    740 ///
    741 /// This ensures the destructor is called for the temporary. It should only be
    742 /// needed for non-POD, non-trivially destructable class types. For example:
    743 ///
    744 /// \code
    745 ///   struct S {
    746 ///     S() { }  // User defined constructor makes S non-POD.
    747 ///     ~S() { } // User defined destructor makes it non-trivial.
    748 ///   };
    749 ///   void test() {
    750 ///     const S &s_ref = S(); // Requires a CXXBindTemporaryExpr.
    751 ///   }
    752 /// \endcode
    753 class CXXBindTemporaryExpr : public Expr {
    754   CXXTemporary *Temp;
    755 
    756   Stmt *SubExpr;
    757 
    758   CXXBindTemporaryExpr(CXXTemporary *temp, Expr* SubExpr)
    759    : Expr(CXXBindTemporaryExprClass, SubExpr->getType(),
    760           VK_RValue, OK_Ordinary, SubExpr->isTypeDependent(),
    761           SubExpr->isValueDependent(),
    762           SubExpr->isInstantiationDependent(),
    763           SubExpr->containsUnexpandedParameterPack()),
    764      Temp(temp), SubExpr(SubExpr) { }
    765 
    766 public:
    767   CXXBindTemporaryExpr(EmptyShell Empty)
    768     : Expr(CXXBindTemporaryExprClass, Empty), Temp(0), SubExpr(0) {}
    769 
    770   static CXXBindTemporaryExpr *Create(ASTContext &C, CXXTemporary *Temp,
    771                                       Expr* SubExpr);
    772 
    773   CXXTemporary *getTemporary() { return Temp; }
    774   const CXXTemporary *getTemporary() const { return Temp; }
    775   void setTemporary(CXXTemporary *T) { Temp = T; }
    776 
    777   const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
    778   Expr *getSubExpr() { return cast<Expr>(SubExpr); }
    779   void setSubExpr(Expr *E) { SubExpr = E; }
    780 
    781   SourceRange getSourceRange() const {
    782     return SubExpr->getSourceRange();
    783   }
    784 
    785   // Implement isa/cast/dyncast/etc.
    786   static bool classof(const Stmt *T) {
    787     return T->getStmtClass() == CXXBindTemporaryExprClass;
    788   }
    789   static bool classof(const CXXBindTemporaryExpr *) { return true; }
    790 
    791   // Iterators
    792   child_range children() { return child_range(&SubExpr, &SubExpr + 1); }
    793 };
    794 
    795 /// CXXConstructExpr - Represents a call to a C++ constructor.
    796 class CXXConstructExpr : public Expr {
    797 public:
    798   enum ConstructionKind {
    799     CK_Complete,
    800     CK_NonVirtualBase,
    801     CK_VirtualBase,
    802     CK_Delegating
    803   };
    804 
    805 private:
    806   CXXConstructorDecl *Constructor;
    807 
    808   SourceLocation Loc;
    809   SourceRange ParenRange;
    810   unsigned NumArgs : 16;
    811   bool Elidable : 1;
    812   bool HadMultipleCandidates : 1;
    813   bool ZeroInitialization : 1;
    814   unsigned ConstructKind : 2;
    815   Stmt **Args;
    816 
    817 protected:
    818   CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
    819                    SourceLocation Loc,
    820                    CXXConstructorDecl *d, bool elidable,
    821                    Expr **args, unsigned numargs,
    822                    bool HadMultipleCandidates,
    823                    bool ZeroInitialization = false,
    824                    ConstructionKind ConstructKind = CK_Complete,
    825                    SourceRange ParenRange = SourceRange());
    826 
    827   /// \brief Construct an empty C++ construction expression.
    828   CXXConstructExpr(StmtClass SC, EmptyShell Empty)
    829     : Expr(SC, Empty), Constructor(0), NumArgs(0), Elidable(0),
    830       HadMultipleCandidates(false), ZeroInitialization(0),
    831       ConstructKind(0), Args(0) { }
    832 
    833 public:
    834   /// \brief Construct an empty C++ construction expression.
    835   explicit CXXConstructExpr(EmptyShell Empty)
    836     : Expr(CXXConstructExprClass, Empty), Constructor(0),
    837       NumArgs(0), Elidable(0), HadMultipleCandidates(false),
    838       ZeroInitialization(0), ConstructKind(0), Args(0) { }
    839 
    840   static CXXConstructExpr *Create(ASTContext &C, QualType T,
    841                                   SourceLocation Loc,
    842                                   CXXConstructorDecl *D, bool Elidable,
    843                                   Expr **Args, unsigned NumArgs,
    844                                   bool HadMultipleCandidates,
    845                                   bool ZeroInitialization = false,
    846                                   ConstructionKind ConstructKind = CK_Complete,
    847                                   SourceRange ParenRange = SourceRange());
    848 
    849 
    850   CXXConstructorDecl* getConstructor() const { return Constructor; }
    851   void setConstructor(CXXConstructorDecl *C) { Constructor = C; }
    852 
    853   SourceLocation getLocation() const { return Loc; }
    854   void setLocation(SourceLocation Loc) { this->Loc = Loc; }
    855 
    856   /// \brief Whether this construction is elidable.
    857   bool isElidable() const { return Elidable; }
    858   void setElidable(bool E) { Elidable = E; }
    859 
    860   /// \brief Whether the referred constructor was resolved from
    861   /// an overloaded set having size greater than 1.
    862   bool hadMultipleCandidates() const { return HadMultipleCandidates; }
    863   void setHadMultipleCandidates(bool V) { HadMultipleCandidates = V; }
    864 
    865   /// \brief Whether this construction first requires
    866   /// zero-initialization before the initializer is called.
    867   bool requiresZeroInitialization() const { return ZeroInitialization; }
    868   void setRequiresZeroInitialization(bool ZeroInit) {
    869     ZeroInitialization = ZeroInit;
    870   }
    871 
    872   /// \brief Determines whether this constructor is actually constructing
    873   /// a base class (rather than a complete object).
    874   ConstructionKind getConstructionKind() const {
    875     return (ConstructionKind)ConstructKind;
    876   }
    877   void setConstructionKind(ConstructionKind CK) {
    878     ConstructKind = CK;
    879   }
    880 
    881   typedef ExprIterator arg_iterator;
    882   typedef ConstExprIterator const_arg_iterator;
    883 
    884   arg_iterator arg_begin() { return Args; }
    885   arg_iterator arg_end() { return Args + NumArgs; }
    886   const_arg_iterator arg_begin() const { return Args; }
    887   const_arg_iterator arg_end() const { return Args + NumArgs; }
    888 
    889   Expr **getArgs() const { return reinterpret_cast<Expr **>(Args); }
    890   unsigned getNumArgs() const { return NumArgs; }
    891 
    892   /// getArg - Return the specified argument.
    893   Expr *getArg(unsigned Arg) {
    894     assert(Arg < NumArgs && "Arg access out of range!");
    895     return cast<Expr>(Args[Arg]);
    896   }
    897   const Expr *getArg(unsigned Arg) const {
    898     assert(Arg < NumArgs && "Arg access out of range!");
    899     return cast<Expr>(Args[Arg]);
    900   }
    901 
    902   /// setArg - Set the specified argument.
    903   void setArg(unsigned Arg, Expr *ArgExpr) {
    904     assert(Arg < NumArgs && "Arg access out of range!");
    905     Args[Arg] = ArgExpr;
    906   }
    907 
    908   SourceRange getSourceRange() const;
    909   SourceRange getParenRange() const { return ParenRange; }
    910 
    911   static bool classof(const Stmt *T) {
    912     return T->getStmtClass() == CXXConstructExprClass ||
    913       T->getStmtClass() == CXXTemporaryObjectExprClass;
    914   }
    915   static bool classof(const CXXConstructExpr *) { return true; }
    916 
    917   // Iterators
    918   child_range children() {
    919     return child_range(&Args[0], &Args[0]+NumArgs);
    920   }
    921 
    922   friend class ASTStmtReader;
    923 };
    924 
    925 /// CXXFunctionalCastExpr - Represents an explicit C++ type conversion
    926 /// that uses "functional" notion (C++ [expr.type.conv]). Example: @c
    927 /// x = int(0.5);
    928 class CXXFunctionalCastExpr : public ExplicitCastExpr {
    929   SourceLocation TyBeginLoc;
    930   SourceLocation RParenLoc;
    931 
    932   CXXFunctionalCastExpr(QualType ty, ExprValueKind VK,
    933                         TypeSourceInfo *writtenTy,
    934                         SourceLocation tyBeginLoc, CastKind kind,
    935                         Expr *castExpr, unsigned pathSize,
    936                         SourceLocation rParenLoc)
    937     : ExplicitCastExpr(CXXFunctionalCastExprClass, ty, VK, kind,
    938                        castExpr, pathSize, writtenTy),
    939       TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {}
    940 
    941   explicit CXXFunctionalCastExpr(EmptyShell Shell, unsigned PathSize)
    942     : ExplicitCastExpr(CXXFunctionalCastExprClass, Shell, PathSize) { }
    943 
    944 public:
    945   static CXXFunctionalCastExpr *Create(ASTContext &Context, QualType T,
    946                                        ExprValueKind VK,
    947                                        TypeSourceInfo *Written,
    948                                        SourceLocation TyBeginLoc,
    949                                        CastKind Kind, Expr *Op,
    950                                        const CXXCastPath *Path,
    951                                        SourceLocation RPLoc);
    952   static CXXFunctionalCastExpr *CreateEmpty(ASTContext &Context,
    953                                             unsigned PathSize);
    954 
    955   SourceLocation getTypeBeginLoc() const { return TyBeginLoc; }
    956   void setTypeBeginLoc(SourceLocation L) { TyBeginLoc = L; }
    957   SourceLocation getRParenLoc() const { return RParenLoc; }
    958   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
    959 
    960   SourceRange getSourceRange() const {
    961     return SourceRange(TyBeginLoc, RParenLoc);
    962   }
    963   static bool classof(const Stmt *T) {
    964     return T->getStmtClass() == CXXFunctionalCastExprClass;
    965   }
    966   static bool classof(const CXXFunctionalCastExpr *) { return true; }
    967 };
    968 
    969 /// @brief Represents a C++ functional cast expression that builds a
    970 /// temporary object.
    971 ///
    972 /// This expression type represents a C++ "functional" cast
    973 /// (C++[expr.type.conv]) with N != 1 arguments that invokes a
    974 /// constructor to build a temporary object. With N == 1 arguments the
    975 /// functional cast expression will be represented by CXXFunctionalCastExpr.
    976 /// Example:
    977 /// @code
    978 /// struct X { X(int, float); }
    979 ///
    980 /// X create_X() {
    981 ///   return X(1, 3.14f); // creates a CXXTemporaryObjectExpr
    982 /// };
    983 /// @endcode
    984 class CXXTemporaryObjectExpr : public CXXConstructExpr {
    985   TypeSourceInfo *Type;
    986 
    987 public:
    988   CXXTemporaryObjectExpr(ASTContext &C, CXXConstructorDecl *Cons,
    989                          TypeSourceInfo *Type,
    990                          Expr **Args,unsigned NumArgs,
    991                          SourceRange parenRange,
    992                          bool HadMultipleCandidates,
    993                          bool ZeroInitialization = false);
    994   explicit CXXTemporaryObjectExpr(EmptyShell Empty)
    995     : CXXConstructExpr(CXXTemporaryObjectExprClass, Empty), Type() { }
    996 
    997   TypeSourceInfo *getTypeSourceInfo() const { return Type; }
    998 
    999   SourceRange getSourceRange() const;
   1000 
   1001   static bool classof(const Stmt *T) {
   1002     return T->getStmtClass() == CXXTemporaryObjectExprClass;
   1003   }
   1004   static bool classof(const CXXTemporaryObjectExpr *) { return true; }
   1005 
   1006   friend class ASTStmtReader;
   1007 };
   1008 
   1009 /// CXXScalarValueInitExpr - [C++ 5.2.3p2]
   1010 /// Expression "T()" which creates a value-initialized rvalue of type
   1011 /// T, which is a non-class type.
   1012 ///
   1013 class CXXScalarValueInitExpr : public Expr {
   1014   SourceLocation RParenLoc;
   1015   TypeSourceInfo *TypeInfo;
   1016 
   1017   friend class ASTStmtReader;
   1018 
   1019 public:
   1020   /// \brief Create an explicitly-written scalar-value initialization
   1021   /// expression.
   1022   CXXScalarValueInitExpr(QualType Type,
   1023                          TypeSourceInfo *TypeInfo,
   1024                          SourceLocation rParenLoc ) :
   1025     Expr(CXXScalarValueInitExprClass, Type, VK_RValue, OK_Ordinary,
   1026          false, false, Type->isInstantiationDependentType(), false),
   1027     RParenLoc(rParenLoc), TypeInfo(TypeInfo) {}
   1028 
   1029   explicit CXXScalarValueInitExpr(EmptyShell Shell)
   1030     : Expr(CXXScalarValueInitExprClass, Shell) { }
   1031 
   1032   TypeSourceInfo *getTypeSourceInfo() const {
   1033     return TypeInfo;
   1034   }
   1035 
   1036   SourceLocation getRParenLoc() const { return RParenLoc; }
   1037 
   1038   SourceRange getSourceRange() const;
   1039 
   1040   static bool classof(const Stmt *T) {
   1041     return T->getStmtClass() == CXXScalarValueInitExprClass;
   1042   }
   1043   static bool classof(const CXXScalarValueInitExpr *) { return true; }
   1044 
   1045   // Iterators
   1046   child_range children() { return child_range(); }
   1047 };
   1048 
   1049 /// CXXNewExpr - A new expression for memory allocation and constructor calls,
   1050 /// e.g: "new CXXNewExpr(foo)".
   1051 class CXXNewExpr : public Expr {
   1052   // Was the usage ::new, i.e. is the global new to be used?
   1053   bool GlobalNew : 1;
   1054   // Is there an initializer? If not, built-ins are uninitialized, else they're
   1055   // value-initialized.
   1056   bool Initializer : 1;
   1057   // Do we allocate an array? If so, the first SubExpr is the size expression.
   1058   bool Array : 1;
   1059   // If this is an array allocation, does the usual deallocation
   1060   // function for the allocated type want to know the allocated size?
   1061   bool UsualArrayDeleteWantsSize : 1;
   1062   // Whether the referred constructor (if any) was resolved from an
   1063   // overload set having size greater than 1.
   1064   bool HadMultipleCandidates : 1;
   1065   // The number of placement new arguments.
   1066   unsigned NumPlacementArgs : 13;
   1067   // The number of constructor arguments. This may be 1 even for non-class
   1068   // types; use the pseudo copy constructor.
   1069   unsigned NumConstructorArgs : 14;
   1070   // Contains an optional array size expression, any number of optional
   1071   // placement arguments, and any number of optional constructor arguments,
   1072   // in that order.
   1073   Stmt **SubExprs;
   1074   // Points to the allocation function used.
   1075   FunctionDecl *OperatorNew;
   1076   // Points to the deallocation function used in case of error. May be null.
   1077   FunctionDecl *OperatorDelete;
   1078   // Points to the constructor used. Cannot be null if AllocType is a record;
   1079   // it would still point at the default constructor (even an implicit one).
   1080   // Must be null for all other types.
   1081   CXXConstructorDecl *Constructor;
   1082 
   1083   /// \brief The allocated type-source information, as written in the source.
   1084   TypeSourceInfo *AllocatedTypeInfo;
   1085 
   1086   /// \brief If the allocated type was expressed as a parenthesized type-id,
   1087   /// the source range covering the parenthesized type-id.
   1088   SourceRange TypeIdParens;
   1089 
   1090   SourceLocation StartLoc;
   1091   SourceLocation EndLoc;
   1092   SourceLocation ConstructorLParen;
   1093   SourceLocation ConstructorRParen;
   1094 
   1095   friend class ASTStmtReader;
   1096 public:
   1097   CXXNewExpr(ASTContext &C, bool globalNew, FunctionDecl *operatorNew,
   1098              Expr **placementArgs, unsigned numPlaceArgs,
   1099              SourceRange TypeIdParens,
   1100              Expr *arraySize, CXXConstructorDecl *constructor, bool initializer,
   1101              Expr **constructorArgs, unsigned numConsArgs,
   1102              bool HadMultipleCandidates,
   1103              FunctionDecl *operatorDelete, bool usualArrayDeleteWantsSize,
   1104              QualType ty, TypeSourceInfo *AllocatedTypeInfo,
   1105              SourceLocation startLoc, SourceLocation endLoc,
   1106              SourceLocation constructorLParen,
   1107              SourceLocation constructorRParen);
   1108   explicit CXXNewExpr(EmptyShell Shell)
   1109     : Expr(CXXNewExprClass, Shell), SubExprs(0) { }
   1110 
   1111   void AllocateArgsArray(ASTContext &C, bool isArray, unsigned numPlaceArgs,
   1112                          unsigned numConsArgs);
   1113 
   1114   QualType getAllocatedType() const {
   1115     assert(getType()->isPointerType());
   1116     return getType()->getAs<PointerType>()->getPointeeType();
   1117   }
   1118 
   1119   TypeSourceInfo *getAllocatedTypeSourceInfo() const {
   1120     return AllocatedTypeInfo;
   1121   }
   1122 
   1123   /// \brief True if the allocation result needs to be null-checked.
   1124   /// C++0x [expr.new]p13:
   1125   ///   If the allocation function returns null, initialization shall
   1126   ///   not be done, the deallocation function shall not be called,
   1127   ///   and the value of the new-expression shall be null.
   1128   /// An allocation function is not allowed to return null unless it
   1129   /// has a non-throwing exception-specification.  The '03 rule is
   1130   /// identical except that the definition of a non-throwing
   1131   /// exception specification is just "is it throw()?".
   1132   bool shouldNullCheckAllocation(ASTContext &Ctx) const;
   1133 
   1134   FunctionDecl *getOperatorNew() const { return OperatorNew; }
   1135   void setOperatorNew(FunctionDecl *D) { OperatorNew = D; }
   1136   FunctionDecl *getOperatorDelete() const { return OperatorDelete; }
   1137   void setOperatorDelete(FunctionDecl *D) { OperatorDelete = D; }
   1138   CXXConstructorDecl *getConstructor() const { return Constructor; }
   1139   void setConstructor(CXXConstructorDecl *D) { Constructor = D; }
   1140 
   1141   bool isArray() const { return Array; }
   1142   Expr *getArraySize() {
   1143     return Array ? cast<Expr>(SubExprs[0]) : 0;
   1144   }
   1145   const Expr *getArraySize() const {
   1146     return Array ? cast<Expr>(SubExprs[0]) : 0;
   1147   }
   1148 
   1149   unsigned getNumPlacementArgs() const { return NumPlacementArgs; }
   1150   Expr **getPlacementArgs() {
   1151     return reinterpret_cast<Expr **>(SubExprs + Array);
   1152   }
   1153 
   1154   Expr *getPlacementArg(unsigned i) {
   1155     assert(i < NumPlacementArgs && "Index out of range");
   1156     return cast<Expr>(SubExprs[Array + i]);
   1157   }
   1158   const Expr *getPlacementArg(unsigned i) const {
   1159     assert(i < NumPlacementArgs && "Index out of range");
   1160     return cast<Expr>(SubExprs[Array + i]);
   1161   }
   1162 
   1163   bool isParenTypeId() const { return TypeIdParens.isValid(); }
   1164   SourceRange getTypeIdParens() const { return TypeIdParens; }
   1165 
   1166   bool isGlobalNew() const { return GlobalNew; }
   1167   bool hasInitializer() const { return Initializer; }
   1168 
   1169   /// Answers whether the usual array deallocation function for the
   1170   /// allocated type expects the size of the allocation as a
   1171   /// parameter.
   1172   bool doesUsualArrayDeleteWantSize() const {
   1173     return UsualArrayDeleteWantsSize;
   1174   }
   1175 
   1176   unsigned getNumConstructorArgs() const { return NumConstructorArgs; }
   1177 
   1178   Expr **getConstructorArgs() {
   1179     return reinterpret_cast<Expr **>(SubExprs + Array + NumPlacementArgs);
   1180   }
   1181 
   1182   Expr *getConstructorArg(unsigned i) {
   1183     assert(i < NumConstructorArgs && "Index out of range");
   1184     return cast<Expr>(SubExprs[Array + NumPlacementArgs + i]);
   1185   }
   1186   const Expr *getConstructorArg(unsigned i) const {
   1187     assert(i < NumConstructorArgs && "Index out of range");
   1188     return cast<Expr>(SubExprs[Array + NumPlacementArgs + i]);
   1189   }
   1190 
   1191   /// \brief Whether the new expression refers a constructor that was
   1192   /// resolved from an overloaded set having size greater than 1.
   1193   bool hadMultipleCandidates() const { return HadMultipleCandidates; }
   1194   void setHadMultipleCandidates(bool V) { HadMultipleCandidates = V; }
   1195 
   1196   typedef ExprIterator arg_iterator;
   1197   typedef ConstExprIterator const_arg_iterator;
   1198 
   1199   arg_iterator placement_arg_begin() {
   1200     return SubExprs + Array;
   1201   }
   1202   arg_iterator placement_arg_end() {
   1203     return SubExprs + Array + getNumPlacementArgs();
   1204   }
   1205   const_arg_iterator placement_arg_begin() const {
   1206     return SubExprs + Array;
   1207   }
   1208   const_arg_iterator placement_arg_end() const {
   1209     return SubExprs + Array + getNumPlacementArgs();
   1210   }
   1211 
   1212   arg_iterator constructor_arg_begin() {
   1213     return SubExprs + Array + getNumPlacementArgs();
   1214   }
   1215   arg_iterator constructor_arg_end() {
   1216     return SubExprs + Array + getNumPlacementArgs() + getNumConstructorArgs();
   1217   }
   1218   const_arg_iterator constructor_arg_begin() const {
   1219     return SubExprs + Array + getNumPlacementArgs();
   1220   }
   1221   const_arg_iterator constructor_arg_end() const {
   1222     return SubExprs + Array + getNumPlacementArgs() + getNumConstructorArgs();
   1223   }
   1224 
   1225   typedef Stmt **raw_arg_iterator;
   1226   raw_arg_iterator raw_arg_begin() { return SubExprs; }
   1227   raw_arg_iterator raw_arg_end() {
   1228     return SubExprs + Array + getNumPlacementArgs() + getNumConstructorArgs();
   1229   }
   1230   const_arg_iterator raw_arg_begin() const { return SubExprs; }
   1231   const_arg_iterator raw_arg_end() const { return constructor_arg_end(); }
   1232 
   1233   SourceLocation getStartLoc() const { return StartLoc; }
   1234   SourceLocation getEndLoc() const { return EndLoc; }
   1235 
   1236   SourceLocation getConstructorLParen() const { return ConstructorLParen; }
   1237   SourceLocation getConstructorRParen() const { return ConstructorRParen; }
   1238 
   1239   SourceRange getSourceRange() const {
   1240     return SourceRange(StartLoc, EndLoc);
   1241   }
   1242 
   1243   static bool classof(const Stmt *T) {
   1244     return T->getStmtClass() == CXXNewExprClass;
   1245   }
   1246   static bool classof(const CXXNewExpr *) { return true; }
   1247 
   1248   // Iterators
   1249   child_range children() {
   1250     return child_range(&SubExprs[0],
   1251                        &SubExprs[0] + Array + getNumPlacementArgs()
   1252                          + getNumConstructorArgs());
   1253   }
   1254 };
   1255 
   1256 /// CXXDeleteExpr - A delete expression for memory deallocation and destructor
   1257 /// calls, e.g. "delete[] pArray".
   1258 class CXXDeleteExpr : public Expr {
   1259   // Is this a forced global delete, i.e. "::delete"?
   1260   bool GlobalDelete : 1;
   1261   // Is this the array form of delete, i.e. "delete[]"?
   1262   bool ArrayForm : 1;
   1263   // ArrayFormAsWritten can be different from ArrayForm if 'delete' is applied
   1264   // to pointer-to-array type (ArrayFormAsWritten will be false while ArrayForm
   1265   // will be true).
   1266   bool ArrayFormAsWritten : 1;
   1267   // Does the usual deallocation function for the element type require
   1268   // a size_t argument?
   1269   bool UsualArrayDeleteWantsSize : 1;
   1270   // Points to the operator delete overload that is used. Could be a member.
   1271   FunctionDecl *OperatorDelete;
   1272   // The pointer expression to be deleted.
   1273   Stmt *Argument;
   1274   // Location of the expression.
   1275   SourceLocation Loc;
   1276 public:
   1277   CXXDeleteExpr(QualType ty, bool globalDelete, bool arrayForm,
   1278                 bool arrayFormAsWritten, bool usualArrayDeleteWantsSize,
   1279                 FunctionDecl *operatorDelete, Expr *arg, SourceLocation loc)
   1280     : Expr(CXXDeleteExprClass, ty, VK_RValue, OK_Ordinary, false, false,
   1281            arg->isInstantiationDependent(),
   1282            arg->containsUnexpandedParameterPack()),
   1283       GlobalDelete(globalDelete),
   1284       ArrayForm(arrayForm), ArrayFormAsWritten(arrayFormAsWritten),
   1285       UsualArrayDeleteWantsSize(usualArrayDeleteWantsSize),
   1286       OperatorDelete(operatorDelete), Argument(arg), Loc(loc) { }
   1287   explicit CXXDeleteExpr(EmptyShell Shell)
   1288     : Expr(CXXDeleteExprClass, Shell), OperatorDelete(0), Argument(0) { }
   1289 
   1290   bool isGlobalDelete() const { return GlobalDelete; }
   1291   bool isArrayForm() const { return ArrayForm; }
   1292   bool isArrayFormAsWritten() const { return ArrayFormAsWritten; }
   1293 
   1294   /// Answers whether the usual array deallocation function for the
   1295   /// allocated type expects the size of the allocation as a
   1296   /// parameter.  This can be true even if the actual deallocation
   1297   /// function that we're using doesn't want a size.
   1298   bool doesUsualArrayDeleteWantSize() const {
   1299     return UsualArrayDeleteWantsSize;
   1300   }
   1301 
   1302   FunctionDecl *getOperatorDelete() const { return OperatorDelete; }
   1303 
   1304   Expr *getArgument() { return cast<Expr>(Argument); }
   1305   const Expr *getArgument() const { return cast<Expr>(Argument); }
   1306 
   1307   /// \brief Retrieve the type being destroyed.  If the type being
   1308   /// destroyed is a dependent type which may or may not be a pointer,
   1309   /// return an invalid type.
   1310   QualType getDestroyedType() const;
   1311 
   1312   SourceRange getSourceRange() const {
   1313     return SourceRange(Loc, Argument->getLocEnd());
   1314   }
   1315 
   1316   static bool classof(const Stmt *T) {
   1317     return T->getStmtClass() == CXXDeleteExprClass;
   1318   }
   1319   static bool classof(const CXXDeleteExpr *) { return true; }
   1320 
   1321   // Iterators
   1322   child_range children() { return child_range(&Argument, &Argument+1); }
   1323 
   1324   friend class ASTStmtReader;
   1325 };
   1326 
   1327 /// \brief Structure used to store the type being destroyed by a
   1328 /// pseudo-destructor expression.
   1329 class PseudoDestructorTypeStorage {
   1330   /// \brief Either the type source information or the name of the type, if
   1331   /// it couldn't be resolved due to type-dependence.
   1332   llvm::PointerUnion<TypeSourceInfo *, IdentifierInfo *> Type;
   1333 
   1334   /// \brief The starting source location of the pseudo-destructor type.
   1335   SourceLocation Location;
   1336 
   1337 public:
   1338   PseudoDestructorTypeStorage() { }
   1339 
   1340   PseudoDestructorTypeStorage(IdentifierInfo *II, SourceLocation Loc)
   1341     : Type(II), Location(Loc) { }
   1342 
   1343   PseudoDestructorTypeStorage(TypeSourceInfo *Info);
   1344 
   1345   TypeSourceInfo *getTypeSourceInfo() const {
   1346     return Type.dyn_cast<TypeSourceInfo *>();
   1347   }
   1348 
   1349   IdentifierInfo *getIdentifier() const {
   1350     return Type.dyn_cast<IdentifierInfo *>();
   1351   }
   1352 
   1353   SourceLocation getLocation() const { return Location; }
   1354 };
   1355 
   1356 /// \brief Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
   1357 ///
   1358 /// A pseudo-destructor is an expression that looks like a member access to a
   1359 /// destructor of a scalar type, except that scalar types don't have
   1360 /// destructors. For example:
   1361 ///
   1362 /// \code
   1363 /// typedef int T;
   1364 /// void f(int *p) {
   1365 ///   p->T::~T();
   1366 /// }
   1367 /// \endcode
   1368 ///
   1369 /// Pseudo-destructors typically occur when instantiating templates such as:
   1370 ///
   1371 /// \code
   1372 /// template<typename T>
   1373 /// void destroy(T* ptr) {
   1374 ///   ptr->T::~T();
   1375 /// }
   1376 /// \endcode
   1377 ///
   1378 /// for scalar types. A pseudo-destructor expression has no run-time semantics
   1379 /// beyond evaluating the base expression.
   1380 class CXXPseudoDestructorExpr : public Expr {
   1381   /// \brief The base expression (that is being destroyed).
   1382   Stmt *Base;
   1383 
   1384   /// \brief Whether the operator was an arrow ('->'); otherwise, it was a
   1385   /// period ('.').
   1386   bool IsArrow : 1;
   1387 
   1388   /// \brief The location of the '.' or '->' operator.
   1389   SourceLocation OperatorLoc;
   1390 
   1391   /// \brief The nested-name-specifier that follows the operator, if present.
   1392   NestedNameSpecifierLoc QualifierLoc;
   1393 
   1394   /// \brief The type that precedes the '::' in a qualified pseudo-destructor
   1395   /// expression.
   1396   TypeSourceInfo *ScopeType;
   1397 
   1398   /// \brief The location of the '::' in a qualified pseudo-destructor
   1399   /// expression.
   1400   SourceLocation ColonColonLoc;
   1401 
   1402   /// \brief The location of the '~'.
   1403   SourceLocation TildeLoc;
   1404 
   1405   /// \brief The type being destroyed, or its name if we were unable to
   1406   /// resolve the name.
   1407   PseudoDestructorTypeStorage DestroyedType;
   1408 
   1409   friend class ASTStmtReader;
   1410 
   1411 public:
   1412   CXXPseudoDestructorExpr(ASTContext &Context,
   1413                           Expr *Base, bool isArrow, SourceLocation OperatorLoc,
   1414                           NestedNameSpecifierLoc QualifierLoc,
   1415                           TypeSourceInfo *ScopeType,
   1416                           SourceLocation ColonColonLoc,
   1417                           SourceLocation TildeLoc,
   1418                           PseudoDestructorTypeStorage DestroyedType);
   1419 
   1420   explicit CXXPseudoDestructorExpr(EmptyShell Shell)
   1421     : Expr(CXXPseudoDestructorExprClass, Shell),
   1422       Base(0), IsArrow(false), QualifierLoc(), ScopeType(0) { }
   1423 
   1424   Expr *getBase() const { return cast<Expr>(Base); }
   1425 
   1426   /// \brief Determines whether this member expression actually had
   1427   /// a C++ nested-name-specifier prior to the name of the member, e.g.,
   1428   /// x->Base::foo.
   1429   bool hasQualifier() const { return QualifierLoc; }
   1430 
   1431   /// \brief Retrieves the nested-name-specifier that qualifies the type name,
   1432   /// with source-location information.
   1433   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
   1434 
   1435   /// \brief If the member name was qualified, retrieves the
   1436   /// nested-name-specifier that precedes the member name. Otherwise, returns
   1437   /// NULL.
   1438   NestedNameSpecifier *getQualifier() const {
   1439     return QualifierLoc.getNestedNameSpecifier();
   1440   }
   1441 
   1442   /// \brief Determine whether this pseudo-destructor expression was written
   1443   /// using an '->' (otherwise, it used a '.').
   1444   bool isArrow() const { return IsArrow; }
   1445 
   1446   /// \brief Retrieve the location of the '.' or '->' operator.
   1447   SourceLocation getOperatorLoc() const { return OperatorLoc; }
   1448 
   1449   /// \brief Retrieve the scope type in a qualified pseudo-destructor
   1450   /// expression.
   1451   ///
   1452   /// Pseudo-destructor expressions can have extra qualification within them
   1453   /// that is not part of the nested-name-specifier, e.g., \c p->T::~T().
   1454   /// Here, if the object type of the expression is (or may be) a scalar type,
   1455   /// \p T may also be a scalar type and, therefore, cannot be part of a
   1456   /// nested-name-specifier. It is stored as the "scope type" of the pseudo-
   1457   /// destructor expression.
   1458   TypeSourceInfo *getScopeTypeInfo() const { return ScopeType; }
   1459 
   1460   /// \brief Retrieve the location of the '::' in a qualified pseudo-destructor
   1461   /// expression.
   1462   SourceLocation getColonColonLoc() const { return ColonColonLoc; }
   1463 
   1464   /// \brief Retrieve the location of the '~'.
   1465   SourceLocation getTildeLoc() const { return TildeLoc; }
   1466 
   1467   /// \brief Retrieve the source location information for the type
   1468   /// being destroyed.
   1469   ///
   1470   /// This type-source information is available for non-dependent
   1471   /// pseudo-destructor expressions and some dependent pseudo-destructor
   1472   /// expressions. Returns NULL if we only have the identifier for a
   1473   /// dependent pseudo-destructor expression.
   1474   TypeSourceInfo *getDestroyedTypeInfo() const {
   1475     return DestroyedType.getTypeSourceInfo();
   1476   }
   1477 
   1478   /// \brief In a dependent pseudo-destructor expression for which we do not
   1479   /// have full type information on the destroyed type, provides the name
   1480   /// of the destroyed type.
   1481   IdentifierInfo *getDestroyedTypeIdentifier() const {
   1482     return DestroyedType.getIdentifier();
   1483   }
   1484 
   1485   /// \brief Retrieve the type being destroyed.
   1486   QualType getDestroyedType() const;
   1487 
   1488   /// \brief Retrieve the starting location of the type being destroyed.
   1489   SourceLocation getDestroyedTypeLoc() const {
   1490     return DestroyedType.getLocation();
   1491   }
   1492 
   1493   /// \brief Set the name of destroyed type for a dependent pseudo-destructor
   1494   /// expression.
   1495   void setDestroyedType(IdentifierInfo *II, SourceLocation Loc) {
   1496     DestroyedType = PseudoDestructorTypeStorage(II, Loc);
   1497   }
   1498 
   1499   /// \brief Set the destroyed type.
   1500   void setDestroyedType(TypeSourceInfo *Info) {
   1501     DestroyedType = PseudoDestructorTypeStorage(Info);
   1502   }
   1503 
   1504   SourceRange getSourceRange() const;
   1505 
   1506   static bool classof(const Stmt *T) {
   1507     return T->getStmtClass() == CXXPseudoDestructorExprClass;
   1508   }
   1509   static bool classof(const CXXPseudoDestructorExpr *) { return true; }
   1510 
   1511   // Iterators
   1512   child_range children() { return child_range(&Base, &Base + 1); }
   1513 };
   1514 
   1515 /// UnaryTypeTraitExpr - A GCC or MS unary type trait, as used in the
   1516 /// implementation of TR1/C++0x type trait templates.
   1517 /// Example:
   1518 /// __is_pod(int) == true
   1519 /// __is_enum(std::string) == false
   1520 class UnaryTypeTraitExpr : public Expr {
   1521   /// UTT - The trait. A UnaryTypeTrait enum in MSVC compat unsigned.
   1522   unsigned UTT : 31;
   1523   /// The value of the type trait. Unspecified if dependent.
   1524   bool Value : 1;
   1525 
   1526   /// Loc - The location of the type trait keyword.
   1527   SourceLocation Loc;
   1528 
   1529   /// RParen - The location of the closing paren.
   1530   SourceLocation RParen;
   1531 
   1532   /// The type being queried.
   1533   TypeSourceInfo *QueriedType;
   1534 
   1535 public:
   1536   UnaryTypeTraitExpr(SourceLocation loc, UnaryTypeTrait utt,
   1537                      TypeSourceInfo *queried, bool value,
   1538                      SourceLocation rparen, QualType ty)
   1539     : Expr(UnaryTypeTraitExprClass, ty, VK_RValue, OK_Ordinary,
   1540            false,  queried->getType()->isDependentType(),
   1541            queried->getType()->isInstantiationDependentType(),
   1542            queried->getType()->containsUnexpandedParameterPack()),
   1543       UTT(utt), Value(value), Loc(loc), RParen(rparen), QueriedType(queried) { }
   1544 
   1545   explicit UnaryTypeTraitExpr(EmptyShell Empty)
   1546     : Expr(UnaryTypeTraitExprClass, Empty), UTT(0), Value(false),
   1547       QueriedType() { }
   1548 
   1549   SourceRange getSourceRange() const { return SourceRange(Loc, RParen);}
   1550 
   1551   UnaryTypeTrait getTrait() const { return static_cast<UnaryTypeTrait>(UTT); }
   1552 
   1553   QualType getQueriedType() const { return QueriedType->getType(); }
   1554 
   1555   TypeSourceInfo *getQueriedTypeSourceInfo() const { return QueriedType; }
   1556 
   1557   bool getValue() const { return Value; }
   1558 
   1559   static bool classof(const Stmt *T) {
   1560     return T->getStmtClass() == UnaryTypeTraitExprClass;
   1561   }
   1562   static bool classof(const UnaryTypeTraitExpr *) { return true; }
   1563 
   1564   // Iterators
   1565   child_range children() { return child_range(); }
   1566 
   1567   friend class ASTStmtReader;
   1568 };
   1569 
   1570 /// BinaryTypeTraitExpr - A GCC or MS binary type trait, as used in the
   1571 /// implementation of TR1/C++0x type trait templates.
   1572 /// Example:
   1573 /// __is_base_of(Base, Derived) == true
   1574 class BinaryTypeTraitExpr : public Expr {
   1575   /// BTT - The trait. A BinaryTypeTrait enum in MSVC compat unsigned.
   1576   unsigned BTT : 8;
   1577 
   1578   /// The value of the type trait. Unspecified if dependent.
   1579   bool Value : 1;
   1580 
   1581   /// Loc - The location of the type trait keyword.
   1582   SourceLocation Loc;
   1583 
   1584   /// RParen - The location of the closing paren.
   1585   SourceLocation RParen;
   1586 
   1587   /// The lhs type being queried.
   1588   TypeSourceInfo *LhsType;
   1589 
   1590   /// The rhs type being queried.
   1591   TypeSourceInfo *RhsType;
   1592 
   1593 public:
   1594   BinaryTypeTraitExpr(SourceLocation loc, BinaryTypeTrait btt,
   1595                      TypeSourceInfo *lhsType, TypeSourceInfo *rhsType,
   1596                      bool value, SourceLocation rparen, QualType ty)
   1597     : Expr(BinaryTypeTraitExprClass, ty, VK_RValue, OK_Ordinary, false,
   1598            lhsType->getType()->isDependentType() ||
   1599            rhsType->getType()->isDependentType(),
   1600            (lhsType->getType()->isInstantiationDependentType() ||
   1601             rhsType->getType()->isInstantiationDependentType()),
   1602            (lhsType->getType()->containsUnexpandedParameterPack() ||
   1603             rhsType->getType()->containsUnexpandedParameterPack())),
   1604       BTT(btt), Value(value), Loc(loc), RParen(rparen),
   1605       LhsType(lhsType), RhsType(rhsType) { }
   1606 
   1607 
   1608   explicit BinaryTypeTraitExpr(EmptyShell Empty)
   1609     : Expr(BinaryTypeTraitExprClass, Empty), BTT(0), Value(false),
   1610       LhsType(), RhsType() { }
   1611 
   1612   SourceRange getSourceRange() const {
   1613     return SourceRange(Loc, RParen);
   1614   }
   1615 
   1616   BinaryTypeTrait getTrait() const {
   1617     return static_cast<BinaryTypeTrait>(BTT);
   1618   }
   1619 
   1620   QualType getLhsType() const { return LhsType->getType(); }
   1621   QualType getRhsType() const { return RhsType->getType(); }
   1622 
   1623   TypeSourceInfo *getLhsTypeSourceInfo() const { return LhsType; }
   1624   TypeSourceInfo *getRhsTypeSourceInfo() const { return RhsType; }
   1625 
   1626   bool getValue() const { assert(!isTypeDependent()); return Value; }
   1627 
   1628   static bool classof(const Stmt *T) {
   1629     return T->getStmtClass() == BinaryTypeTraitExprClass;
   1630   }
   1631   static bool classof(const BinaryTypeTraitExpr *) { return true; }
   1632 
   1633   // Iterators
   1634   child_range children() { return child_range(); }
   1635 
   1636   friend class ASTStmtReader;
   1637 };
   1638 
   1639 /// ArrayTypeTraitExpr - An Embarcadero array type trait, as used in the
   1640 /// implementation of __array_rank and __array_extent.
   1641 /// Example:
   1642 /// __array_rank(int[10][20]) == 2
   1643 /// __array_extent(int, 1)    == 20
   1644 class ArrayTypeTraitExpr : public Expr {
   1645   /// ATT - The trait. An ArrayTypeTrait enum in MSVC compat unsigned.
   1646   unsigned ATT : 2;
   1647 
   1648   /// The value of the type trait. Unspecified if dependent.
   1649   uint64_t Value;
   1650 
   1651   /// The array dimension being queried, or -1 if not used
   1652   Expr *Dimension;
   1653 
   1654   /// Loc - The location of the type trait keyword.
   1655   SourceLocation Loc;
   1656 
   1657   /// RParen - The location of the closing paren.
   1658   SourceLocation RParen;
   1659 
   1660   /// The type being queried.
   1661   TypeSourceInfo *QueriedType;
   1662 
   1663 public:
   1664   ArrayTypeTraitExpr(SourceLocation loc, ArrayTypeTrait att,
   1665                      TypeSourceInfo *queried, uint64_t value,
   1666                      Expr *dimension, SourceLocation rparen, QualType ty)
   1667     : Expr(ArrayTypeTraitExprClass, ty, VK_RValue, OK_Ordinary,
   1668            false, queried->getType()->isDependentType(),
   1669            (queried->getType()->isInstantiationDependentType() ||
   1670             (dimension && dimension->isInstantiationDependent())),
   1671            queried->getType()->containsUnexpandedParameterPack()),
   1672       ATT(att), Value(value), Dimension(dimension),
   1673       Loc(loc), RParen(rparen), QueriedType(queried) { }
   1674 
   1675 
   1676   explicit ArrayTypeTraitExpr(EmptyShell Empty)
   1677     : Expr(ArrayTypeTraitExprClass, Empty), ATT(0), Value(false),
   1678       QueriedType() { }
   1679 
   1680   virtual ~ArrayTypeTraitExpr() { }
   1681 
   1682   virtual SourceRange getSourceRange() const { return SourceRange(Loc, RParen); }
   1683 
   1684   ArrayTypeTrait getTrait() const { return static_cast<ArrayTypeTrait>(ATT); }
   1685 
   1686   QualType getQueriedType() const { return QueriedType->getType(); }
   1687 
   1688   TypeSourceInfo *getQueriedTypeSourceInfo() const { return QueriedType; }
   1689 
   1690   uint64_t getValue() const { assert(!isTypeDependent()); return Value; }
   1691 
   1692   Expr *getDimensionExpression() const { return Dimension; }
   1693 
   1694   static bool classof(const Stmt *T) {
   1695     return T->getStmtClass() == ArrayTypeTraitExprClass;
   1696   }
   1697   static bool classof(const ArrayTypeTraitExpr *) { return true; }
   1698 
   1699   // Iterators
   1700   child_range children() { return child_range(); }
   1701 
   1702   friend class ASTStmtReader;
   1703 };
   1704 
   1705 /// ExpressionTraitExpr - An expression trait intrinsic
   1706 /// Example:
   1707 /// __is_lvalue_expr(std::cout) == true
   1708 /// __is_lvalue_expr(1) == false
   1709 class ExpressionTraitExpr : public Expr {
   1710   /// ET - The trait. A ExpressionTrait enum in MSVC compat unsigned.
   1711   unsigned ET : 31;
   1712   /// The value of the type trait. Unspecified if dependent.
   1713   bool Value : 1;
   1714 
   1715   /// Loc - The location of the type trait keyword.
   1716   SourceLocation Loc;
   1717 
   1718   /// RParen - The location of the closing paren.
   1719   SourceLocation RParen;
   1720 
   1721   Expr* QueriedExpression;
   1722 public:
   1723   ExpressionTraitExpr(SourceLocation loc, ExpressionTrait et,
   1724                      Expr *queried, bool value,
   1725                      SourceLocation rparen, QualType resultType)
   1726     : Expr(ExpressionTraitExprClass, resultType, VK_RValue, OK_Ordinary,
   1727            false, // Not type-dependent
   1728            // Value-dependent if the argument is type-dependent.
   1729            queried->isTypeDependent(),
   1730            queried->isInstantiationDependent(),
   1731            queried->containsUnexpandedParameterPack()),
   1732       ET(et), Value(value), Loc(loc), RParen(rparen), QueriedExpression(queried) { }
   1733 
   1734   explicit ExpressionTraitExpr(EmptyShell Empty)
   1735     : Expr(ExpressionTraitExprClass, Empty), ET(0), Value(false),
   1736       QueriedExpression() { }
   1737 
   1738   SourceRange getSourceRange() const { return SourceRange(Loc, RParen);}
   1739 
   1740   ExpressionTrait getTrait() const { return static_cast<ExpressionTrait>(ET); }
   1741 
   1742   Expr *getQueriedExpression() const { return QueriedExpression; }
   1743 
   1744   bool getValue() const { return Value; }
   1745 
   1746   static bool classof(const Stmt *T) {
   1747     return T->getStmtClass() == ExpressionTraitExprClass;
   1748   }
   1749   static bool classof(const ExpressionTraitExpr *) { return true; }
   1750 
   1751   // Iterators
   1752   child_range children() { return child_range(); }
   1753 
   1754   friend class ASTStmtReader;
   1755 };
   1756 
   1757 
   1758 /// \brief A reference to an overloaded function set, either an
   1759 /// \t UnresolvedLookupExpr or an \t UnresolvedMemberExpr.
   1760 class OverloadExpr : public Expr {
   1761   /// The results.  These are undesugared, which is to say, they may
   1762   /// include UsingShadowDecls.  Access is relative to the naming
   1763   /// class.
   1764   // FIXME: Allocate this data after the OverloadExpr subclass.
   1765   DeclAccessPair *Results;
   1766   unsigned NumResults;
   1767 
   1768   /// The common name of these declarations.
   1769   DeclarationNameInfo NameInfo;
   1770 
   1771   /// \brief The nested-name-specifier that qualifies the name, if any.
   1772   NestedNameSpecifierLoc QualifierLoc;
   1773 
   1774 protected:
   1775   /// True if the name was a template-id.
   1776   bool HasExplicitTemplateArgs;
   1777 
   1778   OverloadExpr(StmtClass K, ASTContext &C,
   1779                NestedNameSpecifierLoc QualifierLoc,
   1780                const DeclarationNameInfo &NameInfo,
   1781                const TemplateArgumentListInfo *TemplateArgs,
   1782                UnresolvedSetIterator Begin, UnresolvedSetIterator End,
   1783                bool KnownDependent,
   1784                bool KnownInstantiationDependent,
   1785                bool KnownContainsUnexpandedParameterPack);
   1786 
   1787   OverloadExpr(StmtClass K, EmptyShell Empty)
   1788     : Expr(K, Empty), Results(0), NumResults(0),
   1789       QualifierLoc(), HasExplicitTemplateArgs(false) { }
   1790 
   1791   void initializeResults(ASTContext &C,
   1792                          UnresolvedSetIterator Begin,
   1793                          UnresolvedSetIterator End);
   1794 
   1795 public:
   1796   struct FindResult {
   1797     OverloadExpr *Expression;
   1798     bool IsAddressOfOperand;
   1799     bool HasFormOfMemberPointer;
   1800   };
   1801 
   1802   /// Finds the overloaded expression in the given expression of
   1803   /// OverloadTy.
   1804   ///
   1805   /// \return the expression (which must be there) and true if it has
   1806   /// the particular form of a member pointer expression
   1807   static FindResult find(Expr *E) {
   1808     assert(E->getType()->isSpecificBuiltinType(BuiltinType::Overload));
   1809 
   1810     FindResult Result;
   1811 
   1812     E = E->IgnoreParens();
   1813     if (isa<UnaryOperator>(E)) {
   1814       assert(cast<UnaryOperator>(E)->getOpcode() == UO_AddrOf);
   1815       E = cast<UnaryOperator>(E)->getSubExpr();
   1816       OverloadExpr *Ovl = cast<OverloadExpr>(E->IgnoreParens());
   1817 
   1818       Result.HasFormOfMemberPointer = (E == Ovl && Ovl->getQualifier());
   1819       Result.IsAddressOfOperand = true;
   1820       Result.Expression = Ovl;
   1821     } else {
   1822       Result.HasFormOfMemberPointer = false;
   1823       Result.IsAddressOfOperand = false;
   1824       Result.Expression = cast<OverloadExpr>(E);
   1825     }
   1826 
   1827     return Result;
   1828   }
   1829 
   1830   /// Gets the naming class of this lookup, if any.
   1831   CXXRecordDecl *getNamingClass() const;
   1832 
   1833   typedef UnresolvedSetImpl::iterator decls_iterator;
   1834   decls_iterator decls_begin() const { return UnresolvedSetIterator(Results); }
   1835   decls_iterator decls_end() const {
   1836     return UnresolvedSetIterator(Results + NumResults);
   1837   }
   1838 
   1839   /// Gets the number of declarations in the unresolved set.
   1840   unsigned getNumDecls() const { return NumResults; }
   1841 
   1842   /// Gets the full name info.
   1843   const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
   1844 
   1845   /// Gets the name looked up.
   1846   DeclarationName getName() const { return NameInfo.getName(); }
   1847 
   1848   /// Gets the location of the name.
   1849   SourceLocation getNameLoc() const { return NameInfo.getLoc(); }
   1850 
   1851   /// Fetches the nested-name qualifier, if one was given.
   1852   NestedNameSpecifier *getQualifier() const {
   1853     return QualifierLoc.getNestedNameSpecifier();
   1854   }
   1855 
   1856   /// Fetches the nested-name qualifier with source-location information, if
   1857   /// one was given.
   1858   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
   1859 
   1860   /// \brief Determines whether this expression had an explicit
   1861   /// template argument list, e.g. f<int>.
   1862   bool hasExplicitTemplateArgs() const { return HasExplicitTemplateArgs; }
   1863 
   1864   ASTTemplateArgumentListInfo &getExplicitTemplateArgs(); // defined far below
   1865 
   1866   const ASTTemplateArgumentListInfo &getExplicitTemplateArgs() const {
   1867     return const_cast<OverloadExpr*>(this)->getExplicitTemplateArgs();
   1868   }
   1869 
   1870   /// \brief Retrieves the optional explicit template arguments.
   1871   /// This points to the same data as getExplicitTemplateArgs(), but
   1872   /// returns null if there are no explicit template arguments.
   1873   const ASTTemplateArgumentListInfo *getOptionalExplicitTemplateArgs() {
   1874     if (!hasExplicitTemplateArgs()) return 0;
   1875     return &getExplicitTemplateArgs();
   1876   }
   1877 
   1878   static bool classof(const Stmt *T) {
   1879     return T->getStmtClass() == UnresolvedLookupExprClass ||
   1880            T->getStmtClass() == UnresolvedMemberExprClass;
   1881   }
   1882   static bool classof(const OverloadExpr *) { return true; }
   1883 
   1884   friend class ASTStmtReader;
   1885   friend class ASTStmtWriter;
   1886 };
   1887 
   1888 /// \brief A reference to a name which we were able to look up during
   1889 /// parsing but could not resolve to a specific declaration.  This
   1890 /// arises in several ways:
   1891 ///   * we might be waiting for argument-dependent lookup
   1892 ///   * the name might resolve to an overloaded function
   1893 /// and eventually:
   1894 ///   * the lookup might have included a function template
   1895 /// These never include UnresolvedUsingValueDecls, which are always
   1896 /// class members and therefore appear only in
   1897 /// UnresolvedMemberLookupExprs.
   1898 class UnresolvedLookupExpr : public OverloadExpr {
   1899   /// True if these lookup results should be extended by
   1900   /// argument-dependent lookup if this is the operand of a function
   1901   /// call.
   1902   bool RequiresADL;
   1903 
   1904   /// True if namespace ::std should be considered an associated namespace
   1905   /// for the purposes of argument-dependent lookup. See C++0x [stmt.ranged]p1.
   1906   bool StdIsAssociatedNamespace;
   1907 
   1908   /// True if these lookup results are overloaded.  This is pretty
   1909   /// trivially rederivable if we urgently need to kill this field.
   1910   bool Overloaded;
   1911 
   1912   /// The naming class (C++ [class.access.base]p5) of the lookup, if
   1913   /// any.  This can generally be recalculated from the context chain,
   1914   /// but that can be fairly expensive for unqualified lookups.  If we
   1915   /// want to improve memory use here, this could go in a union
   1916   /// against the qualified-lookup bits.
   1917   CXXRecordDecl *NamingClass;
   1918 
   1919   UnresolvedLookupExpr(ASTContext &C,
   1920                        CXXRecordDecl *NamingClass,
   1921                        NestedNameSpecifierLoc QualifierLoc,
   1922                        const DeclarationNameInfo &NameInfo,
   1923                        bool RequiresADL, bool Overloaded,
   1924                        const TemplateArgumentListInfo *TemplateArgs,
   1925                        UnresolvedSetIterator Begin, UnresolvedSetIterator End,
   1926                        bool StdIsAssociatedNamespace)
   1927     : OverloadExpr(UnresolvedLookupExprClass, C, QualifierLoc, NameInfo,
   1928                    TemplateArgs, Begin, End, false, false, false),
   1929       RequiresADL(RequiresADL),
   1930       StdIsAssociatedNamespace(StdIsAssociatedNamespace),
   1931       Overloaded(Overloaded), NamingClass(NamingClass)
   1932   {}
   1933 
   1934   UnresolvedLookupExpr(EmptyShell Empty)
   1935     : OverloadExpr(UnresolvedLookupExprClass, Empty),
   1936       RequiresADL(false), StdIsAssociatedNamespace(false), Overloaded(false),
   1937       NamingClass(0)
   1938   {}
   1939 
   1940   friend class ASTStmtReader;
   1941 
   1942 public:
   1943   static UnresolvedLookupExpr *Create(ASTContext &C,
   1944                                       CXXRecordDecl *NamingClass,
   1945                                       NestedNameSpecifierLoc QualifierLoc,
   1946                                       const DeclarationNameInfo &NameInfo,
   1947                                       bool ADL, bool Overloaded,
   1948                                       UnresolvedSetIterator Begin,
   1949                                       UnresolvedSetIterator End,
   1950                                       bool StdIsAssociatedNamespace = false) {
   1951     assert((ADL || !StdIsAssociatedNamespace) &&
   1952            "std considered associated namespace when not performing ADL");
   1953     return new(C) UnresolvedLookupExpr(C, NamingClass, QualifierLoc, NameInfo,
   1954                                        ADL, Overloaded, 0, Begin, End,
   1955                                        StdIsAssociatedNamespace);
   1956   }
   1957 
   1958   static UnresolvedLookupExpr *Create(ASTContext &C,
   1959                                       CXXRecordDecl *NamingClass,
   1960                                       NestedNameSpecifierLoc QualifierLoc,
   1961                                       const DeclarationNameInfo &NameInfo,
   1962                                       bool ADL,
   1963                                       const TemplateArgumentListInfo &Args,
   1964                                       UnresolvedSetIterator Begin,
   1965                                       UnresolvedSetIterator End);
   1966 
   1967   static UnresolvedLookupExpr *CreateEmpty(ASTContext &C,
   1968                                            bool HasExplicitTemplateArgs,
   1969                                            unsigned NumTemplateArgs);
   1970 
   1971   /// True if this declaration should be extended by
   1972   /// argument-dependent lookup.
   1973   bool requiresADL() const { return RequiresADL; }
   1974 
   1975   /// True if namespace ::std should be artificially added to the set of
   1976   /// associated namespaecs for argument-dependent lookup purposes.
   1977   bool isStdAssociatedNamespace() const { return StdIsAssociatedNamespace; }
   1978 
   1979   /// True if this lookup is overloaded.
   1980   bool isOverloaded() const { return Overloaded; }
   1981 
   1982   /// Gets the 'naming class' (in the sense of C++0x
   1983   /// [class.access.base]p5) of the lookup.  This is the scope
   1984   /// that was looked in to find these results.
   1985   CXXRecordDecl *getNamingClass() const { return NamingClass; }
   1986 
   1987   // Note that, inconsistently with the explicit-template-argument AST
   1988   // nodes, users are *forbidden* from calling these methods on objects
   1989   // without explicit template arguments.
   1990 
   1991   ASTTemplateArgumentListInfo &getExplicitTemplateArgs() {
   1992     assert(hasExplicitTemplateArgs());
   1993     return *reinterpret_cast<ASTTemplateArgumentListInfo*>(this + 1);
   1994   }
   1995 
   1996   /// Gets a reference to the explicit template argument list.
   1997   const ASTTemplateArgumentListInfo &getExplicitTemplateArgs() const {
   1998     assert(hasExplicitTemplateArgs());
   1999     return *reinterpret_cast<const ASTTemplateArgumentListInfo*>(this + 1);
   2000   }
   2001 
   2002   /// \brief Retrieves the optional explicit template arguments.
   2003   /// This points to the same data as getExplicitTemplateArgs(), but
   2004   /// returns null if there are no explicit template arguments.
   2005   const ASTTemplateArgumentListInfo *getOptionalExplicitTemplateArgs() {
   2006     if (!hasExplicitTemplateArgs()) return 0;
   2007     return &getExplicitTemplateArgs();
   2008   }
   2009 
   2010   /// \brief Copies the template arguments (if present) into the given
   2011   /// structure.
   2012   void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
   2013     getExplicitTemplateArgs().copyInto(List);
   2014   }
   2015 
   2016   SourceLocation getLAngleLoc() const {
   2017     return getExplicitTemplateArgs().LAngleLoc;
   2018   }
   2019 
   2020   SourceLocation getRAngleLoc() const {
   2021     return getExplicitTemplateArgs().RAngleLoc;
   2022   }
   2023 
   2024   TemplateArgumentLoc const *getTemplateArgs() const {
   2025     return getExplicitTemplateArgs().getTemplateArgs();
   2026   }
   2027 
   2028   unsigned getNumTemplateArgs() const {
   2029     return getExplicitTemplateArgs().NumTemplateArgs;
   2030   }
   2031 
   2032   SourceRange getSourceRange() const {
   2033     SourceRange Range(getNameInfo().getSourceRange());
   2034     if (getQualifierLoc())
   2035       Range.setBegin(getQualifierLoc().getBeginLoc());
   2036     if (hasExplicitTemplateArgs())
   2037       Range.setEnd(getRAngleLoc());
   2038     return Range;
   2039   }
   2040 
   2041   child_range children() { return child_range(); }
   2042 
   2043   static bool classof(const Stmt *T) {
   2044     return T->getStmtClass() == UnresolvedLookupExprClass;
   2045   }
   2046   static bool classof(const UnresolvedLookupExpr *) { return true; }
   2047 };
   2048 
   2049 /// \brief A qualified reference to a name whose declaration cannot
   2050 /// yet be resolved.
   2051 ///
   2052 /// DependentScopeDeclRefExpr is similar to DeclRefExpr in that
   2053 /// it expresses a reference to a declaration such as
   2054 /// X<T>::value. The difference, however, is that an
   2055 /// DependentScopeDeclRefExpr node is used only within C++ templates when
   2056 /// the qualification (e.g., X<T>::) refers to a dependent type. In
   2057 /// this case, X<T>::value cannot resolve to a declaration because the
   2058 /// declaration will differ from on instantiation of X<T> to the
   2059 /// next. Therefore, DependentScopeDeclRefExpr keeps track of the
   2060 /// qualifier (X<T>::) and the name of the entity being referenced
   2061 /// ("value"). Such expressions will instantiate to a DeclRefExpr once the
   2062 /// declaration can be found.
   2063 class DependentScopeDeclRefExpr : public Expr {
   2064   /// \brief The nested-name-specifier that qualifies this unresolved
   2065   /// declaration name.
   2066   NestedNameSpecifierLoc QualifierLoc;
   2067 
   2068   /// The name of the entity we will be referencing.
   2069   DeclarationNameInfo NameInfo;
   2070 
   2071   /// \brief Whether the name includes explicit template arguments.
   2072   bool HasExplicitTemplateArgs;
   2073 
   2074   DependentScopeDeclRefExpr(QualType T,
   2075                             NestedNameSpecifierLoc QualifierLoc,
   2076                             const DeclarationNameInfo &NameInfo,
   2077                             const TemplateArgumentListInfo *Args);
   2078 
   2079 public:
   2080   static DependentScopeDeclRefExpr *Create(ASTContext &C,
   2081                                            NestedNameSpecifierLoc QualifierLoc,
   2082                                            const DeclarationNameInfo &NameInfo,
   2083                               const TemplateArgumentListInfo *TemplateArgs = 0);
   2084 
   2085   static DependentScopeDeclRefExpr *CreateEmpty(ASTContext &C,
   2086                                                 bool HasExplicitTemplateArgs,
   2087                                                 unsigned NumTemplateArgs);
   2088 
   2089   /// \brief Retrieve the name that this expression refers to.
   2090   const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
   2091 
   2092   /// \brief Retrieve the name that this expression refers to.
   2093   DeclarationName getDeclName() const { return NameInfo.getName(); }
   2094 
   2095   /// \brief Retrieve the location of the name within the expression.
   2096   SourceLocation getLocation() const { return NameInfo.getLoc(); }
   2097 
   2098   /// \brief Retrieve the nested-name-specifier that qualifies the
   2099   /// name, with source location information.
   2100   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
   2101 
   2102 
   2103   /// \brief Retrieve the nested-name-specifier that qualifies this
   2104   /// declaration.
   2105   NestedNameSpecifier *getQualifier() const {
   2106     return QualifierLoc.getNestedNameSpecifier();
   2107   }
   2108 
   2109   /// Determines whether this lookup had explicit template arguments.
   2110   bool hasExplicitTemplateArgs() const { return HasExplicitTemplateArgs; }
   2111 
   2112   // Note that, inconsistently with the explicit-template-argument AST
   2113   // nodes, users are *forbidden* from calling these methods on objects
   2114   // without explicit template arguments.
   2115 
   2116   ASTTemplateArgumentListInfo &getExplicitTemplateArgs() {
   2117     assert(hasExplicitTemplateArgs());
   2118     return *reinterpret_cast<ASTTemplateArgumentListInfo*>(this + 1);
   2119   }
   2120 
   2121   /// Gets a reference to the explicit template argument list.
   2122   const ASTTemplateArgumentListInfo &getExplicitTemplateArgs() const {
   2123     assert(hasExplicitTemplateArgs());
   2124     return *reinterpret_cast<const ASTTemplateArgumentListInfo*>(this + 1);
   2125   }
   2126 
   2127   /// \brief Retrieves the optional explicit template arguments.
   2128   /// This points to the same data as getExplicitTemplateArgs(), but
   2129   /// returns null if there are no explicit template arguments.
   2130   const ASTTemplateArgumentListInfo *getOptionalExplicitTemplateArgs() {
   2131     if (!hasExplicitTemplateArgs()) return 0;
   2132     return &getExplicitTemplateArgs();
   2133   }
   2134 
   2135   /// \brief Copies the template arguments (if present) into the given
   2136   /// structure.
   2137   void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
   2138     getExplicitTemplateArgs().copyInto(List);
   2139   }
   2140 
   2141   SourceLocation getLAngleLoc() const {
   2142     return getExplicitTemplateArgs().LAngleLoc;
   2143   }
   2144 
   2145   SourceLocation getRAngleLoc() const {
   2146     return getExplicitTemplateArgs().RAngleLoc;
   2147   }
   2148 
   2149   TemplateArgumentLoc const *getTemplateArgs() const {
   2150     return getExplicitTemplateArgs().getTemplateArgs();
   2151   }
   2152 
   2153   unsigned getNumTemplateArgs() const {
   2154     return getExplicitTemplateArgs().NumTemplateArgs;
   2155   }
   2156 
   2157   SourceRange getSourceRange() const {
   2158     SourceRange Range(QualifierLoc.getBeginLoc(), getLocation());
   2159     if (hasExplicitTemplateArgs())
   2160       Range.setEnd(getRAngleLoc());
   2161     return Range;
   2162   }
   2163 
   2164   static bool classof(const Stmt *T) {
   2165     return T->getStmtClass() == DependentScopeDeclRefExprClass;
   2166   }
   2167   static bool classof(const DependentScopeDeclRefExpr *) { return true; }
   2168 
   2169   child_range children() { return child_range(); }
   2170 
   2171   friend class ASTStmtReader;
   2172   friend class ASTStmtWriter;
   2173 };
   2174 
   2175 /// Represents an expression --- generally a full-expression --- which
   2176 /// introduces cleanups to be run at the end of the sub-expression's
   2177 /// evaluation.  The most common source of expression-introduced
   2178 /// cleanups is temporary objects in C++, but several other C++
   2179 /// expressions can create cleanups.
   2180 class ExprWithCleanups : public Expr {
   2181   Stmt *SubExpr;
   2182 
   2183   CXXTemporary **Temps;
   2184   unsigned NumTemps;
   2185 
   2186   ExprWithCleanups(ASTContext &C, Expr *SubExpr,
   2187                    CXXTemporary **Temps, unsigned NumTemps);
   2188 
   2189 public:
   2190   ExprWithCleanups(EmptyShell Empty)
   2191     : Expr(ExprWithCleanupsClass, Empty),
   2192       SubExpr(0), Temps(0), NumTemps(0) {}
   2193 
   2194   static ExprWithCleanups *Create(ASTContext &C, Expr *SubExpr,
   2195                                         CXXTemporary **Temps,
   2196                                         unsigned NumTemps);
   2197 
   2198   unsigned getNumTemporaries() const { return NumTemps; }
   2199   void setNumTemporaries(ASTContext &C, unsigned N);
   2200 
   2201   CXXTemporary *getTemporary(unsigned i) {
   2202     assert(i < NumTemps && "Index out of range");
   2203     return Temps[i];
   2204   }
   2205   const CXXTemporary *getTemporary(unsigned i) const {
   2206     return const_cast<ExprWithCleanups*>(this)->getTemporary(i);
   2207   }
   2208   void setTemporary(unsigned i, CXXTemporary *T) {
   2209     assert(i < NumTemps && "Index out of range");
   2210     Temps[i] = T;
   2211   }
   2212 
   2213   Expr *getSubExpr() { return cast<Expr>(SubExpr); }
   2214   const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
   2215   void setSubExpr(Expr *E) { SubExpr = E; }
   2216 
   2217   SourceRange getSourceRange() const {
   2218     return SubExpr->getSourceRange();
   2219   }
   2220 
   2221   // Implement isa/cast/dyncast/etc.
   2222   static bool classof(const Stmt *T) {
   2223     return T->getStmtClass() == ExprWithCleanupsClass;
   2224   }
   2225   static bool classof(const ExprWithCleanups *) { return true; }
   2226 
   2227   // Iterators
   2228   child_range children() { return child_range(&SubExpr, &SubExpr + 1); }
   2229 };
   2230 
   2231 /// \brief Describes an explicit type conversion that uses functional
   2232 /// notion but could not be resolved because one or more arguments are
   2233 /// type-dependent.
   2234 ///
   2235 /// The explicit type conversions expressed by
   2236 /// CXXUnresolvedConstructExpr have the form \c T(a1, a2, ..., aN),
   2237 /// where \c T is some type and \c a1, a2, ..., aN are values, and
   2238 /// either \C T is a dependent type or one or more of the \c a's is
   2239 /// type-dependent. For example, this would occur in a template such
   2240 /// as:
   2241 ///
   2242 /// \code
   2243 ///   template<typename T, typename A1>
   2244 ///   inline T make_a(const A1& a1) {
   2245 ///     return T(a1);
   2246 ///   }
   2247 /// \endcode
   2248 ///
   2249 /// When the returned expression is instantiated, it may resolve to a
   2250 /// constructor call, conversion function call, or some kind of type
   2251 /// conversion.
   2252 class CXXUnresolvedConstructExpr : public Expr {
   2253   /// \brief The type being constructed.
   2254   TypeSourceInfo *Type;
   2255 
   2256   /// \brief The location of the left parentheses ('(').
   2257   SourceLocation LParenLoc;
   2258 
   2259   /// \brief The location of the right parentheses (')').
   2260   SourceLocation RParenLoc;
   2261 
   2262   /// \brief The number of arguments used to construct the type.
   2263   unsigned NumArgs;
   2264 
   2265   CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
   2266                              SourceLocation LParenLoc,
   2267                              Expr **Args,
   2268                              unsigned NumArgs,
   2269                              SourceLocation RParenLoc);
   2270 
   2271   CXXUnresolvedConstructExpr(EmptyShell Empty, unsigned NumArgs)
   2272     : Expr(CXXUnresolvedConstructExprClass, Empty), Type(), NumArgs(NumArgs) { }
   2273 
   2274   friend class ASTStmtReader;
   2275 
   2276 public:
   2277   static CXXUnresolvedConstructExpr *Create(ASTContext &C,
   2278                                             TypeSourceInfo *Type,
   2279                                             SourceLocation LParenLoc,
   2280                                             Expr **Args,
   2281                                             unsigned NumArgs,
   2282                                             SourceLocation RParenLoc);
   2283 
   2284   static CXXUnresolvedConstructExpr *CreateEmpty(ASTContext &C,
   2285                                                  unsigned NumArgs);
   2286 
   2287   /// \brief Retrieve the type that is being constructed, as specified
   2288   /// in the source code.
   2289   QualType getTypeAsWritten() const { return Type->getType(); }
   2290 
   2291   /// \brief Retrieve the type source information for the type being
   2292   /// constructed.
   2293   TypeSourceInfo *getTypeSourceInfo() const { return Type; }
   2294 
   2295   /// \brief Retrieve the location of the left parentheses ('(') that
   2296   /// precedes the argument list.
   2297   SourceLocation getLParenLoc() const { return LParenLoc; }
   2298   void setLParenLoc(SourceLocation L) { LParenLoc = L; }
   2299 
   2300   /// \brief Retrieve the location of the right parentheses (')') that
   2301   /// follows the argument list.
   2302   SourceLocation getRParenLoc() const { return RParenLoc; }
   2303   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
   2304 
   2305   /// \brief Retrieve the number of arguments.
   2306   unsigned arg_size() const { return NumArgs; }
   2307 
   2308   typedef Expr** arg_iterator;
   2309   arg_iterator arg_begin() { return reinterpret_cast<Expr**>(this + 1); }
   2310   arg_iterator arg_end() { return arg_begin() + NumArgs; }
   2311 
   2312   typedef const Expr* const * const_arg_iterator;
   2313   const_arg_iterator arg_begin() const {
   2314     return reinterpret_cast<const Expr* const *>(this + 1);
   2315   }
   2316   const_arg_iterator arg_end() const {
   2317     return arg_begin() + NumArgs;
   2318   }
   2319 
   2320   Expr *getArg(unsigned I) {
   2321     assert(I < NumArgs && "Argument index out-of-range");
   2322     return *(arg_begin() + I);
   2323   }
   2324 
   2325   const Expr *getArg(unsigned I) const {
   2326     assert(I < NumArgs && "Argument index out-of-range");
   2327     return *(arg_begin() + I);
   2328   }
   2329 
   2330   void setArg(unsigned I, Expr *E) {
   2331     assert(I < NumArgs && "Argument index out-of-range");
   2332     *(arg_begin() + I) = E;
   2333   }
   2334 
   2335   SourceRange getSourceRange() const;
   2336 
   2337   static bool classof(const Stmt *T) {
   2338     return T->getStmtClass() == CXXUnresolvedConstructExprClass;
   2339   }
   2340   static bool classof(const CXXUnresolvedConstructExpr *) { return true; }
   2341 
   2342   // Iterators
   2343   child_range children() {
   2344     Stmt **begin = reinterpret_cast<Stmt**>(this+1);
   2345     return child_range(begin, begin + NumArgs);
   2346   }
   2347 };
   2348 
   2349 /// \brief Represents a C++ member access expression where the actual
   2350 /// member referenced could not be resolved because the base
   2351 /// expression or the member name was dependent.
   2352 ///
   2353 /// Like UnresolvedMemberExprs, these can be either implicit or
   2354 /// explicit accesses.  It is only possible to get one of these with
   2355 /// an implicit access if a qualifier is provided.
   2356 class CXXDependentScopeMemberExpr : public Expr {
   2357   /// \brief The expression for the base pointer or class reference,
   2358   /// e.g., the \c x in x.f.  Can be null in implicit accesses.
   2359   Stmt *Base;
   2360 
   2361   /// \brief The type of the base expression.  Never null, even for
   2362   /// implicit accesses.
   2363   QualType BaseType;
   2364 
   2365   /// \brief Whether this member expression used the '->' operator or
   2366   /// the '.' operator.
   2367   bool IsArrow : 1;
   2368 
   2369   /// \brief Whether this member expression has explicitly-specified template
   2370   /// arguments.
   2371   bool HasExplicitTemplateArgs : 1;
   2372 
   2373   /// \brief The location of the '->' or '.' operator.
   2374   SourceLocation OperatorLoc;
   2375 
   2376   /// \brief The nested-name-specifier that precedes the member name, if any.
   2377   NestedNameSpecifierLoc QualifierLoc;
   2378 
   2379   /// \brief In a qualified member access expression such as t->Base::f, this
   2380   /// member stores the resolves of name lookup in the context of the member
   2381   /// access expression, to be used at instantiation time.
   2382   ///
   2383   /// FIXME: This member, along with the QualifierLoc, could
   2384   /// be stuck into a structure that is optionally allocated at the end of
   2385   /// the CXXDependentScopeMemberExpr, to save space in the common case.
   2386   NamedDecl *FirstQualifierFoundInScope;
   2387 
   2388   /// \brief The member to which this member expression refers, which
   2389   /// can be name, overloaded operator, or destructor.
   2390   /// FIXME: could also be a template-id
   2391   DeclarationNameInfo MemberNameInfo;
   2392 
   2393   CXXDependentScopeMemberExpr(ASTContext &C,
   2394                           Expr *Base, QualType BaseType, bool IsArrow,
   2395                           SourceLocation OperatorLoc,
   2396                           NestedNameSpecifierLoc QualifierLoc,
   2397                           NamedDecl *FirstQualifierFoundInScope,
   2398                           DeclarationNameInfo MemberNameInfo,
   2399                           const TemplateArgumentListInfo *TemplateArgs);
   2400 
   2401 public:
   2402   CXXDependentScopeMemberExpr(ASTContext &C,
   2403                               Expr *Base, QualType BaseType,
   2404                               bool IsArrow,
   2405                               SourceLocation OperatorLoc,
   2406                               NestedNameSpecifierLoc QualifierLoc,
   2407                               NamedDecl *FirstQualifierFoundInScope,
   2408                               DeclarationNameInfo MemberNameInfo);
   2409 
   2410   static CXXDependentScopeMemberExpr *
   2411   Create(ASTContext &C,
   2412          Expr *Base, QualType BaseType, bool IsArrow,
   2413          SourceLocation OperatorLoc,
   2414          NestedNameSpecifierLoc QualifierLoc,
   2415          NamedDecl *FirstQualifierFoundInScope,
   2416          DeclarationNameInfo MemberNameInfo,
   2417          const TemplateArgumentListInfo *TemplateArgs);
   2418 
   2419   static CXXDependentScopeMemberExpr *
   2420   CreateEmpty(ASTContext &C, bool HasExplicitTemplateArgs,
   2421               unsigned NumTemplateArgs);
   2422 
   2423   /// \brief True if this is an implicit access, i.e. one in which the
   2424   /// member being accessed was not written in the source.  The source
   2425   /// location of the operator is invalid in this case.
   2426   bool isImplicitAccess() const;
   2427 
   2428   /// \brief Retrieve the base object of this member expressions,
   2429   /// e.g., the \c x in \c x.m.
   2430   Expr *getBase() const {
   2431     assert(!isImplicitAccess());
   2432     return cast<Expr>(Base);
   2433   }
   2434 
   2435   QualType getBaseType() const { return BaseType; }
   2436 
   2437   /// \brief Determine whether this member expression used the '->'
   2438   /// operator; otherwise, it used the '.' operator.
   2439   bool isArrow() const { return IsArrow; }
   2440 
   2441   /// \brief Retrieve the location of the '->' or '.' operator.
   2442   SourceLocation getOperatorLoc() const { return OperatorLoc; }
   2443 
   2444   /// \brief Retrieve the nested-name-specifier that qualifies the member
   2445   /// name.
   2446   NestedNameSpecifier *getQualifier() const {
   2447     return QualifierLoc.getNestedNameSpecifier();
   2448   }
   2449 
   2450   /// \brief Retrieve the nested-name-specifier that qualifies the member
   2451   /// name, with source location information.
   2452   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
   2453 
   2454 
   2455   /// \brief Retrieve the first part of the nested-name-specifier that was
   2456   /// found in the scope of the member access expression when the member access
   2457   /// was initially parsed.
   2458   ///
   2459   /// This function only returns a useful result when member access expression
   2460   /// uses a qualified member name, e.g., "x.Base::f". Here, the declaration
   2461   /// returned by this function describes what was found by unqualified name
   2462   /// lookup for the identifier "Base" within the scope of the member access
   2463   /// expression itself. At template instantiation time, this information is
   2464   /// combined with the results of name lookup into the type of the object
   2465   /// expression itself (the class type of x).
   2466   NamedDecl *getFirstQualifierFoundInScope() const {
   2467     return FirstQualifierFoundInScope;
   2468   }
   2469 
   2470   /// \brief Retrieve the name of the member that this expression
   2471   /// refers to.
   2472   const DeclarationNameInfo &getMemberNameInfo() const {
   2473     return MemberNameInfo;
   2474   }
   2475 
   2476   /// \brief Retrieve the name of the member that this expression
   2477   /// refers to.
   2478   DeclarationName getMember() const { return MemberNameInfo.getName(); }
   2479 
   2480   // \brief Retrieve the location of the name of the member that this
   2481   // expression refers to.
   2482   SourceLocation getMemberLoc() const { return MemberNameInfo.getLoc(); }
   2483 
   2484   /// \brief Determines whether this member expression actually had a C++
   2485   /// template argument list explicitly specified, e.g., x.f<int>.
   2486   bool hasExplicitTemplateArgs() const {
   2487     return HasExplicitTemplateArgs;
   2488   }
   2489 
   2490   /// \brief Retrieve the explicit template argument list that followed the
   2491   /// member template name, if any.
   2492   ASTTemplateArgumentListInfo &getExplicitTemplateArgs() {
   2493     assert(HasExplicitTemplateArgs);
   2494     return *reinterpret_cast<ASTTemplateArgumentListInfo *>(this + 1);
   2495   }
   2496 
   2497   /// \brief Retrieve the explicit template argument list that followed the
   2498   /// member template name, if any.
   2499   const ASTTemplateArgumentListInfo &getExplicitTemplateArgs() const {
   2500     return const_cast<CXXDependentScopeMemberExpr *>(this)
   2501              ->getExplicitTemplateArgs();
   2502   }
   2503 
   2504   /// \brief Retrieves the optional explicit template arguments.
   2505   /// This points to the same data as getExplicitTemplateArgs(), but
   2506   /// returns null if there are no explicit template arguments.
   2507   const ASTTemplateArgumentListInfo *getOptionalExplicitTemplateArgs() {
   2508     if (!hasExplicitTemplateArgs()) return 0;
   2509     return &getExplicitTemplateArgs();
   2510   }
   2511 
   2512   /// \brief Copies the template arguments (if present) into the given
   2513   /// structure.
   2514   void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
   2515     getExplicitTemplateArgs().copyInto(List);
   2516   }
   2517 
   2518   /// \brief Initializes the template arguments using the given structure.
   2519   void initializeTemplateArgumentsFrom(const TemplateArgumentListInfo &List) {
   2520     getExplicitTemplateArgs().initializeFrom(List);
   2521   }
   2522 
   2523   /// \brief Retrieve the location of the left angle bracket following the
   2524   /// member name ('<'), if any.
   2525   SourceLocation getLAngleLoc() const {
   2526     return getExplicitTemplateArgs().LAngleLoc;
   2527   }
   2528 
   2529   /// \brief Retrieve the template arguments provided as part of this
   2530   /// template-id.
   2531   const TemplateArgumentLoc *getTemplateArgs() const {
   2532     return getExplicitTemplateArgs().getTemplateArgs();
   2533   }
   2534 
   2535   /// \brief Retrieve the number of template arguments provided as part of this
   2536   /// template-id.
   2537   unsigned getNumTemplateArgs() const {
   2538     return getExplicitTemplateArgs().NumTemplateArgs;
   2539   }
   2540 
   2541   /// \brief Retrieve the location of the right angle bracket following the
   2542   /// template arguments ('>').
   2543   SourceLocation getRAngleLoc() const {
   2544     return getExplicitTemplateArgs().RAngleLoc;
   2545   }
   2546 
   2547   SourceRange getSourceRange() const {
   2548     SourceRange Range;
   2549     if (!isImplicitAccess())
   2550       Range.setBegin(Base->getSourceRange().getBegin());
   2551     else if (getQualifier())
   2552       Range.setBegin(getQualifierLoc().getBeginLoc());
   2553     else
   2554       Range.setBegin(MemberNameInfo.getBeginLoc());
   2555 
   2556     if (hasExplicitTemplateArgs())
   2557       Range.setEnd(getRAngleLoc());
   2558     else
   2559       Range.setEnd(MemberNameInfo.getEndLoc());
   2560     return Range;
   2561   }
   2562 
   2563   static bool classof(const Stmt *T) {
   2564     return T->getStmtClass() == CXXDependentScopeMemberExprClass;
   2565   }
   2566   static bool classof(const CXXDependentScopeMemberExpr *) { return true; }
   2567 
   2568   // Iterators
   2569   child_range children() {
   2570     if (isImplicitAccess()) return child_range();
   2571     return child_range(&Base, &Base + 1);
   2572   }
   2573 
   2574   friend class ASTStmtReader;
   2575   friend class ASTStmtWriter;
   2576 };
   2577 
   2578 /// \brief Represents a C++ member access expression for which lookup
   2579 /// produced a set of overloaded functions.
   2580 ///
   2581 /// The member access may be explicit or implicit:
   2582 ///    struct A {
   2583 ///      int a, b;
   2584 ///      int explicitAccess() { return this->a + this->A::b; }
   2585 ///      int implicitAccess() { return a + A::b; }
   2586 ///    };
   2587 ///
   2588 /// In the final AST, an explicit access always becomes a MemberExpr.
   2589 /// An implicit access may become either a MemberExpr or a
   2590 /// DeclRefExpr, depending on whether the member is static.
   2591 class UnresolvedMemberExpr : public OverloadExpr {
   2592   /// \brief Whether this member expression used the '->' operator or
   2593   /// the '.' operator.
   2594   bool IsArrow : 1;
   2595 
   2596   /// \brief Whether the lookup results contain an unresolved using
   2597   /// declaration.
   2598   bool HasUnresolvedUsing : 1;
   2599 
   2600   /// \brief The expression for the base pointer or class reference,
   2601   /// e.g., the \c x in x.f.  This can be null if this is an 'unbased'
   2602   /// member expression
   2603   Stmt *Base;
   2604 
   2605   /// \brief The type of the base expression;  never null.
   2606   QualType BaseType;
   2607 
   2608   /// \brief The location of the '->' or '.' operator.
   2609   SourceLocation OperatorLoc;
   2610 
   2611   UnresolvedMemberExpr(ASTContext &C, bool HasUnresolvedUsing,
   2612                        Expr *Base, QualType BaseType, bool IsArrow,
   2613                        SourceLocation OperatorLoc,
   2614                        NestedNameSpecifierLoc QualifierLoc,
   2615                        const DeclarationNameInfo &MemberNameInfo,
   2616                        const TemplateArgumentListInfo *TemplateArgs,
   2617                        UnresolvedSetIterator Begin, UnresolvedSetIterator End);
   2618 
   2619   UnresolvedMemberExpr(EmptyShell Empty)
   2620     : OverloadExpr(UnresolvedMemberExprClass, Empty), IsArrow(false),
   2621       HasUnresolvedUsing(false), Base(0) { }
   2622 
   2623   friend class ASTStmtReader;
   2624 
   2625 public:
   2626   static UnresolvedMemberExpr *
   2627   Create(ASTContext &C, bool HasUnresolvedUsing,
   2628          Expr *Base, QualType BaseType, bool IsArrow,
   2629          SourceLocation OperatorLoc,
   2630          NestedNameSpecifierLoc QualifierLoc,
   2631          const DeclarationNameInfo &MemberNameInfo,
   2632          const TemplateArgumentListInfo *TemplateArgs,
   2633          UnresolvedSetIterator Begin, UnresolvedSetIterator End);
   2634 
   2635   static UnresolvedMemberExpr *
   2636   CreateEmpty(ASTContext &C, bool HasExplicitTemplateArgs,
   2637               unsigned NumTemplateArgs);
   2638 
   2639   /// \brief True if this is an implicit access, i.e. one in which the
   2640   /// member being accessed was not written in the source.  The source
   2641   /// location of the operator is invalid in this case.
   2642   bool isImplicitAccess() const;
   2643 
   2644   /// \brief Retrieve the base object of this member expressions,
   2645   /// e.g., the \c x in \c x.m.
   2646   Expr *getBase() {
   2647     assert(!isImplicitAccess());
   2648     return cast<Expr>(Base);
   2649   }
   2650   const Expr *getBase() const {
   2651     assert(!isImplicitAccess());
   2652     return cast<Expr>(Base);
   2653   }
   2654 
   2655   QualType getBaseType() const { return BaseType; }
   2656 
   2657   /// \brief Determine whether the lookup results contain an unresolved using
   2658   /// declaration.
   2659   bool hasUnresolvedUsing() const { return HasUnresolvedUsing; }
   2660 
   2661   /// \brief Determine whether this member expression used the '->'
   2662   /// operator; otherwise, it used the '.' operator.
   2663   bool isArrow() const { return IsArrow; }
   2664 
   2665   /// \brief Retrieve the location of the '->' or '.' operator.
   2666   SourceLocation getOperatorLoc() const { return OperatorLoc; }
   2667 
   2668   /// \brief Retrieves the naming class of this lookup.
   2669   CXXRecordDecl *getNamingClass() const;
   2670 
   2671   /// \brief Retrieve the full name info for the member that this expression
   2672   /// refers to.
   2673   const DeclarationNameInfo &getMemberNameInfo() const { return getNameInfo(); }
   2674 
   2675   /// \brief Retrieve the name of the member that this expression
   2676   /// refers to.
   2677   DeclarationName getMemberName() const { return getName(); }
   2678 
   2679   // \brief Retrieve the location of the name of the member that this
   2680   // expression refers to.
   2681   SourceLocation getMemberLoc() const { return getNameLoc(); }
   2682 
   2683   /// \brief Retrieve the explicit template argument list that followed the
   2684   /// member template name.
   2685   ASTTemplateArgumentListInfo &getExplicitTemplateArgs() {
   2686     assert(hasExplicitTemplateArgs());
   2687     return *reinterpret_cast<ASTTemplateArgumentListInfo *>(this + 1);
   2688   }
   2689 
   2690   /// \brief Retrieve the explicit template argument list that followed the
   2691   /// member template name, if any.
   2692   const ASTTemplateArgumentListInfo &getExplicitTemplateArgs() const {
   2693     assert(hasExplicitTemplateArgs());
   2694     return *reinterpret_cast<const ASTTemplateArgumentListInfo *>(this + 1);
   2695   }
   2696 
   2697   /// \brief Retrieves the optional explicit template arguments.
   2698   /// This points to the same data as getExplicitTemplateArgs(), but
   2699   /// returns null if there are no explicit template arguments.
   2700   const ASTTemplateArgumentListInfo *getOptionalExplicitTemplateArgs() {
   2701     if (!hasExplicitTemplateArgs()) return 0;
   2702     return &getExplicitTemplateArgs();
   2703   }
   2704 
   2705   /// \brief Copies the template arguments into the given structure.
   2706   void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
   2707     getExplicitTemplateArgs().copyInto(List);
   2708   }
   2709 
   2710   /// \brief Retrieve the location of the left angle bracket following
   2711   /// the member name ('<').
   2712   SourceLocation getLAngleLoc() const {
   2713     return getExplicitTemplateArgs().LAngleLoc;
   2714   }
   2715 
   2716   /// \brief Retrieve the template arguments provided as part of this
   2717   /// template-id.
   2718   const TemplateArgumentLoc *getTemplateArgs() const {
   2719     return getExplicitTemplateArgs().getTemplateArgs();
   2720   }
   2721 
   2722   /// \brief Retrieve the number of template arguments provided as
   2723   /// part of this template-id.
   2724   unsigned getNumTemplateArgs() const {
   2725     return getExplicitTemplateArgs().NumTemplateArgs;
   2726   }
   2727 
   2728   /// \brief Retrieve the location of the right angle bracket
   2729   /// following the template arguments ('>').
   2730   SourceLocation getRAngleLoc() const {
   2731     return getExplicitTemplateArgs().RAngleLoc;
   2732   }
   2733 
   2734   SourceRange getSourceRange() const {
   2735     SourceRange Range = getMemberNameInfo().getSourceRange();
   2736     if (!isImplicitAccess())
   2737       Range.setBegin(Base->getSourceRange().getBegin());
   2738     else if (getQualifierLoc())
   2739       Range.setBegin(getQualifierLoc().getBeginLoc());
   2740 
   2741     if (hasExplicitTemplateArgs())
   2742       Range.setEnd(getRAngleLoc());
   2743     return Range;
   2744   }
   2745 
   2746   static bool classof(const Stmt *T) {
   2747     return T->getStmtClass() == UnresolvedMemberExprClass;
   2748   }
   2749   static bool classof(const UnresolvedMemberExpr *) { return true; }
   2750 
   2751   // Iterators
   2752   child_range children() {
   2753     if (isImplicitAccess()) return child_range();
   2754     return child_range(&Base, &Base + 1);
   2755   }
   2756 };
   2757 
   2758 /// \brief Represents a C++0x noexcept expression (C++ [expr.unary.noexcept]).
   2759 ///
   2760 /// The noexcept expression tests whether a given expression might throw. Its
   2761 /// result is a boolean constant.
   2762 class CXXNoexceptExpr : public Expr {
   2763   bool Value : 1;
   2764   Stmt *Operand;
   2765   SourceRange Range;
   2766 
   2767   friend class ASTStmtReader;
   2768 
   2769 public:
   2770   CXXNoexceptExpr(QualType Ty, Expr *Operand, CanThrowResult Val,
   2771                   SourceLocation Keyword, SourceLocation RParen)
   2772     : Expr(CXXNoexceptExprClass, Ty, VK_RValue, OK_Ordinary,
   2773            /*TypeDependent*/false,
   2774            /*ValueDependent*/Val == CT_Dependent,
   2775            Val == CT_Dependent || Operand->isInstantiationDependent(),
   2776            Operand->containsUnexpandedParameterPack()),
   2777       Value(Val == CT_Cannot), Operand(Operand), Range(Keyword, RParen)
   2778   { }
   2779 
   2780   CXXNoexceptExpr(EmptyShell Empty)
   2781     : Expr(CXXNoexceptExprClass, Empty)
   2782   { }
   2783 
   2784   Expr *getOperand() const { return static_cast<Expr*>(Operand); }
   2785 
   2786   SourceRange getSourceRange() const { return Range; }
   2787 
   2788   bool getValue() const { return Value; }
   2789 
   2790   static bool classof(const Stmt *T) {
   2791     return T->getStmtClass() == CXXNoexceptExprClass;
   2792   }
   2793   static bool classof(const CXXNoexceptExpr *) { return true; }
   2794 
   2795   // Iterators
   2796   child_range children() { return child_range(&Operand, &Operand + 1); }
   2797 };
   2798 
   2799 /// \brief Represents a C++0x pack expansion that produces a sequence of
   2800 /// expressions.
   2801 ///
   2802 /// A pack expansion expression contains a pattern (which itself is an
   2803 /// expression) followed by an ellipsis. For example:
   2804 ///
   2805 /// \code
   2806 /// template<typename F, typename ...Types>
   2807 /// void forward(F f, Types &&...args) {
   2808 ///   f(static_cast<Types&&>(args)...);
   2809 /// }
   2810 /// \endcode
   2811 ///
   2812 /// Here, the argument to the function object \c f is a pack expansion whose
   2813 /// pattern is \c static_cast<Types&&>(args). When the \c forward function
   2814 /// template is instantiated, the pack expansion will instantiate to zero or
   2815 /// or more function arguments to the function object \c f.
   2816 class PackExpansionExpr : public Expr {
   2817   SourceLocation EllipsisLoc;
   2818 
   2819   /// \brief The number of expansions that will be produced by this pack
   2820   /// expansion expression, if known.
   2821   ///
   2822   /// When zero, the number of expansions is not known. Otherwise, this value
   2823   /// is the number of expansions + 1.
   2824   unsigned NumExpansions;
   2825 
   2826   Stmt *Pattern;
   2827 
   2828   friend class ASTStmtReader;
   2829   friend class ASTStmtWriter;
   2830 
   2831 public:
   2832   PackExpansionExpr(QualType T, Expr *Pattern, SourceLocation EllipsisLoc,
   2833                     llvm::Optional<unsigned> NumExpansions)
   2834     : Expr(PackExpansionExprClass, T, Pattern->getValueKind(),
   2835            Pattern->getObjectKind(), /*TypeDependent=*/true,
   2836            /*ValueDependent=*/true, /*InstantiationDependent=*/true,
   2837            /*ContainsUnexpandedParameterPack=*/false),
   2838       EllipsisLoc(EllipsisLoc),
   2839       NumExpansions(NumExpansions? *NumExpansions + 1 : 0),
   2840       Pattern(Pattern) { }
   2841 
   2842   PackExpansionExpr(EmptyShell Empty) : Expr(PackExpansionExprClass, Empty) { }
   2843 
   2844   /// \brief Retrieve the pattern of the pack expansion.
   2845   Expr *getPattern() { return reinterpret_cast<Expr *>(Pattern); }
   2846 
   2847   /// \brief Retrieve the pattern of the pack expansion.
   2848   const Expr *getPattern() const { return reinterpret_cast<Expr *>(Pattern); }
   2849 
   2850   /// \brief Retrieve the location of the ellipsis that describes this pack
   2851   /// expansion.
   2852   SourceLocation getEllipsisLoc() const { return EllipsisLoc; }
   2853 
   2854   /// \brief Determine the number of expansions that will be produced when
   2855   /// this pack expansion is instantiated, if already known.
   2856   llvm::Optional<unsigned> getNumExpansions() const {
   2857     if (NumExpansions)
   2858       return NumExpansions - 1;
   2859 
   2860     return llvm::Optional<unsigned>();
   2861   }
   2862 
   2863   SourceRange getSourceRange() const {
   2864     return SourceRange(Pattern->getLocStart(), EllipsisLoc);
   2865   }
   2866 
   2867   static bool classof(const Stmt *T) {
   2868     return T->getStmtClass() == PackExpansionExprClass;
   2869   }
   2870   static bool classof(const PackExpansionExpr *) { return true; }
   2871 
   2872   // Iterators
   2873   child_range children() {
   2874     return child_range(&Pattern, &Pattern + 1);
   2875   }
   2876 };
   2877 
   2878 inline ASTTemplateArgumentListInfo &OverloadExpr::getExplicitTemplateArgs() {
   2879   if (isa<UnresolvedLookupExpr>(this))
   2880     return cast<UnresolvedLookupExpr>(this)->getExplicitTemplateArgs();
   2881   else
   2882     return cast<UnresolvedMemberExpr>(this)->getExplicitTemplateArgs();
   2883 }
   2884 
   2885 /// \brief Represents an expression that computes the length of a parameter
   2886 /// pack.
   2887 ///
   2888 /// \code
   2889 /// template<typename ...Types>
   2890 /// struct count {
   2891 ///   static const unsigned value = sizeof...(Types);
   2892 /// };
   2893 /// \endcode
   2894 class SizeOfPackExpr : public Expr {
   2895   /// \brief The location of the 'sizeof' keyword.
   2896   SourceLocation OperatorLoc;
   2897 
   2898   /// \brief The location of the name of the parameter pack.
   2899   SourceLocation PackLoc;
   2900 
   2901   /// \brief The location of the closing parenthesis.
   2902   SourceLocation RParenLoc;
   2903 
   2904   /// \brief The length of the parameter pack, if known.
   2905   ///
   2906   /// When this expression is value-dependent, the length of the parameter pack
   2907   /// is unknown. When this expression is not value-dependent, the length is
   2908   /// known.
   2909   unsigned Length;
   2910 
   2911   /// \brief The parameter pack itself.
   2912   NamedDecl *Pack;
   2913 
   2914   friend class ASTStmtReader;
   2915   friend class ASTStmtWriter;
   2916 
   2917 public:
   2918   /// \brief Creates a value-dependent expression that computes the length of
   2919   /// the given parameter pack.
   2920   SizeOfPackExpr(QualType SizeType, SourceLocation OperatorLoc, NamedDecl *Pack,
   2921                  SourceLocation PackLoc, SourceLocation RParenLoc)
   2922     : Expr(SizeOfPackExprClass, SizeType, VK_RValue, OK_Ordinary,
   2923            /*TypeDependent=*/false, /*ValueDependent=*/true,
   2924            /*InstantiationDependent=*/true,
   2925            /*ContainsUnexpandedParameterPack=*/false),
   2926       OperatorLoc(OperatorLoc), PackLoc(PackLoc), RParenLoc(RParenLoc),
   2927       Length(0), Pack(Pack) { }
   2928 
   2929   /// \brief Creates an expression that computes the length of
   2930   /// the given parameter pack, which is already known.
   2931   SizeOfPackExpr(QualType SizeType, SourceLocation OperatorLoc, NamedDecl *Pack,
   2932                  SourceLocation PackLoc, SourceLocation RParenLoc,
   2933                  unsigned Length)
   2934   : Expr(SizeOfPackExprClass, SizeType, VK_RValue, OK_Ordinary,
   2935          /*TypeDependent=*/false, /*ValueDependent=*/false,
   2936          /*InstantiationDependent=*/false,
   2937          /*ContainsUnexpandedParameterPack=*/false),
   2938     OperatorLoc(OperatorLoc), PackLoc(PackLoc), RParenLoc(RParenLoc),
   2939     Length(Length), Pack(Pack) { }
   2940 
   2941   /// \brief Create an empty expression.
   2942   SizeOfPackExpr(EmptyShell Empty) : Expr(SizeOfPackExprClass, Empty) { }
   2943 
   2944   /// \brief Determine the location of the 'sizeof' keyword.
   2945   SourceLocation getOperatorLoc() const { return OperatorLoc; }
   2946 
   2947   /// \brief Determine the location of the parameter pack.
   2948   SourceLocation getPackLoc() const { return PackLoc; }
   2949 
   2950   /// \brief Determine the location of the right parenthesis.
   2951   SourceLocation getRParenLoc() const { return RParenLoc; }
   2952 
   2953   /// \brief Retrieve the parameter pack.
   2954   NamedDecl *getPack() const { return Pack; }
   2955 
   2956   /// \brief Retrieve the length of the parameter pack.
   2957   ///
   2958   /// This routine may only be invoked when the expression is not
   2959   /// value-dependent.
   2960   unsigned getPackLength() const {
   2961     assert(!isValueDependent() &&
   2962            "Cannot get the length of a value-dependent pack size expression");
   2963     return Length;
   2964   }
   2965 
   2966   SourceRange getSourceRange() const {
   2967     return SourceRange(OperatorLoc, RParenLoc);
   2968   }
   2969 
   2970   static bool classof(const Stmt *T) {
   2971     return T->getStmtClass() == SizeOfPackExprClass;
   2972   }
   2973   static bool classof(const SizeOfPackExpr *) { return true; }
   2974 
   2975   // Iterators
   2976   child_range children() { return child_range(); }
   2977 };
   2978 
   2979 /// \brief Represents a reference to a non-type template parameter
   2980 /// that has been substituted with a template argument.
   2981 class SubstNonTypeTemplateParmExpr : public Expr {
   2982   /// \brief The replaced parameter.
   2983   NonTypeTemplateParmDecl *Param;
   2984 
   2985   /// \brief The replacement expression.
   2986   Stmt *Replacement;
   2987 
   2988   /// \brief The location of the non-type template parameter reference.
   2989   SourceLocation NameLoc;
   2990 
   2991   friend class ASTReader;
   2992   friend class ASTStmtReader;
   2993   explicit SubstNonTypeTemplateParmExpr(EmptyShell Empty)
   2994     : Expr(SubstNonTypeTemplateParmExprClass, Empty) { }
   2995 
   2996 public:
   2997   SubstNonTypeTemplateParmExpr(QualType type,
   2998                                ExprValueKind valueKind,
   2999                                SourceLocation loc,
   3000                                NonTypeTemplateParmDecl *param,
   3001                                Expr *replacement)
   3002     : Expr(SubstNonTypeTemplateParmExprClass, type, valueKind, OK_Ordinary,
   3003            replacement->isTypeDependent(), replacement->isValueDependent(),
   3004            replacement->isInstantiationDependent(),
   3005            replacement->containsUnexpandedParameterPack()),
   3006       Param(param), Replacement(replacement), NameLoc(loc) {}
   3007 
   3008   SourceLocation getNameLoc() const { return NameLoc; }
   3009   SourceRange getSourceRange() const { return NameLoc; }
   3010 
   3011   Expr *getReplacement() const { return cast<Expr>(Replacement); }
   3012 
   3013   NonTypeTemplateParmDecl *getParameter() const { return Param; }
   3014 
   3015   static bool classof(const Stmt *s) {
   3016     return s->getStmtClass() == SubstNonTypeTemplateParmExprClass;
   3017   }
   3018   static bool classof(const SubstNonTypeTemplateParmExpr *) {
   3019     return true;
   3020   }
   3021 
   3022   // Iterators
   3023   child_range children() { return child_range(&Replacement, &Replacement+1); }
   3024 };
   3025 
   3026 /// \brief Represents a reference to a non-type template parameter pack that
   3027 /// has been substituted with a non-template argument pack.
   3028 ///
   3029 /// When a pack expansion in the source code contains multiple parameter packs
   3030 /// and those parameter packs correspond to different levels of template
   3031 /// parameter lists, this node node is used to represent a non-type template
   3032 /// parameter pack from an outer level, which has already had its argument pack
   3033 /// substituted but that still lives within a pack expansion that itself
   3034 /// could not be instantiated. When actually performing a substitution into
   3035 /// that pack expansion (e.g., when all template parameters have corresponding
   3036 /// arguments), this type will be replaced with the appropriate underlying
   3037 /// expression at the current pack substitution index.
   3038 class SubstNonTypeTemplateParmPackExpr : public Expr {
   3039   /// \brief The non-type template parameter pack itself.
   3040   NonTypeTemplateParmDecl *Param;
   3041 
   3042   /// \brief A pointer to the set of template arguments that this
   3043   /// parameter pack is instantiated with.
   3044   const TemplateArgument *Arguments;
   3045 
   3046   /// \brief The number of template arguments in \c Arguments.
   3047   unsigned NumArguments;
   3048 
   3049   /// \brief The location of the non-type template parameter pack reference.
   3050   SourceLocation NameLoc;
   3051 
   3052   friend class ASTReader;
   3053   friend class ASTStmtReader;
   3054   explicit SubstNonTypeTemplateParmPackExpr(EmptyShell Empty)
   3055     : Expr(SubstNonTypeTemplateParmPackExprClass, Empty) { }
   3056 
   3057 public:
   3058   SubstNonTypeTemplateParmPackExpr(QualType T,
   3059                                    NonTypeTemplateParmDecl *Param,
   3060                                    SourceLocation NameLoc,
   3061                                    const TemplateArgument &ArgPack);
   3062 
   3063   /// \brief Retrieve the non-type template parameter pack being substituted.
   3064   NonTypeTemplateParmDecl *getParameterPack() const { return Param; }
   3065 
   3066   /// \brief Retrieve the location of the parameter pack name.
   3067   SourceLocation getParameterPackLocation() const { return NameLoc; }
   3068 
   3069   /// \brief Retrieve the template argument pack containing the substituted
   3070   /// template arguments.
   3071   TemplateArgument getArgumentPack() const;
   3072 
   3073   SourceRange getSourceRange() const { return NameLoc; }
   3074 
   3075   static bool classof(const Stmt *T) {
   3076     return T->getStmtClass() == SubstNonTypeTemplateParmPackExprClass;
   3077   }
   3078   static bool classof(const SubstNonTypeTemplateParmPackExpr *) {
   3079     return true;
   3080   }
   3081 
   3082   // Iterators
   3083   child_range children() { return child_range(); }
   3084 };
   3085 
   3086 /// \brief Represents a prvalue temporary that written into memory so that
   3087 /// a reference can bind to it.
   3088 ///
   3089 /// Prvalue expressions are materialized when they need to have an address
   3090 /// in memory for a reference to bind to. This happens when binding a
   3091 /// reference to the result of a conversion, e.g.,
   3092 ///
   3093 /// \code
   3094 /// const int &r = 1.0;
   3095 /// \endcode
   3096 ///
   3097 /// Here, 1.0 is implicitly converted to an \c int. That resulting \c int is
   3098 /// then materialized via a \c MaterializeTemporaryExpr, and the reference
   3099 /// binds to the temporary. \c MaterializeTemporaryExprs are always glvalues
   3100 /// (either an lvalue or an xvalue, depending on the kind of reference binding
   3101 /// to it), maintaining the invariant that references always bind to glvalues.
   3102 class MaterializeTemporaryExpr : public Expr {
   3103   /// \brief The temporary-generating expression whose value will be
   3104   /// materialized.
   3105  Stmt *Temporary;
   3106 
   3107   friend class ASTStmtReader;
   3108   friend class ASTStmtWriter;
   3109 
   3110 public:
   3111   MaterializeTemporaryExpr(QualType T, Expr *Temporary,
   3112                            bool BoundToLvalueReference)
   3113     : Expr(MaterializeTemporaryExprClass, T,
   3114            BoundToLvalueReference? VK_LValue : VK_XValue, OK_Ordinary,
   3115            Temporary->isTypeDependent(), Temporary->isValueDependent(),
   3116            Temporary->isInstantiationDependent(),
   3117            Temporary->containsUnexpandedParameterPack()),
   3118       Temporary(Temporary) { }
   3119 
   3120   MaterializeTemporaryExpr(EmptyShell Empty)
   3121     : Expr(MaterializeTemporaryExprClass, Empty) { }
   3122 
   3123   /// \brief Retrieve the temporary-generating subexpression whose value will
   3124   /// be materialized into a glvalue.
   3125   Expr *GetTemporaryExpr() const { return reinterpret_cast<Expr *>(Temporary); }
   3126 
   3127   /// \brief Determine whether this materialized temporary is bound to an
   3128   /// lvalue reference; otherwise, it's bound to an rvalue reference.
   3129   bool isBoundToLvalueReference() const {
   3130     return getValueKind() == VK_LValue;
   3131   }
   3132 
   3133   SourceRange getSourceRange() const { return Temporary->getSourceRange(); }
   3134 
   3135   static bool classof(const Stmt *T) {
   3136     return T->getStmtClass() == MaterializeTemporaryExprClass;
   3137   }
   3138   static bool classof(const MaterializeTemporaryExpr *) {
   3139     return true;
   3140   }
   3141 
   3142   // Iterators
   3143   child_range children() { return child_range(&Temporary, &Temporary + 1); }
   3144 };
   3145 
   3146 }  // end namespace clang
   3147 
   3148 #endif
   3149