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