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