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 /// \file
     11 /// \brief Defines the clang::Expr interface and subclasses for C++ expressions.
     12 ///
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_CLANG_AST_EXPRCXX_H
     16 #define LLVM_CLANG_AST_EXPRCXX_H
     17 
     18 #include "clang/AST/Decl.h"
     19 #include "clang/AST/DeclCXX.h"
     20 #include "clang/AST/Expr.h"
     21 #include "clang/AST/LambdaCapture.h"
     22 #include "clang/AST/TemplateBase.h"
     23 #include "clang/AST/UnresolvedSet.h"
     24 #include "clang/Basic/ExpressionTraits.h"
     25 #include "clang/Basic/TypeTraits.h"
     26 #include "llvm/Support/Compiler.h"
     27 
     28 namespace clang {
     29 
     30 class CXXTemporary;
     31 class MSPropertyDecl;
     32 class TemplateArgumentListInfo;
     33 class UuidAttr;
     34 
     35 //===--------------------------------------------------------------------===//
     36 // C++ Expressions.
     37 //===--------------------------------------------------------------------===//
     38 
     39 /// \brief A call to an overloaded operator written using operator
     40 /// syntax.
     41 ///
     42 /// Represents a call to an overloaded operator written using operator
     43 /// syntax, e.g., "x + y" or "*p". While semantically equivalent to a
     44 /// normal call, this AST node provides better information about the
     45 /// syntactic representation of the call.
     46 ///
     47 /// In a C++ template, this expression node kind will be used whenever
     48 /// any of the arguments are type-dependent. In this case, the
     49 /// function itself will be a (possibly empty) set of functions and
     50 /// function templates that were found by name lookup at template
     51 /// definition time.
     52 class CXXOperatorCallExpr : public CallExpr {
     53   /// \brief The overloaded operator.
     54   OverloadedOperatorKind Operator;
     55   SourceRange Range;
     56 
     57   // Record the FP_CONTRACT state that applies to this operator call. Only
     58   // meaningful for floating point types. For other types this value can be
     59   // set to false.
     60   unsigned FPContractable : 1;
     61 
     62   SourceRange getSourceRangeImpl() const LLVM_READONLY;
     63 public:
     64   CXXOperatorCallExpr(ASTContext& C, OverloadedOperatorKind Op, Expr *fn,
     65                       ArrayRef<Expr*> args, QualType t, ExprValueKind VK,
     66                       SourceLocation operatorloc, bool fpContractable)
     67     : CallExpr(C, CXXOperatorCallExprClass, fn, args, t, VK, operatorloc),
     68       Operator(Op), FPContractable(fpContractable) {
     69     Range = getSourceRangeImpl();
     70   }
     71   explicit CXXOperatorCallExpr(ASTContext& C, EmptyShell Empty) :
     72     CallExpr(C, CXXOperatorCallExprClass, Empty) { }
     73 
     74 
     75   /// \brief Returns the kind of overloaded operator that this
     76   /// expression refers to.
     77   OverloadedOperatorKind getOperator() const { return Operator; }
     78 
     79   /// \brief Returns the location of the operator symbol in the expression.
     80   ///
     81   /// When \c getOperator()==OO_Call, this is the location of the right
     82   /// parentheses; when \c getOperator()==OO_Subscript, this is the location
     83   /// of the right bracket.
     84   SourceLocation getOperatorLoc() const { return getRParenLoc(); }
     85 
     86   SourceLocation getExprLoc() const LLVM_READONLY {
     87     return (Operator < OO_Plus || Operator >= OO_Arrow ||
     88             Operator == OO_PlusPlus || Operator == OO_MinusMinus)
     89                ? getLocStart()
     90                : getOperatorLoc();
     91   }
     92 
     93   SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); }
     94   SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); }
     95   SourceRange getSourceRange() const { return Range; }
     96 
     97   static bool classof(const Stmt *T) {
     98     return T->getStmtClass() == CXXOperatorCallExprClass;
     99   }
    100 
    101   // Set the FP contractability status of this operator. Only meaningful for
    102   // operations on floating point types.
    103   void setFPContractable(bool FPC) { FPContractable = FPC; }
    104 
    105   // Get the FP contractability status of this operator. Only meaningful for
    106   // operations on floating point types.
    107   bool isFPContractable() const { return FPContractable; }
    108 
    109   friend class ASTStmtReader;
    110   friend class ASTStmtWriter;
    111 };
    112 
    113 /// Represents a call to a member function that
    114 /// may be written either with member call syntax (e.g., "obj.func()"
    115 /// or "objptr->func()") or with normal function-call syntax
    116 /// ("func()") within a member function that ends up calling a member
    117 /// function. The callee in either case is a MemberExpr that contains
    118 /// both the object argument and the member function, while the
    119 /// arguments are the arguments within the parentheses (not including
    120 /// the object argument).
    121 class CXXMemberCallExpr : public CallExpr {
    122 public:
    123   CXXMemberCallExpr(ASTContext &C, Expr *fn, ArrayRef<Expr*> args,
    124                     QualType t, ExprValueKind VK, SourceLocation RP)
    125     : CallExpr(C, CXXMemberCallExprClass, fn, args, t, VK, RP) {}
    126 
    127   CXXMemberCallExpr(ASTContext &C, EmptyShell Empty)
    128     : CallExpr(C, CXXMemberCallExprClass, Empty) { }
    129 
    130   /// \brief Retrieves the implicit object argument for the member call.
    131   ///
    132   /// For example, in "x.f(5)", this returns the sub-expression "x".
    133   Expr *getImplicitObjectArgument() const;
    134 
    135   /// \brief Retrieves the declaration of the called method.
    136   CXXMethodDecl *getMethodDecl() const;
    137 
    138   /// \brief Retrieves the CXXRecordDecl for the underlying type of
    139   /// the implicit object argument.
    140   ///
    141   /// Note that this is may not be the same declaration as that of the class
    142   /// context of the CXXMethodDecl which this function is calling.
    143   /// FIXME: Returns 0 for member pointer call exprs.
    144   CXXRecordDecl *getRecordDecl() const;
    145 
    146   SourceLocation getExprLoc() const LLVM_READONLY {
    147     SourceLocation CLoc = getCallee()->getExprLoc();
    148     if (CLoc.isValid())
    149       return CLoc;
    150 
    151     return getLocStart();
    152   }
    153 
    154   static bool classof(const Stmt *T) {
    155     return T->getStmtClass() == CXXMemberCallExprClass;
    156   }
    157 };
    158 
    159 /// \brief Represents a call to a CUDA kernel function.
    160 class CUDAKernelCallExpr : public CallExpr {
    161 private:
    162   enum { CONFIG, END_PREARG };
    163 
    164 public:
    165   CUDAKernelCallExpr(ASTContext &C, Expr *fn, CallExpr *Config,
    166                      ArrayRef<Expr*> args, QualType t, ExprValueKind VK,
    167                      SourceLocation RP)
    168       : CallExpr(C, CUDAKernelCallExprClass, fn, Config, args, t, VK, RP) {}
    169 
    170   CUDAKernelCallExpr(ASTContext &C, EmptyShell Empty)
    171     : CallExpr(C, CUDAKernelCallExprClass, END_PREARG, Empty) { }
    172 
    173   const CallExpr *getConfig() const {
    174     return cast_or_null<CallExpr>(getPreArg(CONFIG));
    175   }
    176   CallExpr *getConfig() { return cast_or_null<CallExpr>(getPreArg(CONFIG)); }
    177 
    178   /// \brief Sets the kernel configuration expression.
    179   ///
    180   /// Note that this method cannot be called if config has already been set to a
    181   /// non-null value.
    182   void setConfig(CallExpr *E) {
    183     assert(!getConfig() &&
    184            "Cannot call setConfig if config is not null");
    185     setPreArg(CONFIG, E);
    186     setInstantiationDependent(isInstantiationDependent() ||
    187                               E->isInstantiationDependent());
    188     setContainsUnexpandedParameterPack(containsUnexpandedParameterPack() ||
    189                                        E->containsUnexpandedParameterPack());
    190   }
    191 
    192   static bool classof(const Stmt *T) {
    193     return T->getStmtClass() == CUDAKernelCallExprClass;
    194   }
    195 };
    196 
    197 /// \brief Abstract class common to all of the C++ "named"/"keyword" casts.
    198 ///
    199 /// This abstract class is inherited by all of the classes
    200 /// representing "named" casts: CXXStaticCastExpr for \c static_cast,
    201 /// CXXDynamicCastExpr for \c dynamic_cast, CXXReinterpretCastExpr for
    202 /// reinterpret_cast, and CXXConstCastExpr for \c const_cast.
    203 class CXXNamedCastExpr : public ExplicitCastExpr {
    204 private:
    205   SourceLocation Loc; // the location of the casting op
    206   SourceLocation RParenLoc; // the location of the right parenthesis
    207   SourceRange AngleBrackets; // range for '<' '>'
    208 
    209 protected:
    210   CXXNamedCastExpr(StmtClass SC, QualType ty, ExprValueKind VK,
    211                    CastKind kind, Expr *op, unsigned PathSize,
    212                    TypeSourceInfo *writtenTy, SourceLocation l,
    213                    SourceLocation RParenLoc,
    214                    SourceRange AngleBrackets)
    215     : ExplicitCastExpr(SC, ty, VK, kind, op, PathSize, writtenTy), Loc(l),
    216       RParenLoc(RParenLoc), AngleBrackets(AngleBrackets) {}
    217 
    218   explicit CXXNamedCastExpr(StmtClass SC, EmptyShell Shell, unsigned PathSize)
    219     : ExplicitCastExpr(SC, Shell, PathSize) { }
    220 
    221   friend class ASTStmtReader;
    222 
    223 public:
    224   const char *getCastName() const;
    225 
    226   /// \brief Retrieve the location of the cast operator keyword, e.g.,
    227   /// \c static_cast.
    228   SourceLocation getOperatorLoc() const { return Loc; }
    229 
    230   /// \brief Retrieve the location of the closing parenthesis.
    231   SourceLocation getRParenLoc() const { return RParenLoc; }
    232 
    233   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
    234   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
    235   SourceRange getAngleBrackets() const LLVM_READONLY { return AngleBrackets; }
    236 
    237   static bool classof(const Stmt *T) {
    238     switch (T->getStmtClass()) {
    239     case CXXStaticCastExprClass:
    240     case CXXDynamicCastExprClass:
    241     case CXXReinterpretCastExprClass:
    242     case CXXConstCastExprClass:
    243       return true;
    244     default:
    245       return false;
    246     }
    247   }
    248 };
    249 
    250 /// \brief A C++ \c static_cast expression (C++ [expr.static.cast]).
    251 ///
    252 /// This expression node represents a C++ static cast, e.g.,
    253 /// \c static_cast<int>(1.0).
    254 class CXXStaticCastExpr final
    255     : public CXXNamedCastExpr,
    256       private llvm::TrailingObjects<CXXStaticCastExpr, CXXBaseSpecifier *> {
    257   CXXStaticCastExpr(QualType ty, ExprValueKind vk, CastKind kind, Expr *op,
    258                     unsigned pathSize, TypeSourceInfo *writtenTy,
    259                     SourceLocation l, SourceLocation RParenLoc,
    260                     SourceRange AngleBrackets)
    261     : CXXNamedCastExpr(CXXStaticCastExprClass, ty, vk, kind, op, pathSize,
    262                        writtenTy, l, RParenLoc, AngleBrackets) {}
    263 
    264   explicit CXXStaticCastExpr(EmptyShell Empty, unsigned PathSize)
    265     : CXXNamedCastExpr(CXXStaticCastExprClass, Empty, PathSize) { }
    266 
    267 public:
    268   static CXXStaticCastExpr *Create(const ASTContext &Context, QualType T,
    269                                    ExprValueKind VK, CastKind K, Expr *Op,
    270                                    const CXXCastPath *Path,
    271                                    TypeSourceInfo *Written, SourceLocation L,
    272                                    SourceLocation RParenLoc,
    273                                    SourceRange AngleBrackets);
    274   static CXXStaticCastExpr *CreateEmpty(const ASTContext &Context,
    275                                         unsigned PathSize);
    276 
    277   static bool classof(const Stmt *T) {
    278     return T->getStmtClass() == CXXStaticCastExprClass;
    279   }
    280 
    281   friend TrailingObjects;
    282   friend class CastExpr;
    283 };
    284 
    285 /// \brief A C++ @c dynamic_cast expression (C++ [expr.dynamic.cast]).
    286 ///
    287 /// This expression node represents a dynamic cast, e.g.,
    288 /// \c dynamic_cast<Derived*>(BasePtr). Such a cast may perform a run-time
    289 /// check to determine how to perform the type conversion.
    290 class CXXDynamicCastExpr final
    291     : public CXXNamedCastExpr,
    292       private llvm::TrailingObjects<CXXDynamicCastExpr, CXXBaseSpecifier *> {
    293   CXXDynamicCastExpr(QualType ty, ExprValueKind VK, CastKind kind,
    294                      Expr *op, unsigned pathSize, TypeSourceInfo *writtenTy,
    295                      SourceLocation l, SourceLocation RParenLoc,
    296                      SourceRange AngleBrackets)
    297     : CXXNamedCastExpr(CXXDynamicCastExprClass, ty, VK, kind, op, pathSize,
    298                        writtenTy, l, RParenLoc, AngleBrackets) {}
    299 
    300   explicit CXXDynamicCastExpr(EmptyShell Empty, unsigned pathSize)
    301     : CXXNamedCastExpr(CXXDynamicCastExprClass, Empty, pathSize) { }
    302 
    303 public:
    304   static CXXDynamicCastExpr *Create(const ASTContext &Context, QualType T,
    305                                     ExprValueKind VK, CastKind Kind, Expr *Op,
    306                                     const CXXCastPath *Path,
    307                                     TypeSourceInfo *Written, SourceLocation L,
    308                                     SourceLocation RParenLoc,
    309                                     SourceRange AngleBrackets);
    310 
    311   static CXXDynamicCastExpr *CreateEmpty(const ASTContext &Context,
    312                                          unsigned pathSize);
    313 
    314   bool isAlwaysNull() const;
    315 
    316   static bool classof(const Stmt *T) {
    317     return T->getStmtClass() == CXXDynamicCastExprClass;
    318   }
    319 
    320   friend TrailingObjects;
    321   friend class CastExpr;
    322 };
    323 
    324 /// \brief A C++ @c reinterpret_cast expression (C++ [expr.reinterpret.cast]).
    325 ///
    326 /// This expression node represents a reinterpret cast, e.g.,
    327 /// @c reinterpret_cast<int>(VoidPtr).
    328 ///
    329 /// A reinterpret_cast provides a differently-typed view of a value but
    330 /// (in Clang, as in most C++ implementations) performs no actual work at
    331 /// run time.
    332 class CXXReinterpretCastExpr final
    333     : public CXXNamedCastExpr,
    334       private llvm::TrailingObjects<CXXReinterpretCastExpr,
    335                                     CXXBaseSpecifier *> {
    336   CXXReinterpretCastExpr(QualType ty, ExprValueKind vk, CastKind kind,
    337                          Expr *op, unsigned pathSize,
    338                          TypeSourceInfo *writtenTy, SourceLocation l,
    339                          SourceLocation RParenLoc,
    340                          SourceRange AngleBrackets)
    341     : CXXNamedCastExpr(CXXReinterpretCastExprClass, ty, vk, kind, op,
    342                        pathSize, writtenTy, l, RParenLoc, AngleBrackets) {}
    343 
    344   CXXReinterpretCastExpr(EmptyShell Empty, unsigned pathSize)
    345     : CXXNamedCastExpr(CXXReinterpretCastExprClass, Empty, pathSize) { }
    346 
    347 public:
    348   static CXXReinterpretCastExpr *Create(const ASTContext &Context, QualType T,
    349                                         ExprValueKind VK, CastKind Kind,
    350                                         Expr *Op, const CXXCastPath *Path,
    351                                  TypeSourceInfo *WrittenTy, SourceLocation L,
    352                                         SourceLocation RParenLoc,
    353                                         SourceRange AngleBrackets);
    354   static CXXReinterpretCastExpr *CreateEmpty(const ASTContext &Context,
    355                                              unsigned pathSize);
    356 
    357   static bool classof(const Stmt *T) {
    358     return T->getStmtClass() == CXXReinterpretCastExprClass;
    359   }
    360 
    361   friend TrailingObjects;
    362   friend class CastExpr;
    363 };
    364 
    365 /// \brief A C++ \c const_cast expression (C++ [expr.const.cast]).
    366 ///
    367 /// This expression node represents a const cast, e.g.,
    368 /// \c const_cast<char*>(PtrToConstChar).
    369 ///
    370 /// A const_cast can remove type qualifiers but does not change the underlying
    371 /// value.
    372 class CXXConstCastExpr final
    373     : public CXXNamedCastExpr,
    374       private llvm::TrailingObjects<CXXConstCastExpr, CXXBaseSpecifier *> {
    375   CXXConstCastExpr(QualType ty, ExprValueKind VK, Expr *op,
    376                    TypeSourceInfo *writtenTy, SourceLocation l,
    377                    SourceLocation RParenLoc, SourceRange AngleBrackets)
    378     : CXXNamedCastExpr(CXXConstCastExprClass, ty, VK, CK_NoOp, op,
    379                        0, writtenTy, l, RParenLoc, AngleBrackets) {}
    380 
    381   explicit CXXConstCastExpr(EmptyShell Empty)
    382     : CXXNamedCastExpr(CXXConstCastExprClass, Empty, 0) { }
    383 
    384 public:
    385   static CXXConstCastExpr *Create(const ASTContext &Context, QualType T,
    386                                   ExprValueKind VK, Expr *Op,
    387                                   TypeSourceInfo *WrittenTy, SourceLocation L,
    388                                   SourceLocation RParenLoc,
    389                                   SourceRange AngleBrackets);
    390   static CXXConstCastExpr *CreateEmpty(const ASTContext &Context);
    391 
    392   static bool classof(const Stmt *T) {
    393     return T->getStmtClass() == CXXConstCastExprClass;
    394   }
    395 
    396   friend TrailingObjects;
    397   friend class CastExpr;
    398 };
    399 
    400 /// \brief A call to a literal operator (C++11 [over.literal])
    401 /// written as a user-defined literal (C++11 [lit.ext]).
    402 ///
    403 /// Represents a user-defined literal, e.g. "foo"_bar or 1.23_xyz. While this
    404 /// is semantically equivalent to a normal call, this AST node provides better
    405 /// information about the syntactic representation of the literal.
    406 ///
    407 /// Since literal operators are never found by ADL and can only be declared at
    408 /// namespace scope, a user-defined literal is never dependent.
    409 class UserDefinedLiteral : public CallExpr {
    410   /// \brief The location of a ud-suffix within the literal.
    411   SourceLocation UDSuffixLoc;
    412 
    413 public:
    414   UserDefinedLiteral(const ASTContext &C, Expr *Fn, ArrayRef<Expr*> Args,
    415                      QualType T, ExprValueKind VK, SourceLocation LitEndLoc,
    416                      SourceLocation SuffixLoc)
    417     : CallExpr(C, UserDefinedLiteralClass, Fn, Args, T, VK, LitEndLoc),
    418       UDSuffixLoc(SuffixLoc) {}
    419   explicit UserDefinedLiteral(const ASTContext &C, EmptyShell Empty)
    420     : CallExpr(C, UserDefinedLiteralClass, Empty) {}
    421 
    422   /// The kind of literal operator which is invoked.
    423   enum LiteralOperatorKind {
    424     LOK_Raw,      ///< Raw form: operator "" X (const char *)
    425     LOK_Template, ///< Raw form: operator "" X<cs...> ()
    426     LOK_Integer,  ///< operator "" X (unsigned long long)
    427     LOK_Floating, ///< operator "" X (long double)
    428     LOK_String,   ///< operator "" X (const CharT *, size_t)
    429     LOK_Character ///< operator "" X (CharT)
    430   };
    431 
    432   /// \brief Returns the kind of literal operator invocation
    433   /// which this expression represents.
    434   LiteralOperatorKind getLiteralOperatorKind() const;
    435 
    436   /// \brief If this is not a raw user-defined literal, get the
    437   /// underlying cooked literal (representing the literal with the suffix
    438   /// removed).
    439   Expr *getCookedLiteral();
    440   const Expr *getCookedLiteral() const {
    441     return const_cast<UserDefinedLiteral*>(this)->getCookedLiteral();
    442   }
    443 
    444   SourceLocation getLocStart() const {
    445     if (getLiteralOperatorKind() == LOK_Template)
    446       return getRParenLoc();
    447     return getArg(0)->getLocStart();
    448   }
    449   SourceLocation getLocEnd() const { return getRParenLoc(); }
    450 
    451 
    452   /// \brief Returns the location of a ud-suffix in the expression.
    453   ///
    454   /// For a string literal, there may be multiple identical suffixes. This
    455   /// returns the first.
    456   SourceLocation getUDSuffixLoc() const { return UDSuffixLoc; }
    457 
    458   /// \brief Returns the ud-suffix specified for this literal.
    459   const IdentifierInfo *getUDSuffix() const;
    460 
    461   static bool classof(const Stmt *S) {
    462     return S->getStmtClass() == UserDefinedLiteralClass;
    463   }
    464 
    465   friend class ASTStmtReader;
    466   friend class ASTStmtWriter;
    467 };
    468 
    469 /// \brief A boolean literal, per ([C++ lex.bool] Boolean literals).
    470 ///
    471 class CXXBoolLiteralExpr : public Expr {
    472   bool Value;
    473   SourceLocation Loc;
    474 public:
    475   CXXBoolLiteralExpr(bool val, QualType Ty, SourceLocation l) :
    476     Expr(CXXBoolLiteralExprClass, Ty, VK_RValue, OK_Ordinary, false, false,
    477          false, false),
    478     Value(val), Loc(l) {}
    479 
    480   explicit CXXBoolLiteralExpr(EmptyShell Empty)
    481     : Expr(CXXBoolLiteralExprClass, Empty) { }
    482 
    483   bool getValue() const { return Value; }
    484   void setValue(bool V) { Value = V; }
    485 
    486   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
    487   SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
    488 
    489   SourceLocation getLocation() const { return Loc; }
    490   void setLocation(SourceLocation L) { Loc = L; }
    491 
    492   static bool classof(const Stmt *T) {
    493     return T->getStmtClass() == CXXBoolLiteralExprClass;
    494   }
    495 
    496   // Iterators
    497   child_range children() {
    498     return child_range(child_iterator(), child_iterator());
    499   }
    500 };
    501 
    502 /// \brief The null pointer literal (C++11 [lex.nullptr])
    503 ///
    504 /// Introduced in C++11, the only literal of type \c nullptr_t is \c nullptr.
    505 class CXXNullPtrLiteralExpr : public Expr {
    506   SourceLocation Loc;
    507 public:
    508   CXXNullPtrLiteralExpr(QualType Ty, SourceLocation l) :
    509     Expr(CXXNullPtrLiteralExprClass, Ty, VK_RValue, OK_Ordinary, false, false,
    510          false, false),
    511     Loc(l) {}
    512 
    513   explicit CXXNullPtrLiteralExpr(EmptyShell Empty)
    514     : Expr(CXXNullPtrLiteralExprClass, Empty) { }
    515 
    516   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
    517   SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
    518 
    519   SourceLocation getLocation() const { return Loc; }
    520   void setLocation(SourceLocation L) { Loc = L; }
    521 
    522   static bool classof(const Stmt *T) {
    523     return T->getStmtClass() == CXXNullPtrLiteralExprClass;
    524   }
    525 
    526   child_range children() {
    527     return child_range(child_iterator(), child_iterator());
    528   }
    529 };
    530 
    531 /// \brief Implicit construction of a std::initializer_list<T> object from an
    532 /// array temporary within list-initialization (C++11 [dcl.init.list]p5).
    533 class CXXStdInitializerListExpr : public Expr {
    534   Stmt *SubExpr;
    535 
    536   CXXStdInitializerListExpr(EmptyShell Empty)
    537     : Expr(CXXStdInitializerListExprClass, Empty), SubExpr(nullptr) {}
    538 
    539 public:
    540   CXXStdInitializerListExpr(QualType Ty, Expr *SubExpr)
    541     : Expr(CXXStdInitializerListExprClass, Ty, VK_RValue, OK_Ordinary,
    542            Ty->isDependentType(), SubExpr->isValueDependent(),
    543            SubExpr->isInstantiationDependent(),
    544            SubExpr->containsUnexpandedParameterPack()),
    545       SubExpr(SubExpr) {}
    546 
    547   Expr *getSubExpr() { return static_cast<Expr*>(SubExpr); }
    548   const Expr *getSubExpr() const { return static_cast<const Expr*>(SubExpr); }
    549 
    550   SourceLocation getLocStart() const LLVM_READONLY {
    551     return SubExpr->getLocStart();
    552   }
    553   SourceLocation getLocEnd() const LLVM_READONLY {
    554     return SubExpr->getLocEnd();
    555   }
    556   SourceRange getSourceRange() const LLVM_READONLY {
    557     return SubExpr->getSourceRange();
    558   }
    559 
    560   static bool classof(const Stmt *S) {
    561     return S->getStmtClass() == CXXStdInitializerListExprClass;
    562   }
    563 
    564   child_range children() { return child_range(&SubExpr, &SubExpr + 1); }
    565 
    566   friend class ASTReader;
    567   friend class ASTStmtReader;
    568 };
    569 
    570 /// A C++ \c typeid expression (C++ [expr.typeid]), which gets
    571 /// the \c type_info that corresponds to the supplied type, or the (possibly
    572 /// dynamic) type of the supplied expression.
    573 ///
    574 /// This represents code like \c typeid(int) or \c typeid(*objPtr)
    575 class CXXTypeidExpr : public Expr {
    576 private:
    577   llvm::PointerUnion<Stmt *, TypeSourceInfo *> Operand;
    578   SourceRange Range;
    579 
    580 public:
    581   CXXTypeidExpr(QualType Ty, TypeSourceInfo *Operand, SourceRange R)
    582     : Expr(CXXTypeidExprClass, Ty, VK_LValue, OK_Ordinary,
    583            // typeid is never type-dependent (C++ [temp.dep.expr]p4)
    584            false,
    585            // typeid is value-dependent if the type or expression are dependent
    586            Operand->getType()->isDependentType(),
    587            Operand->getType()->isInstantiationDependentType(),
    588            Operand->getType()->containsUnexpandedParameterPack()),
    589       Operand(Operand), Range(R) { }
    590 
    591   CXXTypeidExpr(QualType Ty, Expr *Operand, SourceRange R)
    592     : Expr(CXXTypeidExprClass, Ty, VK_LValue, OK_Ordinary,
    593         // typeid is never type-dependent (C++ [temp.dep.expr]p4)
    594            false,
    595         // typeid is value-dependent if the type or expression are dependent
    596            Operand->isTypeDependent() || Operand->isValueDependent(),
    597            Operand->isInstantiationDependent(),
    598            Operand->containsUnexpandedParameterPack()),
    599       Operand(Operand), Range(R) { }
    600 
    601   CXXTypeidExpr(EmptyShell Empty, bool isExpr)
    602     : Expr(CXXTypeidExprClass, Empty) {
    603     if (isExpr)
    604       Operand = (Expr*)nullptr;
    605     else
    606       Operand = (TypeSourceInfo*)nullptr;
    607   }
    608 
    609   /// Determine whether this typeid has a type operand which is potentially
    610   /// evaluated, per C++11 [expr.typeid]p3.
    611   bool isPotentiallyEvaluated() const;
    612 
    613   bool isTypeOperand() const { return Operand.is<TypeSourceInfo *>(); }
    614 
    615   /// \brief Retrieves the type operand of this typeid() expression after
    616   /// various required adjustments (removing reference types, cv-qualifiers).
    617   QualType getTypeOperand(ASTContext &Context) const;
    618 
    619   /// \brief Retrieve source information for the type operand.
    620   TypeSourceInfo *getTypeOperandSourceInfo() const {
    621     assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
    622     return Operand.get<TypeSourceInfo *>();
    623   }
    624 
    625   void setTypeOperandSourceInfo(TypeSourceInfo *TSI) {
    626     assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
    627     Operand = TSI;
    628   }
    629 
    630   Expr *getExprOperand() const {
    631     assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)");
    632     return static_cast<Expr*>(Operand.get<Stmt *>());
    633   }
    634 
    635   void setExprOperand(Expr *E) {
    636     assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)");
    637     Operand = E;
    638   }
    639 
    640   SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); }
    641   SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); }
    642   SourceRange getSourceRange() const LLVM_READONLY { return Range; }
    643   void setSourceRange(SourceRange R) { Range = R; }
    644 
    645   static bool classof(const Stmt *T) {
    646     return T->getStmtClass() == CXXTypeidExprClass;
    647   }
    648 
    649   // Iterators
    650   child_range children() {
    651     if (isTypeOperand())
    652       return child_range(child_iterator(), child_iterator());
    653     Stmt **begin = reinterpret_cast<Stmt**>(&Operand);
    654     return child_range(begin, begin + 1);
    655   }
    656 };
    657 
    658 /// \brief A member reference to an MSPropertyDecl.
    659 ///
    660 /// This expression always has pseudo-object type, and therefore it is
    661 /// typically not encountered in a fully-typechecked expression except
    662 /// within the syntactic form of a PseudoObjectExpr.
    663 class MSPropertyRefExpr : public Expr {
    664   Expr *BaseExpr;
    665   MSPropertyDecl *TheDecl;
    666   SourceLocation MemberLoc;
    667   bool IsArrow;
    668   NestedNameSpecifierLoc QualifierLoc;
    669 
    670 public:
    671   MSPropertyRefExpr(Expr *baseExpr, MSPropertyDecl *decl, bool isArrow,
    672                     QualType ty, ExprValueKind VK,
    673                     NestedNameSpecifierLoc qualifierLoc,
    674                     SourceLocation nameLoc)
    675   : Expr(MSPropertyRefExprClass, ty, VK, OK_Ordinary,
    676          /*type-dependent*/ false, baseExpr->isValueDependent(),
    677          baseExpr->isInstantiationDependent(),
    678          baseExpr->containsUnexpandedParameterPack()),
    679     BaseExpr(baseExpr), TheDecl(decl),
    680     MemberLoc(nameLoc), IsArrow(isArrow),
    681     QualifierLoc(qualifierLoc) {}
    682 
    683   MSPropertyRefExpr(EmptyShell Empty) : Expr(MSPropertyRefExprClass, Empty) {}
    684 
    685   SourceRange getSourceRange() const LLVM_READONLY {
    686     return SourceRange(getLocStart(), getLocEnd());
    687   }
    688   bool isImplicitAccess() const {
    689     return getBaseExpr() && getBaseExpr()->isImplicitCXXThis();
    690   }
    691   SourceLocation getLocStart() const {
    692     if (!isImplicitAccess())
    693       return BaseExpr->getLocStart();
    694     else if (QualifierLoc)
    695       return QualifierLoc.getBeginLoc();
    696     else
    697         return MemberLoc;
    698   }
    699   SourceLocation getLocEnd() const { return getMemberLoc(); }
    700 
    701   child_range children() {
    702     return child_range((Stmt**)&BaseExpr, (Stmt**)&BaseExpr + 1);
    703   }
    704   static bool classof(const Stmt *T) {
    705     return T->getStmtClass() == MSPropertyRefExprClass;
    706   }
    707 
    708   Expr *getBaseExpr() const { return BaseExpr; }
    709   MSPropertyDecl *getPropertyDecl() const { return TheDecl; }
    710   bool isArrow() const { return IsArrow; }
    711   SourceLocation getMemberLoc() const { return MemberLoc; }
    712   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
    713 
    714   friend class ASTStmtReader;
    715 };
    716 
    717 /// MS property subscript expression.
    718 /// MSVC supports 'property' attribute and allows to apply it to the
    719 /// declaration of an empty array in a class or structure definition.
    720 /// For example:
    721 /// \code
    722 /// __declspec(property(get=GetX, put=PutX)) int x[];
    723 /// \endcode
    724 /// The above statement indicates that x[] can be used with one or more array
    725 /// indices. In this case, i=p->x[a][b] will be turned into i=p->GetX(a, b), and
    726 /// p->x[a][b] = i will be turned into p->PutX(a, b, i).
    727 /// This is a syntactic pseudo-object expression.
    728 class MSPropertySubscriptExpr : public Expr {
    729   friend class ASTStmtReader;
    730   enum { BASE_EXPR, IDX_EXPR, NUM_SUBEXPRS = 2 };
    731   Stmt *SubExprs[NUM_SUBEXPRS];
    732   SourceLocation RBracketLoc;
    733 
    734   void setBase(Expr *Base) { SubExprs[BASE_EXPR] = Base; }
    735   void setIdx(Expr *Idx) { SubExprs[IDX_EXPR] = Idx; }
    736 
    737 public:
    738   MSPropertySubscriptExpr(Expr *Base, Expr *Idx, QualType Ty, ExprValueKind VK,
    739                           ExprObjectKind OK, SourceLocation RBracketLoc)
    740       : Expr(MSPropertySubscriptExprClass, Ty, VK, OK, Idx->isTypeDependent(),
    741              Idx->isValueDependent(), Idx->isInstantiationDependent(),
    742              Idx->containsUnexpandedParameterPack()),
    743         RBracketLoc(RBracketLoc) {
    744     SubExprs[BASE_EXPR] = Base;
    745     SubExprs[IDX_EXPR] = Idx;
    746   }
    747 
    748   /// \brief Create an empty array subscript expression.
    749   explicit MSPropertySubscriptExpr(EmptyShell Shell)
    750       : Expr(MSPropertySubscriptExprClass, Shell) {}
    751 
    752   Expr *getBase() { return cast<Expr>(SubExprs[BASE_EXPR]); }
    753   const Expr *getBase() const { return cast<Expr>(SubExprs[BASE_EXPR]); }
    754 
    755   Expr *getIdx() { return cast<Expr>(SubExprs[IDX_EXPR]); }
    756   const Expr *getIdx() const { return cast<Expr>(SubExprs[IDX_EXPR]); }
    757 
    758   SourceLocation getLocStart() const LLVM_READONLY {
    759     return getBase()->getLocStart();
    760   }
    761   SourceLocation getLocEnd() const LLVM_READONLY { return RBracketLoc; }
    762 
    763   SourceLocation getRBracketLoc() const { return RBracketLoc; }
    764   void setRBracketLoc(SourceLocation L) { RBracketLoc = L; }
    765 
    766   SourceLocation getExprLoc() const LLVM_READONLY {
    767     return getBase()->getExprLoc();
    768   }
    769 
    770   static bool classof(const Stmt *T) {
    771     return T->getStmtClass() == MSPropertySubscriptExprClass;
    772   }
    773 
    774   // Iterators
    775   child_range children() {
    776     return child_range(&SubExprs[0], &SubExprs[0] + NUM_SUBEXPRS);
    777   }
    778 };
    779 
    780 /// A Microsoft C++ @c __uuidof expression, which gets
    781 /// the _GUID that corresponds to the supplied type or expression.
    782 ///
    783 /// This represents code like @c __uuidof(COMTYPE) or @c __uuidof(*comPtr)
    784 class CXXUuidofExpr : public Expr {
    785 private:
    786   llvm::PointerUnion<Stmt *, TypeSourceInfo *> Operand;
    787   StringRef UuidStr;
    788   SourceRange Range;
    789 
    790 public:
    791   CXXUuidofExpr(QualType Ty, TypeSourceInfo *Operand, StringRef UuidStr,
    792                 SourceRange R)
    793       : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary, false,
    794              Operand->getType()->isDependentType(),
    795              Operand->getType()->isInstantiationDependentType(),
    796              Operand->getType()->containsUnexpandedParameterPack()),
    797         Operand(Operand), UuidStr(UuidStr), Range(R) {}
    798 
    799   CXXUuidofExpr(QualType Ty, Expr *Operand, StringRef UuidStr, SourceRange R)
    800       : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary, false,
    801              Operand->isTypeDependent(), Operand->isInstantiationDependent(),
    802              Operand->containsUnexpandedParameterPack()),
    803         Operand(Operand), UuidStr(UuidStr), Range(R) {}
    804 
    805   CXXUuidofExpr(EmptyShell Empty, bool isExpr)
    806     : Expr(CXXUuidofExprClass, Empty) {
    807     if (isExpr)
    808       Operand = (Expr*)nullptr;
    809     else
    810       Operand = (TypeSourceInfo*)nullptr;
    811   }
    812 
    813   bool isTypeOperand() const { return Operand.is<TypeSourceInfo *>(); }
    814 
    815   /// \brief Retrieves the type operand of this __uuidof() expression after
    816   /// various required adjustments (removing reference types, cv-qualifiers).
    817   QualType getTypeOperand(ASTContext &Context) const;
    818 
    819   /// \brief Retrieve source information for the type operand.
    820   TypeSourceInfo *getTypeOperandSourceInfo() const {
    821     assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)");
    822     return Operand.get<TypeSourceInfo *>();
    823   }
    824 
    825   void setTypeOperandSourceInfo(TypeSourceInfo *TSI) {
    826     assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)");
    827     Operand = TSI;
    828   }
    829 
    830   Expr *getExprOperand() const {
    831     assert(!isTypeOperand() && "Cannot call getExprOperand for __uuidof(type)");
    832     return static_cast<Expr*>(Operand.get<Stmt *>());
    833   }
    834 
    835   void setExprOperand(Expr *E) {
    836     assert(!isTypeOperand() && "Cannot call getExprOperand for __uuidof(type)");
    837     Operand = E;
    838   }
    839 
    840   void setUuidStr(StringRef US) { UuidStr = US; }
    841   StringRef getUuidStr() const { return UuidStr; }
    842 
    843   SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); }
    844   SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); }
    845   SourceRange getSourceRange() const LLVM_READONLY { return Range; }
    846   void setSourceRange(SourceRange R) { Range = R; }
    847 
    848   static bool classof(const Stmt *T) {
    849     return T->getStmtClass() == CXXUuidofExprClass;
    850   }
    851 
    852   // Iterators
    853   child_range children() {
    854     if (isTypeOperand())
    855       return child_range(child_iterator(), child_iterator());
    856     Stmt **begin = reinterpret_cast<Stmt**>(&Operand);
    857     return child_range(begin, begin + 1);
    858   }
    859 };
    860 
    861 /// \brief Represents the \c this expression in C++.
    862 ///
    863 /// This is a pointer to the object on which the current member function is
    864 /// executing (C++ [expr.prim]p3). Example:
    865 ///
    866 /// \code
    867 /// class Foo {
    868 /// public:
    869 ///   void bar();
    870 ///   void test() { this->bar(); }
    871 /// };
    872 /// \endcode
    873 class CXXThisExpr : public Expr {
    874   SourceLocation Loc;
    875   bool Implicit : 1;
    876 
    877 public:
    878   CXXThisExpr(SourceLocation L, QualType Type, bool isImplicit)
    879     : Expr(CXXThisExprClass, Type, VK_RValue, OK_Ordinary,
    880            // 'this' is type-dependent if the class type of the enclosing
    881            // member function is dependent (C++ [temp.dep.expr]p2)
    882            Type->isDependentType(), Type->isDependentType(),
    883            Type->isInstantiationDependentType(),
    884            /*ContainsUnexpandedParameterPack=*/false),
    885       Loc(L), Implicit(isImplicit) { }
    886 
    887   CXXThisExpr(EmptyShell Empty) : Expr(CXXThisExprClass, Empty) {}
    888 
    889   SourceLocation getLocation() const { return Loc; }
    890   void setLocation(SourceLocation L) { Loc = L; }
    891 
    892   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
    893   SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
    894 
    895   bool isImplicit() const { return Implicit; }
    896   void setImplicit(bool I) { Implicit = I; }
    897 
    898   static bool classof(const Stmt *T) {
    899     return T->getStmtClass() == CXXThisExprClass;
    900   }
    901 
    902   // Iterators
    903   child_range children() {
    904     return child_range(child_iterator(), child_iterator());
    905   }
    906 };
    907 
    908 /// \brief A C++ throw-expression (C++ [except.throw]).
    909 ///
    910 /// This handles 'throw' (for re-throwing the current exception) and
    911 /// 'throw' assignment-expression.  When assignment-expression isn't
    912 /// present, Op will be null.
    913 class CXXThrowExpr : public Expr {
    914   Stmt *Op;
    915   SourceLocation ThrowLoc;
    916   /// \brief Whether the thrown variable (if any) is in scope.
    917   unsigned IsThrownVariableInScope : 1;
    918 
    919   friend class ASTStmtReader;
    920 
    921 public:
    922   // \p Ty is the void type which is used as the result type of the
    923   // expression.  The \p l is the location of the throw keyword.  \p expr
    924   // can by null, if the optional expression to throw isn't present.
    925   CXXThrowExpr(Expr *expr, QualType Ty, SourceLocation l,
    926                bool IsThrownVariableInScope) :
    927     Expr(CXXThrowExprClass, Ty, VK_RValue, OK_Ordinary, false, false,
    928          expr && expr->isInstantiationDependent(),
    929          expr && expr->containsUnexpandedParameterPack()),
    930     Op(expr), ThrowLoc(l), IsThrownVariableInScope(IsThrownVariableInScope) {}
    931   CXXThrowExpr(EmptyShell Empty) : Expr(CXXThrowExprClass, Empty) {}
    932 
    933   const Expr *getSubExpr() const { return cast_or_null<Expr>(Op); }
    934   Expr *getSubExpr() { return cast_or_null<Expr>(Op); }
    935 
    936   SourceLocation getThrowLoc() const { return ThrowLoc; }
    937 
    938   /// \brief Determines whether the variable thrown by this expression (if any!)
    939   /// is within the innermost try block.
    940   ///
    941   /// This information is required to determine whether the NRVO can apply to
    942   /// this variable.
    943   bool isThrownVariableInScope() const { return IsThrownVariableInScope; }
    944 
    945   SourceLocation getLocStart() const LLVM_READONLY { return ThrowLoc; }
    946   SourceLocation getLocEnd() const LLVM_READONLY {
    947     if (!getSubExpr())
    948       return ThrowLoc;
    949     return getSubExpr()->getLocEnd();
    950   }
    951 
    952   static bool classof(const Stmt *T) {
    953     return T->getStmtClass() == CXXThrowExprClass;
    954   }
    955 
    956   // Iterators
    957   child_range children() {
    958     return child_range(&Op, Op ? &Op+1 : &Op);
    959   }
    960 };
    961 
    962 /// \brief A default argument (C++ [dcl.fct.default]).
    963 ///
    964 /// This wraps up a function call argument that was created from the
    965 /// corresponding parameter's default argument, when the call did not
    966 /// explicitly supply arguments for all of the parameters.
    967 class CXXDefaultArgExpr final : public Expr {
    968   /// \brief The parameter whose default is being used.
    969   ParmVarDecl *Param;
    970 
    971   /// \brief The location where the default argument expression was used.
    972   SourceLocation Loc;
    973 
    974   CXXDefaultArgExpr(StmtClass SC, SourceLocation Loc, ParmVarDecl *param)
    975     : Expr(SC,
    976            param->hasUnparsedDefaultArg()
    977              ? param->getType().getNonReferenceType()
    978              : param->getDefaultArg()->getType(),
    979            param->getDefaultArg()->getValueKind(),
    980            param->getDefaultArg()->getObjectKind(), false, false, false, false),
    981       Param(param), Loc(Loc) { }
    982 
    983 public:
    984   CXXDefaultArgExpr(EmptyShell Empty) : Expr(CXXDefaultArgExprClass, Empty) {}
    985 
    986   // \p Param is the parameter whose default argument is used by this
    987   // expression.
    988   static CXXDefaultArgExpr *Create(const ASTContext &C, SourceLocation Loc,
    989                                    ParmVarDecl *Param) {
    990     return new (C) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param);
    991   }
    992 
    993   // Retrieve the parameter that the argument was created from.
    994   const ParmVarDecl *getParam() const { return Param; }
    995   ParmVarDecl *getParam() { return Param; }
    996 
    997   // Retrieve the actual argument to the function call.
    998   const Expr *getExpr() const {
    999     return getParam()->getDefaultArg();
   1000   }
   1001   Expr *getExpr() {
   1002     return getParam()->getDefaultArg();
   1003   }
   1004 
   1005   /// \brief Retrieve the location where this default argument was actually
   1006   /// used.
   1007   SourceLocation getUsedLocation() const { return Loc; }
   1008 
   1009   /// Default argument expressions have no representation in the
   1010   /// source, so they have an empty source range.
   1011   SourceLocation getLocStart() const LLVM_READONLY { return SourceLocation(); }
   1012   SourceLocation getLocEnd() const LLVM_READONLY { return SourceLocation(); }
   1013 
   1014   SourceLocation getExprLoc() const LLVM_READONLY { return Loc; }
   1015 
   1016   static bool classof(const Stmt *T) {
   1017     return T->getStmtClass() == CXXDefaultArgExprClass;
   1018   }
   1019 
   1020   // Iterators
   1021   child_range children() {
   1022     return child_range(child_iterator(), child_iterator());
   1023   }
   1024 
   1025   friend class ASTStmtReader;
   1026   friend class ASTStmtWriter;
   1027 };
   1028 
   1029 /// \brief A use of a default initializer in a constructor or in aggregate
   1030 /// initialization.
   1031 ///
   1032 /// This wraps a use of a C++ default initializer (technically,
   1033 /// a brace-or-equal-initializer for a non-static data member) when it
   1034 /// is implicitly used in a mem-initializer-list in a constructor
   1035 /// (C++11 [class.base.init]p8) or in aggregate initialization
   1036 /// (C++1y [dcl.init.aggr]p7).
   1037 class CXXDefaultInitExpr : public Expr {
   1038   /// \brief The field whose default is being used.
   1039   FieldDecl *Field;
   1040 
   1041   /// \brief The location where the default initializer expression was used.
   1042   SourceLocation Loc;
   1043 
   1044   CXXDefaultInitExpr(const ASTContext &C, SourceLocation Loc, FieldDecl *Field,
   1045                      QualType T);
   1046 
   1047   CXXDefaultInitExpr(EmptyShell Empty) : Expr(CXXDefaultInitExprClass, Empty) {}
   1048 
   1049 public:
   1050   /// \p Field is the non-static data member whose default initializer is used
   1051   /// by this expression.
   1052   static CXXDefaultInitExpr *Create(const ASTContext &C, SourceLocation Loc,
   1053                                     FieldDecl *Field) {
   1054     return new (C) CXXDefaultInitExpr(C, Loc, Field, Field->getType());
   1055   }
   1056 
   1057   /// \brief Get the field whose initializer will be used.
   1058   FieldDecl *getField() { return Field; }
   1059   const FieldDecl *getField() const { return Field; }
   1060 
   1061   /// \brief Get the initialization expression that will be used.
   1062   const Expr *getExpr() const {
   1063     assert(Field->getInClassInitializer() && "initializer hasn't been parsed");
   1064     return Field->getInClassInitializer();
   1065   }
   1066   Expr *getExpr() {
   1067     assert(Field->getInClassInitializer() && "initializer hasn't been parsed");
   1068     return Field->getInClassInitializer();
   1069   }
   1070 
   1071   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
   1072   SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
   1073 
   1074   static bool classof(const Stmt *T) {
   1075     return T->getStmtClass() == CXXDefaultInitExprClass;
   1076   }
   1077 
   1078   // Iterators
   1079   child_range children() {
   1080     return child_range(child_iterator(), child_iterator());
   1081   }
   1082 
   1083   friend class ASTReader;
   1084   friend class ASTStmtReader;
   1085 };
   1086 
   1087 /// \brief Represents a C++ temporary.
   1088 class CXXTemporary {
   1089   /// \brief The destructor that needs to be called.
   1090   const CXXDestructorDecl *Destructor;
   1091 
   1092   explicit CXXTemporary(const CXXDestructorDecl *destructor)
   1093     : Destructor(destructor) { }
   1094 
   1095 public:
   1096   static CXXTemporary *Create(const ASTContext &C,
   1097                               const CXXDestructorDecl *Destructor);
   1098 
   1099   const CXXDestructorDecl *getDestructor() const { return Destructor; }
   1100   void setDestructor(const CXXDestructorDecl *Dtor) {
   1101     Destructor = Dtor;
   1102   }
   1103 };
   1104 
   1105 /// \brief Represents binding an expression to a temporary.
   1106 ///
   1107 /// This ensures the destructor is called for the temporary. It should only be
   1108 /// needed for non-POD, non-trivially destructable class types. For example:
   1109 ///
   1110 /// \code
   1111 ///   struct S {
   1112 ///     S() { }  // User defined constructor makes S non-POD.
   1113 ///     ~S() { } // User defined destructor makes it non-trivial.
   1114 ///   };
   1115 ///   void test() {
   1116 ///     const S &s_ref = S(); // Requires a CXXBindTemporaryExpr.
   1117 ///   }
   1118 /// \endcode
   1119 class CXXBindTemporaryExpr : public Expr {
   1120   CXXTemporary *Temp;
   1121 
   1122   Stmt *SubExpr;
   1123 
   1124   CXXBindTemporaryExpr(CXXTemporary *temp, Expr* SubExpr)
   1125    : Expr(CXXBindTemporaryExprClass, SubExpr->getType(),
   1126           VK_RValue, OK_Ordinary, SubExpr->isTypeDependent(),
   1127           SubExpr->isValueDependent(),
   1128           SubExpr->isInstantiationDependent(),
   1129           SubExpr->containsUnexpandedParameterPack()),
   1130      Temp(temp), SubExpr(SubExpr) { }
   1131 
   1132 public:
   1133   CXXBindTemporaryExpr(EmptyShell Empty)
   1134     : Expr(CXXBindTemporaryExprClass, Empty), Temp(nullptr), SubExpr(nullptr) {}
   1135 
   1136   static CXXBindTemporaryExpr *Create(const ASTContext &C, CXXTemporary *Temp,
   1137                                       Expr* SubExpr);
   1138 
   1139   CXXTemporary *getTemporary() { return Temp; }
   1140   const CXXTemporary *getTemporary() const { return Temp; }
   1141   void setTemporary(CXXTemporary *T) { Temp = T; }
   1142 
   1143   const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
   1144   Expr *getSubExpr() { return cast<Expr>(SubExpr); }
   1145   void setSubExpr(Expr *E) { SubExpr = E; }
   1146 
   1147   SourceLocation getLocStart() const LLVM_READONLY {
   1148     return SubExpr->getLocStart();
   1149   }
   1150   SourceLocation getLocEnd() const LLVM_READONLY { return SubExpr->getLocEnd();}
   1151 
   1152   // Implement isa/cast/dyncast/etc.
   1153   static bool classof(const Stmt *T) {
   1154     return T->getStmtClass() == CXXBindTemporaryExprClass;
   1155   }
   1156 
   1157   // Iterators
   1158   child_range children() { return child_range(&SubExpr, &SubExpr + 1); }
   1159 };
   1160 
   1161 /// \brief Represents a call to a C++ constructor.
   1162 class CXXConstructExpr : public Expr {
   1163 public:
   1164   enum ConstructionKind {
   1165     CK_Complete,
   1166     CK_NonVirtualBase,
   1167     CK_VirtualBase,
   1168     CK_Delegating
   1169   };
   1170 
   1171 private:
   1172   CXXConstructorDecl *Constructor;
   1173 
   1174   SourceLocation Loc;
   1175   SourceRange ParenOrBraceRange;
   1176   unsigned NumArgs : 16;
   1177   unsigned Elidable : 1;
   1178   unsigned HadMultipleCandidates : 1;
   1179   unsigned ListInitialization : 1;
   1180   unsigned StdInitListInitialization : 1;
   1181   unsigned ZeroInitialization : 1;
   1182   unsigned ConstructKind : 2;
   1183   Stmt **Args;
   1184 
   1185   void setConstructor(CXXConstructorDecl *C) { Constructor = C; }
   1186 
   1187 protected:
   1188   CXXConstructExpr(const ASTContext &C, StmtClass SC, QualType T,
   1189                    SourceLocation Loc,
   1190                    CXXConstructorDecl *Ctor,
   1191                    bool Elidable,
   1192                    ArrayRef<Expr *> Args,
   1193                    bool HadMultipleCandidates,
   1194                    bool ListInitialization,
   1195                    bool StdInitListInitialization,
   1196                    bool ZeroInitialization,
   1197                    ConstructionKind ConstructKind,
   1198                    SourceRange ParenOrBraceRange);
   1199 
   1200   /// \brief Construct an empty C++ construction expression.
   1201   CXXConstructExpr(StmtClass SC, EmptyShell Empty)
   1202     : Expr(SC, Empty), Constructor(nullptr), NumArgs(0), Elidable(false),
   1203       HadMultipleCandidates(false), ListInitialization(false),
   1204       ZeroInitialization(false), ConstructKind(0), Args(nullptr)
   1205   { }
   1206 
   1207 public:
   1208   /// \brief Construct an empty C++ construction expression.
   1209   explicit CXXConstructExpr(EmptyShell Empty)
   1210     : CXXConstructExpr(CXXConstructExprClass, Empty) {}
   1211 
   1212   static CXXConstructExpr *Create(const ASTContext &C, QualType T,
   1213                                   SourceLocation Loc,
   1214                                   CXXConstructorDecl *Ctor,
   1215                                   bool Elidable,
   1216                                   ArrayRef<Expr *> Args,
   1217                                   bool HadMultipleCandidates,
   1218                                   bool ListInitialization,
   1219                                   bool StdInitListInitialization,
   1220                                   bool ZeroInitialization,
   1221                                   ConstructionKind ConstructKind,
   1222                                   SourceRange ParenOrBraceRange);
   1223 
   1224   /// \brief Get the constructor that this expression will (ultimately) call.
   1225   CXXConstructorDecl *getConstructor() const { return Constructor; }
   1226 
   1227   SourceLocation getLocation() const { return Loc; }
   1228   void setLocation(SourceLocation Loc) { this->Loc = Loc; }
   1229 
   1230   /// \brief Whether this construction is elidable.
   1231   bool isElidable() const { return Elidable; }
   1232   void setElidable(bool E) { Elidable = E; }
   1233 
   1234   /// \brief Whether the referred constructor was resolved from
   1235   /// an overloaded set having size greater than 1.
   1236   bool hadMultipleCandidates() const { return HadMultipleCandidates; }
   1237   void setHadMultipleCandidates(bool V) { HadMultipleCandidates = V; }
   1238 
   1239   /// \brief Whether this constructor call was written as list-initialization.
   1240   bool isListInitialization() const { return ListInitialization; }
   1241   void setListInitialization(bool V) { ListInitialization = V; }
   1242 
   1243   /// \brief Whether this constructor call was written as list-initialization,
   1244   /// but was interpreted as forming a std::initializer_list<T> from the list
   1245   /// and passing that as a single constructor argument.
   1246   /// See C++11 [over.match.list]p1 bullet 1.
   1247   bool isStdInitListInitialization() const { return StdInitListInitialization; }
   1248   void setStdInitListInitialization(bool V) { StdInitListInitialization = V; }
   1249 
   1250   /// \brief Whether this construction first requires
   1251   /// zero-initialization before the initializer is called.
   1252   bool requiresZeroInitialization() const { return ZeroInitialization; }
   1253   void setRequiresZeroInitialization(bool ZeroInit) {
   1254     ZeroInitialization = ZeroInit;
   1255   }
   1256 
   1257   /// \brief Determine whether this constructor is actually constructing
   1258   /// a base class (rather than a complete object).
   1259   ConstructionKind getConstructionKind() const {
   1260     return (ConstructionKind)ConstructKind;
   1261   }
   1262   void setConstructionKind(ConstructionKind CK) {
   1263     ConstructKind = CK;
   1264   }
   1265 
   1266   typedef ExprIterator arg_iterator;
   1267   typedef ConstExprIterator const_arg_iterator;
   1268   typedef llvm::iterator_range<arg_iterator> arg_range;
   1269   typedef llvm::iterator_range<const_arg_iterator> arg_const_range;
   1270 
   1271   arg_range arguments() { return arg_range(arg_begin(), arg_end()); }
   1272   arg_const_range arguments() const {
   1273     return arg_const_range(arg_begin(), arg_end());
   1274   }
   1275 
   1276   arg_iterator arg_begin() { return Args; }
   1277   arg_iterator arg_end() { return Args + NumArgs; }
   1278   const_arg_iterator arg_begin() const { return Args; }
   1279   const_arg_iterator arg_end() const { return Args + NumArgs; }
   1280 
   1281   Expr **getArgs() { return reinterpret_cast<Expr **>(Args); }
   1282   const Expr *const *getArgs() const {
   1283     return const_cast<CXXConstructExpr *>(this)->getArgs();
   1284   }
   1285   unsigned getNumArgs() const { return NumArgs; }
   1286 
   1287   /// \brief Return the specified argument.
   1288   Expr *getArg(unsigned Arg) {
   1289     assert(Arg < NumArgs && "Arg access out of range!");
   1290     return cast<Expr>(Args[Arg]);
   1291   }
   1292   const Expr *getArg(unsigned Arg) const {
   1293     assert(Arg < NumArgs && "Arg access out of range!");
   1294     return cast<Expr>(Args[Arg]);
   1295   }
   1296 
   1297   /// \brief Set the specified argument.
   1298   void setArg(unsigned Arg, Expr *ArgExpr) {
   1299     assert(Arg < NumArgs && "Arg access out of range!");
   1300     Args[Arg] = ArgExpr;
   1301   }
   1302 
   1303   SourceLocation getLocStart() const LLVM_READONLY;
   1304   SourceLocation getLocEnd() const LLVM_READONLY;
   1305   SourceRange getParenOrBraceRange() const { return ParenOrBraceRange; }
   1306   void setParenOrBraceRange(SourceRange Range) { ParenOrBraceRange = Range; }
   1307 
   1308   static bool classof(const Stmt *T) {
   1309     return T->getStmtClass() == CXXConstructExprClass ||
   1310       T->getStmtClass() == CXXTemporaryObjectExprClass;
   1311   }
   1312 
   1313   // Iterators
   1314   child_range children() {
   1315     return child_range(&Args[0], &Args[0]+NumArgs);
   1316   }
   1317 
   1318   friend class ASTStmtReader;
   1319 };
   1320 
   1321 /// \brief Represents a call to an inherited base class constructor from an
   1322 /// inheriting constructor. This call implicitly forwards the arguments from
   1323 /// the enclosing context (an inheriting constructor) to the specified inherited
   1324 /// base class constructor.
   1325 class CXXInheritedCtorInitExpr : public Expr {
   1326 private:
   1327   CXXConstructorDecl *Constructor;
   1328 
   1329   /// The location of the using declaration.
   1330   SourceLocation Loc;
   1331 
   1332   /// Whether this is the construction of a virtual base.
   1333   unsigned ConstructsVirtualBase : 1;
   1334 
   1335   /// Whether the constructor is inherited from a virtual base class of the
   1336   /// class that we construct.
   1337   unsigned InheritedFromVirtualBase : 1;
   1338 
   1339 public:
   1340   /// \brief Construct a C++ inheriting construction expression.
   1341   CXXInheritedCtorInitExpr(SourceLocation Loc, QualType T,
   1342                            CXXConstructorDecl *Ctor, bool ConstructsVirtualBase,
   1343                            bool InheritedFromVirtualBase)
   1344       : Expr(CXXInheritedCtorInitExprClass, T, VK_RValue, OK_Ordinary, false,
   1345              false, false, false),
   1346         Constructor(Ctor), Loc(Loc),
   1347         ConstructsVirtualBase(ConstructsVirtualBase),
   1348         InheritedFromVirtualBase(InheritedFromVirtualBase) {
   1349     assert(!T->isDependentType());
   1350   }
   1351 
   1352   /// \brief Construct an empty C++ inheriting construction expression.
   1353   explicit CXXInheritedCtorInitExpr(EmptyShell Empty)
   1354       : Expr(CXXInheritedCtorInitExprClass, Empty), Constructor(nullptr),
   1355         ConstructsVirtualBase(false), InheritedFromVirtualBase(false) {}
   1356 
   1357   /// \brief Get the constructor that this expression will call.
   1358   CXXConstructorDecl *getConstructor() const { return Constructor; }
   1359 
   1360   /// \brief Determine whether this constructor is actually constructing
   1361   /// a base class (rather than a complete object).
   1362   bool constructsVBase() const { return ConstructsVirtualBase; }
   1363   CXXConstructExpr::ConstructionKind getConstructionKind() const {
   1364     return ConstructsVirtualBase ? CXXConstructExpr::CK_VirtualBase
   1365                                  : CXXConstructExpr::CK_NonVirtualBase;
   1366   }
   1367 
   1368   /// \brief Determine whether the inherited constructor is inherited from a
   1369   /// virtual base of the object we construct. If so, we are not responsible
   1370   /// for calling the inherited constructor (the complete object constructor
   1371   /// does that), and so we don't need to pass any arguments.
   1372   bool inheritedFromVBase() const { return InheritedFromVirtualBase; }
   1373 
   1374   SourceLocation getLocation() const LLVM_READONLY { return Loc; }
   1375   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
   1376   SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
   1377 
   1378   static bool classof(const Stmt *T) {
   1379     return T->getStmtClass() == CXXInheritedCtorInitExprClass;
   1380   }
   1381   child_range children() {
   1382     return child_range(child_iterator(), child_iterator());
   1383   }
   1384 
   1385   friend class ASTStmtReader;
   1386 };
   1387 
   1388 /// \brief Represents an explicit C++ type conversion that uses "functional"
   1389 /// notation (C++ [expr.type.conv]).
   1390 ///
   1391 /// Example:
   1392 /// \code
   1393 ///   x = int(0.5);
   1394 /// \endcode
   1395 class CXXFunctionalCastExpr final
   1396     : public ExplicitCastExpr,
   1397       private llvm::TrailingObjects<CXXFunctionalCastExpr, CXXBaseSpecifier *> {
   1398   SourceLocation LParenLoc;
   1399   SourceLocation RParenLoc;
   1400 
   1401   CXXFunctionalCastExpr(QualType ty, ExprValueKind VK,
   1402                         TypeSourceInfo *writtenTy,
   1403                         CastKind kind, Expr *castExpr, unsigned pathSize,
   1404                         SourceLocation lParenLoc, SourceLocation rParenLoc)
   1405     : ExplicitCastExpr(CXXFunctionalCastExprClass, ty, VK, kind,
   1406                        castExpr, pathSize, writtenTy),
   1407       LParenLoc(lParenLoc), RParenLoc(rParenLoc) {}
   1408 
   1409   explicit CXXFunctionalCastExpr(EmptyShell Shell, unsigned PathSize)
   1410     : ExplicitCastExpr(CXXFunctionalCastExprClass, Shell, PathSize) { }
   1411 
   1412 public:
   1413   static CXXFunctionalCastExpr *Create(const ASTContext &Context, QualType T,
   1414                                        ExprValueKind VK,
   1415                                        TypeSourceInfo *Written,
   1416                                        CastKind Kind, Expr *Op,
   1417                                        const CXXCastPath *Path,
   1418                                        SourceLocation LPLoc,
   1419                                        SourceLocation RPLoc);
   1420   static CXXFunctionalCastExpr *CreateEmpty(const ASTContext &Context,
   1421                                             unsigned PathSize);
   1422 
   1423   SourceLocation getLParenLoc() const { return LParenLoc; }
   1424   void setLParenLoc(SourceLocation L) { LParenLoc = L; }
   1425   SourceLocation getRParenLoc() const { return RParenLoc; }
   1426   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
   1427 
   1428   SourceLocation getLocStart() const LLVM_READONLY;
   1429   SourceLocation getLocEnd() const LLVM_READONLY;
   1430 
   1431   static bool classof(const Stmt *T) {
   1432     return T->getStmtClass() == CXXFunctionalCastExprClass;
   1433   }
   1434 
   1435   friend TrailingObjects;
   1436   friend class CastExpr;
   1437 };
   1438 
   1439 /// @brief Represents a C++ functional cast expression that builds a
   1440 /// temporary object.
   1441 ///
   1442 /// This expression type represents a C++ "functional" cast
   1443 /// (C++[expr.type.conv]) with N != 1 arguments that invokes a
   1444 /// constructor to build a temporary object. With N == 1 arguments the
   1445 /// functional cast expression will be represented by CXXFunctionalCastExpr.
   1446 /// Example:
   1447 /// \code
   1448 /// struct X { X(int, float); }
   1449 ///
   1450 /// X create_X() {
   1451 ///   return X(1, 3.14f); // creates a CXXTemporaryObjectExpr
   1452 /// };
   1453 /// \endcode
   1454 class CXXTemporaryObjectExpr : public CXXConstructExpr {
   1455   TypeSourceInfo *Type;
   1456 
   1457 public:
   1458   CXXTemporaryObjectExpr(const ASTContext &C,
   1459                          CXXConstructorDecl *Cons,
   1460                          TypeSourceInfo *Type,
   1461                          ArrayRef<Expr *> Args,
   1462                          SourceRange ParenOrBraceRange,
   1463                          bool HadMultipleCandidates,
   1464                          bool ListInitialization,
   1465                          bool StdInitListInitialization,
   1466                          bool ZeroInitialization);
   1467   explicit CXXTemporaryObjectExpr(EmptyShell Empty)
   1468     : CXXConstructExpr(CXXTemporaryObjectExprClass, Empty), Type() { }
   1469 
   1470   TypeSourceInfo *getTypeSourceInfo() const { return Type; }
   1471 
   1472   SourceLocation getLocStart() const LLVM_READONLY;
   1473   SourceLocation getLocEnd() const LLVM_READONLY;
   1474 
   1475   static bool classof(const Stmt *T) {
   1476     return T->getStmtClass() == CXXTemporaryObjectExprClass;
   1477   }
   1478 
   1479   friend class ASTStmtReader;
   1480 };
   1481 
   1482 /// \brief A C++ lambda expression, which produces a function object
   1483 /// (of unspecified type) that can be invoked later.
   1484 ///
   1485 /// Example:
   1486 /// \code
   1487 /// void low_pass_filter(std::vector<double> &values, double cutoff) {
   1488 ///   values.erase(std::remove_if(values.begin(), values.end(),
   1489 ///                               [=](double value) { return value > cutoff; });
   1490 /// }
   1491 /// \endcode
   1492 ///
   1493 /// C++11 lambda expressions can capture local variables, either by copying
   1494 /// the values of those local variables at the time the function
   1495 /// object is constructed (not when it is called!) or by holding a
   1496 /// reference to the local variable. These captures can occur either
   1497 /// implicitly or can be written explicitly between the square
   1498 /// brackets ([...]) that start the lambda expression.
   1499 ///
   1500 /// C++1y introduces a new form of "capture" called an init-capture that
   1501 /// includes an initializing expression (rather than capturing a variable),
   1502 /// and which can never occur implicitly.
   1503 class LambdaExpr final
   1504     : public Expr,
   1505       private llvm::TrailingObjects<LambdaExpr, Stmt *, unsigned, VarDecl *> {
   1506   /// \brief The source range that covers the lambda introducer ([...]).
   1507   SourceRange IntroducerRange;
   1508 
   1509   /// \brief The source location of this lambda's capture-default ('=' or '&').
   1510   SourceLocation CaptureDefaultLoc;
   1511 
   1512   /// \brief The number of captures.
   1513   unsigned NumCaptures : 16;
   1514 
   1515   /// \brief The default capture kind, which is a value of type
   1516   /// LambdaCaptureDefault.
   1517   unsigned CaptureDefault : 2;
   1518 
   1519   /// \brief Whether this lambda had an explicit parameter list vs. an
   1520   /// implicit (and empty) parameter list.
   1521   unsigned ExplicitParams : 1;
   1522 
   1523   /// \brief Whether this lambda had the result type explicitly specified.
   1524   unsigned ExplicitResultType : 1;
   1525 
   1526   /// \brief Whether there are any array index variables stored at the end of
   1527   /// this lambda expression.
   1528   unsigned HasArrayIndexVars : 1;
   1529 
   1530   /// \brief The location of the closing brace ('}') that completes
   1531   /// the lambda.
   1532   ///
   1533   /// The location of the brace is also available by looking up the
   1534   /// function call operator in the lambda class. However, it is
   1535   /// stored here to improve the performance of getSourceRange(), and
   1536   /// to avoid having to deserialize the function call operator from a
   1537   /// module file just to determine the source range.
   1538   SourceLocation ClosingBrace;
   1539 
   1540   size_t numTrailingObjects(OverloadToken<Stmt *>) const {
   1541     return NumCaptures + 1;
   1542   }
   1543 
   1544   size_t numTrailingObjects(OverloadToken<unsigned>) const {
   1545     return HasArrayIndexVars ? NumCaptures + 1 : 0;
   1546   }
   1547 
   1548   /// \brief Construct a lambda expression.
   1549   LambdaExpr(QualType T, SourceRange IntroducerRange,
   1550              LambdaCaptureDefault CaptureDefault,
   1551              SourceLocation CaptureDefaultLoc, ArrayRef<LambdaCapture> Captures,
   1552              bool ExplicitParams, bool ExplicitResultType,
   1553              ArrayRef<Expr *> CaptureInits, ArrayRef<VarDecl *> ArrayIndexVars,
   1554              ArrayRef<unsigned> ArrayIndexStarts, SourceLocation ClosingBrace,
   1555              bool ContainsUnexpandedParameterPack);
   1556 
   1557   /// \brief Construct an empty lambda expression.
   1558   LambdaExpr(EmptyShell Empty, unsigned NumCaptures, bool HasArrayIndexVars)
   1559     : Expr(LambdaExprClass, Empty),
   1560       NumCaptures(NumCaptures), CaptureDefault(LCD_None), ExplicitParams(false),
   1561       ExplicitResultType(false), HasArrayIndexVars(true) {
   1562     getStoredStmts()[NumCaptures] = nullptr;
   1563   }
   1564 
   1565   Stmt **getStoredStmts() { return getTrailingObjects<Stmt *>(); }
   1566 
   1567   Stmt *const *getStoredStmts() const { return getTrailingObjects<Stmt *>(); }
   1568 
   1569   /// \brief Retrieve the mapping from captures to the first array index
   1570   /// variable.
   1571   unsigned *getArrayIndexStarts() { return getTrailingObjects<unsigned>(); }
   1572 
   1573   const unsigned *getArrayIndexStarts() const {
   1574     return getTrailingObjects<unsigned>();
   1575   }
   1576 
   1577   /// \brief Retrieve the complete set of array-index variables.
   1578   VarDecl **getArrayIndexVars() { return getTrailingObjects<VarDecl *>(); }
   1579 
   1580   VarDecl *const *getArrayIndexVars() const {
   1581     return getTrailingObjects<VarDecl *>();
   1582   }
   1583 
   1584 public:
   1585   /// \brief Construct a new lambda expression.
   1586   static LambdaExpr *
   1587   Create(const ASTContext &C, CXXRecordDecl *Class, SourceRange IntroducerRange,
   1588          LambdaCaptureDefault CaptureDefault, SourceLocation CaptureDefaultLoc,
   1589          ArrayRef<LambdaCapture> Captures, bool ExplicitParams,
   1590          bool ExplicitResultType, ArrayRef<Expr *> CaptureInits,
   1591          ArrayRef<VarDecl *> ArrayIndexVars,
   1592          ArrayRef<unsigned> ArrayIndexStarts, SourceLocation ClosingBrace,
   1593          bool ContainsUnexpandedParameterPack);
   1594 
   1595   /// \brief Construct a new lambda expression that will be deserialized from
   1596   /// an external source.
   1597   static LambdaExpr *CreateDeserialized(const ASTContext &C,
   1598                                         unsigned NumCaptures,
   1599                                         unsigned NumArrayIndexVars);
   1600 
   1601   /// \brief Determine the default capture kind for this lambda.
   1602   LambdaCaptureDefault getCaptureDefault() const {
   1603     return static_cast<LambdaCaptureDefault>(CaptureDefault);
   1604   }
   1605 
   1606   /// \brief Retrieve the location of this lambda's capture-default, if any.
   1607   SourceLocation getCaptureDefaultLoc() const {
   1608     return CaptureDefaultLoc;
   1609   }
   1610 
   1611   /// \brief Determine whether one of this lambda's captures is an init-capture.
   1612   bool isInitCapture(const LambdaCapture *Capture) const;
   1613 
   1614   /// \brief An iterator that walks over the captures of the lambda,
   1615   /// both implicit and explicit.
   1616   typedef const LambdaCapture *capture_iterator;
   1617 
   1618   /// \brief An iterator over a range of lambda captures.
   1619   typedef llvm::iterator_range<capture_iterator> capture_range;
   1620 
   1621   /// \brief Retrieve this lambda's captures.
   1622   capture_range captures() const;
   1623 
   1624   /// \brief Retrieve an iterator pointing to the first lambda capture.
   1625   capture_iterator capture_begin() const;
   1626 
   1627   /// \brief Retrieve an iterator pointing past the end of the
   1628   /// sequence of lambda captures.
   1629   capture_iterator capture_end() const;
   1630 
   1631   /// \brief Determine the number of captures in this lambda.
   1632   unsigned capture_size() const { return NumCaptures; }
   1633 
   1634   /// \brief Retrieve this lambda's explicit captures.
   1635   capture_range explicit_captures() const;
   1636 
   1637   /// \brief Retrieve an iterator pointing to the first explicit
   1638   /// lambda capture.
   1639   capture_iterator explicit_capture_begin() const;
   1640 
   1641   /// \brief Retrieve an iterator pointing past the end of the sequence of
   1642   /// explicit lambda captures.
   1643   capture_iterator explicit_capture_end() const;
   1644 
   1645   /// \brief Retrieve this lambda's implicit captures.
   1646   capture_range implicit_captures() const;
   1647 
   1648   /// \brief Retrieve an iterator pointing to the first implicit
   1649   /// lambda capture.
   1650   capture_iterator implicit_capture_begin() const;
   1651 
   1652   /// \brief Retrieve an iterator pointing past the end of the sequence of
   1653   /// implicit lambda captures.
   1654   capture_iterator implicit_capture_end() const;
   1655 
   1656   /// \brief Iterator that walks over the capture initialization
   1657   /// arguments.
   1658   typedef Expr **capture_init_iterator;
   1659 
   1660   /// \brief Const iterator that walks over the capture initialization
   1661   /// arguments.
   1662   typedef Expr *const *const_capture_init_iterator;
   1663 
   1664   /// \brief Retrieve the initialization expressions for this lambda's captures.
   1665   llvm::iterator_range<capture_init_iterator> capture_inits() {
   1666     return llvm::make_range(capture_init_begin(), capture_init_end());
   1667   }
   1668 
   1669   /// \brief Retrieve the initialization expressions for this lambda's captures.
   1670   llvm::iterator_range<const_capture_init_iterator> capture_inits() const {
   1671     return llvm::make_range(capture_init_begin(), capture_init_end());
   1672   }
   1673 
   1674   /// \brief Retrieve the first initialization argument for this
   1675   /// lambda expression (which initializes the first capture field).
   1676   capture_init_iterator capture_init_begin() {
   1677     return reinterpret_cast<Expr **>(getStoredStmts());
   1678   }
   1679 
   1680   /// \brief Retrieve the first initialization argument for this
   1681   /// lambda expression (which initializes the first capture field).
   1682   const_capture_init_iterator capture_init_begin() const {
   1683     return reinterpret_cast<Expr *const *>(getStoredStmts());
   1684   }
   1685 
   1686   /// \brief Retrieve the iterator pointing one past the last
   1687   /// initialization argument for this lambda expression.
   1688   capture_init_iterator capture_init_end() {
   1689     return capture_init_begin() + NumCaptures;
   1690   }
   1691 
   1692   /// \brief Retrieve the iterator pointing one past the last
   1693   /// initialization argument for this lambda expression.
   1694   const_capture_init_iterator capture_init_end() const {
   1695     return capture_init_begin() + NumCaptures;
   1696   }
   1697 
   1698   /// \brief Retrieve the set of index variables used in the capture
   1699   /// initializer of an array captured by copy.
   1700   ///
   1701   /// \param Iter The iterator that points at the capture initializer for
   1702   /// which we are extracting the corresponding index variables.
   1703   ArrayRef<VarDecl *>
   1704   getCaptureInitIndexVars(const_capture_init_iterator Iter) const;
   1705 
   1706   /// \brief Retrieve the source range covering the lambda introducer,
   1707   /// which contains the explicit capture list surrounded by square
   1708   /// brackets ([...]).
   1709   SourceRange getIntroducerRange() const { return IntroducerRange; }
   1710 
   1711   /// \brief Retrieve the class that corresponds to the lambda.
   1712   ///
   1713   /// This is the "closure type" (C++1y [expr.prim.lambda]), and stores the
   1714   /// captures in its fields and provides the various operations permitted
   1715   /// on a lambda (copying, calling).
   1716   CXXRecordDecl *getLambdaClass() const;
   1717 
   1718   /// \brief Retrieve the function call operator associated with this
   1719   /// lambda expression.
   1720   CXXMethodDecl *getCallOperator() const;
   1721 
   1722   /// \brief If this is a generic lambda expression, retrieve the template
   1723   /// parameter list associated with it, or else return null.
   1724   TemplateParameterList *getTemplateParameterList() const;
   1725 
   1726   /// \brief Whether this is a generic lambda.
   1727   bool isGenericLambda() const { return getTemplateParameterList(); }
   1728 
   1729   /// \brief Retrieve the body of the lambda.
   1730   CompoundStmt *getBody() const;
   1731 
   1732   /// \brief Determine whether the lambda is mutable, meaning that any
   1733   /// captures values can be modified.
   1734   bool isMutable() const;
   1735 
   1736   /// \brief Determine whether this lambda has an explicit parameter
   1737   /// list vs. an implicit (empty) parameter list.
   1738   bool hasExplicitParameters() const { return ExplicitParams; }
   1739 
   1740   /// \brief Whether this lambda had its result type explicitly specified.
   1741   bool hasExplicitResultType() const { return ExplicitResultType; }
   1742 
   1743   static bool classof(const Stmt *T) {
   1744     return T->getStmtClass() == LambdaExprClass;
   1745   }
   1746 
   1747   SourceLocation getLocStart() const LLVM_READONLY {
   1748     return IntroducerRange.getBegin();
   1749   }
   1750   SourceLocation getLocEnd() const LLVM_READONLY { return ClosingBrace; }
   1751 
   1752   child_range children() {
   1753     // Includes initialization exprs plus body stmt
   1754     return child_range(getStoredStmts(), getStoredStmts() + NumCaptures + 1);
   1755   }
   1756 
   1757   friend TrailingObjects;
   1758   friend class ASTStmtReader;
   1759   friend class ASTStmtWriter;
   1760 };
   1761 
   1762 /// An expression "T()" which creates a value-initialized rvalue of type
   1763 /// T, which is a non-class type.  See (C++98 [5.2.3p2]).
   1764 class CXXScalarValueInitExpr : public Expr {
   1765   SourceLocation RParenLoc;
   1766   TypeSourceInfo *TypeInfo;
   1767 
   1768   friend class ASTStmtReader;
   1769 
   1770 public:
   1771   /// \brief Create an explicitly-written scalar-value initialization
   1772   /// expression.
   1773   CXXScalarValueInitExpr(QualType Type, TypeSourceInfo *TypeInfo,
   1774                          SourceLocation rParenLoc)
   1775       : Expr(CXXScalarValueInitExprClass, Type, VK_RValue, OK_Ordinary,
   1776              false, false, Type->isInstantiationDependentType(),
   1777              Type->containsUnexpandedParameterPack()),
   1778         RParenLoc(rParenLoc), TypeInfo(TypeInfo) {}
   1779 
   1780   explicit CXXScalarValueInitExpr(EmptyShell Shell)
   1781     : Expr(CXXScalarValueInitExprClass, Shell) { }
   1782 
   1783   TypeSourceInfo *getTypeSourceInfo() const {
   1784     return TypeInfo;
   1785   }
   1786 
   1787   SourceLocation getRParenLoc() const { return RParenLoc; }
   1788 
   1789   SourceLocation getLocStart() const LLVM_READONLY;
   1790   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
   1791 
   1792   static bool classof(const Stmt *T) {
   1793     return T->getStmtClass() == CXXScalarValueInitExprClass;
   1794   }
   1795 
   1796   // Iterators
   1797   child_range children() {
   1798     return child_range(child_iterator(), child_iterator());
   1799   }
   1800 };
   1801 
   1802 /// \brief Represents a new-expression for memory allocation and constructor
   1803 /// calls, e.g: "new CXXNewExpr(foo)".
   1804 class CXXNewExpr : public Expr {
   1805   /// Contains an optional array size expression, an optional initialization
   1806   /// expression, and any number of optional placement arguments, in that order.
   1807   Stmt **SubExprs;
   1808   /// \brief Points to the allocation function used.
   1809   FunctionDecl *OperatorNew;
   1810   /// \brief Points to the deallocation function used in case of error. May be
   1811   /// null.
   1812   FunctionDecl *OperatorDelete;
   1813 
   1814   /// \brief The allocated type-source information, as written in the source.
   1815   TypeSourceInfo *AllocatedTypeInfo;
   1816 
   1817   /// \brief If the allocated type was expressed as a parenthesized type-id,
   1818   /// the source range covering the parenthesized type-id.
   1819   SourceRange TypeIdParens;
   1820 
   1821   /// \brief Range of the entire new expression.
   1822   SourceRange Range;
   1823 
   1824   /// \brief Source-range of a paren-delimited initializer.
   1825   SourceRange DirectInitRange;
   1826 
   1827   /// Was the usage ::new, i.e. is the global new to be used?
   1828   unsigned GlobalNew : 1;
   1829   /// Do we allocate an array? If so, the first SubExpr is the size expression.
   1830   unsigned Array : 1;
   1831   /// If this is an array allocation, does the usual deallocation
   1832   /// function for the allocated type want to know the allocated size?
   1833   unsigned UsualArrayDeleteWantsSize : 1;
   1834   /// The number of placement new arguments.
   1835   unsigned NumPlacementArgs : 13;
   1836   /// What kind of initializer do we have? Could be none, parens, or braces.
   1837   /// In storage, we distinguish between "none, and no initializer expr", and
   1838   /// "none, but an implicit initializer expr".
   1839   unsigned StoredInitializationStyle : 2;
   1840 
   1841   friend class ASTStmtReader;
   1842   friend class ASTStmtWriter;
   1843 public:
   1844   enum InitializationStyle {
   1845     NoInit,   ///< New-expression has no initializer as written.
   1846     CallInit, ///< New-expression has a C++98 paren-delimited initializer.
   1847     ListInit  ///< New-expression has a C++11 list-initializer.
   1848   };
   1849 
   1850   CXXNewExpr(const ASTContext &C, bool globalNew, FunctionDecl *operatorNew,
   1851              FunctionDecl *operatorDelete, bool usualArrayDeleteWantsSize,
   1852              ArrayRef<Expr*> placementArgs,
   1853              SourceRange typeIdParens, Expr *arraySize,
   1854              InitializationStyle initializationStyle, Expr *initializer,
   1855              QualType ty, TypeSourceInfo *AllocatedTypeInfo,
   1856              SourceRange Range, SourceRange directInitRange);
   1857   explicit CXXNewExpr(EmptyShell Shell)
   1858     : Expr(CXXNewExprClass, Shell), SubExprs(nullptr) { }
   1859 
   1860   void AllocateArgsArray(const ASTContext &C, bool isArray,
   1861                          unsigned numPlaceArgs, bool hasInitializer);
   1862 
   1863   QualType getAllocatedType() const {
   1864     assert(getType()->isPointerType());
   1865     return getType()->getAs<PointerType>()->getPointeeType();
   1866   }
   1867 
   1868   TypeSourceInfo *getAllocatedTypeSourceInfo() const {
   1869     return AllocatedTypeInfo;
   1870   }
   1871 
   1872   /// \brief True if the allocation result needs to be null-checked.
   1873   ///
   1874   /// C++11 [expr.new]p13:
   1875   ///   If the allocation function returns null, initialization shall
   1876   ///   not be done, the deallocation function shall not be called,
   1877   ///   and the value of the new-expression shall be null.
   1878   ///
   1879   /// C++ DR1748:
   1880   ///   If the allocation function is a reserved placement allocation
   1881   ///   function that returns null, the behavior is undefined.
   1882   ///
   1883   /// An allocation function is not allowed to return null unless it
   1884   /// has a non-throwing exception-specification.  The '03 rule is
   1885   /// identical except that the definition of a non-throwing
   1886   /// exception specification is just "is it throw()?".
   1887   bool shouldNullCheckAllocation(const ASTContext &Ctx) const;
   1888 
   1889   FunctionDecl *getOperatorNew() const { return OperatorNew; }
   1890   void setOperatorNew(FunctionDecl *D) { OperatorNew = D; }
   1891   FunctionDecl *getOperatorDelete() const { return OperatorDelete; }
   1892   void setOperatorDelete(FunctionDecl *D) { OperatorDelete = D; }
   1893 
   1894   bool isArray() const { return Array; }
   1895   Expr *getArraySize() {
   1896     return Array ? cast<Expr>(SubExprs[0]) : nullptr;
   1897   }
   1898   const Expr *getArraySize() const {
   1899     return Array ? cast<Expr>(SubExprs[0]) : nullptr;
   1900   }
   1901 
   1902   unsigned getNumPlacementArgs() const { return NumPlacementArgs; }
   1903   Expr **getPlacementArgs() {
   1904     return reinterpret_cast<Expr **>(SubExprs + Array + hasInitializer());
   1905   }
   1906 
   1907   Expr *getPlacementArg(unsigned i) {
   1908     assert(i < NumPlacementArgs && "Index out of range");
   1909     return getPlacementArgs()[i];
   1910   }
   1911   const Expr *getPlacementArg(unsigned i) const {
   1912     assert(i < NumPlacementArgs && "Index out of range");
   1913     return const_cast<CXXNewExpr*>(this)->getPlacementArg(i);
   1914   }
   1915 
   1916   bool isParenTypeId() const { return TypeIdParens.isValid(); }
   1917   SourceRange getTypeIdParens() const { return TypeIdParens; }
   1918 
   1919   bool isGlobalNew() const { return GlobalNew; }
   1920 
   1921   /// \brief Whether this new-expression has any initializer at all.
   1922   bool hasInitializer() const { return StoredInitializationStyle > 0; }
   1923 
   1924   /// \brief The kind of initializer this new-expression has.
   1925   InitializationStyle getInitializationStyle() const {
   1926     if (StoredInitializationStyle == 0)
   1927       return NoInit;
   1928     return static_cast<InitializationStyle>(StoredInitializationStyle-1);
   1929   }
   1930 
   1931   /// \brief The initializer of this new-expression.
   1932   Expr *getInitializer() {
   1933     return hasInitializer() ? cast<Expr>(SubExprs[Array]) : nullptr;
   1934   }
   1935   const Expr *getInitializer() const {
   1936     return hasInitializer() ? cast<Expr>(SubExprs[Array]) : nullptr;
   1937   }
   1938 
   1939   /// \brief Returns the CXXConstructExpr from this new-expression, or null.
   1940   const CXXConstructExpr* getConstructExpr() const {
   1941     return dyn_cast_or_null<CXXConstructExpr>(getInitializer());
   1942   }
   1943 
   1944   /// Answers whether the usual array deallocation function for the
   1945   /// allocated type expects the size of the allocation as a
   1946   /// parameter.
   1947   bool doesUsualArrayDeleteWantSize() const {
   1948     return UsualArrayDeleteWantsSize;
   1949   }
   1950 
   1951   typedef ExprIterator arg_iterator;
   1952   typedef ConstExprIterator const_arg_iterator;
   1953 
   1954   llvm::iterator_range<arg_iterator> placement_arguments() {
   1955     return llvm::make_range(placement_arg_begin(), placement_arg_end());
   1956   }
   1957 
   1958   llvm::iterator_range<const_arg_iterator> placement_arguments() const {
   1959     return llvm::make_range(placement_arg_begin(), placement_arg_end());
   1960   }
   1961 
   1962   arg_iterator placement_arg_begin() {
   1963     return SubExprs + Array + hasInitializer();
   1964   }
   1965   arg_iterator placement_arg_end() {
   1966     return SubExprs + Array + hasInitializer() + getNumPlacementArgs();
   1967   }
   1968   const_arg_iterator placement_arg_begin() const {
   1969     return SubExprs + Array + hasInitializer();
   1970   }
   1971   const_arg_iterator placement_arg_end() const {
   1972     return SubExprs + Array + hasInitializer() + getNumPlacementArgs();
   1973   }
   1974 
   1975   typedef Stmt **raw_arg_iterator;
   1976   raw_arg_iterator raw_arg_begin() { return SubExprs; }
   1977   raw_arg_iterator raw_arg_end() {
   1978     return SubExprs + Array + hasInitializer() + getNumPlacementArgs();
   1979   }
   1980   const_arg_iterator raw_arg_begin() const { return SubExprs; }
   1981   const_arg_iterator raw_arg_end() const {
   1982     return SubExprs + Array + hasInitializer() + getNumPlacementArgs();
   1983   }
   1984 
   1985   SourceLocation getStartLoc() const { return Range.getBegin(); }
   1986   SourceLocation getEndLoc() const { return Range.getEnd(); }
   1987 
   1988   SourceRange getDirectInitRange() const { return DirectInitRange; }
   1989 
   1990   SourceRange getSourceRange() const LLVM_READONLY {
   1991     return Range;
   1992   }
   1993   SourceLocation getLocStart() const LLVM_READONLY { return getStartLoc(); }
   1994   SourceLocation getLocEnd() const LLVM_READONLY { return getEndLoc(); }
   1995 
   1996   static bool classof(const Stmt *T) {
   1997     return T->getStmtClass() == CXXNewExprClass;
   1998   }
   1999 
   2000   // Iterators
   2001   child_range children() {
   2002     return child_range(raw_arg_begin(), raw_arg_end());
   2003   }
   2004 };
   2005 
   2006 /// \brief Represents a \c delete expression for memory deallocation and
   2007 /// destructor calls, e.g. "delete[] pArray".
   2008 class CXXDeleteExpr : public Expr {
   2009   /// Points to the operator delete overload that is used. Could be a member.
   2010   FunctionDecl *OperatorDelete;
   2011   /// The pointer expression to be deleted.
   2012   Stmt *Argument;
   2013   /// Location of the expression.
   2014   SourceLocation Loc;
   2015   /// Is this a forced global delete, i.e. "::delete"?
   2016   bool GlobalDelete : 1;
   2017   /// Is this the array form of delete, i.e. "delete[]"?
   2018   bool ArrayForm : 1;
   2019   /// ArrayFormAsWritten can be different from ArrayForm if 'delete' is applied
   2020   /// to pointer-to-array type (ArrayFormAsWritten will be false while ArrayForm
   2021   /// will be true).
   2022   bool ArrayFormAsWritten : 1;
   2023   /// Does the usual deallocation function for the element type require
   2024   /// a size_t argument?
   2025   bool UsualArrayDeleteWantsSize : 1;
   2026 public:
   2027   CXXDeleteExpr(QualType ty, bool globalDelete, bool arrayForm,
   2028                 bool arrayFormAsWritten, bool usualArrayDeleteWantsSize,
   2029                 FunctionDecl *operatorDelete, Expr *arg, SourceLocation loc)
   2030     : Expr(CXXDeleteExprClass, ty, VK_RValue, OK_Ordinary, false, false,
   2031            arg->isInstantiationDependent(),
   2032            arg->containsUnexpandedParameterPack()),
   2033       OperatorDelete(operatorDelete), Argument(arg), Loc(loc),
   2034       GlobalDelete(globalDelete),
   2035       ArrayForm(arrayForm), ArrayFormAsWritten(arrayFormAsWritten),
   2036       UsualArrayDeleteWantsSize(usualArrayDeleteWantsSize) { }
   2037   explicit CXXDeleteExpr(EmptyShell Shell)
   2038     : Expr(CXXDeleteExprClass, Shell), OperatorDelete(nullptr),
   2039       Argument(nullptr) {}
   2040 
   2041   bool isGlobalDelete() const { return GlobalDelete; }
   2042   bool isArrayForm() const { return ArrayForm; }
   2043   bool isArrayFormAsWritten() const { return ArrayFormAsWritten; }
   2044 
   2045   /// Answers whether the usual array deallocation function for the
   2046   /// allocated type expects the size of the allocation as a
   2047   /// parameter.  This can be true even if the actual deallocation
   2048   /// function that we're using doesn't want a size.
   2049   bool doesUsualArrayDeleteWantSize() const {
   2050     return UsualArrayDeleteWantsSize;
   2051   }
   2052 
   2053   FunctionDecl *getOperatorDelete() const { return OperatorDelete; }
   2054 
   2055   Expr *getArgument() { return cast<Expr>(Argument); }
   2056   const Expr *getArgument() const { return cast<Expr>(Argument); }
   2057 
   2058   /// \brief Retrieve the type being destroyed.
   2059   ///
   2060   /// If the type being destroyed is a dependent type which may or may not
   2061   /// be a pointer, return an invalid type.
   2062   QualType getDestroyedType() const;
   2063 
   2064   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
   2065   SourceLocation getLocEnd() const LLVM_READONLY {return Argument->getLocEnd();}
   2066 
   2067   static bool classof(const Stmt *T) {
   2068     return T->getStmtClass() == CXXDeleteExprClass;
   2069   }
   2070 
   2071   // Iterators
   2072   child_range children() { return child_range(&Argument, &Argument+1); }
   2073 
   2074   friend class ASTStmtReader;
   2075 };
   2076 
   2077 /// \brief Stores the type being destroyed by a pseudo-destructor expression.
   2078 class PseudoDestructorTypeStorage {
   2079   /// \brief Either the type source information or the name of the type, if
   2080   /// it couldn't be resolved due to type-dependence.
   2081   llvm::PointerUnion<TypeSourceInfo *, IdentifierInfo *> Type;
   2082 
   2083   /// \brief The starting source location of the pseudo-destructor type.
   2084   SourceLocation Location;
   2085 
   2086 public:
   2087   PseudoDestructorTypeStorage() { }
   2088 
   2089   PseudoDestructorTypeStorage(IdentifierInfo *II, SourceLocation Loc)
   2090     : Type(II), Location(Loc) { }
   2091 
   2092   PseudoDestructorTypeStorage(TypeSourceInfo *Info);
   2093 
   2094   TypeSourceInfo *getTypeSourceInfo() const {
   2095     return Type.dyn_cast<TypeSourceInfo *>();
   2096   }
   2097 
   2098   IdentifierInfo *getIdentifier() const {
   2099     return Type.dyn_cast<IdentifierInfo *>();
   2100   }
   2101 
   2102   SourceLocation getLocation() const { return Location; }
   2103 };
   2104 
   2105 /// \brief Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
   2106 ///
   2107 /// A pseudo-destructor is an expression that looks like a member access to a
   2108 /// destructor of a scalar type, except that scalar types don't have
   2109 /// destructors. For example:
   2110 ///
   2111 /// \code
   2112 /// typedef int T;
   2113 /// void f(int *p) {
   2114 ///   p->T::~T();
   2115 /// }
   2116 /// \endcode
   2117 ///
   2118 /// Pseudo-destructors typically occur when instantiating templates such as:
   2119 ///
   2120 /// \code
   2121 /// template<typename T>
   2122 /// void destroy(T* ptr) {
   2123 ///   ptr->T::~T();
   2124 /// }
   2125 /// \endcode
   2126 ///
   2127 /// for scalar types. A pseudo-destructor expression has no run-time semantics
   2128 /// beyond evaluating the base expression.
   2129 class CXXPseudoDestructorExpr : public Expr {
   2130   /// \brief The base expression (that is being destroyed).
   2131   Stmt *Base;
   2132 
   2133   /// \brief Whether the operator was an arrow ('->'); otherwise, it was a
   2134   /// period ('.').
   2135   bool IsArrow : 1;
   2136 
   2137   /// \brief The location of the '.' or '->' operator.
   2138   SourceLocation OperatorLoc;
   2139 
   2140   /// \brief The nested-name-specifier that follows the operator, if present.
   2141   NestedNameSpecifierLoc QualifierLoc;
   2142 
   2143   /// \brief The type that precedes the '::' in a qualified pseudo-destructor
   2144   /// expression.
   2145   TypeSourceInfo *ScopeType;
   2146 
   2147   /// \brief The location of the '::' in a qualified pseudo-destructor
   2148   /// expression.
   2149   SourceLocation ColonColonLoc;
   2150 
   2151   /// \brief The location of the '~'.
   2152   SourceLocation TildeLoc;
   2153 
   2154   /// \brief The type being destroyed, or its name if we were unable to
   2155   /// resolve the name.
   2156   PseudoDestructorTypeStorage DestroyedType;
   2157 
   2158   friend class ASTStmtReader;
   2159 
   2160 public:
   2161   CXXPseudoDestructorExpr(const ASTContext &Context,
   2162                           Expr *Base, bool isArrow, SourceLocation OperatorLoc,
   2163                           NestedNameSpecifierLoc QualifierLoc,
   2164                           TypeSourceInfo *ScopeType,
   2165                           SourceLocation ColonColonLoc,
   2166                           SourceLocation TildeLoc,
   2167                           PseudoDestructorTypeStorage DestroyedType);
   2168 
   2169   explicit CXXPseudoDestructorExpr(EmptyShell Shell)
   2170     : Expr(CXXPseudoDestructorExprClass, Shell),
   2171       Base(nullptr), IsArrow(false), QualifierLoc(), ScopeType(nullptr) { }
   2172 
   2173   Expr *getBase() const { return cast<Expr>(Base); }
   2174 
   2175   /// \brief Determines whether this member expression actually had
   2176   /// a C++ nested-name-specifier prior to the name of the member, e.g.,
   2177   /// x->Base::foo.
   2178   bool hasQualifier() const { return QualifierLoc.hasQualifier(); }
   2179 
   2180   /// \brief Retrieves the nested-name-specifier that qualifies the type name,
   2181   /// with source-location information.
   2182   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
   2183 
   2184   /// \brief If the member name was qualified, retrieves the
   2185   /// nested-name-specifier that precedes the member name. Otherwise, returns
   2186   /// null.
   2187   NestedNameSpecifier *getQualifier() const {
   2188     return QualifierLoc.getNestedNameSpecifier();
   2189   }
   2190 
   2191   /// \brief Determine whether this pseudo-destructor expression was written
   2192   /// using an '->' (otherwise, it used a '.').
   2193   bool isArrow() const { return IsArrow; }
   2194 
   2195   /// \brief Retrieve the location of the '.' or '->' operator.
   2196   SourceLocation getOperatorLoc() const { return OperatorLoc; }
   2197 
   2198   /// \brief Retrieve the scope type in a qualified pseudo-destructor
   2199   /// expression.
   2200   ///
   2201   /// Pseudo-destructor expressions can have extra qualification within them
   2202   /// that is not part of the nested-name-specifier, e.g., \c p->T::~T().
   2203   /// Here, if the object type of the expression is (or may be) a scalar type,
   2204   /// \p T may also be a scalar type and, therefore, cannot be part of a
   2205   /// nested-name-specifier. It is stored as the "scope type" of the pseudo-
   2206   /// destructor expression.
   2207   TypeSourceInfo *getScopeTypeInfo() const { return ScopeType; }
   2208 
   2209   /// \brief Retrieve the location of the '::' in a qualified pseudo-destructor
   2210   /// expression.
   2211   SourceLocation getColonColonLoc() const { return ColonColonLoc; }
   2212 
   2213   /// \brief Retrieve the location of the '~'.
   2214   SourceLocation getTildeLoc() const { return TildeLoc; }
   2215 
   2216   /// \brief Retrieve the source location information for the type
   2217   /// being destroyed.
   2218   ///
   2219   /// This type-source information is available for non-dependent
   2220   /// pseudo-destructor expressions and some dependent pseudo-destructor
   2221   /// expressions. Returns null if we only have the identifier for a
   2222   /// dependent pseudo-destructor expression.
   2223   TypeSourceInfo *getDestroyedTypeInfo() const {
   2224     return DestroyedType.getTypeSourceInfo();
   2225   }
   2226 
   2227   /// \brief In a dependent pseudo-destructor expression for which we do not
   2228   /// have full type information on the destroyed type, provides the name
   2229   /// of the destroyed type.
   2230   IdentifierInfo *getDestroyedTypeIdentifier() const {
   2231     return DestroyedType.getIdentifier();
   2232   }
   2233 
   2234   /// \brief Retrieve the type being destroyed.
   2235   QualType getDestroyedType() const;
   2236 
   2237   /// \brief Retrieve the starting location of the type being destroyed.
   2238   SourceLocation getDestroyedTypeLoc() const {
   2239     return DestroyedType.getLocation();
   2240   }
   2241 
   2242   /// \brief Set the name of destroyed type for a dependent pseudo-destructor
   2243   /// expression.
   2244   void setDestroyedType(IdentifierInfo *II, SourceLocation Loc) {
   2245     DestroyedType = PseudoDestructorTypeStorage(II, Loc);
   2246   }
   2247 
   2248   /// \brief Set the destroyed type.
   2249   void setDestroyedType(TypeSourceInfo *Info) {
   2250     DestroyedType = PseudoDestructorTypeStorage(Info);
   2251   }
   2252 
   2253   SourceLocation getLocStart() const LLVM_READONLY {return Base->getLocStart();}
   2254   SourceLocation getLocEnd() const LLVM_READONLY;
   2255 
   2256   static bool classof(const Stmt *T) {
   2257     return T->getStmtClass() == CXXPseudoDestructorExprClass;
   2258   }
   2259 
   2260   // Iterators
   2261   child_range children() { return child_range(&Base, &Base + 1); }
   2262 };
   2263 
   2264 /// \brief A type trait used in the implementation of various C++11 and
   2265 /// Library TR1 trait templates.
   2266 ///
   2267 /// \code
   2268 ///   __is_pod(int) == true
   2269 ///   __is_enum(std::string) == false
   2270 ///   __is_trivially_constructible(vector<int>, int*, int*)
   2271 /// \endcode
   2272 class TypeTraitExpr final
   2273     : public Expr,
   2274       private llvm::TrailingObjects<TypeTraitExpr, TypeSourceInfo *> {
   2275   /// \brief The location of the type trait keyword.
   2276   SourceLocation Loc;
   2277 
   2278   /// \brief  The location of the closing parenthesis.
   2279   SourceLocation RParenLoc;
   2280 
   2281   // Note: The TypeSourceInfos for the arguments are allocated after the
   2282   // TypeTraitExpr.
   2283 
   2284   TypeTraitExpr(QualType T, SourceLocation Loc, TypeTrait Kind,
   2285                 ArrayRef<TypeSourceInfo *> Args,
   2286                 SourceLocation RParenLoc,
   2287                 bool Value);
   2288 
   2289   TypeTraitExpr(EmptyShell Empty) : Expr(TypeTraitExprClass, Empty) { }
   2290 
   2291   size_t numTrailingObjects(OverloadToken<TypeSourceInfo *>) const {
   2292     return getNumArgs();
   2293   }
   2294 
   2295 public:
   2296   /// \brief Create a new type trait expression.
   2297   static TypeTraitExpr *Create(const ASTContext &C, QualType T,
   2298                                SourceLocation Loc, TypeTrait Kind,
   2299                                ArrayRef<TypeSourceInfo *> Args,
   2300                                SourceLocation RParenLoc,
   2301                                bool Value);
   2302 
   2303   static TypeTraitExpr *CreateDeserialized(const ASTContext &C,
   2304                                            unsigned NumArgs);
   2305 
   2306   /// \brief Determine which type trait this expression uses.
   2307   TypeTrait getTrait() const {
   2308     return static_cast<TypeTrait>(TypeTraitExprBits.Kind);
   2309   }
   2310 
   2311   bool getValue() const {
   2312     assert(!isValueDependent());
   2313     return TypeTraitExprBits.Value;
   2314   }
   2315 
   2316   /// \brief Determine the number of arguments to this type trait.
   2317   unsigned getNumArgs() const { return TypeTraitExprBits.NumArgs; }
   2318 
   2319   /// \brief Retrieve the Ith argument.
   2320   TypeSourceInfo *getArg(unsigned I) const {
   2321     assert(I < getNumArgs() && "Argument out-of-range");
   2322     return getArgs()[I];
   2323   }
   2324 
   2325   /// \brief Retrieve the argument types.
   2326   ArrayRef<TypeSourceInfo *> getArgs() const {
   2327     return llvm::makeArrayRef(getTrailingObjects<TypeSourceInfo *>(),
   2328                               getNumArgs());
   2329   }
   2330 
   2331   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
   2332   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
   2333 
   2334   static bool classof(const Stmt *T) {
   2335     return T->getStmtClass() == TypeTraitExprClass;
   2336   }
   2337 
   2338   // Iterators
   2339   child_range children() {
   2340     return child_range(child_iterator(), child_iterator());
   2341   }
   2342 
   2343   friend TrailingObjects;
   2344   friend class ASTStmtReader;
   2345   friend class ASTStmtWriter;
   2346 };
   2347 
   2348 /// \brief An Embarcadero array type trait, as used in the implementation of
   2349 /// __array_rank and __array_extent.
   2350 ///
   2351 /// Example:
   2352 /// \code
   2353 ///   __array_rank(int[10][20]) == 2
   2354 ///   __array_extent(int, 1)    == 20
   2355 /// \endcode
   2356 class ArrayTypeTraitExpr : public Expr {
   2357   virtual void anchor();
   2358 
   2359   /// \brief The trait. An ArrayTypeTrait enum in MSVC compat unsigned.
   2360   unsigned ATT : 2;
   2361 
   2362   /// \brief The value of the type trait. Unspecified if dependent.
   2363   uint64_t Value;
   2364 
   2365   /// \brief The array dimension being queried, or -1 if not used.
   2366   Expr *Dimension;
   2367 
   2368   /// \brief The location of the type trait keyword.
   2369   SourceLocation Loc;
   2370 
   2371   /// \brief The location of the closing paren.
   2372   SourceLocation RParen;
   2373 
   2374   /// \brief The type being queried.
   2375   TypeSourceInfo *QueriedType;
   2376 
   2377 public:
   2378   ArrayTypeTraitExpr(SourceLocation loc, ArrayTypeTrait att,
   2379                      TypeSourceInfo *queried, uint64_t value,
   2380                      Expr *dimension, SourceLocation rparen, QualType ty)
   2381     : Expr(ArrayTypeTraitExprClass, ty, VK_RValue, OK_Ordinary,
   2382            false, queried->getType()->isDependentType(),
   2383            (queried->getType()->isInstantiationDependentType() ||
   2384             (dimension && dimension->isInstantiationDependent())),
   2385            queried->getType()->containsUnexpandedParameterPack()),
   2386       ATT(att), Value(value), Dimension(dimension),
   2387       Loc(loc), RParen(rparen), QueriedType(queried) { }
   2388 
   2389 
   2390   explicit ArrayTypeTraitExpr(EmptyShell Empty)
   2391     : Expr(ArrayTypeTraitExprClass, Empty), ATT(0), Value(false),
   2392       QueriedType() { }
   2393 
   2394   virtual ~ArrayTypeTraitExpr() { }
   2395 
   2396   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
   2397   SourceLocation getLocEnd() const LLVM_READONLY { return RParen; }
   2398 
   2399   ArrayTypeTrait getTrait() const { return static_cast<ArrayTypeTrait>(ATT); }
   2400 
   2401   QualType getQueriedType() const { return QueriedType->getType(); }
   2402 
   2403   TypeSourceInfo *getQueriedTypeSourceInfo() const { return QueriedType; }
   2404 
   2405   uint64_t getValue() const { assert(!isTypeDependent()); return Value; }
   2406 
   2407   Expr *getDimensionExpression() const { return Dimension; }
   2408 
   2409   static bool classof(const Stmt *T) {
   2410     return T->getStmtClass() == ArrayTypeTraitExprClass;
   2411   }
   2412 
   2413   // Iterators
   2414   child_range children() {
   2415     return child_range(child_iterator(), child_iterator());
   2416   }
   2417 
   2418   friend class ASTStmtReader;
   2419 };
   2420 
   2421 /// \brief An expression trait intrinsic.
   2422 ///
   2423 /// Example:
   2424 /// \code
   2425 ///   __is_lvalue_expr(std::cout) == true
   2426 ///   __is_lvalue_expr(1) == false
   2427 /// \endcode
   2428 class ExpressionTraitExpr : public Expr {
   2429   /// \brief The trait. A ExpressionTrait enum in MSVC compatible unsigned.
   2430   unsigned ET : 31;
   2431   /// \brief The value of the type trait. Unspecified if dependent.
   2432   unsigned Value : 1;
   2433 
   2434   /// \brief The location of the type trait keyword.
   2435   SourceLocation Loc;
   2436 
   2437   /// \brief The location of the closing paren.
   2438   SourceLocation RParen;
   2439 
   2440   /// \brief The expression being queried.
   2441   Expr* QueriedExpression;
   2442 public:
   2443   ExpressionTraitExpr(SourceLocation loc, ExpressionTrait et,
   2444                      Expr *queried, bool value,
   2445                      SourceLocation rparen, QualType resultType)
   2446     : Expr(ExpressionTraitExprClass, resultType, VK_RValue, OK_Ordinary,
   2447            false, // Not type-dependent
   2448            // Value-dependent if the argument is type-dependent.
   2449            queried->isTypeDependent(),
   2450            queried->isInstantiationDependent(),
   2451            queried->containsUnexpandedParameterPack()),
   2452       ET(et), Value(value), Loc(loc), RParen(rparen),
   2453       QueriedExpression(queried) { }
   2454 
   2455   explicit ExpressionTraitExpr(EmptyShell Empty)
   2456     : Expr(ExpressionTraitExprClass, Empty), ET(0), Value(false),
   2457       QueriedExpression() { }
   2458 
   2459   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
   2460   SourceLocation getLocEnd() const LLVM_READONLY { return RParen; }
   2461 
   2462   ExpressionTrait getTrait() const { return static_cast<ExpressionTrait>(ET); }
   2463 
   2464   Expr *getQueriedExpression() const { return QueriedExpression; }
   2465 
   2466   bool getValue() const { return Value; }
   2467 
   2468   static bool classof(const Stmt *T) {
   2469     return T->getStmtClass() == ExpressionTraitExprClass;
   2470   }
   2471 
   2472   // Iterators
   2473   child_range children() {
   2474     return child_range(child_iterator(), child_iterator());
   2475   }
   2476 
   2477   friend class ASTStmtReader;
   2478 };
   2479 
   2480 
   2481 /// \brief A reference to an overloaded function set, either an
   2482 /// \c UnresolvedLookupExpr or an \c UnresolvedMemberExpr.
   2483 class OverloadExpr : public Expr {
   2484   /// \brief The common name of these declarations.
   2485   DeclarationNameInfo NameInfo;
   2486 
   2487   /// \brief The nested-name-specifier that qualifies the name, if any.
   2488   NestedNameSpecifierLoc QualifierLoc;
   2489 
   2490   /// The results.  These are undesugared, which is to say, they may
   2491   /// include UsingShadowDecls.  Access is relative to the naming
   2492   /// class.
   2493   // FIXME: Allocate this data after the OverloadExpr subclass.
   2494   DeclAccessPair *Results;
   2495   unsigned NumResults;
   2496 
   2497 protected:
   2498   /// \brief Whether the name includes info for explicit template
   2499   /// keyword and arguments.
   2500   bool HasTemplateKWAndArgsInfo;
   2501 
   2502   /// \brief Return the optional template keyword and arguments info.
   2503   ASTTemplateKWAndArgsInfo *
   2504   getTrailingASTTemplateKWAndArgsInfo(); // defined far below.
   2505 
   2506   /// \brief Return the optional template keyword and arguments info.
   2507   const ASTTemplateKWAndArgsInfo *getTrailingASTTemplateKWAndArgsInfo() const {
   2508     return const_cast<OverloadExpr *>(this)
   2509         ->getTrailingASTTemplateKWAndArgsInfo();
   2510   }
   2511 
   2512   /// Return the optional template arguments.
   2513   TemplateArgumentLoc *getTrailingTemplateArgumentLoc(); // defined far below
   2514 
   2515   OverloadExpr(StmtClass K, const ASTContext &C,
   2516                NestedNameSpecifierLoc QualifierLoc,
   2517                SourceLocation TemplateKWLoc,
   2518                const DeclarationNameInfo &NameInfo,
   2519                const TemplateArgumentListInfo *TemplateArgs,
   2520                UnresolvedSetIterator Begin, UnresolvedSetIterator End,
   2521                bool KnownDependent,
   2522                bool KnownInstantiationDependent,
   2523                bool KnownContainsUnexpandedParameterPack);
   2524 
   2525   OverloadExpr(StmtClass K, EmptyShell Empty)
   2526     : Expr(K, Empty), QualifierLoc(), Results(nullptr), NumResults(0),
   2527       HasTemplateKWAndArgsInfo(false) { }
   2528 
   2529   void initializeResults(const ASTContext &C,
   2530                          UnresolvedSetIterator Begin,
   2531                          UnresolvedSetIterator End);
   2532 
   2533 public:
   2534   struct FindResult {
   2535     OverloadExpr *Expression;
   2536     bool IsAddressOfOperand;
   2537     bool HasFormOfMemberPointer;
   2538   };
   2539 
   2540   /// \brief Finds the overloaded expression in the given expression \p E of
   2541   /// OverloadTy.
   2542   ///
   2543   /// \return the expression (which must be there) and true if it has
   2544   /// the particular form of a member pointer expression
   2545   static FindResult find(Expr *E) {
   2546     assert(E->getType()->isSpecificBuiltinType(BuiltinType::Overload));
   2547 
   2548     FindResult Result;
   2549 
   2550     E = E->IgnoreParens();
   2551     if (isa<UnaryOperator>(E)) {
   2552       assert(cast<UnaryOperator>(E)->getOpcode() == UO_AddrOf);
   2553       E = cast<UnaryOperator>(E)->getSubExpr();
   2554       OverloadExpr *Ovl = cast<OverloadExpr>(E->IgnoreParens());
   2555 
   2556       Result.HasFormOfMemberPointer = (E == Ovl && Ovl->getQualifier());
   2557       Result.IsAddressOfOperand = true;
   2558       Result.Expression = Ovl;
   2559     } else {
   2560       Result.HasFormOfMemberPointer = false;
   2561       Result.IsAddressOfOperand = false;
   2562       Result.Expression = cast<OverloadExpr>(E);
   2563     }
   2564 
   2565     return Result;
   2566   }
   2567 
   2568   /// \brief Gets the naming class of this lookup, if any.
   2569   CXXRecordDecl *getNamingClass() const;
   2570 
   2571   typedef UnresolvedSetImpl::iterator decls_iterator;
   2572   decls_iterator decls_begin() const { return UnresolvedSetIterator(Results); }
   2573   decls_iterator decls_end() const {
   2574     return UnresolvedSetIterator(Results + NumResults);
   2575   }
   2576   llvm::iterator_range<decls_iterator> decls() const {
   2577     return llvm::make_range(decls_begin(), decls_end());
   2578   }
   2579 
   2580   /// \brief Gets the number of declarations in the unresolved set.
   2581   unsigned getNumDecls() const { return NumResults; }
   2582 
   2583   /// \brief Gets the full name info.
   2584   const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
   2585 
   2586   /// \brief Gets the name looked up.
   2587   DeclarationName getName() const { return NameInfo.getName(); }
   2588 
   2589   /// \brief Gets the location of the name.
   2590   SourceLocation getNameLoc() const { return NameInfo.getLoc(); }
   2591 
   2592   /// \brief Fetches the nested-name qualifier, if one was given.
   2593   NestedNameSpecifier *getQualifier() const {
   2594     return QualifierLoc.getNestedNameSpecifier();
   2595   }
   2596 
   2597   /// \brief Fetches the nested-name qualifier with source-location
   2598   /// information, if one was given.
   2599   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
   2600 
   2601   /// \brief Retrieve the location of the template keyword preceding
   2602   /// this name, if any.
   2603   SourceLocation getTemplateKeywordLoc() const {
   2604     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
   2605     return getTrailingASTTemplateKWAndArgsInfo()->TemplateKWLoc;
   2606   }
   2607 
   2608   /// \brief Retrieve the location of the left angle bracket starting the
   2609   /// explicit template argument list following the name, if any.
   2610   SourceLocation getLAngleLoc() const {
   2611     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
   2612     return getTrailingASTTemplateKWAndArgsInfo()->LAngleLoc;
   2613   }
   2614 
   2615   /// \brief Retrieve the location of the right angle bracket ending the
   2616   /// explicit template argument list following the name, if any.
   2617   SourceLocation getRAngleLoc() const {
   2618     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
   2619     return getTrailingASTTemplateKWAndArgsInfo()->RAngleLoc;
   2620   }
   2621 
   2622   /// \brief Determines whether the name was preceded by the template keyword.
   2623   bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
   2624 
   2625   /// \brief Determines whether this expression had explicit template arguments.
   2626   bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
   2627 
   2628   TemplateArgumentLoc const *getTemplateArgs() const {
   2629     if (!hasExplicitTemplateArgs())
   2630       return nullptr;
   2631     return const_cast<OverloadExpr *>(this)->getTrailingTemplateArgumentLoc();
   2632   }
   2633 
   2634   unsigned getNumTemplateArgs() const {
   2635     if (!hasExplicitTemplateArgs())
   2636       return 0;
   2637 
   2638     return getTrailingASTTemplateKWAndArgsInfo()->NumTemplateArgs;
   2639   }
   2640 
   2641   ArrayRef<TemplateArgumentLoc> template_arguments() const {
   2642     return {getTemplateArgs(), getNumTemplateArgs()};
   2643   }
   2644 
   2645   /// \brief Copies the template arguments into the given structure.
   2646   void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
   2647     if (hasExplicitTemplateArgs())
   2648       getTrailingASTTemplateKWAndArgsInfo()->copyInto(getTemplateArgs(), List);
   2649   }
   2650 
   2651   static bool classof(const Stmt *T) {
   2652     return T->getStmtClass() == UnresolvedLookupExprClass ||
   2653            T->getStmtClass() == UnresolvedMemberExprClass;
   2654   }
   2655 
   2656   friend class ASTStmtReader;
   2657   friend class ASTStmtWriter;
   2658 };
   2659 
   2660 /// \brief A reference to a name which we were able to look up during
   2661 /// parsing but could not resolve to a specific declaration.
   2662 ///
   2663 /// This arises in several ways:
   2664 ///   * we might be waiting for argument-dependent lookup;
   2665 ///   * the name might resolve to an overloaded function;
   2666 /// and eventually:
   2667 ///   * the lookup might have included a function template.
   2668 ///
   2669 /// These never include UnresolvedUsingValueDecls, which are always class
   2670 /// members and therefore appear only in UnresolvedMemberLookupExprs.
   2671 class UnresolvedLookupExpr final
   2672     : public OverloadExpr,
   2673       private llvm::TrailingObjects<
   2674           UnresolvedLookupExpr, ASTTemplateKWAndArgsInfo, TemplateArgumentLoc> {
   2675   /// True if these lookup results should be extended by
   2676   /// argument-dependent lookup if this is the operand of a function
   2677   /// call.
   2678   bool RequiresADL;
   2679 
   2680   /// True if these lookup results are overloaded.  This is pretty
   2681   /// trivially rederivable if we urgently need to kill this field.
   2682   bool Overloaded;
   2683 
   2684   /// The naming class (C++ [class.access.base]p5) of the lookup, if
   2685   /// any.  This can generally be recalculated from the context chain,
   2686   /// but that can be fairly expensive for unqualified lookups.  If we
   2687   /// want to improve memory use here, this could go in a union
   2688   /// against the qualified-lookup bits.
   2689   CXXRecordDecl *NamingClass;
   2690 
   2691   size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
   2692     return HasTemplateKWAndArgsInfo ? 1 : 0;
   2693   }
   2694 
   2695   UnresolvedLookupExpr(const ASTContext &C,
   2696                        CXXRecordDecl *NamingClass,
   2697                        NestedNameSpecifierLoc QualifierLoc,
   2698                        SourceLocation TemplateKWLoc,
   2699                        const DeclarationNameInfo &NameInfo,
   2700                        bool RequiresADL, bool Overloaded,
   2701                        const TemplateArgumentListInfo *TemplateArgs,
   2702                        UnresolvedSetIterator Begin, UnresolvedSetIterator End)
   2703     : OverloadExpr(UnresolvedLookupExprClass, C, QualifierLoc, TemplateKWLoc,
   2704                    NameInfo, TemplateArgs, Begin, End, false, false, false),
   2705       RequiresADL(RequiresADL),
   2706       Overloaded(Overloaded), NamingClass(NamingClass)
   2707   {}
   2708 
   2709   UnresolvedLookupExpr(EmptyShell Empty)
   2710     : OverloadExpr(UnresolvedLookupExprClass, Empty),
   2711       RequiresADL(false), Overloaded(false), NamingClass(nullptr)
   2712   {}
   2713 
   2714   friend TrailingObjects;
   2715   friend class OverloadExpr;
   2716   friend class ASTStmtReader;
   2717 
   2718 public:
   2719   static UnresolvedLookupExpr *Create(const ASTContext &C,
   2720                                       CXXRecordDecl *NamingClass,
   2721                                       NestedNameSpecifierLoc QualifierLoc,
   2722                                       const DeclarationNameInfo &NameInfo,
   2723                                       bool ADL, bool Overloaded,
   2724                                       UnresolvedSetIterator Begin,
   2725                                       UnresolvedSetIterator End) {
   2726     return new(C) UnresolvedLookupExpr(C, NamingClass, QualifierLoc,
   2727                                        SourceLocation(), NameInfo,
   2728                                        ADL, Overloaded, nullptr, Begin, End);
   2729   }
   2730 
   2731   static UnresolvedLookupExpr *Create(const ASTContext &C,
   2732                                       CXXRecordDecl *NamingClass,
   2733                                       NestedNameSpecifierLoc QualifierLoc,
   2734                                       SourceLocation TemplateKWLoc,
   2735                                       const DeclarationNameInfo &NameInfo,
   2736                                       bool ADL,
   2737                                       const TemplateArgumentListInfo *Args,
   2738                                       UnresolvedSetIterator Begin,
   2739                                       UnresolvedSetIterator End);
   2740 
   2741   static UnresolvedLookupExpr *CreateEmpty(const ASTContext &C,
   2742                                            bool HasTemplateKWAndArgsInfo,
   2743                                            unsigned NumTemplateArgs);
   2744 
   2745   /// True if this declaration should be extended by
   2746   /// argument-dependent lookup.
   2747   bool requiresADL() const { return RequiresADL; }
   2748 
   2749   /// True if this lookup is overloaded.
   2750   bool isOverloaded() const { return Overloaded; }
   2751 
   2752   /// Gets the 'naming class' (in the sense of C++0x
   2753   /// [class.access.base]p5) of the lookup.  This is the scope
   2754   /// that was looked in to find these results.
   2755   CXXRecordDecl *getNamingClass() const { return NamingClass; }
   2756 
   2757   SourceLocation getLocStart() const LLVM_READONLY {
   2758     if (NestedNameSpecifierLoc l = getQualifierLoc())
   2759       return l.getBeginLoc();
   2760     return getNameInfo().getLocStart();
   2761   }
   2762   SourceLocation getLocEnd() const LLVM_READONLY {
   2763     if (hasExplicitTemplateArgs())
   2764       return getRAngleLoc();
   2765     return getNameInfo().getLocEnd();
   2766   }
   2767 
   2768   child_range children() {
   2769     return child_range(child_iterator(), child_iterator());
   2770   }
   2771 
   2772   static bool classof(const Stmt *T) {
   2773     return T->getStmtClass() == UnresolvedLookupExprClass;
   2774   }
   2775 };
   2776 
   2777 /// \brief A qualified reference to a name whose declaration cannot
   2778 /// yet be resolved.
   2779 ///
   2780 /// DependentScopeDeclRefExpr is similar to DeclRefExpr in that
   2781 /// it expresses a reference to a declaration such as
   2782 /// X<T>::value. The difference, however, is that an
   2783 /// DependentScopeDeclRefExpr node is used only within C++ templates when
   2784 /// the qualification (e.g., X<T>::) refers to a dependent type. In
   2785 /// this case, X<T>::value cannot resolve to a declaration because the
   2786 /// declaration will differ from one instantiation of X<T> to the
   2787 /// next. Therefore, DependentScopeDeclRefExpr keeps track of the
   2788 /// qualifier (X<T>::) and the name of the entity being referenced
   2789 /// ("value"). Such expressions will instantiate to a DeclRefExpr once the
   2790 /// declaration can be found.
   2791 class DependentScopeDeclRefExpr final
   2792     : public Expr,
   2793       private llvm::TrailingObjects<DependentScopeDeclRefExpr,
   2794                                     ASTTemplateKWAndArgsInfo,
   2795                                     TemplateArgumentLoc> {
   2796   /// \brief The nested-name-specifier that qualifies this unresolved
   2797   /// declaration name.
   2798   NestedNameSpecifierLoc QualifierLoc;
   2799 
   2800   /// \brief The name of the entity we will be referencing.
   2801   DeclarationNameInfo NameInfo;
   2802 
   2803   /// \brief Whether the name includes info for explicit template
   2804   /// keyword and arguments.
   2805   bool HasTemplateKWAndArgsInfo;
   2806 
   2807   size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
   2808     return HasTemplateKWAndArgsInfo ? 1 : 0;
   2809   }
   2810 
   2811   DependentScopeDeclRefExpr(QualType T,
   2812                             NestedNameSpecifierLoc QualifierLoc,
   2813                             SourceLocation TemplateKWLoc,
   2814                             const DeclarationNameInfo &NameInfo,
   2815                             const TemplateArgumentListInfo *Args);
   2816 
   2817 public:
   2818   static DependentScopeDeclRefExpr *Create(const ASTContext &C,
   2819                                            NestedNameSpecifierLoc QualifierLoc,
   2820                                            SourceLocation TemplateKWLoc,
   2821                                            const DeclarationNameInfo &NameInfo,
   2822                               const TemplateArgumentListInfo *TemplateArgs);
   2823 
   2824   static DependentScopeDeclRefExpr *CreateEmpty(const ASTContext &C,
   2825                                                 bool HasTemplateKWAndArgsInfo,
   2826                                                 unsigned NumTemplateArgs);
   2827 
   2828   /// \brief Retrieve the name that this expression refers to.
   2829   const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
   2830 
   2831   /// \brief Retrieve the name that this expression refers to.
   2832   DeclarationName getDeclName() const { return NameInfo.getName(); }
   2833 
   2834   /// \brief Retrieve the location of the name within the expression.
   2835   ///
   2836   /// For example, in "X<T>::value" this is the location of "value".
   2837   SourceLocation getLocation() const { return NameInfo.getLoc(); }
   2838 
   2839   /// \brief Retrieve the nested-name-specifier that qualifies the
   2840   /// name, with source location information.
   2841   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
   2842 
   2843   /// \brief Retrieve the nested-name-specifier that qualifies this
   2844   /// declaration.
   2845   NestedNameSpecifier *getQualifier() const {
   2846     return QualifierLoc.getNestedNameSpecifier();
   2847   }
   2848 
   2849   /// \brief Retrieve the location of the template keyword preceding
   2850   /// this name, if any.
   2851   SourceLocation getTemplateKeywordLoc() const {
   2852     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
   2853     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc;
   2854   }
   2855 
   2856   /// \brief Retrieve the location of the left angle bracket starting the
   2857   /// explicit template argument list following the name, if any.
   2858   SourceLocation getLAngleLoc() const {
   2859     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
   2860     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc;
   2861   }
   2862 
   2863   /// \brief Retrieve the location of the right angle bracket ending the
   2864   /// explicit template argument list following the name, if any.
   2865   SourceLocation getRAngleLoc() const {
   2866     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
   2867     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc;
   2868   }
   2869 
   2870   /// Determines whether the name was preceded by the template keyword.
   2871   bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
   2872 
   2873   /// Determines whether this lookup had explicit template arguments.
   2874   bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
   2875 
   2876   /// \brief Copies the template arguments (if present) into the given
   2877   /// structure.
   2878   void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
   2879     if (hasExplicitTemplateArgs())
   2880       getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto(
   2881           getTrailingObjects<TemplateArgumentLoc>(), List);
   2882   }
   2883 
   2884   TemplateArgumentLoc const *getTemplateArgs() const {
   2885     if (!hasExplicitTemplateArgs())
   2886       return nullptr;
   2887 
   2888     return getTrailingObjects<TemplateArgumentLoc>();
   2889   }
   2890 
   2891   unsigned getNumTemplateArgs() const {
   2892     if (!hasExplicitTemplateArgs())
   2893       return 0;
   2894 
   2895     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
   2896   }
   2897 
   2898   ArrayRef<TemplateArgumentLoc> template_arguments() const {
   2899     return {getTemplateArgs(), getNumTemplateArgs()};
   2900   }
   2901 
   2902   /// Note: getLocStart() is the start of the whole DependentScopeDeclRefExpr,
   2903   /// and differs from getLocation().getStart().
   2904   SourceLocation getLocStart() const LLVM_READONLY {
   2905     return QualifierLoc.getBeginLoc();
   2906   }
   2907   SourceLocation getLocEnd() const LLVM_READONLY {
   2908     if (hasExplicitTemplateArgs())
   2909       return getRAngleLoc();
   2910     return getLocation();
   2911   }
   2912 
   2913   static bool classof(const Stmt *T) {
   2914     return T->getStmtClass() == DependentScopeDeclRefExprClass;
   2915   }
   2916 
   2917   child_range children() {
   2918     return child_range(child_iterator(), child_iterator());
   2919   }
   2920 
   2921   friend TrailingObjects;
   2922   friend class ASTStmtReader;
   2923   friend class ASTStmtWriter;
   2924 };
   2925 
   2926 /// Represents an expression -- generally a full-expression -- that
   2927 /// introduces cleanups to be run at the end of the sub-expression's
   2928 /// evaluation.  The most common source of expression-introduced
   2929 /// cleanups is temporary objects in C++, but several other kinds of
   2930 /// expressions can create cleanups, including basically every
   2931 /// call in ARC that returns an Objective-C pointer.
   2932 ///
   2933 /// This expression also tracks whether the sub-expression contains a
   2934 /// potentially-evaluated block literal.  The lifetime of a block
   2935 /// literal is the extent of the enclosing scope.
   2936 class ExprWithCleanups final
   2937     : public Expr,
   2938       private llvm::TrailingObjects<ExprWithCleanups, BlockDecl *> {
   2939 public:
   2940   /// The type of objects that are kept in the cleanup.
   2941   /// It's useful to remember the set of blocks;  we could also
   2942   /// remember the set of temporaries, but there's currently
   2943   /// no need.
   2944   typedef BlockDecl *CleanupObject;
   2945 
   2946 private:
   2947   Stmt *SubExpr;
   2948 
   2949   ExprWithCleanups(EmptyShell, unsigned NumObjects);
   2950   ExprWithCleanups(Expr *SubExpr, bool CleanupsHaveSideEffects,
   2951                    ArrayRef<CleanupObject> Objects);
   2952 
   2953   friend TrailingObjects;
   2954   friend class ASTStmtReader;
   2955 
   2956 public:
   2957   static ExprWithCleanups *Create(const ASTContext &C, EmptyShell empty,
   2958                                   unsigned numObjects);
   2959 
   2960   static ExprWithCleanups *Create(const ASTContext &C, Expr *subexpr,
   2961                                   bool CleanupsHaveSideEffects,
   2962                                   ArrayRef<CleanupObject> objects);
   2963 
   2964   ArrayRef<CleanupObject> getObjects() const {
   2965     return llvm::makeArrayRef(getTrailingObjects<CleanupObject>(),
   2966                               getNumObjects());
   2967   }
   2968 
   2969   unsigned getNumObjects() const { return ExprWithCleanupsBits.NumObjects; }
   2970 
   2971   CleanupObject getObject(unsigned i) const {
   2972     assert(i < getNumObjects() && "Index out of range");
   2973     return getObjects()[i];
   2974   }
   2975 
   2976   Expr *getSubExpr() { return cast<Expr>(SubExpr); }
   2977   const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
   2978   bool cleanupsHaveSideEffects() const {
   2979     return ExprWithCleanupsBits.CleanupsHaveSideEffects;
   2980   }
   2981 
   2982   /// As with any mutator of the AST, be very careful
   2983   /// when modifying an existing AST to preserve its invariants.
   2984   void setSubExpr(Expr *E) { SubExpr = E; }
   2985 
   2986   SourceLocation getLocStart() const LLVM_READONLY {
   2987     return SubExpr->getLocStart();
   2988   }
   2989   SourceLocation getLocEnd() const LLVM_READONLY { return SubExpr->getLocEnd();}
   2990 
   2991   // Implement isa/cast/dyncast/etc.
   2992   static bool classof(const Stmt *T) {
   2993     return T->getStmtClass() == ExprWithCleanupsClass;
   2994   }
   2995 
   2996   // Iterators
   2997   child_range children() { return child_range(&SubExpr, &SubExpr + 1); }
   2998 };
   2999 
   3000 /// \brief Describes an explicit type conversion that uses functional
   3001 /// notion but could not be resolved because one or more arguments are
   3002 /// type-dependent.
   3003 ///
   3004 /// The explicit type conversions expressed by
   3005 /// CXXUnresolvedConstructExpr have the form <tt>T(a1, a2, ..., aN)</tt>,
   3006 /// where \c T is some type and \c a1, \c a2, ..., \c aN are values, and
   3007 /// either \c T is a dependent type or one or more of the <tt>a</tt>'s is
   3008 /// type-dependent. For example, this would occur in a template such
   3009 /// as:
   3010 ///
   3011 /// \code
   3012 ///   template<typename T, typename A1>
   3013 ///   inline T make_a(const A1& a1) {
   3014 ///     return T(a1);
   3015 ///   }
   3016 /// \endcode
   3017 ///
   3018 /// When the returned expression is instantiated, it may resolve to a
   3019 /// constructor call, conversion function call, or some kind of type
   3020 /// conversion.
   3021 class CXXUnresolvedConstructExpr final
   3022     : public Expr,
   3023       private llvm::TrailingObjects<CXXUnresolvedConstructExpr, Expr *> {
   3024   /// \brief The type being constructed.
   3025   TypeSourceInfo *Type;
   3026 
   3027   /// \brief The location of the left parentheses ('(').
   3028   SourceLocation LParenLoc;
   3029 
   3030   /// \brief The location of the right parentheses (')').
   3031   SourceLocation RParenLoc;
   3032 
   3033   /// \brief The number of arguments used to construct the type.
   3034   unsigned NumArgs;
   3035 
   3036   CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
   3037                              SourceLocation LParenLoc,
   3038                              ArrayRef<Expr*> Args,
   3039                              SourceLocation RParenLoc);
   3040 
   3041   CXXUnresolvedConstructExpr(EmptyShell Empty, unsigned NumArgs)
   3042     : Expr(CXXUnresolvedConstructExprClass, Empty), Type(), NumArgs(NumArgs) { }
   3043 
   3044   friend TrailingObjects;
   3045   friend class ASTStmtReader;
   3046 
   3047 public:
   3048   static CXXUnresolvedConstructExpr *Create(const ASTContext &C,
   3049                                             TypeSourceInfo *Type,
   3050                                             SourceLocation LParenLoc,
   3051                                             ArrayRef<Expr*> Args,
   3052                                             SourceLocation RParenLoc);
   3053 
   3054   static CXXUnresolvedConstructExpr *CreateEmpty(const ASTContext &C,
   3055                                                  unsigned NumArgs);
   3056 
   3057   /// \brief Retrieve the type that is being constructed, as specified
   3058   /// in the source code.
   3059   QualType getTypeAsWritten() const { return Type->getType(); }
   3060 
   3061   /// \brief Retrieve the type source information for the type being
   3062   /// constructed.
   3063   TypeSourceInfo *getTypeSourceInfo() const { return Type; }
   3064 
   3065   /// \brief Retrieve the location of the left parentheses ('(') that
   3066   /// precedes the argument list.
   3067   SourceLocation getLParenLoc() const { return LParenLoc; }
   3068   void setLParenLoc(SourceLocation L) { LParenLoc = L; }
   3069 
   3070   /// \brief Retrieve the location of the right parentheses (')') that
   3071   /// follows the argument list.
   3072   SourceLocation getRParenLoc() const { return RParenLoc; }
   3073   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
   3074 
   3075   /// \brief Retrieve the number of arguments.
   3076   unsigned arg_size() const { return NumArgs; }
   3077 
   3078   typedef Expr** arg_iterator;
   3079   arg_iterator arg_begin() { return getTrailingObjects<Expr *>(); }
   3080   arg_iterator arg_end() { return arg_begin() + NumArgs; }
   3081 
   3082   typedef const Expr* const * const_arg_iterator;
   3083   const_arg_iterator arg_begin() const { return getTrailingObjects<Expr *>(); }
   3084   const_arg_iterator arg_end() const {
   3085     return arg_begin() + NumArgs;
   3086   }
   3087 
   3088   Expr *getArg(unsigned I) {
   3089     assert(I < NumArgs && "Argument index out-of-range");
   3090     return *(arg_begin() + I);
   3091   }
   3092 
   3093   const Expr *getArg(unsigned I) const {
   3094     assert(I < NumArgs && "Argument index out-of-range");
   3095     return *(arg_begin() + I);
   3096   }
   3097 
   3098   void setArg(unsigned I, Expr *E) {
   3099     assert(I < NumArgs && "Argument index out-of-range");
   3100     *(arg_begin() + I) = E;
   3101   }
   3102 
   3103   SourceLocation getLocStart() const LLVM_READONLY;
   3104   SourceLocation getLocEnd() const LLVM_READONLY {
   3105     if (!RParenLoc.isValid() && NumArgs > 0)
   3106       return getArg(NumArgs - 1)->getLocEnd();
   3107     return RParenLoc;
   3108   }
   3109 
   3110   static bool classof(const Stmt *T) {
   3111     return T->getStmtClass() == CXXUnresolvedConstructExprClass;
   3112   }
   3113 
   3114   // Iterators
   3115   child_range children() {
   3116     Stmt **begin = reinterpret_cast<Stmt **>(arg_begin());
   3117     return child_range(begin, begin + NumArgs);
   3118   }
   3119 };
   3120 
   3121 /// \brief Represents a C++ member access expression where the actual
   3122 /// member referenced could not be resolved because the base
   3123 /// expression or the member name was dependent.
   3124 ///
   3125 /// Like UnresolvedMemberExprs, these can be either implicit or
   3126 /// explicit accesses.  It is only possible to get one of these with
   3127 /// an implicit access if a qualifier is provided.
   3128 class CXXDependentScopeMemberExpr final
   3129     : public Expr,
   3130       private llvm::TrailingObjects<CXXDependentScopeMemberExpr,
   3131                                     ASTTemplateKWAndArgsInfo,
   3132                                     TemplateArgumentLoc> {
   3133   /// \brief The expression for the base pointer or class reference,
   3134   /// e.g., the \c x in x.f.  Can be null in implicit accesses.
   3135   Stmt *Base;
   3136 
   3137   /// \brief The type of the base expression.  Never null, even for
   3138   /// implicit accesses.
   3139   QualType BaseType;
   3140 
   3141   /// \brief Whether this member expression used the '->' operator or
   3142   /// the '.' operator.
   3143   bool IsArrow : 1;
   3144 
   3145   /// \brief Whether this member expression has info for explicit template
   3146   /// keyword and arguments.
   3147   bool HasTemplateKWAndArgsInfo : 1;
   3148 
   3149   /// \brief The location of the '->' or '.' operator.
   3150   SourceLocation OperatorLoc;
   3151 
   3152   /// \brief The nested-name-specifier that precedes the member name, if any.
   3153   NestedNameSpecifierLoc QualifierLoc;
   3154 
   3155   /// \brief In a qualified member access expression such as t->Base::f, this
   3156   /// member stores the resolves of name lookup in the context of the member
   3157   /// access expression, to be used at instantiation time.
   3158   ///
   3159   /// FIXME: This member, along with the QualifierLoc, could
   3160   /// be stuck into a structure that is optionally allocated at the end of
   3161   /// the CXXDependentScopeMemberExpr, to save space in the common case.
   3162   NamedDecl *FirstQualifierFoundInScope;
   3163 
   3164   /// \brief The member to which this member expression refers, which
   3165   /// can be name, overloaded operator, or destructor.
   3166   ///
   3167   /// FIXME: could also be a template-id
   3168   DeclarationNameInfo MemberNameInfo;
   3169 
   3170   size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
   3171     return HasTemplateKWAndArgsInfo ? 1 : 0;
   3172   }
   3173 
   3174   CXXDependentScopeMemberExpr(const ASTContext &C, Expr *Base,
   3175                               QualType BaseType, bool IsArrow,
   3176                               SourceLocation OperatorLoc,
   3177                               NestedNameSpecifierLoc QualifierLoc,
   3178                               SourceLocation TemplateKWLoc,
   3179                               NamedDecl *FirstQualifierFoundInScope,
   3180                               DeclarationNameInfo MemberNameInfo,
   3181                               const TemplateArgumentListInfo *TemplateArgs);
   3182 
   3183 public:
   3184   CXXDependentScopeMemberExpr(const ASTContext &C, Expr *Base,
   3185                               QualType BaseType, bool IsArrow,
   3186                               SourceLocation OperatorLoc,
   3187                               NestedNameSpecifierLoc QualifierLoc,
   3188                               NamedDecl *FirstQualifierFoundInScope,
   3189                               DeclarationNameInfo MemberNameInfo);
   3190 
   3191   static CXXDependentScopeMemberExpr *
   3192   Create(const ASTContext &C, Expr *Base, QualType BaseType, bool IsArrow,
   3193          SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc,
   3194          SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope,
   3195          DeclarationNameInfo MemberNameInfo,
   3196          const TemplateArgumentListInfo *TemplateArgs);
   3197 
   3198   static CXXDependentScopeMemberExpr *
   3199   CreateEmpty(const ASTContext &C, bool HasTemplateKWAndArgsInfo,
   3200               unsigned NumTemplateArgs);
   3201 
   3202   /// \brief True if this is an implicit access, i.e. one in which the
   3203   /// member being accessed was not written in the source.  The source
   3204   /// location of the operator is invalid in this case.
   3205   bool isImplicitAccess() const;
   3206 
   3207   /// \brief Retrieve the base object of this member expressions,
   3208   /// e.g., the \c x in \c x.m.
   3209   Expr *getBase() const {
   3210     assert(!isImplicitAccess());
   3211     return cast<Expr>(Base);
   3212   }
   3213 
   3214   QualType getBaseType() const { return BaseType; }
   3215 
   3216   /// \brief Determine whether this member expression used the '->'
   3217   /// operator; otherwise, it used the '.' operator.
   3218   bool isArrow() const { return IsArrow; }
   3219 
   3220   /// \brief Retrieve the location of the '->' or '.' operator.
   3221   SourceLocation getOperatorLoc() const { return OperatorLoc; }
   3222 
   3223   /// \brief Retrieve the nested-name-specifier that qualifies the member
   3224   /// name.
   3225   NestedNameSpecifier *getQualifier() const {
   3226     return QualifierLoc.getNestedNameSpecifier();
   3227   }
   3228 
   3229   /// \brief Retrieve the nested-name-specifier that qualifies the member
   3230   /// name, with source location information.
   3231   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
   3232 
   3233 
   3234   /// \brief Retrieve the first part of the nested-name-specifier that was
   3235   /// found in the scope of the member access expression when the member access
   3236   /// was initially parsed.
   3237   ///
   3238   /// This function only returns a useful result when member access expression
   3239   /// uses a qualified member name, e.g., "x.Base::f". Here, the declaration
   3240   /// returned by this function describes what was found by unqualified name
   3241   /// lookup for the identifier "Base" within the scope of the member access
   3242   /// expression itself. At template instantiation time, this information is
   3243   /// combined with the results of name lookup into the type of the object
   3244   /// expression itself (the class type of x).
   3245   NamedDecl *getFirstQualifierFoundInScope() const {
   3246     return FirstQualifierFoundInScope;
   3247   }
   3248 
   3249   /// \brief Retrieve the name of the member that this expression
   3250   /// refers to.
   3251   const DeclarationNameInfo &getMemberNameInfo() const {
   3252     return MemberNameInfo;
   3253   }
   3254 
   3255   /// \brief Retrieve the name of the member that this expression
   3256   /// refers to.
   3257   DeclarationName getMember() const { return MemberNameInfo.getName(); }
   3258 
   3259   // \brief Retrieve the location of the name of the member that this
   3260   // expression refers to.
   3261   SourceLocation getMemberLoc() const { return MemberNameInfo.getLoc(); }
   3262 
   3263   /// \brief Retrieve the location of the template keyword preceding the
   3264   /// member name, if any.
   3265   SourceLocation getTemplateKeywordLoc() const {
   3266     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
   3267     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc;
   3268   }
   3269 
   3270   /// \brief Retrieve the location of the left angle bracket starting the
   3271   /// explicit template argument list following the member name, if any.
   3272   SourceLocation getLAngleLoc() const {
   3273     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
   3274     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc;
   3275   }
   3276 
   3277   /// \brief Retrieve the location of the right angle bracket ending the
   3278   /// explicit template argument list following the member name, if any.
   3279   SourceLocation getRAngleLoc() const {
   3280     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
   3281     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc;
   3282   }
   3283 
   3284   /// Determines whether the member name was preceded by the template keyword.
   3285   bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
   3286 
   3287   /// \brief Determines whether this member expression actually had a C++
   3288   /// template argument list explicitly specified, e.g., x.f<int>.
   3289   bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
   3290 
   3291   /// \brief Copies the template arguments (if present) into the given
   3292   /// structure.
   3293   void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
   3294     if (hasExplicitTemplateArgs())
   3295       getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto(
   3296           getTrailingObjects<TemplateArgumentLoc>(), List);
   3297   }
   3298 
   3299   /// \brief Retrieve the template arguments provided as part of this
   3300   /// template-id.
   3301   const TemplateArgumentLoc *getTemplateArgs() const {
   3302     if (!hasExplicitTemplateArgs())
   3303       return nullptr;
   3304 
   3305     return getTrailingObjects<TemplateArgumentLoc>();
   3306   }
   3307 
   3308   /// \brief Retrieve the number of template arguments provided as part of this
   3309   /// template-id.
   3310   unsigned getNumTemplateArgs() const {
   3311     if (!hasExplicitTemplateArgs())
   3312       return 0;
   3313 
   3314     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
   3315   }
   3316 
   3317   ArrayRef<TemplateArgumentLoc> template_arguments() const {
   3318     return {getTemplateArgs(), getNumTemplateArgs()};
   3319   }
   3320 
   3321   SourceLocation getLocStart() const LLVM_READONLY {
   3322     if (!isImplicitAccess())
   3323       return Base->getLocStart();
   3324     if (getQualifier())
   3325       return getQualifierLoc().getBeginLoc();
   3326     return MemberNameInfo.getBeginLoc();
   3327   }
   3328 
   3329   SourceLocation getLocEnd() const LLVM_READONLY {
   3330     if (hasExplicitTemplateArgs())
   3331       return getRAngleLoc();
   3332     return MemberNameInfo.getEndLoc();
   3333   }
   3334 
   3335   static bool classof(const Stmt *T) {
   3336     return T->getStmtClass() == CXXDependentScopeMemberExprClass;
   3337   }
   3338 
   3339   // Iterators
   3340   child_range children() {
   3341     if (isImplicitAccess())
   3342       return child_range(child_iterator(), child_iterator());
   3343     return child_range(&Base, &Base + 1);
   3344   }
   3345 
   3346   friend TrailingObjects;
   3347   friend class ASTStmtReader;
   3348   friend class ASTStmtWriter;
   3349 };
   3350 
   3351 /// \brief Represents a C++ member access expression for which lookup
   3352 /// produced a set of overloaded functions.
   3353 ///
   3354 /// The member access may be explicit or implicit:
   3355 /// \code
   3356 ///    struct A {
   3357 ///      int a, b;
   3358 ///      int explicitAccess() { return this->a + this->A::b; }
   3359 ///      int implicitAccess() { return a + A::b; }
   3360 ///    };
   3361 /// \endcode
   3362 ///
   3363 /// In the final AST, an explicit access always becomes a MemberExpr.
   3364 /// An implicit access may become either a MemberExpr or a
   3365 /// DeclRefExpr, depending on whether the member is static.
   3366 class UnresolvedMemberExpr final
   3367     : public OverloadExpr,
   3368       private llvm::TrailingObjects<
   3369           UnresolvedMemberExpr, ASTTemplateKWAndArgsInfo, TemplateArgumentLoc> {
   3370   /// \brief Whether this member expression used the '->' operator or
   3371   /// the '.' operator.
   3372   bool IsArrow : 1;
   3373 
   3374   /// \brief Whether the lookup results contain an unresolved using
   3375   /// declaration.
   3376   bool HasUnresolvedUsing : 1;
   3377 
   3378   /// \brief The expression for the base pointer or class reference,
   3379   /// e.g., the \c x in x.f.
   3380   ///
   3381   /// This can be null if this is an 'unbased' member expression.
   3382   Stmt *Base;
   3383 
   3384   /// \brief The type of the base expression; never null.
   3385   QualType BaseType;
   3386 
   3387   /// \brief The location of the '->' or '.' operator.
   3388   SourceLocation OperatorLoc;
   3389 
   3390   size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
   3391     return HasTemplateKWAndArgsInfo ? 1 : 0;
   3392   }
   3393 
   3394   UnresolvedMemberExpr(const ASTContext &C, bool HasUnresolvedUsing,
   3395                        Expr *Base, QualType BaseType, bool IsArrow,
   3396                        SourceLocation OperatorLoc,
   3397                        NestedNameSpecifierLoc QualifierLoc,
   3398                        SourceLocation TemplateKWLoc,
   3399                        const DeclarationNameInfo &MemberNameInfo,
   3400                        const TemplateArgumentListInfo *TemplateArgs,
   3401                        UnresolvedSetIterator Begin, UnresolvedSetIterator End);
   3402 
   3403   UnresolvedMemberExpr(EmptyShell Empty)
   3404     : OverloadExpr(UnresolvedMemberExprClass, Empty), IsArrow(false),
   3405       HasUnresolvedUsing(false), Base(nullptr) { }
   3406 
   3407   friend TrailingObjects;
   3408   friend class OverloadExpr;
   3409   friend class ASTStmtReader;
   3410 
   3411 public:
   3412   static UnresolvedMemberExpr *
   3413   Create(const ASTContext &C, bool HasUnresolvedUsing,
   3414          Expr *Base, QualType BaseType, bool IsArrow,
   3415          SourceLocation OperatorLoc,
   3416          NestedNameSpecifierLoc QualifierLoc,
   3417          SourceLocation TemplateKWLoc,
   3418          const DeclarationNameInfo &MemberNameInfo,
   3419          const TemplateArgumentListInfo *TemplateArgs,
   3420          UnresolvedSetIterator Begin, UnresolvedSetIterator End);
   3421 
   3422   static UnresolvedMemberExpr *
   3423   CreateEmpty(const ASTContext &C, bool HasTemplateKWAndArgsInfo,
   3424               unsigned NumTemplateArgs);
   3425 
   3426   /// \brief True if this is an implicit access, i.e., one in which the
   3427   /// member being accessed was not written in the source.
   3428   ///
   3429   /// The source location of the operator is invalid in this case.
   3430   bool isImplicitAccess() const;
   3431 
   3432   /// \brief Retrieve the base object of this member expressions,
   3433   /// e.g., the \c x in \c x.m.
   3434   Expr *getBase() {
   3435     assert(!isImplicitAccess());
   3436     return cast<Expr>(Base);
   3437   }
   3438   const Expr *getBase() const {
   3439     assert(!isImplicitAccess());
   3440     return cast<Expr>(Base);
   3441   }
   3442 
   3443   QualType getBaseType() const { return BaseType; }
   3444 
   3445   /// \brief Determine whether the lookup results contain an unresolved using
   3446   /// declaration.
   3447   bool hasUnresolvedUsing() const { return HasUnresolvedUsing; }
   3448 
   3449   /// \brief Determine whether this member expression used the '->'
   3450   /// operator; otherwise, it used the '.' operator.
   3451   bool isArrow() const { return IsArrow; }
   3452 
   3453   /// \brief Retrieve the location of the '->' or '.' operator.
   3454   SourceLocation getOperatorLoc() const { return OperatorLoc; }
   3455 
   3456   /// \brief Retrieve the naming class of this lookup.
   3457   CXXRecordDecl *getNamingClass() const;
   3458 
   3459   /// \brief Retrieve the full name info for the member that this expression
   3460   /// refers to.
   3461   const DeclarationNameInfo &getMemberNameInfo() const { return getNameInfo(); }
   3462 
   3463   /// \brief Retrieve the name of the member that this expression
   3464   /// refers to.
   3465   DeclarationName getMemberName() const { return getName(); }
   3466 
   3467   // \brief Retrieve the location of the name of the member that this
   3468   // expression refers to.
   3469   SourceLocation getMemberLoc() const { return getNameLoc(); }
   3470 
   3471   // \brief Return the preferred location (the member name) for the arrow when
   3472   // diagnosing a problem with this expression.
   3473   SourceLocation getExprLoc() const LLVM_READONLY { return getMemberLoc(); }
   3474 
   3475   SourceLocation getLocStart() const LLVM_READONLY {
   3476     if (!isImplicitAccess())
   3477       return Base->getLocStart();
   3478     if (NestedNameSpecifierLoc l = getQualifierLoc())
   3479       return l.getBeginLoc();
   3480     return getMemberNameInfo().getLocStart();
   3481   }
   3482   SourceLocation getLocEnd() const LLVM_READONLY {
   3483     if (hasExplicitTemplateArgs())
   3484       return getRAngleLoc();
   3485     return getMemberNameInfo().getLocEnd();
   3486   }
   3487 
   3488   static bool classof(const Stmt *T) {
   3489     return T->getStmtClass() == UnresolvedMemberExprClass;
   3490   }
   3491 
   3492   // Iterators
   3493   child_range children() {
   3494     if (isImplicitAccess())
   3495       return child_range(child_iterator(), child_iterator());
   3496     return child_range(&Base, &Base + 1);
   3497   }
   3498 };
   3499 
   3500 inline ASTTemplateKWAndArgsInfo *
   3501 OverloadExpr::getTrailingASTTemplateKWAndArgsInfo() {
   3502   if (!HasTemplateKWAndArgsInfo)
   3503     return nullptr;
   3504 
   3505   if (isa<UnresolvedLookupExpr>(this))
   3506     return cast<UnresolvedLookupExpr>(this)
   3507         ->getTrailingObjects<ASTTemplateKWAndArgsInfo>();
   3508   else
   3509     return cast<UnresolvedMemberExpr>(this)
   3510         ->getTrailingObjects<ASTTemplateKWAndArgsInfo>();
   3511 }
   3512 
   3513 inline TemplateArgumentLoc *OverloadExpr::getTrailingTemplateArgumentLoc() {
   3514   if (isa<UnresolvedLookupExpr>(this))
   3515     return cast<UnresolvedLookupExpr>(this)
   3516         ->getTrailingObjects<TemplateArgumentLoc>();
   3517   else
   3518     return cast<UnresolvedMemberExpr>(this)
   3519         ->getTrailingObjects<TemplateArgumentLoc>();
   3520 }
   3521 
   3522 /// \brief Represents a C++11 noexcept expression (C++ [expr.unary.noexcept]).
   3523 ///
   3524 /// The noexcept expression tests whether a given expression might throw. Its
   3525 /// result is a boolean constant.
   3526 class CXXNoexceptExpr : public Expr {
   3527   bool Value : 1;
   3528   Stmt *Operand;
   3529   SourceRange Range;
   3530 
   3531   friend class ASTStmtReader;
   3532 
   3533 public:
   3534   CXXNoexceptExpr(QualType Ty, Expr *Operand, CanThrowResult Val,
   3535                   SourceLocation Keyword, SourceLocation RParen)
   3536     : Expr(CXXNoexceptExprClass, Ty, VK_RValue, OK_Ordinary,
   3537            /*TypeDependent*/false,
   3538            /*ValueDependent*/Val == CT_Dependent,
   3539            Val == CT_Dependent || Operand->isInstantiationDependent(),
   3540            Operand->containsUnexpandedParameterPack()),
   3541       Value(Val == CT_Cannot), Operand(Operand), Range(Keyword, RParen)
   3542   { }
   3543 
   3544   CXXNoexceptExpr(EmptyShell Empty)
   3545     : Expr(CXXNoexceptExprClass, Empty)
   3546   { }
   3547 
   3548   Expr *getOperand() const { return static_cast<Expr*>(Operand); }
   3549 
   3550   SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); }
   3551   SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); }
   3552   SourceRange getSourceRange() const LLVM_READONLY { return Range; }
   3553 
   3554   bool getValue() const { return Value; }
   3555 
   3556   static bool classof(const Stmt *T) {
   3557     return T->getStmtClass() == CXXNoexceptExprClass;
   3558   }
   3559 
   3560   // Iterators
   3561   child_range children() { return child_range(&Operand, &Operand + 1); }
   3562 };
   3563 
   3564 /// \brief Represents a C++11 pack expansion that produces a sequence of
   3565 /// expressions.
   3566 ///
   3567 /// A pack expansion expression contains a pattern (which itself is an
   3568 /// expression) followed by an ellipsis. For example:
   3569 ///
   3570 /// \code
   3571 /// template<typename F, typename ...Types>
   3572 /// void forward(F f, Types &&...args) {
   3573 ///   f(static_cast<Types&&>(args)...);
   3574 /// }
   3575 /// \endcode
   3576 ///
   3577 /// Here, the argument to the function object \c f is a pack expansion whose
   3578 /// pattern is \c static_cast<Types&&>(args). When the \c forward function
   3579 /// template is instantiated, the pack expansion will instantiate to zero or
   3580 /// or more function arguments to the function object \c f.
   3581 class PackExpansionExpr : public Expr {
   3582   SourceLocation EllipsisLoc;
   3583 
   3584   /// \brief The number of expansions that will be produced by this pack
   3585   /// expansion expression, if known.
   3586   ///
   3587   /// When zero, the number of expansions is not known. Otherwise, this value
   3588   /// is the number of expansions + 1.
   3589   unsigned NumExpansions;
   3590 
   3591   Stmt *Pattern;
   3592 
   3593   friend class ASTStmtReader;
   3594   friend class ASTStmtWriter;
   3595 
   3596 public:
   3597   PackExpansionExpr(QualType T, Expr *Pattern, SourceLocation EllipsisLoc,
   3598                     Optional<unsigned> NumExpansions)
   3599     : Expr(PackExpansionExprClass, T, Pattern->getValueKind(),
   3600            Pattern->getObjectKind(), /*TypeDependent=*/true,
   3601            /*ValueDependent=*/true, /*InstantiationDependent=*/true,
   3602            /*ContainsUnexpandedParameterPack=*/false),
   3603       EllipsisLoc(EllipsisLoc),
   3604       NumExpansions(NumExpansions? *NumExpansions + 1 : 0),
   3605       Pattern(Pattern) { }
   3606 
   3607   PackExpansionExpr(EmptyShell Empty) : Expr(PackExpansionExprClass, Empty) { }
   3608 
   3609   /// \brief Retrieve the pattern of the pack expansion.
   3610   Expr *getPattern() { return reinterpret_cast<Expr *>(Pattern); }
   3611 
   3612   /// \brief Retrieve the pattern of the pack expansion.
   3613   const Expr *getPattern() const { return reinterpret_cast<Expr *>(Pattern); }
   3614 
   3615   /// \brief Retrieve the location of the ellipsis that describes this pack
   3616   /// expansion.
   3617   SourceLocation getEllipsisLoc() const { return EllipsisLoc; }
   3618 
   3619   /// \brief Determine the number of expansions that will be produced when
   3620   /// this pack expansion is instantiated, if already known.
   3621   Optional<unsigned> getNumExpansions() const {
   3622     if (NumExpansions)
   3623       return NumExpansions - 1;
   3624 
   3625     return None;
   3626   }
   3627 
   3628   SourceLocation getLocStart() const LLVM_READONLY {
   3629     return Pattern->getLocStart();
   3630   }
   3631   SourceLocation getLocEnd() const LLVM_READONLY { return EllipsisLoc; }
   3632 
   3633   static bool classof(const Stmt *T) {
   3634     return T->getStmtClass() == PackExpansionExprClass;
   3635   }
   3636 
   3637   // Iterators
   3638   child_range children() {
   3639     return child_range(&Pattern, &Pattern + 1);
   3640   }
   3641 };
   3642 
   3643 
   3644 /// \brief Represents an expression that computes the length of a parameter
   3645 /// pack.
   3646 ///
   3647 /// \code
   3648 /// template<typename ...Types>
   3649 /// struct count {
   3650 ///   static const unsigned value = sizeof...(Types);
   3651 /// };
   3652 /// \endcode
   3653 class SizeOfPackExpr final
   3654     : public Expr,
   3655       private llvm::TrailingObjects<SizeOfPackExpr, TemplateArgument> {
   3656   /// \brief The location of the \c sizeof keyword.
   3657   SourceLocation OperatorLoc;
   3658 
   3659   /// \brief The location of the name of the parameter pack.
   3660   SourceLocation PackLoc;
   3661 
   3662   /// \brief The location of the closing parenthesis.
   3663   SourceLocation RParenLoc;
   3664 
   3665   /// \brief The length of the parameter pack, if known.
   3666   ///
   3667   /// When this expression is not value-dependent, this is the length of
   3668   /// the pack. When the expression was parsed rather than instantiated
   3669   /// (and thus is value-dependent), this is zero.
   3670   ///
   3671   /// After partial substitution into a sizeof...(X) expression (for instance,
   3672   /// within an alias template or during function template argument deduction),
   3673   /// we store a trailing array of partially-substituted TemplateArguments,
   3674   /// and this is the length of that array.
   3675   unsigned Length;
   3676 
   3677   /// \brief The parameter pack.
   3678   NamedDecl *Pack;
   3679 
   3680   friend TrailingObjects;
   3681   friend class ASTStmtReader;
   3682   friend class ASTStmtWriter;
   3683 
   3684   /// \brief Create an expression that computes the length of
   3685   /// the given parameter pack.
   3686   SizeOfPackExpr(QualType SizeType, SourceLocation OperatorLoc, NamedDecl *Pack,
   3687                  SourceLocation PackLoc, SourceLocation RParenLoc,
   3688                  Optional<unsigned> Length, ArrayRef<TemplateArgument> PartialArgs)
   3689       : Expr(SizeOfPackExprClass, SizeType, VK_RValue, OK_Ordinary,
   3690              /*TypeDependent=*/false, /*ValueDependent=*/!Length,
   3691              /*InstantiationDependent=*/!Length,
   3692              /*ContainsUnexpandedParameterPack=*/false),
   3693         OperatorLoc(OperatorLoc), PackLoc(PackLoc), RParenLoc(RParenLoc),
   3694         Length(Length ? *Length : PartialArgs.size()), Pack(Pack) {
   3695     assert((!Length || PartialArgs.empty()) &&
   3696            "have partial args for non-dependent sizeof... expression");
   3697     TemplateArgument *Args = getTrailingObjects<TemplateArgument>();
   3698     std::uninitialized_copy(PartialArgs.begin(), PartialArgs.end(), Args);
   3699   }
   3700 
   3701   /// \brief Create an empty expression.
   3702   SizeOfPackExpr(EmptyShell Empty, unsigned NumPartialArgs)
   3703       : Expr(SizeOfPackExprClass, Empty), Length(NumPartialArgs), Pack() {}
   3704 
   3705 public:
   3706   static SizeOfPackExpr *Create(ASTContext &Context, SourceLocation OperatorLoc,
   3707                                 NamedDecl *Pack, SourceLocation PackLoc,
   3708                                 SourceLocation RParenLoc,
   3709                                 Optional<unsigned> Length = None,
   3710                                 ArrayRef<TemplateArgument> PartialArgs = None);
   3711   static SizeOfPackExpr *CreateDeserialized(ASTContext &Context,
   3712                                             unsigned NumPartialArgs);
   3713 
   3714   /// \brief Determine the location of the 'sizeof' keyword.
   3715   SourceLocation getOperatorLoc() const { return OperatorLoc; }
   3716 
   3717   /// \brief Determine the location of the parameter pack.
   3718   SourceLocation getPackLoc() const { return PackLoc; }
   3719 
   3720   /// \brief Determine the location of the right parenthesis.
   3721   SourceLocation getRParenLoc() const { return RParenLoc; }
   3722 
   3723   /// \brief Retrieve the parameter pack.
   3724   NamedDecl *getPack() const { return Pack; }
   3725 
   3726   /// \brief Retrieve the length of the parameter pack.
   3727   ///
   3728   /// This routine may only be invoked when the expression is not
   3729   /// value-dependent.
   3730   unsigned getPackLength() const {
   3731     assert(!isValueDependent() &&
   3732            "Cannot get the length of a value-dependent pack size expression");
   3733     return Length;
   3734   }
   3735 
   3736   /// \brief Determine whether this represents a partially-substituted sizeof...
   3737   /// expression, such as is produced for:
   3738   ///
   3739   ///   template<typename ...Ts> using X = int[sizeof...(Ts)];
   3740   ///   template<typename ...Us> void f(X<Us..., 1, 2, 3, Us...>);
   3741   bool isPartiallySubstituted() const {
   3742     return isValueDependent() && Length;
   3743   }
   3744 
   3745   /// \brief Get
   3746   ArrayRef<TemplateArgument> getPartialArguments() const {
   3747     assert(isPartiallySubstituted());
   3748     const TemplateArgument *Args = getTrailingObjects<TemplateArgument>();
   3749     return llvm::makeArrayRef(Args, Args + Length);
   3750   }
   3751 
   3752   SourceLocation getLocStart() const LLVM_READONLY { return OperatorLoc; }
   3753   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
   3754 
   3755   static bool classof(const Stmt *T) {
   3756     return T->getStmtClass() == SizeOfPackExprClass;
   3757   }
   3758 
   3759   // Iterators
   3760   child_range children() {
   3761     return child_range(child_iterator(), child_iterator());
   3762   }
   3763 };
   3764 
   3765 /// \brief Represents a reference to a non-type template parameter
   3766 /// that has been substituted with a template argument.
   3767 class SubstNonTypeTemplateParmExpr : public Expr {
   3768   /// \brief The replaced parameter.
   3769   NonTypeTemplateParmDecl *Param;
   3770 
   3771   /// \brief The replacement expression.
   3772   Stmt *Replacement;
   3773 
   3774   /// \brief The location of the non-type template parameter reference.
   3775   SourceLocation NameLoc;
   3776 
   3777   friend class ASTReader;
   3778   friend class ASTStmtReader;
   3779   explicit SubstNonTypeTemplateParmExpr(EmptyShell Empty)
   3780     : Expr(SubstNonTypeTemplateParmExprClass, Empty) { }
   3781 
   3782 public:
   3783   SubstNonTypeTemplateParmExpr(QualType type,
   3784                                ExprValueKind valueKind,
   3785                                SourceLocation loc,
   3786                                NonTypeTemplateParmDecl *param,
   3787                                Expr *replacement)
   3788     : Expr(SubstNonTypeTemplateParmExprClass, type, valueKind, OK_Ordinary,
   3789            replacement->isTypeDependent(), replacement->isValueDependent(),
   3790            replacement->isInstantiationDependent(),
   3791            replacement->containsUnexpandedParameterPack()),
   3792       Param(param), Replacement(replacement), NameLoc(loc) {}
   3793 
   3794   SourceLocation getNameLoc() const { return NameLoc; }
   3795   SourceLocation getLocStart() const LLVM_READONLY { return NameLoc; }
   3796   SourceLocation getLocEnd() const LLVM_READONLY { return NameLoc; }
   3797 
   3798   Expr *getReplacement() const { return cast<Expr>(Replacement); }
   3799 
   3800   NonTypeTemplateParmDecl *getParameter() const { return Param; }
   3801 
   3802   static bool classof(const Stmt *s) {
   3803     return s->getStmtClass() == SubstNonTypeTemplateParmExprClass;
   3804   }
   3805 
   3806   // Iterators
   3807   child_range children() { return child_range(&Replacement, &Replacement+1); }
   3808 };
   3809 
   3810 /// \brief Represents a reference to a non-type template parameter pack that
   3811 /// has been substituted with a non-template argument pack.
   3812 ///
   3813 /// When a pack expansion in the source code contains multiple parameter packs
   3814 /// and those parameter packs correspond to different levels of template
   3815 /// parameter lists, this node is used to represent a non-type template
   3816 /// parameter pack from an outer level, which has already had its argument pack
   3817 /// substituted but that still lives within a pack expansion that itself
   3818 /// could not be instantiated. When actually performing a substitution into
   3819 /// that pack expansion (e.g., when all template parameters have corresponding
   3820 /// arguments), this type will be replaced with the appropriate underlying
   3821 /// expression at the current pack substitution index.
   3822 class SubstNonTypeTemplateParmPackExpr : public Expr {
   3823   /// \brief The non-type template parameter pack itself.
   3824   NonTypeTemplateParmDecl *Param;
   3825 
   3826   /// \brief A pointer to the set of template arguments that this
   3827   /// parameter pack is instantiated with.
   3828   const TemplateArgument *Arguments;
   3829 
   3830   /// \brief The number of template arguments in \c Arguments.
   3831   unsigned NumArguments;
   3832 
   3833   /// \brief The location of the non-type template parameter pack reference.
   3834   SourceLocation NameLoc;
   3835 
   3836   friend class ASTReader;
   3837   friend class ASTStmtReader;
   3838   explicit SubstNonTypeTemplateParmPackExpr(EmptyShell Empty)
   3839     : Expr(SubstNonTypeTemplateParmPackExprClass, Empty) { }
   3840 
   3841 public:
   3842   SubstNonTypeTemplateParmPackExpr(QualType T,
   3843                                    NonTypeTemplateParmDecl *Param,
   3844                                    SourceLocation NameLoc,
   3845                                    const TemplateArgument &ArgPack);
   3846 
   3847   /// \brief Retrieve the non-type template parameter pack being substituted.
   3848   NonTypeTemplateParmDecl *getParameterPack() const { return Param; }
   3849 
   3850   /// \brief Retrieve the location of the parameter pack name.
   3851   SourceLocation getParameterPackLocation() const { return NameLoc; }
   3852 
   3853   /// \brief Retrieve the template argument pack containing the substituted
   3854   /// template arguments.
   3855   TemplateArgument getArgumentPack() const;
   3856 
   3857   SourceLocation getLocStart() const LLVM_READONLY { return NameLoc; }
   3858   SourceLocation getLocEnd() const LLVM_READONLY { return NameLoc; }
   3859 
   3860   static bool classof(const Stmt *T) {
   3861     return T->getStmtClass() == SubstNonTypeTemplateParmPackExprClass;
   3862   }
   3863 
   3864   // Iterators
   3865   child_range children() {
   3866     return child_range(child_iterator(), child_iterator());
   3867   }
   3868 };
   3869 
   3870 /// \brief Represents a reference to a function parameter pack that has been
   3871 /// substituted but not yet expanded.
   3872 ///
   3873 /// When a pack expansion contains multiple parameter packs at different levels,
   3874 /// this node is used to represent a function parameter pack at an outer level
   3875 /// which we have already substituted to refer to expanded parameters, but where
   3876 /// the containing pack expansion cannot yet be expanded.
   3877 ///
   3878 /// \code
   3879 /// template<typename...Ts> struct S {
   3880 ///   template<typename...Us> auto f(Ts ...ts) -> decltype(g(Us(ts)...));
   3881 /// };
   3882 /// template struct S<int, int>;
   3883 /// \endcode
   3884 class FunctionParmPackExpr final
   3885     : public Expr,
   3886       private llvm::TrailingObjects<FunctionParmPackExpr, ParmVarDecl *> {
   3887   /// \brief The function parameter pack which was referenced.
   3888   ParmVarDecl *ParamPack;
   3889 
   3890   /// \brief The location of the function parameter pack reference.
   3891   SourceLocation NameLoc;
   3892 
   3893   /// \brief The number of expansions of this pack.
   3894   unsigned NumParameters;
   3895 
   3896   FunctionParmPackExpr(QualType T, ParmVarDecl *ParamPack,
   3897                        SourceLocation NameLoc, unsigned NumParams,
   3898                        ParmVarDecl *const *Params);
   3899 
   3900   friend TrailingObjects;
   3901   friend class ASTReader;
   3902   friend class ASTStmtReader;
   3903 
   3904 public:
   3905   static FunctionParmPackExpr *Create(const ASTContext &Context, QualType T,
   3906                                       ParmVarDecl *ParamPack,
   3907                                       SourceLocation NameLoc,
   3908                                       ArrayRef<ParmVarDecl *> Params);
   3909   static FunctionParmPackExpr *CreateEmpty(const ASTContext &Context,
   3910                                            unsigned NumParams);
   3911 
   3912   /// \brief Get the parameter pack which this expression refers to.
   3913   ParmVarDecl *getParameterPack() const { return ParamPack; }
   3914 
   3915   /// \brief Get the location of the parameter pack.
   3916   SourceLocation getParameterPackLocation() const { return NameLoc; }
   3917 
   3918   /// \brief Iterators over the parameters which the parameter pack expanded
   3919   /// into.
   3920   typedef ParmVarDecl * const *iterator;
   3921   iterator begin() const { return getTrailingObjects<ParmVarDecl *>(); }
   3922   iterator end() const { return begin() + NumParameters; }
   3923 
   3924   /// \brief Get the number of parameters in this parameter pack.
   3925   unsigned getNumExpansions() const { return NumParameters; }
   3926 
   3927   /// \brief Get an expansion of the parameter pack by index.
   3928   ParmVarDecl *getExpansion(unsigned I) const { return begin()[I]; }
   3929 
   3930   SourceLocation getLocStart() const LLVM_READONLY { return NameLoc; }
   3931   SourceLocation getLocEnd() const LLVM_READONLY { return NameLoc; }
   3932 
   3933   static bool classof(const Stmt *T) {
   3934     return T->getStmtClass() == FunctionParmPackExprClass;
   3935   }
   3936 
   3937   child_range children() {
   3938     return child_range(child_iterator(), child_iterator());
   3939   }
   3940 };
   3941 
   3942 /// \brief Represents a prvalue temporary that is written into memory so that
   3943 /// a reference can bind to it.
   3944 ///
   3945 /// Prvalue expressions are materialized when they need to have an address
   3946 /// in memory for a reference to bind to. This happens when binding a
   3947 /// reference to the result of a conversion, e.g.,
   3948 ///
   3949 /// \code
   3950 /// const int &r = 1.0;
   3951 /// \endcode
   3952 ///
   3953 /// Here, 1.0 is implicitly converted to an \c int. That resulting \c int is
   3954 /// then materialized via a \c MaterializeTemporaryExpr, and the reference
   3955 /// binds to the temporary. \c MaterializeTemporaryExprs are always glvalues
   3956 /// (either an lvalue or an xvalue, depending on the kind of reference binding
   3957 /// to it), maintaining the invariant that references always bind to glvalues.
   3958 ///
   3959 /// Reference binding and copy-elision can both extend the lifetime of a
   3960 /// temporary. When either happens, the expression will also track the
   3961 /// declaration which is responsible for the lifetime extension.
   3962 class MaterializeTemporaryExpr : public Expr {
   3963 private:
   3964   struct ExtraState {
   3965     /// \brief The temporary-generating expression whose value will be
   3966     /// materialized.
   3967     Stmt *Temporary;
   3968 
   3969     /// \brief The declaration which lifetime-extended this reference, if any.
   3970     /// Either a VarDecl, or (for a ctor-initializer) a FieldDecl.
   3971     const ValueDecl *ExtendingDecl;
   3972 
   3973     unsigned ManglingNumber;
   3974   };
   3975   llvm::PointerUnion<Stmt *, ExtraState *> State;
   3976 
   3977   friend class ASTStmtReader;
   3978   friend class ASTStmtWriter;
   3979 
   3980   void initializeExtraState(const ValueDecl *ExtendedBy,
   3981                             unsigned ManglingNumber);
   3982 
   3983 public:
   3984   MaterializeTemporaryExpr(QualType T, Expr *Temporary,
   3985                            bool BoundToLvalueReference)
   3986     : Expr(MaterializeTemporaryExprClass, T,
   3987            BoundToLvalueReference? VK_LValue : VK_XValue, OK_Ordinary,
   3988            Temporary->isTypeDependent(), Temporary->isValueDependent(),
   3989            Temporary->isInstantiationDependent(),
   3990            Temporary->containsUnexpandedParameterPack()),
   3991         State(Temporary) {}
   3992 
   3993   MaterializeTemporaryExpr(EmptyShell Empty)
   3994     : Expr(MaterializeTemporaryExprClass, Empty) { }
   3995 
   3996   Stmt *getTemporary() const {
   3997     return State.is<Stmt *>() ? State.get<Stmt *>()
   3998                               : State.get<ExtraState *>()->Temporary;
   3999   }
   4000 
   4001   /// \brief Retrieve the temporary-generating subexpression whose value will
   4002   /// be materialized into a glvalue.
   4003   Expr *GetTemporaryExpr() const { return static_cast<Expr *>(getTemporary()); }
   4004 
   4005   /// \brief Retrieve the storage duration for the materialized temporary.
   4006   StorageDuration getStorageDuration() const {
   4007     const ValueDecl *ExtendingDecl = getExtendingDecl();
   4008     if (!ExtendingDecl)
   4009       return SD_FullExpression;
   4010     // FIXME: This is not necessarily correct for a temporary materialized
   4011     // within a default initializer.
   4012     if (isa<FieldDecl>(ExtendingDecl))
   4013       return SD_Automatic;
   4014     return cast<VarDecl>(ExtendingDecl)->getStorageDuration();
   4015   }
   4016 
   4017   /// \brief Get the declaration which triggered the lifetime-extension of this
   4018   /// temporary, if any.
   4019   const ValueDecl *getExtendingDecl() const {
   4020     return State.is<Stmt *>() ? nullptr
   4021                               : State.get<ExtraState *>()->ExtendingDecl;
   4022   }
   4023 
   4024   void setExtendingDecl(const ValueDecl *ExtendedBy, unsigned ManglingNumber);
   4025 
   4026   unsigned getManglingNumber() const {
   4027     return State.is<Stmt *>() ? 0 : State.get<ExtraState *>()->ManglingNumber;
   4028   }
   4029 
   4030   /// \brief Determine whether this materialized temporary is bound to an
   4031   /// lvalue reference; otherwise, it's bound to an rvalue reference.
   4032   bool isBoundToLvalueReference() const {
   4033     return getValueKind() == VK_LValue;
   4034   }
   4035 
   4036   SourceLocation getLocStart() const LLVM_READONLY {
   4037     return getTemporary()->getLocStart();
   4038   }
   4039   SourceLocation getLocEnd() const LLVM_READONLY {
   4040     return getTemporary()->getLocEnd();
   4041   }
   4042 
   4043   static bool classof(const Stmt *T) {
   4044     return T->getStmtClass() == MaterializeTemporaryExprClass;
   4045   }
   4046 
   4047   // Iterators
   4048   child_range children() {
   4049     if (State.is<Stmt *>())
   4050       return child_range(State.getAddrOfPtr1(), State.getAddrOfPtr1() + 1);
   4051 
   4052     auto ES = State.get<ExtraState *>();
   4053     return child_range(&ES->Temporary, &ES->Temporary + 1);
   4054   }
   4055 };
   4056 
   4057 /// \brief Represents a folding of a pack over an operator.
   4058 ///
   4059 /// This expression is always dependent and represents a pack expansion of the
   4060 /// forms:
   4061 ///
   4062 ///    ( expr op ... )
   4063 ///    ( ... op expr )
   4064 ///    ( expr op ... op expr )
   4065 class CXXFoldExpr : public Expr {
   4066   SourceLocation LParenLoc;
   4067   SourceLocation EllipsisLoc;
   4068   SourceLocation RParenLoc;
   4069   Stmt *SubExprs[2];
   4070   BinaryOperatorKind Opcode;
   4071 
   4072   friend class ASTStmtReader;
   4073   friend class ASTStmtWriter;
   4074 public:
   4075   CXXFoldExpr(QualType T, SourceLocation LParenLoc, Expr *LHS,
   4076               BinaryOperatorKind Opcode, SourceLocation EllipsisLoc, Expr *RHS,
   4077               SourceLocation RParenLoc)
   4078       : Expr(CXXFoldExprClass, T, VK_RValue, OK_Ordinary,
   4079              /*Dependent*/ true, true, true,
   4080              /*ContainsUnexpandedParameterPack*/ false),
   4081         LParenLoc(LParenLoc), EllipsisLoc(EllipsisLoc), RParenLoc(RParenLoc),
   4082         Opcode(Opcode) {
   4083     SubExprs[0] = LHS;
   4084     SubExprs[1] = RHS;
   4085   }
   4086   CXXFoldExpr(EmptyShell Empty) : Expr(CXXFoldExprClass, Empty) {}
   4087 
   4088   Expr *getLHS() const { return static_cast<Expr*>(SubExprs[0]); }
   4089   Expr *getRHS() const { return static_cast<Expr*>(SubExprs[1]); }
   4090 
   4091   /// Does this produce a right-associated sequence of operators?
   4092   bool isRightFold() const {
   4093     return getLHS() && getLHS()->containsUnexpandedParameterPack();
   4094   }
   4095   /// Does this produce a left-associated sequence of operators?
   4096   bool isLeftFold() const { return !isRightFold(); }
   4097   /// Get the pattern, that is, the operand that contains an unexpanded pack.
   4098   Expr *getPattern() const { return isLeftFold() ? getRHS() : getLHS(); }
   4099   /// Get the operand that doesn't contain a pack, for a binary fold.
   4100   Expr *getInit() const { return isLeftFold() ? getLHS() : getRHS(); }
   4101 
   4102   SourceLocation getEllipsisLoc() const { return EllipsisLoc; }
   4103   BinaryOperatorKind getOperator() const { return Opcode; }
   4104 
   4105   SourceLocation getLocStart() const LLVM_READONLY {
   4106     return LParenLoc;
   4107   }
   4108   SourceLocation getLocEnd() const LLVM_READONLY {
   4109     return RParenLoc;
   4110   }
   4111 
   4112   static bool classof(const Stmt *T) {
   4113     return T->getStmtClass() == CXXFoldExprClass;
   4114   }
   4115 
   4116   // Iterators
   4117   child_range children() { return child_range(SubExprs, SubExprs + 2); }
   4118 };
   4119 
   4120 /// \brief Represents an expression that might suspend coroutine execution;
   4121 /// either a co_await or co_yield expression.
   4122 ///
   4123 /// Evaluation of this expression first evaluates its 'ready' expression. If
   4124 /// that returns 'false':
   4125 ///  -- execution of the coroutine is suspended
   4126 ///  -- the 'suspend' expression is evaluated
   4127 ///     -- if the 'suspend' expression returns 'false', the coroutine is
   4128 ///        resumed
   4129 ///     -- otherwise, control passes back to the resumer.
   4130 /// If the coroutine is not suspended, or when it is resumed, the 'resume'
   4131 /// expression is evaluated, and its result is the result of the overall
   4132 /// expression.
   4133 class CoroutineSuspendExpr : public Expr {
   4134   SourceLocation KeywordLoc;
   4135 
   4136   enum SubExpr { Common, Ready, Suspend, Resume, Count };
   4137   Stmt *SubExprs[SubExpr::Count];
   4138 
   4139   friend class ASTStmtReader;
   4140 public:
   4141   CoroutineSuspendExpr(StmtClass SC, SourceLocation KeywordLoc, Expr *Common,
   4142                        Expr *Ready, Expr *Suspend, Expr *Resume)
   4143       : Expr(SC, Resume->getType(), Resume->getValueKind(),
   4144              Resume->getObjectKind(), Resume->isTypeDependent(),
   4145              Resume->isValueDependent(), Common->isInstantiationDependent(),
   4146              Common->containsUnexpandedParameterPack()),
   4147         KeywordLoc(KeywordLoc) {
   4148     SubExprs[SubExpr::Common] = Common;
   4149     SubExprs[SubExpr::Ready] = Ready;
   4150     SubExprs[SubExpr::Suspend] = Suspend;
   4151     SubExprs[SubExpr::Resume] = Resume;
   4152   }
   4153   CoroutineSuspendExpr(StmtClass SC, SourceLocation KeywordLoc, QualType Ty,
   4154                        Expr *Common)
   4155       : Expr(SC, Ty, VK_RValue, OK_Ordinary, true, true, true,
   4156              Common->containsUnexpandedParameterPack()),
   4157         KeywordLoc(KeywordLoc) {
   4158     assert(Common->isTypeDependent() && Ty->isDependentType() &&
   4159            "wrong constructor for non-dependent co_await/co_yield expression");
   4160     SubExprs[SubExpr::Common] = Common;
   4161     SubExprs[SubExpr::Ready] = nullptr;
   4162     SubExprs[SubExpr::Suspend] = nullptr;
   4163     SubExprs[SubExpr::Resume] = nullptr;
   4164   }
   4165   CoroutineSuspendExpr(StmtClass SC, EmptyShell Empty) : Expr(SC, Empty) {
   4166     SubExprs[SubExpr::Common] = nullptr;
   4167     SubExprs[SubExpr::Ready] = nullptr;
   4168     SubExprs[SubExpr::Suspend] = nullptr;
   4169     SubExprs[SubExpr::Resume] = nullptr;
   4170   }
   4171 
   4172   SourceLocation getKeywordLoc() const { return KeywordLoc; }
   4173   Expr *getCommonExpr() const {
   4174     return static_cast<Expr*>(SubExprs[SubExpr::Common]);
   4175   }
   4176 
   4177   Expr *getReadyExpr() const {
   4178     return static_cast<Expr*>(SubExprs[SubExpr::Ready]);
   4179   }
   4180   Expr *getSuspendExpr() const {
   4181     return static_cast<Expr*>(SubExprs[SubExpr::Suspend]);
   4182   }
   4183   Expr *getResumeExpr() const {
   4184     return static_cast<Expr*>(SubExprs[SubExpr::Resume]);
   4185   }
   4186 
   4187   SourceLocation getLocStart() const LLVM_READONLY {
   4188     return KeywordLoc;
   4189   }
   4190   SourceLocation getLocEnd() const LLVM_READONLY {
   4191     return getCommonExpr()->getLocEnd();
   4192   }
   4193 
   4194   child_range children() {
   4195     return child_range(SubExprs, SubExprs + SubExpr::Count);
   4196   }
   4197 
   4198   static bool classof(const Stmt *T) {
   4199     return T->getStmtClass() == CoawaitExprClass ||
   4200            T->getStmtClass() == CoyieldExprClass;
   4201   }
   4202 };
   4203 
   4204 /// \brief Represents a 'co_await' expression.
   4205 class CoawaitExpr : public CoroutineSuspendExpr {
   4206   friend class ASTStmtReader;
   4207 public:
   4208   CoawaitExpr(SourceLocation CoawaitLoc, Expr *Operand, Expr *Ready,
   4209               Expr *Suspend, Expr *Resume)
   4210       : CoroutineSuspendExpr(CoawaitExprClass, CoawaitLoc, Operand, Ready,
   4211                              Suspend, Resume) {}
   4212   CoawaitExpr(SourceLocation CoawaitLoc, QualType Ty, Expr *Operand)
   4213       : CoroutineSuspendExpr(CoawaitExprClass, CoawaitLoc, Ty, Operand) {}
   4214   CoawaitExpr(EmptyShell Empty)
   4215       : CoroutineSuspendExpr(CoawaitExprClass, Empty) {}
   4216 
   4217   Expr *getOperand() const {
   4218     // FIXME: Dig out the actual operand or store it.
   4219     return getCommonExpr();
   4220   }
   4221 
   4222   static bool classof(const Stmt *T) {
   4223     return T->getStmtClass() == CoawaitExprClass;
   4224   }
   4225 };
   4226 
   4227 /// \brief Represents a 'co_yield' expression.
   4228 class CoyieldExpr : public CoroutineSuspendExpr {
   4229   friend class ASTStmtReader;
   4230 public:
   4231   CoyieldExpr(SourceLocation CoyieldLoc, Expr *Operand, Expr *Ready,
   4232               Expr *Suspend, Expr *Resume)
   4233       : CoroutineSuspendExpr(CoyieldExprClass, CoyieldLoc, Operand, Ready,
   4234                              Suspend, Resume) {}
   4235   CoyieldExpr(SourceLocation CoyieldLoc, QualType Ty, Expr *Operand)
   4236       : CoroutineSuspendExpr(CoyieldExprClass, CoyieldLoc, Ty, Operand) {}
   4237   CoyieldExpr(EmptyShell Empty)
   4238       : CoroutineSuspendExpr(CoyieldExprClass, Empty) {}
   4239 
   4240   Expr *getOperand() const {
   4241     // FIXME: Dig out the actual operand or store it.
   4242     return getCommonExpr();
   4243   }
   4244 
   4245   static bool classof(const Stmt *T) {
   4246     return T->getStmtClass() == CoyieldExprClass;
   4247   }
   4248 };
   4249 
   4250 }  // end namespace clang
   4251 
   4252 #endif
   4253