Home | History | Annotate | Download | only in AST
      1 //===--- Expr.h - Classes for representing expressions ----------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 //  This file defines the Expr interface and subclasses.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_CLANG_AST_EXPR_H
     15 #define LLVM_CLANG_AST_EXPR_H
     16 
     17 #include "clang/AST/APValue.h"
     18 #include "clang/AST/ASTVector.h"
     19 #include "clang/AST/Decl.h"
     20 #include "clang/AST/DeclAccessPair.h"
     21 #include "clang/AST/OperationKinds.h"
     22 #include "clang/AST/Stmt.h"
     23 #include "clang/AST/TemplateBase.h"
     24 #include "clang/AST/Type.h"
     25 #include "clang/Basic/CharInfo.h"
     26 #include "clang/Basic/LangOptions.h"
     27 #include "clang/Basic/TypeTraits.h"
     28 #include "llvm/ADT/APFloat.h"
     29 #include "llvm/ADT/APSInt.h"
     30 #include "llvm/ADT/SmallVector.h"
     31 #include "llvm/ADT/StringRef.h"
     32 #include "llvm/Support/AtomicOrdering.h"
     33 #include "llvm/Support/Compiler.h"
     34 
     35 namespace clang {
     36   class APValue;
     37   class ASTContext;
     38   class BlockDecl;
     39   class CXXBaseSpecifier;
     40   class CXXMemberCallExpr;
     41   class CXXOperatorCallExpr;
     42   class CastExpr;
     43   class Decl;
     44   class IdentifierInfo;
     45   class MaterializeTemporaryExpr;
     46   class NamedDecl;
     47   class ObjCPropertyRefExpr;
     48   class OpaqueValueExpr;
     49   class ParmVarDecl;
     50   class StringLiteral;
     51   class TargetInfo;
     52   class ValueDecl;
     53 
     54 /// \brief A simple array of base specifiers.
     55 typedef SmallVector<CXXBaseSpecifier*, 4> CXXCastPath;
     56 
     57 /// \brief An adjustment to be made to the temporary created when emitting a
     58 /// reference binding, which accesses a particular subobject of that temporary.
     59 struct SubobjectAdjustment {
     60   enum {
     61     DerivedToBaseAdjustment,
     62     FieldAdjustment,
     63     MemberPointerAdjustment
     64   } Kind;
     65 
     66   struct DTB {
     67     const CastExpr *BasePath;
     68     const CXXRecordDecl *DerivedClass;
     69   };
     70 
     71   struct P {
     72     const MemberPointerType *MPT;
     73     Expr *RHS;
     74   };
     75 
     76   union {
     77     struct DTB DerivedToBase;
     78     FieldDecl *Field;
     79     struct P Ptr;
     80   };
     81 
     82   SubobjectAdjustment(const CastExpr *BasePath,
     83                       const CXXRecordDecl *DerivedClass)
     84     : Kind(DerivedToBaseAdjustment) {
     85     DerivedToBase.BasePath = BasePath;
     86     DerivedToBase.DerivedClass = DerivedClass;
     87   }
     88 
     89   SubobjectAdjustment(FieldDecl *Field)
     90     : Kind(FieldAdjustment) {
     91     this->Field = Field;
     92   }
     93 
     94   SubobjectAdjustment(const MemberPointerType *MPT, Expr *RHS)
     95     : Kind(MemberPointerAdjustment) {
     96     this->Ptr.MPT = MPT;
     97     this->Ptr.RHS = RHS;
     98   }
     99 };
    100 
    101 /// Expr - This represents one expression.  Note that Expr's are subclasses of
    102 /// Stmt.  This allows an expression to be transparently used any place a Stmt
    103 /// is required.
    104 ///
    105 class Expr : public Stmt {
    106   QualType TR;
    107 
    108 protected:
    109   Expr(StmtClass SC, QualType T, ExprValueKind VK, ExprObjectKind OK,
    110        bool TD, bool VD, bool ID, bool ContainsUnexpandedParameterPack)
    111     : Stmt(SC)
    112   {
    113     ExprBits.TypeDependent = TD;
    114     ExprBits.ValueDependent = VD;
    115     ExprBits.InstantiationDependent = ID;
    116     ExprBits.ValueKind = VK;
    117     ExprBits.ObjectKind = OK;
    118     ExprBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack;
    119     setType(T);
    120   }
    121 
    122   /// \brief Construct an empty expression.
    123   explicit Expr(StmtClass SC, EmptyShell) : Stmt(SC) { }
    124 
    125 public:
    126   QualType getType() const { return TR; }
    127   void setType(QualType t) {
    128     // In C++, the type of an expression is always adjusted so that it
    129     // will not have reference type (C++ [expr]p6). Use
    130     // QualType::getNonReferenceType() to retrieve the non-reference
    131     // type. Additionally, inspect Expr::isLvalue to determine whether
    132     // an expression that is adjusted in this manner should be
    133     // considered an lvalue.
    134     assert((t.isNull() || !t->isReferenceType()) &&
    135            "Expressions can't have reference type");
    136 
    137     TR = t;
    138   }
    139 
    140   /// isValueDependent - Determines whether this expression is
    141   /// value-dependent (C++ [temp.dep.constexpr]). For example, the
    142   /// array bound of "Chars" in the following example is
    143   /// value-dependent.
    144   /// @code
    145   /// template<int Size, char (&Chars)[Size]> struct meta_string;
    146   /// @endcode
    147   bool isValueDependent() const { return ExprBits.ValueDependent; }
    148 
    149   /// \brief Set whether this expression is value-dependent or not.
    150   void setValueDependent(bool VD) {
    151     ExprBits.ValueDependent = VD;
    152   }
    153 
    154   /// isTypeDependent - Determines whether this expression is
    155   /// type-dependent (C++ [temp.dep.expr]), which means that its type
    156   /// could change from one template instantiation to the next. For
    157   /// example, the expressions "x" and "x + y" are type-dependent in
    158   /// the following code, but "y" is not type-dependent:
    159   /// @code
    160   /// template<typename T>
    161   /// void add(T x, int y) {
    162   ///   x + y;
    163   /// }
    164   /// @endcode
    165   bool isTypeDependent() const { return ExprBits.TypeDependent; }
    166 
    167   /// \brief Set whether this expression is type-dependent or not.
    168   void setTypeDependent(bool TD) {
    169     ExprBits.TypeDependent = TD;
    170   }
    171 
    172   /// \brief Whether this expression is instantiation-dependent, meaning that
    173   /// it depends in some way on a template parameter, even if neither its type
    174   /// nor (constant) value can change due to the template instantiation.
    175   ///
    176   /// In the following example, the expression \c sizeof(sizeof(T() + T())) is
    177   /// instantiation-dependent (since it involves a template parameter \c T), but
    178   /// is neither type- nor value-dependent, since the type of the inner
    179   /// \c sizeof is known (\c std::size_t) and therefore the size of the outer
    180   /// \c sizeof is known.
    181   ///
    182   /// \code
    183   /// template<typename T>
    184   /// void f(T x, T y) {
    185   ///   sizeof(sizeof(T() + T());
    186   /// }
    187   /// \endcode
    188   ///
    189   bool isInstantiationDependent() const {
    190     return ExprBits.InstantiationDependent;
    191   }
    192 
    193   /// \brief Set whether this expression is instantiation-dependent or not.
    194   void setInstantiationDependent(bool ID) {
    195     ExprBits.InstantiationDependent = ID;
    196   }
    197 
    198   /// \brief Whether this expression contains an unexpanded parameter
    199   /// pack (for C++11 variadic templates).
    200   ///
    201   /// Given the following function template:
    202   ///
    203   /// \code
    204   /// template<typename F, typename ...Types>
    205   /// void forward(const F &f, Types &&...args) {
    206   ///   f(static_cast<Types&&>(args)...);
    207   /// }
    208   /// \endcode
    209   ///
    210   /// The expressions \c args and \c static_cast<Types&&>(args) both
    211   /// contain parameter packs.
    212   bool containsUnexpandedParameterPack() const {
    213     return ExprBits.ContainsUnexpandedParameterPack;
    214   }
    215 
    216   /// \brief Set the bit that describes whether this expression
    217   /// contains an unexpanded parameter pack.
    218   void setContainsUnexpandedParameterPack(bool PP = true) {
    219     ExprBits.ContainsUnexpandedParameterPack = PP;
    220   }
    221 
    222   /// getExprLoc - Return the preferred location for the arrow when diagnosing
    223   /// a problem with a generic expression.
    224   SourceLocation getExprLoc() const LLVM_READONLY;
    225 
    226   /// isUnusedResultAWarning - Return true if this immediate expression should
    227   /// be warned about if the result is unused.  If so, fill in expr, location,
    228   /// and ranges with expr to warn on and source locations/ranges appropriate
    229   /// for a warning.
    230   bool isUnusedResultAWarning(const Expr *&WarnExpr, SourceLocation &Loc,
    231                               SourceRange &R1, SourceRange &R2,
    232                               ASTContext &Ctx) const;
    233 
    234   /// isLValue - True if this expression is an "l-value" according to
    235   /// the rules of the current language.  C and C++ give somewhat
    236   /// different rules for this concept, but in general, the result of
    237   /// an l-value expression identifies a specific object whereas the
    238   /// result of an r-value expression is a value detached from any
    239   /// specific storage.
    240   ///
    241   /// C++11 divides the concept of "r-value" into pure r-values
    242   /// ("pr-values") and so-called expiring values ("x-values"), which
    243   /// identify specific objects that can be safely cannibalized for
    244   /// their resources.  This is an unfortunate abuse of terminology on
    245   /// the part of the C++ committee.  In Clang, when we say "r-value",
    246   /// we generally mean a pr-value.
    247   bool isLValue() const { return getValueKind() == VK_LValue; }
    248   bool isRValue() const { return getValueKind() == VK_RValue; }
    249   bool isXValue() const { return getValueKind() == VK_XValue; }
    250   bool isGLValue() const { return getValueKind() != VK_RValue; }
    251 
    252   enum LValueClassification {
    253     LV_Valid,
    254     LV_NotObjectType,
    255     LV_IncompleteVoidType,
    256     LV_DuplicateVectorComponents,
    257     LV_InvalidExpression,
    258     LV_InvalidMessageExpression,
    259     LV_MemberFunction,
    260     LV_SubObjCPropertySetting,
    261     LV_ClassTemporary,
    262     LV_ArrayTemporary
    263   };
    264   /// Reasons why an expression might not be an l-value.
    265   LValueClassification ClassifyLValue(ASTContext &Ctx) const;
    266 
    267   enum isModifiableLvalueResult {
    268     MLV_Valid,
    269     MLV_NotObjectType,
    270     MLV_IncompleteVoidType,
    271     MLV_DuplicateVectorComponents,
    272     MLV_InvalidExpression,
    273     MLV_LValueCast,           // Specialized form of MLV_InvalidExpression.
    274     MLV_IncompleteType,
    275     MLV_ConstQualified,
    276     MLV_ConstAddrSpace,
    277     MLV_ArrayType,
    278     MLV_NoSetterProperty,
    279     MLV_MemberFunction,
    280     MLV_SubObjCPropertySetting,
    281     MLV_InvalidMessageExpression,
    282     MLV_ClassTemporary,
    283     MLV_ArrayTemporary
    284   };
    285   /// isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type,
    286   /// does not have an incomplete type, does not have a const-qualified type,
    287   /// and if it is a structure or union, does not have any member (including,
    288   /// recursively, any member or element of all contained aggregates or unions)
    289   /// with a const-qualified type.
    290   ///
    291   /// \param Loc [in,out] - A source location which *may* be filled
    292   /// in with the location of the expression making this a
    293   /// non-modifiable lvalue, if specified.
    294   isModifiableLvalueResult
    295   isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc = nullptr) const;
    296 
    297   /// \brief The return type of classify(). Represents the C++11 expression
    298   ///        taxonomy.
    299   class Classification {
    300   public:
    301     /// \brief The various classification results. Most of these mean prvalue.
    302     enum Kinds {
    303       CL_LValue,
    304       CL_XValue,
    305       CL_Function, // Functions cannot be lvalues in C.
    306       CL_Void, // Void cannot be an lvalue in C.
    307       CL_AddressableVoid, // Void expression whose address can be taken in C.
    308       CL_DuplicateVectorComponents, // A vector shuffle with dupes.
    309       CL_MemberFunction, // An expression referring to a member function
    310       CL_SubObjCPropertySetting,
    311       CL_ClassTemporary, // A temporary of class type, or subobject thereof.
    312       CL_ArrayTemporary, // A temporary of array type.
    313       CL_ObjCMessageRValue, // ObjC message is an rvalue
    314       CL_PRValue // A prvalue for any other reason, of any other type
    315     };
    316     /// \brief The results of modification testing.
    317     enum ModifiableType {
    318       CM_Untested, // testModifiable was false.
    319       CM_Modifiable,
    320       CM_RValue, // Not modifiable because it's an rvalue
    321       CM_Function, // Not modifiable because it's a function; C++ only
    322       CM_LValueCast, // Same as CM_RValue, but indicates GCC cast-as-lvalue ext
    323       CM_NoSetterProperty,// Implicit assignment to ObjC property without setter
    324       CM_ConstQualified,
    325       CM_ConstAddrSpace,
    326       CM_ArrayType,
    327       CM_IncompleteType
    328     };
    329 
    330   private:
    331     friend class Expr;
    332 
    333     unsigned short Kind;
    334     unsigned short Modifiable;
    335 
    336     explicit Classification(Kinds k, ModifiableType m)
    337       : Kind(k), Modifiable(m)
    338     {}
    339 
    340   public:
    341     Classification() {}
    342 
    343     Kinds getKind() const { return static_cast<Kinds>(Kind); }
    344     ModifiableType getModifiable() const {
    345       assert(Modifiable != CM_Untested && "Did not test for modifiability.");
    346       return static_cast<ModifiableType>(Modifiable);
    347     }
    348     bool isLValue() const { return Kind == CL_LValue; }
    349     bool isXValue() const { return Kind == CL_XValue; }
    350     bool isGLValue() const { return Kind <= CL_XValue; }
    351     bool isPRValue() const { return Kind >= CL_Function; }
    352     bool isRValue() const { return Kind >= CL_XValue; }
    353     bool isModifiable() const { return getModifiable() == CM_Modifiable; }
    354 
    355     /// \brief Create a simple, modifiably lvalue
    356     static Classification makeSimpleLValue() {
    357       return Classification(CL_LValue, CM_Modifiable);
    358     }
    359 
    360   };
    361   /// \brief Classify - Classify this expression according to the C++11
    362   ///        expression taxonomy.
    363   ///
    364   /// C++11 defines ([basic.lval]) a new taxonomy of expressions to replace the
    365   /// old lvalue vs rvalue. This function determines the type of expression this
    366   /// is. There are three expression types:
    367   /// - lvalues are classical lvalues as in C++03.
    368   /// - prvalues are equivalent to rvalues in C++03.
    369   /// - xvalues are expressions yielding unnamed rvalue references, e.g. a
    370   ///   function returning an rvalue reference.
    371   /// lvalues and xvalues are collectively referred to as glvalues, while
    372   /// prvalues and xvalues together form rvalues.
    373   Classification Classify(ASTContext &Ctx) const {
    374     return ClassifyImpl(Ctx, nullptr);
    375   }
    376 
    377   /// \brief ClassifyModifiable - Classify this expression according to the
    378   ///        C++11 expression taxonomy, and see if it is valid on the left side
    379   ///        of an assignment.
    380   ///
    381   /// This function extends classify in that it also tests whether the
    382   /// expression is modifiable (C99 6.3.2.1p1).
    383   /// \param Loc A source location that might be filled with a relevant location
    384   ///            if the expression is not modifiable.
    385   Classification ClassifyModifiable(ASTContext &Ctx, SourceLocation &Loc) const{
    386     return ClassifyImpl(Ctx, &Loc);
    387   }
    388 
    389   /// getValueKindForType - Given a formal return or parameter type,
    390   /// give its value kind.
    391   static ExprValueKind getValueKindForType(QualType T) {
    392     if (const ReferenceType *RT = T->getAs<ReferenceType>())
    393       return (isa<LValueReferenceType>(RT)
    394                 ? VK_LValue
    395                 : (RT->getPointeeType()->isFunctionType()
    396                      ? VK_LValue : VK_XValue));
    397     return VK_RValue;
    398   }
    399 
    400   /// getValueKind - The value kind that this expression produces.
    401   ExprValueKind getValueKind() const {
    402     return static_cast<ExprValueKind>(ExprBits.ValueKind);
    403   }
    404 
    405   /// getObjectKind - The object kind that this expression produces.
    406   /// Object kinds are meaningful only for expressions that yield an
    407   /// l-value or x-value.
    408   ExprObjectKind getObjectKind() const {
    409     return static_cast<ExprObjectKind>(ExprBits.ObjectKind);
    410   }
    411 
    412   bool isOrdinaryOrBitFieldObject() const {
    413     ExprObjectKind OK = getObjectKind();
    414     return (OK == OK_Ordinary || OK == OK_BitField);
    415   }
    416 
    417   /// setValueKind - Set the value kind produced by this expression.
    418   void setValueKind(ExprValueKind Cat) { ExprBits.ValueKind = Cat; }
    419 
    420   /// setObjectKind - Set the object kind produced by this expression.
    421   void setObjectKind(ExprObjectKind Cat) { ExprBits.ObjectKind = Cat; }
    422 
    423 private:
    424   Classification ClassifyImpl(ASTContext &Ctx, SourceLocation *Loc) const;
    425 
    426 public:
    427 
    428   /// \brief Returns true if this expression is a gl-value that
    429   /// potentially refers to a bit-field.
    430   ///
    431   /// In C++, whether a gl-value refers to a bitfield is essentially
    432   /// an aspect of the value-kind type system.
    433   bool refersToBitField() const { return getObjectKind() == OK_BitField; }
    434 
    435   /// \brief If this expression refers to a bit-field, retrieve the
    436   /// declaration of that bit-field.
    437   ///
    438   /// Note that this returns a non-null pointer in subtly different
    439   /// places than refersToBitField returns true.  In particular, this can
    440   /// return a non-null pointer even for r-values loaded from
    441   /// bit-fields, but it will return null for a conditional bit-field.
    442   FieldDecl *getSourceBitField();
    443 
    444   const FieldDecl *getSourceBitField() const {
    445     return const_cast<Expr*>(this)->getSourceBitField();
    446   }
    447 
    448   /// \brief If this expression is an l-value for an Objective C
    449   /// property, find the underlying property reference expression.
    450   const ObjCPropertyRefExpr *getObjCProperty() const;
    451 
    452   /// \brief Check if this expression is the ObjC 'self' implicit parameter.
    453   bool isObjCSelfExpr() const;
    454 
    455   /// \brief Returns whether this expression refers to a vector element.
    456   bool refersToVectorElement() const;
    457 
    458   /// \brief Returns whether this expression refers to a global register
    459   /// variable.
    460   bool refersToGlobalRegisterVar() const;
    461 
    462   /// \brief Returns whether this expression has a placeholder type.
    463   bool hasPlaceholderType() const {
    464     return getType()->isPlaceholderType();
    465   }
    466 
    467   /// \brief Returns whether this expression has a specific placeholder type.
    468   bool hasPlaceholderType(BuiltinType::Kind K) const {
    469     assert(BuiltinType::isPlaceholderTypeKind(K));
    470     if (const BuiltinType *BT = dyn_cast<BuiltinType>(getType()))
    471       return BT->getKind() == K;
    472     return false;
    473   }
    474 
    475   /// isKnownToHaveBooleanValue - Return true if this is an integer expression
    476   /// that is known to return 0 or 1.  This happens for _Bool/bool expressions
    477   /// but also int expressions which are produced by things like comparisons in
    478   /// C.
    479   bool isKnownToHaveBooleanValue() const;
    480 
    481   /// isIntegerConstantExpr - Return true if this expression is a valid integer
    482   /// constant expression, and, if so, return its value in Result.  If not a
    483   /// valid i-c-e, return false and fill in Loc (if specified) with the location
    484   /// of the invalid expression.
    485   ///
    486   /// Note: This does not perform the implicit conversions required by C++11
    487   /// [expr.const]p5.
    488   bool isIntegerConstantExpr(llvm::APSInt &Result, const ASTContext &Ctx,
    489                              SourceLocation *Loc = nullptr,
    490                              bool isEvaluated = true) const;
    491   bool isIntegerConstantExpr(const ASTContext &Ctx,
    492                              SourceLocation *Loc = nullptr) const;
    493 
    494   /// isCXX98IntegralConstantExpr - Return true if this expression is an
    495   /// integral constant expression in C++98. Can only be used in C++.
    496   bool isCXX98IntegralConstantExpr(const ASTContext &Ctx) const;
    497 
    498   /// isCXX11ConstantExpr - Return true if this expression is a constant
    499   /// expression in C++11. Can only be used in C++.
    500   ///
    501   /// Note: This does not perform the implicit conversions required by C++11
    502   /// [expr.const]p5.
    503   bool isCXX11ConstantExpr(const ASTContext &Ctx, APValue *Result = nullptr,
    504                            SourceLocation *Loc = nullptr) const;
    505 
    506   /// isPotentialConstantExpr - Return true if this function's definition
    507   /// might be usable in a constant expression in C++11, if it were marked
    508   /// constexpr. Return false if the function can never produce a constant
    509   /// expression, along with diagnostics describing why not.
    510   static bool isPotentialConstantExpr(const FunctionDecl *FD,
    511                                       SmallVectorImpl<
    512                                         PartialDiagnosticAt> &Diags);
    513 
    514   /// isPotentialConstantExprUnevaluted - Return true if this expression might
    515   /// be usable in a constant expression in C++11 in an unevaluated context, if
    516   /// it were in function FD marked constexpr. Return false if the function can
    517   /// never produce a constant expression, along with diagnostics describing
    518   /// why not.
    519   static bool isPotentialConstantExprUnevaluated(Expr *E,
    520                                                  const FunctionDecl *FD,
    521                                                  SmallVectorImpl<
    522                                                    PartialDiagnosticAt> &Diags);
    523 
    524   /// isConstantInitializer - Returns true if this expression can be emitted to
    525   /// IR as a constant, and thus can be used as a constant initializer in C.
    526   /// If this expression is not constant and Culprit is non-null,
    527   /// it is used to store the address of first non constant expr.
    528   bool isConstantInitializer(ASTContext &Ctx, bool ForRef,
    529                              const Expr **Culprit = nullptr) const;
    530 
    531   /// EvalStatus is a struct with detailed info about an evaluation in progress.
    532   struct EvalStatus {
    533     /// \brief Whether the evaluated expression has side effects.
    534     /// For example, (f() && 0) can be folded, but it still has side effects.
    535     bool HasSideEffects;
    536 
    537     /// \brief Whether the evaluation hit undefined behavior.
    538     /// For example, 1.0 / 0.0 can be folded to Inf, but has undefined behavior.
    539     /// Likewise, INT_MAX + 1 can be folded to INT_MIN, but has UB.
    540     bool HasUndefinedBehavior;
    541 
    542     /// Diag - If this is non-null, it will be filled in with a stack of notes
    543     /// indicating why evaluation failed (or why it failed to produce a constant
    544     /// expression).
    545     /// If the expression is unfoldable, the notes will indicate why it's not
    546     /// foldable. If the expression is foldable, but not a constant expression,
    547     /// the notes will describes why it isn't a constant expression. If the
    548     /// expression *is* a constant expression, no notes will be produced.
    549     SmallVectorImpl<PartialDiagnosticAt> *Diag;
    550 
    551     EvalStatus()
    552         : HasSideEffects(false), HasUndefinedBehavior(false), Diag(nullptr) {}
    553 
    554     // hasSideEffects - Return true if the evaluated expression has
    555     // side effects.
    556     bool hasSideEffects() const {
    557       return HasSideEffects;
    558     }
    559   };
    560 
    561   /// EvalResult is a struct with detailed info about an evaluated expression.
    562   struct EvalResult : EvalStatus {
    563     /// Val - This is the value the expression can be folded to.
    564     APValue Val;
    565 
    566     // isGlobalLValue - Return true if the evaluated lvalue expression
    567     // is global.
    568     bool isGlobalLValue() const;
    569   };
    570 
    571   /// EvaluateAsRValue - Return true if this is a constant which we can fold to
    572   /// an rvalue using any crazy technique (that has nothing to do with language
    573   /// standards) that we want to, even if the expression has side-effects. If
    574   /// this function returns true, it returns the folded constant in Result. If
    575   /// the expression is a glvalue, an lvalue-to-rvalue conversion will be
    576   /// applied.
    577   bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx) const;
    578 
    579   /// EvaluateAsBooleanCondition - Return true if this is a constant
    580   /// which we we can fold and convert to a boolean condition using
    581   /// any crazy technique that we want to, even if the expression has
    582   /// side-effects.
    583   bool EvaluateAsBooleanCondition(bool &Result, const ASTContext &Ctx) const;
    584 
    585   enum SideEffectsKind {
    586     SE_NoSideEffects,          ///< Strictly evaluate the expression.
    587     SE_AllowUndefinedBehavior, ///< Allow UB that we can give a value, but not
    588                                ///< arbitrary unmodeled side effects.
    589     SE_AllowSideEffects        ///< Allow any unmodeled side effect.
    590   };
    591 
    592   /// EvaluateAsInt - Return true if this is a constant which we can fold and
    593   /// convert to an integer, using any crazy technique that we want to.
    594   bool EvaluateAsInt(llvm::APSInt &Result, const ASTContext &Ctx,
    595                      SideEffectsKind AllowSideEffects = SE_NoSideEffects) const;
    596 
    597   /// EvaluateAsFloat - Return true if this is a constant which we can fold and
    598   /// convert to a floating point value, using any crazy technique that we
    599   /// want to.
    600   bool
    601   EvaluateAsFloat(llvm::APFloat &Result, const ASTContext &Ctx,
    602                   SideEffectsKind AllowSideEffects = SE_NoSideEffects) const;
    603 
    604   /// isEvaluatable - Call EvaluateAsRValue to see if this expression can be
    605   /// constant folded without side-effects, but discard the result.
    606   bool isEvaluatable(const ASTContext &Ctx,
    607                      SideEffectsKind AllowSideEffects = SE_NoSideEffects) const;
    608 
    609   /// HasSideEffects - This routine returns true for all those expressions
    610   /// which have any effect other than producing a value. Example is a function
    611   /// call, volatile variable read, or throwing an exception. If
    612   /// IncludePossibleEffects is false, this call treats certain expressions with
    613   /// potential side effects (such as function call-like expressions,
    614   /// instantiation-dependent expressions, or invocations from a macro) as not
    615   /// having side effects.
    616   bool HasSideEffects(const ASTContext &Ctx,
    617                       bool IncludePossibleEffects = true) const;
    618 
    619   /// \brief Determine whether this expression involves a call to any function
    620   /// that is not trivial.
    621   bool hasNonTrivialCall(const ASTContext &Ctx) const;
    622 
    623   /// EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded
    624   /// integer. This must be called on an expression that constant folds to an
    625   /// integer.
    626   llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx,
    627                     SmallVectorImpl<PartialDiagnosticAt> *Diag = nullptr) const;
    628 
    629   void EvaluateForOverflow(const ASTContext &Ctx) const;
    630 
    631   /// EvaluateAsLValue - Evaluate an expression to see if we can fold it to an
    632   /// lvalue with link time known address, with no side-effects.
    633   bool EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx) const;
    634 
    635   /// EvaluateAsInitializer - Evaluate an expression as if it were the
    636   /// initializer of the given declaration. Returns true if the initializer
    637   /// can be folded to a constant, and produces any relevant notes. In C++11,
    638   /// notes will be produced if the expression is not a constant expression.
    639   bool EvaluateAsInitializer(APValue &Result, const ASTContext &Ctx,
    640                              const VarDecl *VD,
    641                              SmallVectorImpl<PartialDiagnosticAt> &Notes) const;
    642 
    643   /// EvaluateWithSubstitution - Evaluate an expression as if from the context
    644   /// of a call to the given function with the given arguments, inside an
    645   /// unevaluated context. Returns true if the expression could be folded to a
    646   /// constant.
    647   bool EvaluateWithSubstitution(APValue &Value, ASTContext &Ctx,
    648                                 const FunctionDecl *Callee,
    649                                 ArrayRef<const Expr*> Args) const;
    650 
    651   /// \brief If the current Expr is a pointer, this will try to statically
    652   /// determine the number of bytes available where the pointer is pointing.
    653   /// Returns true if all of the above holds and we were able to figure out the
    654   /// size, false otherwise.
    655   ///
    656   /// \param Type - How to evaluate the size of the Expr, as defined by the
    657   /// "type" parameter of __builtin_object_size
    658   bool tryEvaluateObjectSize(uint64_t &Result, ASTContext &Ctx,
    659                              unsigned Type) const;
    660 
    661   /// \brief Enumeration used to describe the kind of Null pointer constant
    662   /// returned from \c isNullPointerConstant().
    663   enum NullPointerConstantKind {
    664     /// \brief Expression is not a Null pointer constant.
    665     NPCK_NotNull = 0,
    666 
    667     /// \brief Expression is a Null pointer constant built from a zero integer
    668     /// expression that is not a simple, possibly parenthesized, zero literal.
    669     /// C++ Core Issue 903 will classify these expressions as "not pointers"
    670     /// once it is adopted.
    671     /// http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#903
    672     NPCK_ZeroExpression,
    673 
    674     /// \brief Expression is a Null pointer constant built from a literal zero.
    675     NPCK_ZeroLiteral,
    676 
    677     /// \brief Expression is a C++11 nullptr.
    678     NPCK_CXX11_nullptr,
    679 
    680     /// \brief Expression is a GNU-style __null constant.
    681     NPCK_GNUNull
    682   };
    683 
    684   /// \brief Enumeration used to describe how \c isNullPointerConstant()
    685   /// should cope with value-dependent expressions.
    686   enum NullPointerConstantValueDependence {
    687     /// \brief Specifies that the expression should never be value-dependent.
    688     NPC_NeverValueDependent = 0,
    689 
    690     /// \brief Specifies that a value-dependent expression of integral or
    691     /// dependent type should be considered a null pointer constant.
    692     NPC_ValueDependentIsNull,
    693 
    694     /// \brief Specifies that a value-dependent expression should be considered
    695     /// to never be a null pointer constant.
    696     NPC_ValueDependentIsNotNull
    697   };
    698 
    699   /// isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to
    700   /// a Null pointer constant. The return value can further distinguish the
    701   /// kind of NULL pointer constant that was detected.
    702   NullPointerConstantKind isNullPointerConstant(
    703       ASTContext &Ctx,
    704       NullPointerConstantValueDependence NPC) const;
    705 
    706   /// isOBJCGCCandidate - Return true if this expression may be used in a read/
    707   /// write barrier.
    708   bool isOBJCGCCandidate(ASTContext &Ctx) const;
    709 
    710   /// \brief Returns true if this expression is a bound member function.
    711   bool isBoundMemberFunction(ASTContext &Ctx) const;
    712 
    713   /// \brief Given an expression of bound-member type, find the type
    714   /// of the member.  Returns null if this is an *overloaded* bound
    715   /// member expression.
    716   static QualType findBoundMemberType(const Expr *expr);
    717 
    718   /// IgnoreImpCasts - Skip past any implicit casts which might
    719   /// surround this expression.  Only skips ImplicitCastExprs.
    720   Expr *IgnoreImpCasts() LLVM_READONLY;
    721 
    722   /// IgnoreImplicit - Skip past any implicit AST nodes which might
    723   /// surround this expression.
    724   Expr *IgnoreImplicit() LLVM_READONLY {
    725     return cast<Expr>(Stmt::IgnoreImplicit());
    726   }
    727 
    728   const Expr *IgnoreImplicit() const LLVM_READONLY {
    729     return const_cast<Expr*>(this)->IgnoreImplicit();
    730   }
    731 
    732   /// IgnoreParens - Ignore parentheses.  If this Expr is a ParenExpr, return
    733   ///  its subexpression.  If that subexpression is also a ParenExpr,
    734   ///  then this method recursively returns its subexpression, and so forth.
    735   ///  Otherwise, the method returns the current Expr.
    736   Expr *IgnoreParens() LLVM_READONLY;
    737 
    738   /// IgnoreParenCasts - Ignore parentheses and casts.  Strip off any ParenExpr
    739   /// or CastExprs, returning their operand.
    740   Expr *IgnoreParenCasts() LLVM_READONLY;
    741 
    742   /// Ignore casts.  Strip off any CastExprs, returning their operand.
    743   Expr *IgnoreCasts() LLVM_READONLY;
    744 
    745   /// IgnoreParenImpCasts - Ignore parentheses and implicit casts.  Strip off
    746   /// any ParenExpr or ImplicitCastExprs, returning their operand.
    747   Expr *IgnoreParenImpCasts() LLVM_READONLY;
    748 
    749   /// IgnoreConversionOperator - Ignore conversion operator. If this Expr is a
    750   /// call to a conversion operator, return the argument.
    751   Expr *IgnoreConversionOperator() LLVM_READONLY;
    752 
    753   const Expr *IgnoreConversionOperator() const LLVM_READONLY {
    754     return const_cast<Expr*>(this)->IgnoreConversionOperator();
    755   }
    756 
    757   const Expr *IgnoreParenImpCasts() const LLVM_READONLY {
    758     return const_cast<Expr*>(this)->IgnoreParenImpCasts();
    759   }
    760 
    761   /// Ignore parentheses and lvalue casts.  Strip off any ParenExpr and
    762   /// CastExprs that represent lvalue casts, returning their operand.
    763   Expr *IgnoreParenLValueCasts() LLVM_READONLY;
    764 
    765   const Expr *IgnoreParenLValueCasts() const LLVM_READONLY {
    766     return const_cast<Expr*>(this)->IgnoreParenLValueCasts();
    767   }
    768 
    769   /// IgnoreParenNoopCasts - Ignore parentheses and casts that do not change the
    770   /// value (including ptr->int casts of the same size).  Strip off any
    771   /// ParenExpr or CastExprs, returning their operand.
    772   Expr *IgnoreParenNoopCasts(ASTContext &Ctx) LLVM_READONLY;
    773 
    774   /// Ignore parentheses and derived-to-base casts.
    775   Expr *ignoreParenBaseCasts() LLVM_READONLY;
    776 
    777   const Expr *ignoreParenBaseCasts() const LLVM_READONLY {
    778     return const_cast<Expr*>(this)->ignoreParenBaseCasts();
    779   }
    780 
    781   /// \brief Determine whether this expression is a default function argument.
    782   ///
    783   /// Default arguments are implicitly generated in the abstract syntax tree
    784   /// by semantic analysis for function calls, object constructions, etc. in
    785   /// C++. Default arguments are represented by \c CXXDefaultArgExpr nodes;
    786   /// this routine also looks through any implicit casts to determine whether
    787   /// the expression is a default argument.
    788   bool isDefaultArgument() const;
    789 
    790   /// \brief Determine whether the result of this expression is a
    791   /// temporary object of the given class type.
    792   bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const;
    793 
    794   /// \brief Whether this expression is an implicit reference to 'this' in C++.
    795   bool isImplicitCXXThis() const;
    796 
    797   const Expr *IgnoreImpCasts() const LLVM_READONLY {
    798     return const_cast<Expr*>(this)->IgnoreImpCasts();
    799   }
    800   const Expr *IgnoreParens() const LLVM_READONLY {
    801     return const_cast<Expr*>(this)->IgnoreParens();
    802   }
    803   const Expr *IgnoreParenCasts() const LLVM_READONLY {
    804     return const_cast<Expr*>(this)->IgnoreParenCasts();
    805   }
    806   /// Strip off casts, but keep parentheses.
    807   const Expr *IgnoreCasts() const LLVM_READONLY {
    808     return const_cast<Expr*>(this)->IgnoreCasts();
    809   }
    810 
    811   const Expr *IgnoreParenNoopCasts(ASTContext &Ctx) const LLVM_READONLY {
    812     return const_cast<Expr*>(this)->IgnoreParenNoopCasts(Ctx);
    813   }
    814 
    815   static bool hasAnyTypeDependentArguments(ArrayRef<Expr *> Exprs);
    816 
    817   /// \brief For an expression of class type or pointer to class type,
    818   /// return the most derived class decl the expression is known to refer to.
    819   ///
    820   /// If this expression is a cast, this method looks through it to find the
    821   /// most derived decl that can be inferred from the expression.
    822   /// This is valid because derived-to-base conversions have undefined
    823   /// behavior if the object isn't dynamically of the derived type.
    824   const CXXRecordDecl *getBestDynamicClassType() const;
    825 
    826   /// Walk outwards from an expression we want to bind a reference to and
    827   /// find the expression whose lifetime needs to be extended. Record
    828   /// the LHSs of comma expressions and adjustments needed along the path.
    829   const Expr *skipRValueSubobjectAdjustments(
    830       SmallVectorImpl<const Expr *> &CommaLHS,
    831       SmallVectorImpl<SubobjectAdjustment> &Adjustments) const;
    832 
    833   static bool classof(const Stmt *T) {
    834     return T->getStmtClass() >= firstExprConstant &&
    835            T->getStmtClass() <= lastExprConstant;
    836   }
    837 };
    838 
    839 //===----------------------------------------------------------------------===//
    840 // Primary Expressions.
    841 //===----------------------------------------------------------------------===//
    842 
    843 /// OpaqueValueExpr - An expression referring to an opaque object of a
    844 /// fixed type and value class.  These don't correspond to concrete
    845 /// syntax; instead they're used to express operations (usually copy
    846 /// operations) on values whose source is generally obvious from
    847 /// context.
    848 class OpaqueValueExpr : public Expr {
    849   friend class ASTStmtReader;
    850   Expr *SourceExpr;
    851   SourceLocation Loc;
    852 
    853 public:
    854   OpaqueValueExpr(SourceLocation Loc, QualType T, ExprValueKind VK,
    855                   ExprObjectKind OK = OK_Ordinary,
    856                   Expr *SourceExpr = nullptr)
    857     : Expr(OpaqueValueExprClass, T, VK, OK,
    858            T->isDependentType() ||
    859            (SourceExpr && SourceExpr->isTypeDependent()),
    860            T->isDependentType() ||
    861            (SourceExpr && SourceExpr->isValueDependent()),
    862            T->isInstantiationDependentType() ||
    863            (SourceExpr && SourceExpr->isInstantiationDependent()),
    864            false),
    865       SourceExpr(SourceExpr), Loc(Loc) {
    866   }
    867 
    868   /// Given an expression which invokes a copy constructor --- i.e.  a
    869   /// CXXConstructExpr, possibly wrapped in an ExprWithCleanups ---
    870   /// find the OpaqueValueExpr that's the source of the construction.
    871   static const OpaqueValueExpr *findInCopyConstruct(const Expr *expr);
    872 
    873   explicit OpaqueValueExpr(EmptyShell Empty)
    874     : Expr(OpaqueValueExprClass, Empty) { }
    875 
    876   /// \brief Retrieve the location of this expression.
    877   SourceLocation getLocation() const { return Loc; }
    878 
    879   SourceLocation getLocStart() const LLVM_READONLY {
    880     return SourceExpr ? SourceExpr->getLocStart() : Loc;
    881   }
    882   SourceLocation getLocEnd() const LLVM_READONLY {
    883     return SourceExpr ? SourceExpr->getLocEnd() : Loc;
    884   }
    885   SourceLocation getExprLoc() const LLVM_READONLY {
    886     if (SourceExpr) return SourceExpr->getExprLoc();
    887     return Loc;
    888   }
    889 
    890   child_range children() {
    891     return child_range(child_iterator(), child_iterator());
    892   }
    893 
    894   /// The source expression of an opaque value expression is the
    895   /// expression which originally generated the value.  This is
    896   /// provided as a convenience for analyses that don't wish to
    897   /// precisely model the execution behavior of the program.
    898   ///
    899   /// The source expression is typically set when building the
    900   /// expression which binds the opaque value expression in the first
    901   /// place.
    902   Expr *getSourceExpr() const { return SourceExpr; }
    903 
    904   static bool classof(const Stmt *T) {
    905     return T->getStmtClass() == OpaqueValueExprClass;
    906   }
    907 };
    908 
    909 /// \brief A reference to a declared variable, function, enum, etc.
    910 /// [C99 6.5.1p2]
    911 ///
    912 /// This encodes all the information about how a declaration is referenced
    913 /// within an expression.
    914 ///
    915 /// There are several optional constructs attached to DeclRefExprs only when
    916 /// they apply in order to conserve memory. These are laid out past the end of
    917 /// the object, and flags in the DeclRefExprBitfield track whether they exist:
    918 ///
    919 ///   DeclRefExprBits.HasQualifier:
    920 ///       Specifies when this declaration reference expression has a C++
    921 ///       nested-name-specifier.
    922 ///   DeclRefExprBits.HasFoundDecl:
    923 ///       Specifies when this declaration reference expression has a record of
    924 ///       a NamedDecl (different from the referenced ValueDecl) which was found
    925 ///       during name lookup and/or overload resolution.
    926 ///   DeclRefExprBits.HasTemplateKWAndArgsInfo:
    927 ///       Specifies when this declaration reference expression has an explicit
    928 ///       C++ template keyword and/or template argument list.
    929 ///   DeclRefExprBits.RefersToEnclosingVariableOrCapture
    930 ///       Specifies when this declaration reference expression (validly)
    931 ///       refers to an enclosed local or a captured variable.
    932 class DeclRefExpr final
    933     : public Expr,
    934       private llvm::TrailingObjects<DeclRefExpr, NestedNameSpecifierLoc,
    935                                     NamedDecl *, ASTTemplateKWAndArgsInfo,
    936                                     TemplateArgumentLoc> {
    937   /// \brief The declaration that we are referencing.
    938   ValueDecl *D;
    939 
    940   /// \brief The location of the declaration name itself.
    941   SourceLocation Loc;
    942 
    943   /// \brief Provides source/type location info for the declaration name
    944   /// embedded in D.
    945   DeclarationNameLoc DNLoc;
    946 
    947   size_t numTrailingObjects(OverloadToken<NestedNameSpecifierLoc>) const {
    948     return hasQualifier() ? 1 : 0;
    949   }
    950 
    951   size_t numTrailingObjects(OverloadToken<NamedDecl *>) const {
    952     return hasFoundDecl() ? 1 : 0;
    953   }
    954 
    955   size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
    956     return hasTemplateKWAndArgsInfo() ? 1 : 0;
    957   }
    958 
    959   /// \brief Test whether there is a distinct FoundDecl attached to the end of
    960   /// this DRE.
    961   bool hasFoundDecl() const { return DeclRefExprBits.HasFoundDecl; }
    962 
    963   DeclRefExpr(const ASTContext &Ctx,
    964               NestedNameSpecifierLoc QualifierLoc,
    965               SourceLocation TemplateKWLoc,
    966               ValueDecl *D, bool RefersToEnlosingVariableOrCapture,
    967               const DeclarationNameInfo &NameInfo,
    968               NamedDecl *FoundD,
    969               const TemplateArgumentListInfo *TemplateArgs,
    970               QualType T, ExprValueKind VK);
    971 
    972   /// \brief Construct an empty declaration reference expression.
    973   explicit DeclRefExpr(EmptyShell Empty)
    974     : Expr(DeclRefExprClass, Empty) { }
    975 
    976   /// \brief Computes the type- and value-dependence flags for this
    977   /// declaration reference expression.
    978   void computeDependence(const ASTContext &C);
    979 
    980 public:
    981   DeclRefExpr(ValueDecl *D, bool RefersToEnclosingVariableOrCapture, QualType T,
    982               ExprValueKind VK, SourceLocation L,
    983               const DeclarationNameLoc &LocInfo = DeclarationNameLoc())
    984     : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false, false),
    985       D(D), Loc(L), DNLoc(LocInfo) {
    986     DeclRefExprBits.HasQualifier = 0;
    987     DeclRefExprBits.HasTemplateKWAndArgsInfo = 0;
    988     DeclRefExprBits.HasFoundDecl = 0;
    989     DeclRefExprBits.HadMultipleCandidates = 0;
    990     DeclRefExprBits.RefersToEnclosingVariableOrCapture =
    991         RefersToEnclosingVariableOrCapture;
    992     computeDependence(D->getASTContext());
    993   }
    994 
    995   static DeclRefExpr *
    996   Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc,
    997          SourceLocation TemplateKWLoc, ValueDecl *D,
    998          bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc,
    999          QualType T, ExprValueKind VK, NamedDecl *FoundD = nullptr,
   1000          const TemplateArgumentListInfo *TemplateArgs = nullptr);
   1001 
   1002   static DeclRefExpr *
   1003   Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc,
   1004          SourceLocation TemplateKWLoc, ValueDecl *D,
   1005          bool RefersToEnclosingVariableOrCapture,
   1006          const DeclarationNameInfo &NameInfo, QualType T, ExprValueKind VK,
   1007          NamedDecl *FoundD = nullptr,
   1008          const TemplateArgumentListInfo *TemplateArgs = nullptr);
   1009 
   1010   /// \brief Construct an empty declaration reference expression.
   1011   static DeclRefExpr *CreateEmpty(const ASTContext &Context,
   1012                                   bool HasQualifier,
   1013                                   bool HasFoundDecl,
   1014                                   bool HasTemplateKWAndArgsInfo,
   1015                                   unsigned NumTemplateArgs);
   1016 
   1017   ValueDecl *getDecl() { return D; }
   1018   const ValueDecl *getDecl() const { return D; }
   1019   void setDecl(ValueDecl *NewD) { D = NewD; }
   1020 
   1021   DeclarationNameInfo getNameInfo() const {
   1022     return DeclarationNameInfo(getDecl()->getDeclName(), Loc, DNLoc);
   1023   }
   1024 
   1025   SourceLocation getLocation() const { return Loc; }
   1026   void setLocation(SourceLocation L) { Loc = L; }
   1027   SourceLocation getLocStart() const LLVM_READONLY;
   1028   SourceLocation getLocEnd() const LLVM_READONLY;
   1029 
   1030   /// \brief Determine whether this declaration reference was preceded by a
   1031   /// C++ nested-name-specifier, e.g., \c N::foo.
   1032   bool hasQualifier() const { return DeclRefExprBits.HasQualifier; }
   1033 
   1034   /// \brief If the name was qualified, retrieves the nested-name-specifier
   1035   /// that precedes the name, with source-location information.
   1036   NestedNameSpecifierLoc getQualifierLoc() const {
   1037     if (!hasQualifier())
   1038       return NestedNameSpecifierLoc();
   1039     return *getTrailingObjects<NestedNameSpecifierLoc>();
   1040   }
   1041 
   1042   /// \brief If the name was qualified, retrieves the nested-name-specifier
   1043   /// that precedes the name. Otherwise, returns NULL.
   1044   NestedNameSpecifier *getQualifier() const {
   1045     return getQualifierLoc().getNestedNameSpecifier();
   1046   }
   1047 
   1048   /// \brief Get the NamedDecl through which this reference occurred.
   1049   ///
   1050   /// This Decl may be different from the ValueDecl actually referred to in the
   1051   /// presence of using declarations, etc. It always returns non-NULL, and may
   1052   /// simple return the ValueDecl when appropriate.
   1053 
   1054   NamedDecl *getFoundDecl() {
   1055     return hasFoundDecl() ? *getTrailingObjects<NamedDecl *>() : D;
   1056   }
   1057 
   1058   /// \brief Get the NamedDecl through which this reference occurred.
   1059   /// See non-const variant.
   1060   const NamedDecl *getFoundDecl() const {
   1061     return hasFoundDecl() ? *getTrailingObjects<NamedDecl *>() : D;
   1062   }
   1063 
   1064   bool hasTemplateKWAndArgsInfo() const {
   1065     return DeclRefExprBits.HasTemplateKWAndArgsInfo;
   1066   }
   1067 
   1068   /// \brief Retrieve the location of the template keyword preceding
   1069   /// this name, if any.
   1070   SourceLocation getTemplateKeywordLoc() const {
   1071     if (!hasTemplateKWAndArgsInfo()) return SourceLocation();
   1072     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc;
   1073   }
   1074 
   1075   /// \brief Retrieve the location of the left angle bracket starting the
   1076   /// explicit template argument list following the name, if any.
   1077   SourceLocation getLAngleLoc() const {
   1078     if (!hasTemplateKWAndArgsInfo()) return SourceLocation();
   1079     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc;
   1080   }
   1081 
   1082   /// \brief Retrieve the location of the right angle bracket ending the
   1083   /// explicit template argument list following the name, if any.
   1084   SourceLocation getRAngleLoc() const {
   1085     if (!hasTemplateKWAndArgsInfo()) return SourceLocation();
   1086     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc;
   1087   }
   1088 
   1089   /// \brief Determines whether the name in this declaration reference
   1090   /// was preceded by the template keyword.
   1091   bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
   1092 
   1093   /// \brief Determines whether this declaration reference was followed by an
   1094   /// explicit template argument list.
   1095   bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
   1096 
   1097   /// \brief Copies the template arguments (if present) into the given
   1098   /// structure.
   1099   void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
   1100     if (hasExplicitTemplateArgs())
   1101       getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto(
   1102           getTrailingObjects<TemplateArgumentLoc>(), List);
   1103   }
   1104 
   1105   /// \brief Retrieve the template arguments provided as part of this
   1106   /// template-id.
   1107   const TemplateArgumentLoc *getTemplateArgs() const {
   1108     if (!hasExplicitTemplateArgs())
   1109       return nullptr;
   1110 
   1111     return getTrailingObjects<TemplateArgumentLoc>();
   1112   }
   1113 
   1114   /// \brief Retrieve the number of template arguments provided as part of this
   1115   /// template-id.
   1116   unsigned getNumTemplateArgs() const {
   1117     if (!hasExplicitTemplateArgs())
   1118       return 0;
   1119 
   1120     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
   1121   }
   1122 
   1123   ArrayRef<TemplateArgumentLoc> template_arguments() const {
   1124     return {getTemplateArgs(), getNumTemplateArgs()};
   1125   }
   1126 
   1127   /// \brief Returns true if this expression refers to a function that
   1128   /// was resolved from an overloaded set having size greater than 1.
   1129   bool hadMultipleCandidates() const {
   1130     return DeclRefExprBits.HadMultipleCandidates;
   1131   }
   1132   /// \brief Sets the flag telling whether this expression refers to
   1133   /// a function that was resolved from an overloaded set having size
   1134   /// greater than 1.
   1135   void setHadMultipleCandidates(bool V = true) {
   1136     DeclRefExprBits.HadMultipleCandidates = V;
   1137   }
   1138 
   1139   /// \brief Does this DeclRefExpr refer to an enclosing local or a captured
   1140   /// variable?
   1141   bool refersToEnclosingVariableOrCapture() const {
   1142     return DeclRefExprBits.RefersToEnclosingVariableOrCapture;
   1143   }
   1144 
   1145   static bool classof(const Stmt *T) {
   1146     return T->getStmtClass() == DeclRefExprClass;
   1147   }
   1148 
   1149   // Iterators
   1150   child_range children() {
   1151     return child_range(child_iterator(), child_iterator());
   1152   }
   1153 
   1154   friend TrailingObjects;
   1155   friend class ASTStmtReader;
   1156   friend class ASTStmtWriter;
   1157 };
   1158 
   1159 /// \brief [C99 6.4.2.2] - A predefined identifier such as __func__.
   1160 class PredefinedExpr : public Expr {
   1161 public:
   1162   enum IdentType {
   1163     Func,
   1164     Function,
   1165     LFunction,  // Same as Function, but as wide string.
   1166     FuncDName,
   1167     FuncSig,
   1168     PrettyFunction,
   1169     /// \brief The same as PrettyFunction, except that the
   1170     /// 'virtual' keyword is omitted for virtual member functions.
   1171     PrettyFunctionNoVirtual
   1172   };
   1173 
   1174 private:
   1175   SourceLocation Loc;
   1176   IdentType Type;
   1177   Stmt *FnName;
   1178 
   1179 public:
   1180   PredefinedExpr(SourceLocation L, QualType FNTy, IdentType IT,
   1181                  StringLiteral *SL);
   1182 
   1183   /// \brief Construct an empty predefined expression.
   1184   explicit PredefinedExpr(EmptyShell Empty)
   1185       : Expr(PredefinedExprClass, Empty), Loc(), Type(Func), FnName(nullptr) {}
   1186 
   1187   IdentType getIdentType() const { return Type; }
   1188 
   1189   SourceLocation getLocation() const { return Loc; }
   1190   void setLocation(SourceLocation L) { Loc = L; }
   1191 
   1192   StringLiteral *getFunctionName();
   1193   const StringLiteral *getFunctionName() const {
   1194     return const_cast<PredefinedExpr *>(this)->getFunctionName();
   1195   }
   1196 
   1197   static StringRef getIdentTypeName(IdentType IT);
   1198   static std::string ComputeName(IdentType IT, const Decl *CurrentDecl);
   1199 
   1200   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
   1201   SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
   1202 
   1203   static bool classof(const Stmt *T) {
   1204     return T->getStmtClass() == PredefinedExprClass;
   1205   }
   1206 
   1207   // Iterators
   1208   child_range children() { return child_range(&FnName, &FnName + 1); }
   1209 
   1210   friend class ASTStmtReader;
   1211 };
   1212 
   1213 /// \brief Used by IntegerLiteral/FloatingLiteral to store the numeric without
   1214 /// leaking memory.
   1215 ///
   1216 /// For large floats/integers, APFloat/APInt will allocate memory from the heap
   1217 /// to represent these numbers.  Unfortunately, when we use a BumpPtrAllocator
   1218 /// to allocate IntegerLiteral/FloatingLiteral nodes the memory associated with
   1219 /// the APFloat/APInt values will never get freed. APNumericStorage uses
   1220 /// ASTContext's allocator for memory allocation.
   1221 class APNumericStorage {
   1222   union {
   1223     uint64_t VAL;    ///< Used to store the <= 64 bits integer value.
   1224     uint64_t *pVal;  ///< Used to store the >64 bits integer value.
   1225   };
   1226   unsigned BitWidth;
   1227 
   1228   bool hasAllocation() const { return llvm::APInt::getNumWords(BitWidth) > 1; }
   1229 
   1230   APNumericStorage(const APNumericStorage &) = delete;
   1231   void operator=(const APNumericStorage &) = delete;
   1232 
   1233 protected:
   1234   APNumericStorage() : VAL(0), BitWidth(0) { }
   1235 
   1236   llvm::APInt getIntValue() const {
   1237     unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
   1238     if (NumWords > 1)
   1239       return llvm::APInt(BitWidth, NumWords, pVal);
   1240     else
   1241       return llvm::APInt(BitWidth, VAL);
   1242   }
   1243   void setIntValue(const ASTContext &C, const llvm::APInt &Val);
   1244 };
   1245 
   1246 class APIntStorage : private APNumericStorage {
   1247 public:
   1248   llvm::APInt getValue() const { return getIntValue(); }
   1249   void setValue(const ASTContext &C, const llvm::APInt &Val) {
   1250     setIntValue(C, Val);
   1251   }
   1252 };
   1253 
   1254 class APFloatStorage : private APNumericStorage {
   1255 public:
   1256   llvm::APFloat getValue(const llvm::fltSemantics &Semantics) const {
   1257     return llvm::APFloat(Semantics, getIntValue());
   1258   }
   1259   void setValue(const ASTContext &C, const llvm::APFloat &Val) {
   1260     setIntValue(C, Val.bitcastToAPInt());
   1261   }
   1262 };
   1263 
   1264 class IntegerLiteral : public Expr, public APIntStorage {
   1265   SourceLocation Loc;
   1266 
   1267   /// \brief Construct an empty integer literal.
   1268   explicit IntegerLiteral(EmptyShell Empty)
   1269     : Expr(IntegerLiteralClass, Empty) { }
   1270 
   1271 public:
   1272   // type should be IntTy, LongTy, LongLongTy, UnsignedIntTy, UnsignedLongTy,
   1273   // or UnsignedLongLongTy
   1274   IntegerLiteral(const ASTContext &C, const llvm::APInt &V, QualType type,
   1275                  SourceLocation l);
   1276 
   1277   /// \brief Returns a new integer literal with value 'V' and type 'type'.
   1278   /// \param type - either IntTy, LongTy, LongLongTy, UnsignedIntTy,
   1279   /// UnsignedLongTy, or UnsignedLongLongTy which should match the size of V
   1280   /// \param V - the value that the returned integer literal contains.
   1281   static IntegerLiteral *Create(const ASTContext &C, const llvm::APInt &V,
   1282                                 QualType type, SourceLocation l);
   1283   /// \brief Returns a new empty integer literal.
   1284   static IntegerLiteral *Create(const ASTContext &C, EmptyShell Empty);
   1285 
   1286   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
   1287   SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
   1288 
   1289   /// \brief Retrieve the location of the literal.
   1290   SourceLocation getLocation() const { return Loc; }
   1291 
   1292   void setLocation(SourceLocation Location) { Loc = Location; }
   1293 
   1294   static bool classof(const Stmt *T) {
   1295     return T->getStmtClass() == IntegerLiteralClass;
   1296   }
   1297 
   1298   // Iterators
   1299   child_range children() {
   1300     return child_range(child_iterator(), child_iterator());
   1301   }
   1302 };
   1303 
   1304 class CharacterLiteral : public Expr {
   1305 public:
   1306   enum CharacterKind {
   1307     Ascii,
   1308     Wide,
   1309     UTF8,
   1310     UTF16,
   1311     UTF32
   1312   };
   1313 
   1314 private:
   1315   unsigned Value;
   1316   SourceLocation Loc;
   1317 public:
   1318   // type should be IntTy
   1319   CharacterLiteral(unsigned value, CharacterKind kind, QualType type,
   1320                    SourceLocation l)
   1321     : Expr(CharacterLiteralClass, type, VK_RValue, OK_Ordinary, false, false,
   1322            false, false),
   1323       Value(value), Loc(l) {
   1324     CharacterLiteralBits.Kind = kind;
   1325   }
   1326 
   1327   /// \brief Construct an empty character literal.
   1328   CharacterLiteral(EmptyShell Empty) : Expr(CharacterLiteralClass, Empty) { }
   1329 
   1330   SourceLocation getLocation() const { return Loc; }
   1331   CharacterKind getKind() const {
   1332     return static_cast<CharacterKind>(CharacterLiteralBits.Kind);
   1333   }
   1334 
   1335   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
   1336   SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
   1337 
   1338   unsigned getValue() const { return Value; }
   1339 
   1340   void setLocation(SourceLocation Location) { Loc = Location; }
   1341   void setKind(CharacterKind kind) { CharacterLiteralBits.Kind = kind; }
   1342   void setValue(unsigned Val) { Value = Val; }
   1343 
   1344   static bool classof(const Stmt *T) {
   1345     return T->getStmtClass() == CharacterLiteralClass;
   1346   }
   1347 
   1348   // Iterators
   1349   child_range children() {
   1350     return child_range(child_iterator(), child_iterator());
   1351   }
   1352 };
   1353 
   1354 class FloatingLiteral : public Expr, private APFloatStorage {
   1355   SourceLocation Loc;
   1356 
   1357   FloatingLiteral(const ASTContext &C, const llvm::APFloat &V, bool isexact,
   1358                   QualType Type, SourceLocation L);
   1359 
   1360   /// \brief Construct an empty floating-point literal.
   1361   explicit FloatingLiteral(const ASTContext &C, EmptyShell Empty);
   1362 
   1363 public:
   1364   static FloatingLiteral *Create(const ASTContext &C, const llvm::APFloat &V,
   1365                                  bool isexact, QualType Type, SourceLocation L);
   1366   static FloatingLiteral *Create(const ASTContext &C, EmptyShell Empty);
   1367 
   1368   llvm::APFloat getValue() const {
   1369     return APFloatStorage::getValue(getSemantics());
   1370   }
   1371   void setValue(const ASTContext &C, const llvm::APFloat &Val) {
   1372     assert(&getSemantics() == &Val.getSemantics() && "Inconsistent semantics");
   1373     APFloatStorage::setValue(C, Val);
   1374   }
   1375 
   1376   /// Get a raw enumeration value representing the floating-point semantics of
   1377   /// this literal (32-bit IEEE, x87, ...), suitable for serialisation.
   1378   APFloatSemantics getRawSemantics() const {
   1379     return static_cast<APFloatSemantics>(FloatingLiteralBits.Semantics);
   1380   }
   1381 
   1382   /// Set the raw enumeration value representing the floating-point semantics of
   1383   /// this literal (32-bit IEEE, x87, ...), suitable for serialisation.
   1384   void setRawSemantics(APFloatSemantics Sem) {
   1385     FloatingLiteralBits.Semantics = Sem;
   1386   }
   1387 
   1388   /// Return the APFloat semantics this literal uses.
   1389   const llvm::fltSemantics &getSemantics() const;
   1390 
   1391   /// Set the APFloat semantics this literal uses.
   1392   void setSemantics(const llvm::fltSemantics &Sem);
   1393 
   1394   bool isExact() const { return FloatingLiteralBits.IsExact; }
   1395   void setExact(bool E) { FloatingLiteralBits.IsExact = E; }
   1396 
   1397   /// getValueAsApproximateDouble - This returns the value as an inaccurate
   1398   /// double.  Note that this may cause loss of precision, but is useful for
   1399   /// debugging dumps, etc.
   1400   double getValueAsApproximateDouble() const;
   1401 
   1402   SourceLocation getLocation() const { return Loc; }
   1403   void setLocation(SourceLocation L) { Loc = L; }
   1404 
   1405   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
   1406   SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
   1407 
   1408   static bool classof(const Stmt *T) {
   1409     return T->getStmtClass() == FloatingLiteralClass;
   1410   }
   1411 
   1412   // Iterators
   1413   child_range children() {
   1414     return child_range(child_iterator(), child_iterator());
   1415   }
   1416 };
   1417 
   1418 /// ImaginaryLiteral - We support imaginary integer and floating point literals,
   1419 /// like "1.0i".  We represent these as a wrapper around FloatingLiteral and
   1420 /// IntegerLiteral classes.  Instances of this class always have a Complex type
   1421 /// whose element type matches the subexpression.
   1422 ///
   1423 class ImaginaryLiteral : public Expr {
   1424   Stmt *Val;
   1425 public:
   1426   ImaginaryLiteral(Expr *val, QualType Ty)
   1427     : Expr(ImaginaryLiteralClass, Ty, VK_RValue, OK_Ordinary, false, false,
   1428            false, false),
   1429       Val(val) {}
   1430 
   1431   /// \brief Build an empty imaginary literal.
   1432   explicit ImaginaryLiteral(EmptyShell Empty)
   1433     : Expr(ImaginaryLiteralClass, Empty) { }
   1434 
   1435   const Expr *getSubExpr() const { return cast<Expr>(Val); }
   1436   Expr *getSubExpr() { return cast<Expr>(Val); }
   1437   void setSubExpr(Expr *E) { Val = E; }
   1438 
   1439   SourceLocation getLocStart() const LLVM_READONLY { return Val->getLocStart(); }
   1440   SourceLocation getLocEnd() const LLVM_READONLY { return Val->getLocEnd(); }
   1441 
   1442   static bool classof(const Stmt *T) {
   1443     return T->getStmtClass() == ImaginaryLiteralClass;
   1444   }
   1445 
   1446   // Iterators
   1447   child_range children() { return child_range(&Val, &Val+1); }
   1448 };
   1449 
   1450 /// StringLiteral - This represents a string literal expression, e.g. "foo"
   1451 /// or L"bar" (wide strings).  The actual string is returned by getBytes()
   1452 /// is NOT null-terminated, and the length of the string is determined by
   1453 /// calling getByteLength().  The C type for a string is always a
   1454 /// ConstantArrayType.  In C++, the char type is const qualified, in C it is
   1455 /// not.
   1456 ///
   1457 /// Note that strings in C can be formed by concatenation of multiple string
   1458 /// literal pptokens in translation phase #6.  This keeps track of the locations
   1459 /// of each of these pieces.
   1460 ///
   1461 /// Strings in C can also be truncated and extended by assigning into arrays,
   1462 /// e.g. with constructs like:
   1463 ///   char X[2] = "foobar";
   1464 /// In this case, getByteLength() will return 6, but the string literal will
   1465 /// have type "char[2]".
   1466 class StringLiteral : public Expr {
   1467 public:
   1468   enum StringKind {
   1469     Ascii,
   1470     Wide,
   1471     UTF8,
   1472     UTF16,
   1473     UTF32
   1474   };
   1475 
   1476 private:
   1477   friend class ASTStmtReader;
   1478 
   1479   union {
   1480     const char *asChar;
   1481     const uint16_t *asUInt16;
   1482     const uint32_t *asUInt32;
   1483   } StrData;
   1484   unsigned Length;
   1485   unsigned CharByteWidth : 4;
   1486   unsigned Kind : 3;
   1487   unsigned IsPascal : 1;
   1488   unsigned NumConcatenated;
   1489   SourceLocation TokLocs[1];
   1490 
   1491   StringLiteral(QualType Ty) :
   1492     Expr(StringLiteralClass, Ty, VK_LValue, OK_Ordinary, false, false, false,
   1493          false) {}
   1494 
   1495   static int mapCharByteWidth(TargetInfo const &target,StringKind k);
   1496 
   1497 public:
   1498   /// This is the "fully general" constructor that allows representation of
   1499   /// strings formed from multiple concatenated tokens.
   1500   static StringLiteral *Create(const ASTContext &C, StringRef Str,
   1501                                StringKind Kind, bool Pascal, QualType Ty,
   1502                                const SourceLocation *Loc, unsigned NumStrs);
   1503 
   1504   /// Simple constructor for string literals made from one token.
   1505   static StringLiteral *Create(const ASTContext &C, StringRef Str,
   1506                                StringKind Kind, bool Pascal, QualType Ty,
   1507                                SourceLocation Loc) {
   1508     return Create(C, Str, Kind, Pascal, Ty, &Loc, 1);
   1509   }
   1510 
   1511   /// \brief Construct an empty string literal.
   1512   static StringLiteral *CreateEmpty(const ASTContext &C, unsigned NumStrs);
   1513 
   1514   StringRef getString() const {
   1515     assert(CharByteWidth==1
   1516            && "This function is used in places that assume strings use char");
   1517     return StringRef(StrData.asChar, getByteLength());
   1518   }
   1519 
   1520   /// Allow access to clients that need the byte representation, such as
   1521   /// ASTWriterStmt::VisitStringLiteral().
   1522   StringRef getBytes() const {
   1523     // FIXME: StringRef may not be the right type to use as a result for this.
   1524     if (CharByteWidth == 1)
   1525       return StringRef(StrData.asChar, getByteLength());
   1526     if (CharByteWidth == 4)
   1527       return StringRef(reinterpret_cast<const char*>(StrData.asUInt32),
   1528                        getByteLength());
   1529     assert(CharByteWidth == 2 && "unsupported CharByteWidth");
   1530     return StringRef(reinterpret_cast<const char*>(StrData.asUInt16),
   1531                      getByteLength());
   1532   }
   1533 
   1534   void outputString(raw_ostream &OS) const;
   1535 
   1536   uint32_t getCodeUnit(size_t i) const {
   1537     assert(i < Length && "out of bounds access");
   1538     if (CharByteWidth == 1)
   1539       return static_cast<unsigned char>(StrData.asChar[i]);
   1540     if (CharByteWidth == 4)
   1541       return StrData.asUInt32[i];
   1542     assert(CharByteWidth == 2 && "unsupported CharByteWidth");
   1543     return StrData.asUInt16[i];
   1544   }
   1545 
   1546   unsigned getByteLength() const { return CharByteWidth*Length; }
   1547   unsigned getLength() const { return Length; }
   1548   unsigned getCharByteWidth() const { return CharByteWidth; }
   1549 
   1550   /// \brief Sets the string data to the given string data.
   1551   void setString(const ASTContext &C, StringRef Str,
   1552                  StringKind Kind, bool IsPascal);
   1553 
   1554   StringKind getKind() const { return static_cast<StringKind>(Kind); }
   1555 
   1556 
   1557   bool isAscii() const { return Kind == Ascii; }
   1558   bool isWide() const { return Kind == Wide; }
   1559   bool isUTF8() const { return Kind == UTF8; }
   1560   bool isUTF16() const { return Kind == UTF16; }
   1561   bool isUTF32() const { return Kind == UTF32; }
   1562   bool isPascal() const { return IsPascal; }
   1563 
   1564   bool containsNonAsciiOrNull() const {
   1565     StringRef Str = getString();
   1566     for (unsigned i = 0, e = Str.size(); i != e; ++i)
   1567       if (!isASCII(Str[i]) || !Str[i])
   1568         return true;
   1569     return false;
   1570   }
   1571 
   1572   /// getNumConcatenated - Get the number of string literal tokens that were
   1573   /// concatenated in translation phase #6 to form this string literal.
   1574   unsigned getNumConcatenated() const { return NumConcatenated; }
   1575 
   1576   SourceLocation getStrTokenLoc(unsigned TokNum) const {
   1577     assert(TokNum < NumConcatenated && "Invalid tok number");
   1578     return TokLocs[TokNum];
   1579   }
   1580   void setStrTokenLoc(unsigned TokNum, SourceLocation L) {
   1581     assert(TokNum < NumConcatenated && "Invalid tok number");
   1582     TokLocs[TokNum] = L;
   1583   }
   1584 
   1585   /// getLocationOfByte - Return a source location that points to the specified
   1586   /// byte of this string literal.
   1587   ///
   1588   /// Strings are amazingly complex.  They can be formed from multiple tokens
   1589   /// and can have escape sequences in them in addition to the usual trigraph
   1590   /// and escaped newline business.  This routine handles this complexity.
   1591   ///
   1592   SourceLocation
   1593   getLocationOfByte(unsigned ByteNo, const SourceManager &SM,
   1594                     const LangOptions &Features, const TargetInfo &Target,
   1595                     unsigned *StartToken = nullptr,
   1596                     unsigned *StartTokenByteOffset = nullptr) const;
   1597 
   1598   typedef const SourceLocation *tokloc_iterator;
   1599   tokloc_iterator tokloc_begin() const { return TokLocs; }
   1600   tokloc_iterator tokloc_end() const { return TokLocs + NumConcatenated; }
   1601 
   1602   SourceLocation getLocStart() const LLVM_READONLY { return TokLocs[0]; }
   1603   SourceLocation getLocEnd() const LLVM_READONLY {
   1604     return TokLocs[NumConcatenated - 1];
   1605   }
   1606 
   1607   static bool classof(const Stmt *T) {
   1608     return T->getStmtClass() == StringLiteralClass;
   1609   }
   1610 
   1611   // Iterators
   1612   child_range children() {
   1613     return child_range(child_iterator(), child_iterator());
   1614   }
   1615 };
   1616 
   1617 /// ParenExpr - This represents a parethesized expression, e.g. "(1)".  This
   1618 /// AST node is only formed if full location information is requested.
   1619 class ParenExpr : public Expr {
   1620   SourceLocation L, R;
   1621   Stmt *Val;
   1622 public:
   1623   ParenExpr(SourceLocation l, SourceLocation r, Expr *val)
   1624     : Expr(ParenExprClass, val->getType(),
   1625            val->getValueKind(), val->getObjectKind(),
   1626            val->isTypeDependent(), val->isValueDependent(),
   1627            val->isInstantiationDependent(),
   1628            val->containsUnexpandedParameterPack()),
   1629       L(l), R(r), Val(val) {}
   1630 
   1631   /// \brief Construct an empty parenthesized expression.
   1632   explicit ParenExpr(EmptyShell Empty)
   1633     : Expr(ParenExprClass, Empty) { }
   1634 
   1635   const Expr *getSubExpr() const { return cast<Expr>(Val); }
   1636   Expr *getSubExpr() { return cast<Expr>(Val); }
   1637   void setSubExpr(Expr *E) { Val = E; }
   1638 
   1639   SourceLocation getLocStart() const LLVM_READONLY { return L; }
   1640   SourceLocation getLocEnd() const LLVM_READONLY { return R; }
   1641 
   1642   /// \brief Get the location of the left parentheses '('.
   1643   SourceLocation getLParen() const { return L; }
   1644   void setLParen(SourceLocation Loc) { L = Loc; }
   1645 
   1646   /// \brief Get the location of the right parentheses ')'.
   1647   SourceLocation getRParen() const { return R; }
   1648   void setRParen(SourceLocation Loc) { R = Loc; }
   1649 
   1650   static bool classof(const Stmt *T) {
   1651     return T->getStmtClass() == ParenExprClass;
   1652   }
   1653 
   1654   // Iterators
   1655   child_range children() { return child_range(&Val, &Val+1); }
   1656 };
   1657 
   1658 /// UnaryOperator - This represents the unary-expression's (except sizeof and
   1659 /// alignof), the postinc/postdec operators from postfix-expression, and various
   1660 /// extensions.
   1661 ///
   1662 /// Notes on various nodes:
   1663 ///
   1664 /// Real/Imag - These return the real/imag part of a complex operand.  If
   1665 ///   applied to a non-complex value, the former returns its operand and the
   1666 ///   later returns zero in the type of the operand.
   1667 ///
   1668 class UnaryOperator : public Expr {
   1669 public:
   1670   typedef UnaryOperatorKind Opcode;
   1671 
   1672 private:
   1673   unsigned Opc : 5;
   1674   SourceLocation Loc;
   1675   Stmt *Val;
   1676 public:
   1677 
   1678   UnaryOperator(Expr *input, Opcode opc, QualType type,
   1679                 ExprValueKind VK, ExprObjectKind OK, SourceLocation l)
   1680     : Expr(UnaryOperatorClass, type, VK, OK,
   1681            input->isTypeDependent() || type->isDependentType(),
   1682            input->isValueDependent(),
   1683            (input->isInstantiationDependent() ||
   1684             type->isInstantiationDependentType()),
   1685            input->containsUnexpandedParameterPack()),
   1686       Opc(opc), Loc(l), Val(input) {}
   1687 
   1688   /// \brief Build an empty unary operator.
   1689   explicit UnaryOperator(EmptyShell Empty)
   1690     : Expr(UnaryOperatorClass, Empty), Opc(UO_AddrOf) { }
   1691 
   1692   Opcode getOpcode() const { return static_cast<Opcode>(Opc); }
   1693   void setOpcode(Opcode O) { Opc = O; }
   1694 
   1695   Expr *getSubExpr() const { return cast<Expr>(Val); }
   1696   void setSubExpr(Expr *E) { Val = E; }
   1697 
   1698   /// getOperatorLoc - Return the location of the operator.
   1699   SourceLocation getOperatorLoc() const { return Loc; }
   1700   void setOperatorLoc(SourceLocation L) { Loc = L; }
   1701 
   1702   /// isPostfix - Return true if this is a postfix operation, like x++.
   1703   static bool isPostfix(Opcode Op) {
   1704     return Op == UO_PostInc || Op == UO_PostDec;
   1705   }
   1706 
   1707   /// isPrefix - Return true if this is a prefix operation, like --x.
   1708   static bool isPrefix(Opcode Op) {
   1709     return Op == UO_PreInc || Op == UO_PreDec;
   1710   }
   1711 
   1712   bool isPrefix() const { return isPrefix(getOpcode()); }
   1713   bool isPostfix() const { return isPostfix(getOpcode()); }
   1714 
   1715   static bool isIncrementOp(Opcode Op) {
   1716     return Op == UO_PreInc || Op == UO_PostInc;
   1717   }
   1718   bool isIncrementOp() const {
   1719     return isIncrementOp(getOpcode());
   1720   }
   1721 
   1722   static bool isDecrementOp(Opcode Op) {
   1723     return Op == UO_PreDec || Op == UO_PostDec;
   1724   }
   1725   bool isDecrementOp() const {
   1726     return isDecrementOp(getOpcode());
   1727   }
   1728 
   1729   static bool isIncrementDecrementOp(Opcode Op) { return Op <= UO_PreDec; }
   1730   bool isIncrementDecrementOp() const {
   1731     return isIncrementDecrementOp(getOpcode());
   1732   }
   1733 
   1734   static bool isArithmeticOp(Opcode Op) {
   1735     return Op >= UO_Plus && Op <= UO_LNot;
   1736   }
   1737   bool isArithmeticOp() const { return isArithmeticOp(getOpcode()); }
   1738 
   1739   /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
   1740   /// corresponds to, e.g. "sizeof" or "[pre]++"
   1741   static StringRef getOpcodeStr(Opcode Op);
   1742 
   1743   /// \brief Retrieve the unary opcode that corresponds to the given
   1744   /// overloaded operator.
   1745   static Opcode getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix);
   1746 
   1747   /// \brief Retrieve the overloaded operator kind that corresponds to
   1748   /// the given unary opcode.
   1749   static OverloadedOperatorKind getOverloadedOperator(Opcode Opc);
   1750 
   1751   SourceLocation getLocStart() const LLVM_READONLY {
   1752     return isPostfix() ? Val->getLocStart() : Loc;
   1753   }
   1754   SourceLocation getLocEnd() const LLVM_READONLY {
   1755     return isPostfix() ? Loc : Val->getLocEnd();
   1756   }
   1757   SourceLocation getExprLoc() const LLVM_READONLY { return Loc; }
   1758 
   1759   static bool classof(const Stmt *T) {
   1760     return T->getStmtClass() == UnaryOperatorClass;
   1761   }
   1762 
   1763   // Iterators
   1764   child_range children() { return child_range(&Val, &Val+1); }
   1765 };
   1766 
   1767 /// Helper class for OffsetOfExpr.
   1768 
   1769 // __builtin_offsetof(type, identifier(.identifier|[expr])*)
   1770 class OffsetOfNode {
   1771 public:
   1772   /// \brief The kind of offsetof node we have.
   1773   enum Kind {
   1774     /// \brief An index into an array.
   1775     Array = 0x00,
   1776     /// \brief A field.
   1777     Field = 0x01,
   1778     /// \brief A field in a dependent type, known only by its name.
   1779     Identifier = 0x02,
   1780     /// \brief An implicit indirection through a C++ base class, when the
   1781     /// field found is in a base class.
   1782     Base = 0x03
   1783   };
   1784 
   1785 private:
   1786   enum { MaskBits = 2, Mask = 0x03 };
   1787 
   1788   /// \brief The source range that covers this part of the designator.
   1789   SourceRange Range;
   1790 
   1791   /// \brief The data describing the designator, which comes in three
   1792   /// different forms, depending on the lower two bits.
   1793   ///   - An unsigned index into the array of Expr*'s stored after this node
   1794   ///     in memory, for [constant-expression] designators.
   1795   ///   - A FieldDecl*, for references to a known field.
   1796   ///   - An IdentifierInfo*, for references to a field with a given name
   1797   ///     when the class type is dependent.
   1798   ///   - A CXXBaseSpecifier*, for references that look at a field in a
   1799   ///     base class.
   1800   uintptr_t Data;
   1801 
   1802 public:
   1803   /// \brief Create an offsetof node that refers to an array element.
   1804   OffsetOfNode(SourceLocation LBracketLoc, unsigned Index,
   1805                SourceLocation RBracketLoc)
   1806       : Range(LBracketLoc, RBracketLoc), Data((Index << 2) | Array) {}
   1807 
   1808   /// \brief Create an offsetof node that refers to a field.
   1809   OffsetOfNode(SourceLocation DotLoc, FieldDecl *Field, SourceLocation NameLoc)
   1810       : Range(DotLoc.isValid() ? DotLoc : NameLoc, NameLoc),
   1811         Data(reinterpret_cast<uintptr_t>(Field) | OffsetOfNode::Field) {}
   1812 
   1813   /// \brief Create an offsetof node that refers to an identifier.
   1814   OffsetOfNode(SourceLocation DotLoc, IdentifierInfo *Name,
   1815                SourceLocation NameLoc)
   1816       : Range(DotLoc.isValid() ? DotLoc : NameLoc, NameLoc),
   1817         Data(reinterpret_cast<uintptr_t>(Name) | Identifier) {}
   1818 
   1819   /// \brief Create an offsetof node that refers into a C++ base class.
   1820   explicit OffsetOfNode(const CXXBaseSpecifier *Base)
   1821       : Range(), Data(reinterpret_cast<uintptr_t>(Base) | OffsetOfNode::Base) {}
   1822 
   1823   /// \brief Determine what kind of offsetof node this is.
   1824   Kind getKind() const { return static_cast<Kind>(Data & Mask); }
   1825 
   1826   /// \brief For an array element node, returns the index into the array
   1827   /// of expressions.
   1828   unsigned getArrayExprIndex() const {
   1829     assert(getKind() == Array);
   1830     return Data >> 2;
   1831   }
   1832 
   1833   /// \brief For a field offsetof node, returns the field.
   1834   FieldDecl *getField() const {
   1835     assert(getKind() == Field);
   1836     return reinterpret_cast<FieldDecl *>(Data & ~(uintptr_t)Mask);
   1837   }
   1838 
   1839   /// \brief For a field or identifier offsetof node, returns the name of
   1840   /// the field.
   1841   IdentifierInfo *getFieldName() const;
   1842 
   1843   /// \brief For a base class node, returns the base specifier.
   1844   CXXBaseSpecifier *getBase() const {
   1845     assert(getKind() == Base);
   1846     return reinterpret_cast<CXXBaseSpecifier *>(Data & ~(uintptr_t)Mask);
   1847   }
   1848 
   1849   /// \brief Retrieve the source range that covers this offsetof node.
   1850   ///
   1851   /// For an array element node, the source range contains the locations of
   1852   /// the square brackets. For a field or identifier node, the source range
   1853   /// contains the location of the period (if there is one) and the
   1854   /// identifier.
   1855   SourceRange getSourceRange() const LLVM_READONLY { return Range; }
   1856   SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); }
   1857   SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); }
   1858 };
   1859 
   1860 /// OffsetOfExpr - [C99 7.17] - This represents an expression of the form
   1861 /// offsetof(record-type, member-designator). For example, given:
   1862 /// @code
   1863 /// struct S {
   1864 ///   float f;
   1865 ///   double d;
   1866 /// };
   1867 /// struct T {
   1868 ///   int i;
   1869 ///   struct S s[10];
   1870 /// };
   1871 /// @endcode
   1872 /// we can represent and evaluate the expression @c offsetof(struct T, s[2].d).
   1873 
   1874 class OffsetOfExpr final
   1875     : public Expr,
   1876       private llvm::TrailingObjects<OffsetOfExpr, OffsetOfNode, Expr *> {
   1877   SourceLocation OperatorLoc, RParenLoc;
   1878   // Base type;
   1879   TypeSourceInfo *TSInfo;
   1880   // Number of sub-components (i.e. instances of OffsetOfNode).
   1881   unsigned NumComps;
   1882   // Number of sub-expressions (i.e. array subscript expressions).
   1883   unsigned NumExprs;
   1884 
   1885   size_t numTrailingObjects(OverloadToken<OffsetOfNode>) const {
   1886     return NumComps;
   1887   }
   1888 
   1889   OffsetOfExpr(const ASTContext &C, QualType type,
   1890                SourceLocation OperatorLoc, TypeSourceInfo *tsi,
   1891                ArrayRef<OffsetOfNode> comps, ArrayRef<Expr*> exprs,
   1892                SourceLocation RParenLoc);
   1893 
   1894   explicit OffsetOfExpr(unsigned numComps, unsigned numExprs)
   1895     : Expr(OffsetOfExprClass, EmptyShell()),
   1896       TSInfo(nullptr), NumComps(numComps), NumExprs(numExprs) {}
   1897 
   1898 public:
   1899 
   1900   static OffsetOfExpr *Create(const ASTContext &C, QualType type,
   1901                               SourceLocation OperatorLoc, TypeSourceInfo *tsi,
   1902                               ArrayRef<OffsetOfNode> comps,
   1903                               ArrayRef<Expr*> exprs, SourceLocation RParenLoc);
   1904 
   1905   static OffsetOfExpr *CreateEmpty(const ASTContext &C,
   1906                                    unsigned NumComps, unsigned NumExprs);
   1907 
   1908   /// getOperatorLoc - Return the location of the operator.
   1909   SourceLocation getOperatorLoc() const { return OperatorLoc; }
   1910   void setOperatorLoc(SourceLocation L) { OperatorLoc = L; }
   1911 
   1912   /// \brief Return the location of the right parentheses.
   1913   SourceLocation getRParenLoc() const { return RParenLoc; }
   1914   void setRParenLoc(SourceLocation R) { RParenLoc = R; }
   1915 
   1916   TypeSourceInfo *getTypeSourceInfo() const {
   1917     return TSInfo;
   1918   }
   1919   void setTypeSourceInfo(TypeSourceInfo *tsi) {
   1920     TSInfo = tsi;
   1921   }
   1922 
   1923   const OffsetOfNode &getComponent(unsigned Idx) const {
   1924     assert(Idx < NumComps && "Subscript out of range");
   1925     return getTrailingObjects<OffsetOfNode>()[Idx];
   1926   }
   1927 
   1928   void setComponent(unsigned Idx, OffsetOfNode ON) {
   1929     assert(Idx < NumComps && "Subscript out of range");
   1930     getTrailingObjects<OffsetOfNode>()[Idx] = ON;
   1931   }
   1932 
   1933   unsigned getNumComponents() const {
   1934     return NumComps;
   1935   }
   1936 
   1937   Expr* getIndexExpr(unsigned Idx) {
   1938     assert(Idx < NumExprs && "Subscript out of range");
   1939     return getTrailingObjects<Expr *>()[Idx];
   1940   }
   1941 
   1942   const Expr *getIndexExpr(unsigned Idx) const {
   1943     assert(Idx < NumExprs && "Subscript out of range");
   1944     return getTrailingObjects<Expr *>()[Idx];
   1945   }
   1946 
   1947   void setIndexExpr(unsigned Idx, Expr* E) {
   1948     assert(Idx < NumComps && "Subscript out of range");
   1949     getTrailingObjects<Expr *>()[Idx] = E;
   1950   }
   1951 
   1952   unsigned getNumExpressions() const {
   1953     return NumExprs;
   1954   }
   1955 
   1956   SourceLocation getLocStart() const LLVM_READONLY { return OperatorLoc; }
   1957   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
   1958 
   1959   static bool classof(const Stmt *T) {
   1960     return T->getStmtClass() == OffsetOfExprClass;
   1961   }
   1962 
   1963   // Iterators
   1964   child_range children() {
   1965     Stmt **begin = reinterpret_cast<Stmt **>(getTrailingObjects<Expr *>());
   1966     return child_range(begin, begin + NumExprs);
   1967   }
   1968   friend TrailingObjects;
   1969 };
   1970 
   1971 /// UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated)
   1972 /// expression operand.  Used for sizeof/alignof (C99 6.5.3.4) and
   1973 /// vec_step (OpenCL 1.1 6.11.12).
   1974 class UnaryExprOrTypeTraitExpr : public Expr {
   1975   union {
   1976     TypeSourceInfo *Ty;
   1977     Stmt *Ex;
   1978   } Argument;
   1979   SourceLocation OpLoc, RParenLoc;
   1980 
   1981 public:
   1982   UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, TypeSourceInfo *TInfo,
   1983                            QualType resultType, SourceLocation op,
   1984                            SourceLocation rp) :
   1985       Expr(UnaryExprOrTypeTraitExprClass, resultType, VK_RValue, OK_Ordinary,
   1986            false, // Never type-dependent (C++ [temp.dep.expr]p3).
   1987            // Value-dependent if the argument is type-dependent.
   1988            TInfo->getType()->isDependentType(),
   1989            TInfo->getType()->isInstantiationDependentType(),
   1990            TInfo->getType()->containsUnexpandedParameterPack()),
   1991       OpLoc(op), RParenLoc(rp) {
   1992     UnaryExprOrTypeTraitExprBits.Kind = ExprKind;
   1993     UnaryExprOrTypeTraitExprBits.IsType = true;
   1994     Argument.Ty = TInfo;
   1995   }
   1996 
   1997   UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, Expr *E,
   1998                            QualType resultType, SourceLocation op,
   1999                            SourceLocation rp);
   2000 
   2001   /// \brief Construct an empty sizeof/alignof expression.
   2002   explicit UnaryExprOrTypeTraitExpr(EmptyShell Empty)
   2003     : Expr(UnaryExprOrTypeTraitExprClass, Empty) { }
   2004 
   2005   UnaryExprOrTypeTrait getKind() const {
   2006     return static_cast<UnaryExprOrTypeTrait>(UnaryExprOrTypeTraitExprBits.Kind);
   2007   }
   2008   void setKind(UnaryExprOrTypeTrait K) { UnaryExprOrTypeTraitExprBits.Kind = K;}
   2009 
   2010   bool isArgumentType() const { return UnaryExprOrTypeTraitExprBits.IsType; }
   2011   QualType getArgumentType() const {
   2012     return getArgumentTypeInfo()->getType();
   2013   }
   2014   TypeSourceInfo *getArgumentTypeInfo() const {
   2015     assert(isArgumentType() && "calling getArgumentType() when arg is expr");
   2016     return Argument.Ty;
   2017   }
   2018   Expr *getArgumentExpr() {
   2019     assert(!isArgumentType() && "calling getArgumentExpr() when arg is type");
   2020     return static_cast<Expr*>(Argument.Ex);
   2021   }
   2022   const Expr *getArgumentExpr() const {
   2023     return const_cast<UnaryExprOrTypeTraitExpr*>(this)->getArgumentExpr();
   2024   }
   2025 
   2026   void setArgument(Expr *E) {
   2027     Argument.Ex = E;
   2028     UnaryExprOrTypeTraitExprBits.IsType = false;
   2029   }
   2030   void setArgument(TypeSourceInfo *TInfo) {
   2031     Argument.Ty = TInfo;
   2032     UnaryExprOrTypeTraitExprBits.IsType = true;
   2033   }
   2034 
   2035   /// Gets the argument type, or the type of the argument expression, whichever
   2036   /// is appropriate.
   2037   QualType getTypeOfArgument() const {
   2038     return isArgumentType() ? getArgumentType() : getArgumentExpr()->getType();
   2039   }
   2040 
   2041   SourceLocation getOperatorLoc() const { return OpLoc; }
   2042   void setOperatorLoc(SourceLocation L) { OpLoc = L; }
   2043 
   2044   SourceLocation getRParenLoc() const { return RParenLoc; }
   2045   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
   2046 
   2047   SourceLocation getLocStart() const LLVM_READONLY { return OpLoc; }
   2048   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
   2049 
   2050   static bool classof(const Stmt *T) {
   2051     return T->getStmtClass() == UnaryExprOrTypeTraitExprClass;
   2052   }
   2053 
   2054   // Iterators
   2055   child_range children();
   2056 };
   2057 
   2058 //===----------------------------------------------------------------------===//
   2059 // Postfix Operators.
   2060 //===----------------------------------------------------------------------===//
   2061 
   2062 /// ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
   2063 class ArraySubscriptExpr : public Expr {
   2064   enum { LHS, RHS, END_EXPR=2 };
   2065   Stmt* SubExprs[END_EXPR];
   2066   SourceLocation RBracketLoc;
   2067 public:
   2068   ArraySubscriptExpr(Expr *lhs, Expr *rhs, QualType t,
   2069                      ExprValueKind VK, ExprObjectKind OK,
   2070                      SourceLocation rbracketloc)
   2071   : Expr(ArraySubscriptExprClass, t, VK, OK,
   2072          lhs->isTypeDependent() || rhs->isTypeDependent(),
   2073          lhs->isValueDependent() || rhs->isValueDependent(),
   2074          (lhs->isInstantiationDependent() ||
   2075           rhs->isInstantiationDependent()),
   2076          (lhs->containsUnexpandedParameterPack() ||
   2077           rhs->containsUnexpandedParameterPack())),
   2078     RBracketLoc(rbracketloc) {
   2079     SubExprs[LHS] = lhs;
   2080     SubExprs[RHS] = rhs;
   2081   }
   2082 
   2083   /// \brief Create an empty array subscript expression.
   2084   explicit ArraySubscriptExpr(EmptyShell Shell)
   2085     : Expr(ArraySubscriptExprClass, Shell) { }
   2086 
   2087   /// An array access can be written A[4] or 4[A] (both are equivalent).
   2088   /// - getBase() and getIdx() always present the normalized view: A[4].
   2089   ///    In this case getBase() returns "A" and getIdx() returns "4".
   2090   /// - getLHS() and getRHS() present the syntactic view. e.g. for
   2091   ///    4[A] getLHS() returns "4".
   2092   /// Note: Because vector element access is also written A[4] we must
   2093   /// predicate the format conversion in getBase and getIdx only on the
   2094   /// the type of the RHS, as it is possible for the LHS to be a vector of
   2095   /// integer type
   2096   Expr *getLHS() { return cast<Expr>(SubExprs[LHS]); }
   2097   const Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
   2098   void setLHS(Expr *E) { SubExprs[LHS] = E; }
   2099 
   2100   Expr *getRHS() { return cast<Expr>(SubExprs[RHS]); }
   2101   const Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
   2102   void setRHS(Expr *E) { SubExprs[RHS] = E; }
   2103 
   2104   Expr *getBase() {
   2105     return cast<Expr>(getRHS()->getType()->isIntegerType() ? getLHS():getRHS());
   2106   }
   2107 
   2108   const Expr *getBase() const {
   2109     return cast<Expr>(getRHS()->getType()->isIntegerType() ? getLHS():getRHS());
   2110   }
   2111 
   2112   Expr *getIdx() {
   2113     return cast<Expr>(getRHS()->getType()->isIntegerType() ? getRHS():getLHS());
   2114   }
   2115 
   2116   const Expr *getIdx() const {
   2117     return cast<Expr>(getRHS()->getType()->isIntegerType() ? getRHS():getLHS());
   2118   }
   2119 
   2120   SourceLocation getLocStart() const LLVM_READONLY {
   2121     return getLHS()->getLocStart();
   2122   }
   2123   SourceLocation getLocEnd() const LLVM_READONLY { return RBracketLoc; }
   2124 
   2125   SourceLocation getRBracketLoc() const { return RBracketLoc; }
   2126   void setRBracketLoc(SourceLocation L) { RBracketLoc = L; }
   2127 
   2128   SourceLocation getExprLoc() const LLVM_READONLY {
   2129     return getBase()->getExprLoc();
   2130   }
   2131 
   2132   static bool classof(const Stmt *T) {
   2133     return T->getStmtClass() == ArraySubscriptExprClass;
   2134   }
   2135 
   2136   // Iterators
   2137   child_range children() {
   2138     return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
   2139   }
   2140 };
   2141 
   2142 /// CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
   2143 /// CallExpr itself represents a normal function call, e.g., "f(x, 2)",
   2144 /// while its subclasses may represent alternative syntax that (semantically)
   2145 /// results in a function call. For example, CXXOperatorCallExpr is
   2146 /// a subclass for overloaded operator calls that use operator syntax, e.g.,
   2147 /// "str1 + str2" to resolve to a function call.
   2148 class CallExpr : public Expr {
   2149   enum { FN=0, PREARGS_START=1 };
   2150   Stmt **SubExprs;
   2151   unsigned NumArgs;
   2152   SourceLocation RParenLoc;
   2153 
   2154   void updateDependenciesFromArg(Expr *Arg);
   2155 
   2156 protected:
   2157   // These versions of the constructor are for derived classes.
   2158   CallExpr(const ASTContext &C, StmtClass SC, Expr *fn,
   2159            ArrayRef<Expr *> preargs, ArrayRef<Expr *> args, QualType t,
   2160            ExprValueKind VK, SourceLocation rparenloc);
   2161   CallExpr(const ASTContext &C, StmtClass SC, Expr *fn, ArrayRef<Expr *> args,
   2162            QualType t, ExprValueKind VK, SourceLocation rparenloc);
   2163   CallExpr(const ASTContext &C, StmtClass SC, unsigned NumPreArgs,
   2164            EmptyShell Empty);
   2165 
   2166   Stmt *getPreArg(unsigned i) {
   2167     assert(i < getNumPreArgs() && "Prearg access out of range!");
   2168     return SubExprs[PREARGS_START+i];
   2169   }
   2170   const Stmt *getPreArg(unsigned i) const {
   2171     assert(i < getNumPreArgs() && "Prearg access out of range!");
   2172     return SubExprs[PREARGS_START+i];
   2173   }
   2174   void setPreArg(unsigned i, Stmt *PreArg) {
   2175     assert(i < getNumPreArgs() && "Prearg access out of range!");
   2176     SubExprs[PREARGS_START+i] = PreArg;
   2177   }
   2178 
   2179   unsigned getNumPreArgs() const { return CallExprBits.NumPreArgs; }
   2180 
   2181 public:
   2182   CallExpr(const ASTContext& C, Expr *fn, ArrayRef<Expr*> args, QualType t,
   2183            ExprValueKind VK, SourceLocation rparenloc);
   2184 
   2185   /// \brief Build an empty call expression.
   2186   CallExpr(const ASTContext &C, StmtClass SC, EmptyShell Empty);
   2187 
   2188   const Expr *getCallee() const { return cast<Expr>(SubExprs[FN]); }
   2189   Expr *getCallee() { return cast<Expr>(SubExprs[FN]); }
   2190   void setCallee(Expr *F) { SubExprs[FN] = F; }
   2191 
   2192   Decl *getCalleeDecl();
   2193   const Decl *getCalleeDecl() const {
   2194     return const_cast<CallExpr*>(this)->getCalleeDecl();
   2195   }
   2196 
   2197   /// \brief If the callee is a FunctionDecl, return it. Otherwise return 0.
   2198   FunctionDecl *getDirectCallee();
   2199   const FunctionDecl *getDirectCallee() const {
   2200     return const_cast<CallExpr*>(this)->getDirectCallee();
   2201   }
   2202 
   2203   /// getNumArgs - Return the number of actual arguments to this call.
   2204   ///
   2205   unsigned getNumArgs() const { return NumArgs; }
   2206 
   2207   /// \brief Retrieve the call arguments.
   2208   Expr **getArgs() {
   2209     return reinterpret_cast<Expr **>(SubExprs+getNumPreArgs()+PREARGS_START);
   2210   }
   2211   const Expr *const *getArgs() const {
   2212     return reinterpret_cast<Expr **>(SubExprs + getNumPreArgs() +
   2213                                      PREARGS_START);
   2214   }
   2215 
   2216   /// getArg - Return the specified argument.
   2217   Expr *getArg(unsigned Arg) {
   2218     assert(Arg < NumArgs && "Arg access out of range!");
   2219     return cast_or_null<Expr>(SubExprs[Arg + getNumPreArgs() + PREARGS_START]);
   2220   }
   2221   const Expr *getArg(unsigned Arg) const {
   2222     assert(Arg < NumArgs && "Arg access out of range!");
   2223     return cast_or_null<Expr>(SubExprs[Arg + getNumPreArgs() + PREARGS_START]);
   2224   }
   2225 
   2226   /// setArg - Set the specified argument.
   2227   void setArg(unsigned Arg, Expr *ArgExpr) {
   2228     assert(Arg < NumArgs && "Arg access out of range!");
   2229     SubExprs[Arg+getNumPreArgs()+PREARGS_START] = ArgExpr;
   2230   }
   2231 
   2232   /// setNumArgs - This changes the number of arguments present in this call.
   2233   /// Any orphaned expressions are deleted by this, and any new operands are set
   2234   /// to null.
   2235   void setNumArgs(const ASTContext& C, unsigned NumArgs);
   2236 
   2237   typedef ExprIterator arg_iterator;
   2238   typedef ConstExprIterator const_arg_iterator;
   2239   typedef llvm::iterator_range<arg_iterator> arg_range;
   2240   typedef llvm::iterator_range<const_arg_iterator> arg_const_range;
   2241 
   2242   arg_range arguments() { return arg_range(arg_begin(), arg_end()); }
   2243   arg_const_range arguments() const {
   2244     return arg_const_range(arg_begin(), arg_end());
   2245   }
   2246 
   2247   arg_iterator arg_begin() { return SubExprs+PREARGS_START+getNumPreArgs(); }
   2248   arg_iterator arg_end() {
   2249     return SubExprs+PREARGS_START+getNumPreArgs()+getNumArgs();
   2250   }
   2251   const_arg_iterator arg_begin() const {
   2252     return SubExprs+PREARGS_START+getNumPreArgs();
   2253   }
   2254   const_arg_iterator arg_end() const {
   2255     return SubExprs+PREARGS_START+getNumPreArgs()+getNumArgs();
   2256   }
   2257 
   2258   /// This method provides fast access to all the subexpressions of
   2259   /// a CallExpr without going through the slower virtual child_iterator
   2260   /// interface.  This provides efficient reverse iteration of the
   2261   /// subexpressions.  This is currently used for CFG construction.
   2262   ArrayRef<Stmt*> getRawSubExprs() {
   2263     return llvm::makeArrayRef(SubExprs,
   2264                               getNumPreArgs() + PREARGS_START + getNumArgs());
   2265   }
   2266 
   2267   /// getNumCommas - Return the number of commas that must have been present in
   2268   /// this function call.
   2269   unsigned getNumCommas() const { return NumArgs ? NumArgs - 1 : 0; }
   2270 
   2271   /// getBuiltinCallee - If this is a call to a builtin, return the builtin ID
   2272   /// of the callee. If not, return 0.
   2273   unsigned getBuiltinCallee() const;
   2274 
   2275   /// \brief Returns \c true if this is a call to a builtin which does not
   2276   /// evaluate side-effects within its arguments.
   2277   bool isUnevaluatedBuiltinCall(const ASTContext &Ctx) const;
   2278 
   2279   /// getCallReturnType - Get the return type of the call expr. This is not
   2280   /// always the type of the expr itself, if the return type is a reference
   2281   /// type.
   2282   QualType getCallReturnType(const ASTContext &Ctx) const;
   2283 
   2284   SourceLocation getRParenLoc() const { return RParenLoc; }
   2285   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
   2286 
   2287   SourceLocation getLocStart() const LLVM_READONLY;
   2288   SourceLocation getLocEnd() const LLVM_READONLY;
   2289 
   2290   static bool classof(const Stmt *T) {
   2291     return T->getStmtClass() >= firstCallExprConstant &&
   2292            T->getStmtClass() <= lastCallExprConstant;
   2293   }
   2294 
   2295   // Iterators
   2296   child_range children() {
   2297     return child_range(&SubExprs[0],
   2298                        &SubExprs[0]+NumArgs+getNumPreArgs()+PREARGS_START);
   2299   }
   2300 };
   2301 
   2302 /// Extra data stored in some MemberExpr objects.
   2303 struct MemberExprNameQualifier {
   2304   /// \brief The nested-name-specifier that qualifies the name, including
   2305   /// source-location information.
   2306   NestedNameSpecifierLoc QualifierLoc;
   2307 
   2308   /// \brief The DeclAccessPair through which the MemberDecl was found due to
   2309   /// name qualifiers.
   2310   DeclAccessPair FoundDecl;
   2311 };
   2312 
   2313 /// MemberExpr - [C99 6.5.2.3] Structure and Union Members.  X->F and X.F.
   2314 ///
   2315 class MemberExpr final
   2316     : public Expr,
   2317       private llvm::TrailingObjects<MemberExpr, MemberExprNameQualifier,
   2318                                     ASTTemplateKWAndArgsInfo,
   2319                                     TemplateArgumentLoc> {
   2320   /// Base - the expression for the base pointer or structure references.  In
   2321   /// X.F, this is "X".
   2322   Stmt *Base;
   2323 
   2324   /// MemberDecl - This is the decl being referenced by the field/member name.
   2325   /// In X.F, this is the decl referenced by F.
   2326   ValueDecl *MemberDecl;
   2327 
   2328   /// MemberDNLoc - Provides source/type location info for the
   2329   /// declaration name embedded in MemberDecl.
   2330   DeclarationNameLoc MemberDNLoc;
   2331 
   2332   /// MemberLoc - This is the location of the member name.
   2333   SourceLocation MemberLoc;
   2334 
   2335   /// This is the location of the -> or . in the expression.
   2336   SourceLocation OperatorLoc;
   2337 
   2338   /// IsArrow - True if this is "X->F", false if this is "X.F".
   2339   bool IsArrow : 1;
   2340 
   2341   /// \brief True if this member expression used a nested-name-specifier to
   2342   /// refer to the member, e.g., "x->Base::f", or found its member via a using
   2343   /// declaration.  When true, a MemberExprNameQualifier
   2344   /// structure is allocated immediately after the MemberExpr.
   2345   bool HasQualifierOrFoundDecl : 1;
   2346 
   2347   /// \brief True if this member expression specified a template keyword
   2348   /// and/or a template argument list explicitly, e.g., x->f<int>,
   2349   /// x->template f, x->template f<int>.
   2350   /// When true, an ASTTemplateKWAndArgsInfo structure and its
   2351   /// TemplateArguments (if any) are present.
   2352   bool HasTemplateKWAndArgsInfo : 1;
   2353 
   2354   /// \brief True if this member expression refers to a method that
   2355   /// was resolved from an overloaded set having size greater than 1.
   2356   bool HadMultipleCandidates : 1;
   2357 
   2358   size_t numTrailingObjects(OverloadToken<MemberExprNameQualifier>) const {
   2359     return HasQualifierOrFoundDecl ? 1 : 0;
   2360   }
   2361 
   2362   size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
   2363     return HasTemplateKWAndArgsInfo ? 1 : 0;
   2364   }
   2365 
   2366 public:
   2367   MemberExpr(Expr *base, bool isarrow, SourceLocation operatorloc,
   2368              ValueDecl *memberdecl, const DeclarationNameInfo &NameInfo,
   2369              QualType ty, ExprValueKind VK, ExprObjectKind OK)
   2370       : Expr(MemberExprClass, ty, VK, OK, base->isTypeDependent(),
   2371              base->isValueDependent(), base->isInstantiationDependent(),
   2372              base->containsUnexpandedParameterPack()),
   2373         Base(base), MemberDecl(memberdecl), MemberDNLoc(NameInfo.getInfo()),
   2374         MemberLoc(NameInfo.getLoc()), OperatorLoc(operatorloc),
   2375         IsArrow(isarrow), HasQualifierOrFoundDecl(false),
   2376         HasTemplateKWAndArgsInfo(false), HadMultipleCandidates(false) {
   2377     assert(memberdecl->getDeclName() == NameInfo.getName());
   2378   }
   2379 
   2380   // NOTE: this constructor should be used only when it is known that
   2381   // the member name can not provide additional syntactic info
   2382   // (i.e., source locations for C++ operator names or type source info
   2383   // for constructors, destructors and conversion operators).
   2384   MemberExpr(Expr *base, bool isarrow, SourceLocation operatorloc,
   2385              ValueDecl *memberdecl, SourceLocation l, QualType ty,
   2386              ExprValueKind VK, ExprObjectKind OK)
   2387       : Expr(MemberExprClass, ty, VK, OK, base->isTypeDependent(),
   2388              base->isValueDependent(), base->isInstantiationDependent(),
   2389              base->containsUnexpandedParameterPack()),
   2390         Base(base), MemberDecl(memberdecl), MemberDNLoc(), MemberLoc(l),
   2391         OperatorLoc(operatorloc), IsArrow(isarrow),
   2392         HasQualifierOrFoundDecl(false), HasTemplateKWAndArgsInfo(false),
   2393         HadMultipleCandidates(false) {}
   2394 
   2395   static MemberExpr *Create(const ASTContext &C, Expr *base, bool isarrow,
   2396                             SourceLocation OperatorLoc,
   2397                             NestedNameSpecifierLoc QualifierLoc,
   2398                             SourceLocation TemplateKWLoc, ValueDecl *memberdecl,
   2399                             DeclAccessPair founddecl,
   2400                             DeclarationNameInfo MemberNameInfo,
   2401                             const TemplateArgumentListInfo *targs, QualType ty,
   2402                             ExprValueKind VK, ExprObjectKind OK);
   2403 
   2404   void setBase(Expr *E) { Base = E; }
   2405   Expr *getBase() const { return cast<Expr>(Base); }
   2406 
   2407   /// \brief Retrieve the member declaration to which this expression refers.
   2408   ///
   2409   /// The returned declaration will either be a FieldDecl or (in C++)
   2410   /// a CXXMethodDecl.
   2411   ValueDecl *getMemberDecl() const { return MemberDecl; }
   2412   void setMemberDecl(ValueDecl *D) { MemberDecl = D; }
   2413 
   2414   /// \brief Retrieves the declaration found by lookup.
   2415   DeclAccessPair getFoundDecl() const {
   2416     if (!HasQualifierOrFoundDecl)
   2417       return DeclAccessPair::make(getMemberDecl(),
   2418                                   getMemberDecl()->getAccess());
   2419     return getTrailingObjects<MemberExprNameQualifier>()->FoundDecl;
   2420   }
   2421 
   2422   /// \brief Determines whether this member expression actually had
   2423   /// a C++ nested-name-specifier prior to the name of the member, e.g.,
   2424   /// x->Base::foo.
   2425   bool hasQualifier() const { return getQualifier() != nullptr; }
   2426 
   2427   /// \brief If the member name was qualified, retrieves the
   2428   /// nested-name-specifier that precedes the member name, with source-location
   2429   /// information.
   2430   NestedNameSpecifierLoc getQualifierLoc() const {
   2431     if (!HasQualifierOrFoundDecl)
   2432       return NestedNameSpecifierLoc();
   2433 
   2434     return getTrailingObjects<MemberExprNameQualifier>()->QualifierLoc;
   2435   }
   2436 
   2437   /// \brief If the member name was qualified, retrieves the
   2438   /// nested-name-specifier that precedes the member name. Otherwise, returns
   2439   /// NULL.
   2440   NestedNameSpecifier *getQualifier() const {
   2441     return getQualifierLoc().getNestedNameSpecifier();
   2442   }
   2443 
   2444   /// \brief Retrieve the location of the template keyword preceding
   2445   /// the member name, if any.
   2446   SourceLocation getTemplateKeywordLoc() const {
   2447     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
   2448     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc;
   2449   }
   2450 
   2451   /// \brief Retrieve the location of the left angle bracket starting the
   2452   /// explicit template argument list following the member name, if any.
   2453   SourceLocation getLAngleLoc() const {
   2454     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
   2455     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc;
   2456   }
   2457 
   2458   /// \brief Retrieve the location of the right angle bracket ending the
   2459   /// explicit template argument list following the member name, if any.
   2460   SourceLocation getRAngleLoc() const {
   2461     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
   2462     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc;
   2463   }
   2464 
   2465   /// Determines whether the member name was preceded by the template keyword.
   2466   bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
   2467 
   2468   /// \brief Determines whether the member name was followed by an
   2469   /// explicit template argument list.
   2470   bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
   2471 
   2472   /// \brief Copies the template arguments (if present) into the given
   2473   /// structure.
   2474   void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
   2475     if (hasExplicitTemplateArgs())
   2476       getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto(
   2477           getTrailingObjects<TemplateArgumentLoc>(), List);
   2478   }
   2479 
   2480   /// \brief Retrieve the template arguments provided as part of this
   2481   /// template-id.
   2482   const TemplateArgumentLoc *getTemplateArgs() const {
   2483     if (!hasExplicitTemplateArgs())
   2484       return nullptr;
   2485 
   2486     return getTrailingObjects<TemplateArgumentLoc>();
   2487   }
   2488 
   2489   /// \brief Retrieve the number of template arguments provided as part of this
   2490   /// template-id.
   2491   unsigned getNumTemplateArgs() const {
   2492     if (!hasExplicitTemplateArgs())
   2493       return 0;
   2494 
   2495     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
   2496   }
   2497 
   2498   ArrayRef<TemplateArgumentLoc> template_arguments() const {
   2499     return {getTemplateArgs(), getNumTemplateArgs()};
   2500   }
   2501 
   2502   /// \brief Retrieve the member declaration name info.
   2503   DeclarationNameInfo getMemberNameInfo() const {
   2504     return DeclarationNameInfo(MemberDecl->getDeclName(),
   2505                                MemberLoc, MemberDNLoc);
   2506   }
   2507 
   2508   SourceLocation getOperatorLoc() const LLVM_READONLY { return OperatorLoc; }
   2509 
   2510   bool isArrow() const { return IsArrow; }
   2511   void setArrow(bool A) { IsArrow = A; }
   2512 
   2513   /// getMemberLoc - Return the location of the "member", in X->F, it is the
   2514   /// location of 'F'.
   2515   SourceLocation getMemberLoc() const { return MemberLoc; }
   2516   void setMemberLoc(SourceLocation L) { MemberLoc = L; }
   2517 
   2518   SourceLocation getLocStart() const LLVM_READONLY;
   2519   SourceLocation getLocEnd() const LLVM_READONLY;
   2520 
   2521   SourceLocation getExprLoc() const LLVM_READONLY { return MemberLoc; }
   2522 
   2523   /// \brief Determine whether the base of this explicit is implicit.
   2524   bool isImplicitAccess() const {
   2525     return getBase() && getBase()->isImplicitCXXThis();
   2526   }
   2527 
   2528   /// \brief Returns true if this member expression refers to a method that
   2529   /// was resolved from an overloaded set having size greater than 1.
   2530   bool hadMultipleCandidates() const {
   2531     return HadMultipleCandidates;
   2532   }
   2533   /// \brief Sets the flag telling whether this expression refers to
   2534   /// a method that was resolved from an overloaded set having size
   2535   /// greater than 1.
   2536   void setHadMultipleCandidates(bool V = true) {
   2537     HadMultipleCandidates = V;
   2538   }
   2539 
   2540   /// \brief Returns true if virtual dispatch is performed.
   2541   /// If the member access is fully qualified, (i.e. X::f()), virtual
   2542   /// dispatching is not performed. In -fapple-kext mode qualified
   2543   /// calls to virtual method will still go through the vtable.
   2544   bool performsVirtualDispatch(const LangOptions &LO) const {
   2545     return LO.AppleKext || !hasQualifier();
   2546   }
   2547 
   2548   static bool classof(const Stmt *T) {
   2549     return T->getStmtClass() == MemberExprClass;
   2550   }
   2551 
   2552   // Iterators
   2553   child_range children() { return child_range(&Base, &Base+1); }
   2554 
   2555   friend TrailingObjects;
   2556   friend class ASTReader;
   2557   friend class ASTStmtWriter;
   2558 };
   2559 
   2560 /// CompoundLiteralExpr - [C99 6.5.2.5]
   2561 ///
   2562 class CompoundLiteralExpr : public Expr {
   2563   /// LParenLoc - If non-null, this is the location of the left paren in a
   2564   /// compound literal like "(int){4}".  This can be null if this is a
   2565   /// synthesized compound expression.
   2566   SourceLocation LParenLoc;
   2567 
   2568   /// The type as written.  This can be an incomplete array type, in
   2569   /// which case the actual expression type will be different.
   2570   /// The int part of the pair stores whether this expr is file scope.
   2571   llvm::PointerIntPair<TypeSourceInfo *, 1, bool> TInfoAndScope;
   2572   Stmt *Init;
   2573 public:
   2574   CompoundLiteralExpr(SourceLocation lparenloc, TypeSourceInfo *tinfo,
   2575                       QualType T, ExprValueKind VK, Expr *init, bool fileScope)
   2576     : Expr(CompoundLiteralExprClass, T, VK, OK_Ordinary,
   2577            tinfo->getType()->isDependentType(),
   2578            init->isValueDependent(),
   2579            (init->isInstantiationDependent() ||
   2580             tinfo->getType()->isInstantiationDependentType()),
   2581            init->containsUnexpandedParameterPack()),
   2582       LParenLoc(lparenloc), TInfoAndScope(tinfo, fileScope), Init(init) {}
   2583 
   2584   /// \brief Construct an empty compound literal.
   2585   explicit CompoundLiteralExpr(EmptyShell Empty)
   2586     : Expr(CompoundLiteralExprClass, Empty) { }
   2587 
   2588   const Expr *getInitializer() const { return cast<Expr>(Init); }
   2589   Expr *getInitializer() { return cast<Expr>(Init); }
   2590   void setInitializer(Expr *E) { Init = E; }
   2591 
   2592   bool isFileScope() const { return TInfoAndScope.getInt(); }
   2593   void setFileScope(bool FS) { TInfoAndScope.setInt(FS); }
   2594 
   2595   SourceLocation getLParenLoc() const { return LParenLoc; }
   2596   void setLParenLoc(SourceLocation L) { LParenLoc = L; }
   2597 
   2598   TypeSourceInfo *getTypeSourceInfo() const {
   2599     return TInfoAndScope.getPointer();
   2600   }
   2601   void setTypeSourceInfo(TypeSourceInfo *tinfo) {
   2602     TInfoAndScope.setPointer(tinfo);
   2603   }
   2604 
   2605   SourceLocation getLocStart() const LLVM_READONLY {
   2606     // FIXME: Init should never be null.
   2607     if (!Init)
   2608       return SourceLocation();
   2609     if (LParenLoc.isInvalid())
   2610       return Init->getLocStart();
   2611     return LParenLoc;
   2612   }
   2613   SourceLocation getLocEnd() const LLVM_READONLY {
   2614     // FIXME: Init should never be null.
   2615     if (!Init)
   2616       return SourceLocation();
   2617     return Init->getLocEnd();
   2618   }
   2619 
   2620   static bool classof(const Stmt *T) {
   2621     return T->getStmtClass() == CompoundLiteralExprClass;
   2622   }
   2623 
   2624   // Iterators
   2625   child_range children() { return child_range(&Init, &Init+1); }
   2626 };
   2627 
   2628 /// CastExpr - Base class for type casts, including both implicit
   2629 /// casts (ImplicitCastExpr) and explicit casts that have some
   2630 /// representation in the source code (ExplicitCastExpr's derived
   2631 /// classes).
   2632 class CastExpr : public Expr {
   2633 private:
   2634   Stmt *Op;
   2635 
   2636   bool CastConsistency() const;
   2637 
   2638   const CXXBaseSpecifier * const *path_buffer() const {
   2639     return const_cast<CastExpr*>(this)->path_buffer();
   2640   }
   2641   CXXBaseSpecifier **path_buffer();
   2642 
   2643   void setBasePathSize(unsigned basePathSize) {
   2644     CastExprBits.BasePathSize = basePathSize;
   2645     assert(CastExprBits.BasePathSize == basePathSize &&
   2646            "basePathSize doesn't fit in bits of CastExprBits.BasePathSize!");
   2647   }
   2648 
   2649 protected:
   2650   CastExpr(StmtClass SC, QualType ty, ExprValueKind VK, const CastKind kind,
   2651            Expr *op, unsigned BasePathSize)
   2652       : Expr(SC, ty, VK, OK_Ordinary,
   2653              // Cast expressions are type-dependent if the type is
   2654              // dependent (C++ [temp.dep.expr]p3).
   2655              ty->isDependentType(),
   2656              // Cast expressions are value-dependent if the type is
   2657              // dependent or if the subexpression is value-dependent.
   2658              ty->isDependentType() || (op && op->isValueDependent()),
   2659              (ty->isInstantiationDependentType() ||
   2660               (op && op->isInstantiationDependent())),
   2661              // An implicit cast expression doesn't (lexically) contain an
   2662              // unexpanded pack, even if its target type does.
   2663              ((SC != ImplicitCastExprClass &&
   2664                ty->containsUnexpandedParameterPack()) ||
   2665               (op && op->containsUnexpandedParameterPack()))),
   2666         Op(op) {
   2667     assert(kind != CK_Invalid && "creating cast with invalid cast kind");
   2668     CastExprBits.Kind = kind;
   2669     setBasePathSize(BasePathSize);
   2670     assert(CastConsistency());
   2671   }
   2672 
   2673   /// \brief Construct an empty cast.
   2674   CastExpr(StmtClass SC, EmptyShell Empty, unsigned BasePathSize)
   2675     : Expr(SC, Empty) {
   2676     setBasePathSize(BasePathSize);
   2677   }
   2678 
   2679 public:
   2680   CastKind getCastKind() const { return (CastKind) CastExprBits.Kind; }
   2681   void setCastKind(CastKind K) { CastExprBits.Kind = K; }
   2682   const char *getCastKindName() const;
   2683 
   2684   Expr *getSubExpr() { return cast<Expr>(Op); }
   2685   const Expr *getSubExpr() const { return cast<Expr>(Op); }
   2686   void setSubExpr(Expr *E) { Op = E; }
   2687 
   2688   /// \brief Retrieve the cast subexpression as it was written in the source
   2689   /// code, looking through any implicit casts or other intermediate nodes
   2690   /// introduced by semantic analysis.
   2691   Expr *getSubExprAsWritten();
   2692   const Expr *getSubExprAsWritten() const {
   2693     return const_cast<CastExpr *>(this)->getSubExprAsWritten();
   2694   }
   2695 
   2696   typedef CXXBaseSpecifier **path_iterator;
   2697   typedef const CXXBaseSpecifier * const *path_const_iterator;
   2698   bool path_empty() const { return CastExprBits.BasePathSize == 0; }
   2699   unsigned path_size() const { return CastExprBits.BasePathSize; }
   2700   path_iterator path_begin() { return path_buffer(); }
   2701   path_iterator path_end() { return path_buffer() + path_size(); }
   2702   path_const_iterator path_begin() const { return path_buffer(); }
   2703   path_const_iterator path_end() const { return path_buffer() + path_size(); }
   2704 
   2705   static bool classof(const Stmt *T) {
   2706     return T->getStmtClass() >= firstCastExprConstant &&
   2707            T->getStmtClass() <= lastCastExprConstant;
   2708   }
   2709 
   2710   // Iterators
   2711   child_range children() { return child_range(&Op, &Op+1); }
   2712 };
   2713 
   2714 /// ImplicitCastExpr - Allows us to explicitly represent implicit type
   2715 /// conversions, which have no direct representation in the original
   2716 /// source code. For example: converting T[]->T*, void f()->void
   2717 /// (*f)(), float->double, short->int, etc.
   2718 ///
   2719 /// In C, implicit casts always produce rvalues. However, in C++, an
   2720 /// implicit cast whose result is being bound to a reference will be
   2721 /// an lvalue or xvalue. For example:
   2722 ///
   2723 /// @code
   2724 /// class Base { };
   2725 /// class Derived : public Base { };
   2726 /// Derived &&ref();
   2727 /// void f(Derived d) {
   2728 ///   Base& b = d; // initializer is an ImplicitCastExpr
   2729 ///                // to an lvalue of type Base
   2730 ///   Base&& r = ref(); // initializer is an ImplicitCastExpr
   2731 ///                     // to an xvalue of type Base
   2732 /// }
   2733 /// @endcode
   2734 class ImplicitCastExpr final
   2735     : public CastExpr,
   2736       private llvm::TrailingObjects<ImplicitCastExpr, CXXBaseSpecifier *> {
   2737 private:
   2738   ImplicitCastExpr(QualType ty, CastKind kind, Expr *op,
   2739                    unsigned BasePathLength, ExprValueKind VK)
   2740     : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, BasePathLength) {
   2741   }
   2742 
   2743   /// \brief Construct an empty implicit cast.
   2744   explicit ImplicitCastExpr(EmptyShell Shell, unsigned PathSize)
   2745     : CastExpr(ImplicitCastExprClass, Shell, PathSize) { }
   2746 
   2747 public:
   2748   enum OnStack_t { OnStack };
   2749   ImplicitCastExpr(OnStack_t _, QualType ty, CastKind kind, Expr *op,
   2750                    ExprValueKind VK)
   2751     : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, 0) {
   2752   }
   2753 
   2754   static ImplicitCastExpr *Create(const ASTContext &Context, QualType T,
   2755                                   CastKind Kind, Expr *Operand,
   2756                                   const CXXCastPath *BasePath,
   2757                                   ExprValueKind Cat);
   2758 
   2759   static ImplicitCastExpr *CreateEmpty(const ASTContext &Context,
   2760                                        unsigned PathSize);
   2761 
   2762   SourceLocation getLocStart() const LLVM_READONLY {
   2763     return getSubExpr()->getLocStart();
   2764   }
   2765   SourceLocation getLocEnd() const LLVM_READONLY {
   2766     return getSubExpr()->getLocEnd();
   2767   }
   2768 
   2769   static bool classof(const Stmt *T) {
   2770     return T->getStmtClass() == ImplicitCastExprClass;
   2771   }
   2772 
   2773   friend TrailingObjects;
   2774   friend class CastExpr;
   2775 };
   2776 
   2777 inline Expr *Expr::IgnoreImpCasts() {
   2778   Expr *e = this;
   2779   while (ImplicitCastExpr *ice = dyn_cast<ImplicitCastExpr>(e))
   2780     e = ice->getSubExpr();
   2781   return e;
   2782 }
   2783 
   2784 /// ExplicitCastExpr - An explicit cast written in the source
   2785 /// code.
   2786 ///
   2787 /// This class is effectively an abstract class, because it provides
   2788 /// the basic representation of an explicitly-written cast without
   2789 /// specifying which kind of cast (C cast, functional cast, static
   2790 /// cast, etc.) was written; specific derived classes represent the
   2791 /// particular style of cast and its location information.
   2792 ///
   2793 /// Unlike implicit casts, explicit cast nodes have two different
   2794 /// types: the type that was written into the source code, and the
   2795 /// actual type of the expression as determined by semantic
   2796 /// analysis. These types may differ slightly. For example, in C++ one
   2797 /// can cast to a reference type, which indicates that the resulting
   2798 /// expression will be an lvalue or xvalue. The reference type, however,
   2799 /// will not be used as the type of the expression.
   2800 class ExplicitCastExpr : public CastExpr {
   2801   /// TInfo - Source type info for the (written) type
   2802   /// this expression is casting to.
   2803   TypeSourceInfo *TInfo;
   2804 
   2805 protected:
   2806   ExplicitCastExpr(StmtClass SC, QualType exprTy, ExprValueKind VK,
   2807                    CastKind kind, Expr *op, unsigned PathSize,
   2808                    TypeSourceInfo *writtenTy)
   2809     : CastExpr(SC, exprTy, VK, kind, op, PathSize), TInfo(writtenTy) {}
   2810 
   2811   /// \brief Construct an empty explicit cast.
   2812   ExplicitCastExpr(StmtClass SC, EmptyShell Shell, unsigned PathSize)
   2813     : CastExpr(SC, Shell, PathSize) { }
   2814 
   2815 public:
   2816   /// getTypeInfoAsWritten - Returns the type source info for the type
   2817   /// that this expression is casting to.
   2818   TypeSourceInfo *getTypeInfoAsWritten() const { return TInfo; }
   2819   void setTypeInfoAsWritten(TypeSourceInfo *writtenTy) { TInfo = writtenTy; }
   2820 
   2821   /// getTypeAsWritten - Returns the type that this expression is
   2822   /// casting to, as written in the source code.
   2823   QualType getTypeAsWritten() const { return TInfo->getType(); }
   2824 
   2825   static bool classof(const Stmt *T) {
   2826      return T->getStmtClass() >= firstExplicitCastExprConstant &&
   2827             T->getStmtClass() <= lastExplicitCastExprConstant;
   2828   }
   2829 };
   2830 
   2831 /// CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style
   2832 /// cast in C++ (C++ [expr.cast]), which uses the syntax
   2833 /// (Type)expr. For example: @c (int)f.
   2834 class CStyleCastExpr final
   2835     : public ExplicitCastExpr,
   2836       private llvm::TrailingObjects<CStyleCastExpr, CXXBaseSpecifier *> {
   2837   SourceLocation LPLoc; // the location of the left paren
   2838   SourceLocation RPLoc; // the location of the right paren
   2839 
   2840   CStyleCastExpr(QualType exprTy, ExprValueKind vk, CastKind kind, Expr *op,
   2841                  unsigned PathSize, TypeSourceInfo *writtenTy,
   2842                  SourceLocation l, SourceLocation r)
   2843     : ExplicitCastExpr(CStyleCastExprClass, exprTy, vk, kind, op, PathSize,
   2844                        writtenTy), LPLoc(l), RPLoc(r) {}
   2845 
   2846   /// \brief Construct an empty C-style explicit cast.
   2847   explicit CStyleCastExpr(EmptyShell Shell, unsigned PathSize)
   2848     : ExplicitCastExpr(CStyleCastExprClass, Shell, PathSize) { }
   2849 
   2850 public:
   2851   static CStyleCastExpr *Create(const ASTContext &Context, QualType T,
   2852                                 ExprValueKind VK, CastKind K,
   2853                                 Expr *Op, const CXXCastPath *BasePath,
   2854                                 TypeSourceInfo *WrittenTy, SourceLocation L,
   2855                                 SourceLocation R);
   2856 
   2857   static CStyleCastExpr *CreateEmpty(const ASTContext &Context,
   2858                                      unsigned PathSize);
   2859 
   2860   SourceLocation getLParenLoc() const { return LPLoc; }
   2861   void setLParenLoc(SourceLocation L) { LPLoc = L; }
   2862 
   2863   SourceLocation getRParenLoc() const { return RPLoc; }
   2864   void setRParenLoc(SourceLocation L) { RPLoc = L; }
   2865 
   2866   SourceLocation getLocStart() const LLVM_READONLY { return LPLoc; }
   2867   SourceLocation getLocEnd() const LLVM_READONLY {
   2868     return getSubExpr()->getLocEnd();
   2869   }
   2870 
   2871   static bool classof(const Stmt *T) {
   2872     return T->getStmtClass() == CStyleCastExprClass;
   2873   }
   2874 
   2875   friend TrailingObjects;
   2876   friend class CastExpr;
   2877 };
   2878 
   2879 /// \brief A builtin binary operation expression such as "x + y" or "x <= y".
   2880 ///
   2881 /// This expression node kind describes a builtin binary operation,
   2882 /// such as "x + y" for integer values "x" and "y". The operands will
   2883 /// already have been converted to appropriate types (e.g., by
   2884 /// performing promotions or conversions).
   2885 ///
   2886 /// In C++, where operators may be overloaded, a different kind of
   2887 /// expression node (CXXOperatorCallExpr) is used to express the
   2888 /// invocation of an overloaded operator with operator syntax. Within
   2889 /// a C++ template, whether BinaryOperator or CXXOperatorCallExpr is
   2890 /// used to store an expression "x + y" depends on the subexpressions
   2891 /// for x and y. If neither x or y is type-dependent, and the "+"
   2892 /// operator resolves to a built-in operation, BinaryOperator will be
   2893 /// used to express the computation (x and y may still be
   2894 /// value-dependent). If either x or y is type-dependent, or if the
   2895 /// "+" resolves to an overloaded operator, CXXOperatorCallExpr will
   2896 /// be used to express the computation.
   2897 class BinaryOperator : public Expr {
   2898 public:
   2899   typedef BinaryOperatorKind Opcode;
   2900 
   2901 private:
   2902   unsigned Opc : 6;
   2903 
   2904   // Records the FP_CONTRACT pragma status at the point that this binary
   2905   // operator was parsed. This bit is only meaningful for operations on
   2906   // floating point types. For all other types it should default to
   2907   // false.
   2908   unsigned FPContractable : 1;
   2909   SourceLocation OpLoc;
   2910 
   2911   enum { LHS, RHS, END_EXPR };
   2912   Stmt* SubExprs[END_EXPR];
   2913 public:
   2914 
   2915   BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy,
   2916                  ExprValueKind VK, ExprObjectKind OK,
   2917                  SourceLocation opLoc, bool fpContractable)
   2918     : Expr(BinaryOperatorClass, ResTy, VK, OK,
   2919            lhs->isTypeDependent() || rhs->isTypeDependent(),
   2920            lhs->isValueDependent() || rhs->isValueDependent(),
   2921            (lhs->isInstantiationDependent() ||
   2922             rhs->isInstantiationDependent()),
   2923            (lhs->containsUnexpandedParameterPack() ||
   2924             rhs->containsUnexpandedParameterPack())),
   2925       Opc(opc), FPContractable(fpContractable), OpLoc(opLoc) {
   2926     SubExprs[LHS] = lhs;
   2927     SubExprs[RHS] = rhs;
   2928     assert(!isCompoundAssignmentOp() &&
   2929            "Use CompoundAssignOperator for compound assignments");
   2930   }
   2931 
   2932   /// \brief Construct an empty binary operator.
   2933   explicit BinaryOperator(EmptyShell Empty)
   2934     : Expr(BinaryOperatorClass, Empty), Opc(BO_Comma) { }
   2935 
   2936   SourceLocation getExprLoc() const LLVM_READONLY { return OpLoc; }
   2937   SourceLocation getOperatorLoc() const { return OpLoc; }
   2938   void setOperatorLoc(SourceLocation L) { OpLoc = L; }
   2939 
   2940   Opcode getOpcode() const { return static_cast<Opcode>(Opc); }
   2941   void setOpcode(Opcode O) { Opc = O; }
   2942 
   2943   Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
   2944   void setLHS(Expr *E) { SubExprs[LHS] = E; }
   2945   Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
   2946   void setRHS(Expr *E) { SubExprs[RHS] = E; }
   2947 
   2948   SourceLocation getLocStart() const LLVM_READONLY {
   2949     return getLHS()->getLocStart();
   2950   }
   2951   SourceLocation getLocEnd() const LLVM_READONLY {
   2952     return getRHS()->getLocEnd();
   2953   }
   2954 
   2955   /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
   2956   /// corresponds to, e.g. "<<=".
   2957   static StringRef getOpcodeStr(Opcode Op);
   2958 
   2959   StringRef getOpcodeStr() const { return getOpcodeStr(getOpcode()); }
   2960 
   2961   /// \brief Retrieve the binary opcode that corresponds to the given
   2962   /// overloaded operator.
   2963   static Opcode getOverloadedOpcode(OverloadedOperatorKind OO);
   2964 
   2965   /// \brief Retrieve the overloaded operator kind that corresponds to
   2966   /// the given binary opcode.
   2967   static OverloadedOperatorKind getOverloadedOperator(Opcode Opc);
   2968 
   2969   /// predicates to categorize the respective opcodes.
   2970   bool isPtrMemOp() const { return Opc == BO_PtrMemD || Opc == BO_PtrMemI; }
   2971   static bool isMultiplicativeOp(Opcode Opc) {
   2972     return Opc >= BO_Mul && Opc <= BO_Rem;
   2973   }
   2974   bool isMultiplicativeOp() const { return isMultiplicativeOp(getOpcode()); }
   2975   static bool isAdditiveOp(Opcode Opc) { return Opc == BO_Add || Opc==BO_Sub; }
   2976   bool isAdditiveOp() const { return isAdditiveOp(getOpcode()); }
   2977   static bool isShiftOp(Opcode Opc) { return Opc == BO_Shl || Opc == BO_Shr; }
   2978   bool isShiftOp() const { return isShiftOp(getOpcode()); }
   2979 
   2980   static bool isBitwiseOp(Opcode Opc) { return Opc >= BO_And && Opc <= BO_Or; }
   2981   bool isBitwiseOp() const { return isBitwiseOp(getOpcode()); }
   2982 
   2983   static bool isRelationalOp(Opcode Opc) { return Opc >= BO_LT && Opc<=BO_GE; }
   2984   bool isRelationalOp() const { return isRelationalOp(getOpcode()); }
   2985 
   2986   static bool isEqualityOp(Opcode Opc) { return Opc == BO_EQ || Opc == BO_NE; }
   2987   bool isEqualityOp() const { return isEqualityOp(getOpcode()); }
   2988 
   2989   static bool isComparisonOp(Opcode Opc) { return Opc >= BO_LT && Opc<=BO_NE; }
   2990   bool isComparisonOp() const { return isComparisonOp(getOpcode()); }
   2991 
   2992   static Opcode negateComparisonOp(Opcode Opc) {
   2993     switch (Opc) {
   2994     default:
   2995       llvm_unreachable("Not a comparsion operator.");
   2996     case BO_LT: return BO_GE;
   2997     case BO_GT: return BO_LE;
   2998     case BO_LE: return BO_GT;
   2999     case BO_GE: return BO_LT;
   3000     case BO_EQ: return BO_NE;
   3001     case BO_NE: return BO_EQ;
   3002     }
   3003   }
   3004 
   3005   static Opcode reverseComparisonOp(Opcode Opc) {
   3006     switch (Opc) {
   3007     default:
   3008       llvm_unreachable("Not a comparsion operator.");
   3009     case BO_LT: return BO_GT;
   3010     case BO_GT: return BO_LT;
   3011     case BO_LE: return BO_GE;
   3012     case BO_GE: return BO_LE;
   3013     case BO_EQ:
   3014     case BO_NE:
   3015       return Opc;
   3016     }
   3017   }
   3018 
   3019   static bool isLogicalOp(Opcode Opc) { return Opc == BO_LAnd || Opc==BO_LOr; }
   3020   bool isLogicalOp() const { return isLogicalOp(getOpcode()); }
   3021 
   3022   static bool isAssignmentOp(Opcode Opc) {
   3023     return Opc >= BO_Assign && Opc <= BO_OrAssign;
   3024   }
   3025   bool isAssignmentOp() const { return isAssignmentOp(getOpcode()); }
   3026 
   3027   static bool isCompoundAssignmentOp(Opcode Opc) {
   3028     return Opc > BO_Assign && Opc <= BO_OrAssign;
   3029   }
   3030   bool isCompoundAssignmentOp() const {
   3031     return isCompoundAssignmentOp(getOpcode());
   3032   }
   3033   static Opcode getOpForCompoundAssignment(Opcode Opc) {
   3034     assert(isCompoundAssignmentOp(Opc));
   3035     if (Opc >= BO_AndAssign)
   3036       return Opcode(unsigned(Opc) - BO_AndAssign + BO_And);
   3037     else
   3038       return Opcode(unsigned(Opc) - BO_MulAssign + BO_Mul);
   3039   }
   3040 
   3041   static bool isShiftAssignOp(Opcode Opc) {
   3042     return Opc == BO_ShlAssign || Opc == BO_ShrAssign;
   3043   }
   3044   bool isShiftAssignOp() const {
   3045     return isShiftAssignOp(getOpcode());
   3046   }
   3047 
   3048   static bool classof(const Stmt *S) {
   3049     return S->getStmtClass() >= firstBinaryOperatorConstant &&
   3050            S->getStmtClass() <= lastBinaryOperatorConstant;
   3051   }
   3052 
   3053   // Iterators
   3054   child_range children() {
   3055     return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
   3056   }
   3057 
   3058   // Set the FP contractability status of this operator. Only meaningful for
   3059   // operations on floating point types.
   3060   void setFPContractable(bool FPC) { FPContractable = FPC; }
   3061 
   3062   // Get the FP contractability status of this operator. Only meaningful for
   3063   // operations on floating point types.
   3064   bool isFPContractable() const { return FPContractable; }
   3065 
   3066 protected:
   3067   BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy,
   3068                  ExprValueKind VK, ExprObjectKind OK,
   3069                  SourceLocation opLoc, bool fpContractable, bool dead2)
   3070     : Expr(CompoundAssignOperatorClass, ResTy, VK, OK,
   3071            lhs->isTypeDependent() || rhs->isTypeDependent(),
   3072            lhs->isValueDependent() || rhs->isValueDependent(),
   3073            (lhs->isInstantiationDependent() ||
   3074             rhs->isInstantiationDependent()),
   3075            (lhs->containsUnexpandedParameterPack() ||
   3076             rhs->containsUnexpandedParameterPack())),
   3077       Opc(opc), FPContractable(fpContractable), OpLoc(opLoc) {
   3078     SubExprs[LHS] = lhs;
   3079     SubExprs[RHS] = rhs;
   3080   }
   3081 
   3082   BinaryOperator(StmtClass SC, EmptyShell Empty)
   3083     : Expr(SC, Empty), Opc(BO_MulAssign) { }
   3084 };
   3085 
   3086 /// CompoundAssignOperator - For compound assignments (e.g. +=), we keep
   3087 /// track of the type the operation is performed in.  Due to the semantics of
   3088 /// these operators, the operands are promoted, the arithmetic performed, an
   3089 /// implicit conversion back to the result type done, then the assignment takes
   3090 /// place.  This captures the intermediate type which the computation is done
   3091 /// in.
   3092 class CompoundAssignOperator : public BinaryOperator {
   3093   QualType ComputationLHSType;
   3094   QualType ComputationResultType;
   3095 public:
   3096   CompoundAssignOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResType,
   3097                          ExprValueKind VK, ExprObjectKind OK,
   3098                          QualType CompLHSType, QualType CompResultType,
   3099                          SourceLocation OpLoc, bool fpContractable)
   3100     : BinaryOperator(lhs, rhs, opc, ResType, VK, OK, OpLoc, fpContractable,
   3101                      true),
   3102       ComputationLHSType(CompLHSType),
   3103       ComputationResultType(CompResultType) {
   3104     assert(isCompoundAssignmentOp() &&
   3105            "Only should be used for compound assignments");
   3106   }
   3107 
   3108   /// \brief Build an empty compound assignment operator expression.
   3109   explicit CompoundAssignOperator(EmptyShell Empty)
   3110     : BinaryOperator(CompoundAssignOperatorClass, Empty) { }
   3111 
   3112   // The two computation types are the type the LHS is converted
   3113   // to for the computation and the type of the result; the two are
   3114   // distinct in a few cases (specifically, int+=ptr and ptr-=ptr).
   3115   QualType getComputationLHSType() const { return ComputationLHSType; }
   3116   void setComputationLHSType(QualType T) { ComputationLHSType = T; }
   3117 
   3118   QualType getComputationResultType() const { return ComputationResultType; }
   3119   void setComputationResultType(QualType T) { ComputationResultType = T; }
   3120 
   3121   static bool classof(const Stmt *S) {
   3122     return S->getStmtClass() == CompoundAssignOperatorClass;
   3123   }
   3124 };
   3125 
   3126 /// AbstractConditionalOperator - An abstract base class for
   3127 /// ConditionalOperator and BinaryConditionalOperator.
   3128 class AbstractConditionalOperator : public Expr {
   3129   SourceLocation QuestionLoc, ColonLoc;
   3130   friend class ASTStmtReader;
   3131 
   3132 protected:
   3133   AbstractConditionalOperator(StmtClass SC, QualType T,
   3134                               ExprValueKind VK, ExprObjectKind OK,
   3135                               bool TD, bool VD, bool ID,
   3136                               bool ContainsUnexpandedParameterPack,
   3137                               SourceLocation qloc,
   3138                               SourceLocation cloc)
   3139     : Expr(SC, T, VK, OK, TD, VD, ID, ContainsUnexpandedParameterPack),
   3140       QuestionLoc(qloc), ColonLoc(cloc) {}
   3141 
   3142   AbstractConditionalOperator(StmtClass SC, EmptyShell Empty)
   3143     : Expr(SC, Empty) { }
   3144 
   3145 public:
   3146   // getCond - Return the expression representing the condition for
   3147   //   the ?: operator.
   3148   Expr *getCond() const;
   3149 
   3150   // getTrueExpr - Return the subexpression representing the value of
   3151   //   the expression if the condition evaluates to true.
   3152   Expr *getTrueExpr() const;
   3153 
   3154   // getFalseExpr - Return the subexpression representing the value of
   3155   //   the expression if the condition evaluates to false.  This is
   3156   //   the same as getRHS.
   3157   Expr *getFalseExpr() const;
   3158 
   3159   SourceLocation getQuestionLoc() const { return QuestionLoc; }
   3160   SourceLocation getColonLoc() const { return ColonLoc; }
   3161 
   3162   static bool classof(const Stmt *T) {
   3163     return T->getStmtClass() == ConditionalOperatorClass ||
   3164            T->getStmtClass() == BinaryConditionalOperatorClass;
   3165   }
   3166 };
   3167 
   3168 /// ConditionalOperator - The ?: ternary operator.  The GNU "missing
   3169 /// middle" extension is a BinaryConditionalOperator.
   3170 class ConditionalOperator : public AbstractConditionalOperator {
   3171   enum { COND, LHS, RHS, END_EXPR };
   3172   Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides.
   3173 
   3174   friend class ASTStmtReader;
   3175 public:
   3176   ConditionalOperator(Expr *cond, SourceLocation QLoc, Expr *lhs,
   3177                       SourceLocation CLoc, Expr *rhs,
   3178                       QualType t, ExprValueKind VK, ExprObjectKind OK)
   3179     : AbstractConditionalOperator(ConditionalOperatorClass, t, VK, OK,
   3180            // FIXME: the type of the conditional operator doesn't
   3181            // depend on the type of the conditional, but the standard
   3182            // seems to imply that it could. File a bug!
   3183            (lhs->isTypeDependent() || rhs->isTypeDependent()),
   3184            (cond->isValueDependent() || lhs->isValueDependent() ||
   3185             rhs->isValueDependent()),
   3186            (cond->isInstantiationDependent() ||
   3187             lhs->isInstantiationDependent() ||
   3188             rhs->isInstantiationDependent()),
   3189            (cond->containsUnexpandedParameterPack() ||
   3190             lhs->containsUnexpandedParameterPack() ||
   3191             rhs->containsUnexpandedParameterPack()),
   3192                                   QLoc, CLoc) {
   3193     SubExprs[COND] = cond;
   3194     SubExprs[LHS] = lhs;
   3195     SubExprs[RHS] = rhs;
   3196   }
   3197 
   3198   /// \brief Build an empty conditional operator.
   3199   explicit ConditionalOperator(EmptyShell Empty)
   3200     : AbstractConditionalOperator(ConditionalOperatorClass, Empty) { }
   3201 
   3202   // getCond - Return the expression representing the condition for
   3203   //   the ?: operator.
   3204   Expr *getCond() const { return cast<Expr>(SubExprs[COND]); }
   3205 
   3206   // getTrueExpr - Return the subexpression representing the value of
   3207   //   the expression if the condition evaluates to true.
   3208   Expr *getTrueExpr() const { return cast<Expr>(SubExprs[LHS]); }
   3209 
   3210   // getFalseExpr - Return the subexpression representing the value of
   3211   //   the expression if the condition evaluates to false.  This is
   3212   //   the same as getRHS.
   3213   Expr *getFalseExpr() const { return cast<Expr>(SubExprs[RHS]); }
   3214 
   3215   Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
   3216   Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
   3217 
   3218   SourceLocation getLocStart() const LLVM_READONLY {
   3219     return getCond()->getLocStart();
   3220   }
   3221   SourceLocation getLocEnd() const LLVM_READONLY {
   3222     return getRHS()->getLocEnd();
   3223   }
   3224 
   3225   static bool classof(const Stmt *T) {
   3226     return T->getStmtClass() == ConditionalOperatorClass;
   3227   }
   3228 
   3229   // Iterators
   3230   child_range children() {
   3231     return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
   3232   }
   3233 };
   3234 
   3235 /// BinaryConditionalOperator - The GNU extension to the conditional
   3236 /// operator which allows the middle operand to be omitted.
   3237 ///
   3238 /// This is a different expression kind on the assumption that almost
   3239 /// every client ends up needing to know that these are different.
   3240 class BinaryConditionalOperator : public AbstractConditionalOperator {
   3241   enum { COMMON, COND, LHS, RHS, NUM_SUBEXPRS };
   3242 
   3243   /// - the common condition/left-hand-side expression, which will be
   3244   ///   evaluated as the opaque value
   3245   /// - the condition, expressed in terms of the opaque value
   3246   /// - the left-hand-side, expressed in terms of the opaque value
   3247   /// - the right-hand-side
   3248   Stmt *SubExprs[NUM_SUBEXPRS];
   3249   OpaqueValueExpr *OpaqueValue;
   3250 
   3251   friend class ASTStmtReader;
   3252 public:
   3253   BinaryConditionalOperator(Expr *common, OpaqueValueExpr *opaqueValue,
   3254                             Expr *cond, Expr *lhs, Expr *rhs,
   3255                             SourceLocation qloc, SourceLocation cloc,
   3256                             QualType t, ExprValueKind VK, ExprObjectKind OK)
   3257     : AbstractConditionalOperator(BinaryConditionalOperatorClass, t, VK, OK,
   3258            (common->isTypeDependent() || rhs->isTypeDependent()),
   3259            (common->isValueDependent() || rhs->isValueDependent()),
   3260            (common->isInstantiationDependent() ||
   3261             rhs->isInstantiationDependent()),
   3262            (common->containsUnexpandedParameterPack() ||
   3263             rhs->containsUnexpandedParameterPack()),
   3264                                   qloc, cloc),
   3265       OpaqueValue(opaqueValue) {
   3266     SubExprs[COMMON] = common;
   3267     SubExprs[COND] = cond;
   3268     SubExprs[LHS] = lhs;
   3269     SubExprs[RHS] = rhs;
   3270     assert(OpaqueValue->getSourceExpr() == common && "Wrong opaque value");
   3271   }
   3272 
   3273   /// \brief Build an empty conditional operator.
   3274   explicit BinaryConditionalOperator(EmptyShell Empty)
   3275     : AbstractConditionalOperator(BinaryConditionalOperatorClass, Empty) { }
   3276 
   3277   /// \brief getCommon - Return the common expression, written to the
   3278   ///   left of the condition.  The opaque value will be bound to the
   3279   ///   result of this expression.
   3280   Expr *getCommon() const { return cast<Expr>(SubExprs[COMMON]); }
   3281 
   3282   /// \brief getOpaqueValue - Return the opaque value placeholder.
   3283   OpaqueValueExpr *getOpaqueValue() const { return OpaqueValue; }
   3284 
   3285   /// \brief getCond - Return the condition expression; this is defined
   3286   ///   in terms of the opaque value.
   3287   Expr *getCond() const { return cast<Expr>(SubExprs[COND]); }
   3288 
   3289   /// \brief getTrueExpr - Return the subexpression which will be
   3290   ///   evaluated if the condition evaluates to true;  this is defined
   3291   ///   in terms of the opaque value.
   3292   Expr *getTrueExpr() const {
   3293     return cast<Expr>(SubExprs[LHS]);
   3294   }
   3295 
   3296   /// \brief getFalseExpr - Return the subexpression which will be
   3297   ///   evaluated if the condnition evaluates to false; this is
   3298   ///   defined in terms of the opaque value.
   3299   Expr *getFalseExpr() const {
   3300     return cast<Expr>(SubExprs[RHS]);
   3301   }
   3302 
   3303   SourceLocation getLocStart() const LLVM_READONLY {
   3304     return getCommon()->getLocStart();
   3305   }
   3306   SourceLocation getLocEnd() const LLVM_READONLY {
   3307     return getFalseExpr()->getLocEnd();
   3308   }
   3309 
   3310   static bool classof(const Stmt *T) {
   3311     return T->getStmtClass() == BinaryConditionalOperatorClass;
   3312   }
   3313 
   3314   // Iterators
   3315   child_range children() {
   3316     return child_range(SubExprs, SubExprs + NUM_SUBEXPRS);
   3317   }
   3318 };
   3319 
   3320 inline Expr *AbstractConditionalOperator::getCond() const {
   3321   if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this))
   3322     return co->getCond();
   3323   return cast<BinaryConditionalOperator>(this)->getCond();
   3324 }
   3325 
   3326 inline Expr *AbstractConditionalOperator::getTrueExpr() const {
   3327   if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this))
   3328     return co->getTrueExpr();
   3329   return cast<BinaryConditionalOperator>(this)->getTrueExpr();
   3330 }
   3331 
   3332 inline Expr *AbstractConditionalOperator::getFalseExpr() const {
   3333   if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this))
   3334     return co->getFalseExpr();
   3335   return cast<BinaryConditionalOperator>(this)->getFalseExpr();
   3336 }
   3337 
   3338 /// AddrLabelExpr - The GNU address of label extension, representing &&label.
   3339 class AddrLabelExpr : public Expr {
   3340   SourceLocation AmpAmpLoc, LabelLoc;
   3341   LabelDecl *Label;
   3342 public:
   3343   AddrLabelExpr(SourceLocation AALoc, SourceLocation LLoc, LabelDecl *L,
   3344                 QualType t)
   3345     : Expr(AddrLabelExprClass, t, VK_RValue, OK_Ordinary, false, false, false,
   3346            false),
   3347       AmpAmpLoc(AALoc), LabelLoc(LLoc), Label(L) {}
   3348 
   3349   /// \brief Build an empty address of a label expression.
   3350   explicit AddrLabelExpr(EmptyShell Empty)
   3351     : Expr(AddrLabelExprClass, Empty) { }
   3352 
   3353   SourceLocation getAmpAmpLoc() const { return AmpAmpLoc; }
   3354   void setAmpAmpLoc(SourceLocation L) { AmpAmpLoc = L; }
   3355   SourceLocation getLabelLoc() const { return LabelLoc; }
   3356   void setLabelLoc(SourceLocation L) { LabelLoc = L; }
   3357 
   3358   SourceLocation getLocStart() const LLVM_READONLY { return AmpAmpLoc; }
   3359   SourceLocation getLocEnd() const LLVM_READONLY { return LabelLoc; }
   3360 
   3361   LabelDecl *getLabel() const { return Label; }
   3362   void setLabel(LabelDecl *L) { Label = L; }
   3363 
   3364   static bool classof(const Stmt *T) {
   3365     return T->getStmtClass() == AddrLabelExprClass;
   3366   }
   3367 
   3368   // Iterators
   3369   child_range children() {
   3370     return child_range(child_iterator(), child_iterator());
   3371   }
   3372 };
   3373 
   3374 /// StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
   3375 /// The StmtExpr contains a single CompoundStmt node, which it evaluates and
   3376 /// takes the value of the last subexpression.
   3377 ///
   3378 /// A StmtExpr is always an r-value; values "returned" out of a
   3379 /// StmtExpr will be copied.
   3380 class StmtExpr : public Expr {
   3381   Stmt *SubStmt;
   3382   SourceLocation LParenLoc, RParenLoc;
   3383 public:
   3384   // FIXME: Does type-dependence need to be computed differently?
   3385   // FIXME: Do we need to compute instantiation instantiation-dependence for
   3386   // statements? (ugh!)
   3387   StmtExpr(CompoundStmt *substmt, QualType T,
   3388            SourceLocation lp, SourceLocation rp) :
   3389     Expr(StmtExprClass, T, VK_RValue, OK_Ordinary,
   3390          T->isDependentType(), false, false, false),
   3391     SubStmt(substmt), LParenLoc(lp), RParenLoc(rp) { }
   3392 
   3393   /// \brief Build an empty statement expression.
   3394   explicit StmtExpr(EmptyShell Empty) : Expr(StmtExprClass, Empty) { }
   3395 
   3396   CompoundStmt *getSubStmt() { return cast<CompoundStmt>(SubStmt); }
   3397   const CompoundStmt *getSubStmt() const { return cast<CompoundStmt>(SubStmt); }
   3398   void setSubStmt(CompoundStmt *S) { SubStmt = S; }
   3399 
   3400   SourceLocation getLocStart() const LLVM_READONLY { return LParenLoc; }
   3401   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
   3402 
   3403   SourceLocation getLParenLoc() const { return LParenLoc; }
   3404   void setLParenLoc(SourceLocation L) { LParenLoc = L; }
   3405   SourceLocation getRParenLoc() const { return RParenLoc; }
   3406   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
   3407 
   3408   static bool classof(const Stmt *T) {
   3409     return T->getStmtClass() == StmtExprClass;
   3410   }
   3411 
   3412   // Iterators
   3413   child_range children() { return child_range(&SubStmt, &SubStmt+1); }
   3414 };
   3415 
   3416 /// ShuffleVectorExpr - clang-specific builtin-in function
   3417 /// __builtin_shufflevector.
   3418 /// This AST node represents a operator that does a constant
   3419 /// shuffle, similar to LLVM's shufflevector instruction. It takes
   3420 /// two vectors and a variable number of constant indices,
   3421 /// and returns the appropriately shuffled vector.
   3422 class ShuffleVectorExpr : public Expr {
   3423   SourceLocation BuiltinLoc, RParenLoc;
   3424 
   3425   // SubExprs - the list of values passed to the __builtin_shufflevector
   3426   // function. The first two are vectors, and the rest are constant
   3427   // indices.  The number of values in this list is always
   3428   // 2+the number of indices in the vector type.
   3429   Stmt **SubExprs;
   3430   unsigned NumExprs;
   3431 
   3432 public:
   3433   ShuffleVectorExpr(const ASTContext &C, ArrayRef<Expr*> args, QualType Type,
   3434                     SourceLocation BLoc, SourceLocation RP);
   3435 
   3436   /// \brief Build an empty vector-shuffle expression.
   3437   explicit ShuffleVectorExpr(EmptyShell Empty)
   3438     : Expr(ShuffleVectorExprClass, Empty), SubExprs(nullptr) { }
   3439 
   3440   SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
   3441   void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; }
   3442 
   3443   SourceLocation getRParenLoc() const { return RParenLoc; }
   3444   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
   3445 
   3446   SourceLocation getLocStart() const LLVM_READONLY { return BuiltinLoc; }
   3447   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
   3448 
   3449   static bool classof(const Stmt *T) {
   3450     return T->getStmtClass() == ShuffleVectorExprClass;
   3451   }
   3452 
   3453   /// getNumSubExprs - Return the size of the SubExprs array.  This includes the
   3454   /// constant expression, the actual arguments passed in, and the function
   3455   /// pointers.
   3456   unsigned getNumSubExprs() const { return NumExprs; }
   3457 
   3458   /// \brief Retrieve the array of expressions.
   3459   Expr **getSubExprs() { return reinterpret_cast<Expr **>(SubExprs); }
   3460 
   3461   /// getExpr - Return the Expr at the specified index.
   3462   Expr *getExpr(unsigned Index) {
   3463     assert((Index < NumExprs) && "Arg access out of range!");
   3464     return cast<Expr>(SubExprs[Index]);
   3465   }
   3466   const Expr *getExpr(unsigned Index) const {
   3467     assert((Index < NumExprs) && "Arg access out of range!");
   3468     return cast<Expr>(SubExprs[Index]);
   3469   }
   3470 
   3471   void setExprs(const ASTContext &C, ArrayRef<Expr *> Exprs);
   3472 
   3473   llvm::APSInt getShuffleMaskIdx(const ASTContext &Ctx, unsigned N) const {
   3474     assert((N < NumExprs - 2) && "Shuffle idx out of range!");
   3475     return getExpr(N+2)->EvaluateKnownConstInt(Ctx);
   3476   }
   3477 
   3478   // Iterators
   3479   child_range children() {
   3480     return child_range(&SubExprs[0], &SubExprs[0]+NumExprs);
   3481   }
   3482 };
   3483 
   3484 /// ConvertVectorExpr - Clang builtin function __builtin_convertvector
   3485 /// This AST node provides support for converting a vector type to another
   3486 /// vector type of the same arity.
   3487 class ConvertVectorExpr : public Expr {
   3488 private:
   3489   Stmt *SrcExpr;
   3490   TypeSourceInfo *TInfo;
   3491   SourceLocation BuiltinLoc, RParenLoc;
   3492 
   3493   friend class ASTReader;
   3494   friend class ASTStmtReader;
   3495   explicit ConvertVectorExpr(EmptyShell Empty) : Expr(ConvertVectorExprClass, Empty) {}
   3496 
   3497 public:
   3498   ConvertVectorExpr(Expr* SrcExpr, TypeSourceInfo *TI, QualType DstType,
   3499              ExprValueKind VK, ExprObjectKind OK,
   3500              SourceLocation BuiltinLoc, SourceLocation RParenLoc)
   3501     : Expr(ConvertVectorExprClass, DstType, VK, OK,
   3502            DstType->isDependentType(),
   3503            DstType->isDependentType() || SrcExpr->isValueDependent(),
   3504            (DstType->isInstantiationDependentType() ||
   3505             SrcExpr->isInstantiationDependent()),
   3506            (DstType->containsUnexpandedParameterPack() ||
   3507             SrcExpr->containsUnexpandedParameterPack())),
   3508   SrcExpr(SrcExpr), TInfo(TI), BuiltinLoc(BuiltinLoc), RParenLoc(RParenLoc) {}
   3509 
   3510   /// getSrcExpr - Return the Expr to be converted.
   3511   Expr *getSrcExpr() const { return cast<Expr>(SrcExpr); }
   3512 
   3513   /// getTypeSourceInfo - Return the destination type.
   3514   TypeSourceInfo *getTypeSourceInfo() const {
   3515     return TInfo;
   3516   }
   3517   void setTypeSourceInfo(TypeSourceInfo *ti) {
   3518     TInfo = ti;
   3519   }
   3520 
   3521   /// getBuiltinLoc - Return the location of the __builtin_convertvector token.
   3522   SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
   3523 
   3524   /// getRParenLoc - Return the location of final right parenthesis.
   3525   SourceLocation getRParenLoc() const { return RParenLoc; }
   3526 
   3527   SourceLocation getLocStart() const LLVM_READONLY { return BuiltinLoc; }
   3528   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
   3529 
   3530   static bool classof(const Stmt *T) {
   3531     return T->getStmtClass() == ConvertVectorExprClass;
   3532   }
   3533 
   3534   // Iterators
   3535   child_range children() { return child_range(&SrcExpr, &SrcExpr+1); }
   3536 };
   3537 
   3538 /// ChooseExpr - GNU builtin-in function __builtin_choose_expr.
   3539 /// This AST node is similar to the conditional operator (?:) in C, with
   3540 /// the following exceptions:
   3541 /// - the test expression must be a integer constant expression.
   3542 /// - the expression returned acts like the chosen subexpression in every
   3543 ///   visible way: the type is the same as that of the chosen subexpression,
   3544 ///   and all predicates (whether it's an l-value, whether it's an integer
   3545 ///   constant expression, etc.) return the same result as for the chosen
   3546 ///   sub-expression.
   3547 class ChooseExpr : public Expr {
   3548   enum { COND, LHS, RHS, END_EXPR };
   3549   Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides.
   3550   SourceLocation BuiltinLoc, RParenLoc;
   3551   bool CondIsTrue;
   3552 public:
   3553   ChooseExpr(SourceLocation BLoc, Expr *cond, Expr *lhs, Expr *rhs,
   3554              QualType t, ExprValueKind VK, ExprObjectKind OK,
   3555              SourceLocation RP, bool condIsTrue,
   3556              bool TypeDependent, bool ValueDependent)
   3557     : Expr(ChooseExprClass, t, VK, OK, TypeDependent, ValueDependent,
   3558            (cond->isInstantiationDependent() ||
   3559             lhs->isInstantiationDependent() ||
   3560             rhs->isInstantiationDependent()),
   3561            (cond->containsUnexpandedParameterPack() ||
   3562             lhs->containsUnexpandedParameterPack() ||
   3563             rhs->containsUnexpandedParameterPack())),
   3564       BuiltinLoc(BLoc), RParenLoc(RP), CondIsTrue(condIsTrue) {
   3565       SubExprs[COND] = cond;
   3566       SubExprs[LHS] = lhs;
   3567       SubExprs[RHS] = rhs;
   3568     }
   3569 
   3570   /// \brief Build an empty __builtin_choose_expr.
   3571   explicit ChooseExpr(EmptyShell Empty) : Expr(ChooseExprClass, Empty) { }
   3572 
   3573   /// isConditionTrue - Return whether the condition is true (i.e. not
   3574   /// equal to zero).
   3575   bool isConditionTrue() const {
   3576     assert(!isConditionDependent() &&
   3577            "Dependent condition isn't true or false");
   3578     return CondIsTrue;
   3579   }
   3580   void setIsConditionTrue(bool isTrue) { CondIsTrue = isTrue; }
   3581 
   3582   bool isConditionDependent() const {
   3583     return getCond()->isTypeDependent() || getCond()->isValueDependent();
   3584   }
   3585 
   3586   /// getChosenSubExpr - Return the subexpression chosen according to the
   3587   /// condition.
   3588   Expr *getChosenSubExpr() const {
   3589     return isConditionTrue() ? getLHS() : getRHS();
   3590   }
   3591 
   3592   Expr *getCond() const { return cast<Expr>(SubExprs[COND]); }
   3593   void setCond(Expr *E) { SubExprs[COND] = E; }
   3594   Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
   3595   void setLHS(Expr *E) { SubExprs[LHS] = E; }
   3596   Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
   3597   void setRHS(Expr *E) { SubExprs[RHS] = E; }
   3598 
   3599   SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
   3600   void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; }
   3601 
   3602   SourceLocation getRParenLoc() const { return RParenLoc; }
   3603   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
   3604 
   3605   SourceLocation getLocStart() const LLVM_READONLY { return BuiltinLoc; }
   3606   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
   3607 
   3608   static bool classof(const Stmt *T) {
   3609     return T->getStmtClass() == ChooseExprClass;
   3610   }
   3611 
   3612   // Iterators
   3613   child_range children() {
   3614     return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
   3615   }
   3616 };
   3617 
   3618 /// GNUNullExpr - Implements the GNU __null extension, which is a name
   3619 /// for a null pointer constant that has integral type (e.g., int or
   3620 /// long) and is the same size and alignment as a pointer. The __null
   3621 /// extension is typically only used by system headers, which define
   3622 /// NULL as __null in C++ rather than using 0 (which is an integer
   3623 /// that may not match the size of a pointer).
   3624 class GNUNullExpr : public Expr {
   3625   /// TokenLoc - The location of the __null keyword.
   3626   SourceLocation TokenLoc;
   3627 
   3628 public:
   3629   GNUNullExpr(QualType Ty, SourceLocation Loc)
   3630     : Expr(GNUNullExprClass, Ty, VK_RValue, OK_Ordinary, false, false, false,
   3631            false),
   3632       TokenLoc(Loc) { }
   3633 
   3634   /// \brief Build an empty GNU __null expression.
   3635   explicit GNUNullExpr(EmptyShell Empty) : Expr(GNUNullExprClass, Empty) { }
   3636 
   3637   /// getTokenLocation - The location of the __null token.
   3638   SourceLocation getTokenLocation() const { return TokenLoc; }
   3639   void setTokenLocation(SourceLocation L) { TokenLoc = L; }
   3640 
   3641   SourceLocation getLocStart() const LLVM_READONLY { return TokenLoc; }
   3642   SourceLocation getLocEnd() const LLVM_READONLY { return TokenLoc; }
   3643 
   3644   static bool classof(const Stmt *T) {
   3645     return T->getStmtClass() == GNUNullExprClass;
   3646   }
   3647 
   3648   // Iterators
   3649   child_range children() {
   3650     return child_range(child_iterator(), child_iterator());
   3651   }
   3652 };
   3653 
   3654 /// Represents a call to the builtin function \c __builtin_va_arg.
   3655 class VAArgExpr : public Expr {
   3656   Stmt *Val;
   3657   llvm::PointerIntPair<TypeSourceInfo *, 1, bool> TInfo;
   3658   SourceLocation BuiltinLoc, RParenLoc;
   3659 public:
   3660   VAArgExpr(SourceLocation BLoc, Expr *e, TypeSourceInfo *TInfo,
   3661             SourceLocation RPLoc, QualType t, bool IsMS)
   3662       : Expr(VAArgExprClass, t, VK_RValue, OK_Ordinary, t->isDependentType(),
   3663              false, (TInfo->getType()->isInstantiationDependentType() ||
   3664                      e->isInstantiationDependent()),
   3665              (TInfo->getType()->containsUnexpandedParameterPack() ||
   3666               e->containsUnexpandedParameterPack())),
   3667         Val(e), TInfo(TInfo, IsMS), BuiltinLoc(BLoc), RParenLoc(RPLoc) {}
   3668 
   3669   /// Create an empty __builtin_va_arg expression.
   3670   explicit VAArgExpr(EmptyShell Empty)
   3671       : Expr(VAArgExprClass, Empty), Val(nullptr), TInfo(nullptr, false) {}
   3672 
   3673   const Expr *getSubExpr() const { return cast<Expr>(Val); }
   3674   Expr *getSubExpr() { return cast<Expr>(Val); }
   3675   void setSubExpr(Expr *E) { Val = E; }
   3676 
   3677   /// Returns whether this is really a Win64 ABI va_arg expression.
   3678   bool isMicrosoftABI() const { return TInfo.getInt(); }
   3679   void setIsMicrosoftABI(bool IsMS) { TInfo.setInt(IsMS); }
   3680 
   3681   TypeSourceInfo *getWrittenTypeInfo() const { return TInfo.getPointer(); }
   3682   void setWrittenTypeInfo(TypeSourceInfo *TI) { TInfo.setPointer(TI); }
   3683 
   3684   SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
   3685   void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; }
   3686 
   3687   SourceLocation getRParenLoc() const { return RParenLoc; }
   3688   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
   3689 
   3690   SourceLocation getLocStart() const LLVM_READONLY { return BuiltinLoc; }
   3691   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
   3692 
   3693   static bool classof(const Stmt *T) {
   3694     return T->getStmtClass() == VAArgExprClass;
   3695   }
   3696 
   3697   // Iterators
   3698   child_range children() { return child_range(&Val, &Val+1); }
   3699 };
   3700 
   3701 /// @brief Describes an C or C++ initializer list.
   3702 ///
   3703 /// InitListExpr describes an initializer list, which can be used to
   3704 /// initialize objects of different types, including
   3705 /// struct/class/union types, arrays, and vectors. For example:
   3706 ///
   3707 /// @code
   3708 /// struct foo x = { 1, { 2, 3 } };
   3709 /// @endcode
   3710 ///
   3711 /// Prior to semantic analysis, an initializer list will represent the
   3712 /// initializer list as written by the user, but will have the
   3713 /// placeholder type "void". This initializer list is called the
   3714 /// syntactic form of the initializer, and may contain C99 designated
   3715 /// initializers (represented as DesignatedInitExprs), initializations
   3716 /// of subobject members without explicit braces, and so on. Clients
   3717 /// interested in the original syntax of the initializer list should
   3718 /// use the syntactic form of the initializer list.
   3719 ///
   3720 /// After semantic analysis, the initializer list will represent the
   3721 /// semantic form of the initializer, where the initializations of all
   3722 /// subobjects are made explicit with nested InitListExpr nodes and
   3723 /// C99 designators have been eliminated by placing the designated
   3724 /// initializations into the subobject they initialize. Additionally,
   3725 /// any "holes" in the initialization, where no initializer has been
   3726 /// specified for a particular subobject, will be replaced with
   3727 /// implicitly-generated ImplicitValueInitExpr expressions that
   3728 /// value-initialize the subobjects. Note, however, that the
   3729 /// initializer lists may still have fewer initializers than there are
   3730 /// elements to initialize within the object.
   3731 ///
   3732 /// After semantic analysis has completed, given an initializer list,
   3733 /// method isSemanticForm() returns true if and only if this is the
   3734 /// semantic form of the initializer list (note: the same AST node
   3735 /// may at the same time be the syntactic form).
   3736 /// Given the semantic form of the initializer list, one can retrieve
   3737 /// the syntactic form of that initializer list (when different)
   3738 /// using method getSyntacticForm(); the method returns null if applied
   3739 /// to a initializer list which is already in syntactic form.
   3740 /// Similarly, given the syntactic form (i.e., an initializer list such
   3741 /// that isSemanticForm() returns false), one can retrieve the semantic
   3742 /// form using method getSemanticForm().
   3743 /// Since many initializer lists have the same syntactic and semantic forms,
   3744 /// getSyntacticForm() may return NULL, indicating that the current
   3745 /// semantic initializer list also serves as its syntactic form.
   3746 class InitListExpr : public Expr {
   3747   // FIXME: Eliminate this vector in favor of ASTContext allocation
   3748   typedef ASTVector<Stmt *> InitExprsTy;
   3749   InitExprsTy InitExprs;
   3750   SourceLocation LBraceLoc, RBraceLoc;
   3751 
   3752   /// The alternative form of the initializer list (if it exists).
   3753   /// The int part of the pair stores whether this initializer list is
   3754   /// in semantic form. If not null, the pointer points to:
   3755   ///   - the syntactic form, if this is in semantic form;
   3756   ///   - the semantic form, if this is in syntactic form.
   3757   llvm::PointerIntPair<InitListExpr *, 1, bool> AltForm;
   3758 
   3759   /// \brief Either:
   3760   ///  If this initializer list initializes an array with more elements than
   3761   ///  there are initializers in the list, specifies an expression to be used
   3762   ///  for value initialization of the rest of the elements.
   3763   /// Or
   3764   ///  If this initializer list initializes a union, specifies which
   3765   ///  field within the union will be initialized.
   3766   llvm::PointerUnion<Expr *, FieldDecl *> ArrayFillerOrUnionFieldInit;
   3767 
   3768 public:
   3769   InitListExpr(const ASTContext &C, SourceLocation lbraceloc,
   3770                ArrayRef<Expr*> initExprs, SourceLocation rbraceloc);
   3771 
   3772   /// \brief Build an empty initializer list.
   3773   explicit InitListExpr(EmptyShell Empty)
   3774     : Expr(InitListExprClass, Empty) { }
   3775 
   3776   unsigned getNumInits() const { return InitExprs.size(); }
   3777 
   3778   /// \brief Retrieve the set of initializers.
   3779   Expr **getInits() { return reinterpret_cast<Expr **>(InitExprs.data()); }
   3780 
   3781   ArrayRef<Expr *> inits() {
   3782     return llvm::makeArrayRef(getInits(), getNumInits());
   3783   }
   3784 
   3785   const Expr *getInit(unsigned Init) const {
   3786     assert(Init < getNumInits() && "Initializer access out of range!");
   3787     return cast_or_null<Expr>(InitExprs[Init]);
   3788   }
   3789 
   3790   Expr *getInit(unsigned Init) {
   3791     assert(Init < getNumInits() && "Initializer access out of range!");
   3792     return cast_or_null<Expr>(InitExprs[Init]);
   3793   }
   3794 
   3795   void setInit(unsigned Init, Expr *expr) {
   3796     assert(Init < getNumInits() && "Initializer access out of range!");
   3797     InitExprs[Init] = expr;
   3798 
   3799     if (expr) {
   3800       ExprBits.TypeDependent |= expr->isTypeDependent();
   3801       ExprBits.ValueDependent |= expr->isValueDependent();
   3802       ExprBits.InstantiationDependent |= expr->isInstantiationDependent();
   3803       ExprBits.ContainsUnexpandedParameterPack |=
   3804           expr->containsUnexpandedParameterPack();
   3805     }
   3806   }
   3807 
   3808   /// \brief Reserve space for some number of initializers.
   3809   void reserveInits(const ASTContext &C, unsigned NumInits);
   3810 
   3811   /// @brief Specify the number of initializers
   3812   ///
   3813   /// If there are more than @p NumInits initializers, the remaining
   3814   /// initializers will be destroyed. If there are fewer than @p
   3815   /// NumInits initializers, NULL expressions will be added for the
   3816   /// unknown initializers.
   3817   void resizeInits(const ASTContext &Context, unsigned NumInits);
   3818 
   3819   /// @brief Updates the initializer at index @p Init with the new
   3820   /// expression @p expr, and returns the old expression at that
   3821   /// location.
   3822   ///
   3823   /// When @p Init is out of range for this initializer list, the
   3824   /// initializer list will be extended with NULL expressions to
   3825   /// accommodate the new entry.
   3826   Expr *updateInit(const ASTContext &C, unsigned Init, Expr *expr);
   3827 
   3828   /// \brief If this initializer list initializes an array with more elements
   3829   /// than there are initializers in the list, specifies an expression to be
   3830   /// used for value initialization of the rest of the elements.
   3831   Expr *getArrayFiller() {
   3832     return ArrayFillerOrUnionFieldInit.dyn_cast<Expr *>();
   3833   }
   3834   const Expr *getArrayFiller() const {
   3835     return const_cast<InitListExpr *>(this)->getArrayFiller();
   3836   }
   3837   void setArrayFiller(Expr *filler);
   3838 
   3839   /// \brief Return true if this is an array initializer and its array "filler"
   3840   /// has been set.
   3841   bool hasArrayFiller() const { return getArrayFiller(); }
   3842 
   3843   /// \brief If this initializes a union, specifies which field in the
   3844   /// union to initialize.
   3845   ///
   3846   /// Typically, this field is the first named field within the
   3847   /// union. However, a designated initializer can specify the
   3848   /// initialization of a different field within the union.
   3849   FieldDecl *getInitializedFieldInUnion() {
   3850     return ArrayFillerOrUnionFieldInit.dyn_cast<FieldDecl *>();
   3851   }
   3852   const FieldDecl *getInitializedFieldInUnion() const {
   3853     return const_cast<InitListExpr *>(this)->getInitializedFieldInUnion();
   3854   }
   3855   void setInitializedFieldInUnion(FieldDecl *FD) {
   3856     assert((FD == nullptr
   3857             || getInitializedFieldInUnion() == nullptr
   3858             || getInitializedFieldInUnion() == FD)
   3859            && "Only one field of a union may be initialized at a time!");
   3860     ArrayFillerOrUnionFieldInit = FD;
   3861   }
   3862 
   3863   // Explicit InitListExpr's originate from source code (and have valid source
   3864   // locations). Implicit InitListExpr's are created by the semantic analyzer.
   3865   bool isExplicit() {
   3866     return LBraceLoc.isValid() && RBraceLoc.isValid();
   3867   }
   3868 
   3869   // Is this an initializer for an array of characters, initialized by a string
   3870   // literal or an @encode?
   3871   bool isStringLiteralInit() const;
   3872 
   3873   SourceLocation getLBraceLoc() const { return LBraceLoc; }
   3874   void setLBraceLoc(SourceLocation Loc) { LBraceLoc = Loc; }
   3875   SourceLocation getRBraceLoc() const { return RBraceLoc; }
   3876   void setRBraceLoc(SourceLocation Loc) { RBraceLoc = Loc; }
   3877 
   3878   bool isSemanticForm() const { return AltForm.getInt(); }
   3879   InitListExpr *getSemanticForm() const {
   3880     return isSemanticForm() ? nullptr : AltForm.getPointer();
   3881   }
   3882   InitListExpr *getSyntacticForm() const {
   3883     return isSemanticForm() ? AltForm.getPointer() : nullptr;
   3884   }
   3885 
   3886   void setSyntacticForm(InitListExpr *Init) {
   3887     AltForm.setPointer(Init);
   3888     AltForm.setInt(true);
   3889     Init->AltForm.setPointer(this);
   3890     Init->AltForm.setInt(false);
   3891   }
   3892 
   3893   bool hadArrayRangeDesignator() const {
   3894     return InitListExprBits.HadArrayRangeDesignator != 0;
   3895   }
   3896   void sawArrayRangeDesignator(bool ARD = true) {
   3897     InitListExprBits.HadArrayRangeDesignator = ARD;
   3898   }
   3899 
   3900   SourceLocation getLocStart() const LLVM_READONLY;
   3901   SourceLocation getLocEnd() const LLVM_READONLY;
   3902 
   3903   static bool classof(const Stmt *T) {
   3904     return T->getStmtClass() == InitListExprClass;
   3905   }
   3906 
   3907   // Iterators
   3908   child_range children() {
   3909     // FIXME: This does not include the array filler expression.
   3910     if (InitExprs.empty())
   3911       return child_range(child_iterator(), child_iterator());
   3912     return child_range(&InitExprs[0], &InitExprs[0] + InitExprs.size());
   3913   }
   3914 
   3915   typedef InitExprsTy::iterator iterator;
   3916   typedef InitExprsTy::const_iterator const_iterator;
   3917   typedef InitExprsTy::reverse_iterator reverse_iterator;
   3918   typedef InitExprsTy::const_reverse_iterator const_reverse_iterator;
   3919 
   3920   iterator begin() { return InitExprs.begin(); }
   3921   const_iterator begin() const { return InitExprs.begin(); }
   3922   iterator end() { return InitExprs.end(); }
   3923   const_iterator end() const { return InitExprs.end(); }
   3924   reverse_iterator rbegin() { return InitExprs.rbegin(); }
   3925   const_reverse_iterator rbegin() const { return InitExprs.rbegin(); }
   3926   reverse_iterator rend() { return InitExprs.rend(); }
   3927   const_reverse_iterator rend() const { return InitExprs.rend(); }
   3928 
   3929   friend class ASTStmtReader;
   3930   friend class ASTStmtWriter;
   3931 };
   3932 
   3933 /// @brief Represents a C99 designated initializer expression.
   3934 ///
   3935 /// A designated initializer expression (C99 6.7.8) contains one or
   3936 /// more designators (which can be field designators, array
   3937 /// designators, or GNU array-range designators) followed by an
   3938 /// expression that initializes the field or element(s) that the
   3939 /// designators refer to. For example, given:
   3940 ///
   3941 /// @code
   3942 /// struct point {
   3943 ///   double x;
   3944 ///   double y;
   3945 /// };
   3946 /// struct point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
   3947 /// @endcode
   3948 ///
   3949 /// The InitListExpr contains three DesignatedInitExprs, the first of
   3950 /// which covers @c [2].y=1.0. This DesignatedInitExpr will have two
   3951 /// designators, one array designator for @c [2] followed by one field
   3952 /// designator for @c .y. The initialization expression will be 1.0.
   3953 class DesignatedInitExpr final
   3954     : public Expr,
   3955       private llvm::TrailingObjects<DesignatedInitExpr, Stmt *> {
   3956 public:
   3957   /// \brief Forward declaration of the Designator class.
   3958   class Designator;
   3959 
   3960 private:
   3961   /// The location of the '=' or ':' prior to the actual initializer
   3962   /// expression.
   3963   SourceLocation EqualOrColonLoc;
   3964 
   3965   /// Whether this designated initializer used the GNU deprecated
   3966   /// syntax rather than the C99 '=' syntax.
   3967   unsigned GNUSyntax : 1;
   3968 
   3969   /// The number of designators in this initializer expression.
   3970   unsigned NumDesignators : 15;
   3971 
   3972   /// The number of subexpressions of this initializer expression,
   3973   /// which contains both the initializer and any additional
   3974   /// expressions used by array and array-range designators.
   3975   unsigned NumSubExprs : 16;
   3976 
   3977   /// \brief The designators in this designated initialization
   3978   /// expression.
   3979   Designator *Designators;
   3980 
   3981   DesignatedInitExpr(const ASTContext &C, QualType Ty,
   3982                      llvm::ArrayRef<Designator> Designators,
   3983                      SourceLocation EqualOrColonLoc, bool GNUSyntax,
   3984                      ArrayRef<Expr *> IndexExprs, Expr *Init);
   3985 
   3986   explicit DesignatedInitExpr(unsigned NumSubExprs)
   3987     : Expr(DesignatedInitExprClass, EmptyShell()),
   3988       NumDesignators(0), NumSubExprs(NumSubExprs), Designators(nullptr) { }
   3989 
   3990 public:
   3991   /// A field designator, e.g., ".x".
   3992   struct FieldDesignator {
   3993     /// Refers to the field that is being initialized. The low bit
   3994     /// of this field determines whether this is actually a pointer
   3995     /// to an IdentifierInfo (if 1) or a FieldDecl (if 0). When
   3996     /// initially constructed, a field designator will store an
   3997     /// IdentifierInfo*. After semantic analysis has resolved that
   3998     /// name, the field designator will instead store a FieldDecl*.
   3999     uintptr_t NameOrField;
   4000 
   4001     /// The location of the '.' in the designated initializer.
   4002     unsigned DotLoc;
   4003 
   4004     /// The location of the field name in the designated initializer.
   4005     unsigned FieldLoc;
   4006   };
   4007 
   4008   /// An array or GNU array-range designator, e.g., "[9]" or "[10..15]".
   4009   struct ArrayOrRangeDesignator {
   4010     /// Location of the first index expression within the designated
   4011     /// initializer expression's list of subexpressions.
   4012     unsigned Index;
   4013     /// The location of the '[' starting the array range designator.
   4014     unsigned LBracketLoc;
   4015     /// The location of the ellipsis separating the start and end
   4016     /// indices. Only valid for GNU array-range designators.
   4017     unsigned EllipsisLoc;
   4018     /// The location of the ']' terminating the array range designator.
   4019     unsigned RBracketLoc;
   4020   };
   4021 
   4022   /// @brief Represents a single C99 designator.
   4023   ///
   4024   /// @todo This class is infuriatingly similar to clang::Designator,
   4025   /// but minor differences (storing indices vs. storing pointers)
   4026   /// keep us from reusing it. Try harder, later, to rectify these
   4027   /// differences.
   4028   class Designator {
   4029     /// @brief The kind of designator this describes.
   4030     enum {
   4031       FieldDesignator,
   4032       ArrayDesignator,
   4033       ArrayRangeDesignator
   4034     } Kind;
   4035 
   4036     union {
   4037       /// A field designator, e.g., ".x".
   4038       struct FieldDesignator Field;
   4039       /// An array or GNU array-range designator, e.g., "[9]" or "[10..15]".
   4040       struct ArrayOrRangeDesignator ArrayOrRange;
   4041     };
   4042     friend class DesignatedInitExpr;
   4043 
   4044   public:
   4045     Designator() {}
   4046 
   4047     /// @brief Initializes a field designator.
   4048     Designator(const IdentifierInfo *FieldName, SourceLocation DotLoc,
   4049                SourceLocation FieldLoc)
   4050       : Kind(FieldDesignator) {
   4051       Field.NameOrField = reinterpret_cast<uintptr_t>(FieldName) | 0x01;
   4052       Field.DotLoc = DotLoc.getRawEncoding();
   4053       Field.FieldLoc = FieldLoc.getRawEncoding();
   4054     }
   4055 
   4056     /// @brief Initializes an array designator.
   4057     Designator(unsigned Index, SourceLocation LBracketLoc,
   4058                SourceLocation RBracketLoc)
   4059       : Kind(ArrayDesignator) {
   4060       ArrayOrRange.Index = Index;
   4061       ArrayOrRange.LBracketLoc = LBracketLoc.getRawEncoding();
   4062       ArrayOrRange.EllipsisLoc = SourceLocation().getRawEncoding();
   4063       ArrayOrRange.RBracketLoc = RBracketLoc.getRawEncoding();
   4064     }
   4065 
   4066     /// @brief Initializes a GNU array-range designator.
   4067     Designator(unsigned Index, SourceLocation LBracketLoc,
   4068                SourceLocation EllipsisLoc, SourceLocation RBracketLoc)
   4069       : Kind(ArrayRangeDesignator) {
   4070       ArrayOrRange.Index = Index;
   4071       ArrayOrRange.LBracketLoc = LBracketLoc.getRawEncoding();
   4072       ArrayOrRange.EllipsisLoc = EllipsisLoc.getRawEncoding();
   4073       ArrayOrRange.RBracketLoc = RBracketLoc.getRawEncoding();
   4074     }
   4075 
   4076     bool isFieldDesignator() const { return Kind == FieldDesignator; }
   4077     bool isArrayDesignator() const { return Kind == ArrayDesignator; }
   4078     bool isArrayRangeDesignator() const { return Kind == ArrayRangeDesignator; }
   4079 
   4080     IdentifierInfo *getFieldName() const;
   4081 
   4082     FieldDecl *getField() const {
   4083       assert(Kind == FieldDesignator && "Only valid on a field designator");
   4084       if (Field.NameOrField & 0x01)
   4085         return nullptr;
   4086       else
   4087         return reinterpret_cast<FieldDecl *>(Field.NameOrField);
   4088     }
   4089 
   4090     void setField(FieldDecl *FD) {
   4091       assert(Kind == FieldDesignator && "Only valid on a field designator");
   4092       Field.NameOrField = reinterpret_cast<uintptr_t>(FD);
   4093     }
   4094 
   4095     SourceLocation getDotLoc() const {
   4096       assert(Kind == FieldDesignator && "Only valid on a field designator");
   4097       return SourceLocation::getFromRawEncoding(Field.DotLoc);
   4098     }
   4099 
   4100     SourceLocation getFieldLoc() const {
   4101       assert(Kind == FieldDesignator && "Only valid on a field designator");
   4102       return SourceLocation::getFromRawEncoding(Field.FieldLoc);
   4103     }
   4104 
   4105     SourceLocation getLBracketLoc() const {
   4106       assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) &&
   4107              "Only valid on an array or array-range designator");
   4108       return SourceLocation::getFromRawEncoding(ArrayOrRange.LBracketLoc);
   4109     }
   4110 
   4111     SourceLocation getRBracketLoc() const {
   4112       assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) &&
   4113              "Only valid on an array or array-range designator");
   4114       return SourceLocation::getFromRawEncoding(ArrayOrRange.RBracketLoc);
   4115     }
   4116 
   4117     SourceLocation getEllipsisLoc() const {
   4118       assert(Kind == ArrayRangeDesignator &&
   4119              "Only valid on an array-range designator");
   4120       return SourceLocation::getFromRawEncoding(ArrayOrRange.EllipsisLoc);
   4121     }
   4122 
   4123     unsigned getFirstExprIndex() const {
   4124       assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) &&
   4125              "Only valid on an array or array-range designator");
   4126       return ArrayOrRange.Index;
   4127     }
   4128 
   4129     SourceLocation getLocStart() const LLVM_READONLY {
   4130       if (Kind == FieldDesignator)
   4131         return getDotLoc().isInvalid()? getFieldLoc() : getDotLoc();
   4132       else
   4133         return getLBracketLoc();
   4134     }
   4135     SourceLocation getLocEnd() const LLVM_READONLY {
   4136       return Kind == FieldDesignator ? getFieldLoc() : getRBracketLoc();
   4137     }
   4138     SourceRange getSourceRange() const LLVM_READONLY {
   4139       return SourceRange(getLocStart(), getLocEnd());
   4140     }
   4141   };
   4142 
   4143   static DesignatedInitExpr *Create(const ASTContext &C,
   4144                                     llvm::ArrayRef<Designator> Designators,
   4145                                     ArrayRef<Expr*> IndexExprs,
   4146                                     SourceLocation EqualOrColonLoc,
   4147                                     bool GNUSyntax, Expr *Init);
   4148 
   4149   static DesignatedInitExpr *CreateEmpty(const ASTContext &C,
   4150                                          unsigned NumIndexExprs);
   4151 
   4152   /// @brief Returns the number of designators in this initializer.
   4153   unsigned size() const { return NumDesignators; }
   4154 
   4155   // Iterator access to the designators.
   4156   llvm::MutableArrayRef<Designator> designators() {
   4157     return {Designators, NumDesignators};
   4158   }
   4159 
   4160   llvm::ArrayRef<Designator> designators() const {
   4161     return {Designators, NumDesignators};
   4162   }
   4163 
   4164   Designator *getDesignator(unsigned Idx) { return &designators()[Idx]; }
   4165 
   4166   void setDesignators(const ASTContext &C, const Designator *Desigs,
   4167                       unsigned NumDesigs);
   4168 
   4169   Expr *getArrayIndex(const Designator &D) const;
   4170   Expr *getArrayRangeStart(const Designator &D) const;
   4171   Expr *getArrayRangeEnd(const Designator &D) const;
   4172 
   4173   /// @brief Retrieve the location of the '=' that precedes the
   4174   /// initializer value itself, if present.
   4175   SourceLocation getEqualOrColonLoc() const { return EqualOrColonLoc; }
   4176   void setEqualOrColonLoc(SourceLocation L) { EqualOrColonLoc = L; }
   4177 
   4178   /// @brief Determines whether this designated initializer used the
   4179   /// deprecated GNU syntax for designated initializers.
   4180   bool usesGNUSyntax() const { return GNUSyntax; }
   4181   void setGNUSyntax(bool GNU) { GNUSyntax = GNU; }
   4182 
   4183   /// @brief Retrieve the initializer value.
   4184   Expr *getInit() const {
   4185     return cast<Expr>(*const_cast<DesignatedInitExpr*>(this)->child_begin());
   4186   }
   4187 
   4188   void setInit(Expr *init) {
   4189     *child_begin() = init;
   4190   }
   4191 
   4192   /// \brief Retrieve the total number of subexpressions in this
   4193   /// designated initializer expression, including the actual
   4194   /// initialized value and any expressions that occur within array
   4195   /// and array-range designators.
   4196   unsigned getNumSubExprs() const { return NumSubExprs; }
   4197 
   4198   Expr *getSubExpr(unsigned Idx) const {
   4199     assert(Idx < NumSubExprs && "Subscript out of range");
   4200     return cast<Expr>(getTrailingObjects<Stmt *>()[Idx]);
   4201   }
   4202 
   4203   void setSubExpr(unsigned Idx, Expr *E) {
   4204     assert(Idx < NumSubExprs && "Subscript out of range");
   4205     getTrailingObjects<Stmt *>()[Idx] = E;
   4206   }
   4207 
   4208   /// \brief Replaces the designator at index @p Idx with the series
   4209   /// of designators in [First, Last).
   4210   void ExpandDesignator(const ASTContext &C, unsigned Idx,
   4211                         const Designator *First, const Designator *Last);
   4212 
   4213   SourceRange getDesignatorsSourceRange() const;
   4214 
   4215   SourceLocation getLocStart() const LLVM_READONLY;
   4216   SourceLocation getLocEnd() const LLVM_READONLY;
   4217 
   4218   static bool classof(const Stmt *T) {
   4219     return T->getStmtClass() == DesignatedInitExprClass;
   4220   }
   4221 
   4222   // Iterators
   4223   child_range children() {
   4224     Stmt **begin = getTrailingObjects<Stmt *>();
   4225     return child_range(begin, begin + NumSubExprs);
   4226   }
   4227 
   4228   friend TrailingObjects;
   4229 };
   4230 
   4231 /// \brief Represents a place-holder for an object not to be initialized by
   4232 /// anything.
   4233 ///
   4234 /// This only makes sense when it appears as part of an updater of a
   4235 /// DesignatedInitUpdateExpr (see below). The base expression of a DIUE
   4236 /// initializes a big object, and the NoInitExpr's mark the spots within the
   4237 /// big object not to be overwritten by the updater.
   4238 ///
   4239 /// \see DesignatedInitUpdateExpr
   4240 class NoInitExpr : public Expr {
   4241 public:
   4242   explicit NoInitExpr(QualType ty)
   4243     : Expr(NoInitExprClass, ty, VK_RValue, OK_Ordinary,
   4244            false, false, ty->isInstantiationDependentType(), false) { }
   4245 
   4246   explicit NoInitExpr(EmptyShell Empty)
   4247     : Expr(NoInitExprClass, Empty) { }
   4248 
   4249   static bool classof(const Stmt *T) {
   4250     return T->getStmtClass() == NoInitExprClass;
   4251   }
   4252 
   4253   SourceLocation getLocStart() const LLVM_READONLY { return SourceLocation(); }
   4254   SourceLocation getLocEnd() const LLVM_READONLY { return SourceLocation(); }
   4255 
   4256   // Iterators
   4257   child_range children() {
   4258     return child_range(child_iterator(), child_iterator());
   4259   }
   4260 };
   4261 
   4262 // In cases like:
   4263 //   struct Q { int a, b, c; };
   4264 //   Q *getQ();
   4265 //   void foo() {
   4266 //     struct A { Q q; } a = { *getQ(), .q.b = 3 };
   4267 //   }
   4268 //
   4269 // We will have an InitListExpr for a, with type A, and then a
   4270 // DesignatedInitUpdateExpr for "a.q" with type Q. The "base" for this DIUE
   4271 // is the call expression *getQ(); the "updater" for the DIUE is ".q.b = 3"
   4272 //
   4273 class DesignatedInitUpdateExpr : public Expr {
   4274   // BaseAndUpdaterExprs[0] is the base expression;
   4275   // BaseAndUpdaterExprs[1] is an InitListExpr overwriting part of the base.
   4276   Stmt *BaseAndUpdaterExprs[2];
   4277 
   4278 public:
   4279   DesignatedInitUpdateExpr(const ASTContext &C, SourceLocation lBraceLoc,
   4280                            Expr *baseExprs, SourceLocation rBraceLoc);
   4281 
   4282   explicit DesignatedInitUpdateExpr(EmptyShell Empty)
   4283     : Expr(DesignatedInitUpdateExprClass, Empty) { }
   4284 
   4285   SourceLocation getLocStart() const LLVM_READONLY;
   4286   SourceLocation getLocEnd() const LLVM_READONLY;
   4287 
   4288   static bool classof(const Stmt *T) {
   4289     return T->getStmtClass() == DesignatedInitUpdateExprClass;
   4290   }
   4291 
   4292   Expr *getBase() const { return cast<Expr>(BaseAndUpdaterExprs[0]); }
   4293   void setBase(Expr *Base) { BaseAndUpdaterExprs[0] = Base; }
   4294 
   4295   InitListExpr *getUpdater() const {
   4296     return cast<InitListExpr>(BaseAndUpdaterExprs[1]);
   4297   }
   4298   void setUpdater(Expr *Updater) { BaseAndUpdaterExprs[1] = Updater; }
   4299 
   4300   // Iterators
   4301   // children = the base and the updater
   4302   child_range children() {
   4303     return child_range(&BaseAndUpdaterExprs[0], &BaseAndUpdaterExprs[0] + 2);
   4304   }
   4305 };
   4306 
   4307 /// \brief Represents an implicitly-generated value initialization of
   4308 /// an object of a given type.
   4309 ///
   4310 /// Implicit value initializations occur within semantic initializer
   4311 /// list expressions (InitListExpr) as placeholders for subobject
   4312 /// initializations not explicitly specified by the user.
   4313 ///
   4314 /// \see InitListExpr
   4315 class ImplicitValueInitExpr : public Expr {
   4316 public:
   4317   explicit ImplicitValueInitExpr(QualType ty)
   4318     : Expr(ImplicitValueInitExprClass, ty, VK_RValue, OK_Ordinary,
   4319            false, false, ty->isInstantiationDependentType(), false) { }
   4320 
   4321   /// \brief Construct an empty implicit value initialization.
   4322   explicit ImplicitValueInitExpr(EmptyShell Empty)
   4323     : Expr(ImplicitValueInitExprClass, Empty) { }
   4324 
   4325   static bool classof(const Stmt *T) {
   4326     return T->getStmtClass() == ImplicitValueInitExprClass;
   4327   }
   4328 
   4329   SourceLocation getLocStart() const LLVM_READONLY { return SourceLocation(); }
   4330   SourceLocation getLocEnd() const LLVM_READONLY { return SourceLocation(); }
   4331 
   4332   // Iterators
   4333   child_range children() {
   4334     return child_range(child_iterator(), child_iterator());
   4335   }
   4336 };
   4337 
   4338 class ParenListExpr : public Expr {
   4339   Stmt **Exprs;
   4340   unsigned NumExprs;
   4341   SourceLocation LParenLoc, RParenLoc;
   4342 
   4343 public:
   4344   ParenListExpr(const ASTContext& C, SourceLocation lparenloc,
   4345                 ArrayRef<Expr*> exprs, SourceLocation rparenloc);
   4346 
   4347   /// \brief Build an empty paren list.
   4348   explicit ParenListExpr(EmptyShell Empty) : Expr(ParenListExprClass, Empty) { }
   4349 
   4350   unsigned getNumExprs() const { return NumExprs; }
   4351 
   4352   const Expr* getExpr(unsigned Init) const {
   4353     assert(Init < getNumExprs() && "Initializer access out of range!");
   4354     return cast_or_null<Expr>(Exprs[Init]);
   4355   }
   4356 
   4357   Expr* getExpr(unsigned Init) {
   4358     assert(Init < getNumExprs() && "Initializer access out of range!");
   4359     return cast_or_null<Expr>(Exprs[Init]);
   4360   }
   4361 
   4362   Expr **getExprs() { return reinterpret_cast<Expr **>(Exprs); }
   4363 
   4364   ArrayRef<Expr *> exprs() {
   4365     return llvm::makeArrayRef(getExprs(), getNumExprs());
   4366   }
   4367 
   4368   SourceLocation getLParenLoc() const { return LParenLoc; }
   4369   SourceLocation getRParenLoc() const { return RParenLoc; }
   4370 
   4371   SourceLocation getLocStart() const LLVM_READONLY { return LParenLoc; }
   4372   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
   4373 
   4374   static bool classof(const Stmt *T) {
   4375     return T->getStmtClass() == ParenListExprClass;
   4376   }
   4377 
   4378   // Iterators
   4379   child_range children() {
   4380     return child_range(&Exprs[0], &Exprs[0]+NumExprs);
   4381   }
   4382 
   4383   friend class ASTStmtReader;
   4384   friend class ASTStmtWriter;
   4385 };
   4386 
   4387 /// \brief Represents a C11 generic selection.
   4388 ///
   4389 /// A generic selection (C11 6.5.1.1) contains an unevaluated controlling
   4390 /// expression, followed by one or more generic associations.  Each generic
   4391 /// association specifies a type name and an expression, or "default" and an
   4392 /// expression (in which case it is known as a default generic association).
   4393 /// The type and value of the generic selection are identical to those of its
   4394 /// result expression, which is defined as the expression in the generic
   4395 /// association with a type name that is compatible with the type of the
   4396 /// controlling expression, or the expression in the default generic association
   4397 /// if no types are compatible.  For example:
   4398 ///
   4399 /// @code
   4400 /// _Generic(X, double: 1, float: 2, default: 3)
   4401 /// @endcode
   4402 ///
   4403 /// The above expression evaluates to 1 if 1.0 is substituted for X, 2 if 1.0f
   4404 /// or 3 if "hello".
   4405 ///
   4406 /// As an extension, generic selections are allowed in C++, where the following
   4407 /// additional semantics apply:
   4408 ///
   4409 /// Any generic selection whose controlling expression is type-dependent or
   4410 /// which names a dependent type in its association list is result-dependent,
   4411 /// which means that the choice of result expression is dependent.
   4412 /// Result-dependent generic associations are both type- and value-dependent.
   4413 class GenericSelectionExpr : public Expr {
   4414   enum { CONTROLLING, END_EXPR };
   4415   TypeSourceInfo **AssocTypes;
   4416   Stmt **SubExprs;
   4417   unsigned NumAssocs, ResultIndex;
   4418   SourceLocation GenericLoc, DefaultLoc, RParenLoc;
   4419 
   4420 public:
   4421   GenericSelectionExpr(const ASTContext &Context,
   4422                        SourceLocation GenericLoc, Expr *ControllingExpr,
   4423                        ArrayRef<TypeSourceInfo*> AssocTypes,
   4424                        ArrayRef<Expr*> AssocExprs,
   4425                        SourceLocation DefaultLoc, SourceLocation RParenLoc,
   4426                        bool ContainsUnexpandedParameterPack,
   4427                        unsigned ResultIndex);
   4428 
   4429   /// This constructor is used in the result-dependent case.
   4430   GenericSelectionExpr(const ASTContext &Context,
   4431                        SourceLocation GenericLoc, Expr *ControllingExpr,
   4432                        ArrayRef<TypeSourceInfo*> AssocTypes,
   4433                        ArrayRef<Expr*> AssocExprs,
   4434                        SourceLocation DefaultLoc, SourceLocation RParenLoc,
   4435                        bool ContainsUnexpandedParameterPack);
   4436 
   4437   explicit GenericSelectionExpr(EmptyShell Empty)
   4438     : Expr(GenericSelectionExprClass, Empty) { }
   4439 
   4440   unsigned getNumAssocs() const { return NumAssocs; }
   4441 
   4442   SourceLocation getGenericLoc() const { return GenericLoc; }
   4443   SourceLocation getDefaultLoc() const { return DefaultLoc; }
   4444   SourceLocation getRParenLoc() const { return RParenLoc; }
   4445 
   4446   const Expr *getAssocExpr(unsigned i) const {
   4447     return cast<Expr>(SubExprs[END_EXPR+i]);
   4448   }
   4449   Expr *getAssocExpr(unsigned i) { return cast<Expr>(SubExprs[END_EXPR+i]); }
   4450 
   4451   const TypeSourceInfo *getAssocTypeSourceInfo(unsigned i) const {
   4452     return AssocTypes[i];
   4453   }
   4454   TypeSourceInfo *getAssocTypeSourceInfo(unsigned i) { return AssocTypes[i]; }
   4455 
   4456   QualType getAssocType(unsigned i) const {
   4457     if (const TypeSourceInfo *TS = getAssocTypeSourceInfo(i))
   4458       return TS->getType();
   4459     else
   4460       return QualType();
   4461   }
   4462 
   4463   const Expr *getControllingExpr() const {
   4464     return cast<Expr>(SubExprs[CONTROLLING]);
   4465   }
   4466   Expr *getControllingExpr() { return cast<Expr>(SubExprs[CONTROLLING]); }
   4467 
   4468   /// Whether this generic selection is result-dependent.
   4469   bool isResultDependent() const { return ResultIndex == -1U; }
   4470 
   4471   /// The zero-based index of the result expression's generic association in
   4472   /// the generic selection's association list.  Defined only if the
   4473   /// generic selection is not result-dependent.
   4474   unsigned getResultIndex() const {
   4475     assert(!isResultDependent() && "Generic selection is result-dependent");
   4476     return ResultIndex;
   4477   }
   4478 
   4479   /// The generic selection's result expression.  Defined only if the
   4480   /// generic selection is not result-dependent.
   4481   const Expr *getResultExpr() const { return getAssocExpr(getResultIndex()); }
   4482   Expr *getResultExpr() { return getAssocExpr(getResultIndex()); }
   4483 
   4484   SourceLocation getLocStart() const LLVM_READONLY { return GenericLoc; }
   4485   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
   4486 
   4487   static bool classof(const Stmt *T) {
   4488     return T->getStmtClass() == GenericSelectionExprClass;
   4489   }
   4490 
   4491   child_range children() {
   4492     return child_range(SubExprs, SubExprs+END_EXPR+NumAssocs);
   4493   }
   4494 
   4495   friend class ASTStmtReader;
   4496 };
   4497 
   4498 //===----------------------------------------------------------------------===//
   4499 // Clang Extensions
   4500 //===----------------------------------------------------------------------===//
   4501 
   4502 /// ExtVectorElementExpr - This represents access to specific elements of a
   4503 /// vector, and may occur on the left hand side or right hand side.  For example
   4504 /// the following is legal:  "V.xy = V.zw" if V is a 4 element extended vector.
   4505 ///
   4506 /// Note that the base may have either vector or pointer to vector type, just
   4507 /// like a struct field reference.
   4508 ///
   4509 class ExtVectorElementExpr : public Expr {
   4510   Stmt *Base;
   4511   IdentifierInfo *Accessor;
   4512   SourceLocation AccessorLoc;
   4513 public:
   4514   ExtVectorElementExpr(QualType ty, ExprValueKind VK, Expr *base,
   4515                        IdentifierInfo &accessor, SourceLocation loc)
   4516     : Expr(ExtVectorElementExprClass, ty, VK,
   4517            (VK == VK_RValue ? OK_Ordinary : OK_VectorComponent),
   4518            base->isTypeDependent(), base->isValueDependent(),
   4519            base->isInstantiationDependent(),
   4520            base->containsUnexpandedParameterPack()),
   4521       Base(base), Accessor(&accessor), AccessorLoc(loc) {}
   4522 
   4523   /// \brief Build an empty vector element expression.
   4524   explicit ExtVectorElementExpr(EmptyShell Empty)
   4525     : Expr(ExtVectorElementExprClass, Empty) { }
   4526 
   4527   const Expr *getBase() const { return cast<Expr>(Base); }
   4528   Expr *getBase() { return cast<Expr>(Base); }
   4529   void setBase(Expr *E) { Base = E; }
   4530 
   4531   IdentifierInfo &getAccessor() const { return *Accessor; }
   4532   void setAccessor(IdentifierInfo *II) { Accessor = II; }
   4533 
   4534   SourceLocation getAccessorLoc() const { return AccessorLoc; }
   4535   void setAccessorLoc(SourceLocation L) { AccessorLoc = L; }
   4536 
   4537   /// getNumElements - Get the number of components being selected.
   4538   unsigned getNumElements() const;
   4539 
   4540   /// containsDuplicateElements - Return true if any element access is
   4541   /// repeated.
   4542   bool containsDuplicateElements() const;
   4543 
   4544   /// getEncodedElementAccess - Encode the elements accessed into an llvm
   4545   /// aggregate Constant of ConstantInt(s).
   4546   void getEncodedElementAccess(SmallVectorImpl<uint32_t> &Elts) const;
   4547 
   4548   SourceLocation getLocStart() const LLVM_READONLY {
   4549     return getBase()->getLocStart();
   4550   }
   4551   SourceLocation getLocEnd() const LLVM_READONLY { return AccessorLoc; }
   4552 
   4553   /// isArrow - Return true if the base expression is a pointer to vector,
   4554   /// return false if the base expression is a vector.
   4555   bool isArrow() const;
   4556 
   4557   static bool classof(const Stmt *T) {
   4558     return T->getStmtClass() == ExtVectorElementExprClass;
   4559   }
   4560 
   4561   // Iterators
   4562   child_range children() { return child_range(&Base, &Base+1); }
   4563 };
   4564 
   4565 /// BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
   4566 /// ^{ statement-body }   or   ^(int arg1, float arg2){ statement-body }
   4567 class BlockExpr : public Expr {
   4568 protected:
   4569   BlockDecl *TheBlock;
   4570 public:
   4571   BlockExpr(BlockDecl *BD, QualType ty)
   4572     : Expr(BlockExprClass, ty, VK_RValue, OK_Ordinary,
   4573            ty->isDependentType(), ty->isDependentType(),
   4574            ty->isInstantiationDependentType() || BD->isDependentContext(),
   4575            false),
   4576       TheBlock(BD) {}
   4577 
   4578   /// \brief Build an empty block expression.
   4579   explicit BlockExpr(EmptyShell Empty) : Expr(BlockExprClass, Empty) { }
   4580 
   4581   const BlockDecl *getBlockDecl() const { return TheBlock; }
   4582   BlockDecl *getBlockDecl() { return TheBlock; }
   4583   void setBlockDecl(BlockDecl *BD) { TheBlock = BD; }
   4584 
   4585   // Convenience functions for probing the underlying BlockDecl.
   4586   SourceLocation getCaretLocation() const;
   4587   const Stmt *getBody() const;
   4588   Stmt *getBody();
   4589 
   4590   SourceLocation getLocStart() const LLVM_READONLY { return getCaretLocation(); }
   4591   SourceLocation getLocEnd() const LLVM_READONLY { return getBody()->getLocEnd(); }
   4592 
   4593   /// getFunctionType - Return the underlying function type for this block.
   4594   const FunctionProtoType *getFunctionType() const;
   4595 
   4596   static bool classof(const Stmt *T) {
   4597     return T->getStmtClass() == BlockExprClass;
   4598   }
   4599 
   4600   // Iterators
   4601   child_range children() {
   4602     return child_range(child_iterator(), child_iterator());
   4603   }
   4604 };
   4605 
   4606 /// AsTypeExpr - Clang builtin function __builtin_astype [OpenCL 6.2.4.2]
   4607 /// This AST node provides support for reinterpreting a type to another
   4608 /// type of the same size.
   4609 class AsTypeExpr : public Expr {
   4610 private:
   4611   Stmt *SrcExpr;
   4612   SourceLocation BuiltinLoc, RParenLoc;
   4613 
   4614   friend class ASTReader;
   4615   friend class ASTStmtReader;
   4616   explicit AsTypeExpr(EmptyShell Empty) : Expr(AsTypeExprClass, Empty) {}
   4617 
   4618 public:
   4619   AsTypeExpr(Expr* SrcExpr, QualType DstType,
   4620              ExprValueKind VK, ExprObjectKind OK,
   4621              SourceLocation BuiltinLoc, SourceLocation RParenLoc)
   4622     : Expr(AsTypeExprClass, DstType, VK, OK,
   4623            DstType->isDependentType(),
   4624            DstType->isDependentType() || SrcExpr->isValueDependent(),
   4625            (DstType->isInstantiationDependentType() ||
   4626             SrcExpr->isInstantiationDependent()),
   4627            (DstType->containsUnexpandedParameterPack() ||
   4628             SrcExpr->containsUnexpandedParameterPack())),
   4629   SrcExpr(SrcExpr), BuiltinLoc(BuiltinLoc), RParenLoc(RParenLoc) {}
   4630 
   4631   /// getSrcExpr - Return the Expr to be converted.
   4632   Expr *getSrcExpr() const { return cast<Expr>(SrcExpr); }
   4633 
   4634   /// getBuiltinLoc - Return the location of the __builtin_astype token.
   4635   SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
   4636 
   4637   /// getRParenLoc - Return the location of final right parenthesis.
   4638   SourceLocation getRParenLoc() const { return RParenLoc; }
   4639 
   4640   SourceLocation getLocStart() const LLVM_READONLY { return BuiltinLoc; }
   4641   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
   4642 
   4643   static bool classof(const Stmt *T) {
   4644     return T->getStmtClass() == AsTypeExprClass;
   4645   }
   4646 
   4647   // Iterators
   4648   child_range children() { return child_range(&SrcExpr, &SrcExpr+1); }
   4649 };
   4650 
   4651 /// PseudoObjectExpr - An expression which accesses a pseudo-object
   4652 /// l-value.  A pseudo-object is an abstract object, accesses to which
   4653 /// are translated to calls.  The pseudo-object expression has a
   4654 /// syntactic form, which shows how the expression was actually
   4655 /// written in the source code, and a semantic form, which is a series
   4656 /// of expressions to be executed in order which detail how the
   4657 /// operation is actually evaluated.  Optionally, one of the semantic
   4658 /// forms may also provide a result value for the expression.
   4659 ///
   4660 /// If any of the semantic-form expressions is an OpaqueValueExpr,
   4661 /// that OVE is required to have a source expression, and it is bound
   4662 /// to the result of that source expression.  Such OVEs may appear
   4663 /// only in subsequent semantic-form expressions and as
   4664 /// sub-expressions of the syntactic form.
   4665 ///
   4666 /// PseudoObjectExpr should be used only when an operation can be
   4667 /// usefully described in terms of fairly simple rewrite rules on
   4668 /// objects and functions that are meant to be used by end-developers.
   4669 /// For example, under the Itanium ABI, dynamic casts are implemented
   4670 /// as a call to a runtime function called __dynamic_cast; using this
   4671 /// class to describe that would be inappropriate because that call is
   4672 /// not really part of the user-visible semantics, and instead the
   4673 /// cast is properly reflected in the AST and IR-generation has been
   4674 /// taught to generate the call as necessary.  In contrast, an
   4675 /// Objective-C property access is semantically defined to be
   4676 /// equivalent to a particular message send, and this is very much
   4677 /// part of the user model.  The name of this class encourages this
   4678 /// modelling design.
   4679 class PseudoObjectExpr final
   4680     : public Expr,
   4681       private llvm::TrailingObjects<PseudoObjectExpr, Expr *> {
   4682   // PseudoObjectExprBits.NumSubExprs - The number of sub-expressions.
   4683   // Always at least two, because the first sub-expression is the
   4684   // syntactic form.
   4685 
   4686   // PseudoObjectExprBits.ResultIndex - The index of the
   4687   // sub-expression holding the result.  0 means the result is void,
   4688   // which is unambiguous because it's the index of the syntactic
   4689   // form.  Note that this is therefore 1 higher than the value passed
   4690   // in to Create, which is an index within the semantic forms.
   4691   // Note also that ASTStmtWriter assumes this encoding.
   4692 
   4693   Expr **getSubExprsBuffer() { return getTrailingObjects<Expr *>(); }
   4694   const Expr * const *getSubExprsBuffer() const {
   4695     return getTrailingObjects<Expr *>();
   4696   }
   4697 
   4698   PseudoObjectExpr(QualType type, ExprValueKind VK,
   4699                    Expr *syntactic, ArrayRef<Expr*> semantic,
   4700                    unsigned resultIndex);
   4701 
   4702   PseudoObjectExpr(EmptyShell shell, unsigned numSemanticExprs);
   4703 
   4704   unsigned getNumSubExprs() const {
   4705     return PseudoObjectExprBits.NumSubExprs;
   4706   }
   4707 
   4708 public:
   4709   /// NoResult - A value for the result index indicating that there is
   4710   /// no semantic result.
   4711   enum : unsigned { NoResult = ~0U };
   4712 
   4713   static PseudoObjectExpr *Create(const ASTContext &Context, Expr *syntactic,
   4714                                   ArrayRef<Expr*> semantic,
   4715                                   unsigned resultIndex);
   4716 
   4717   static PseudoObjectExpr *Create(const ASTContext &Context, EmptyShell shell,
   4718                                   unsigned numSemanticExprs);
   4719 
   4720   /// Return the syntactic form of this expression, i.e. the
   4721   /// expression it actually looks like.  Likely to be expressed in
   4722   /// terms of OpaqueValueExprs bound in the semantic form.
   4723   Expr *getSyntacticForm() { return getSubExprsBuffer()[0]; }
   4724   const Expr *getSyntacticForm() const { return getSubExprsBuffer()[0]; }
   4725 
   4726   /// Return the index of the result-bearing expression into the semantics
   4727   /// expressions, or PseudoObjectExpr::NoResult if there is none.
   4728   unsigned getResultExprIndex() const {
   4729     if (PseudoObjectExprBits.ResultIndex == 0) return NoResult;
   4730     return PseudoObjectExprBits.ResultIndex - 1;
   4731   }
   4732 
   4733   /// Return the result-bearing expression, or null if there is none.
   4734   Expr *getResultExpr() {
   4735     if (PseudoObjectExprBits.ResultIndex == 0)
   4736       return nullptr;
   4737     return getSubExprsBuffer()[PseudoObjectExprBits.ResultIndex];
   4738   }
   4739   const Expr *getResultExpr() const {
   4740     return const_cast<PseudoObjectExpr*>(this)->getResultExpr();
   4741   }
   4742 
   4743   unsigned getNumSemanticExprs() const { return getNumSubExprs() - 1; }
   4744 
   4745   typedef Expr * const *semantics_iterator;
   4746   typedef const Expr * const *const_semantics_iterator;
   4747   semantics_iterator semantics_begin() {
   4748     return getSubExprsBuffer() + 1;
   4749   }
   4750   const_semantics_iterator semantics_begin() const {
   4751     return getSubExprsBuffer() + 1;
   4752   }
   4753   semantics_iterator semantics_end() {
   4754     return getSubExprsBuffer() + getNumSubExprs();
   4755   }
   4756   const_semantics_iterator semantics_end() const {
   4757     return getSubExprsBuffer() + getNumSubExprs();
   4758   }
   4759 
   4760   llvm::iterator_range<semantics_iterator> semantics() {
   4761     return llvm::make_range(semantics_begin(), semantics_end());
   4762   }
   4763   llvm::iterator_range<const_semantics_iterator> semantics() const {
   4764     return llvm::make_range(semantics_begin(), semantics_end());
   4765   }
   4766 
   4767   Expr *getSemanticExpr(unsigned index) {
   4768     assert(index + 1 < getNumSubExprs());
   4769     return getSubExprsBuffer()[index + 1];
   4770   }
   4771   const Expr *getSemanticExpr(unsigned index) const {
   4772     return const_cast<PseudoObjectExpr*>(this)->getSemanticExpr(index);
   4773   }
   4774 
   4775   SourceLocation getExprLoc() const LLVM_READONLY {
   4776     return getSyntacticForm()->getExprLoc();
   4777   }
   4778 
   4779   SourceLocation getLocStart() const LLVM_READONLY {
   4780     return getSyntacticForm()->getLocStart();
   4781   }
   4782   SourceLocation getLocEnd() const LLVM_READONLY {
   4783     return getSyntacticForm()->getLocEnd();
   4784   }
   4785 
   4786   child_range children() {
   4787     Stmt **cs = reinterpret_cast<Stmt**>(getSubExprsBuffer());
   4788     return child_range(cs, cs + getNumSubExprs());
   4789   }
   4790 
   4791   static bool classof(const Stmt *T) {
   4792     return T->getStmtClass() == PseudoObjectExprClass;
   4793   }
   4794 
   4795   friend TrailingObjects;
   4796   friend class ASTStmtReader;
   4797 };
   4798 
   4799 /// AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*,
   4800 /// __atomic_load, __atomic_store, and __atomic_compare_exchange_*, for the
   4801 /// similarly-named C++11 instructions, and __c11 variants for <stdatomic.h>.
   4802 /// All of these instructions take one primary pointer and at least one memory
   4803 /// order.
   4804 class AtomicExpr : public Expr {
   4805 public:
   4806   enum AtomicOp {
   4807 #define BUILTIN(ID, TYPE, ATTRS)
   4808 #define ATOMIC_BUILTIN(ID, TYPE, ATTRS) AO ## ID,
   4809 #include "clang/Basic/Builtins.def"
   4810     // Avoid trailing comma
   4811     BI_First = 0
   4812   };
   4813 
   4814 private:
   4815   enum { PTR, ORDER, VAL1, ORDER_FAIL, VAL2, WEAK, END_EXPR };
   4816   Stmt* SubExprs[END_EXPR];
   4817   unsigned NumSubExprs;
   4818   SourceLocation BuiltinLoc, RParenLoc;
   4819   AtomicOp Op;
   4820 
   4821   friend class ASTStmtReader;
   4822 
   4823 public:
   4824   AtomicExpr(SourceLocation BLoc, ArrayRef<Expr*> args, QualType t,
   4825              AtomicOp op, SourceLocation RP);
   4826 
   4827   /// \brief Determine the number of arguments the specified atomic builtin
   4828   /// should have.
   4829   static unsigned getNumSubExprs(AtomicOp Op);
   4830 
   4831   /// \brief Build an empty AtomicExpr.
   4832   explicit AtomicExpr(EmptyShell Empty) : Expr(AtomicExprClass, Empty) { }
   4833 
   4834   Expr *getPtr() const {
   4835     return cast<Expr>(SubExprs[PTR]);
   4836   }
   4837   Expr *getOrder() const {
   4838     return cast<Expr>(SubExprs[ORDER]);
   4839   }
   4840   Expr *getVal1() const {
   4841     if (Op == AO__c11_atomic_init)
   4842       return cast<Expr>(SubExprs[ORDER]);
   4843     assert(NumSubExprs > VAL1);
   4844     return cast<Expr>(SubExprs[VAL1]);
   4845   }
   4846   Expr *getOrderFail() const {
   4847     assert(NumSubExprs > ORDER_FAIL);
   4848     return cast<Expr>(SubExprs[ORDER_FAIL]);
   4849   }
   4850   Expr *getVal2() const {
   4851     if (Op == AO__atomic_exchange)
   4852       return cast<Expr>(SubExprs[ORDER_FAIL]);
   4853     assert(NumSubExprs > VAL2);
   4854     return cast<Expr>(SubExprs[VAL2]);
   4855   }
   4856   Expr *getWeak() const {
   4857     assert(NumSubExprs > WEAK);
   4858     return cast<Expr>(SubExprs[WEAK]);
   4859   }
   4860 
   4861   AtomicOp getOp() const { return Op; }
   4862   unsigned getNumSubExprs() const { return NumSubExprs; }
   4863 
   4864   Expr **getSubExprs() { return reinterpret_cast<Expr **>(SubExprs); }
   4865   const Expr * const *getSubExprs() const {
   4866     return reinterpret_cast<Expr * const *>(SubExprs);
   4867   }
   4868 
   4869   bool isVolatile() const {
   4870     return getPtr()->getType()->getPointeeType().isVolatileQualified();
   4871   }
   4872 
   4873   bool isCmpXChg() const {
   4874     return getOp() == AO__c11_atomic_compare_exchange_strong ||
   4875            getOp() == AO__c11_atomic_compare_exchange_weak ||
   4876            getOp() == AO__atomic_compare_exchange ||
   4877            getOp() == AO__atomic_compare_exchange_n;
   4878   }
   4879 
   4880   SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
   4881   SourceLocation getRParenLoc() const { return RParenLoc; }
   4882 
   4883   SourceLocation getLocStart() const LLVM_READONLY { return BuiltinLoc; }
   4884   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
   4885 
   4886   static bool classof(const Stmt *T) {
   4887     return T->getStmtClass() == AtomicExprClass;
   4888   }
   4889 
   4890   // Iterators
   4891   child_range children() {
   4892     return child_range(SubExprs, SubExprs+NumSubExprs);
   4893   }
   4894 };
   4895 
   4896 /// TypoExpr - Internal placeholder for expressions where typo correction
   4897 /// still needs to be performed and/or an error diagnostic emitted.
   4898 class TypoExpr : public Expr {
   4899 public:
   4900   TypoExpr(QualType T)
   4901       : Expr(TypoExprClass, T, VK_LValue, OK_Ordinary,
   4902              /*isTypeDependent*/ true,
   4903              /*isValueDependent*/ true,
   4904              /*isInstantiationDependent*/ true,
   4905              /*containsUnexpandedParameterPack*/ false) {
   4906     assert(T->isDependentType() && "TypoExpr given a non-dependent type");
   4907   }
   4908 
   4909   child_range children() {
   4910     return child_range(child_iterator(), child_iterator());
   4911   }
   4912   SourceLocation getLocStart() const LLVM_READONLY { return SourceLocation(); }
   4913   SourceLocation getLocEnd() const LLVM_READONLY { return SourceLocation(); }
   4914 
   4915   static bool classof(const Stmt *T) {
   4916     return T->getStmtClass() == TypoExprClass;
   4917   }
   4918 
   4919 };
   4920 } // end namespace clang
   4921 
   4922 #endif // LLVM_CLANG_AST_EXPR_H
   4923