clang  14.0.0git
Expr.h
Go to the documentation of this file.
1 //===--- Expr.h - Classes for representing expressions ----------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file defines the Expr interface and subclasses.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_AST_EXPR_H
14 #define LLVM_CLANG_AST_EXPR_H
15 
16 #include "clang/AST/APValue.h"
17 #include "clang/AST/ASTVector.h"
19 #include "clang/AST/Decl.h"
23 #include "clang/AST/Stmt.h"
24 #include "clang/AST/TemplateBase.h"
25 #include "clang/AST/Type.h"
26 #include "clang/Basic/CharInfo.h"
28 #include "clang/Basic/SyncScope.h"
29 #include "clang/Basic/TypeTraits.h"
30 #include "llvm/ADT/APFloat.h"
31 #include "llvm/ADT/APSInt.h"
32 #include "llvm/ADT/SmallVector.h"
33 #include "llvm/ADT/StringRef.h"
34 #include "llvm/ADT/iterator.h"
35 #include "llvm/ADT/iterator_range.h"
36 #include "llvm/Support/AtomicOrdering.h"
37 #include "llvm/Support/Compiler.h"
38 #include "llvm/Support/TrailingObjects.h"
39 
40 namespace clang {
41  class APValue;
42  class ASTContext;
43  class BlockDecl;
44  class CXXBaseSpecifier;
45  class CXXMemberCallExpr;
46  class CXXOperatorCallExpr;
47  class CastExpr;
48  class Decl;
49  class IdentifierInfo;
50  class MaterializeTemporaryExpr;
51  class NamedDecl;
52  class ObjCPropertyRefExpr;
53  class OpaqueValueExpr;
54  class ParmVarDecl;
55  class StringLiteral;
56  class TargetInfo;
57  class ValueDecl;
58 
59 /// A simple array of base specifiers.
61 
62 /// An adjustment to be made to the temporary created when emitting a
63 /// reference binding, which accesses a particular subobject of that temporary.
65  enum {
69  } Kind;
70 
71  struct DTB {
74  };
75 
76  struct P {
79  };
80 
81  union {
84  struct P Ptr;
85  };
86 
87  SubobjectAdjustment(const CastExpr *BasePath,
88  const CXXRecordDecl *DerivedClass)
90  DerivedToBase.BasePath = BasePath;
91  DerivedToBase.DerivedClass = DerivedClass;
92  }
93 
96  this->Field = Field;
97  }
98 
101  this->Ptr.MPT = MPT;
102  this->Ptr.RHS = RHS;
103  }
104 };
105 
106 /// This represents one expression. Note that Expr's are subclasses of Stmt.
107 /// This allows an expression to be transparently used any place a Stmt is
108 /// required.
109 class Expr : public ValueStmt {
110  QualType TR;
111 
112 public:
113  Expr() = delete;
114  Expr(const Expr&) = delete;
115  Expr(Expr &&) = delete;
116  Expr &operator=(const Expr&) = delete;
117  Expr &operator=(Expr&&) = delete;
118 
119 protected:
121  : ValueStmt(SC) {
122  ExprBits.Dependent = 0;
123  ExprBits.ValueKind = VK;
124  ExprBits.ObjectKind = OK;
125  assert(ExprBits.ObjectKind == OK && "truncated kind");
126  setType(T);
127  }
128 
129  /// Construct an empty expression.
130  explicit Expr(StmtClass SC, EmptyShell) : ValueStmt(SC) { }
131 
132  /// Each concrete expr subclass is expected to compute its dependence and call
133  /// this in the constructor.
135  ExprBits.Dependent = static_cast<unsigned>(Deps);
136  }
137  friend class ASTImporter; // Sets dependence dircetly.
138  friend class ASTStmtReader; // Sets dependence dircetly.
139 
140 public:
141  QualType getType() const { return TR; }
142  void setType(QualType t) {
143  // In C++, the type of an expression is always adjusted so that it
144  // will not have reference type (C++ [expr]p6). Use
145  // QualType::getNonReferenceType() to retrieve the non-reference
146  // type. Additionally, inspect Expr::isLvalue to determine whether
147  // an expression that is adjusted in this manner should be
148  // considered an lvalue.
149  assert((t.isNull() || !t->isReferenceType()) &&
150  "Expressions can't have reference type");
151 
152  TR = t;
153  }
154 
156  return static_cast<ExprDependence>(ExprBits.Dependent);
157  }
158 
159  /// Determines whether the value of this expression depends on
160  /// - a template parameter (C++ [temp.dep.constexpr])
161  /// - or an error, whose resolution is unknown
162  ///
163  /// For example, the array bound of "Chars" in the following example is
164  /// value-dependent.
165  /// @code
166  /// template<int Size, char (&Chars)[Size]> struct meta_string;
167  /// @endcode
168  bool isValueDependent() const {
169  return static_cast<bool>(getDependence() & ExprDependence::Value);
170  }
171 
172  /// Determines whether the type of this expression depends on
173  /// - a template paramter (C++ [temp.dep.expr], which means that its type
174  /// could change from one template instantiation to the next)
175  /// - or an error
176  ///
177  /// For example, the expressions "x" and "x + y" are type-dependent in
178  /// the following code, but "y" is not type-dependent:
179  /// @code
180  /// template<typename T>
181  /// void add(T x, int y) {
182  /// x + y;
183  /// }
184  /// @endcode
185  bool isTypeDependent() const {
186  return static_cast<bool>(getDependence() & ExprDependence::Type);
187  }
188 
189  /// Whether this expression is instantiation-dependent, meaning that
190  /// it depends in some way on
191  /// - a template parameter (even if neither its type nor (constant) value
192  /// can change due to the template instantiation)
193  /// - or an error
194  ///
195  /// In the following example, the expression \c sizeof(sizeof(T() + T())) is
196  /// instantiation-dependent (since it involves a template parameter \c T), but
197  /// is neither type- nor value-dependent, since the type of the inner
198  /// \c sizeof is known (\c std::size_t) and therefore the size of the outer
199  /// \c sizeof is known.
200  ///
201  /// \code
202  /// template<typename T>
203  /// void f(T x, T y) {
204  /// sizeof(sizeof(T() + T());
205  /// }
206  /// \endcode
207  ///
208  /// \code
209  /// void func(int) {
210  /// func(); // the expression is instantiation-dependent, because it depends
211  /// // on an error.
212  /// }
213  /// \endcode
215  return static_cast<bool>(getDependence() & ExprDependence::Instantiation);
216  }
217 
218  /// Whether this expression contains an unexpanded parameter
219  /// pack (for C++11 variadic templates).
220  ///
221  /// Given the following function template:
222  ///
223  /// \code
224  /// template<typename F, typename ...Types>
225  /// void forward(const F &f, Types &&...args) {
226  /// f(static_cast<Types&&>(args)...);
227  /// }
228  /// \endcode
229  ///
230  /// The expressions \c args and \c static_cast<Types&&>(args) both
231  /// contain parameter packs.
233  return static_cast<bool>(getDependence() & ExprDependence::UnexpandedPack);
234  }
235 
236  /// Whether this expression contains subexpressions which had errors, e.g. a
237  /// TypoExpr.
238  bool containsErrors() const {
239  return static_cast<bool>(getDependence() & ExprDependence::Error);
240  }
241 
242  /// getExprLoc - Return the preferred location for the arrow when diagnosing
243  /// a problem with a generic expression.
244  SourceLocation getExprLoc() const LLVM_READONLY;
245 
246  /// Determine whether an lvalue-to-rvalue conversion should implicitly be
247  /// applied to this expression if it appears as a discarded-value expression
248  /// in C++11 onwards. This applies to certain forms of volatile glvalues.
249  bool isReadIfDiscardedInCPlusPlus11() const;
250 
251  /// isUnusedResultAWarning - Return true if this immediate expression should
252  /// be warned about if the result is unused. If so, fill in expr, location,
253  /// and ranges with expr to warn on and source locations/ranges appropriate
254  /// for a warning.
255  bool isUnusedResultAWarning(const Expr *&WarnExpr, SourceLocation &Loc,
256  SourceRange &R1, SourceRange &R2,
257  ASTContext &Ctx) const;
258 
259  /// isLValue - True if this expression is an "l-value" according to
260  /// the rules of the current language. C and C++ give somewhat
261  /// different rules for this concept, but in general, the result of
262  /// an l-value expression identifies a specific object whereas the
263  /// result of an r-value expression is a value detached from any
264  /// specific storage.
265  ///
266  /// C++11 divides the concept of "r-value" into pure r-values
267  /// ("pr-values") and so-called expiring values ("x-values"), which
268  /// identify specific objects that can be safely cannibalized for
269  /// their resources.
270  bool isLValue() const { return getValueKind() == VK_LValue; }
271  bool isPRValue() const { return getValueKind() == VK_PRValue; }
272  bool isXValue() const { return getValueKind() == VK_XValue; }
273  bool isGLValue() const { return getValueKind() != VK_PRValue; }
274 
286  };
287  /// Reasons why an expression might not be an l-value.
289 
296  MLV_LValueCast, // Specialized form of MLV_InvalidExpression.
308  };
309  /// isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type,
310  /// does not have an incomplete type, does not have a const-qualified type,
311  /// and if it is a structure or union, does not have any member (including,
312  /// recursively, any member or element of all contained aggregates or unions)
313  /// with a const-qualified type.
314  ///
315  /// \param Loc [in,out] - A source location which *may* be filled
316  /// in with the location of the expression making this a
317  /// non-modifiable lvalue, if specified.
319  isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc = nullptr) const;
320 
321  /// The return type of classify(). Represents the C++11 expression
322  /// taxonomy.
324  public:
325  /// The various classification results. Most of these mean prvalue.
326  enum Kinds {
329  CL_Function, // Functions cannot be lvalues in C.
330  CL_Void, // Void cannot be an lvalue in C.
331  CL_AddressableVoid, // Void expression whose address can be taken in C.
332  CL_DuplicateVectorComponents, // A vector shuffle with dupes.
333  CL_MemberFunction, // An expression referring to a member function
335  CL_ClassTemporary, // A temporary of class type, or subobject thereof.
336  CL_ArrayTemporary, // A temporary of array type.
337  CL_ObjCMessageRValue, // ObjC message is an rvalue
338  CL_PRValue // A prvalue for any other reason, of any other type
339  };
340  /// The results of modification testing.
342  CM_Untested, // testModifiable was false.
344  CM_RValue, // Not modifiable because it's an rvalue
345  CM_Function, // Not modifiable because it's a function; C++ only
346  CM_LValueCast, // Same as CM_RValue, but indicates GCC cast-as-lvalue ext
347  CM_NoSetterProperty,// Implicit assignment to ObjC property without setter
353  };
354 
355  private:
356  friend class Expr;
357 
358  unsigned short Kind;
359  unsigned short Modifiable;
360 
361  explicit Classification(Kinds k, ModifiableType m)
362  : Kind(k), Modifiable(m)
363  {}
364 
365  public:
367 
368  Kinds getKind() const { return static_cast<Kinds>(Kind); }
370  assert(Modifiable != CM_Untested && "Did not test for modifiability.");
371  return static_cast<ModifiableType>(Modifiable);
372  }
373  bool isLValue() const { return Kind == CL_LValue; }
374  bool isXValue() const { return Kind == CL_XValue; }
375  bool isGLValue() const { return Kind <= CL_XValue; }
376  bool isPRValue() const { return Kind >= CL_Function; }
377  bool isRValue() const { return Kind >= CL_XValue; }
378  bool isModifiable() const { return getModifiable() == CM_Modifiable; }
379 
380  /// Create a simple, modifiably lvalue
383  }
384 
385  };
386  /// Classify - Classify this expression according to the C++11
387  /// expression taxonomy.
388  ///
389  /// C++11 defines ([basic.lval]) a new taxonomy of expressions to replace the
390  /// old lvalue vs rvalue. This function determines the type of expression this
391  /// is. There are three expression types:
392  /// - lvalues are classical lvalues as in C++03.
393  /// - prvalues are equivalent to rvalues in C++03.
394  /// - xvalues are expressions yielding unnamed rvalue references, e.g. a
395  /// function returning an rvalue reference.
396  /// lvalues and xvalues are collectively referred to as glvalues, while
397  /// prvalues and xvalues together form rvalues.
399  return ClassifyImpl(Ctx, nullptr);
400  }
401 
402  /// ClassifyModifiable - Classify this expression according to the
403  /// C++11 expression taxonomy, and see if it is valid on the left side
404  /// of an assignment.
405  ///
406  /// This function extends classify in that it also tests whether the
407  /// expression is modifiable (C99 6.3.2.1p1).
408  /// \param Loc A source location that might be filled with a relevant location
409  /// if the expression is not modifiable.
411  return ClassifyImpl(Ctx, &Loc);
412  }
413 
414  /// Returns the set of floating point options that apply to this expression.
415  /// Only meaningful for operations on floating point values.
417 
418  /// getValueKindForType - Given a formal return or parameter type,
419  /// give its value kind.
421  if (const ReferenceType *RT = T->getAs<ReferenceType>())
422  return (isa<LValueReferenceType>(RT)
423  ? VK_LValue
424  : (RT->getPointeeType()->isFunctionType()
425  ? VK_LValue : VK_XValue));
426  return VK_PRValue;
427  }
428 
429  /// getValueKind - The value kind that this expression produces.
431  return static_cast<ExprValueKind>(ExprBits.ValueKind);
432  }
433 
434  /// getObjectKind - The object kind that this expression produces.
435  /// Object kinds are meaningful only for expressions that yield an
436  /// l-value or x-value.
438  return static_cast<ExprObjectKind>(ExprBits.ObjectKind);
439  }
440 
443  return (OK == OK_Ordinary || OK == OK_BitField);
444  }
445 
446  /// setValueKind - Set the value kind produced by this expression.
447  void setValueKind(ExprValueKind Cat) { ExprBits.ValueKind = Cat; }
448 
449  /// setObjectKind - Set the object kind produced by this expression.
450  void setObjectKind(ExprObjectKind Cat) { ExprBits.ObjectKind = Cat; }
451 
452 private:
453  Classification ClassifyImpl(ASTContext &Ctx, SourceLocation *Loc) const;
454 
455 public:
456 
457  /// Returns true if this expression is a gl-value that
458  /// potentially refers to a bit-field.
459  ///
460  /// In C++, whether a gl-value refers to a bitfield is essentially
461  /// an aspect of the value-kind type system.
462  bool refersToBitField() const { return getObjectKind() == OK_BitField; }
463 
464  /// If this expression refers to a bit-field, retrieve the
465  /// declaration of that bit-field.
466  ///
467  /// Note that this returns a non-null pointer in subtly different
468  /// places than refersToBitField returns true. In particular, this can
469  /// return a non-null pointer even for r-values loaded from
470  /// bit-fields, but it will return null for a conditional bit-field.
472 
473  const FieldDecl *getSourceBitField() const {
474  return const_cast<Expr*>(this)->getSourceBitField();
475  }
476 
479  return const_cast<Expr*>(this)->getReferencedDeclOfCallee();
480  }
481 
482  /// If this expression is an l-value for an Objective C
483  /// property, find the underlying property reference expression.
484  const ObjCPropertyRefExpr *getObjCProperty() const;
485 
486  /// Check if this expression is the ObjC 'self' implicit parameter.
487  bool isObjCSelfExpr() const;
488 
489  /// Returns whether this expression refers to a vector element.
490  bool refersToVectorElement() const;
491 
492  /// Returns whether this expression refers to a matrix element.
493  bool refersToMatrixElement() const {
494  return getObjectKind() == OK_MatrixComponent;
495  }
496 
497  /// Returns whether this expression refers to a global register
498  /// variable.
499  bool refersToGlobalRegisterVar() const;
500 
501  /// Returns whether this expression has a placeholder type.
502  bool hasPlaceholderType() const {
503  return getType()->isPlaceholderType();
504  }
505 
506  /// Returns whether this expression has a specific placeholder type.
509  if (const BuiltinType *BT = dyn_cast<BuiltinType>(getType()))
510  return BT->getKind() == K;
511  return false;
512  }
513 
514  /// isKnownToHaveBooleanValue - Return true if this is an integer expression
515  /// that is known to return 0 or 1. This happens for _Bool/bool expressions
516  /// but also int expressions which are produced by things like comparisons in
517  /// C.
518  ///
519  /// \param Semantic If true, only return true for expressions that are known
520  /// to be semantically boolean, which might not be true even for expressions
521  /// that are known to evaluate to 0/1. For instance, reading an unsigned
522  /// bit-field with width '1' will evaluate to 0/1, but doesn't necessarily
523  /// semantically correspond to a bool.
524  bool isKnownToHaveBooleanValue(bool Semantic = true) const;
525 
526  /// isIntegerConstantExpr - Return the value if this expression is a valid
527  /// integer constant expression. If not a valid i-c-e, return None and fill
528  /// in Loc (if specified) with the location of the invalid expression.
529  ///
530  /// Note: This does not perform the implicit conversions required by C++11
531  /// [expr.const]p5.
533  SourceLocation *Loc = nullptr,
534  bool isEvaluated = true) const;
535  bool isIntegerConstantExpr(const ASTContext &Ctx,
536  SourceLocation *Loc = nullptr) const;
537 
538  /// isCXX98IntegralConstantExpr - Return true if this expression is an
539  /// integral constant expression in C++98. Can only be used in C++.
540  bool isCXX98IntegralConstantExpr(const ASTContext &Ctx) const;
541 
542  /// isCXX11ConstantExpr - Return true if this expression is a constant
543  /// expression in C++11. Can only be used in C++.
544  ///
545  /// Note: This does not perform the implicit conversions required by C++11
546  /// [expr.const]p5.
547  bool isCXX11ConstantExpr(const ASTContext &Ctx, APValue *Result = nullptr,
548  SourceLocation *Loc = nullptr) const;
549 
550  /// isPotentialConstantExpr - Return true if this function's definition
551  /// might be usable in a constant expression in C++11, if it were marked
552  /// constexpr. Return false if the function can never produce a constant
553  /// expression, along with diagnostics describing why not.
554  static bool isPotentialConstantExpr(const FunctionDecl *FD,
556  PartialDiagnosticAt> &Diags);
557 
558  /// isPotentialConstantExprUnevaluted - Return true if this expression might
559  /// be usable in a constant expression in C++11 in an unevaluated context, if
560  /// it were in function FD marked constexpr. Return false if the function can
561  /// never produce a constant expression, along with diagnostics describing
562  /// why not.
564  const FunctionDecl *FD,
566  PartialDiagnosticAt> &Diags);
567 
568  /// isConstantInitializer - Returns true if this expression can be emitted to
569  /// IR as a constant, and thus can be used as a constant initializer in C.
570  /// If this expression is not constant and Culprit is non-null,
571  /// it is used to store the address of first non constant expr.
572  bool isConstantInitializer(ASTContext &Ctx, bool ForRef,
573  const Expr **Culprit = nullptr) const;
574 
575  /// If this expression is an unambiguous reference to a single declaration,
576  /// in the style of __builtin_function_start, return that declaration. Note
577  /// that this may return a non-static member function or field in C++ if this
578  /// expression is a member pointer constant.
579  const ValueDecl *getAsBuiltinConstantDeclRef(const ASTContext &Context) const;
580 
581  /// EvalStatus is a struct with detailed info about an evaluation in progress.
582  struct EvalStatus {
583  /// Whether the evaluated expression has side effects.
584  /// For example, (f() && 0) can be folded, but it still has side effects.
586 
587  /// Whether the evaluation hit undefined behavior.
588  /// For example, 1.0 / 0.0 can be folded to Inf, but has undefined behavior.
589  /// Likewise, INT_MAX + 1 can be folded to INT_MIN, but has UB.
591 
592  /// Diag - If this is non-null, it will be filled in with a stack of notes
593  /// indicating why evaluation failed (or why it failed to produce a constant
594  /// expression).
595  /// If the expression is unfoldable, the notes will indicate why it's not
596  /// foldable. If the expression is foldable, but not a constant expression,
597  /// the notes will describes why it isn't a constant expression. If the
598  /// expression *is* a constant expression, no notes will be produced.
600 
603 
604  // hasSideEffects - Return true if the evaluated expression has
605  // side effects.
606  bool hasSideEffects() const {
607  return HasSideEffects;
608  }
609  };
610 
611  /// EvalResult is a struct with detailed info about an evaluated expression.
613  /// Val - This is the value the expression can be folded to.
615 
616  // isGlobalLValue - Return true if the evaluated lvalue expression
617  // is global.
618  bool isGlobalLValue() const;
619  };
620 
621  /// EvaluateAsRValue - Return true if this is a constant which we can fold to
622  /// an rvalue using any crazy technique (that has nothing to do with language
623  /// standards) that we want to, even if the expression has side-effects. If
624  /// this function returns true, it returns the folded constant in Result. If
625  /// the expression is a glvalue, an lvalue-to-rvalue conversion will be
626  /// applied.
627  bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx,
628  bool InConstantContext = false) const;
629 
630  /// EvaluateAsBooleanCondition - Return true if this is a constant
631  /// which we can fold and convert to a boolean condition using
632  /// any crazy technique that we want to, even if the expression has
633  /// side-effects.
634  bool EvaluateAsBooleanCondition(bool &Result, const ASTContext &Ctx,
635  bool InConstantContext = false) const;
636 
638  SE_NoSideEffects, ///< Strictly evaluate the expression.
639  SE_AllowUndefinedBehavior, ///< Allow UB that we can give a value, but not
640  ///< arbitrary unmodeled side effects.
641  SE_AllowSideEffects ///< Allow any unmodeled side effect.
642  };
643 
644  /// EvaluateAsInt - Return true if this is a constant which we can fold and
645  /// convert to an integer, using any crazy technique that we want to.
646  bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx,
647  SideEffectsKind AllowSideEffects = SE_NoSideEffects,
648  bool InConstantContext = false) const;
649 
650  /// EvaluateAsFloat - Return true if this is a constant which we can fold and
651  /// convert to a floating point value, using any crazy technique that we
652  /// want to.
653  bool EvaluateAsFloat(llvm::APFloat &Result, const ASTContext &Ctx,
654  SideEffectsKind AllowSideEffects = SE_NoSideEffects,
655  bool InConstantContext = false) const;
656 
657  /// EvaluateAsFloat - Return true if this is a constant which we can fold and
658  /// convert to a fixed point value.
659  bool EvaluateAsFixedPoint(EvalResult &Result, const ASTContext &Ctx,
660  SideEffectsKind AllowSideEffects = SE_NoSideEffects,
661  bool InConstantContext = false) const;
662 
663  /// isEvaluatable - Call EvaluateAsRValue to see if this expression can be
664  /// constant folded without side-effects, but discard the result.
665  bool isEvaluatable(const ASTContext &Ctx,
666  SideEffectsKind AllowSideEffects = SE_NoSideEffects) const;
667 
668  /// HasSideEffects - This routine returns true for all those expressions
669  /// which have any effect other than producing a value. Example is a function
670  /// call, volatile variable read, or throwing an exception. If
671  /// IncludePossibleEffects is false, this call treats certain expressions with
672  /// potential side effects (such as function call-like expressions,
673  /// instantiation-dependent expressions, or invocations from a macro) as not
674  /// having side effects.
675  bool HasSideEffects(const ASTContext &Ctx,
676  bool IncludePossibleEffects = true) const;
677 
678  /// Determine whether this expression involves a call to any function
679  /// that is not trivial.
680  bool hasNonTrivialCall(const ASTContext &Ctx) const;
681 
682  /// EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded
683  /// integer. This must be called on an expression that constant folds to an
684  /// integer.
686  const ASTContext &Ctx,
687  SmallVectorImpl<PartialDiagnosticAt> *Diag = nullptr) const;
688 
690  const ASTContext &Ctx,
691  SmallVectorImpl<PartialDiagnosticAt> *Diag = nullptr) const;
692 
693  void EvaluateForOverflow(const ASTContext &Ctx) const;
694 
695  /// EvaluateAsLValue - Evaluate an expression to see if we can fold it to an
696  /// lvalue with link time known address, with no side-effects.
697  bool EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx,
698  bool InConstantContext = false) const;
699 
700  /// EvaluateAsInitializer - Evaluate an expression as if it were the
701  /// initializer of the given declaration. Returns true if the initializer
702  /// can be folded to a constant, and produces any relevant notes. In C++11,
703  /// notes will be produced if the expression is not a constant expression.
704  bool EvaluateAsInitializer(APValue &Result, const ASTContext &Ctx,
705  const VarDecl *VD,
707  bool IsConstantInitializer) const;
708 
709  /// EvaluateWithSubstitution - Evaluate an expression as if from the context
710  /// of a call to the given function with the given arguments, inside an
711  /// unevaluated context. Returns true if the expression could be folded to a
712  /// constant.
714  const FunctionDecl *Callee,
716  const Expr *This = nullptr) const;
717 
718  enum class ConstantExprKind {
719  /// An integer constant expression (an array bound, enumerator, case value,
720  /// bit-field width, or similar) or similar.
721  Normal,
722  /// A non-class template argument. Such a value is only used for mangling,
723  /// not for code generation, so can refer to dllimported functions.
725  /// A class template argument. Such a value is used for code generation.
727  /// An immediate invocation. The destruction of the end result of this
728  /// evaluation is not part of the evaluation, but all other temporaries
729  /// are destroyed.
731  };
732 
733  /// Evaluate an expression that is required to be a constant expression. Does
734  /// not check the syntactic constraints for C and C++98 constant expressions.
736  EvalResult &Result, const ASTContext &Ctx,
738 
739  /// If the current Expr is a pointer, this will try to statically
740  /// determine the number of bytes available where the pointer is pointing.
741  /// Returns true if all of the above holds and we were able to figure out the
742  /// size, false otherwise.
743  ///
744  /// \param Type - How to evaluate the size of the Expr, as defined by the
745  /// "type" parameter of __builtin_object_size
746  bool tryEvaluateObjectSize(uint64_t &Result, ASTContext &Ctx,
747  unsigned Type) const;
748 
749  /// If the current Expr is a pointer, this will try to statically
750  /// determine the strlen of the string pointed to.
751  /// Returns true if all of the above holds and we were able to figure out the
752  /// strlen, false otherwise.
753  bool tryEvaluateStrLen(uint64_t &Result, ASTContext &Ctx) const;
754 
755  /// Enumeration used to describe the kind of Null pointer constant
756  /// returned from \c isNullPointerConstant().
758  /// Expression is not a Null pointer constant.
760 
761  /// Expression is a Null pointer constant built from a zero integer
762  /// expression that is not a simple, possibly parenthesized, zero literal.
763  /// C++ Core Issue 903 will classify these expressions as "not pointers"
764  /// once it is adopted.
765  /// http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#903
767 
768  /// Expression is a Null pointer constant built from a literal zero.
770 
771  /// Expression is a C++11 nullptr.
773 
774  /// Expression is a GNU-style __null constant.
776  };
777 
778  /// Enumeration used to describe how \c isNullPointerConstant()
779  /// should cope with value-dependent expressions.
781  /// Specifies that the expression should never be value-dependent.
783 
784  /// Specifies that a value-dependent expression of integral or
785  /// dependent type should be considered a null pointer constant.
787 
788  /// Specifies that a value-dependent expression should be considered
789  /// to never be a null pointer constant.
791  };
792 
793  /// isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to
794  /// a Null pointer constant. The return value can further distinguish the
795  /// kind of NULL pointer constant that was detected.
797  ASTContext &Ctx,
799 
800  /// isOBJCGCCandidate - Return true if this expression may be used in a read/
801  /// write barrier.
802  bool isOBJCGCCandidate(ASTContext &Ctx) const;
803 
804  /// Returns true if this expression is a bound member function.
805  bool isBoundMemberFunction(ASTContext &Ctx) const;
806 
807  /// Given an expression of bound-member type, find the type
808  /// of the member. Returns null if this is an *overloaded* bound
809  /// member expression.
810  static QualType findBoundMemberType(const Expr *expr);
811 
812  /// Skip past any invisble AST nodes which might surround this
813  /// statement, such as ExprWithCleanups or ImplicitCastExpr nodes,
814  /// but also injected CXXMemberExpr and CXXConstructExpr which represent
815  /// implicit conversions.
818  return const_cast<Expr *>(this)->IgnoreUnlessSpelledInSource();
819  }
820 
821  /// Skip past any implicit casts which might surround this expression until
822  /// reaching a fixed point. Skips:
823  /// * ImplicitCastExpr
824  /// * FullExpr
825  Expr *IgnoreImpCasts() LLVM_READONLY;
826  const Expr *IgnoreImpCasts() const {
827  return const_cast<Expr *>(this)->IgnoreImpCasts();
828  }
829 
830  /// Skip past any casts which might surround this expression until reaching
831  /// a fixed point. Skips:
832  /// * CastExpr
833  /// * FullExpr
834  /// * MaterializeTemporaryExpr
835  /// * SubstNonTypeTemplateParmExpr
836  Expr *IgnoreCasts() LLVM_READONLY;
837  const Expr *IgnoreCasts() const {
838  return const_cast<Expr *>(this)->IgnoreCasts();
839  }
840 
841  /// Skip past any implicit AST nodes which might surround this expression
842  /// until reaching a fixed point. Skips:
843  /// * What IgnoreImpCasts() skips
844  /// * MaterializeTemporaryExpr
845  /// * CXXBindTemporaryExpr
846  Expr *IgnoreImplicit() LLVM_READONLY;
847  const Expr *IgnoreImplicit() const {
848  return const_cast<Expr *>(this)->IgnoreImplicit();
849  }
850 
851  /// Skip past any implicit AST nodes which might surround this expression
852  /// until reaching a fixed point. Same as IgnoreImplicit, except that it
853  /// also skips over implicit calls to constructors and conversion functions.
854  ///
855  /// FIXME: Should IgnoreImplicit do this?
856  Expr *IgnoreImplicitAsWritten() LLVM_READONLY;
857  const Expr *IgnoreImplicitAsWritten() const {
858  return const_cast<Expr *>(this)->IgnoreImplicitAsWritten();
859  }
860 
861  /// Skip past any parentheses which might surround this expression until
862  /// reaching a fixed point. Skips:
863  /// * ParenExpr
864  /// * UnaryOperator if `UO_Extension`
865  /// * GenericSelectionExpr if `!isResultDependent()`
866  /// * ChooseExpr if `!isConditionDependent()`
867  /// * ConstantExpr
868  Expr *IgnoreParens() LLVM_READONLY;
869  const Expr *IgnoreParens() const {
870  return const_cast<Expr *>(this)->IgnoreParens();
871  }
872 
873  /// Skip past any parentheses and implicit casts which might surround this
874  /// expression until reaching a fixed point.
875  /// FIXME: IgnoreParenImpCasts really ought to be equivalent to
876  /// IgnoreParens() + IgnoreImpCasts() until reaching a fixed point. However
877  /// this is currently not the case. Instead IgnoreParenImpCasts() skips:
878  /// * What IgnoreParens() skips
879  /// * What IgnoreImpCasts() skips
880  /// * MaterializeTemporaryExpr
881  /// * SubstNonTypeTemplateParmExpr
882  Expr *IgnoreParenImpCasts() LLVM_READONLY;
883  const Expr *IgnoreParenImpCasts() const {
884  return const_cast<Expr *>(this)->IgnoreParenImpCasts();
885  }
886 
887  /// Skip past any parentheses and casts which might surround this expression
888  /// until reaching a fixed point. Skips:
889  /// * What IgnoreParens() skips
890  /// * What IgnoreCasts() skips
891  Expr *IgnoreParenCasts() LLVM_READONLY;
892  const Expr *IgnoreParenCasts() const {
893  return const_cast<Expr *>(this)->IgnoreParenCasts();
894  }
895 
896  /// Skip conversion operators. If this Expr is a call to a conversion
897  /// operator, return the argument.
898  Expr *IgnoreConversionOperatorSingleStep() LLVM_READONLY;
900  return const_cast<Expr *>(this)->IgnoreConversionOperatorSingleStep();
901  }
902 
903  /// Skip past any parentheses and lvalue casts which might surround this
904  /// expression until reaching a fixed point. Skips:
905  /// * What IgnoreParens() skips
906  /// * What IgnoreCasts() skips, except that only lvalue-to-rvalue
907  /// casts are skipped
908  /// FIXME: This is intended purely as a temporary workaround for code
909  /// that hasn't yet been rewritten to do the right thing about those
910  /// casts, and may disappear along with the last internal use.
911  Expr *IgnoreParenLValueCasts() LLVM_READONLY;
912  const Expr *IgnoreParenLValueCasts() const {
913  return const_cast<Expr *>(this)->IgnoreParenLValueCasts();
914  }
915 
916  /// Skip past any parenthese and casts which do not change the value
917  /// (including ptr->int casts of the same size) until reaching a fixed point.
918  /// Skips:
919  /// * What IgnoreParens() skips
920  /// * CastExpr which do not change the value
921  /// * SubstNonTypeTemplateParmExpr
922  Expr *IgnoreParenNoopCasts(const ASTContext &Ctx) LLVM_READONLY;
923  const Expr *IgnoreParenNoopCasts(const ASTContext &Ctx) const {
924  return const_cast<Expr *>(this)->IgnoreParenNoopCasts(Ctx);
925  }
926 
927  /// Skip past any parentheses and derived-to-base casts until reaching a
928  /// fixed point. Skips:
929  /// * What IgnoreParens() skips
930  /// * CastExpr which represent a derived-to-base cast (CK_DerivedToBase,
931  /// CK_UncheckedDerivedToBase and CK_NoOp)
932  Expr *IgnoreParenBaseCasts() LLVM_READONLY;
933  const Expr *IgnoreParenBaseCasts() const {
934  return const_cast<Expr *>(this)->IgnoreParenBaseCasts();
935  }
936 
937  /// Determine whether this expression is a default function argument.
938  ///
939  /// Default arguments are implicitly generated in the abstract syntax tree
940  /// by semantic analysis for function calls, object constructions, etc. in
941  /// C++. Default arguments are represented by \c CXXDefaultArgExpr nodes;
942  /// this routine also looks through any implicit casts to determine whether
943  /// the expression is a default argument.
944  bool isDefaultArgument() const;
945 
946  /// Determine whether the result of this expression is a
947  /// temporary object of the given class type.
948  bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const;
949 
950  /// Whether this expression is an implicit reference to 'this' in C++.
951  bool isImplicitCXXThis() const;
952 
954 
955  /// For an expression of class type or pointer to class type,
956  /// return the most derived class decl the expression is known to refer to.
957  ///
958  /// If this expression is a cast, this method looks through it to find the
959  /// most derived decl that can be inferred from the expression.
960  /// This is valid because derived-to-base conversions have undefined
961  /// behavior if the object isn't dynamically of the derived type.
962  const CXXRecordDecl *getBestDynamicClassType() const;
963 
964  /// Get the inner expression that determines the best dynamic class.
965  /// If this is a prvalue, we guarantee that it is of the most-derived type
966  /// for the object itself.
967  const Expr *getBestDynamicClassTypeExpr() const;
968 
969  /// Walk outwards from an expression we want to bind a reference to and
970  /// find the expression whose lifetime needs to be extended. Record
971  /// the LHSs of comma expressions and adjustments needed along the path.
974  SmallVectorImpl<SubobjectAdjustment> &Adjustments) const;
978  return skipRValueSubobjectAdjustments(CommaLHSs, Adjustments);
979  }
980 
981  /// Checks that the two Expr's will refer to the same value as a comparison
982  /// operand. The caller must ensure that the values referenced by the Expr's
983  /// are not modified between E1 and E2 or the result my be invalid.
984  static bool isSameComparisonOperand(const Expr* E1, const Expr* E2);
985 
986  static bool classof(const Stmt *T) {
987  return T->getStmtClass() >= firstExprConstant &&
988  T->getStmtClass() <= lastExprConstant;
989  }
990 };
991 // PointerLikeTypeTraits is specialized so it can be used with a forward-decl of
992 // Expr. Verify that we got it right.
994  llvm::detail::ConstantLog2<alignof(Expr)>::value,
995  "PointerLikeTypeTraits<Expr*> assumes too much alignment.");
996 
998 
999 //===----------------------------------------------------------------------===//
1000 // Wrapper Expressions.
1001 //===----------------------------------------------------------------------===//
1002 
1003 /// FullExpr - Represents a "full-expression" node.
1004 class FullExpr : public Expr {
1005 protected:
1007 
1008  FullExpr(StmtClass SC, Expr *subexpr)
1009  : Expr(SC, subexpr->getType(), subexpr->getValueKind(),
1010  subexpr->getObjectKind()),
1011  SubExpr(subexpr) {
1013  }
1015  : Expr(SC, Empty) {}
1016 public:
1017  const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
1018  Expr *getSubExpr() { return cast<Expr>(SubExpr); }
1019 
1020  /// As with any mutator of the AST, be very careful when modifying an
1021  /// existing AST to preserve its invariants.
1022  void setSubExpr(Expr *E) { SubExpr = E; }
1023 
1024  static bool classof(const Stmt *T) {
1025  return T->getStmtClass() >= firstFullExprConstant &&
1026  T->getStmtClass() <= lastFullExprConstant;
1027  }
1028 };
1029 
1030 /// ConstantExpr - An expression that occurs in a constant context and
1031 /// optionally the result of evaluating the expression.
1032 class ConstantExpr final
1033  : public FullExpr,
1034  private llvm::TrailingObjects<ConstantExpr, APValue, uint64_t> {
1035  static_assert(std::is_same<uint64_t, llvm::APInt::WordType>::value,
1036  "ConstantExpr assumes that llvm::APInt::WordType is uint64_t "
1037  "for tail-allocated storage");
1038  friend TrailingObjects;
1039  friend class ASTStmtReader;
1040  friend class ASTStmtWriter;
1041 
1042 public:
1043  /// Describes the kind of result that can be tail-allocated.
1045 
1046 private:
1047  size_t numTrailingObjects(OverloadToken<APValue>) const {
1048  return ConstantExprBits.ResultKind == ConstantExpr::RSK_APValue;
1049  }
1050  size_t numTrailingObjects(OverloadToken<uint64_t>) const {
1051  return ConstantExprBits.ResultKind == ConstantExpr::RSK_Int64;
1052  }
1053 
1054  uint64_t &Int64Result() {
1055  assert(ConstantExprBits.ResultKind == ConstantExpr::RSK_Int64 &&
1056  "invalid accessor");
1057  return *getTrailingObjects<uint64_t>();
1058  }
1059  const uint64_t &Int64Result() const {
1060  return const_cast<ConstantExpr *>(this)->Int64Result();
1061  }
1062  APValue &APValueResult() {
1063  assert(ConstantExprBits.ResultKind == ConstantExpr::RSK_APValue &&
1064  "invalid accessor");
1065  return *getTrailingObjects<APValue>();
1066  }
1067  APValue &APValueResult() const {
1068  return const_cast<ConstantExpr *>(this)->APValueResult();
1069  }
1070 
1071  ConstantExpr(Expr *SubExpr, ResultStorageKind StorageKind,
1072  bool IsImmediateInvocation);
1073  ConstantExpr(EmptyShell Empty, ResultStorageKind StorageKind);
1074 
1075 public:
1076  static ConstantExpr *Create(const ASTContext &Context, Expr *E,
1077  const APValue &Result);
1078  static ConstantExpr *Create(const ASTContext &Context, Expr *E,
1079  ResultStorageKind Storage = RSK_None,
1080  bool IsImmediateInvocation = false);
1081  static ConstantExpr *CreateEmpty(const ASTContext &Context,
1082  ResultStorageKind StorageKind);
1083 
1084  static ResultStorageKind getStorageKind(const APValue &Value);
1085  static ResultStorageKind getStorageKind(const Type *T,
1086  const ASTContext &Context);
1087 
1088  SourceLocation getBeginLoc() const LLVM_READONLY {
1089  return SubExpr->getBeginLoc();
1090  }
1091  SourceLocation getEndLoc() const LLVM_READONLY {
1092  return SubExpr->getEndLoc();
1093  }
1094 
1095  static bool classof(const Stmt *T) {
1096  return T->getStmtClass() == ConstantExprClass;
1097  }
1098 
1099  void SetResult(APValue Value, const ASTContext &Context) {
1100  MoveIntoResult(Value, Context);
1101  }
1102  void MoveIntoResult(APValue &Value, const ASTContext &Context);
1103 
1105  return static_cast<APValue::ValueKind>(ConstantExprBits.APValueKind);
1106  }
1108  return static_cast<ResultStorageKind>(ConstantExprBits.ResultKind);
1109  }
1110  bool isImmediateInvocation() const {
1111  return ConstantExprBits.IsImmediateInvocation;
1112  }
1113  bool hasAPValueResult() const {
1114  return ConstantExprBits.APValueKind != APValue::None;
1115  }
1116  APValue getAPValueResult() const;
1117  APValue &getResultAsAPValue() const { return APValueResult(); }
1119  // Iterators
1122  return const_child_range(&SubExpr, &SubExpr + 1);
1123  }
1124 };
1125 
1126 //===----------------------------------------------------------------------===//
1127 // Primary Expressions.
1128 //===----------------------------------------------------------------------===//
1129 
1130 /// OpaqueValueExpr - An expression referring to an opaque object of a
1131 /// fixed type and value class. These don't correspond to concrete
1132 /// syntax; instead they're used to express operations (usually copy
1133 /// operations) on values whose source is generally obvious from
1134 /// context.
1135 class OpaqueValueExpr : public Expr {
1136  friend class ASTStmtReader;
1137  Expr *SourceExpr;
1138 
1139 public:
1141  ExprObjectKind OK = OK_Ordinary, Expr *SourceExpr = nullptr)
1142  : Expr(OpaqueValueExprClass, T, VK, OK), SourceExpr(SourceExpr) {
1143  setIsUnique(false);
1144  OpaqueValueExprBits.Loc = Loc;
1146  }
1147 
1148  /// Given an expression which invokes a copy constructor --- i.e. a
1149  /// CXXConstructExpr, possibly wrapped in an ExprWithCleanups ---
1150  /// find the OpaqueValueExpr that's the source of the construction.
1151  static const OpaqueValueExpr *findInCopyConstruct(const Expr *expr);
1152 
1153  explicit OpaqueValueExpr(EmptyShell Empty)
1154  : Expr(OpaqueValueExprClass, Empty) {}
1155 
1156  /// Retrieve the location of this expression.
1158 
1159  SourceLocation getBeginLoc() const LLVM_READONLY {
1160  return SourceExpr ? SourceExpr->getBeginLoc() : getLocation();
1161  }
1162  SourceLocation getEndLoc() const LLVM_READONLY {
1163  return SourceExpr ? SourceExpr->getEndLoc() : getLocation();
1164  }
1165  SourceLocation getExprLoc() const LLVM_READONLY {
1166  return SourceExpr ? SourceExpr->getExprLoc() : getLocation();
1167  }
1168 
1171  }
1172 
1175  }
1176 
1177  /// The source expression of an opaque value expression is the
1178  /// expression which originally generated the value. This is
1179  /// provided as a convenience for analyses that don't wish to
1180  /// precisely model the execution behavior of the program.
1181  ///
1182  /// The source expression is typically set when building the
1183  /// expression which binds the opaque value expression in the first
1184  /// place.
1185  Expr *getSourceExpr() const { return SourceExpr; }
1186 
1187  void setIsUnique(bool V) {
1188  assert((!V || SourceExpr) &&
1189  "unique OVEs are expected to have source expressions");
1190  OpaqueValueExprBits.IsUnique = V;
1191  }
1192 
1193  bool isUnique() const { return OpaqueValueExprBits.IsUnique; }
1194 
1195  static bool classof(const Stmt *T) {
1196  return T->getStmtClass() == OpaqueValueExprClass;
1197  }
1198 };
1199 
1200 /// A reference to a declared variable, function, enum, etc.
1201 /// [C99 6.5.1p2]
1202 ///
1203 /// This encodes all the information about how a declaration is referenced
1204 /// within an expression.
1205 ///
1206 /// There are several optional constructs attached to DeclRefExprs only when
1207 /// they apply in order to conserve memory. These are laid out past the end of
1208 /// the object, and flags in the DeclRefExprBitfield track whether they exist:
1209 ///
1210 /// DeclRefExprBits.HasQualifier:
1211 /// Specifies when this declaration reference expression has a C++
1212 /// nested-name-specifier.
1213 /// DeclRefExprBits.HasFoundDecl:
1214 /// Specifies when this declaration reference expression has a record of
1215 /// a NamedDecl (different from the referenced ValueDecl) which was found
1216 /// during name lookup and/or overload resolution.
1217 /// DeclRefExprBits.HasTemplateKWAndArgsInfo:
1218 /// Specifies when this declaration reference expression has an explicit
1219 /// C++ template keyword and/or template argument list.
1220 /// DeclRefExprBits.RefersToEnclosingVariableOrCapture
1221 /// Specifies when this declaration reference expression (validly)
1222 /// refers to an enclosed local or a captured variable.
1223 class DeclRefExpr final
1224  : public Expr,
1225  private llvm::TrailingObjects<DeclRefExpr, NestedNameSpecifierLoc,
1226  NamedDecl *, ASTTemplateKWAndArgsInfo,
1227  TemplateArgumentLoc> {
1228  friend class ASTStmtReader;
1229  friend class ASTStmtWriter;
1230  friend TrailingObjects;
1231 
1232  /// The declaration that we are referencing.
1233  ValueDecl *D;
1234 
1235  /// Provides source/type location info for the declaration name
1236  /// embedded in D.
1237  DeclarationNameLoc DNLoc;
1238 
1239  size_t numTrailingObjects(OverloadToken<NestedNameSpecifierLoc>) const {
1240  return hasQualifier();
1241  }
1242 
1243  size_t numTrailingObjects(OverloadToken<NamedDecl *>) const {
1244  return hasFoundDecl();
1245  }
1246 
1247  size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
1248  return hasTemplateKWAndArgsInfo();
1249  }
1250 
1251  /// Test whether there is a distinct FoundDecl attached to the end of
1252  /// this DRE.
1253  bool hasFoundDecl() const { return DeclRefExprBits.HasFoundDecl; }
1254 
1255  DeclRefExpr(const ASTContext &Ctx, NestedNameSpecifierLoc QualifierLoc,
1256  SourceLocation TemplateKWLoc, ValueDecl *D,
1257  bool RefersToEnlosingVariableOrCapture,
1258  const DeclarationNameInfo &NameInfo, NamedDecl *FoundD,
1259  const TemplateArgumentListInfo *TemplateArgs, QualType T,
1260  ExprValueKind VK, NonOdrUseReason NOUR);
1261 
1262  /// Construct an empty declaration reference expression.
1263  explicit DeclRefExpr(EmptyShell Empty) : Expr(DeclRefExprClass, Empty) {}
1264 
1265 public:
1266  DeclRefExpr(const ASTContext &Ctx, ValueDecl *D,
1267  bool RefersToEnclosingVariableOrCapture, QualType T,
1268  ExprValueKind VK, SourceLocation L,
1269  const DeclarationNameLoc &LocInfo = DeclarationNameLoc(),
1270  NonOdrUseReason NOUR = NOUR_None);
1271 
1272  static DeclRefExpr *
1273  Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc,
1274  SourceLocation TemplateKWLoc, ValueDecl *D,
1275  bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc,
1276  QualType T, ExprValueKind VK, NamedDecl *FoundD = nullptr,
1277  const TemplateArgumentListInfo *TemplateArgs = nullptr,
1278  NonOdrUseReason NOUR = NOUR_None);
1279 
1280  static DeclRefExpr *
1281  Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc,
1282  SourceLocation TemplateKWLoc, ValueDecl *D,
1283  bool RefersToEnclosingVariableOrCapture,
1284  const DeclarationNameInfo &NameInfo, QualType T, ExprValueKind VK,
1285  NamedDecl *FoundD = nullptr,
1286  const TemplateArgumentListInfo *TemplateArgs = nullptr,
1287  NonOdrUseReason NOUR = NOUR_None);
1288 
1289  /// Construct an empty declaration reference expression.
1290  static DeclRefExpr *CreateEmpty(const ASTContext &Context, bool HasQualifier,
1291  bool HasFoundDecl,
1292  bool HasTemplateKWAndArgsInfo,
1293  unsigned NumTemplateArgs);
1294 
1295  ValueDecl *getDecl() { return D; }
1296  const ValueDecl *getDecl() const { return D; }
1297  void setDecl(ValueDecl *NewD);
1298 
1300  return DeclarationNameInfo(getDecl()->getDeclName(), getLocation(), DNLoc);
1301  }
1302 
1305  SourceLocation getBeginLoc() const LLVM_READONLY;
1306  SourceLocation getEndLoc() const LLVM_READONLY;
1307 
1308  /// Determine whether this declaration reference was preceded by a
1309  /// C++ nested-name-specifier, e.g., \c N::foo.
1310  bool hasQualifier() const { return DeclRefExprBits.HasQualifier; }
1311 
1312  /// If the name was qualified, retrieves the nested-name-specifier
1313  /// that precedes the name, with source-location information.
1315  if (!hasQualifier())
1316  return NestedNameSpecifierLoc();
1317  return *getTrailingObjects<NestedNameSpecifierLoc>();
1318  }
1319 
1320  /// If the name was qualified, retrieves the nested-name-specifier
1321  /// that precedes the name. Otherwise, returns NULL.
1324  }
1325 
1326  /// Get the NamedDecl through which this reference occurred.
1327  ///
1328  /// This Decl may be different from the ValueDecl actually referred to in the
1329  /// presence of using declarations, etc. It always returns non-NULL, and may
1330  /// simple return the ValueDecl when appropriate.
1331 
1333  return hasFoundDecl() ? *getTrailingObjects<NamedDecl *>() : D;
1334  }
1335 
1336  /// Get the NamedDecl through which this reference occurred.
1337  /// See non-const variant.
1338  const NamedDecl *getFoundDecl() const {
1339  return hasFoundDecl() ? *getTrailingObjects<NamedDecl *>() : D;
1340  }
1341 
1343  return DeclRefExprBits.HasTemplateKWAndArgsInfo;
1344  }
1345 
1346  /// Retrieve the location of the template keyword preceding
1347  /// this name, if any.
1349  if (!hasTemplateKWAndArgsInfo())
1350  return SourceLocation();
1351  return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc;
1352  }
1353 
1354  /// Retrieve the location of the left angle bracket starting the
1355  /// explicit template argument list following the name, if any.
1357  if (!hasTemplateKWAndArgsInfo())
1358  return SourceLocation();
1359  return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc;
1360  }
1361 
1362  /// Retrieve the location of the right angle bracket ending the
1363  /// explicit template argument list following the name, if any.
1365  if (!hasTemplateKWAndArgsInfo())
1366  return SourceLocation();
1367  return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc;
1368  }
1369 
1370  /// Determines whether the name in this declaration reference
1371  /// was preceded by the template keyword.
1372  bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
1373 
1374  /// Determines whether this declaration reference was followed by an
1375  /// explicit template argument list.
1376  bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
1377 
1378  /// Copies the template arguments (if present) into the given
1379  /// structure.
1382  getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto(
1383  getTrailingObjects<TemplateArgumentLoc>(), List);
1384  }
1385 
1386  /// Retrieve the template arguments provided as part of this
1387  /// template-id.
1389  if (!hasExplicitTemplateArgs())
1390  return nullptr;
1391  return getTrailingObjects<TemplateArgumentLoc>();
1392  }
1393 
1394  /// Retrieve the number of template arguments provided as part of this
1395  /// template-id.
1396  unsigned getNumTemplateArgs() const {
1397  if (!hasExplicitTemplateArgs())
1398  return 0;
1399  return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
1400  }
1401 
1403  return {getTemplateArgs(), getNumTemplateArgs()};
1404  }
1405 
1406  /// Returns true if this expression refers to a function that
1407  /// was resolved from an overloaded set having size greater than 1.
1408  bool hadMultipleCandidates() const {
1409  return DeclRefExprBits.HadMultipleCandidates;
1410  }
1411  /// Sets the flag telling whether this expression refers to
1412  /// a function that was resolved from an overloaded set having size
1413  /// greater than 1.
1414  void setHadMultipleCandidates(bool V = true) {
1415  DeclRefExprBits.HadMultipleCandidates = V;
1416  }
1417 
1418  /// Is this expression a non-odr-use reference, and if so, why?
1420  return static_cast<NonOdrUseReason>(DeclRefExprBits.NonOdrUseReason);
1421  }
1422 
1423  /// Does this DeclRefExpr refer to an enclosing local or a captured
1424  /// variable?
1426  return DeclRefExprBits.RefersToEnclosingVariableOrCapture;
1427  }
1428 
1429  static bool classof(const Stmt *T) {
1430  return T->getStmtClass() == DeclRefExprClass;
1431  }
1432 
1433  // Iterators
1436  }
1437 
1440  }
1441 };
1442 
1443 /// Used by IntegerLiteral/FloatingLiteral to store the numeric without
1444 /// leaking memory.
1445 ///
1446 /// For large floats/integers, APFloat/APInt will allocate memory from the heap
1447 /// to represent these numbers. Unfortunately, when we use a BumpPtrAllocator
1448 /// to allocate IntegerLiteral/FloatingLiteral nodes the memory associated with
1449 /// the APFloat/APInt values will never get freed. APNumericStorage uses
1450 /// ASTContext's allocator for memory allocation.
1452  union {
1453  uint64_t VAL; ///< Used to store the <= 64 bits integer value.
1454  uint64_t *pVal; ///< Used to store the >64 bits integer value.
1455  };
1456  unsigned BitWidth;
1457 
1458  bool hasAllocation() const { return llvm::APInt::getNumWords(BitWidth) > 1; }
1459 
1460  APNumericStorage(const APNumericStorage &) = delete;
1461  void operator=(const APNumericStorage &) = delete;
1462 
1463 protected:
1464  APNumericStorage() : VAL(0), BitWidth(0) { }
1465 
1467  unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
1468  if (NumWords > 1)
1469  return llvm::APInt(BitWidth, NumWords, pVal);
1470  else
1471  return llvm::APInt(BitWidth, VAL);
1472  }
1473  void setIntValue(const ASTContext &C, const llvm::APInt &Val);
1474 };
1475 
1477 public:
1478  llvm::APInt getValue() const { return getIntValue(); }
1479  void setValue(const ASTContext &C, const llvm::APInt &Val) {
1480  setIntValue(C, Val);
1481  }
1482 };
1483 
1485 public:
1486  llvm::APFloat getValue(const llvm::fltSemantics &Semantics) const {
1487  return llvm::APFloat(Semantics, getIntValue());
1488  }
1489  void setValue(const ASTContext &C, const llvm::APFloat &Val) {
1490  setIntValue(C, Val.bitcastToAPInt());
1491  }
1492 };
1493 
1494 class IntegerLiteral : public Expr, public APIntStorage {
1495  SourceLocation Loc;
1496 
1497  /// Construct an empty integer literal.
1498  explicit IntegerLiteral(EmptyShell Empty)
1499  : Expr(IntegerLiteralClass, Empty) { }
1500 
1501 public:
1502  // type should be IntTy, LongTy, LongLongTy, UnsignedIntTy, UnsignedLongTy,
1503  // or UnsignedLongLongTy
1504  IntegerLiteral(const ASTContext &C, const llvm::APInt &V, QualType type,
1505  SourceLocation l);
1506 
1507  /// Returns a new integer literal with value 'V' and type 'type'.
1508  /// \param type - either IntTy, LongTy, LongLongTy, UnsignedIntTy,
1509  /// UnsignedLongTy, or UnsignedLongLongTy which should match the size of V
1510  /// \param V - the value that the returned integer literal contains.
1511  static IntegerLiteral *Create(const ASTContext &C, const llvm::APInt &V,
1513  /// Returns a new empty integer literal.
1514  static IntegerLiteral *Create(const ASTContext &C, EmptyShell Empty);
1515 
1516  SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
1517  SourceLocation getEndLoc() const LLVM_READONLY { return Loc; }
1518 
1519  /// Retrieve the location of the literal.
1520  SourceLocation getLocation() const { return Loc; }
1521 
1522  void setLocation(SourceLocation Location) { Loc = Location; }
1523 
1524  static bool classof(const Stmt *T) {
1525  return T->getStmtClass() == IntegerLiteralClass;
1526  }
1527 
1528  // Iterators
1531  }
1534  }
1535 };
1536 
1537 class FixedPointLiteral : public Expr, public APIntStorage {
1538  SourceLocation Loc;
1539  unsigned Scale;
1540 
1541  /// \brief Construct an empty fixed-point literal.
1542  explicit FixedPointLiteral(EmptyShell Empty)
1543  : Expr(FixedPointLiteralClass, Empty) {}
1544 
1545  public:
1547  SourceLocation l, unsigned Scale);
1548 
1549  // Store the int as is without any bit shifting.
1551  const llvm::APInt &V,
1553  unsigned Scale);
1554 
1555  /// Returns an empty fixed-point literal.
1556  static FixedPointLiteral *Create(const ASTContext &C, EmptyShell Empty);
1557 
1558  SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
1559  SourceLocation getEndLoc() const LLVM_READONLY { return Loc; }
1560 
1561  /// \brief Retrieve the location of the literal.
1562  SourceLocation getLocation() const { return Loc; }
1563 
1564  void setLocation(SourceLocation Location) { Loc = Location; }
1565 
1566  unsigned getScale() const { return Scale; }
1567  void setScale(unsigned S) { Scale = S; }
1568 
1569  static bool classof(const Stmt *T) {
1570  return T->getStmtClass() == FixedPointLiteralClass;
1571  }
1572 
1573  std::string getValueAsString(unsigned Radix) const;
1574 
1575  // Iterators
1578  }
1581  }
1582 };
1583 
1584 class CharacterLiteral : public Expr {
1585 public:
1592  };
1593 
1594 private:
1595  unsigned Value;
1596  SourceLocation Loc;
1597 public:
1598  // type should be IntTy
1600  SourceLocation l)
1601  : Expr(CharacterLiteralClass, type, VK_PRValue, OK_Ordinary),
1602  Value(value), Loc(l) {
1603  CharacterLiteralBits.Kind = kind;
1605  }
1606 
1607  /// Construct an empty character literal.
1608  CharacterLiteral(EmptyShell Empty) : Expr(CharacterLiteralClass, Empty) { }
1609 
1610  SourceLocation getLocation() const { return Loc; }
1612  return static_cast<CharacterKind>(CharacterLiteralBits.Kind);
1613  }
1614 
1615  SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
1616  SourceLocation getEndLoc() const LLVM_READONLY { return Loc; }
1617 
1618  unsigned getValue() const { return Value; }
1619 
1620  void setLocation(SourceLocation Location) { Loc = Location; }
1622  void setValue(unsigned Val) { Value = Val; }
1623 
1624  static bool classof(const Stmt *T) {
1625  return T->getStmtClass() == CharacterLiteralClass;
1626  }
1627 
1628  static void print(unsigned val, CharacterKind Kind, raw_ostream &OS);
1629 
1630  // Iterators
1633  }
1636  }
1637 };
1638 
1639 class FloatingLiteral : public Expr, private APFloatStorage {
1640  SourceLocation Loc;
1641 
1642  FloatingLiteral(const ASTContext &C, const llvm::APFloat &V, bool isexact,
1644 
1645  /// Construct an empty floating-point literal.
1646  explicit FloatingLiteral(const ASTContext &C, EmptyShell Empty);
1647 
1648 public:
1649  static FloatingLiteral *Create(const ASTContext &C, const llvm::APFloat &V,
1650  bool isexact, QualType Type, SourceLocation L);
1651  static FloatingLiteral *Create(const ASTContext &C, EmptyShell Empty);
1652 
1653  llvm::APFloat getValue() const {
1655  }
1656  void setValue(const ASTContext &C, const llvm::APFloat &Val) {
1657  assert(&getSemantics() == &Val.getSemantics() && "Inconsistent semantics");
1658  APFloatStorage::setValue(C, Val);
1659  }
1660 
1661  /// Get a raw enumeration value representing the floating-point semantics of
1662  /// this literal (32-bit IEEE, x87, ...), suitable for serialisation.
1663  llvm::APFloatBase::Semantics getRawSemantics() const {
1664  return static_cast<llvm::APFloatBase::Semantics>(
1665  FloatingLiteralBits.Semantics);
1666  }
1667 
1668  /// Set the raw enumeration value representing the floating-point semantics of
1669  /// this literal (32-bit IEEE, x87, ...), suitable for serialisation.
1670  void setRawSemantics(llvm::APFloatBase::Semantics Sem) {
1671  FloatingLiteralBits.Semantics = Sem;
1672  }
1673 
1674  /// Return the APFloat semantics this literal uses.
1675  const llvm::fltSemantics &getSemantics() const {
1676  return llvm::APFloatBase::EnumToSemantics(
1677  static_cast<llvm::APFloatBase::Semantics>(
1678  FloatingLiteralBits.Semantics));
1679  }
1680 
1681  /// Set the APFloat semantics this literal uses.
1682  void setSemantics(const llvm::fltSemantics &Sem) {
1683  FloatingLiteralBits.Semantics = llvm::APFloatBase::SemanticsToEnum(Sem);
1684  }
1685 
1686  bool isExact() const { return FloatingLiteralBits.IsExact; }
1687  void setExact(bool E) { FloatingLiteralBits.IsExact = E; }
1688 
1689  /// getValueAsApproximateDouble - This returns the value as an inaccurate
1690  /// double. Note that this may cause loss of precision, but is useful for
1691  /// debugging dumps, etc.
1692  double getValueAsApproximateDouble() const;
1693 
1694  SourceLocation getLocation() const { return Loc; }
1695  void setLocation(SourceLocation L) { Loc = L; }
1696 
1697  SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
1698  SourceLocation getEndLoc() const LLVM_READONLY { return Loc; }
1699 
1700  static bool classof(const Stmt *T) {
1701  return T->getStmtClass() == FloatingLiteralClass;
1702  }
1703 
1704  // Iterators
1707  }
1710  }
1711 };
1712 
1713 /// ImaginaryLiteral - We support imaginary integer and floating point literals,
1714 /// like "1.0i". We represent these as a wrapper around FloatingLiteral and
1715 /// IntegerLiteral classes. Instances of this class always have a Complex type
1716 /// whose element type matches the subexpression.
1717 ///
1718 class ImaginaryLiteral : public Expr {
1719  Stmt *Val;
1720 public:
1722  : Expr(ImaginaryLiteralClass, Ty, VK_PRValue, OK_Ordinary), Val(val) {
1724  }
1725 
1726  /// Build an empty imaginary literal.
1728  : Expr(ImaginaryLiteralClass, Empty) { }
1729 
1730  const Expr *getSubExpr() const { return cast<Expr>(Val); }
1731  Expr *getSubExpr() { return cast<Expr>(Val); }
1732  void setSubExpr(Expr *E) { Val = E; }
1733 
1734  SourceLocation getBeginLoc() const LLVM_READONLY {
1735  return Val->getBeginLoc();
1736  }
1737  SourceLocation getEndLoc() const LLVM_READONLY { return Val->getEndLoc(); }
1738 
1739  static bool classof(const Stmt *T) {
1740  return T->getStmtClass() == ImaginaryLiteralClass;
1741  }
1742 
1743  // Iterators
1744  child_range children() { return child_range(&Val, &Val+1); }
1746  return const_child_range(&Val, &Val + 1);
1747  }
1748 };
1749 
1750 /// StringLiteral - This represents a string literal expression, e.g. "foo"
1751 /// or L"bar" (wide strings). The actual string data can be obtained with
1752 /// getBytes() and is NOT null-terminated. The length of the string data is
1753 /// determined by calling getByteLength().
1754 ///
1755 /// The C type for a string is always a ConstantArrayType. In C++, the char
1756 /// type is const qualified, in C it is not.
1757 ///
1758 /// Note that strings in C can be formed by concatenation of multiple string
1759 /// literal pptokens in translation phase #6. This keeps track of the locations
1760 /// of each of these pieces.
1761 ///
1762 /// Strings in C can also be truncated and extended by assigning into arrays,
1763 /// e.g. with constructs like:
1764 /// char X[2] = "foobar";
1765 /// In this case, getByteLength() will return 6, but the string literal will
1766 /// have type "char[2]".
1767 class StringLiteral final
1768  : public Expr,
1769  private llvm::TrailingObjects<StringLiteral, unsigned, SourceLocation,
1770  char> {
1771  friend class ASTStmtReader;
1772  friend TrailingObjects;
1773 
1774  /// StringLiteral is followed by several trailing objects. They are in order:
1775  ///
1776  /// * A single unsigned storing the length in characters of this string. The
1777  /// length in bytes is this length times the width of a single character.
1778  /// Always present and stored as a trailing objects because storing it in
1779  /// StringLiteral would increase the size of StringLiteral by sizeof(void *)
1780  /// due to alignment requirements. If you add some data to StringLiteral,
1781  /// consider moving it inside StringLiteral.
1782  ///
1783  /// * An array of getNumConcatenated() SourceLocation, one for each of the
1784  /// token this string is made of.
1785  ///
1786  /// * An array of getByteLength() char used to store the string data.
1787 
1788 public:
1790 
1791 private:
1792  unsigned numTrailingObjects(OverloadToken<unsigned>) const { return 1; }
1793  unsigned numTrailingObjects(OverloadToken<SourceLocation>) const {
1794  return getNumConcatenated();
1795  }
1796 
1797  unsigned numTrailingObjects(OverloadToken<char>) const {
1798  return getByteLength();
1799  }
1800 
1801  char *getStrDataAsChar() { return getTrailingObjects<char>(); }
1802  const char *getStrDataAsChar() const { return getTrailingObjects<char>(); }
1803 
1804  const uint16_t *getStrDataAsUInt16() const {
1805  return reinterpret_cast<const uint16_t *>(getTrailingObjects<char>());
1806  }
1807 
1808  const uint32_t *getStrDataAsUInt32() const {
1809  return reinterpret_cast<const uint32_t *>(getTrailingObjects<char>());
1810  }
1811 
1812  /// Build a string literal.
1813  StringLiteral(const ASTContext &Ctx, StringRef Str, StringKind Kind,
1814  bool Pascal, QualType Ty, const SourceLocation *Loc,
1815  unsigned NumConcatenated);
1816 
1817  /// Build an empty string literal.
1818  StringLiteral(EmptyShell Empty, unsigned NumConcatenated, unsigned Length,
1819  unsigned CharByteWidth);
1820 
1821  /// Map a target and string kind to the appropriate character width.
1822  static unsigned mapCharByteWidth(TargetInfo const &Target, StringKind SK);
1823 
1824  /// Set one of the string literal token.
1825  void setStrTokenLoc(unsigned TokNum, SourceLocation L) {
1826  assert(TokNum < getNumConcatenated() && "Invalid tok number");
1827  getTrailingObjects<SourceLocation>()[TokNum] = L;
1828  }
1829 
1830 public:
1831  /// This is the "fully general" constructor that allows representation of
1832  /// strings formed from multiple concatenated tokens.
1833  static StringLiteral *Create(const ASTContext &Ctx, StringRef Str,
1834  StringKind Kind, bool Pascal, QualType Ty,
1835  const SourceLocation *Loc,
1836  unsigned NumConcatenated);
1837 
1838  /// Simple constructor for string literals made from one token.
1839  static StringLiteral *Create(const ASTContext &Ctx, StringRef Str,
1840  StringKind Kind, bool Pascal, QualType Ty,
1841  SourceLocation Loc) {
1842  return Create(Ctx, Str, Kind, Pascal, Ty, &Loc, 1);
1843  }
1844 
1845  /// Construct an empty string literal.
1846  static StringLiteral *CreateEmpty(const ASTContext &Ctx,
1847  unsigned NumConcatenated, unsigned Length,
1848  unsigned CharByteWidth);
1849 
1850  StringRef getString() const {
1851  assert(getCharByteWidth() == 1 &&
1852  "This function is used in places that assume strings use char");
1853  return StringRef(getStrDataAsChar(), getByteLength());
1854  }
1855 
1856  /// Allow access to clients that need the byte representation, such as
1857  /// ASTWriterStmt::VisitStringLiteral().
1858  StringRef getBytes() const {
1859  // FIXME: StringRef may not be the right type to use as a result for this.
1860  return StringRef(getStrDataAsChar(), getByteLength());
1861  }
1862 
1863  void outputString(raw_ostream &OS) const;
1864 
1865  uint32_t getCodeUnit(size_t i) const {
1866  assert(i < getLength() && "out of bounds access");
1867  switch (getCharByteWidth()) {
1868  case 1:
1869  return static_cast<unsigned char>(getStrDataAsChar()[i]);
1870  case 2:
1871  return getStrDataAsUInt16()[i];
1872  case 4:
1873  return getStrDataAsUInt32()[i];
1874  }
1875  llvm_unreachable("Unsupported character width!");
1876  }
1877 
1878  unsigned getByteLength() const { return getCharByteWidth() * getLength(); }
1879  unsigned getLength() const { return *getTrailingObjects<unsigned>(); }
1880  unsigned getCharByteWidth() const { return StringLiteralBits.CharByteWidth; }
1881 
1883  return static_cast<StringKind>(StringLiteralBits.Kind);
1884  }
1885 
1886  bool isAscii() const { return getKind() == Ascii; }
1887  bool isWide() const { return getKind() == Wide; }
1888  bool isUTF8() const { return getKind() == UTF8; }
1889  bool isUTF16() const { return getKind() == UTF16; }
1890  bool isUTF32() const { return getKind() == UTF32; }
1891  bool isPascal() const { return StringLiteralBits.IsPascal; }
1892 
1893  bool containsNonAscii() const {
1894  for (auto c : getString())
1895  if (!isASCII(c))
1896  return true;
1897  return false;
1898  }
1899 
1900  bool containsNonAsciiOrNull() const {
1901  for (auto c : getString())
1902  if (!isASCII(c) || !c)
1903  return true;
1904  return false;
1905  }
1906 
1907  /// getNumConcatenated - Get the number of string literal tokens that were
1908  /// concatenated in translation phase #6 to form this string literal.
1909  unsigned getNumConcatenated() const {
1910  return StringLiteralBits.NumConcatenated;
1911  }
1912 
1913  /// Get one of the string literal token.
1914  SourceLocation getStrTokenLoc(unsigned TokNum) const {
1915  assert(TokNum < getNumConcatenated() && "Invalid tok number");
1916  return getTrailingObjects<SourceLocation>()[TokNum];
1917  }
1918 
1919  /// getLocationOfByte - Return a source location that points to the specified
1920  /// byte of this string literal.
1921  ///
1922  /// Strings are amazingly complex. They can be formed from multiple tokens
1923  /// and can have escape sequences in them in addition to the usual trigraph
1924  /// and escaped newline business. This routine handles this complexity.
1925  ///
1927  getLocationOfByte(unsigned ByteNo, const SourceManager &SM,
1928  const LangOptions &Features, const TargetInfo &Target,
1929  unsigned *StartToken = nullptr,
1930  unsigned *StartTokenByteOffset = nullptr) const;
1931 
1933 
1935  return getTrailingObjects<SourceLocation>();
1936  }
1937 
1939  return getTrailingObjects<SourceLocation>() + getNumConcatenated();
1940  }
1941 
1942  SourceLocation getBeginLoc() const LLVM_READONLY { return *tokloc_begin(); }
1943  SourceLocation getEndLoc() const LLVM_READONLY { return *(tokloc_end() - 1); }
1944 
1945  static bool classof(const Stmt *T) {
1946  return T->getStmtClass() == StringLiteralClass;
1947  }
1948 
1949  // Iterators
1952  }
1955  }
1956 };
1957 
1958 /// [C99 6.4.2.2] - A predefined identifier such as __func__.
1959 class PredefinedExpr final
1960  : public Expr,
1961  private llvm::TrailingObjects<PredefinedExpr, Stmt *> {
1962  friend class ASTStmtReader;
1963  friend TrailingObjects;
1964 
1965  // PredefinedExpr is optionally followed by a single trailing
1966  // "Stmt *" for the predefined identifier. It is present if and only if
1967  // hasFunctionName() is true and is always a "StringLiteral *".
1968 
1969 public:
1970  enum IdentKind {
1973  LFunction, // Same as Function, but as wide string.
1976  LFuncSig, // Same as FuncSig, but as as wide string
1978  /// The same as PrettyFunction, except that the
1979  /// 'virtual' keyword is omitted for virtual member functions.
1981  };
1982 
1983 private:
1985  StringLiteral *SL);
1986 
1987  explicit PredefinedExpr(EmptyShell Empty, bool HasFunctionName);
1988 
1989  /// True if this PredefinedExpr has storage for a function name.
1990  bool hasFunctionName() const { return PredefinedExprBits.HasFunctionName; }
1991 
1992  void setFunctionName(StringLiteral *SL) {
1993  assert(hasFunctionName() &&
1994  "This PredefinedExpr has no storage for a function name!");
1995  *getTrailingObjects<Stmt *>() = SL;
1996  }
1997 
1998 public:
1999  /// Create a PredefinedExpr.
2000  static PredefinedExpr *Create(const ASTContext &Ctx, SourceLocation L,
2001  QualType FNTy, IdentKind IK, StringLiteral *SL);
2002 
2003  /// Create an empty PredefinedExpr.
2004  static PredefinedExpr *CreateEmpty(const ASTContext &Ctx,
2005  bool HasFunctionName);
2006 
2008  return static_cast<IdentKind>(PredefinedExprBits.Kind);
2009  }
2010 
2013 
2015  return hasFunctionName()
2016  ? static_cast<StringLiteral *>(*getTrailingObjects<Stmt *>())
2017  : nullptr;
2018  }
2019 
2021  return hasFunctionName()
2022  ? static_cast<StringLiteral *>(*getTrailingObjects<Stmt *>())
2023  : nullptr;
2024  }
2025 
2026  static StringRef getIdentKindName(IdentKind IK);
2027  StringRef getIdentKindName() const {
2028  return getIdentKindName(getIdentKind());
2029  }
2030 
2031  static std::string ComputeName(IdentKind IK, const Decl *CurrentDecl);
2032 
2034  SourceLocation getEndLoc() const { return getLocation(); }
2035 
2036  static bool classof(const Stmt *T) {
2037  return T->getStmtClass() == PredefinedExprClass;
2038  }
2039 
2040  // Iterators
2042  return child_range(getTrailingObjects<Stmt *>(),
2043  getTrailingObjects<Stmt *>() + hasFunctionName());
2044  }
2045 
2047  return const_child_range(getTrailingObjects<Stmt *>(),
2048  getTrailingObjects<Stmt *>() + hasFunctionName());
2049  }
2050 };
2051 
2052 // This represents a use of the __builtin_sycl_unique_stable_name, which takes a
2053 // type-id, and at CodeGen time emits a unique string representation of the
2054 // type in a way that permits us to properly encode information about the SYCL
2055 // kernels.
2056 class SYCLUniqueStableNameExpr final : public Expr {
2057  friend class ASTStmtReader;
2058  SourceLocation OpLoc, LParen, RParen;
2060 
2061  SYCLUniqueStableNameExpr(EmptyShell Empty, QualType ResultTy);
2063  SourceLocation RParen, QualType ResultTy,
2064  TypeSourceInfo *TSI);
2065 
2066  void setTypeSourceInfo(TypeSourceInfo *Ty) { TypeInfo = Ty; }
2067 
2068  void setLocation(SourceLocation L) { OpLoc = L; }
2069  void setLParenLocation(SourceLocation L) { LParen = L; }
2070  void setRParenLocation(SourceLocation L) { RParen = L; }
2071 
2072 public:
2074 
2075  const TypeSourceInfo *getTypeSourceInfo() const { return TypeInfo; }
2076 
2077  static SYCLUniqueStableNameExpr *
2078  Create(const ASTContext &Ctx, SourceLocation OpLoc, SourceLocation LParen,
2079  SourceLocation RParen, TypeSourceInfo *TSI);
2080 
2081  static SYCLUniqueStableNameExpr *CreateEmpty(const ASTContext &Ctx);
2082 
2084  SourceLocation getEndLoc() const { return RParen; }
2085  SourceLocation getLocation() const { return OpLoc; }
2086  SourceLocation getLParenLocation() const { return LParen; }
2087  SourceLocation getRParenLocation() const { return RParen; }
2088 
2089  static bool classof(const Stmt *T) {
2090  return T->getStmtClass() == SYCLUniqueStableNameExprClass;
2091  }
2092 
2093  // Iterators
2096  }
2097 
2100  }
2101 
2102  // Convenience function to generate the name of the currently stored type.
2103  std::string ComputeName(ASTContext &Context) const;
2104 
2105  // Get the generated name of the type. Note that this only works after all
2106  // kernels have been instantiated.
2107  static std::string ComputeName(ASTContext &Context, QualType Ty);
2108 };
2109 
2110 /// ParenExpr - This represents a parethesized expression, e.g. "(1)". This
2111 /// AST node is only formed if full location information is requested.
2112 class ParenExpr : public Expr {
2113  SourceLocation L, R;
2114  Stmt *Val;
2115 public:
2117  : Expr(ParenExprClass, val->getType(), val->getValueKind(),
2118  val->getObjectKind()),
2119  L(l), R(r), Val(val) {
2121  }
2122 
2123  /// Construct an empty parenthesized expression.
2124  explicit ParenExpr(EmptyShell Empty)
2125  : Expr(ParenExprClass, Empty) { }
2126 
2127  const Expr *getSubExpr() const { return cast<Expr>(Val); }
2128  Expr *getSubExpr() { return cast<Expr>(Val); }
2129  void setSubExpr(Expr *E) { Val = E; }
2130 
2131  SourceLocation getBeginLoc() const LLVM_READONLY { return L; }
2132  SourceLocation getEndLoc() const LLVM_READONLY { return R; }
2133 
2134  /// Get the location of the left parentheses '('.
2135  SourceLocation getLParen() const { return L; }
2136  void setLParen(SourceLocation Loc) { L = Loc; }
2137 
2138  /// Get the location of the right parentheses ')'.
2139  SourceLocation getRParen() const { return R; }
2140  void setRParen(SourceLocation Loc) { R = Loc; }
2141 
2142  static bool classof(const Stmt *T) {
2143  return T->getStmtClass() == ParenExprClass;
2144  }
2145 
2146  // Iterators
2147  child_range children() { return child_range(&Val, &Val+1); }
2149  return const_child_range(&Val, &Val + 1);
2150  }
2151 };
2152 
2153 /// UnaryOperator - This represents the unary-expression's (except sizeof and
2154 /// alignof), the postinc/postdec operators from postfix-expression, and various
2155 /// extensions.
2156 ///
2157 /// Notes on various nodes:
2158 ///
2159 /// Real/Imag - These return the real/imag part of a complex operand. If
2160 /// applied to a non-complex value, the former returns its operand and the
2161 /// later returns zero in the type of the operand.
2162 ///
2163 class UnaryOperator final
2164  : public Expr,
2165  private llvm::TrailingObjects<UnaryOperator, FPOptionsOverride> {
2166  Stmt *Val;
2167 
2168  size_t numTrailingObjects(OverloadToken<FPOptionsOverride>) const {
2169  return UnaryOperatorBits.HasFPFeatures ? 1 : 0;
2170  }
2171 
2172  FPOptionsOverride &getTrailingFPFeatures() {
2173  assert(UnaryOperatorBits.HasFPFeatures);
2174  return *getTrailingObjects<FPOptionsOverride>();
2175  }
2176 
2177  const FPOptionsOverride &getTrailingFPFeatures() const {
2178  assert(UnaryOperatorBits.HasFPFeatures);
2179  return *getTrailingObjects<FPOptionsOverride>();
2180  }
2181 
2182 public:
2184 
2185 protected:
2186  UnaryOperator(const ASTContext &Ctx, Expr *input, Opcode opc, QualType type,
2188  bool CanOverflow, FPOptionsOverride FPFeatures);
2189 
2190  /// Build an empty unary operator.
2191  explicit UnaryOperator(bool HasFPFeatures, EmptyShell Empty)
2192  : Expr(UnaryOperatorClass, Empty) {
2193  UnaryOperatorBits.Opc = UO_AddrOf;
2194  UnaryOperatorBits.HasFPFeatures = HasFPFeatures;
2195  }
2196 
2197 public:
2198  static UnaryOperator *CreateEmpty(const ASTContext &C, bool hasFPFeatures);
2199 
2200  static UnaryOperator *Create(const ASTContext &C, Expr *input, Opcode opc,
2203  bool CanOverflow, FPOptionsOverride FPFeatures);
2204 
2205  Opcode getOpcode() const {
2206  return static_cast<Opcode>(UnaryOperatorBits.Opc);
2207  }
2208  void setOpcode(Opcode Opc) { UnaryOperatorBits.Opc = Opc; }
2209 
2210  Expr *getSubExpr() const { return cast<Expr>(Val); }
2211  void setSubExpr(Expr *E) { Val = E; }
2212 
2213  /// getOperatorLoc - Return the location of the operator.
2216 
2217  /// Returns true if the unary operator can cause an overflow. For instance,
2218  /// signed int i = INT_MAX; i++;
2219  /// signed char c = CHAR_MAX; c++;
2220  /// Due to integer promotions, c++ is promoted to an int before the postfix
2221  /// increment, and the result is an int that cannot overflow. However, i++
2222  /// can overflow.
2223  bool canOverflow() const { return UnaryOperatorBits.CanOverflow; }
2224  void setCanOverflow(bool C) { UnaryOperatorBits.CanOverflow = C; }
2225 
2226  // Get the FP contractability status of this operator. Only meaningful for
2227  // operations on floating point types.
2230  }
2231 
2232  // Get the FENV_ACCESS status of this operator. Only meaningful for
2233  // operations on floating point types.
2234  bool isFEnvAccessOn(const LangOptions &LO) const {
2235  return getFPFeaturesInEffect(LO).getAllowFEnvAccess();
2236  }
2237 
2238  /// isPostfix - Return true if this is a postfix operation, like x++.
2239  static bool isPostfix(Opcode Op) {
2240  return Op == UO_PostInc || Op == UO_PostDec;
2241  }
2242 
2243  /// isPrefix - Return true if this is a prefix operation, like --x.
2244  static bool isPrefix(Opcode Op) {
2245  return Op == UO_PreInc || Op == UO_PreDec;
2246  }
2247 
2248  bool isPrefix() const { return isPrefix(getOpcode()); }
2249  bool isPostfix() const { return isPostfix(getOpcode()); }
2250 
2251  static bool isIncrementOp(Opcode Op) {
2252  return Op == UO_PreInc || Op == UO_PostInc;
2253  }
2254  bool isIncrementOp() const {
2255  return isIncrementOp(getOpcode());
2256  }
2257 
2258  static bool isDecrementOp(Opcode Op) {
2259  return Op == UO_PreDec || Op == UO_PostDec;
2260  }
2261  bool isDecrementOp() const {
2262  return isDecrementOp(getOpcode());
2263  }
2264 
2265  static bool isIncrementDecrementOp(Opcode Op) { return Op <= UO_PreDec; }
2266  bool isIncrementDecrementOp() const {
2268  }
2269 
2270  static bool isArithmeticOp(Opcode Op) {
2271  return Op >= UO_Plus && Op <= UO_LNot;
2272  }
2273  bool isArithmeticOp() const { return isArithmeticOp(getOpcode()); }
2274 
2275  /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
2276  /// corresponds to, e.g. "sizeof" or "[pre]++"
2277  static StringRef getOpcodeStr(Opcode Op);
2278 
2279  /// Retrieve the unary opcode that corresponds to the given
2280  /// overloaded operator.
2281  static Opcode getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix);
2282 
2283  /// Retrieve the overloaded operator kind that corresponds to
2284  /// the given unary opcode.
2286 
2287  SourceLocation getBeginLoc() const LLVM_READONLY {
2288  return isPostfix() ? Val->getBeginLoc() : getOperatorLoc();
2289  }
2290  SourceLocation getEndLoc() const LLVM_READONLY {
2291  return isPostfix() ? getOperatorLoc() : Val->getEndLoc();
2292  }
2294 
2295  static bool classof(const Stmt *T) {
2296  return T->getStmtClass() == UnaryOperatorClass;
2297  }
2298 
2299  // Iterators
2300  child_range children() { return child_range(&Val, &Val+1); }
2302  return const_child_range(&Val, &Val + 1);
2303  }
2304 
2305  /// Is FPFeatures in Trailing Storage?
2306  bool hasStoredFPFeatures() const { return UnaryOperatorBits.HasFPFeatures; }
2307 
2308  /// Get FPFeatures from trailing storage.
2310  return getTrailingFPFeatures();
2311  }
2312 
2313 protected:
2314  /// Set FPFeatures in trailing storage, used only by Serialization
2315  void setStoredFPFeatures(FPOptionsOverride F) { getTrailingFPFeatures() = F; }
2316 
2317 public:
2318  // Get the FP features status of this operator. Only meaningful for
2319  // operations on floating point types.
2321  if (UnaryOperatorBits.HasFPFeatures)
2322  return getStoredFPFeatures().applyOverrides(LO);
2324  }
2326  if (UnaryOperatorBits.HasFPFeatures)
2327  return getStoredFPFeatures();
2328  return FPOptionsOverride();
2329  }
2330 
2332  friend class ASTReader;
2333  friend class ASTStmtReader;
2334  friend class ASTStmtWriter;
2335 };
2336 
2337 /// Helper class for OffsetOfExpr.
2338 
2339 // __builtin_offsetof(type, identifier(.identifier|[expr])*)
2341 public:
2342  /// The kind of offsetof node we have.
2343  enum Kind {
2344  /// An index into an array.
2345  Array = 0x00,
2346  /// A field.
2347  Field = 0x01,
2348  /// A field in a dependent type, known only by its name.
2349  Identifier = 0x02,
2350  /// An implicit indirection through a C++ base class, when the
2351  /// field found is in a base class.
2352  Base = 0x03
2353  };
2354 
2355 private:
2356  enum { MaskBits = 2, Mask = 0x03 };
2357 
2358  /// The source range that covers this part of the designator.
2359  SourceRange Range;
2360 
2361  /// The data describing the designator, which comes in three
2362  /// different forms, depending on the lower two bits.
2363  /// - An unsigned index into the array of Expr*'s stored after this node
2364  /// in memory, for [constant-expression] designators.
2365  /// - A FieldDecl*, for references to a known field.
2366  /// - An IdentifierInfo*, for references to a field with a given name
2367  /// when the class type is dependent.
2368  /// - A CXXBaseSpecifier*, for references that look at a field in a
2369  /// base class.
2370  uintptr_t Data;
2371 
2372 public:
2373  /// Create an offsetof node that refers to an array element.
2374  OffsetOfNode(SourceLocation LBracketLoc, unsigned Index,
2375  SourceLocation RBracketLoc)
2376  : Range(LBracketLoc, RBracketLoc), Data((Index << 2) | Array) {}
2377 
2378  /// Create an offsetof node that refers to a field.
2380  : Range(DotLoc.isValid() ? DotLoc : NameLoc, NameLoc),
2381  Data(reinterpret_cast<uintptr_t>(Field) | OffsetOfNode::Field) {}
2382 
2383  /// Create an offsetof node that refers to an identifier.
2385  SourceLocation NameLoc)
2386  : Range(DotLoc.isValid() ? DotLoc : NameLoc, NameLoc),
2387  Data(reinterpret_cast<uintptr_t>(Name) | Identifier) {}
2388 
2389  /// Create an offsetof node that refers into a C++ base class.
2391  : Data(reinterpret_cast<uintptr_t>(Base) | OffsetOfNode::Base) {}
2392 
2393  /// Determine what kind of offsetof node this is.
2394  Kind getKind() const { return static_cast<Kind>(Data & Mask); }
2395 
2396  /// For an array element node, returns the index into the array
2397  /// of expressions.
2398  unsigned getArrayExprIndex() const {
2399  assert(getKind() == Array);
2400  return Data >> 2;
2401  }
2402 
2403  /// For a field offsetof node, returns the field.
2404  FieldDecl *getField() const {
2405  assert(getKind() == Field);
2406  return reinterpret_cast<FieldDecl *>(Data & ~(uintptr_t)Mask);
2407  }
2408 
2409  /// For a field or identifier offsetof node, returns the name of
2410  /// the field.
2411  IdentifierInfo *getFieldName() const;
2412 
2413  /// For a base class node, returns the base specifier.
2415  assert(getKind() == Base);
2416  return reinterpret_cast<CXXBaseSpecifier *>(Data & ~(uintptr_t)Mask);
2417  }
2418 
2419  /// Retrieve the source range that covers this offsetof node.
2420  ///
2421  /// For an array element node, the source range contains the locations of
2422  /// the square brackets. For a field or identifier node, the source range
2423  /// contains the location of the period (if there is one) and the
2424  /// identifier.
2425  SourceRange getSourceRange() const LLVM_READONLY { return Range; }
2426  SourceLocation getBeginLoc() const LLVM_READONLY { return Range.getBegin(); }
2427  SourceLocation getEndLoc() const LLVM_READONLY { return Range.getEnd(); }
2428 };
2429 
2430 /// OffsetOfExpr - [C99 7.17] - This represents an expression of the form
2431 /// offsetof(record-type, member-designator). For example, given:
2432 /// @code
2433 /// struct S {
2434 /// float f;
2435 /// double d;
2436 /// };
2437 /// struct T {
2438 /// int i;
2439 /// struct S s[10];
2440 /// };
2441 /// @endcode
2442 /// we can represent and evaluate the expression @c offsetof(struct T, s[2].d).
2443 
2444 class OffsetOfExpr final
2445  : public Expr,
2446  private llvm::TrailingObjects<OffsetOfExpr, OffsetOfNode, Expr *> {
2447  SourceLocation OperatorLoc, RParenLoc;
2448  // Base type;
2449  TypeSourceInfo *TSInfo;
2450  // Number of sub-components (i.e. instances of OffsetOfNode).
2451  unsigned NumComps;
2452  // Number of sub-expressions (i.e. array subscript expressions).
2453  unsigned NumExprs;
2454 
2455  size_t numTrailingObjects(OverloadToken<OffsetOfNode>) const {
2456  return NumComps;
2457  }
2458 
2460  SourceLocation OperatorLoc, TypeSourceInfo *tsi,
2462  SourceLocation RParenLoc);
2463 
2464  explicit OffsetOfExpr(unsigned numComps, unsigned numExprs)
2465  : Expr(OffsetOfExprClass, EmptyShell()),
2466  TSInfo(nullptr), NumComps(numComps), NumExprs(numExprs) {}
2467 
2468 public:
2469 
2470  static OffsetOfExpr *Create(const ASTContext &C, QualType type,
2471  SourceLocation OperatorLoc, TypeSourceInfo *tsi,
2472  ArrayRef<OffsetOfNode> comps,
2473  ArrayRef<Expr*> exprs, SourceLocation RParenLoc);
2474 
2475  static OffsetOfExpr *CreateEmpty(const ASTContext &C,
2476  unsigned NumComps, unsigned NumExprs);
2477 
2478  /// getOperatorLoc - Return the location of the operator.
2479  SourceLocation getOperatorLoc() const { return OperatorLoc; }
2480  void setOperatorLoc(SourceLocation L) { OperatorLoc = L; }
2481 
2482  /// Return the location of the right parentheses.
2483  SourceLocation getRParenLoc() const { return RParenLoc; }
2484  void setRParenLoc(SourceLocation R) { RParenLoc = R; }
2485 
2487  return TSInfo;
2488  }
2490  TSInfo = tsi;
2491  }
2492 
2493  const OffsetOfNode &getComponent(unsigned Idx) const {
2494  assert(Idx < NumComps && "Subscript out of range");
2495  return getTrailingObjects<OffsetOfNode>()[Idx];
2496  }
2497 
2498  void setComponent(unsigned Idx, OffsetOfNode ON) {
2499  assert(Idx < NumComps && "Subscript out of range");
2500  getTrailingObjects<OffsetOfNode>()[Idx] = ON;
2501  }
2502 
2503  unsigned getNumComponents() const {
2504  return NumComps;
2505  }
2506 
2507  Expr* getIndexExpr(unsigned Idx) {
2508  assert(Idx < NumExprs && "Subscript out of range");
2509  return getTrailingObjects<Expr *>()[Idx];
2510  }
2511 
2512  const Expr *getIndexExpr(unsigned Idx) const {
2513  assert(Idx < NumExprs && "Subscript out of range");
2514  return getTrailingObjects<Expr *>()[Idx];
2515  }
2516 
2517  void setIndexExpr(unsigned Idx, Expr* E) {
2518  assert(Idx < NumComps && "Subscript out of range");
2519  getTrailingObjects<Expr *>()[Idx] = E;
2520  }
2521 
2522  unsigned getNumExpressions() const {
2523  return NumExprs;
2524  }
2525 
2526  SourceLocation getBeginLoc() const LLVM_READONLY { return OperatorLoc; }
2527  SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
2528 
2529  static bool classof(const Stmt *T) {
2530  return T->getStmtClass() == OffsetOfExprClass;
2531  }
2532 
2533  // Iterators
2535  Stmt **begin = reinterpret_cast<Stmt **>(getTrailingObjects<Expr *>());
2536  return child_range(begin, begin + NumExprs);
2537  }
2539  Stmt *const *begin =
2540  reinterpret_cast<Stmt *const *>(getTrailingObjects<Expr *>());
2541  return const_child_range(begin, begin + NumExprs);
2542  }
2544 };
2545 
2546 /// UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated)
2547 /// expression operand. Used for sizeof/alignof (C99 6.5.3.4) and
2548 /// vec_step (OpenCL 1.1 6.11.12).
2550  union {
2553  } Argument;
2554  SourceLocation OpLoc, RParenLoc;
2555 
2556 public:
2558  QualType resultType, SourceLocation op,
2559  SourceLocation rp)
2560  : Expr(UnaryExprOrTypeTraitExprClass, resultType, VK_PRValue,
2561  OK_Ordinary),
2562  OpLoc(op), RParenLoc(rp) {
2563  assert(ExprKind <= UETT_Last && "invalid enum value!");
2564  UnaryExprOrTypeTraitExprBits.Kind = ExprKind;
2565  assert(static_cast<unsigned>(ExprKind) ==
2567  "UnaryExprOrTypeTraitExprBits.Kind overflow!");
2568  UnaryExprOrTypeTraitExprBits.IsType = true;
2569  Argument.Ty = TInfo;
2571  }
2572 
2574  QualType resultType, SourceLocation op,
2575  SourceLocation rp);
2576 
2577  /// Construct an empty sizeof/alignof expression.
2579  : Expr(UnaryExprOrTypeTraitExprClass, Empty) { }
2580 
2582  return static_cast<UnaryExprOrTypeTrait>(UnaryExprOrTypeTraitExprBits.Kind);
2583  }
2585  assert(K <= UETT_Last && "invalid enum value!");
2587  assert(static_cast<unsigned>(K) == UnaryExprOrTypeTraitExprBits.Kind &&
2588  "UnaryExprOrTypeTraitExprBits.Kind overflow!");
2589  }
2590 
2591  bool isArgumentType() const { return UnaryExprOrTypeTraitExprBits.IsType; }
2593  return getArgumentTypeInfo()->getType();
2594  }
2596  assert(isArgumentType() && "calling getArgumentType() when arg is expr");
2597  return Argument.Ty;
2598  }
2600  assert(!isArgumentType() && "calling getArgumentExpr() when arg is type");
2601  return static_cast<Expr*>(Argument.Ex);
2602  }
2603  const Expr *getArgumentExpr() const {
2604  return const_cast<UnaryExprOrTypeTraitExpr*>(this)->getArgumentExpr();
2605  }
2606 
2607  void setArgument(Expr *E) {
2608  Argument.Ex = E;
2609  UnaryExprOrTypeTraitExprBits.IsType = false;
2610  }
2612  Argument.Ty = TInfo;
2613  UnaryExprOrTypeTraitExprBits.IsType = true;
2614  }
2615 
2616  /// Gets the argument type, or the type of the argument expression, whichever
2617  /// is appropriate.
2620  }
2621 
2622  SourceLocation getOperatorLoc() const { return OpLoc; }
2623  void setOperatorLoc(SourceLocation L) { OpLoc = L; }
2624 
2625  SourceLocation getRParenLoc() const { return RParenLoc; }
2626  void setRParenLoc(SourceLocation L) { RParenLoc = L; }
2627 
2628  SourceLocation getBeginLoc() const LLVM_READONLY { return OpLoc; }
2629  SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
2630 
2631  static bool classof(const Stmt *T) {
2632  return T->getStmtClass() == UnaryExprOrTypeTraitExprClass;
2633  }
2634 
2635  // Iterators
2637  const_child_range children() const;
2638 };
2639 
2640 //===----------------------------------------------------------------------===//
2641 // Postfix Operators.
2642 //===----------------------------------------------------------------------===//
2643 
2644 /// ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
2645 class ArraySubscriptExpr : public Expr {
2646  enum { LHS, RHS, END_EXPR };
2647  Stmt *SubExprs[END_EXPR];
2648 
2649  bool lhsIsBase() const { return getRHS()->getType()->isIntegerType(); }
2650 
2651 public:
2653  ExprObjectKind OK, SourceLocation rbracketloc)
2654  : Expr(ArraySubscriptExprClass, t, VK, OK) {
2655  SubExprs[LHS] = lhs;
2656  SubExprs[RHS] = rhs;
2657  ArrayOrMatrixSubscriptExprBits.RBracketLoc = rbracketloc;
2659  }
2660 
2661  /// Create an empty array subscript expression.
2663  : Expr(ArraySubscriptExprClass, Shell) { }
2664 
2665  /// An array access can be written A[4] or 4[A] (both are equivalent).
2666  /// - getBase() and getIdx() always present the normalized view: A[4].
2667  /// In this case getBase() returns "A" and getIdx() returns "4".
2668  /// - getLHS() and getRHS() present the syntactic view. e.g. for
2669  /// 4[A] getLHS() returns "4".
2670  /// Note: Because vector element access is also written A[4] we must
2671  /// predicate the format conversion in getBase and getIdx only on the
2672  /// the type of the RHS, as it is possible for the LHS to be a vector of
2673  /// integer type
2674  Expr *getLHS() { return cast<Expr>(SubExprs[LHS]); }
2675  const Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
2676  void setLHS(Expr *E) { SubExprs[LHS] = E; }
2677 
2678  Expr *getRHS() { return cast<Expr>(SubExprs[RHS]); }
2679  const Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
2680  void setRHS(Expr *E) { SubExprs[RHS] = E; }
2681 
2682  Expr *getBase() { return lhsIsBase() ? getLHS() : getRHS(); }
2683  const Expr *getBase() const { return lhsIsBase() ? getLHS() : getRHS(); }
2684 
2685  Expr *getIdx() { return lhsIsBase() ? getRHS() : getLHS(); }
2686  const Expr *getIdx() const { return lhsIsBase() ? getRHS() : getLHS(); }
2687 
2688  SourceLocation getBeginLoc() const LLVM_READONLY {
2689  return getLHS()->getBeginLoc();
2690  }
2692 
2694  return ArrayOrMatrixSubscriptExprBits.RBracketLoc;
2695  }
2697  ArrayOrMatrixSubscriptExprBits.RBracketLoc = L;
2698  }
2699 
2700  SourceLocation getExprLoc() const LLVM_READONLY {
2701  return getBase()->getExprLoc();
2702  }
2703 
2704  static bool classof(const Stmt *T) {
2705  return T->getStmtClass() == ArraySubscriptExprClass;
2706  }
2707 
2708  // Iterators
2710  return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
2711  }
2713  return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
2714  }
2715 };
2716 
2717 /// MatrixSubscriptExpr - Matrix subscript expression for the MatrixType
2718 /// extension.
2719 /// MatrixSubscriptExpr can be either incomplete (only Base and RowIdx are set
2720 /// so far, the type is IncompleteMatrixIdx) or complete (Base, RowIdx and
2721 /// ColumnIdx refer to valid expressions). Incomplete matrix expressions only
2722 /// exist during the initial construction of the AST.
2723 class MatrixSubscriptExpr : public Expr {
2724  enum { BASE, ROW_IDX, COLUMN_IDX, END_EXPR };
2725  Stmt *SubExprs[END_EXPR];
2726 
2727 public:
2728  MatrixSubscriptExpr(Expr *Base, Expr *RowIdx, Expr *ColumnIdx, QualType T,
2729  SourceLocation RBracketLoc)
2730  : Expr(MatrixSubscriptExprClass, T, Base->getValueKind(),
2732  SubExprs[BASE] = Base;
2733  SubExprs[ROW_IDX] = RowIdx;
2734  SubExprs[COLUMN_IDX] = ColumnIdx;
2735  ArrayOrMatrixSubscriptExprBits.RBracketLoc = RBracketLoc;
2737  }
2738 
2739  /// Create an empty matrix subscript expression.
2741  : Expr(MatrixSubscriptExprClass, Shell) {}
2742 
2743  bool isIncomplete() const {
2744  bool IsIncomplete = hasPlaceholderType(BuiltinType::IncompleteMatrixIdx);
2745  assert((SubExprs[COLUMN_IDX] || IsIncomplete) &&
2746  "expressions without column index must be marked as incomplete");
2747  return IsIncomplete;
2748  }
2749  Expr *getBase() { return cast<Expr>(SubExprs[BASE]); }
2750  const Expr *getBase() const { return cast<Expr>(SubExprs[BASE]); }
2751  void setBase(Expr *E) { SubExprs[BASE] = E; }
2752 
2753  Expr *getRowIdx() { return cast<Expr>(SubExprs[ROW_IDX]); }
2754  const Expr *getRowIdx() const { return cast<Expr>(SubExprs[ROW_IDX]); }
2755  void setRowIdx(Expr *E) { SubExprs[ROW_IDX] = E; }
2756 
2757  Expr *getColumnIdx() { return cast_or_null<Expr>(SubExprs[COLUMN_IDX]); }
2758  const Expr *getColumnIdx() const {
2759  assert(!isIncomplete() &&
2760  "cannot get the column index of an incomplete expression");
2761  return cast<Expr>(SubExprs[COLUMN_IDX]);
2762  }
2763  void setColumnIdx(Expr *E) { SubExprs[COLUMN_IDX] = E; }
2764 
2765  SourceLocation getBeginLoc() const LLVM_READONLY {
2766  return getBase()->getBeginLoc();
2767  }
2768 
2770 
2771  SourceLocation getExprLoc() const LLVM_READONLY {
2772  return getBase()->getExprLoc();
2773  }
2774 
2776  return ArrayOrMatrixSubscriptExprBits.RBracketLoc;
2777  }
2779  ArrayOrMatrixSubscriptExprBits.RBracketLoc = L;
2780  }
2781 
2782  static bool classof(const Stmt *T) {
2783  return T->getStmtClass() == MatrixSubscriptExprClass;
2784  }
2785 
2786  // Iterators
2788  return child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
2789  }
2791  return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
2792  }
2793 };
2794 
2795 /// CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
2796 /// CallExpr itself represents a normal function call, e.g., "f(x, 2)",
2797 /// while its subclasses may represent alternative syntax that (semantically)
2798 /// results in a function call. For example, CXXOperatorCallExpr is
2799 /// a subclass for overloaded operator calls that use operator syntax, e.g.,
2800 /// "str1 + str2" to resolve to a function call.
2801 class CallExpr : public Expr {
2802  enum { FN = 0, PREARGS_START = 1 };
2803 
2804  /// The number of arguments in the call expression.
2805  unsigned NumArgs;
2806 
2807  /// The location of the right parenthese. This has a different meaning for
2808  /// the derived classes of CallExpr.
2809  SourceLocation RParenLoc;
2810 
2811  // CallExpr store some data in trailing objects. However since CallExpr
2812  // is used a base of other expression classes we cannot use
2813  // llvm::TrailingObjects. Instead we manually perform the pointer arithmetic
2814  // and casts.
2815  //
2816  // The trailing objects are in order:
2817  //
2818  // * A single "Stmt *" for the callee expression.
2819  //
2820  // * An array of getNumPreArgs() "Stmt *" for the pre-argument expressions.
2821  //
2822  // * An array of getNumArgs() "Stmt *" for the argument expressions.
2823  //
2824  // * An optional of type FPOptionsOverride.
2825  //
2826  // Note that we store the offset in bytes from the this pointer to the start
2827  // of the trailing objects. It would be perfectly possible to compute it
2828  // based on the dynamic kind of the CallExpr. However 1.) we have plenty of
2829  // space in the bit-fields of Stmt. 2.) It was benchmarked to be faster to
2830  // compute this once and then load the offset from the bit-fields of Stmt,
2831  // instead of re-computing the offset each time the trailing objects are
2832  // accessed.
2833 
2834  /// Return a pointer to the start of the trailing array of "Stmt *".
2835  Stmt **getTrailingStmts() {
2836  return reinterpret_cast<Stmt **>(reinterpret_cast<char *>(this) +
2837  CallExprBits.OffsetToTrailingObjects);
2838  }
2839  Stmt *const *getTrailingStmts() const {
2840  return const_cast<CallExpr *>(this)->getTrailingStmts();
2841  }
2842 
2843  /// Map a statement class to the appropriate offset in bytes from the
2844  /// this pointer to the trailing objects.
2845  static unsigned offsetToTrailingObjects(StmtClass SC);
2846 
2847  unsigned getSizeOfTrailingStmts() const {
2848  return (1 + getNumPreArgs() + getNumArgs()) * sizeof(Stmt *);
2849  }
2850 
2851  size_t getOffsetOfTrailingFPFeatures() const {
2852  assert(hasStoredFPFeatures());
2853  return CallExprBits.OffsetToTrailingObjects + getSizeOfTrailingStmts();
2854  }
2855 
2856 public:
2857  enum class ADLCallKind : bool { NotADL, UsesADL };
2860 
2861 protected:
2862  /// Build a call expression, assuming that appropriate storage has been
2863  /// allocated for the trailing objects.
2864  CallExpr(StmtClass SC, Expr *Fn, ArrayRef<Expr *> PreArgs,
2866  SourceLocation RParenLoc, FPOptionsOverride FPFeatures,
2867  unsigned MinNumArgs, ADLCallKind UsesADL);
2868 
2869  /// Build an empty call expression, for deserialization.
2870  CallExpr(StmtClass SC, unsigned NumPreArgs, unsigned NumArgs,
2871  bool hasFPFeatures, EmptyShell Empty);
2872 
2873  /// Return the size in bytes needed for the trailing objects.
2874  /// Used by the derived classes to allocate the right amount of storage.
2875  static unsigned sizeOfTrailingObjects(unsigned NumPreArgs, unsigned NumArgs,
2876  bool HasFPFeatures) {
2877  return (1 + NumPreArgs + NumArgs) * sizeof(Stmt *) +
2878  HasFPFeatures * sizeof(FPOptionsOverride);
2879  }
2880 
2881  Stmt *getPreArg(unsigned I) {
2882  assert(I < getNumPreArgs() && "Prearg access out of range!");
2883  return getTrailingStmts()[PREARGS_START + I];
2884  }
2885  const Stmt *getPreArg(unsigned I) const {
2886  assert(I < getNumPreArgs() && "Prearg access out of range!");
2887  return getTrailingStmts()[PREARGS_START + I];
2888  }
2889  void setPreArg(unsigned I, Stmt *PreArg) {
2890  assert(I < getNumPreArgs() && "Prearg access out of range!");
2891  getTrailingStmts()[PREARGS_START + I] = PreArg;
2892  }
2893 
2894  unsigned getNumPreArgs() const { return CallExprBits.NumPreArgs; }
2895 
2896  /// Return a pointer to the trailing FPOptions
2898  assert(hasStoredFPFeatures());
2899  return reinterpret_cast<FPOptionsOverride *>(
2900  reinterpret_cast<char *>(this) + CallExprBits.OffsetToTrailingObjects +
2901  getSizeOfTrailingStmts());
2902  }
2904  assert(hasStoredFPFeatures());
2905  return reinterpret_cast<const FPOptionsOverride *>(
2906  reinterpret_cast<const char *>(this) +
2907  CallExprBits.OffsetToTrailingObjects + getSizeOfTrailingStmts());
2908  }
2909 
2910 public:
2911  /// Create a call expression.
2912  /// \param Fn The callee expression,
2913  /// \param Args The argument array,
2914  /// \param Ty The type of the call expression (which is *not* the return
2915  /// type in general),
2916  /// \param VK The value kind of the call expression (lvalue, rvalue, ...),
2917  /// \param RParenLoc The location of the right parenthesis in the call
2918  /// expression.
2919  /// \param FPFeatures Floating-point features associated with the call,
2920  /// \param MinNumArgs Specifies the minimum number of arguments. The actual
2921  /// number of arguments will be the greater of Args.size()
2922  /// and MinNumArgs. This is used in a few places to allocate
2923  /// enough storage for the default arguments.
2924  /// \param UsesADL Specifies whether the callee was found through
2925  /// argument-dependent lookup.
2926  ///
2927  /// Note that you can use CreateTemporary if you need a temporary call
2928  /// expression on the stack.
2929  static CallExpr *Create(const ASTContext &Ctx, Expr *Fn,
2931  SourceLocation RParenLoc,
2932  FPOptionsOverride FPFeatures, unsigned MinNumArgs = 0,
2934 
2935  /// Create a temporary call expression with no arguments in the memory
2936  /// pointed to by Mem. Mem must points to at least sizeof(CallExpr)
2937  /// + sizeof(Stmt *) bytes of storage, aligned to alignof(CallExpr):
2938  ///
2939  /// \code{.cpp}
2940  /// alignas(CallExpr) char Buffer[sizeof(CallExpr) + sizeof(Stmt *)];
2941  /// CallExpr *TheCall = CallExpr::CreateTemporary(Buffer, etc);
2942  /// \endcode
2943  static CallExpr *CreateTemporary(void *Mem, Expr *Fn, QualType Ty,
2944  ExprValueKind VK, SourceLocation RParenLoc,
2946 
2947  /// Create an empty call expression, for deserialization.
2948  static CallExpr *CreateEmpty(const ASTContext &Ctx, unsigned NumArgs,
2949  bool HasFPFeatures, EmptyShell Empty);
2950 
2951  Expr *getCallee() { return cast<Expr>(getTrailingStmts()[FN]); }
2952  const Expr *getCallee() const { return cast<Expr>(getTrailingStmts()[FN]); }
2953  void setCallee(Expr *F) { getTrailingStmts()[FN] = F; }
2954 
2956  return static_cast<ADLCallKind>(CallExprBits.UsesADL);
2957  }
2959  CallExprBits.UsesADL = static_cast<bool>(V);
2960  }
2961  bool usesADL() const { return getADLCallKind() == UsesADL; }
2962 
2963  bool hasStoredFPFeatures() const { return CallExprBits.HasFPFeatures; }
2964 
2966  const Decl *getCalleeDecl() const {
2968  }
2969 
2970  /// If the callee is a FunctionDecl, return it. Otherwise return null.
2972  return dyn_cast_or_null<FunctionDecl>(getCalleeDecl());
2973  }
2975  return dyn_cast_or_null<FunctionDecl>(getCalleeDecl());
2976  }
2977 
2978  /// getNumArgs - Return the number of actual arguments to this call.
2979  unsigned getNumArgs() const { return NumArgs; }
2980 
2981  /// Retrieve the call arguments.
2983  return reinterpret_cast<Expr **>(getTrailingStmts() + PREARGS_START +
2984  getNumPreArgs());
2985  }
2986  const Expr *const *getArgs() const {
2987  return reinterpret_cast<const Expr *const *>(
2988  getTrailingStmts() + PREARGS_START + getNumPreArgs());
2989  }
2990 
2991  /// getArg - Return the specified argument.
2992  Expr *getArg(unsigned Arg) {
2993  assert(Arg < getNumArgs() && "Arg access out of range!");
2994  return getArgs()[Arg];
2995  }
2996  const Expr *getArg(unsigned Arg) const {
2997  assert(Arg < getNumArgs() && "Arg access out of range!");
2998  return getArgs()[Arg];
2999  }
3000 
3001  /// setArg - Set the specified argument.
3002  /// ! the dependence bits might be stale after calling this setter, it is
3003  /// *caller*'s responsibility to recompute them by calling
3004  /// computeDependence().
3005  void setArg(unsigned Arg, Expr *ArgExpr) {
3006  assert(Arg < getNumArgs() && "Arg access out of range!");
3007  getArgs()[Arg] = ArgExpr;
3008  }
3009 
3010  /// Compute and set dependence bits.
3013  this, llvm::makeArrayRef(
3014  reinterpret_cast<Expr **>(getTrailingStmts() + PREARGS_START),
3015  getNumPreArgs())));
3016  }
3017 
3018  /// Reduce the number of arguments in this call expression. This is used for
3019  /// example during error recovery to drop extra arguments. There is no way
3020  /// to perform the opposite because: 1.) We don't track how much storage
3021  /// we have for the argument array 2.) This would potentially require growing
3022  /// the argument array, something we cannot support since the arguments are
3023  /// stored in a trailing array.
3024  void shrinkNumArgs(unsigned NewNumArgs) {
3025  assert((NewNumArgs <= getNumArgs()) &&
3026  "shrinkNumArgs cannot increase the number of arguments!");
3027  NumArgs = NewNumArgs;
3028  }
3029 
3030  /// Bluntly set a new number of arguments without doing any checks whatsoever.
3031  /// Only used during construction of a CallExpr in a few places in Sema.
3032  /// FIXME: Find a way to remove it.
3033  void setNumArgsUnsafe(unsigned NewNumArgs) { NumArgs = NewNumArgs; }
3034 
3037  typedef llvm::iterator_range<arg_iterator> arg_range;
3038  typedef llvm::iterator_range<const_arg_iterator> const_arg_range;
3039 
3042  return const_arg_range(arg_begin(), arg_end());
3043  }
3044 
3046  return getTrailingStmts() + PREARGS_START + getNumPreArgs();
3047  }
3049 
3051  return getTrailingStmts() + PREARGS_START + getNumPreArgs();
3052  }
3054 
3055  /// This method provides fast access to all the subexpressions of
3056  /// a CallExpr without going through the slower virtual child_iterator
3057  /// interface. This provides efficient reverse iteration of the
3058  /// subexpressions. This is currently used for CFG construction.
3060  return llvm::makeArrayRef(getTrailingStmts(),
3061  PREARGS_START + getNumPreArgs() + getNumArgs());
3062  }
3063 
3064  /// getNumCommas - Return the number of commas that must have been present in
3065  /// this function call.
3066  unsigned getNumCommas() const { return getNumArgs() ? getNumArgs() - 1 : 0; }
3067 
3068  /// Get FPOptionsOverride from trailing storage.
3070  assert(hasStoredFPFeatures());
3071  return *getTrailingFPFeatures();
3072  }
3073  /// Set FPOptionsOverride in trailing storage. Used only by Serialization.
3075  assert(hasStoredFPFeatures());
3076  *getTrailingFPFeatures() = F;
3077  }
3078 
3079  // Get the FP features status of this operator. Only meaningful for
3080  // operations on floating point types.
3082  if (hasStoredFPFeatures())
3083  return getStoredFPFeatures().applyOverrides(LO);
3085  }
3086 
3088  if (hasStoredFPFeatures())
3089  return getStoredFPFeatures();
3090  return FPOptionsOverride();
3091  }
3092 
3093  /// getBuiltinCallee - If this is a call to a builtin, return the builtin ID
3094  /// of the callee. If not, return 0.
3095  unsigned getBuiltinCallee() const;
3096 
3097  /// Returns \c true if this is a call to a builtin which does not
3098  /// evaluate side-effects within its arguments.
3099  bool isUnevaluatedBuiltinCall(const ASTContext &Ctx) const;
3100 
3101  /// getCallReturnType - Get the return type of the call expr. This is not
3102  /// always the type of the expr itself, if the return type is a reference
3103  /// type.
3104  QualType getCallReturnType(const ASTContext &Ctx) const;
3105 
3106  /// Returns the WarnUnusedResultAttr that is either declared on the called
3107  /// function, or its return type declaration.
3108  const Attr *getUnusedResultAttr(const ASTContext &Ctx) const;
3109 
3110  /// Returns true if this call expression should warn on unused results.
3111  bool hasUnusedResultAttr(const ASTContext &Ctx) const {
3112  return getUnusedResultAttr(Ctx) != nullptr;
3113  }
3114 
3115  SourceLocation getRParenLoc() const { return RParenLoc; }
3116  void setRParenLoc(SourceLocation L) { RParenLoc = L; }
3117 
3118  SourceLocation getBeginLoc() const LLVM_READONLY;
3119  SourceLocation getEndLoc() const LLVM_READONLY;
3120 
3121  /// Return true if this is a call to __assume() or __builtin_assume() with
3122  /// a non-value-dependent constant parameter evaluating as false.
3123  bool isBuiltinAssumeFalse(const ASTContext &Ctx) const;
3124 
3125  /// Used by Sema to implement MSVC-compatible delayed name lookup.
3126  /// (Usually Exprs themselves should set dependence).
3128  setDependence(getDependence() | ExprDependence::TypeValueInstantiation);
3129  }
3130 
3131  bool isCallToStdMove() const {
3132  const FunctionDecl *FD = getDirectCallee();
3133  return getNumArgs() == 1 && FD && FD->isInStdNamespace() &&
3134  FD->getIdentifier() && FD->getIdentifier()->isStr("move");
3135  }
3136 
3137  static bool classof(const Stmt *T) {
3138  return T->getStmtClass() >= firstCallExprConstant &&
3139  T->getStmtClass() <= lastCallExprConstant;
3140  }
3141 
3142  // Iterators
3144  return child_range(getTrailingStmts(), getTrailingStmts() + PREARGS_START +
3145  getNumPreArgs() + getNumArgs());
3146  }
3147 
3149  return const_child_range(getTrailingStmts(),
3150  getTrailingStmts() + PREARGS_START +
3151  getNumPreArgs() + getNumArgs());
3152  }
3153 };
3154 
3155 /// Extra data stored in some MemberExpr objects.
3157  /// The nested-name-specifier that qualifies the name, including
3158  /// source-location information.
3160 
3161  /// The DeclAccessPair through which the MemberDecl was found due to
3162  /// name qualifiers.
3164 };
3165 
3166 /// MemberExpr - [C99 6.5.2.3] Structure and Union Members. X->F and X.F.
3167 ///
3168 class MemberExpr final
3169  : public Expr,
3170  private llvm::TrailingObjects<MemberExpr, MemberExprNameQualifier,
3171  ASTTemplateKWAndArgsInfo,
3172  TemplateArgumentLoc> {
3173  friend class ASTReader;
3174  friend class ASTStmtReader;
3175  friend class ASTStmtWriter;
3176  friend TrailingObjects;
3177 
3178  /// Base - the expression for the base pointer or structure references. In
3179  /// X.F, this is "X".
3180  Stmt *Base;
3181 
3182  /// MemberDecl - This is the decl being referenced by the field/member name.
3183  /// In X.F, this is the decl referenced by F.
3184  ValueDecl *MemberDecl;
3185 
3186  /// MemberDNLoc - Provides source/type location info for the
3187  /// declaration name embedded in MemberDecl.
3188  DeclarationNameLoc MemberDNLoc;
3189 
3190  /// MemberLoc - This is the location of the member name.
3191  SourceLocation MemberLoc;
3192 
3193  size_t numTrailingObjects(OverloadToken<MemberExprNameQualifier>) const {
3194  return hasQualifierOrFoundDecl();
3195  }
3196 
3197  size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
3198  return hasTemplateKWAndArgsInfo();
3199  }
3200 
3201  bool hasQualifierOrFoundDecl() const {
3202  return MemberExprBits.HasQualifierOrFoundDecl;
3203  }
3204 
3205  bool hasTemplateKWAndArgsInfo() const {
3206  return MemberExprBits.HasTemplateKWAndArgsInfo;
3207  }
3208 
3209  MemberExpr(Expr *Base, bool IsArrow, SourceLocation OperatorLoc,
3210  ValueDecl *MemberDecl, const DeclarationNameInfo &NameInfo,
3211  QualType T, ExprValueKind VK, ExprObjectKind OK,
3212  NonOdrUseReason NOUR);
3213  MemberExpr(EmptyShell Empty)
3214  : Expr(MemberExprClass, Empty), Base(), MemberDecl() {}
3215 
3216 public:
3217  static MemberExpr *Create(const ASTContext &C, Expr *Base, bool IsArrow,
3218  SourceLocation OperatorLoc,
3219  NestedNameSpecifierLoc QualifierLoc,
3220  SourceLocation TemplateKWLoc, ValueDecl *MemberDecl,
3221  DeclAccessPair FoundDecl,
3222  DeclarationNameInfo MemberNameInfo,
3223  const TemplateArgumentListInfo *TemplateArgs,
3224  QualType T, ExprValueKind VK, ExprObjectKind OK,
3225  NonOdrUseReason NOUR);
3226 
3227  /// Create an implicit MemberExpr, with no location, qualifier, template
3228  /// arguments, and so on. Suitable only for non-static member access.
3230  bool IsArrow, ValueDecl *MemberDecl,
3231  QualType T, ExprValueKind VK,
3232  ExprObjectKind OK) {
3233  return Create(C, Base, IsArrow, SourceLocation(), NestedNameSpecifierLoc(),
3234  SourceLocation(), MemberDecl,
3235  DeclAccessPair::make(MemberDecl, MemberDecl->getAccess()),
3236  DeclarationNameInfo(), nullptr, T, VK, OK, NOUR_None);
3237  }
3238 
3239  static MemberExpr *CreateEmpty(const ASTContext &Context, bool HasQualifier,
3240  bool HasFoundDecl,
3241  bool HasTemplateKWAndArgsInfo,
3242  unsigned NumTemplateArgs);
3243 
3244  void setBase(Expr *E) { Base = E; }
3245  Expr *getBase() const { return cast<Expr>(Base); }
3246 
3247  /// Retrieve the member declaration to which this expression refers.
3248  ///
3249  /// The returned declaration will be a FieldDecl or (in C++) a VarDecl (for
3250  /// static data members), a CXXMethodDecl, or an EnumConstantDecl.
3251  ValueDecl *getMemberDecl() const { return MemberDecl; }
3252  void setMemberDecl(ValueDecl *D);
3253 
3254  /// Retrieves the declaration found by lookup.
3256  if (!hasQualifierOrFoundDecl())
3258  getMemberDecl()->getAccess());
3259  return getTrailingObjects<MemberExprNameQualifier>()->FoundDecl;
3260  }
3261 
3262  /// Determines whether this member expression actually had
3263  /// a C++ nested-name-specifier prior to the name of the member, e.g.,
3264  /// x->Base::foo.
3265  bool hasQualifier() const { return getQualifier() != nullptr; }
3266 
3267  /// If the member name was qualified, retrieves the
3268  /// nested-name-specifier that precedes the member name, with source-location
3269  /// information.
3271  if (!hasQualifierOrFoundDecl())
3272  return NestedNameSpecifierLoc();
3273  return getTrailingObjects<MemberExprNameQualifier>()->QualifierLoc;
3274  }
3275 
3276  /// If the member name was qualified, retrieves the
3277  /// nested-name-specifier that precedes the member name. Otherwise, returns
3278  /// NULL.
3281  }
3282 
3283  /// Retrieve the location of the template keyword preceding
3284  /// the member name, if any.
3286  if (!hasTemplateKWAndArgsInfo())
3287  return SourceLocation();
3288  return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc;
3289  }
3290 
3291  /// Retrieve the location of the left angle bracket starting the
3292  /// explicit template argument list following the member name, if any.
3294  if (!hasTemplateKWAndArgsInfo())
3295  return SourceLocation();
3296  return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc;
3297  }
3298 
3299  /// Retrieve the location of the right angle bracket ending the
3300  /// explicit template argument list following the member name, if any.
3302  if (!hasTemplateKWAndArgsInfo())
3303  return SourceLocation();
3304  return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc;
3305  }
3306 
3307  /// Determines whether the member name was preceded by the template keyword.
3308  bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
3309 
3310  /// Determines whether the member name was followed by an
3311  /// explicit template argument list.
3312  bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
3313 
3314  /// Copies the template arguments (if present) into the given
3315  /// structure.
3318  getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto(
3319  getTrailingObjects<TemplateArgumentLoc>(), List);
3320  }
3321 
3322  /// Retrieve the template arguments provided as part of this
3323  /// template-id.
3325  if (!hasExplicitTemplateArgs())
3326  return nullptr;
3327 
3328  return getTrailingObjects<TemplateArgumentLoc>();
3329  }
3330 
3331  /// Retrieve the number of template arguments provided as part of this
3332  /// template-id.
3333  unsigned getNumTemplateArgs() const {
3334  if (!hasExplicitTemplateArgs())
3335  return 0;
3336 
3337  return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
3338  }
3339 
3341  return {getTemplateArgs(), getNumTemplateArgs()};
3342  }
3343 
3344  /// Retrieve the member declaration name info.
3346  return DeclarationNameInfo(MemberDecl->getDeclName(),
3347  MemberLoc, MemberDNLoc);
3348  }
3349 
3350  SourceLocation getOperatorLoc() const { return MemberExprBits.OperatorLoc; }
3351 
3352  bool isArrow() const { return MemberExprBits.IsArrow; }
3353  void setArrow(bool A) { MemberExprBits.IsArrow = A; }
3354 
3355  /// getMemberLoc - Return the location of the "member", in X->F, it is the
3356  /// location of 'F'.
3357  SourceLocation getMemberLoc() const { return MemberLoc; }
3358  void setMemberLoc(SourceLocation L) { MemberLoc = L; }
3359 
3360  SourceLocation getBeginLoc() const LLVM_READONLY;
3361  SourceLocation getEndLoc() const LLVM_READONLY;
3362 
3363  SourceLocation getExprLoc() const LLVM_READONLY { return MemberLoc; }
3364 
3365  /// Determine whether the base of this explicit is implicit.
3366  bool isImplicitAccess() const {
3367  return getBase() && getBase()->isImplicitCXXThis();
3368  }
3369 
3370  /// Returns true if this member expression refers to a method that
3371  /// was resolved from an overloaded set having size greater than 1.
3372  bool hadMultipleCandidates() const {
3373  return MemberExprBits.HadMultipleCandidates;
3374  }
3375  /// Sets the flag telling whether this expression refers to
3376  /// a method that was resolved from an overloaded set having size
3377  /// greater than 1.
3378  void setHadMultipleCandidates(bool V = true) {
3379  MemberExprBits.HadMultipleCandidates = V;
3380  }
3381 
3382  /// Returns true if virtual dispatch is performed.
3383  /// If the member access is fully qualified, (i.e. X::f()), virtual
3384  /// dispatching is not performed. In -fapple-kext mode qualified
3385  /// calls to virtual method will still go through the vtable.
3386  bool performsVirtualDispatch(const LangOptions &LO) const {
3387  return LO.AppleKext || !hasQualifier();
3388  }
3389 
3390  /// Is this expression a non-odr-use reference, and if so, why?
3391  /// This is only meaningful if the named member is a static member.
3393  return static_cast<NonOdrUseReason>(MemberExprBits.NonOdrUseReason);
3394  }
3395 
3396  static bool classof(const Stmt *T) {
3397  return T->getStmtClass() == MemberExprClass;
3398  }
3399 
3400  // Iterators
3403  return const_child_range(&Base, &Base + 1);
3404  }
3405 };
3406 
3407 /// CompoundLiteralExpr - [C99 6.5.2.5]
3408 ///
3409 class CompoundLiteralExpr : public Expr {
3410  /// LParenLoc - If non-null, this is the location of the left paren in a
3411  /// compound literal like "(int){4}". This can be null if this is a
3412  /// synthesized compound expression.
3413  SourceLocation LParenLoc;
3414 
3415  /// The type as written. This can be an incomplete array type, in
3416  /// which case the actual expression type will be different.
3417  /// The int part of the pair stores whether this expr is file scope.
3418  llvm::PointerIntPair<TypeSourceInfo *, 1, bool> TInfoAndScope;
3419  Stmt *Init;
3420 public:
3422  QualType T, ExprValueKind VK, Expr *init, bool fileScope)
3423  : Expr(CompoundLiteralExprClass, T, VK, OK_Ordinary),
3424  LParenLoc(lparenloc), TInfoAndScope(tinfo, fileScope), Init(init) {
3426  }
3427 
3428  /// Construct an empty compound literal.
3430  : Expr(CompoundLiteralExprClass, Empty) { }
3431 
3432  const Expr *getInitializer() const { return cast<Expr>(Init); }
3433  Expr *getInitializer() { return cast<Expr>(Init); }
3434  void setInitializer(Expr *E) { Init = E; }
3435 
3436  bool isFileScope() const { return TInfoAndScope.getInt(); }
3437  void setFileScope(bool FS) { TInfoAndScope.setInt(FS); }
3438 
3439  SourceLocation getLParenLoc() const { return LParenLoc; }
3440  void setLParenLoc(SourceLocation L) { LParenLoc = L; }
3441 
3443  return TInfoAndScope.getPointer();
3444  }
3446  TInfoAndScope.setPointer(tinfo);
3447  }
3448 
3449  SourceLocation getBeginLoc() const LLVM_READONLY {
3450  // FIXME: Init should never be null.
3451  if (!Init)
3452  return SourceLocation();
3453  if (LParenLoc.isInvalid())
3454  return Init->getBeginLoc();
3455  return LParenLoc;
3456  }
3457  SourceLocation getEndLoc() const LLVM_READONLY {
3458  // FIXME: Init should never be null.
3459  if (!Init)
3460  return SourceLocation();
3461  return Init->getEndLoc();
3462  }
3463 
3464  static bool classof(const Stmt *T) {
3465  return T->getStmtClass() == CompoundLiteralExprClass;
3466  }
3467 
3468  // Iterators
3469  child_range children() { return child_range(&Init, &Init+1); }
3471  return const_child_range(&Init, &Init + 1);
3472  }
3473 };
3474 
3475 /// CastExpr - Base class for type casts, including both implicit
3476 /// casts (ImplicitCastExpr) and explicit casts that have some
3477 /// representation in the source code (ExplicitCastExpr's derived
3478 /// classes).
3479 class CastExpr : public Expr {
3480  Stmt *Op;
3481 
3482  bool CastConsistency() const;
3483 
3484  const CXXBaseSpecifier * const *path_buffer() const {
3485  return const_cast<CastExpr*>(this)->path_buffer();
3486  }
3487  CXXBaseSpecifier **path_buffer();
3488 
3489  friend class ASTStmtReader;
3490 
3491 protected:
3493  Expr *op, unsigned BasePathSize, bool HasFPFeatures)
3494  : Expr(SC, ty, VK, OK_Ordinary), Op(op) {
3495  CastExprBits.Kind = kind;
3496  CastExprBits.PartOfExplicitCast = false;
3497  CastExprBits.BasePathSize = BasePathSize;
3498  assert((CastExprBits.BasePathSize == BasePathSize) &&
3499  "BasePathSize overflow!");
3501  assert(CastConsistency());
3502  CastExprBits.HasFPFeatures = HasFPFeatures;
3503  }
3504 
3505  /// Construct an empty cast.
3506  CastExpr(StmtClass SC, EmptyShell Empty, unsigned BasePathSize,
3507  bool HasFPFeatures)
3508  : Expr(SC, Empty) {
3509  CastExprBits.PartOfExplicitCast = false;
3510  CastExprBits.BasePathSize = BasePathSize;
3511  CastExprBits.HasFPFeatures = HasFPFeatures;
3512  assert((CastExprBits.BasePathSize == BasePathSize) &&
3513  "BasePathSize overflow!");
3514  }
3515 
3516  /// Return a pointer to the trailing FPOptions.
3517  /// \pre hasStoredFPFeatures() == true
3520  return const_cast<CastExpr *>(this)->getTrailingFPFeatures();
3521  }
3522 
3523 public:
3524  CastKind getCastKind() const { return (CastKind) CastExprBits.Kind; }
3525  void setCastKind(CastKind K) { CastExprBits.Kind = K; }
3526 
3527  static const char *getCastKindName(CastKind CK);
3528  const char *getCastKindName() const { return getCastKindName(getCastKind()); }
3529 
3530  Expr *getSubExpr() { return cast<Expr>(Op); }
3531  const Expr *getSubExpr() const { return cast<Expr>(Op); }
3532  void setSubExpr(Expr *E) { Op = E; }
3533 
3534  /// Retrieve the cast subexpression as it was written in the source
3535  /// code, looking through any implicit casts or other intermediate nodes
3536  /// introduced by semantic analysis.
3538  const Expr *getSubExprAsWritten() const {
3539  return const_cast<CastExpr *>(this)->getSubExprAsWritten();
3540  }
3541 
3542  /// If this cast applies a user-defined conversion, retrieve the conversion
3543  /// function that it invokes.
3545 
3547  typedef const CXXBaseSpecifier *const *path_const_iterator;
3548  bool path_empty() const { return path_size() == 0; }
3549  unsigned path_size() const { return CastExprBits.BasePathSize; }
3550  path_iterator path_begin() { return path_buffer(); }
3551  path_iterator path_end() { return path_buffer() + path_size(); }
3552  path_const_iterator path_begin() const { return path_buffer(); }
3553  path_const_iterator path_end() const { return path_buffer() + path_size(); }
3554 
3555  llvm::iterator_range<path_iterator> path() {
3556  return llvm::make_range(path_begin(), path_end());
3557  }
3558  llvm::iterator_range<path_const_iterator> path() const {
3559  return llvm::make_range(path_begin(), path_end());
3560  }
3561 
3563  assert(getCastKind() == CK_ToUnion);
3565  }
3566 
3567  bool hasStoredFPFeatures() const { return CastExprBits.HasFPFeatures; }
3568 
3569  /// Get FPOptionsOverride from trailing storage.
3571  assert(hasStoredFPFeatures());
3572  return *getTrailingFPFeatures();
3573  }
3574 
3575  // Get the FP features status of this operation. Only meaningful for
3576  // operations on floating point types.
3578  if (hasStoredFPFeatures())
3579  return getStoredFPFeatures().applyOverrides(LO);
3581  }
3582 
3584  if (hasStoredFPFeatures())
3585  return getStoredFPFeatures();
3586  return FPOptionsOverride();
3587  }
3588 
3589  static const FieldDecl *getTargetFieldForToUnionCast(QualType unionType,
3590  QualType opType);
3591  static const FieldDecl *getTargetFieldForToUnionCast(const RecordDecl *RD,
3592  QualType opType);
3593 
3594  static bool classof(const Stmt *T) {
3595  return T->getStmtClass() >= firstCastExprConstant &&
3596  T->getStmtClass() <= lastCastExprConstant;
3597  }
3598 
3599  // Iterators
3600  child_range children() { return child_range(&Op, &Op+1); }
3601  const_child_range children() const { return const_child_range(&Op, &Op + 1); }
3602 };
3603 
3604 /// ImplicitCastExpr - Allows us to explicitly represent implicit type
3605 /// conversions, which have no direct representation in the original
3606 /// source code. For example: converting T[]->T*, void f()->void
3607 /// (*f)(), float->double, short->int, etc.
3608 ///
3609 /// In C, implicit casts always produce rvalues. However, in C++, an
3610 /// implicit cast whose result is being bound to a reference will be
3611 /// an lvalue or xvalue. For example:
3612 ///
3613 /// @code
3614 /// class Base { };
3615 /// class Derived : public Base { };
3616 /// Derived &&ref();
3617 /// void f(Derived d) {
3618 /// Base& b = d; // initializer is an ImplicitCastExpr
3619 /// // to an lvalue of type Base
3620 /// Base&& r = ref(); // initializer is an ImplicitCastExpr
3621 /// // to an xvalue of type Base
3622 /// }
3623 /// @endcode
3624 class ImplicitCastExpr final
3625  : public CastExpr,
3626  private llvm::TrailingObjects<ImplicitCastExpr, CXXBaseSpecifier *,
3627  FPOptionsOverride> {
3628 
3630  unsigned BasePathLength, FPOptionsOverride FPO,
3631  ExprValueKind VK)
3632  : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, BasePathLength,
3633  FPO.requiresTrailingStorage()) {
3634  if (hasStoredFPFeatures())
3635  *getTrailingFPFeatures() = FPO;
3636  }
3637 
3638  /// Construct an empty implicit cast.
3639  explicit ImplicitCastExpr(EmptyShell Shell, unsigned PathSize,
3640  bool HasFPFeatures)
3641  : CastExpr(ImplicitCastExprClass, Shell, PathSize, HasFPFeatures) {}
3642 
3643  unsigned numTrailingObjects(OverloadToken<CXXBaseSpecifier *>) const {
3644  return path_size();
3645  }
3646 
3647 public:
3648  enum OnStack_t { OnStack };
3651  : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, 0,
3652  FPO.requiresTrailingStorage()) {
3653  if (hasStoredFPFeatures())
3654  *getTrailingFPFeatures() = FPO;
3655  }
3656 
3657  bool isPartOfExplicitCast() const { return CastExprBits.PartOfExplicitCast; }
3658  void setIsPartOfExplicitCast(bool PartOfExplicitCast) {
3659  CastExprBits.PartOfExplicitCast = PartOfExplicitCast;
3660  }
3661 
3662  static ImplicitCastExpr *Create(const ASTContext &Context, QualType T,
3663  CastKind Kind, Expr *Operand,
3664  const CXXCastPath *BasePath,
3665  ExprValueKind Cat, FPOptionsOverride FPO);
3666 
3667  static ImplicitCastExpr *CreateEmpty(const ASTContext &Context,
3668  unsigned PathSize, bool HasFPFeatures);
3669 
3670  SourceLocation getBeginLoc() const LLVM_READONLY {
3671  return getSubExpr()->getBeginLoc();
3672  }
3673  SourceLocation getEndLoc() const LLVM_READONLY {
3674  return getSubExpr()->getEndLoc();
3675  }
3676 
3677  static bool classof(const Stmt *T) {
3678  return T->getStmtClass() == ImplicitCastExprClass;
3679  }
3680 
3682  friend class CastExpr;
3683 };
3684 
3685 /// ExplicitCastExpr - An explicit cast written in the source
3686 /// code.
3687 ///
3688 /// This class is effectively an abstract class, because it provides
3689 /// the basic representation of an explicitly-written cast without
3690 /// specifying which kind of cast (C cast, functional cast, static
3691 /// cast, etc.) was written; specific derived classes represent the
3692 /// particular style of cast and its location information.
3693 ///
3694 /// Unlike implicit casts, explicit cast nodes have two different
3695 /// types: the type that was written into the source code, and the
3696 /// actual type of the expression as determined by semantic
3697 /// analysis. These types may differ slightly. For example, in C++ one
3698 /// can cast to a reference type, which indicates that the resulting
3699 /// expression will be an lvalue or xvalue. The reference type, however,
3700 /// will not be used as the type of the expression.
3701 class ExplicitCastExpr : public CastExpr {
3702  /// TInfo - Source type info for the (written) type
3703  /// this expression is casting to.
3704  TypeSourceInfo *TInfo;
3705 
3706 protected:
3708  CastKind kind, Expr *op, unsigned PathSize,
3709  bool HasFPFeatures, TypeSourceInfo *writtenTy)
3710  : CastExpr(SC, exprTy, VK, kind, op, PathSize, HasFPFeatures),
3711  TInfo(writtenTy) {}
3712 
3713  /// Construct an empty explicit cast.
3714  ExplicitCastExpr(StmtClass SC, EmptyShell Shell, unsigned PathSize,
3715  bool HasFPFeatures)
3716  : CastExpr(SC, Shell, PathSize, HasFPFeatures) {}
3717 
3718 public:
3719  /// getTypeInfoAsWritten - Returns the type source info for the type
3720  /// that this expression is casting to.
3721  TypeSourceInfo *getTypeInfoAsWritten() const { return TInfo; }
3722  void setTypeInfoAsWritten(TypeSourceInfo *writtenTy) { TInfo = writtenTy; }
3723 
3724  /// getTypeAsWritten - Returns the type that this expression is
3725  /// casting to, as written in the source code.
3726  QualType getTypeAsWritten() const { return TInfo->getType(); }
3727 
3728  static bool classof(const Stmt *T) {
3729  return T->getStmtClass() >= firstExplicitCastExprConstant &&
3730  T->getStmtClass() <= lastExplicitCastExprConstant;
3731  }
3732 };
3733 
3734 /// CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style
3735 /// cast in C++ (C++ [expr.cast]), which uses the syntax
3736 /// (Type)expr. For example: @c (int)f.
3737 class CStyleCastExpr final
3738  : public ExplicitCastExpr,
3739  private llvm::TrailingObjects<CStyleCastExpr, CXXBaseSpecifier *,
3740  FPOptionsOverride> {
3741  SourceLocation LPLoc; // the location of the left paren
3742  SourceLocation RPLoc; // the location of the right paren
3743 
3745  unsigned PathSize, FPOptionsOverride FPO,
3746  TypeSourceInfo *writtenTy, SourceLocation l, SourceLocation r)
3747  : ExplicitCastExpr(CStyleCastExprClass, exprTy, vk, kind, op, PathSize,
3748  FPO.requiresTrailingStorage(), writtenTy),
3749  LPLoc(l), RPLoc(r) {
3750  if (hasStoredFPFeatures())
3751  *getTrailingFPFeatures() = FPO;
3752  }
3753 
3754  /// Construct an empty C-style explicit cast.
3755  explicit CStyleCastExpr(EmptyShell Shell, unsigned PathSize,
3756  bool HasFPFeatures)
3757  : ExplicitCastExpr(CStyleCastExprClass, Shell, PathSize, HasFPFeatures) {}
3758 
3759  unsigned numTrailingObjects(OverloadToken<CXXBaseSpecifier *>) const {
3760  return path_size();
3761  }
3762 
3763 public:
3764  static CStyleCastExpr *
3765  Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K,
3766  Expr *Op, const CXXCastPath *BasePath, FPOptionsOverride FPO,
3767  TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation R);
3768 
3769  static CStyleCastExpr *CreateEmpty(const ASTContext &Context,
3770  unsigned PathSize, bool HasFPFeatures);
3771 
3772  SourceLocation getLParenLoc() const { return LPLoc; }
3773  void setLParenLoc(SourceLocation L) { LPLoc = L; }
3774 
3775  SourceLocation getRParenLoc() const { return RPLoc; }
3776  void setRParenLoc(SourceLocation L) { RPLoc = L; }
3777 
3778  SourceLocation getBeginLoc() const LLVM_READONLY { return LPLoc; }
3779  SourceLocation getEndLoc() const LLVM_READONLY {
3780  return getSubExpr()->getEndLoc();
3781  }
3782 
3783  static bool classof(const Stmt *T) {
3784  return T->getStmtClass() == CStyleCastExprClass;
3785  }
3786 
3788  friend class CastExpr;
3789 };
3790 
3791 /// A builtin binary operation expression such as "x + y" or "x <= y".
3792 ///
3793 /// This expression node kind describes a builtin binary operation,
3794 /// such as "x + y" for integer values "x" and "y". The operands will
3795 /// already have been converted to appropriate types (e.g., by
3796 /// performing promotions or conversions).
3797 ///
3798 /// In C++, where operators may be overloaded, a different kind of
3799 /// expression node (CXXOperatorCallExpr) is used to express the
3800 /// invocation of an overloaded operator with operator syntax. Within
3801 /// a C++ template, whether BinaryOperator or CXXOperatorCallExpr is
3802 /// used to store an expression "x + y" depends on the subexpressions
3803 /// for x and y. If neither x or y is type-dependent, and the "+"
3804 /// operator resolves to a built-in operation, BinaryOperator will be
3805 /// used to express the computation (x and y may still be
3806 /// value-dependent). If either x or y is type-dependent, or if the
3807 /// "+" resolves to an overloaded operator, CXXOperatorCallExpr will
3808 /// be used to express the computation.
3809 class BinaryOperator : public Expr {
3810  enum { LHS, RHS, END_EXPR };
3811  Stmt *SubExprs[END_EXPR];
3812 
3813 public:
3815 
3816 protected:
3817  size_t offsetOfTrailingStorage() const;
3818 
3819  /// Return a pointer to the trailing FPOptions
3821  assert(BinaryOperatorBits.HasFPFeatures);
3822  return reinterpret_cast<FPOptionsOverride *>(
3823  reinterpret_cast<char *>(this) + offsetOfTrailingStorage());
3824  }
3826  assert(BinaryOperatorBits.HasFPFeatures);
3827  return reinterpret_cast<const FPOptionsOverride *>(
3828  reinterpret_cast<const char *>(this) + offsetOfTrailingStorage());
3829  }
3830 
3831  /// Build a binary operator, assuming that appropriate storage has been
3832  /// allocated for the trailing objects when needed.
3833  BinaryOperator(const ASTContext &Ctx, Expr *lhs, Expr *rhs, Opcode opc,
3834  QualType ResTy, ExprValueKind VK, ExprObjectKind OK,
3835  SourceLocation opLoc, FPOptionsOverride FPFeatures);
3836 
3837  /// Construct an empty binary operator.
3838  explicit BinaryOperator(EmptyShell Empty) : Expr(BinaryOperatorClass, Empty) {
3839  BinaryOperatorBits.Opc = BO_Comma;
3840  }
3841 
3842 public:
3843  static BinaryOperator *CreateEmpty(const ASTContext &C, bool hasFPFeatures);
3844 
3845  static BinaryOperator *Create(const ASTContext &C, Expr *lhs, Expr *rhs,
3846  Opcode opc, QualType ResTy, ExprValueKind VK,
3847  ExprObjectKind OK, SourceLocation opLoc,
3848  FPOptionsOverride FPFeatures);
3852 
3853  Opcode getOpcode() const {
3854  return static_cast<Opcode>(BinaryOperatorBits.Opc);
3855  }
3856  void setOpcode(Opcode Opc) { BinaryOperatorBits.Opc = Opc; }
3857 
3858  Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
3859  void setLHS(Expr *E) { SubExprs[LHS] = E; }
3860  Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
3861  void setRHS(Expr *E) { SubExprs[RHS] = E; }
3862 
3863  SourceLocation getBeginLoc() const LLVM_READONLY {
3864  return getLHS()->getBeginLoc();
3865  }
3866  SourceLocation getEndLoc() const LLVM_READONLY {
3867  return getRHS()->getEndLoc();
3868  }
3869 
3870  /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
3871  /// corresponds to, e.g. "<<=".
3872  static StringRef getOpcodeStr(Opcode Op);
3873 
3874  StringRef getOpcodeStr() const { return getOpcodeStr(getOpcode()); }
3875 
3876  /// Retrieve the binary opcode that corresponds to the given
3877  /// overloaded operator.
3879 
3880  /// Retrieve the overloaded operator kind that corresponds to
3881  /// the given binary opcode.
3883 
3884  /// predicates to categorize the respective opcodes.
3885  static bool isPtrMemOp(Opcode Opc) {
3886  return Opc == BO_PtrMemD || Opc == BO_PtrMemI;
3887  }
3888  bool isPtrMemOp() const { return isPtrMemOp(getOpcode()); }
3889 
3890  static bool isMultiplicativeOp(Opcode Opc) {
3891  return Opc >= BO_Mul && Opc <= BO_Rem;
3892  }
3894  static bool isAdditiveOp(Opcode Opc) { return Opc == BO_Add || Opc==BO_Sub; }
3895  bool isAdditiveOp() const { return isAdditiveOp(getOpcode()); }
3896  static bool isShiftOp(Opcode Opc) { return Opc == BO_Shl || Opc == BO_Shr; }
3897  bool isShiftOp() const { return isShiftOp(getOpcode()); }
3898 
3899  static bool isBitwiseOp(Opcode Opc) { return Opc >= BO_And && Opc <= BO_Or; }
3900  bool isBitwiseOp() const { return isBitwiseOp(getOpcode()); }
3901 
3902  static bool isRelationalOp(Opcode Opc) { return Opc >= BO_LT && Opc<=BO_GE; }
3903  bool isRelationalOp() const { return isRelationalOp(getOpcode()); }
3904 
3905  static bool isEqualityOp(Opcode Opc) { return Opc == BO_EQ || Opc == BO_NE; }
3906  bool isEqualityOp() const { return isEqualityOp(getOpcode()); }
3907 
3908  static bool isComparisonOp(Opcode Opc) { return Opc >= BO_Cmp && Opc<=BO_NE; }
3909  bool isComparisonOp() const { return isComparisonOp(getOpcode()); }
3910 
3911  static bool isCommaOp(Opcode Opc) { return Opc == BO_Comma; }
3912  bool isCommaOp() const { return isCommaOp(getOpcode()); }
3913 
3915  switch (Opc) {
3916  default:
3917  llvm_unreachable("Not a comparison operator.");
3918  case BO_LT: return BO_GE;
3919  case BO_GT: return BO_LE;
3920  case BO_LE: return BO_GT;
3921  case BO_GE: return BO_LT;
3922  case BO_EQ: return BO_NE;
3923  case BO_NE: return BO_EQ;
3924  }
3925  }
3926 
3928  switch (Opc) {
3929  default:
3930  llvm_unreachable("Not a comparison operator.");
3931  case BO_LT: return BO_GT;
3932  case BO_GT: return BO_LT;
3933  case BO_LE: return BO_GE;
3934  case BO_GE: return BO_LE;
3935  case BO_EQ:
3936  case BO_NE:
3937  return Opc;
3938  }
3939  }
3940 
3941  static bool isLogicalOp(Opcode Opc) { return Opc == BO_LAnd || Opc==BO_LOr; }
3942  bool isLogicalOp() const { return isLogicalOp(getOpcode()); }
3943 
3944  static bool isAssignmentOp(Opcode Opc) {
3945  return Opc >= BO_Assign && Opc <= BO_OrAssign;
3946  }
3947  bool isAssignmentOp() const { return isAssignmentOp(getOpcode()); }
3948 
3949  static bool isCompoundAssignmentOp(Opcode Opc) {
3950  return Opc > BO_Assign && Opc <= BO_OrAssign;
3951  }
3952  bool isCompoundAssignmentOp() const {
3954  }
3956  assert(isCompoundAssignmentOp(Opc));
3957  if (Opc >= BO_AndAssign)
3958  return Opcode(unsigned(Opc) - BO_AndAssign + BO_And);
3959  else
3960  return Opcode(unsigned(Opc) - BO_MulAssign + BO_Mul);
3961  }
3962 
3963  static bool isShiftAssignOp(Opcode Opc) {
3964  return Opc == BO_ShlAssign || Opc == BO_ShrAssign;
3965  }
3966  bool isShiftAssignOp() const {
3967  return isShiftAssignOp(getOpcode());
3968  }
3969 
3970  // Return true if a binary operator using the specified opcode and operands
3971  // would match the 'p = (i8*)nullptr + n' idiom for casting a pointer-sized
3972  // integer to a pointer.
3973  static bool isNullPointerArithmeticExtension(ASTContext &Ctx, Opcode Opc,
3974  Expr *LHS, Expr *RHS);
3975 
3976  static bool classof(const Stmt *S) {
3977  return S->getStmtClass() >= firstBinaryOperatorConstant &&
3978  S->getStmtClass() <= lastBinaryOperatorConstant;
3979  }
3980 
3981  // Iterators
3983  return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
3984  }
3986  return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
3987  }
3988 
3989  /// Set and fetch the bit that shows whether FPFeatures needs to be
3990  /// allocated in Trailing Storage
3991  void setHasStoredFPFeatures(bool B) { BinaryOperatorBits.HasFPFeatures = B; }
3992  bool hasStoredFPFeatures() const { return BinaryOperatorBits.HasFPFeatures; }
3993 
3994  /// Get FPFeatures from trailing storage
3996  assert(hasStoredFPFeatures());
3997  return *getTrailingFPFeatures();
3998  }
3999  /// Set FPFeatures in trailing storage, used only by Serialization
4001  assert(BinaryOperatorBits.HasFPFeatures);
4002  *getTrailingFPFeatures() = F;
4003  }
4004 
4005  // Get the FP features status of this operator. Only meaningful for
4006  // operations on floating point types.
4008  if (BinaryOperatorBits.HasFPFeatures)
4009  return getStoredFPFeatures().applyOverrides(LO);
4011  }
4012 
4013  // This is used in ASTImporter
4015  if (BinaryOperatorBits.HasFPFeatures)
4016  return getStoredFPFeatures();
4017  return FPOptionsOverride();
4018  }
4019 
4020  // Get the FP contractability status of this operator. Only meaningful for
4021  // operations on floating point types.
4024  }
4025 
4026  // Get the FENV_ACCESS status of this operator. Only meaningful for
4027  // operations on floating point types.
4028  bool isFEnvAccessOn(const LangOptions &LO) const {
4029  return getFPFeaturesInEffect(LO).getAllowFEnvAccess();
4030  }
4031 
4032 protected:
4033  BinaryOperator(const ASTContext &Ctx, Expr *lhs, Expr *rhs, Opcode opc,
4034  QualType ResTy, ExprValueKind VK, ExprObjectKind OK,
4035  SourceLocation opLoc, FPOptionsOverride FPFeatures,
4036  bool dead2);
4037 
4038  /// Construct an empty BinaryOperator, SC is CompoundAssignOperator.
4039  BinaryOperator(StmtClass SC, EmptyShell Empty) : Expr(SC, Empty) {
4040  BinaryOperatorBits.Opc = BO_MulAssign;
4041  }
4042 
4043  /// Return the size in bytes needed for the trailing objects.
4044  /// Used to allocate the right amount of storage.
4045  static unsigned sizeOfTrailingObjects(bool HasFPFeatures) {
4046  return HasFPFeatures * sizeof(FPOptionsOverride);
4047  }
4048 };
4049 
4050 /// CompoundAssignOperator - For compound assignments (e.g. +=), we keep
4051 /// track of the type the operation is performed in. Due to the semantics of
4052 /// these operators, the operands are promoted, the arithmetic performed, an
4053 /// implicit conversion back to the result type done, then the assignment takes
4054 /// place. This captures the intermediate type which the computation is done
4055 /// in.
4057  QualType ComputationLHSType;
4058  QualType ComputationResultType;
4059 
4060  /// Construct an empty CompoundAssignOperator.
4061  explicit CompoundAssignOperator(const ASTContext &C, EmptyShell Empty,
4062  bool hasFPFeatures)
4063  : BinaryOperator(CompoundAssignOperatorClass, Empty) {}
4064 
4065 protected:
4066  CompoundAssignOperator(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc,
4067  QualType ResType, ExprValueKind VK, ExprObjectKind OK,
4068  SourceLocation OpLoc, FPOptionsOverride FPFeatures,
4069  QualType CompLHSType, QualType CompResultType)
4070  : BinaryOperator(C, lhs, rhs, opc, ResType, VK, OK, OpLoc, FPFeatures,
4071  true),
4072  ComputationLHSType(CompLHSType), ComputationResultType(CompResultType) {
4073  assert(isCompoundAssignmentOp() &&
4074  "Only should be used for compound assignments");
4075  }
4076 
4077 public:
4079  bool hasFPFeatures);
4080 
4081  static CompoundAssignOperator *
4082  Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy,
4084  FPOptionsOverride FPFeatures, QualType CompLHSType = QualType(),
4085  QualType CompResultType = QualType());
4086 
4087  // The two computation types are the type the LHS is converted
4088  // to for the computation and the type of the result; the two are
4089  // distinct in a few cases (specifically, int+=ptr and ptr-=ptr).
4090  QualType getComputationLHSType() const { return ComputationLHSType; }
4091  void setComputationLHSType(QualType T) { ComputationLHSType = T; }
4092 
4093  QualType getComputationResultType() const { return ComputationResultType; }
4094  void setComputationResultType(QualType T) { ComputationResultType = T; }
4095 
4096  static bool classof(const Stmt *S) {
4097  return S->getStmtClass() == CompoundAssignOperatorClass;
4098  }
4099 };
4100 
4102  assert(BinaryOperatorBits.HasFPFeatures);
4103  return isa<CompoundAssignOperator>(this) ? sizeof(CompoundAssignOperator)
4104  : sizeof(BinaryOperator);
4105 }
4106 
4107 /// AbstractConditionalOperator - An abstract base class for
4108 /// ConditionalOperator and BinaryConditionalOperator.
4110  SourceLocation QuestionLoc, ColonLoc;
4111  friend class ASTStmtReader;
4112 
4113 protected:
4115  ExprObjectKind OK, SourceLocation qloc,
4116  SourceLocation cloc)
4117  : Expr(SC, T, VK, OK), QuestionLoc(qloc), ColonLoc(cloc) {}
4118 
4120  : Expr(SC, Empty) { }
4121 
4122 public:
4123  // getCond - Return the expression representing the condition for
4124  // the ?: operator.
4125  Expr *getCond() const;
4126 
4127  // getTrueExpr - Return the subexpression representing the value of
4128  // the expression if the condition evaluates to true.
4129  Expr *getTrueExpr() const;
4130 
4131  // getFalseExpr - Return the subexpression representing the value of
4132  // the expression if the condition evaluates to false. This is
4133  // the same as getRHS.
4134  Expr *getFalseExpr() const;
4135 
4136  SourceLocation getQuestionLoc() const { return QuestionLoc; }
4137  SourceLocation getColonLoc() const { return ColonLoc; }
4138 
4139  static bool classof(const Stmt *T) {
4140  return T->getStmtClass() == ConditionalOperatorClass ||
4141  T->getStmtClass() == BinaryConditionalOperatorClass;
4142  }
4143 };
4144 
4145 /// ConditionalOperator - The ?: ternary operator. The GNU "missing
4146 /// middle" extension is a BinaryConditionalOperator.
4148  enum { COND, LHS, RHS, END_EXPR };
4149  Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides.
4150 
4151  friend class ASTStmtReader;
4152 public:
4154  SourceLocation CLoc, Expr *rhs, QualType t,
4156  : AbstractConditionalOperator(ConditionalOperatorClass, t, VK, OK, QLoc,
4157  CLoc) {
4158  SubExprs[COND] = cond;
4159  SubExprs[LHS] = lhs;
4160  SubExprs[RHS] = rhs;
4162  }
4163 
4164  /// Build an empty conditional operator.
4166  : AbstractConditionalOperator(ConditionalOperatorClass, Empty) { }
4167 
4168  // getCond - Return the expression representing the condition for
4169  // the ?: operator.
4170  Expr *getCond() const { return cast<Expr>(SubExprs[COND]); }
4171 
4172  // getTrueExpr - Return the subexpression representing the value of
4173  // the expression if the condition evaluates to true.
4174  Expr *getTrueExpr() const { return cast<Expr>(SubExprs[LHS]); }
4175 
4176  // getFalseExpr - Return the subexpression representing the value of
4177  // the expression if the condition evaluates to false. This is
4178  // the same as getRHS.
4179  Expr *getFalseExpr() const { return cast<Expr>(SubExprs[RHS]); }
4180 
4181  Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
4182  Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
4183 
4184  SourceLocation getBeginLoc() const LLVM_READONLY {
4185  return getCond()->getBeginLoc();
4186  }
4187  SourceLocation getEndLoc() const LLVM_READONLY {
4188  return getRHS()->getEndLoc();
4189  }
4190 
4191  static bool classof(const Stmt *T) {
4192  return T->getStmtClass() == ConditionalOperatorClass;
4193  }
4194 
4195  // Iterators
4197  return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
4198  }
4200  return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
4201  }
4202 };
4203 
4204 /// BinaryConditionalOperator - The GNU extension to the conditional
4205 /// operator which allows the middle operand to be omitted.
4206 ///
4207 /// This is a different expression kind on the assumption that almost
4208 /// every client ends up needing to know that these are different.
4210  enum { COMMON, COND, LHS, RHS, NUM_SUBEXPRS };
4211 
4212  /// - the common condition/left-hand-side expression, which will be
4213  /// evaluated as the opaque value
4214  /// - the condition, expressed in terms of the opaque value
4215  /// - the left-hand-side, expressed in terms of the opaque value
4216  /// - the right-hand-side
4217  Stmt *SubExprs[NUM_SUBEXPRS];
4218  OpaqueValueExpr *OpaqueValue;
4219 
4220  friend class ASTStmtReader;
4221 public:
4223  Expr *cond, Expr *lhs, Expr *rhs,
4224  SourceLocation qloc, SourceLocation cloc,
4226  : AbstractConditionalOperator(BinaryConditionalOperatorClass, t, VK, OK,
4227  qloc, cloc),
4228  OpaqueValue(opaqueValue) {
4229  SubExprs[COMMON] = common;
4230  SubExprs[COND] = cond;
4231  SubExprs[LHS] = lhs;
4232  SubExprs[RHS] = rhs;
4233  assert(OpaqueValue->getSourceExpr() == common && "Wrong opaque value");
4235  }
4236 
4237  /// Build an empty conditional operator.
4239  : AbstractConditionalOperator(BinaryConditionalOperatorClass, Empty) { }
4240 
4241  /// getCommon - Return the common expression, written to the
4242  /// left of the condition. The opaque value will be bound to the
4243  /// result of this expression.
4244  Expr *getCommon() const { return cast<Expr>(SubExprs[COMMON]); }
4245 
4246  /// getOpaqueValue - Return the opaque value placeholder.
4247  OpaqueValueExpr *getOpaqueValue() const { return OpaqueValue; }
4248 
4249  /// getCond - Return the condition expression; this is defined
4250  /// in terms of the opaque value.
4251  Expr *getCond() const { return cast<Expr>(SubExprs[COND]); }
4252 
4253  /// getTrueExpr - Return the subexpression which will be
4254  /// evaluated if the condition evaluates to true; this is defined
4255  /// in terms of the opaque value.
4256  Expr *getTrueExpr() const {
4257  return cast<Expr>(SubExprs[LHS]);
4258  }
4259 
4260  /// getFalseExpr - Return the subexpression which will be
4261  /// evaluated if the condnition evaluates to false; this is
4262  /// defined in terms of the opaque value.
4263  Expr *getFalseExpr() const {
4264  return cast<Expr>(SubExprs[RHS]);
4265  }
4266 
4267  SourceLocation getBeginLoc() const LLVM_READONLY {
4268  return getCommon()->getBeginLoc();
4269  }
4270  SourceLocation getEndLoc() const LLVM_READONLY {
4271  return getFalseExpr()->getEndLoc();
4272  }
4273 
4274  static bool classof(const Stmt *T) {
4275  return T->getStmtClass() == BinaryConditionalOperatorClass;
4276  }
4277 
4278  // Iterators
4280  return child_range(SubExprs, SubExprs + NUM_SUBEXPRS);
4281  }
4283  return const_child_range(SubExprs, SubExprs + NUM_SUBEXPRS);
4284  }
4285 };
4286 
4288  if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this))
4289  return co->getCond();
4290  return cast<BinaryConditionalOperator>(this)->getCond();
4291 }
4292 
4294  if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this))
4295  return co->getTrueExpr();
4296  return cast<BinaryConditionalOperator>(this)->getTrueExpr();
4297 }
4298 
4300  if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this))
4301  return co->getFalseExpr();
4302  return cast<BinaryConditionalOperator>(this)->getFalseExpr();
4303 }
4304 
4305 /// AddrLabelExpr - The GNU address of label extension, representing &&label.
4306 class AddrLabelExpr : public Expr {
4307  SourceLocation AmpAmpLoc, LabelLoc;
4308  LabelDecl *Label;
4309 public:
4311  QualType t)
4312  : Expr(AddrLabelExprClass, t, VK_PRValue, OK_Ordinary), AmpAmpLoc(AALoc),
4313  LabelLoc(LLoc), Label(L) {
4315  }
4316 
4317  /// Build an empty address of a label expression.
4318  explicit AddrLabelExpr(EmptyShell Empty)
4319  : Expr(AddrLabelExprClass, Empty) { }
4320 
4321  SourceLocation getAmpAmpLoc() const { return AmpAmpLoc; }
4322  void setAmpAmpLoc(SourceLocation L) { AmpAmpLoc = L; }
4323  SourceLocation getLabelLoc() const { return LabelLoc; }
4324  void setLabelLoc(SourceLocation L) { LabelLoc = L; }
4325 
4326  SourceLocation getBeginLoc() const LLVM_READONLY { return AmpAmpLoc; }
4327  SourceLocation getEndLoc() const LLVM_READONLY { return LabelLoc; }
4328 
4329  LabelDecl *getLabel() const { return Label; }
4330  void setLabel(LabelDecl *L) { Label = L; }
4331 
4332  static bool classof(const Stmt *T) {
4333  return T->getStmtClass() == AddrLabelExprClass;
4334  }
4335 
4336  // Iterators
4339  }
4342  }
4343 };
4344 
4345 /// StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
4346 /// The StmtExpr contains a single CompoundStmt node, which it evaluates and
4347 /// takes the value of the last subexpression.
4348 ///
4349 /// A StmtExpr is always an r-value; values "returned" out of a
4350 /// StmtExpr will be copied.
4351 class StmtExpr : public Expr {
4352  Stmt *SubStmt;
4353  SourceLocation LParenLoc, RParenLoc;
4354 public:
4356  SourceLocation RParenLoc, unsigned TemplateDepth)
4357  : Expr(StmtExprClass, T, VK_PRValue, OK_Ordinary), SubStmt(SubStmt),
4358  LParenLoc(LParenLoc), RParenLoc(RParenLoc) {
4359  setDependence(computeDependence(this, TemplateDepth));
4360  // FIXME: A templated statement expression should have an associated
4361  // DeclContext so that nested declarations always have a dependent context.
4362  StmtExprBits.TemplateDepth = TemplateDepth;
4363  }
4364 
4365  /// Build an empty statement expression.
4366  explicit StmtExpr(EmptyShell Empty) : Expr(StmtExprClass, Empty) { }
4367 
4368  CompoundStmt *getSubStmt() { return cast<CompoundStmt>(SubStmt); }
4369  const CompoundStmt *getSubStmt() const { return cast<CompoundStmt>(SubStmt); }
4370  void setSubStmt(CompoundStmt *S) { SubStmt = S; }
4371 
4372  SourceLocation getBeginLoc() const LLVM_READONLY { return LParenLoc; }
4373  SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
4374 
4375  SourceLocation getLParenLoc() const { return LParenLoc; }
4376  void setLParenLoc(SourceLocation L) { LParenLoc = L; }
4377  SourceLocation getRParenLoc() const { return RParenLoc; }
4378  void setRParenLoc(SourceLocation L) { RParenLoc = L; }
4379 
4380  unsigned getTemplateDepth() const { return StmtExprBits.TemplateDepth; }
4381 
4382  static bool classof(const Stmt *T) {
4383  return T->getStmtClass() == StmtExprClass;
4384  }
4385 
4386  // Iterators
4387  child_range children() { return child_range(&SubStmt, &SubStmt+1); }
4389  return const_child_range(&SubStmt, &SubStmt + 1);
4390  }
4391 };
4392 
4393 /// ShuffleVectorExpr - clang-specific builtin-in function
4394 /// __builtin_shufflevector.
4395 /// This AST node represents a operator that does a constant
4396 /// shuffle, similar to LLVM's shufflevector instruction. It takes
4397 /// two vectors and a variable number of constant indices,
4398 /// and returns the appropriately shuffled vector.
4399 class ShuffleVectorExpr : public Expr {
4400  SourceLocation BuiltinLoc, RParenLoc;
4401 
4402  // SubExprs - the list of values passed to the __builtin_shufflevector
4403  // function. The first two are vectors, and the rest are constant
4404  // indices. The number of values in this list is always
4405  // 2+the number of indices in the vector type.
4406  Stmt **SubExprs;
4407  unsigned NumExprs;
4408 
4409 public:
4411  SourceLocation BLoc, SourceLocation RP);
4412 
4413  /// Build an empty vector-shuffle expression.
4415  : Expr(ShuffleVectorExprClass, Empty), SubExprs(nullptr) { }
4416 
4417  SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
4418  void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; }
4419 
4420  SourceLocation getRParenLoc() const { return RParenLoc; }
4421  void setRParenLoc(SourceLocation L) { RParenLoc = L; }
4422 
4423  SourceLocation getBeginLoc() const LLVM_READONLY { return BuiltinLoc; }
4424  SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
4425 
4426  static bool classof(const Stmt *T) {
4427  return T->getStmtClass() == ShuffleVectorExprClass;
4428  }
4429 
4430  /// getNumSubExprs - Return the size of the SubExprs array. This includes the
4431  /// constant expression, the actual arguments passed in, and the function
4432  /// pointers.
4433  unsigned getNumSubExprs() const { return NumExprs; }
4434 
4435  /// Retrieve the array of expressions.
4436  Expr **getSubExprs() { return reinterpret_cast<Expr **>(SubExprs); }
4437 
4438  /// getExpr - Return the Expr at the specified index.
4439  Expr *getExpr(unsigned Index) {
4440  assert((Index < NumExprs) && "Arg access out of range!");
4441  return cast<Expr>(SubExprs[Index]);
4442  }
4443  const Expr *getExpr(unsigned Index) const {
4444  assert((Index < NumExprs) && "Arg access out of range!");
4445  return cast<Expr>(SubExprs[Index]);
4446  }
4447 
4448  void setExprs(const ASTContext &C, ArrayRef<Expr *> Exprs);
4449 
4450  llvm::APSInt getShuffleMaskIdx(const ASTContext &Ctx, unsigned N) const {
4451  assert((N < NumExprs - 2) && "Shuffle idx out of range!");
4452  return getExpr(N+2)->EvaluateKnownConstInt(Ctx);
4453  }
4454 
4455  // Iterators
4457  return child_range(&SubExprs[0], &SubExprs[0]+NumExprs);
4458  }
4460  return const_child_range(&SubExprs[0], &SubExprs[0] + NumExprs);
4461  }
4462 };
4463 
4464 /// ConvertVectorExpr - Clang builtin function __builtin_convertvector
4465 /// This AST node provides support for converting a vector type to another
4466 /// vector type of the same arity.
4467 class ConvertVectorExpr : public Expr {
4468 private:
4469  Stmt *SrcExpr;
4470  TypeSourceInfo *TInfo;
4471  SourceLocation BuiltinLoc, RParenLoc;
4472 
4473  friend class ASTReader;
4474  friend class ASTStmtReader;
4475  explicit ConvertVectorExpr(EmptyShell Empty) : Expr(ConvertVectorExprClass, Empty) {}
4476 
4477 public:
4480  SourceLocation BuiltinLoc, SourceLocation RParenLoc)
4481  : Expr(ConvertVectorExprClass, DstType, VK, OK), SrcExpr(SrcExpr),
4482  TInfo(TI), BuiltinLoc(BuiltinLoc), RParenLoc(RParenLoc) {
4484  }
4485 
4486  /// getSrcExpr - Return the Expr to be converted.
4487  Expr *getSrcExpr() const { return cast<Expr>(SrcExpr); }
4488 
4489  /// getTypeSourceInfo - Return the destination type.
4491  return TInfo;
4492  }
4494  TInfo = ti;
4495  }
4496 
4497  /// getBuiltinLoc - Return the location of the __builtin_convertvector token.
4498  SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
4499 
4500  /// getRParenLoc - Return the location of final right parenthesis.
4501  SourceLocation getRParenLoc() const { return RParenLoc; }
4502 
4503  SourceLocation getBeginLoc() const LLVM_READONLY { return BuiltinLoc; }
4504  SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
4505 
4506  static bool classof(const Stmt *T) {
4507  return T->getStmtClass() == ConvertVectorExprClass;
4508  }
4509 
4510  // Iterators
4511  child_range children() { return child_range(&SrcExpr, &SrcExpr+1); }
4513  return const_child_range(&SrcExpr, &SrcExpr + 1);
4514  }
4515 };
4516 
4517 /// ChooseExpr - GNU builtin-in function __builtin_choose_expr.
4518 /// This AST node is similar to the conditional operator (?:) in C, with
4519 /// the following exceptions:
4520 /// - the test expression must be a integer constant expression.
4521 /// - the expression returned acts like the chosen subexpression in every
4522 /// visible way: the type is the same as that of the chosen subexpression,
4523 /// and all predicates (whether it's an l-value, whether it's an integer
4524 /// constant expression, etc.) return the same result as for the chosen
4525 /// sub-expression.
4526 class ChooseExpr : public Expr {
4527  enum { COND, LHS, RHS, END_EXPR };
4528  Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides.
4529  SourceLocation BuiltinLoc, RParenLoc;
4530  bool CondIsTrue;
4531 public:
4532  ChooseExpr(SourceLocation BLoc, Expr *cond, Expr *lhs, Expr *rhs, QualType t,
4534  bool condIsTrue)
4535  : Expr(ChooseExprClass, t, VK, OK), BuiltinLoc(BLoc), RParenLoc(RP),
4536  CondIsTrue(condIsTrue) {
4537  SubExprs[COND] = cond;
4538  SubExprs[LHS] = lhs;
4539  SubExprs[RHS] = rhs;
4540 
4542  }
4543 
4544  /// Build an empty __builtin_choose_expr.
4545  explicit ChooseExpr(EmptyShell Empty) : Expr(ChooseExprClass, Empty) { }
4546 
4547  /// isConditionTrue - Return whether the condition is true (i.e. not
4548  /// equal to zero).
4549  bool isConditionTrue() const {
4550  assert(!isConditionDependent() &&
4551  "Dependent condition isn't true or false");
4552  return CondIsTrue;
4553  }
4554  void setIsConditionTrue(bool isTrue) { CondIsTrue = isTrue; }
4555 
4556  bool isConditionDependent() const {
4557  return getCond()->isTypeDependent() || getCond()->isValueDependent();
4558  }
4559 
4560  /// getChosenSubExpr - Return the subexpression chosen according to the
4561  /// condition.
4563  return isConditionTrue() ? getLHS() : getRHS();
4564  }