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