• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===--- ExprCXX.h - Classes for representing expressions -------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 /// \file
11 /// \brief Defines the clang::Expr interface and subclasses for C++ expressions.
12 ///
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_CLANG_AST_EXPRCXX_H
16 #define LLVM_CLANG_AST_EXPRCXX_H
17 
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/Expr.h"
20 #include "clang/AST/LambdaCapture.h"
21 #include "clang/AST/TemplateBase.h"
22 #include "clang/AST/UnresolvedSet.h"
23 #include "clang/Basic/ExpressionTraits.h"
24 #include "clang/Basic/TypeTraits.h"
25 #include "llvm/Support/Compiler.h"
26 
27 namespace clang {
28 
29 class CXXConstructorDecl;
30 class CXXDestructorDecl;
31 class CXXMethodDecl;
32 class CXXTemporary;
33 class MSPropertyDecl;
34 class TemplateArgumentListInfo;
35 class UuidAttr;
36 
37 //===--------------------------------------------------------------------===//
38 // C++ Expressions.
39 //===--------------------------------------------------------------------===//
40 
41 /// \brief A call to an overloaded operator written using operator
42 /// syntax.
43 ///
44 /// Represents a call to an overloaded operator written using operator
45 /// syntax, e.g., "x + y" or "*p". While semantically equivalent to a
46 /// normal call, this AST node provides better information about the
47 /// syntactic representation of the call.
48 ///
49 /// In a C++ template, this expression node kind will be used whenever
50 /// any of the arguments are type-dependent. In this case, the
51 /// function itself will be a (possibly empty) set of functions and
52 /// function templates that were found by name lookup at template
53 /// definition time.
54 class CXXOperatorCallExpr : public CallExpr {
55   /// \brief The overloaded operator.
56   OverloadedOperatorKind Operator;
57   SourceRange Range;
58 
59   // Record the FP_CONTRACT state that applies to this operator call. Only
60   // meaningful for floating point types. For other types this value can be
61   // set to false.
62   unsigned FPContractable : 1;
63 
64   SourceRange getSourceRangeImpl() const LLVM_READONLY;
65 public:
CXXOperatorCallExpr(ASTContext & C,OverloadedOperatorKind Op,Expr * fn,ArrayRef<Expr * > args,QualType t,ExprValueKind VK,SourceLocation operatorloc,bool fpContractable)66   CXXOperatorCallExpr(ASTContext& C, OverloadedOperatorKind Op, Expr *fn,
67                       ArrayRef<Expr*> args, QualType t, ExprValueKind VK,
68                       SourceLocation operatorloc, bool fpContractable)
69     : CallExpr(C, CXXOperatorCallExprClass, fn, 0, args, t, VK,
70                operatorloc),
71       Operator(Op), FPContractable(fpContractable) {
72     Range = getSourceRangeImpl();
73   }
CXXOperatorCallExpr(ASTContext & C,EmptyShell Empty)74   explicit CXXOperatorCallExpr(ASTContext& C, EmptyShell Empty) :
75     CallExpr(C, CXXOperatorCallExprClass, Empty) { }
76 
77 
78   /// \brief Returns the kind of overloaded operator that this
79   /// expression refers to.
getOperator()80   OverloadedOperatorKind getOperator() const { return Operator; }
81 
82   /// \brief Returns the location of the operator symbol in the expression.
83   ///
84   /// When \c getOperator()==OO_Call, this is the location of the right
85   /// parentheses; when \c getOperator()==OO_Subscript, this is the location
86   /// of the right bracket.
getOperatorLoc()87   SourceLocation getOperatorLoc() const { return getRParenLoc(); }
88 
getExprLoc()89   SourceLocation getExprLoc() const LLVM_READONLY {
90     return (Operator < OO_Plus || Operator >= OO_Arrow ||
91             Operator == OO_PlusPlus || Operator == OO_MinusMinus)
92                ? getLocStart()
93                : getOperatorLoc();
94   }
95 
getLocStart()96   SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); }
getLocEnd()97   SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); }
getSourceRange()98   SourceRange getSourceRange() const { return Range; }
99 
classof(const Stmt * T)100   static bool classof(const Stmt *T) {
101     return T->getStmtClass() == CXXOperatorCallExprClass;
102   }
103 
104   // Set the FP contractability status of this operator. Only meaningful for
105   // operations on floating point types.
setFPContractable(bool FPC)106   void setFPContractable(bool FPC) { FPContractable = FPC; }
107 
108   // Get the FP contractability status of this operator. Only meaningful for
109   // operations on floating point types.
isFPContractable()110   bool isFPContractable() const { return FPContractable; }
111 
112   friend class ASTStmtReader;
113   friend class ASTStmtWriter;
114 };
115 
116 /// Represents a call to a member function that
117 /// may be written either with member call syntax (e.g., "obj.func()"
118 /// or "objptr->func()") or with normal function-call syntax
119 /// ("func()") within a member function that ends up calling a member
120 /// function. The callee in either case is a MemberExpr that contains
121 /// both the object argument and the member function, while the
122 /// arguments are the arguments within the parentheses (not including
123 /// the object argument).
124 class CXXMemberCallExpr : public CallExpr {
125 public:
CXXMemberCallExpr(ASTContext & C,Expr * fn,ArrayRef<Expr * > args,QualType t,ExprValueKind VK,SourceLocation RP)126   CXXMemberCallExpr(ASTContext &C, Expr *fn, ArrayRef<Expr*> args,
127                     QualType t, ExprValueKind VK, SourceLocation RP)
128     : CallExpr(C, CXXMemberCallExprClass, fn, 0, args, t, VK, RP) {}
129 
CXXMemberCallExpr(ASTContext & C,EmptyShell Empty)130   CXXMemberCallExpr(ASTContext &C, EmptyShell Empty)
131     : CallExpr(C, CXXMemberCallExprClass, Empty) { }
132 
133   /// \brief Retrieves the implicit object argument for the member call.
134   ///
135   /// For example, in "x.f(5)", this returns the sub-expression "x".
136   Expr *getImplicitObjectArgument() const;
137 
138   /// \brief Retrieves the declaration of the called method.
139   CXXMethodDecl *getMethodDecl() const;
140 
141   /// \brief Retrieves the CXXRecordDecl for the underlying type of
142   /// the implicit object argument.
143   ///
144   /// Note that this is may not be the same declaration as that of the class
145   /// context of the CXXMethodDecl which this function is calling.
146   /// FIXME: Returns 0 for member pointer call exprs.
147   CXXRecordDecl *getRecordDecl() const;
148 
classof(const Stmt * T)149   static bool classof(const Stmt *T) {
150     return T->getStmtClass() == CXXMemberCallExprClass;
151   }
152 };
153 
154 /// \brief Represents a call to a CUDA kernel function.
155 class CUDAKernelCallExpr : public CallExpr {
156 private:
157   enum { CONFIG, END_PREARG };
158 
159 public:
CUDAKernelCallExpr(ASTContext & C,Expr * fn,CallExpr * Config,ArrayRef<Expr * > args,QualType t,ExprValueKind VK,SourceLocation RP)160   CUDAKernelCallExpr(ASTContext &C, Expr *fn, CallExpr *Config,
161                      ArrayRef<Expr*> args, QualType t, ExprValueKind VK,
162                      SourceLocation RP)
163     : CallExpr(C, CUDAKernelCallExprClass, fn, END_PREARG, args, t, VK, RP) {
164     setConfig(Config);
165   }
166 
CUDAKernelCallExpr(ASTContext & C,EmptyShell Empty)167   CUDAKernelCallExpr(ASTContext &C, EmptyShell Empty)
168     : CallExpr(C, CUDAKernelCallExprClass, END_PREARG, Empty) { }
169 
getConfig()170   const CallExpr *getConfig() const {
171     return cast_or_null<CallExpr>(getPreArg(CONFIG));
172   }
getConfig()173   CallExpr *getConfig() { return cast_or_null<CallExpr>(getPreArg(CONFIG)); }
setConfig(CallExpr * E)174   void setConfig(CallExpr *E) { setPreArg(CONFIG, E); }
175 
classof(const Stmt * T)176   static bool classof(const Stmt *T) {
177     return T->getStmtClass() == CUDAKernelCallExprClass;
178   }
179 };
180 
181 /// \brief Abstract class common to all of the C++ "named"/"keyword" casts.
182 ///
183 /// This abstract class is inherited by all of the classes
184 /// representing "named" casts: CXXStaticCastExpr for \c static_cast,
185 /// CXXDynamicCastExpr for \c dynamic_cast, CXXReinterpretCastExpr for
186 /// reinterpret_cast, and CXXConstCastExpr for \c const_cast.
187 class CXXNamedCastExpr : public ExplicitCastExpr {
188 private:
189   SourceLocation Loc; // the location of the casting op
190   SourceLocation RParenLoc; // the location of the right parenthesis
191   SourceRange AngleBrackets; // range for '<' '>'
192 
193 protected:
CXXNamedCastExpr(StmtClass SC,QualType ty,ExprValueKind VK,CastKind kind,Expr * op,unsigned PathSize,TypeSourceInfo * writtenTy,SourceLocation l,SourceLocation RParenLoc,SourceRange AngleBrackets)194   CXXNamedCastExpr(StmtClass SC, QualType ty, ExprValueKind VK,
195                    CastKind kind, Expr *op, unsigned PathSize,
196                    TypeSourceInfo *writtenTy, SourceLocation l,
197                    SourceLocation RParenLoc,
198                    SourceRange AngleBrackets)
199     : ExplicitCastExpr(SC, ty, VK, kind, op, PathSize, writtenTy), Loc(l),
200       RParenLoc(RParenLoc), AngleBrackets(AngleBrackets) {}
201 
CXXNamedCastExpr(StmtClass SC,EmptyShell Shell,unsigned PathSize)202   explicit CXXNamedCastExpr(StmtClass SC, EmptyShell Shell, unsigned PathSize)
203     : ExplicitCastExpr(SC, Shell, PathSize) { }
204 
205   friend class ASTStmtReader;
206 
207 public:
208   const char *getCastName() const;
209 
210   /// \brief Retrieve the location of the cast operator keyword, e.g.,
211   /// \c static_cast.
getOperatorLoc()212   SourceLocation getOperatorLoc() const { return Loc; }
213 
214   /// \brief Retrieve the location of the closing parenthesis.
getRParenLoc()215   SourceLocation getRParenLoc() const { return RParenLoc; }
216 
getLocStart()217   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
getLocEnd()218   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
getAngleBrackets()219   SourceRange getAngleBrackets() const LLVM_READONLY { return AngleBrackets; }
220 
classof(const Stmt * T)221   static bool classof(const Stmt *T) {
222     switch (T->getStmtClass()) {
223     case CXXStaticCastExprClass:
224     case CXXDynamicCastExprClass:
225     case CXXReinterpretCastExprClass:
226     case CXXConstCastExprClass:
227       return true;
228     default:
229       return false;
230     }
231   }
232 };
233 
234 /// \brief A C++ \c static_cast expression (C++ [expr.static.cast]).
235 ///
236 /// This expression node represents a C++ static cast, e.g.,
237 /// \c static_cast<int>(1.0).
238 class CXXStaticCastExpr : public CXXNamedCastExpr {
CXXStaticCastExpr(QualType ty,ExprValueKind vk,CastKind kind,Expr * op,unsigned pathSize,TypeSourceInfo * writtenTy,SourceLocation l,SourceLocation RParenLoc,SourceRange AngleBrackets)239   CXXStaticCastExpr(QualType ty, ExprValueKind vk, CastKind kind, Expr *op,
240                     unsigned pathSize, TypeSourceInfo *writtenTy,
241                     SourceLocation l, SourceLocation RParenLoc,
242                     SourceRange AngleBrackets)
243     : CXXNamedCastExpr(CXXStaticCastExprClass, ty, vk, kind, op, pathSize,
244                        writtenTy, l, RParenLoc, AngleBrackets) {}
245 
CXXStaticCastExpr(EmptyShell Empty,unsigned PathSize)246   explicit CXXStaticCastExpr(EmptyShell Empty, unsigned PathSize)
247     : CXXNamedCastExpr(CXXStaticCastExprClass, Empty, PathSize) { }
248 
249 public:
250   static CXXStaticCastExpr *Create(const ASTContext &Context, QualType T,
251                                    ExprValueKind VK, CastKind K, Expr *Op,
252                                    const CXXCastPath *Path,
253                                    TypeSourceInfo *Written, SourceLocation L,
254                                    SourceLocation RParenLoc,
255                                    SourceRange AngleBrackets);
256   static CXXStaticCastExpr *CreateEmpty(const ASTContext &Context,
257                                         unsigned PathSize);
258 
classof(const Stmt * T)259   static bool classof(const Stmt *T) {
260     return T->getStmtClass() == CXXStaticCastExprClass;
261   }
262 };
263 
264 /// \brief A C++ @c dynamic_cast expression (C++ [expr.dynamic.cast]).
265 ///
266 /// This expression node represents a dynamic cast, e.g.,
267 /// \c dynamic_cast<Derived*>(BasePtr). Such a cast may perform a run-time
268 /// check to determine how to perform the type conversion.
269 class CXXDynamicCastExpr : public CXXNamedCastExpr {
CXXDynamicCastExpr(QualType ty,ExprValueKind VK,CastKind kind,Expr * op,unsigned pathSize,TypeSourceInfo * writtenTy,SourceLocation l,SourceLocation RParenLoc,SourceRange AngleBrackets)270   CXXDynamicCastExpr(QualType ty, ExprValueKind VK, CastKind kind,
271                      Expr *op, unsigned pathSize, TypeSourceInfo *writtenTy,
272                      SourceLocation l, SourceLocation RParenLoc,
273                      SourceRange AngleBrackets)
274     : CXXNamedCastExpr(CXXDynamicCastExprClass, ty, VK, kind, op, pathSize,
275                        writtenTy, l, RParenLoc, AngleBrackets) {}
276 
CXXDynamicCastExpr(EmptyShell Empty,unsigned pathSize)277   explicit CXXDynamicCastExpr(EmptyShell Empty, unsigned pathSize)
278     : CXXNamedCastExpr(CXXDynamicCastExprClass, Empty, pathSize) { }
279 
280 public:
281   static CXXDynamicCastExpr *Create(const ASTContext &Context, QualType T,
282                                     ExprValueKind VK, CastKind Kind, Expr *Op,
283                                     const CXXCastPath *Path,
284                                     TypeSourceInfo *Written, SourceLocation L,
285                                     SourceLocation RParenLoc,
286                                     SourceRange AngleBrackets);
287 
288   static CXXDynamicCastExpr *CreateEmpty(const ASTContext &Context,
289                                          unsigned pathSize);
290 
291   bool isAlwaysNull() const;
292 
classof(const Stmt * T)293   static bool classof(const Stmt *T) {
294     return T->getStmtClass() == CXXDynamicCastExprClass;
295   }
296 };
297 
298 /// \brief A C++ @c reinterpret_cast expression (C++ [expr.reinterpret.cast]).
299 ///
300 /// This expression node represents a reinterpret cast, e.g.,
301 /// @c reinterpret_cast<int>(VoidPtr).
302 ///
303 /// A reinterpret_cast provides a differently-typed view of a value but
304 /// (in Clang, as in most C++ implementations) performs no actual work at
305 /// run time.
306 class CXXReinterpretCastExpr : public CXXNamedCastExpr {
CXXReinterpretCastExpr(QualType ty,ExprValueKind vk,CastKind kind,Expr * op,unsigned pathSize,TypeSourceInfo * writtenTy,SourceLocation l,SourceLocation RParenLoc,SourceRange AngleBrackets)307   CXXReinterpretCastExpr(QualType ty, ExprValueKind vk, CastKind kind,
308                          Expr *op, unsigned pathSize,
309                          TypeSourceInfo *writtenTy, SourceLocation l,
310                          SourceLocation RParenLoc,
311                          SourceRange AngleBrackets)
312     : CXXNamedCastExpr(CXXReinterpretCastExprClass, ty, vk, kind, op,
313                        pathSize, writtenTy, l, RParenLoc, AngleBrackets) {}
314 
CXXReinterpretCastExpr(EmptyShell Empty,unsigned pathSize)315   CXXReinterpretCastExpr(EmptyShell Empty, unsigned pathSize)
316     : CXXNamedCastExpr(CXXReinterpretCastExprClass, Empty, pathSize) { }
317 
318 public:
319   static CXXReinterpretCastExpr *Create(const ASTContext &Context, QualType T,
320                                         ExprValueKind VK, CastKind Kind,
321                                         Expr *Op, const CXXCastPath *Path,
322                                  TypeSourceInfo *WrittenTy, SourceLocation L,
323                                         SourceLocation RParenLoc,
324                                         SourceRange AngleBrackets);
325   static CXXReinterpretCastExpr *CreateEmpty(const ASTContext &Context,
326                                              unsigned pathSize);
327 
classof(const Stmt * T)328   static bool classof(const Stmt *T) {
329     return T->getStmtClass() == CXXReinterpretCastExprClass;
330   }
331 };
332 
333 /// \brief A C++ \c const_cast expression (C++ [expr.const.cast]).
334 ///
335 /// This expression node represents a const cast, e.g.,
336 /// \c const_cast<char*>(PtrToConstChar).
337 ///
338 /// A const_cast can remove type qualifiers but does not change the underlying
339 /// value.
340 class CXXConstCastExpr : public CXXNamedCastExpr {
CXXConstCastExpr(QualType ty,ExprValueKind VK,Expr * op,TypeSourceInfo * writtenTy,SourceLocation l,SourceLocation RParenLoc,SourceRange AngleBrackets)341   CXXConstCastExpr(QualType ty, ExprValueKind VK, Expr *op,
342                    TypeSourceInfo *writtenTy, SourceLocation l,
343                    SourceLocation RParenLoc, SourceRange AngleBrackets)
344     : CXXNamedCastExpr(CXXConstCastExprClass, ty, VK, CK_NoOp, op,
345                        0, writtenTy, l, RParenLoc, AngleBrackets) {}
346 
CXXConstCastExpr(EmptyShell Empty)347   explicit CXXConstCastExpr(EmptyShell Empty)
348     : CXXNamedCastExpr(CXXConstCastExprClass, Empty, 0) { }
349 
350 public:
351   static CXXConstCastExpr *Create(const ASTContext &Context, QualType T,
352                                   ExprValueKind VK, Expr *Op,
353                                   TypeSourceInfo *WrittenTy, SourceLocation L,
354                                   SourceLocation RParenLoc,
355                                   SourceRange AngleBrackets);
356   static CXXConstCastExpr *CreateEmpty(const ASTContext &Context);
357 
classof(const Stmt * T)358   static bool classof(const Stmt *T) {
359     return T->getStmtClass() == CXXConstCastExprClass;
360   }
361 };
362 
363 /// \brief A call to a literal operator (C++11 [over.literal])
364 /// written as a user-defined literal (C++11 [lit.ext]).
365 ///
366 /// Represents a user-defined literal, e.g. "foo"_bar or 1.23_xyz. While this
367 /// is semantically equivalent to a normal call, this AST node provides better
368 /// information about the syntactic representation of the literal.
369 ///
370 /// Since literal operators are never found by ADL and can only be declared at
371 /// namespace scope, a user-defined literal is never dependent.
372 class UserDefinedLiteral : public CallExpr {
373   /// \brief The location of a ud-suffix within the literal.
374   SourceLocation UDSuffixLoc;
375 
376 public:
UserDefinedLiteral(const ASTContext & C,Expr * Fn,ArrayRef<Expr * > Args,QualType T,ExprValueKind VK,SourceLocation LitEndLoc,SourceLocation SuffixLoc)377   UserDefinedLiteral(const ASTContext &C, Expr *Fn, ArrayRef<Expr*> Args,
378                      QualType T, ExprValueKind VK, SourceLocation LitEndLoc,
379                      SourceLocation SuffixLoc)
380     : CallExpr(C, UserDefinedLiteralClass, Fn, 0, Args, T, VK, LitEndLoc),
381       UDSuffixLoc(SuffixLoc) {}
UserDefinedLiteral(const ASTContext & C,EmptyShell Empty)382   explicit UserDefinedLiteral(const ASTContext &C, EmptyShell Empty)
383     : CallExpr(C, UserDefinedLiteralClass, Empty) {}
384 
385   /// The kind of literal operator which is invoked.
386   enum LiteralOperatorKind {
387     LOK_Raw,      ///< Raw form: operator "" X (const char *)
388     LOK_Template, ///< Raw form: operator "" X<cs...> ()
389     LOK_Integer,  ///< operator "" X (unsigned long long)
390     LOK_Floating, ///< operator "" X (long double)
391     LOK_String,   ///< operator "" X (const CharT *, size_t)
392     LOK_Character ///< operator "" X (CharT)
393   };
394 
395   /// \brief Returns the kind of literal operator invocation
396   /// which this expression represents.
397   LiteralOperatorKind getLiteralOperatorKind() const;
398 
399   /// \brief If this is not a raw user-defined literal, get the
400   /// underlying cooked literal (representing the literal with the suffix
401   /// removed).
402   Expr *getCookedLiteral();
getCookedLiteral()403   const Expr *getCookedLiteral() const {
404     return const_cast<UserDefinedLiteral*>(this)->getCookedLiteral();
405   }
406 
getLocStart()407   SourceLocation getLocStart() const {
408     if (getLiteralOperatorKind() == LOK_Template)
409       return getRParenLoc();
410     return getArg(0)->getLocStart();
411   }
getLocEnd()412   SourceLocation getLocEnd() const { return getRParenLoc(); }
413 
414 
415   /// \brief Returns the location of a ud-suffix in the expression.
416   ///
417   /// For a string literal, there may be multiple identical suffixes. This
418   /// returns the first.
getUDSuffixLoc()419   SourceLocation getUDSuffixLoc() const { return UDSuffixLoc; }
420 
421   /// \brief Returns the ud-suffix specified for this literal.
422   const IdentifierInfo *getUDSuffix() const;
423 
classof(const Stmt * S)424   static bool classof(const Stmt *S) {
425     return S->getStmtClass() == UserDefinedLiteralClass;
426   }
427 
428   friend class ASTStmtReader;
429   friend class ASTStmtWriter;
430 };
431 
432 /// \brief A boolean literal, per ([C++ lex.bool] Boolean literals).
433 ///
434 class CXXBoolLiteralExpr : public Expr {
435   bool Value;
436   SourceLocation Loc;
437 public:
CXXBoolLiteralExpr(bool val,QualType Ty,SourceLocation l)438   CXXBoolLiteralExpr(bool val, QualType Ty, SourceLocation l) :
439     Expr(CXXBoolLiteralExprClass, Ty, VK_RValue, OK_Ordinary, false, false,
440          false, false),
441     Value(val), Loc(l) {}
442 
CXXBoolLiteralExpr(EmptyShell Empty)443   explicit CXXBoolLiteralExpr(EmptyShell Empty)
444     : Expr(CXXBoolLiteralExprClass, Empty) { }
445 
getValue()446   bool getValue() const { return Value; }
setValue(bool V)447   void setValue(bool V) { Value = V; }
448 
getLocStart()449   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
getLocEnd()450   SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
451 
getLocation()452   SourceLocation getLocation() const { return Loc; }
setLocation(SourceLocation L)453   void setLocation(SourceLocation L) { Loc = L; }
454 
classof(const Stmt * T)455   static bool classof(const Stmt *T) {
456     return T->getStmtClass() == CXXBoolLiteralExprClass;
457   }
458 
459   // Iterators
children()460   child_range children() {
461     return child_range(child_iterator(), child_iterator());
462   }
463 };
464 
465 /// \brief The null pointer literal (C++11 [lex.nullptr])
466 ///
467 /// Introduced in C++11, the only literal of type \c nullptr_t is \c nullptr.
468 class CXXNullPtrLiteralExpr : public Expr {
469   SourceLocation Loc;
470 public:
CXXNullPtrLiteralExpr(QualType Ty,SourceLocation l)471   CXXNullPtrLiteralExpr(QualType Ty, SourceLocation l) :
472     Expr(CXXNullPtrLiteralExprClass, Ty, VK_RValue, OK_Ordinary, false, false,
473          false, false),
474     Loc(l) {}
475 
CXXNullPtrLiteralExpr(EmptyShell Empty)476   explicit CXXNullPtrLiteralExpr(EmptyShell Empty)
477     : Expr(CXXNullPtrLiteralExprClass, Empty) { }
478 
getLocStart()479   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
getLocEnd()480   SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
481 
getLocation()482   SourceLocation getLocation() const { return Loc; }
setLocation(SourceLocation L)483   void setLocation(SourceLocation L) { Loc = L; }
484 
classof(const Stmt * T)485   static bool classof(const Stmt *T) {
486     return T->getStmtClass() == CXXNullPtrLiteralExprClass;
487   }
488 
children()489   child_range children() {
490     return child_range(child_iterator(), child_iterator());
491   }
492 };
493 
494 /// \brief Implicit construction of a std::initializer_list<T> object from an
495 /// array temporary within list-initialization (C++11 [dcl.init.list]p5).
496 class CXXStdInitializerListExpr : public Expr {
497   Stmt *SubExpr;
498 
CXXStdInitializerListExpr(EmptyShell Empty)499   CXXStdInitializerListExpr(EmptyShell Empty)
500     : Expr(CXXStdInitializerListExprClass, Empty), SubExpr(nullptr) {}
501 
502 public:
CXXStdInitializerListExpr(QualType Ty,Expr * SubExpr)503   CXXStdInitializerListExpr(QualType Ty, Expr *SubExpr)
504     : Expr(CXXStdInitializerListExprClass, Ty, VK_RValue, OK_Ordinary,
505            Ty->isDependentType(), SubExpr->isValueDependent(),
506            SubExpr->isInstantiationDependent(),
507            SubExpr->containsUnexpandedParameterPack()),
508       SubExpr(SubExpr) {}
509 
getSubExpr()510   Expr *getSubExpr() { return static_cast<Expr*>(SubExpr); }
getSubExpr()511   const Expr *getSubExpr() const { return static_cast<const Expr*>(SubExpr); }
512 
getLocStart()513   SourceLocation getLocStart() const LLVM_READONLY {
514     return SubExpr->getLocStart();
515   }
getLocEnd()516   SourceLocation getLocEnd() const LLVM_READONLY {
517     return SubExpr->getLocEnd();
518   }
getSourceRange()519   SourceRange getSourceRange() const LLVM_READONLY {
520     return SubExpr->getSourceRange();
521   }
522 
classof(const Stmt * S)523   static bool classof(const Stmt *S) {
524     return S->getStmtClass() == CXXStdInitializerListExprClass;
525   }
526 
children()527   child_range children() { return child_range(&SubExpr, &SubExpr + 1); }
528 
529   friend class ASTReader;
530   friend class ASTStmtReader;
531 };
532 
533 /// A C++ \c typeid expression (C++ [expr.typeid]), which gets
534 /// the \c type_info that corresponds to the supplied type, or the (possibly
535 /// dynamic) type of the supplied expression.
536 ///
537 /// This represents code like \c typeid(int) or \c typeid(*objPtr)
538 class CXXTypeidExpr : public Expr {
539 private:
540   llvm::PointerUnion<Stmt *, TypeSourceInfo *> Operand;
541   SourceRange Range;
542 
543 public:
CXXTypeidExpr(QualType Ty,TypeSourceInfo * Operand,SourceRange R)544   CXXTypeidExpr(QualType Ty, TypeSourceInfo *Operand, SourceRange R)
545     : Expr(CXXTypeidExprClass, Ty, VK_LValue, OK_Ordinary,
546            // typeid is never type-dependent (C++ [temp.dep.expr]p4)
547            false,
548            // typeid is value-dependent if the type or expression are dependent
549            Operand->getType()->isDependentType(),
550            Operand->getType()->isInstantiationDependentType(),
551            Operand->getType()->containsUnexpandedParameterPack()),
552       Operand(Operand), Range(R) { }
553 
CXXTypeidExpr(QualType Ty,Expr * Operand,SourceRange R)554   CXXTypeidExpr(QualType Ty, Expr *Operand, SourceRange R)
555     : Expr(CXXTypeidExprClass, Ty, VK_LValue, OK_Ordinary,
556         // typeid is never type-dependent (C++ [temp.dep.expr]p4)
557            false,
558         // typeid is value-dependent if the type or expression are dependent
559            Operand->isTypeDependent() || Operand->isValueDependent(),
560            Operand->isInstantiationDependent(),
561            Operand->containsUnexpandedParameterPack()),
562       Operand(Operand), Range(R) { }
563 
CXXTypeidExpr(EmptyShell Empty,bool isExpr)564   CXXTypeidExpr(EmptyShell Empty, bool isExpr)
565     : Expr(CXXTypeidExprClass, Empty) {
566     if (isExpr)
567       Operand = (Expr*)nullptr;
568     else
569       Operand = (TypeSourceInfo*)nullptr;
570   }
571 
572   /// Determine whether this typeid has a type operand which is potentially
573   /// evaluated, per C++11 [expr.typeid]p3.
574   bool isPotentiallyEvaluated() const;
575 
isTypeOperand()576   bool isTypeOperand() const { return Operand.is<TypeSourceInfo *>(); }
577 
578   /// \brief Retrieves the type operand of this typeid() expression after
579   /// various required adjustments (removing reference types, cv-qualifiers).
580   QualType getTypeOperand(ASTContext &Context) const;
581 
582   /// \brief Retrieve source information for the type operand.
getTypeOperandSourceInfo()583   TypeSourceInfo *getTypeOperandSourceInfo() const {
584     assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
585     return Operand.get<TypeSourceInfo *>();
586   }
587 
setTypeOperandSourceInfo(TypeSourceInfo * TSI)588   void setTypeOperandSourceInfo(TypeSourceInfo *TSI) {
589     assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
590     Operand = TSI;
591   }
592 
getExprOperand()593   Expr *getExprOperand() const {
594     assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)");
595     return static_cast<Expr*>(Operand.get<Stmt *>());
596   }
597 
setExprOperand(Expr * E)598   void setExprOperand(Expr *E) {
599     assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)");
600     Operand = E;
601   }
602 
getLocStart()603   SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); }
getLocEnd()604   SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); }
getSourceRange()605   SourceRange getSourceRange() const LLVM_READONLY { return Range; }
setSourceRange(SourceRange R)606   void setSourceRange(SourceRange R) { Range = R; }
607 
classof(const Stmt * T)608   static bool classof(const Stmt *T) {
609     return T->getStmtClass() == CXXTypeidExprClass;
610   }
611 
612   // Iterators
children()613   child_range children() {
614     if (isTypeOperand())
615       return child_range(child_iterator(), child_iterator());
616     Stmt **begin = reinterpret_cast<Stmt**>(&Operand);
617     return child_range(begin, begin + 1);
618   }
619 };
620 
621 /// \brief A member reference to an MSPropertyDecl.
622 ///
623 /// This expression always has pseudo-object type, and therefore it is
624 /// typically not encountered in a fully-typechecked expression except
625 /// within the syntactic form of a PseudoObjectExpr.
626 class MSPropertyRefExpr : public Expr {
627   Expr *BaseExpr;
628   MSPropertyDecl *TheDecl;
629   SourceLocation MemberLoc;
630   bool IsArrow;
631   NestedNameSpecifierLoc QualifierLoc;
632 
633 public:
MSPropertyRefExpr(Expr * baseExpr,MSPropertyDecl * decl,bool isArrow,QualType ty,ExprValueKind VK,NestedNameSpecifierLoc qualifierLoc,SourceLocation nameLoc)634   MSPropertyRefExpr(Expr *baseExpr, MSPropertyDecl *decl, bool isArrow,
635                     QualType ty, ExprValueKind VK,
636                     NestedNameSpecifierLoc qualifierLoc,
637                     SourceLocation nameLoc)
638   : Expr(MSPropertyRefExprClass, ty, VK, OK_Ordinary,
639          /*type-dependent*/ false, baseExpr->isValueDependent(),
640          baseExpr->isInstantiationDependent(),
641          baseExpr->containsUnexpandedParameterPack()),
642     BaseExpr(baseExpr), TheDecl(decl),
643     MemberLoc(nameLoc), IsArrow(isArrow),
644     QualifierLoc(qualifierLoc) {}
645 
MSPropertyRefExpr(EmptyShell Empty)646   MSPropertyRefExpr(EmptyShell Empty) : Expr(MSPropertyRefExprClass, Empty) {}
647 
getSourceRange()648   SourceRange getSourceRange() const LLVM_READONLY {
649     return SourceRange(getLocStart(), getLocEnd());
650   }
isImplicitAccess()651   bool isImplicitAccess() const {
652     return getBaseExpr() && getBaseExpr()->isImplicitCXXThis();
653   }
getLocStart()654   SourceLocation getLocStart() const {
655     if (!isImplicitAccess())
656       return BaseExpr->getLocStart();
657     else if (QualifierLoc)
658       return QualifierLoc.getBeginLoc();
659     else
660         return MemberLoc;
661   }
getLocEnd()662   SourceLocation getLocEnd() const { return getMemberLoc(); }
663 
children()664   child_range children() {
665     return child_range((Stmt**)&BaseExpr, (Stmt**)&BaseExpr + 1);
666   }
classof(const Stmt * T)667   static bool classof(const Stmt *T) {
668     return T->getStmtClass() == MSPropertyRefExprClass;
669   }
670 
getBaseExpr()671   Expr *getBaseExpr() const { return BaseExpr; }
getPropertyDecl()672   MSPropertyDecl *getPropertyDecl() const { return TheDecl; }
isArrow()673   bool isArrow() const { return IsArrow; }
getMemberLoc()674   SourceLocation getMemberLoc() const { return MemberLoc; }
getQualifierLoc()675   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
676 
677   friend class ASTStmtReader;
678 };
679 
680 /// MS property subscript expression.
681 /// MSVC supports 'property' attribute and allows to apply it to the
682 /// declaration of an empty array in a class or structure definition.
683 /// For example:
684 /// \code
685 /// __declspec(property(get=GetX, put=PutX)) int x[];
686 /// \endcode
687 /// The above statement indicates that x[] can be used with one or more array
688 /// indices. In this case, i=p->x[a][b] will be turned into i=p->GetX(a, b), and
689 /// p->x[a][b] = i will be turned into p->PutX(a, b, i).
690 /// This is a syntactic pseudo-object expression.
691 class MSPropertySubscriptExpr : public Expr {
692   friend class ASTStmtReader;
693   enum { BASE_EXPR, IDX_EXPR, NUM_SUBEXPRS = 2 };
694   Stmt *SubExprs[NUM_SUBEXPRS];
695   SourceLocation RBracketLoc;
696 
setBase(Expr * Base)697   void setBase(Expr *Base) { SubExprs[BASE_EXPR] = Base; }
setIdx(Expr * Idx)698   void setIdx(Expr *Idx) { SubExprs[IDX_EXPR] = Idx; }
699 
700 public:
MSPropertySubscriptExpr(Expr * Base,Expr * Idx,QualType Ty,ExprValueKind VK,ExprObjectKind OK,SourceLocation RBracketLoc)701   MSPropertySubscriptExpr(Expr *Base, Expr *Idx, QualType Ty, ExprValueKind VK,
702                           ExprObjectKind OK, SourceLocation RBracketLoc)
703       : Expr(MSPropertySubscriptExprClass, Ty, VK, OK, Idx->isTypeDependent(),
704              Idx->isValueDependent(), Idx->isInstantiationDependent(),
705              Idx->containsUnexpandedParameterPack()),
706         RBracketLoc(RBracketLoc) {
707     SubExprs[BASE_EXPR] = Base;
708     SubExprs[IDX_EXPR] = Idx;
709   }
710 
711   /// \brief Create an empty array subscript expression.
MSPropertySubscriptExpr(EmptyShell Shell)712   explicit MSPropertySubscriptExpr(EmptyShell Shell)
713       : Expr(MSPropertySubscriptExprClass, Shell) {}
714 
getBase()715   Expr *getBase() { return cast<Expr>(SubExprs[BASE_EXPR]); }
getBase()716   const Expr *getBase() const { return cast<Expr>(SubExprs[BASE_EXPR]); }
717 
getIdx()718   Expr *getIdx() { return cast<Expr>(SubExprs[IDX_EXPR]); }
getIdx()719   const Expr *getIdx() const { return cast<Expr>(SubExprs[IDX_EXPR]); }
720 
getLocStart()721   SourceLocation getLocStart() const LLVM_READONLY {
722     return getBase()->getLocStart();
723   }
getLocEnd()724   SourceLocation getLocEnd() const LLVM_READONLY { return RBracketLoc; }
725 
getRBracketLoc()726   SourceLocation getRBracketLoc() const { return RBracketLoc; }
setRBracketLoc(SourceLocation L)727   void setRBracketLoc(SourceLocation L) { RBracketLoc = L; }
728 
getExprLoc()729   SourceLocation getExprLoc() const LLVM_READONLY {
730     return getBase()->getExprLoc();
731   }
732 
classof(const Stmt * T)733   static bool classof(const Stmt *T) {
734     return T->getStmtClass() == MSPropertySubscriptExprClass;
735   }
736 
737   // Iterators
children()738   child_range children() {
739     return child_range(&SubExprs[0], &SubExprs[0] + NUM_SUBEXPRS);
740   }
741 };
742 
743 /// A Microsoft C++ @c __uuidof expression, which gets
744 /// the _GUID that corresponds to the supplied type or expression.
745 ///
746 /// This represents code like @c __uuidof(COMTYPE) or @c __uuidof(*comPtr)
747 class CXXUuidofExpr : public Expr {
748 private:
749   llvm::PointerUnion<Stmt *, TypeSourceInfo *> Operand;
750   SourceRange Range;
751 
752 public:
CXXUuidofExpr(QualType Ty,TypeSourceInfo * Operand,SourceRange R)753   CXXUuidofExpr(QualType Ty, TypeSourceInfo *Operand, SourceRange R)
754     : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary,
755            false, Operand->getType()->isDependentType(),
756            Operand->getType()->isInstantiationDependentType(),
757            Operand->getType()->containsUnexpandedParameterPack()),
758       Operand(Operand), Range(R) { }
759 
CXXUuidofExpr(QualType Ty,Expr * Operand,SourceRange R)760   CXXUuidofExpr(QualType Ty, Expr *Operand, SourceRange R)
761     : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary,
762            false, Operand->isTypeDependent(),
763            Operand->isInstantiationDependent(),
764            Operand->containsUnexpandedParameterPack()),
765       Operand(Operand), Range(R) { }
766 
CXXUuidofExpr(EmptyShell Empty,bool isExpr)767   CXXUuidofExpr(EmptyShell Empty, bool isExpr)
768     : Expr(CXXUuidofExprClass, Empty) {
769     if (isExpr)
770       Operand = (Expr*)nullptr;
771     else
772       Operand = (TypeSourceInfo*)nullptr;
773   }
774 
isTypeOperand()775   bool isTypeOperand() const { return Operand.is<TypeSourceInfo *>(); }
776 
777   /// \brief Retrieves the type operand of this __uuidof() expression after
778   /// various required adjustments (removing reference types, cv-qualifiers).
779   QualType getTypeOperand(ASTContext &Context) const;
780 
781   /// \brief Retrieve source information for the type operand.
getTypeOperandSourceInfo()782   TypeSourceInfo *getTypeOperandSourceInfo() const {
783     assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)");
784     return Operand.get<TypeSourceInfo *>();
785   }
786 
setTypeOperandSourceInfo(TypeSourceInfo * TSI)787   void setTypeOperandSourceInfo(TypeSourceInfo *TSI) {
788     assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)");
789     Operand = TSI;
790   }
791 
getExprOperand()792   Expr *getExprOperand() const {
793     assert(!isTypeOperand() && "Cannot call getExprOperand for __uuidof(type)");
794     return static_cast<Expr*>(Operand.get<Stmt *>());
795   }
796 
setExprOperand(Expr * E)797   void setExprOperand(Expr *E) {
798     assert(!isTypeOperand() && "Cannot call getExprOperand for __uuidof(type)");
799     Operand = E;
800   }
801 
802   StringRef getUuidAsStringRef(ASTContext &Context) const;
803 
getLocStart()804   SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); }
getLocEnd()805   SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); }
getSourceRange()806   SourceRange getSourceRange() const LLVM_READONLY { return Range; }
setSourceRange(SourceRange R)807   void setSourceRange(SourceRange R) { Range = R; }
808 
classof(const Stmt * T)809   static bool classof(const Stmt *T) {
810     return T->getStmtClass() == CXXUuidofExprClass;
811   }
812 
813   /// Grabs __declspec(uuid()) off a type, or returns 0 if we cannot resolve to
814   /// a single GUID.
815   static const UuidAttr *GetUuidAttrOfType(QualType QT,
816                                            bool *HasMultipleGUIDsPtr = nullptr);
817 
818   // Iterators
children()819   child_range children() {
820     if (isTypeOperand())
821       return child_range(child_iterator(), child_iterator());
822     Stmt **begin = reinterpret_cast<Stmt**>(&Operand);
823     return child_range(begin, begin + 1);
824   }
825 };
826 
827 /// \brief Represents the \c this expression in C++.
828 ///
829 /// This is a pointer to the object on which the current member function is
830 /// executing (C++ [expr.prim]p3). Example:
831 ///
832 /// \code
833 /// class Foo {
834 /// public:
835 ///   void bar();
836 ///   void test() { this->bar(); }
837 /// };
838 /// \endcode
839 class CXXThisExpr : public Expr {
840   SourceLocation Loc;
841   bool Implicit : 1;
842 
843 public:
CXXThisExpr(SourceLocation L,QualType Type,bool isImplicit)844   CXXThisExpr(SourceLocation L, QualType Type, bool isImplicit)
845     : Expr(CXXThisExprClass, Type, VK_RValue, OK_Ordinary,
846            // 'this' is type-dependent if the class type of the enclosing
847            // member function is dependent (C++ [temp.dep.expr]p2)
848            Type->isDependentType(), Type->isDependentType(),
849            Type->isInstantiationDependentType(),
850            /*ContainsUnexpandedParameterPack=*/false),
851       Loc(L), Implicit(isImplicit) { }
852 
CXXThisExpr(EmptyShell Empty)853   CXXThisExpr(EmptyShell Empty) : Expr(CXXThisExprClass, Empty) {}
854 
getLocation()855   SourceLocation getLocation() const { return Loc; }
setLocation(SourceLocation L)856   void setLocation(SourceLocation L) { Loc = L; }
857 
getLocStart()858   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
getLocEnd()859   SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
860 
isImplicit()861   bool isImplicit() const { return Implicit; }
setImplicit(bool I)862   void setImplicit(bool I) { Implicit = I; }
863 
classof(const Stmt * T)864   static bool classof(const Stmt *T) {
865     return T->getStmtClass() == CXXThisExprClass;
866   }
867 
868   // Iterators
children()869   child_range children() {
870     return child_range(child_iterator(), child_iterator());
871   }
872 };
873 
874 /// \brief A C++ throw-expression (C++ [except.throw]).
875 ///
876 /// This handles 'throw' (for re-throwing the current exception) and
877 /// 'throw' assignment-expression.  When assignment-expression isn't
878 /// present, Op will be null.
879 class CXXThrowExpr : public Expr {
880   Stmt *Op;
881   SourceLocation ThrowLoc;
882   /// \brief Whether the thrown variable (if any) is in scope.
883   unsigned IsThrownVariableInScope : 1;
884 
885   friend class ASTStmtReader;
886 
887 public:
888   // \p Ty is the void type which is used as the result type of the
889   // expression.  The \p l is the location of the throw keyword.  \p expr
890   // can by null, if the optional expression to throw isn't present.
CXXThrowExpr(Expr * expr,QualType Ty,SourceLocation l,bool IsThrownVariableInScope)891   CXXThrowExpr(Expr *expr, QualType Ty, SourceLocation l,
892                bool IsThrownVariableInScope) :
893     Expr(CXXThrowExprClass, Ty, VK_RValue, OK_Ordinary, false, false,
894          expr && expr->isInstantiationDependent(),
895          expr && expr->containsUnexpandedParameterPack()),
896     Op(expr), ThrowLoc(l), IsThrownVariableInScope(IsThrownVariableInScope) {}
CXXThrowExpr(EmptyShell Empty)897   CXXThrowExpr(EmptyShell Empty) : Expr(CXXThrowExprClass, Empty) {}
898 
getSubExpr()899   const Expr *getSubExpr() const { return cast_or_null<Expr>(Op); }
getSubExpr()900   Expr *getSubExpr() { return cast_or_null<Expr>(Op); }
901 
getThrowLoc()902   SourceLocation getThrowLoc() const { return ThrowLoc; }
903 
904   /// \brief Determines whether the variable thrown by this expression (if any!)
905   /// is within the innermost try block.
906   ///
907   /// This information is required to determine whether the NRVO can apply to
908   /// this variable.
isThrownVariableInScope()909   bool isThrownVariableInScope() const { return IsThrownVariableInScope; }
910 
getLocStart()911   SourceLocation getLocStart() const LLVM_READONLY { return ThrowLoc; }
getLocEnd()912   SourceLocation getLocEnd() const LLVM_READONLY {
913     if (!getSubExpr())
914       return ThrowLoc;
915     return getSubExpr()->getLocEnd();
916   }
917 
classof(const Stmt * T)918   static bool classof(const Stmt *T) {
919     return T->getStmtClass() == CXXThrowExprClass;
920   }
921 
922   // Iterators
children()923   child_range children() {
924     return child_range(&Op, Op ? &Op+1 : &Op);
925   }
926 };
927 
928 /// \brief A default argument (C++ [dcl.fct.default]).
929 ///
930 /// This wraps up a function call argument that was created from the
931 /// corresponding parameter's default argument, when the call did not
932 /// explicitly supply arguments for all of the parameters.
933 class CXXDefaultArgExpr : public Expr {
934   /// \brief The parameter whose default is being used.
935   ///
936   /// When the bit is set, the subexpression is stored after the
937   /// CXXDefaultArgExpr itself. When the bit is clear, the parameter's
938   /// actual default expression is the subexpression.
939   llvm::PointerIntPair<ParmVarDecl *, 1, bool> Param;
940 
941   /// \brief The location where the default argument expression was used.
942   SourceLocation Loc;
943 
CXXDefaultArgExpr(StmtClass SC,SourceLocation Loc,ParmVarDecl * param)944   CXXDefaultArgExpr(StmtClass SC, SourceLocation Loc, ParmVarDecl *param)
945     : Expr(SC,
946            param->hasUnparsedDefaultArg()
947              ? param->getType().getNonReferenceType()
948              : param->getDefaultArg()->getType(),
949            param->getDefaultArg()->getValueKind(),
950            param->getDefaultArg()->getObjectKind(), false, false, false, false),
951       Param(param, false), Loc(Loc) { }
952 
CXXDefaultArgExpr(StmtClass SC,SourceLocation Loc,ParmVarDecl * param,Expr * SubExpr)953   CXXDefaultArgExpr(StmtClass SC, SourceLocation Loc, ParmVarDecl *param,
954                     Expr *SubExpr)
955     : Expr(SC, SubExpr->getType(),
956            SubExpr->getValueKind(), SubExpr->getObjectKind(),
957            false, false, false, false),
958       Param(param, true), Loc(Loc) {
959     *reinterpret_cast<Expr **>(this + 1) = SubExpr;
960   }
961 
962 public:
CXXDefaultArgExpr(EmptyShell Empty)963   CXXDefaultArgExpr(EmptyShell Empty) : Expr(CXXDefaultArgExprClass, Empty) {}
964 
965   // \p Param is the parameter whose default argument is used by this
966   // expression.
Create(const ASTContext & C,SourceLocation Loc,ParmVarDecl * Param)967   static CXXDefaultArgExpr *Create(const ASTContext &C, SourceLocation Loc,
968                                    ParmVarDecl *Param) {
969     return new (C) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param);
970   }
971 
972   // \p Param is the parameter whose default argument is used by this
973   // expression, and \p SubExpr is the expression that will actually be used.
974   static CXXDefaultArgExpr *Create(const ASTContext &C, SourceLocation Loc,
975                                    ParmVarDecl *Param, Expr *SubExpr);
976 
977   // Retrieve the parameter that the argument was created from.
getParam()978   const ParmVarDecl *getParam() const { return Param.getPointer(); }
getParam()979   ParmVarDecl *getParam() { return Param.getPointer(); }
980 
981   // Retrieve the actual argument to the function call.
getExpr()982   const Expr *getExpr() const {
983     if (Param.getInt())
984       return *reinterpret_cast<Expr const * const*> (this + 1);
985     return getParam()->getDefaultArg();
986   }
getExpr()987   Expr *getExpr() {
988     if (Param.getInt())
989       return *reinterpret_cast<Expr **> (this + 1);
990     return getParam()->getDefaultArg();
991   }
992 
993   /// \brief Retrieve the location where this default argument was actually
994   /// used.
getUsedLocation()995   SourceLocation getUsedLocation() const { return Loc; }
996 
997   /// Default argument expressions have no representation in the
998   /// source, so they have an empty source range.
getLocStart()999   SourceLocation getLocStart() const LLVM_READONLY { return SourceLocation(); }
getLocEnd()1000   SourceLocation getLocEnd() const LLVM_READONLY { return SourceLocation(); }
1001 
getExprLoc()1002   SourceLocation getExprLoc() const LLVM_READONLY { return Loc; }
1003 
classof(const Stmt * T)1004   static bool classof(const Stmt *T) {
1005     return T->getStmtClass() == CXXDefaultArgExprClass;
1006   }
1007 
1008   // Iterators
children()1009   child_range children() {
1010     return child_range(child_iterator(), child_iterator());
1011   }
1012 
1013   friend class ASTStmtReader;
1014   friend class ASTStmtWriter;
1015 };
1016 
1017 /// \brief A use of a default initializer in a constructor or in aggregate
1018 /// initialization.
1019 ///
1020 /// This wraps a use of a C++ default initializer (technically,
1021 /// a brace-or-equal-initializer for a non-static data member) when it
1022 /// is implicitly used in a mem-initializer-list in a constructor
1023 /// (C++11 [class.base.init]p8) or in aggregate initialization
1024 /// (C++1y [dcl.init.aggr]p7).
1025 class CXXDefaultInitExpr : public Expr {
1026   /// \brief The field whose default is being used.
1027   FieldDecl *Field;
1028 
1029   /// \brief The location where the default initializer expression was used.
1030   SourceLocation Loc;
1031 
1032   CXXDefaultInitExpr(const ASTContext &C, SourceLocation Loc, FieldDecl *Field,
1033                      QualType T);
1034 
CXXDefaultInitExpr(EmptyShell Empty)1035   CXXDefaultInitExpr(EmptyShell Empty) : Expr(CXXDefaultInitExprClass, Empty) {}
1036 
1037 public:
1038   /// \p Field is the non-static data member whose default initializer is used
1039   /// by this expression.
Create(const ASTContext & C,SourceLocation Loc,FieldDecl * Field)1040   static CXXDefaultInitExpr *Create(const ASTContext &C, SourceLocation Loc,
1041                                     FieldDecl *Field) {
1042     return new (C) CXXDefaultInitExpr(C, Loc, Field, Field->getType());
1043   }
1044 
1045   /// \brief Get the field whose initializer will be used.
getField()1046   FieldDecl *getField() { return Field; }
getField()1047   const FieldDecl *getField() const { return Field; }
1048 
1049   /// \brief Get the initialization expression that will be used.
getExpr()1050   const Expr *getExpr() const {
1051     assert(Field->getInClassInitializer() && "initializer hasn't been parsed");
1052     return Field->getInClassInitializer();
1053   }
getExpr()1054   Expr *getExpr() {
1055     assert(Field->getInClassInitializer() && "initializer hasn't been parsed");
1056     return Field->getInClassInitializer();
1057   }
1058 
getLocStart()1059   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
getLocEnd()1060   SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
1061 
classof(const Stmt * T)1062   static bool classof(const Stmt *T) {
1063     return T->getStmtClass() == CXXDefaultInitExprClass;
1064   }
1065 
1066   // Iterators
children()1067   child_range children() {
1068     return child_range(child_iterator(), child_iterator());
1069   }
1070 
1071   friend class ASTReader;
1072   friend class ASTStmtReader;
1073 };
1074 
1075 /// \brief Represents a C++ temporary.
1076 class CXXTemporary {
1077   /// \brief The destructor that needs to be called.
1078   const CXXDestructorDecl *Destructor;
1079 
CXXTemporary(const CXXDestructorDecl * destructor)1080   explicit CXXTemporary(const CXXDestructorDecl *destructor)
1081     : Destructor(destructor) { }
1082 
1083 public:
1084   static CXXTemporary *Create(const ASTContext &C,
1085                               const CXXDestructorDecl *Destructor);
1086 
getDestructor()1087   const CXXDestructorDecl *getDestructor() const { return Destructor; }
setDestructor(const CXXDestructorDecl * Dtor)1088   void setDestructor(const CXXDestructorDecl *Dtor) {
1089     Destructor = Dtor;
1090   }
1091 };
1092 
1093 /// \brief Represents binding an expression to a temporary.
1094 ///
1095 /// This ensures the destructor is called for the temporary. It should only be
1096 /// needed for non-POD, non-trivially destructable class types. For example:
1097 ///
1098 /// \code
1099 ///   struct S {
1100 ///     S() { }  // User defined constructor makes S non-POD.
1101 ///     ~S() { } // User defined destructor makes it non-trivial.
1102 ///   };
1103 ///   void test() {
1104 ///     const S &s_ref = S(); // Requires a CXXBindTemporaryExpr.
1105 ///   }
1106 /// \endcode
1107 class CXXBindTemporaryExpr : public Expr {
1108   CXXTemporary *Temp;
1109 
1110   Stmt *SubExpr;
1111 
CXXBindTemporaryExpr(CXXTemporary * temp,Expr * SubExpr)1112   CXXBindTemporaryExpr(CXXTemporary *temp, Expr* SubExpr)
1113    : Expr(CXXBindTemporaryExprClass, SubExpr->getType(),
1114           VK_RValue, OK_Ordinary, SubExpr->isTypeDependent(),
1115           SubExpr->isValueDependent(),
1116           SubExpr->isInstantiationDependent(),
1117           SubExpr->containsUnexpandedParameterPack()),
1118      Temp(temp), SubExpr(SubExpr) { }
1119 
1120 public:
CXXBindTemporaryExpr(EmptyShell Empty)1121   CXXBindTemporaryExpr(EmptyShell Empty)
1122     : Expr(CXXBindTemporaryExprClass, Empty), Temp(nullptr), SubExpr(nullptr) {}
1123 
1124   static CXXBindTemporaryExpr *Create(const ASTContext &C, CXXTemporary *Temp,
1125                                       Expr* SubExpr);
1126 
getTemporary()1127   CXXTemporary *getTemporary() { return Temp; }
getTemporary()1128   const CXXTemporary *getTemporary() const { return Temp; }
setTemporary(CXXTemporary * T)1129   void setTemporary(CXXTemporary *T) { Temp = T; }
1130 
getSubExpr()1131   const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
getSubExpr()1132   Expr *getSubExpr() { return cast<Expr>(SubExpr); }
setSubExpr(Expr * E)1133   void setSubExpr(Expr *E) { SubExpr = E; }
1134 
getLocStart()1135   SourceLocation getLocStart() const LLVM_READONLY {
1136     return SubExpr->getLocStart();
1137   }
getLocEnd()1138   SourceLocation getLocEnd() const LLVM_READONLY { return SubExpr->getLocEnd();}
1139 
1140   // Implement isa/cast/dyncast/etc.
classof(const Stmt * T)1141   static bool classof(const Stmt *T) {
1142     return T->getStmtClass() == CXXBindTemporaryExprClass;
1143   }
1144 
1145   // Iterators
children()1146   child_range children() { return child_range(&SubExpr, &SubExpr + 1); }
1147 };
1148 
1149 /// \brief Represents a call to a C++ constructor.
1150 class CXXConstructExpr : public Expr {
1151 public:
1152   enum ConstructionKind {
1153     CK_Complete,
1154     CK_NonVirtualBase,
1155     CK_VirtualBase,
1156     CK_Delegating
1157   };
1158 
1159 private:
1160   CXXConstructorDecl *Constructor;
1161 
1162   SourceLocation Loc;
1163   SourceRange ParenOrBraceRange;
1164   unsigned NumArgs : 16;
1165   bool Elidable : 1;
1166   bool HadMultipleCandidates : 1;
1167   bool ListInitialization : 1;
1168   bool StdInitListInitialization : 1;
1169   bool ZeroInitialization : 1;
1170   unsigned ConstructKind : 2;
1171   Stmt **Args;
1172 
1173 protected:
1174   CXXConstructExpr(const ASTContext &C, StmtClass SC, QualType T,
1175                    SourceLocation Loc,
1176                    CXXConstructorDecl *d, bool elidable,
1177                    ArrayRef<Expr *> Args,
1178                    bool HadMultipleCandidates,
1179                    bool ListInitialization,
1180                    bool StdInitListInitialization,
1181                    bool ZeroInitialization,
1182                    ConstructionKind ConstructKind,
1183                    SourceRange ParenOrBraceRange);
1184 
1185   /// \brief Construct an empty C++ construction expression.
CXXConstructExpr(StmtClass SC,EmptyShell Empty)1186   CXXConstructExpr(StmtClass SC, EmptyShell Empty)
1187     : Expr(SC, Empty), Constructor(nullptr), NumArgs(0), Elidable(false),
1188       HadMultipleCandidates(false), ListInitialization(false),
1189       ZeroInitialization(false), ConstructKind(0), Args(nullptr)
1190   { }
1191 
1192 public:
1193   /// \brief Construct an empty C++ construction expression.
CXXConstructExpr(EmptyShell Empty)1194   explicit CXXConstructExpr(EmptyShell Empty)
1195     : Expr(CXXConstructExprClass, Empty), Constructor(nullptr),
1196       NumArgs(0), Elidable(false), HadMultipleCandidates(false),
1197       ListInitialization(false), ZeroInitialization(false),
1198       ConstructKind(0), Args(nullptr)
1199   { }
1200 
1201   static CXXConstructExpr *Create(const ASTContext &C, QualType T,
1202                                   SourceLocation Loc,
1203                                   CXXConstructorDecl *D, bool Elidable,
1204                                   ArrayRef<Expr *> Args,
1205                                   bool HadMultipleCandidates,
1206                                   bool ListInitialization,
1207                                   bool StdInitListInitialization,
1208                                   bool ZeroInitialization,
1209                                   ConstructionKind ConstructKind,
1210                                   SourceRange ParenOrBraceRange);
1211 
getConstructor()1212   CXXConstructorDecl *getConstructor() const { return Constructor; }
setConstructor(CXXConstructorDecl * C)1213   void setConstructor(CXXConstructorDecl *C) { Constructor = C; }
1214 
getLocation()1215   SourceLocation getLocation() const { return Loc; }
setLocation(SourceLocation Loc)1216   void setLocation(SourceLocation Loc) { this->Loc = Loc; }
1217 
1218   /// \brief Whether this construction is elidable.
isElidable()1219   bool isElidable() const { return Elidable; }
setElidable(bool E)1220   void setElidable(bool E) { Elidable = E; }
1221 
1222   /// \brief Whether the referred constructor was resolved from
1223   /// an overloaded set having size greater than 1.
hadMultipleCandidates()1224   bool hadMultipleCandidates() const { return HadMultipleCandidates; }
setHadMultipleCandidates(bool V)1225   void setHadMultipleCandidates(bool V) { HadMultipleCandidates = V; }
1226 
1227   /// \brief Whether this constructor call was written as list-initialization.
isListInitialization()1228   bool isListInitialization() const { return ListInitialization; }
setListInitialization(bool V)1229   void setListInitialization(bool V) { ListInitialization = V; }
1230 
1231   /// \brief Whether this constructor call was written as list-initialization,
1232   /// but was interpreted as forming a std::initializer_list<T> from the list
1233   /// and passing that as a single constructor argument.
1234   /// See C++11 [over.match.list]p1 bullet 1.
isStdInitListInitialization()1235   bool isStdInitListInitialization() const { return StdInitListInitialization; }
setStdInitListInitialization(bool V)1236   void setStdInitListInitialization(bool V) { StdInitListInitialization = V; }
1237 
1238   /// \brief Whether this construction first requires
1239   /// zero-initialization before the initializer is called.
requiresZeroInitialization()1240   bool requiresZeroInitialization() const { return ZeroInitialization; }
setRequiresZeroInitialization(bool ZeroInit)1241   void setRequiresZeroInitialization(bool ZeroInit) {
1242     ZeroInitialization = ZeroInit;
1243   }
1244 
1245   /// \brief Determine whether this constructor is actually constructing
1246   /// a base class (rather than a complete object).
getConstructionKind()1247   ConstructionKind getConstructionKind() const {
1248     return (ConstructionKind)ConstructKind;
1249   }
setConstructionKind(ConstructionKind CK)1250   void setConstructionKind(ConstructionKind CK) {
1251     ConstructKind = CK;
1252   }
1253 
1254   typedef ExprIterator arg_iterator;
1255   typedef ConstExprIterator const_arg_iterator;
1256   typedef llvm::iterator_range<arg_iterator> arg_range;
1257   typedef llvm::iterator_range<const_arg_iterator> arg_const_range;
1258 
arguments()1259   arg_range arguments() { return arg_range(arg_begin(), arg_end()); }
arguments()1260   arg_const_range arguments() const {
1261     return arg_const_range(arg_begin(), arg_end());
1262   }
1263 
arg_begin()1264   arg_iterator arg_begin() { return Args; }
arg_end()1265   arg_iterator arg_end() { return Args + NumArgs; }
arg_begin()1266   const_arg_iterator arg_begin() const { return Args; }
arg_end()1267   const_arg_iterator arg_end() const { return Args + NumArgs; }
1268 
getArgs()1269   Expr **getArgs() { return reinterpret_cast<Expr **>(Args); }
getArgs()1270   const Expr *const *getArgs() const {
1271     return const_cast<CXXConstructExpr *>(this)->getArgs();
1272   }
getNumArgs()1273   unsigned getNumArgs() const { return NumArgs; }
1274 
1275   /// \brief Return the specified argument.
getArg(unsigned Arg)1276   Expr *getArg(unsigned Arg) {
1277     assert(Arg < NumArgs && "Arg access out of range!");
1278     return cast<Expr>(Args[Arg]);
1279   }
getArg(unsigned Arg)1280   const Expr *getArg(unsigned Arg) const {
1281     assert(Arg < NumArgs && "Arg access out of range!");
1282     return cast<Expr>(Args[Arg]);
1283   }
1284 
1285   /// \brief Set the specified argument.
setArg(unsigned Arg,Expr * ArgExpr)1286   void setArg(unsigned Arg, Expr *ArgExpr) {
1287     assert(Arg < NumArgs && "Arg access out of range!");
1288     Args[Arg] = ArgExpr;
1289   }
1290 
1291   SourceLocation getLocStart() const LLVM_READONLY;
1292   SourceLocation getLocEnd() const LLVM_READONLY;
getParenOrBraceRange()1293   SourceRange getParenOrBraceRange() const { return ParenOrBraceRange; }
setParenOrBraceRange(SourceRange Range)1294   void setParenOrBraceRange(SourceRange Range) { ParenOrBraceRange = Range; }
1295 
classof(const Stmt * T)1296   static bool classof(const Stmt *T) {
1297     return T->getStmtClass() == CXXConstructExprClass ||
1298       T->getStmtClass() == CXXTemporaryObjectExprClass;
1299   }
1300 
1301   // Iterators
children()1302   child_range children() {
1303     return child_range(&Args[0], &Args[0]+NumArgs);
1304   }
1305 
1306   friend class ASTStmtReader;
1307 };
1308 
1309 /// \brief Represents an explicit C++ type conversion that uses "functional"
1310 /// notation (C++ [expr.type.conv]).
1311 ///
1312 /// Example:
1313 /// \code
1314 ///   x = int(0.5);
1315 /// \endcode
1316 class CXXFunctionalCastExpr : public ExplicitCastExpr {
1317   SourceLocation LParenLoc;
1318   SourceLocation RParenLoc;
1319 
CXXFunctionalCastExpr(QualType ty,ExprValueKind VK,TypeSourceInfo * writtenTy,CastKind kind,Expr * castExpr,unsigned pathSize,SourceLocation lParenLoc,SourceLocation rParenLoc)1320   CXXFunctionalCastExpr(QualType ty, ExprValueKind VK,
1321                         TypeSourceInfo *writtenTy,
1322                         CastKind kind, Expr *castExpr, unsigned pathSize,
1323                         SourceLocation lParenLoc, SourceLocation rParenLoc)
1324     : ExplicitCastExpr(CXXFunctionalCastExprClass, ty, VK, kind,
1325                        castExpr, pathSize, writtenTy),
1326       LParenLoc(lParenLoc), RParenLoc(rParenLoc) {}
1327 
CXXFunctionalCastExpr(EmptyShell Shell,unsigned PathSize)1328   explicit CXXFunctionalCastExpr(EmptyShell Shell, unsigned PathSize)
1329     : ExplicitCastExpr(CXXFunctionalCastExprClass, Shell, PathSize) { }
1330 
1331 public:
1332   static CXXFunctionalCastExpr *Create(const ASTContext &Context, QualType T,
1333                                        ExprValueKind VK,
1334                                        TypeSourceInfo *Written,
1335                                        CastKind Kind, Expr *Op,
1336                                        const CXXCastPath *Path,
1337                                        SourceLocation LPLoc,
1338                                        SourceLocation RPLoc);
1339   static CXXFunctionalCastExpr *CreateEmpty(const ASTContext &Context,
1340                                             unsigned PathSize);
1341 
getLParenLoc()1342   SourceLocation getLParenLoc() const { return LParenLoc; }
setLParenLoc(SourceLocation L)1343   void setLParenLoc(SourceLocation L) { LParenLoc = L; }
getRParenLoc()1344   SourceLocation getRParenLoc() const { return RParenLoc; }
setRParenLoc(SourceLocation L)1345   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
1346 
1347   SourceLocation getLocStart() const LLVM_READONLY;
1348   SourceLocation getLocEnd() const LLVM_READONLY;
1349 
classof(const Stmt * T)1350   static bool classof(const Stmt *T) {
1351     return T->getStmtClass() == CXXFunctionalCastExprClass;
1352   }
1353 };
1354 
1355 /// @brief Represents a C++ functional cast expression that builds a
1356 /// temporary object.
1357 ///
1358 /// This expression type represents a C++ "functional" cast
1359 /// (C++[expr.type.conv]) with N != 1 arguments that invokes a
1360 /// constructor to build a temporary object. With N == 1 arguments the
1361 /// functional cast expression will be represented by CXXFunctionalCastExpr.
1362 /// Example:
1363 /// \code
1364 /// struct X { X(int, float); }
1365 ///
1366 /// X create_X() {
1367 ///   return X(1, 3.14f); // creates a CXXTemporaryObjectExpr
1368 /// };
1369 /// \endcode
1370 class CXXTemporaryObjectExpr : public CXXConstructExpr {
1371   TypeSourceInfo *Type;
1372 
1373 public:
1374   CXXTemporaryObjectExpr(const ASTContext &C, CXXConstructorDecl *Cons,
1375                          TypeSourceInfo *Type,
1376                          ArrayRef<Expr *> Args,
1377                          SourceRange ParenOrBraceRange,
1378                          bool HadMultipleCandidates,
1379                          bool ListInitialization,
1380                          bool StdInitListInitialization,
1381                          bool ZeroInitialization);
CXXTemporaryObjectExpr(EmptyShell Empty)1382   explicit CXXTemporaryObjectExpr(EmptyShell Empty)
1383     : CXXConstructExpr(CXXTemporaryObjectExprClass, Empty), Type() { }
1384 
getTypeSourceInfo()1385   TypeSourceInfo *getTypeSourceInfo() const { return Type; }
1386 
1387   SourceLocation getLocStart() const LLVM_READONLY;
1388   SourceLocation getLocEnd() const LLVM_READONLY;
1389 
classof(const Stmt * T)1390   static bool classof(const Stmt *T) {
1391     return T->getStmtClass() == CXXTemporaryObjectExprClass;
1392   }
1393 
1394   friend class ASTStmtReader;
1395 };
1396 
1397 /// \brief A C++ lambda expression, which produces a function object
1398 /// (of unspecified type) that can be invoked later.
1399 ///
1400 /// Example:
1401 /// \code
1402 /// void low_pass_filter(std::vector<double> &values, double cutoff) {
1403 ///   values.erase(std::remove_if(values.begin(), values.end(),
1404 ///                               [=](double value) { return value > cutoff; });
1405 /// }
1406 /// \endcode
1407 ///
1408 /// C++11 lambda expressions can capture local variables, either by copying
1409 /// the values of those local variables at the time the function
1410 /// object is constructed (not when it is called!) or by holding a
1411 /// reference to the local variable. These captures can occur either
1412 /// implicitly or can be written explicitly between the square
1413 /// brackets ([...]) that start the lambda expression.
1414 ///
1415 /// C++1y introduces a new form of "capture" called an init-capture that
1416 /// includes an initializing expression (rather than capturing a variable),
1417 /// and which can never occur implicitly.
1418 class LambdaExpr : public Expr {
1419   /// \brief The source range that covers the lambda introducer ([...]).
1420   SourceRange IntroducerRange;
1421 
1422   /// \brief The source location of this lambda's capture-default ('=' or '&').
1423   SourceLocation CaptureDefaultLoc;
1424 
1425   /// \brief The number of captures.
1426   unsigned NumCaptures : 16;
1427 
1428   /// \brief The default capture kind, which is a value of type
1429   /// LambdaCaptureDefault.
1430   unsigned CaptureDefault : 2;
1431 
1432   /// \brief Whether this lambda had an explicit parameter list vs. an
1433   /// implicit (and empty) parameter list.
1434   unsigned ExplicitParams : 1;
1435 
1436   /// \brief Whether this lambda had the result type explicitly specified.
1437   unsigned ExplicitResultType : 1;
1438 
1439   /// \brief Whether there are any array index variables stored at the end of
1440   /// this lambda expression.
1441   unsigned HasArrayIndexVars : 1;
1442 
1443   /// \brief The location of the closing brace ('}') that completes
1444   /// the lambda.
1445   ///
1446   /// The location of the brace is also available by looking up the
1447   /// function call operator in the lambda class. However, it is
1448   /// stored here to improve the performance of getSourceRange(), and
1449   /// to avoid having to deserialize the function call operator from a
1450   /// module file just to determine the source range.
1451   SourceLocation ClosingBrace;
1452 
1453   // Note: The capture initializers are stored directly after the lambda
1454   // expression, along with the index variables used to initialize by-copy
1455   // array captures.
1456 
1457   typedef LambdaCapture Capture;
1458 
1459   /// \brief Construct a lambda expression.
1460   LambdaExpr(QualType T, SourceRange IntroducerRange,
1461              LambdaCaptureDefault CaptureDefault,
1462              SourceLocation CaptureDefaultLoc,
1463              ArrayRef<Capture> Captures,
1464              bool ExplicitParams,
1465              bool ExplicitResultType,
1466              ArrayRef<Expr *> CaptureInits,
1467              ArrayRef<VarDecl *> ArrayIndexVars,
1468              ArrayRef<unsigned> ArrayIndexStarts,
1469              SourceLocation ClosingBrace,
1470              bool ContainsUnexpandedParameterPack);
1471 
1472   /// \brief Construct an empty lambda expression.
LambdaExpr(EmptyShell Empty,unsigned NumCaptures,bool HasArrayIndexVars)1473   LambdaExpr(EmptyShell Empty, unsigned NumCaptures, bool HasArrayIndexVars)
1474     : Expr(LambdaExprClass, Empty),
1475       NumCaptures(NumCaptures), CaptureDefault(LCD_None), ExplicitParams(false),
1476       ExplicitResultType(false), HasArrayIndexVars(true) {
1477     getStoredStmts()[NumCaptures] = nullptr;
1478   }
1479 
getStoredStmts()1480   Stmt **getStoredStmts() { return reinterpret_cast<Stmt **>(this + 1); }
1481 
getStoredStmts()1482   Stmt *const *getStoredStmts() const {
1483     return reinterpret_cast<Stmt *const *>(this + 1);
1484   }
1485 
1486   /// \brief Retrieve the mapping from captures to the first array index
1487   /// variable.
getArrayIndexStarts()1488   unsigned *getArrayIndexStarts() {
1489     return reinterpret_cast<unsigned *>(getStoredStmts() + NumCaptures + 1);
1490   }
1491 
getArrayIndexStarts()1492   const unsigned *getArrayIndexStarts() const {
1493     return reinterpret_cast<const unsigned *>(getStoredStmts() + NumCaptures +
1494                                               1);
1495   }
1496 
1497   /// \brief Retrieve the complete set of array-index variables.
getArrayIndexVars()1498   VarDecl **getArrayIndexVars() {
1499     unsigned ArrayIndexSize = llvm::RoundUpToAlignment(
1500         sizeof(unsigned) * (NumCaptures + 1), llvm::alignOf<VarDecl *>());
1501     return reinterpret_cast<VarDecl **>(
1502         reinterpret_cast<char *>(getArrayIndexStarts()) + ArrayIndexSize);
1503   }
1504 
getArrayIndexVars()1505   VarDecl *const *getArrayIndexVars() const {
1506     unsigned ArrayIndexSize = llvm::RoundUpToAlignment(
1507         sizeof(unsigned) * (NumCaptures + 1), llvm::alignOf<VarDecl *>());
1508     return reinterpret_cast<VarDecl *const *>(
1509         reinterpret_cast<const char *>(getArrayIndexStarts()) + ArrayIndexSize);
1510   }
1511 
1512 public:
1513   /// \brief Construct a new lambda expression.
1514   static LambdaExpr *Create(const ASTContext &C,
1515                             CXXRecordDecl *Class,
1516                             SourceRange IntroducerRange,
1517                             LambdaCaptureDefault CaptureDefault,
1518                             SourceLocation CaptureDefaultLoc,
1519                             ArrayRef<Capture> Captures,
1520                             bool ExplicitParams,
1521                             bool ExplicitResultType,
1522                             ArrayRef<Expr *> CaptureInits,
1523                             ArrayRef<VarDecl *> ArrayIndexVars,
1524                             ArrayRef<unsigned> ArrayIndexStarts,
1525                             SourceLocation ClosingBrace,
1526                             bool ContainsUnexpandedParameterPack);
1527 
1528   /// \brief Construct a new lambda expression that will be deserialized from
1529   /// an external source.
1530   static LambdaExpr *CreateDeserialized(const ASTContext &C,
1531                                         unsigned NumCaptures,
1532                                         unsigned NumArrayIndexVars);
1533 
1534   /// \brief Determine the default capture kind for this lambda.
getCaptureDefault()1535   LambdaCaptureDefault getCaptureDefault() const {
1536     return static_cast<LambdaCaptureDefault>(CaptureDefault);
1537   }
1538 
1539   /// \brief Retrieve the location of this lambda's capture-default, if any.
getCaptureDefaultLoc()1540   SourceLocation getCaptureDefaultLoc() const {
1541     return CaptureDefaultLoc;
1542   }
1543 
1544   /// \brief Determine whether one of this lambda's captures is an init-capture.
1545   bool isInitCapture(const LambdaCapture *Capture) const;
1546 
1547   /// \brief An iterator that walks over the captures of the lambda,
1548   /// both implicit and explicit.
1549   typedef const Capture *capture_iterator;
1550 
1551   /// \brief An iterator over a range of lambda captures.
1552   typedef llvm::iterator_range<capture_iterator> capture_range;
1553 
1554   /// \brief Retrieve this lambda's captures.
1555   capture_range captures() const;
1556 
1557   /// \brief Retrieve an iterator pointing to the first lambda capture.
1558   capture_iterator capture_begin() const;
1559 
1560   /// \brief Retrieve an iterator pointing past the end of the
1561   /// sequence of lambda captures.
1562   capture_iterator capture_end() const;
1563 
1564   /// \brief Determine the number of captures in this lambda.
capture_size()1565   unsigned capture_size() const { return NumCaptures; }
1566 
1567   /// \brief Retrieve this lambda's explicit captures.
1568   capture_range explicit_captures() const;
1569 
1570   /// \brief Retrieve an iterator pointing to the first explicit
1571   /// lambda capture.
1572   capture_iterator explicit_capture_begin() const;
1573 
1574   /// \brief Retrieve an iterator pointing past the end of the sequence of
1575   /// explicit lambda captures.
1576   capture_iterator explicit_capture_end() const;
1577 
1578   /// \brief Retrieve this lambda's implicit captures.
1579   capture_range implicit_captures() const;
1580 
1581   /// \brief Retrieve an iterator pointing to the first implicit
1582   /// lambda capture.
1583   capture_iterator implicit_capture_begin() const;
1584 
1585   /// \brief Retrieve an iterator pointing past the end of the sequence of
1586   /// implicit lambda captures.
1587   capture_iterator implicit_capture_end() const;
1588 
1589   /// \brief Iterator that walks over the capture initialization
1590   /// arguments.
1591   typedef Expr **capture_init_iterator;
1592 
1593   /// \brief Const iterator that walks over the capture initialization
1594   /// arguments.
1595   typedef Expr *const *const_capture_init_iterator;
1596 
1597   /// \brief Retrieve the initialization expressions for this lambda's captures.
capture_inits()1598   llvm::iterator_range<capture_init_iterator> capture_inits() {
1599     return llvm::make_range(capture_init_begin(), capture_init_end());
1600   }
1601 
1602   /// \brief Retrieve the initialization expressions for this lambda's captures.
capture_inits()1603   llvm::iterator_range<const_capture_init_iterator> capture_inits() const {
1604     return llvm::make_range(capture_init_begin(), capture_init_end());
1605   }
1606 
1607   /// \brief Retrieve the first initialization argument for this
1608   /// lambda expression (which initializes the first capture field).
capture_init_begin()1609   capture_init_iterator capture_init_begin() {
1610     return reinterpret_cast<Expr **>(getStoredStmts());
1611   }
1612 
1613   /// \brief Retrieve the first initialization argument for this
1614   /// lambda expression (which initializes the first capture field).
capture_init_begin()1615   const_capture_init_iterator capture_init_begin() const {
1616     return reinterpret_cast<Expr *const *>(getStoredStmts());
1617   }
1618 
1619   /// \brief Retrieve the iterator pointing one past the last
1620   /// initialization argument for this lambda expression.
capture_init_end()1621   capture_init_iterator capture_init_end() {
1622     return capture_init_begin() + NumCaptures;
1623   }
1624 
1625   /// \brief Retrieve the iterator pointing one past the last
1626   /// initialization argument for this lambda expression.
capture_init_end()1627   const_capture_init_iterator capture_init_end() const {
1628     return capture_init_begin() + NumCaptures;
1629   }
1630 
1631   /// \brief Retrieve the set of index variables used in the capture
1632   /// initializer of an array captured by copy.
1633   ///
1634   /// \param Iter The iterator that points at the capture initializer for
1635   /// which we are extracting the corresponding index variables.
1636   ArrayRef<VarDecl *>
1637   getCaptureInitIndexVars(const_capture_init_iterator Iter) const;
1638 
1639   /// \brief Retrieve the source range covering the lambda introducer,
1640   /// which contains the explicit capture list surrounded by square
1641   /// brackets ([...]).
getIntroducerRange()1642   SourceRange getIntroducerRange() const { return IntroducerRange; }
1643 
1644   /// \brief Retrieve the class that corresponds to the lambda.
1645   ///
1646   /// This is the "closure type" (C++1y [expr.prim.lambda]), and stores the
1647   /// captures in its fields and provides the various operations permitted
1648   /// on a lambda (copying, calling).
1649   CXXRecordDecl *getLambdaClass() const;
1650 
1651   /// \brief Retrieve the function call operator associated with this
1652   /// lambda expression.
1653   CXXMethodDecl *getCallOperator() const;
1654 
1655   /// \brief If this is a generic lambda expression, retrieve the template
1656   /// parameter list associated with it, or else return null.
1657   TemplateParameterList *getTemplateParameterList() const;
1658 
1659   /// \brief Whether this is a generic lambda.
isGenericLambda()1660   bool isGenericLambda() const { return getTemplateParameterList(); }
1661 
1662   /// \brief Retrieve the body of the lambda.
1663   CompoundStmt *getBody() const;
1664 
1665   /// \brief Determine whether the lambda is mutable, meaning that any
1666   /// captures values can be modified.
1667   bool isMutable() const;
1668 
1669   /// \brief Determine whether this lambda has an explicit parameter
1670   /// list vs. an implicit (empty) parameter list.
hasExplicitParameters()1671   bool hasExplicitParameters() const { return ExplicitParams; }
1672 
1673   /// \brief Whether this lambda had its result type explicitly specified.
hasExplicitResultType()1674   bool hasExplicitResultType() const { return ExplicitResultType; }
1675 
classof(const Stmt * T)1676   static bool classof(const Stmt *T) {
1677     return T->getStmtClass() == LambdaExprClass;
1678   }
1679 
getLocStart()1680   SourceLocation getLocStart() const LLVM_READONLY {
1681     return IntroducerRange.getBegin();
1682   }
getLocEnd()1683   SourceLocation getLocEnd() const LLVM_READONLY { return ClosingBrace; }
1684 
children()1685   child_range children() {
1686     return child_range(getStoredStmts(), getStoredStmts() + NumCaptures + 1);
1687   }
1688 
1689   friend class ASTStmtReader;
1690   friend class ASTStmtWriter;
1691 };
1692 
1693 /// An expression "T()" which creates a value-initialized rvalue of type
1694 /// T, which is a non-class type.  See (C++98 [5.2.3p2]).
1695 class CXXScalarValueInitExpr : public Expr {
1696   SourceLocation RParenLoc;
1697   TypeSourceInfo *TypeInfo;
1698 
1699   friend class ASTStmtReader;
1700 
1701 public:
1702   /// \brief Create an explicitly-written scalar-value initialization
1703   /// expression.
CXXScalarValueInitExpr(QualType Type,TypeSourceInfo * TypeInfo,SourceLocation rParenLoc)1704   CXXScalarValueInitExpr(QualType Type, TypeSourceInfo *TypeInfo,
1705                          SourceLocation rParenLoc)
1706       : Expr(CXXScalarValueInitExprClass, Type, VK_RValue, OK_Ordinary,
1707              false, false, Type->isInstantiationDependentType(),
1708              Type->containsUnexpandedParameterPack()),
1709         RParenLoc(rParenLoc), TypeInfo(TypeInfo) {}
1710 
CXXScalarValueInitExpr(EmptyShell Shell)1711   explicit CXXScalarValueInitExpr(EmptyShell Shell)
1712     : Expr(CXXScalarValueInitExprClass, Shell) { }
1713 
getTypeSourceInfo()1714   TypeSourceInfo *getTypeSourceInfo() const {
1715     return TypeInfo;
1716   }
1717 
getRParenLoc()1718   SourceLocation getRParenLoc() const { return RParenLoc; }
1719 
1720   SourceLocation getLocStart() const LLVM_READONLY;
getLocEnd()1721   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
1722 
classof(const Stmt * T)1723   static bool classof(const Stmt *T) {
1724     return T->getStmtClass() == CXXScalarValueInitExprClass;
1725   }
1726 
1727   // Iterators
children()1728   child_range children() {
1729     return child_range(child_iterator(), child_iterator());
1730   }
1731 };
1732 
1733 /// \brief Represents a new-expression for memory allocation and constructor
1734 /// calls, e.g: "new CXXNewExpr(foo)".
1735 class CXXNewExpr : public Expr {
1736   /// Contains an optional array size expression, an optional initialization
1737   /// expression, and any number of optional placement arguments, in that order.
1738   Stmt **SubExprs;
1739   /// \brief Points to the allocation function used.
1740   FunctionDecl *OperatorNew;
1741   /// \brief Points to the deallocation function used in case of error. May be
1742   /// null.
1743   FunctionDecl *OperatorDelete;
1744 
1745   /// \brief The allocated type-source information, as written in the source.
1746   TypeSourceInfo *AllocatedTypeInfo;
1747 
1748   /// \brief If the allocated type was expressed as a parenthesized type-id,
1749   /// the source range covering the parenthesized type-id.
1750   SourceRange TypeIdParens;
1751 
1752   /// \brief Range of the entire new expression.
1753   SourceRange Range;
1754 
1755   /// \brief Source-range of a paren-delimited initializer.
1756   SourceRange DirectInitRange;
1757 
1758   /// Was the usage ::new, i.e. is the global new to be used?
1759   bool GlobalNew : 1;
1760   /// Do we allocate an array? If so, the first SubExpr is the size expression.
1761   bool Array : 1;
1762   /// If this is an array allocation, does the usual deallocation
1763   /// function for the allocated type want to know the allocated size?
1764   bool UsualArrayDeleteWantsSize : 1;
1765   /// The number of placement new arguments.
1766   unsigned NumPlacementArgs : 13;
1767   /// What kind of initializer do we have? Could be none, parens, or braces.
1768   /// In storage, we distinguish between "none, and no initializer expr", and
1769   /// "none, but an implicit initializer expr".
1770   unsigned StoredInitializationStyle : 2;
1771 
1772   friend class ASTStmtReader;
1773   friend class ASTStmtWriter;
1774 public:
1775   enum InitializationStyle {
1776     NoInit,   ///< New-expression has no initializer as written.
1777     CallInit, ///< New-expression has a C++98 paren-delimited initializer.
1778     ListInit  ///< New-expression has a C++11 list-initializer.
1779   };
1780 
1781   CXXNewExpr(const ASTContext &C, bool globalNew, FunctionDecl *operatorNew,
1782              FunctionDecl *operatorDelete, bool usualArrayDeleteWantsSize,
1783              ArrayRef<Expr*> placementArgs,
1784              SourceRange typeIdParens, Expr *arraySize,
1785              InitializationStyle initializationStyle, Expr *initializer,
1786              QualType ty, TypeSourceInfo *AllocatedTypeInfo,
1787              SourceRange Range, SourceRange directInitRange);
CXXNewExpr(EmptyShell Shell)1788   explicit CXXNewExpr(EmptyShell Shell)
1789     : Expr(CXXNewExprClass, Shell), SubExprs(nullptr) { }
1790 
1791   void AllocateArgsArray(const ASTContext &C, bool isArray,
1792                          unsigned numPlaceArgs, bool hasInitializer);
1793 
getAllocatedType()1794   QualType getAllocatedType() const {
1795     assert(getType()->isPointerType());
1796     return getType()->getAs<PointerType>()->getPointeeType();
1797   }
1798 
getAllocatedTypeSourceInfo()1799   TypeSourceInfo *getAllocatedTypeSourceInfo() const {
1800     return AllocatedTypeInfo;
1801   }
1802 
1803   /// \brief True if the allocation result needs to be null-checked.
1804   ///
1805   /// C++11 [expr.new]p13:
1806   ///   If the allocation function returns null, initialization shall
1807   ///   not be done, the deallocation function shall not be called,
1808   ///   and the value of the new-expression shall be null.
1809   ///
1810   /// C++ DR1748:
1811   ///   If the allocation function is a reserved placement allocation
1812   ///   function that returns null, the behavior is undefined.
1813   ///
1814   /// An allocation function is not allowed to return null unless it
1815   /// has a non-throwing exception-specification.  The '03 rule is
1816   /// identical except that the definition of a non-throwing
1817   /// exception specification is just "is it throw()?".
1818   bool shouldNullCheckAllocation(const ASTContext &Ctx) const;
1819 
getOperatorNew()1820   FunctionDecl *getOperatorNew() const { return OperatorNew; }
setOperatorNew(FunctionDecl * D)1821   void setOperatorNew(FunctionDecl *D) { OperatorNew = D; }
getOperatorDelete()1822   FunctionDecl *getOperatorDelete() const { return OperatorDelete; }
setOperatorDelete(FunctionDecl * D)1823   void setOperatorDelete(FunctionDecl *D) { OperatorDelete = D; }
1824 
isArray()1825   bool isArray() const { return Array; }
getArraySize()1826   Expr *getArraySize() {
1827     return Array ? cast<Expr>(SubExprs[0]) : nullptr;
1828   }
getArraySize()1829   const Expr *getArraySize() const {
1830     return Array ? cast<Expr>(SubExprs[0]) : nullptr;
1831   }
1832 
getNumPlacementArgs()1833   unsigned getNumPlacementArgs() const { return NumPlacementArgs; }
getPlacementArgs()1834   Expr **getPlacementArgs() {
1835     return reinterpret_cast<Expr **>(SubExprs + Array + hasInitializer());
1836   }
1837 
getPlacementArg(unsigned i)1838   Expr *getPlacementArg(unsigned i) {
1839     assert(i < NumPlacementArgs && "Index out of range");
1840     return getPlacementArgs()[i];
1841   }
getPlacementArg(unsigned i)1842   const Expr *getPlacementArg(unsigned i) const {
1843     assert(i < NumPlacementArgs && "Index out of range");
1844     return const_cast<CXXNewExpr*>(this)->getPlacementArg(i);
1845   }
1846 
isParenTypeId()1847   bool isParenTypeId() const { return TypeIdParens.isValid(); }
getTypeIdParens()1848   SourceRange getTypeIdParens() const { return TypeIdParens; }
1849 
isGlobalNew()1850   bool isGlobalNew() const { return GlobalNew; }
1851 
1852   /// \brief Whether this new-expression has any initializer at all.
hasInitializer()1853   bool hasInitializer() const { return StoredInitializationStyle > 0; }
1854 
1855   /// \brief The kind of initializer this new-expression has.
getInitializationStyle()1856   InitializationStyle getInitializationStyle() const {
1857     if (StoredInitializationStyle == 0)
1858       return NoInit;
1859     return static_cast<InitializationStyle>(StoredInitializationStyle-1);
1860   }
1861 
1862   /// \brief The initializer of this new-expression.
getInitializer()1863   Expr *getInitializer() {
1864     return hasInitializer() ? cast<Expr>(SubExprs[Array]) : nullptr;
1865   }
getInitializer()1866   const Expr *getInitializer() const {
1867     return hasInitializer() ? cast<Expr>(SubExprs[Array]) : nullptr;
1868   }
1869 
1870   /// \brief Returns the CXXConstructExpr from this new-expression, or null.
getConstructExpr()1871   const CXXConstructExpr* getConstructExpr() const {
1872     return dyn_cast_or_null<CXXConstructExpr>(getInitializer());
1873   }
1874 
1875   /// Answers whether the usual array deallocation function for the
1876   /// allocated type expects the size of the allocation as a
1877   /// parameter.
doesUsualArrayDeleteWantSize()1878   bool doesUsualArrayDeleteWantSize() const {
1879     return UsualArrayDeleteWantsSize;
1880   }
1881 
1882   typedef ExprIterator arg_iterator;
1883   typedef ConstExprIterator const_arg_iterator;
1884 
placement_arguments()1885   llvm::iterator_range<arg_iterator> placement_arguments() {
1886     return llvm::make_range(placement_arg_begin(), placement_arg_end());
1887   }
1888 
placement_arguments()1889   llvm::iterator_range<const_arg_iterator> placement_arguments() const {
1890     return llvm::make_range(placement_arg_begin(), placement_arg_end());
1891   }
1892 
placement_arg_begin()1893   arg_iterator placement_arg_begin() {
1894     return SubExprs + Array + hasInitializer();
1895   }
placement_arg_end()1896   arg_iterator placement_arg_end() {
1897     return SubExprs + Array + hasInitializer() + getNumPlacementArgs();
1898   }
placement_arg_begin()1899   const_arg_iterator placement_arg_begin() const {
1900     return SubExprs + Array + hasInitializer();
1901   }
placement_arg_end()1902   const_arg_iterator placement_arg_end() const {
1903     return SubExprs + Array + hasInitializer() + getNumPlacementArgs();
1904   }
1905 
1906   typedef Stmt **raw_arg_iterator;
raw_arg_begin()1907   raw_arg_iterator raw_arg_begin() { return SubExprs; }
raw_arg_end()1908   raw_arg_iterator raw_arg_end() {
1909     return SubExprs + Array + hasInitializer() + getNumPlacementArgs();
1910   }
raw_arg_begin()1911   const_arg_iterator raw_arg_begin() const { return SubExprs; }
raw_arg_end()1912   const_arg_iterator raw_arg_end() const {
1913     return SubExprs + Array + hasInitializer() + getNumPlacementArgs();
1914   }
1915 
getStartLoc()1916   SourceLocation getStartLoc() const { return Range.getBegin(); }
getEndLoc()1917   SourceLocation getEndLoc() const { return Range.getEnd(); }
1918 
getDirectInitRange()1919   SourceRange getDirectInitRange() const { return DirectInitRange; }
1920 
getSourceRange()1921   SourceRange getSourceRange() const LLVM_READONLY {
1922     return Range;
1923   }
getLocStart()1924   SourceLocation getLocStart() const LLVM_READONLY { return getStartLoc(); }
getLocEnd()1925   SourceLocation getLocEnd() const LLVM_READONLY { return getEndLoc(); }
1926 
classof(const Stmt * T)1927   static bool classof(const Stmt *T) {
1928     return T->getStmtClass() == CXXNewExprClass;
1929   }
1930 
1931   // Iterators
children()1932   child_range children() {
1933     return child_range(raw_arg_begin(), raw_arg_end());
1934   }
1935 };
1936 
1937 /// \brief Represents a \c delete expression for memory deallocation and
1938 /// destructor calls, e.g. "delete[] pArray".
1939 class CXXDeleteExpr : public Expr {
1940   /// Points to the operator delete overload that is used. Could be a member.
1941   FunctionDecl *OperatorDelete;
1942   /// The pointer expression to be deleted.
1943   Stmt *Argument;
1944   /// Location of the expression.
1945   SourceLocation Loc;
1946   /// Is this a forced global delete, i.e. "::delete"?
1947   bool GlobalDelete : 1;
1948   /// Is this the array form of delete, i.e. "delete[]"?
1949   bool ArrayForm : 1;
1950   /// ArrayFormAsWritten can be different from ArrayForm if 'delete' is applied
1951   /// to pointer-to-array type (ArrayFormAsWritten will be false while ArrayForm
1952   /// will be true).
1953   bool ArrayFormAsWritten : 1;
1954   /// Does the usual deallocation function for the element type require
1955   /// a size_t argument?
1956   bool UsualArrayDeleteWantsSize : 1;
1957 public:
CXXDeleteExpr(QualType ty,bool globalDelete,bool arrayForm,bool arrayFormAsWritten,bool usualArrayDeleteWantsSize,FunctionDecl * operatorDelete,Expr * arg,SourceLocation loc)1958   CXXDeleteExpr(QualType ty, bool globalDelete, bool arrayForm,
1959                 bool arrayFormAsWritten, bool usualArrayDeleteWantsSize,
1960                 FunctionDecl *operatorDelete, Expr *arg, SourceLocation loc)
1961     : Expr(CXXDeleteExprClass, ty, VK_RValue, OK_Ordinary, false, false,
1962            arg->isInstantiationDependent(),
1963            arg->containsUnexpandedParameterPack()),
1964       OperatorDelete(operatorDelete), Argument(arg), Loc(loc),
1965       GlobalDelete(globalDelete),
1966       ArrayForm(arrayForm), ArrayFormAsWritten(arrayFormAsWritten),
1967       UsualArrayDeleteWantsSize(usualArrayDeleteWantsSize) { }
CXXDeleteExpr(EmptyShell Shell)1968   explicit CXXDeleteExpr(EmptyShell Shell)
1969     : Expr(CXXDeleteExprClass, Shell), OperatorDelete(nullptr),
1970       Argument(nullptr) {}
1971 
isGlobalDelete()1972   bool isGlobalDelete() const { return GlobalDelete; }
isArrayForm()1973   bool isArrayForm() const { return ArrayForm; }
isArrayFormAsWritten()1974   bool isArrayFormAsWritten() const { return ArrayFormAsWritten; }
1975 
1976   /// Answers whether the usual array deallocation function for the
1977   /// allocated type expects the size of the allocation as a
1978   /// parameter.  This can be true even if the actual deallocation
1979   /// function that we're using doesn't want a size.
doesUsualArrayDeleteWantSize()1980   bool doesUsualArrayDeleteWantSize() const {
1981     return UsualArrayDeleteWantsSize;
1982   }
1983 
getOperatorDelete()1984   FunctionDecl *getOperatorDelete() const { return OperatorDelete; }
1985 
getArgument()1986   Expr *getArgument() { return cast<Expr>(Argument); }
getArgument()1987   const Expr *getArgument() const { return cast<Expr>(Argument); }
1988 
1989   /// \brief Retrieve the type being destroyed.
1990   ///
1991   /// If the type being destroyed is a dependent type which may or may not
1992   /// be a pointer, return an invalid type.
1993   QualType getDestroyedType() const;
1994 
getLocStart()1995   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
getLocEnd()1996   SourceLocation getLocEnd() const LLVM_READONLY {return Argument->getLocEnd();}
1997 
classof(const Stmt * T)1998   static bool classof(const Stmt *T) {
1999     return T->getStmtClass() == CXXDeleteExprClass;
2000   }
2001 
2002   // Iterators
children()2003   child_range children() { return child_range(&Argument, &Argument+1); }
2004 
2005   friend class ASTStmtReader;
2006 };
2007 
2008 /// \brief Stores the type being destroyed by a pseudo-destructor expression.
2009 class PseudoDestructorTypeStorage {
2010   /// \brief Either the type source information or the name of the type, if
2011   /// it couldn't be resolved due to type-dependence.
2012   llvm::PointerUnion<TypeSourceInfo *, IdentifierInfo *> Type;
2013 
2014   /// \brief The starting source location of the pseudo-destructor type.
2015   SourceLocation Location;
2016 
2017 public:
PseudoDestructorTypeStorage()2018   PseudoDestructorTypeStorage() { }
2019 
PseudoDestructorTypeStorage(IdentifierInfo * II,SourceLocation Loc)2020   PseudoDestructorTypeStorage(IdentifierInfo *II, SourceLocation Loc)
2021     : Type(II), Location(Loc) { }
2022 
2023   PseudoDestructorTypeStorage(TypeSourceInfo *Info);
2024 
getTypeSourceInfo()2025   TypeSourceInfo *getTypeSourceInfo() const {
2026     return Type.dyn_cast<TypeSourceInfo *>();
2027   }
2028 
getIdentifier()2029   IdentifierInfo *getIdentifier() const {
2030     return Type.dyn_cast<IdentifierInfo *>();
2031   }
2032 
getLocation()2033   SourceLocation getLocation() const { return Location; }
2034 };
2035 
2036 /// \brief Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
2037 ///
2038 /// A pseudo-destructor is an expression that looks like a member access to a
2039 /// destructor of a scalar type, except that scalar types don't have
2040 /// destructors. For example:
2041 ///
2042 /// \code
2043 /// typedef int T;
2044 /// void f(int *p) {
2045 ///   p->T::~T();
2046 /// }
2047 /// \endcode
2048 ///
2049 /// Pseudo-destructors typically occur when instantiating templates such as:
2050 ///
2051 /// \code
2052 /// template<typename T>
2053 /// void destroy(T* ptr) {
2054 ///   ptr->T::~T();
2055 /// }
2056 /// \endcode
2057 ///
2058 /// for scalar types. A pseudo-destructor expression has no run-time semantics
2059 /// beyond evaluating the base expression.
2060 class CXXPseudoDestructorExpr : public Expr {
2061   /// \brief The base expression (that is being destroyed).
2062   Stmt *Base;
2063 
2064   /// \brief Whether the operator was an arrow ('->'); otherwise, it was a
2065   /// period ('.').
2066   bool IsArrow : 1;
2067 
2068   /// \brief The location of the '.' or '->' operator.
2069   SourceLocation OperatorLoc;
2070 
2071   /// \brief The nested-name-specifier that follows the operator, if present.
2072   NestedNameSpecifierLoc QualifierLoc;
2073 
2074   /// \brief The type that precedes the '::' in a qualified pseudo-destructor
2075   /// expression.
2076   TypeSourceInfo *ScopeType;
2077 
2078   /// \brief The location of the '::' in a qualified pseudo-destructor
2079   /// expression.
2080   SourceLocation ColonColonLoc;
2081 
2082   /// \brief The location of the '~'.
2083   SourceLocation TildeLoc;
2084 
2085   /// \brief The type being destroyed, or its name if we were unable to
2086   /// resolve the name.
2087   PseudoDestructorTypeStorage DestroyedType;
2088 
2089   friend class ASTStmtReader;
2090 
2091 public:
2092   CXXPseudoDestructorExpr(const ASTContext &Context,
2093                           Expr *Base, bool isArrow, SourceLocation OperatorLoc,
2094                           NestedNameSpecifierLoc QualifierLoc,
2095                           TypeSourceInfo *ScopeType,
2096                           SourceLocation ColonColonLoc,
2097                           SourceLocation TildeLoc,
2098                           PseudoDestructorTypeStorage DestroyedType);
2099 
CXXPseudoDestructorExpr(EmptyShell Shell)2100   explicit CXXPseudoDestructorExpr(EmptyShell Shell)
2101     : Expr(CXXPseudoDestructorExprClass, Shell),
2102       Base(nullptr), IsArrow(false), QualifierLoc(), ScopeType(nullptr) { }
2103 
getBase()2104   Expr *getBase() const { return cast<Expr>(Base); }
2105 
2106   /// \brief Determines whether this member expression actually had
2107   /// a C++ nested-name-specifier prior to the name of the member, e.g.,
2108   /// x->Base::foo.
hasQualifier()2109   bool hasQualifier() const { return QualifierLoc.hasQualifier(); }
2110 
2111   /// \brief Retrieves the nested-name-specifier that qualifies the type name,
2112   /// with source-location information.
getQualifierLoc()2113   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
2114 
2115   /// \brief If the member name was qualified, retrieves the
2116   /// nested-name-specifier that precedes the member name. Otherwise, returns
2117   /// null.
getQualifier()2118   NestedNameSpecifier *getQualifier() const {
2119     return QualifierLoc.getNestedNameSpecifier();
2120   }
2121 
2122   /// \brief Determine whether this pseudo-destructor expression was written
2123   /// using an '->' (otherwise, it used a '.').
isArrow()2124   bool isArrow() const { return IsArrow; }
2125 
2126   /// \brief Retrieve the location of the '.' or '->' operator.
getOperatorLoc()2127   SourceLocation getOperatorLoc() const { return OperatorLoc; }
2128 
2129   /// \brief Retrieve the scope type in a qualified pseudo-destructor
2130   /// expression.
2131   ///
2132   /// Pseudo-destructor expressions can have extra qualification within them
2133   /// that is not part of the nested-name-specifier, e.g., \c p->T::~T().
2134   /// Here, if the object type of the expression is (or may be) a scalar type,
2135   /// \p T may also be a scalar type and, therefore, cannot be part of a
2136   /// nested-name-specifier. It is stored as the "scope type" of the pseudo-
2137   /// destructor expression.
getScopeTypeInfo()2138   TypeSourceInfo *getScopeTypeInfo() const { return ScopeType; }
2139 
2140   /// \brief Retrieve the location of the '::' in a qualified pseudo-destructor
2141   /// expression.
getColonColonLoc()2142   SourceLocation getColonColonLoc() const { return ColonColonLoc; }
2143 
2144   /// \brief Retrieve the location of the '~'.
getTildeLoc()2145   SourceLocation getTildeLoc() const { return TildeLoc; }
2146 
2147   /// \brief Retrieve the source location information for the type
2148   /// being destroyed.
2149   ///
2150   /// This type-source information is available for non-dependent
2151   /// pseudo-destructor expressions and some dependent pseudo-destructor
2152   /// expressions. Returns null if we only have the identifier for a
2153   /// dependent pseudo-destructor expression.
getDestroyedTypeInfo()2154   TypeSourceInfo *getDestroyedTypeInfo() const {
2155     return DestroyedType.getTypeSourceInfo();
2156   }
2157 
2158   /// \brief In a dependent pseudo-destructor expression for which we do not
2159   /// have full type information on the destroyed type, provides the name
2160   /// of the destroyed type.
getDestroyedTypeIdentifier()2161   IdentifierInfo *getDestroyedTypeIdentifier() const {
2162     return DestroyedType.getIdentifier();
2163   }
2164 
2165   /// \brief Retrieve the type being destroyed.
2166   QualType getDestroyedType() const;
2167 
2168   /// \brief Retrieve the starting location of the type being destroyed.
getDestroyedTypeLoc()2169   SourceLocation getDestroyedTypeLoc() const {
2170     return DestroyedType.getLocation();
2171   }
2172 
2173   /// \brief Set the name of destroyed type for a dependent pseudo-destructor
2174   /// expression.
setDestroyedType(IdentifierInfo * II,SourceLocation Loc)2175   void setDestroyedType(IdentifierInfo *II, SourceLocation Loc) {
2176     DestroyedType = PseudoDestructorTypeStorage(II, Loc);
2177   }
2178 
2179   /// \brief Set the destroyed type.
setDestroyedType(TypeSourceInfo * Info)2180   void setDestroyedType(TypeSourceInfo *Info) {
2181     DestroyedType = PseudoDestructorTypeStorage(Info);
2182   }
2183 
getLocStart()2184   SourceLocation getLocStart() const LLVM_READONLY {return Base->getLocStart();}
2185   SourceLocation getLocEnd() const LLVM_READONLY;
2186 
classof(const Stmt * T)2187   static bool classof(const Stmt *T) {
2188     return T->getStmtClass() == CXXPseudoDestructorExprClass;
2189   }
2190 
2191   // Iterators
children()2192   child_range children() { return child_range(&Base, &Base + 1); }
2193 };
2194 
2195 /// \brief A type trait used in the implementation of various C++11 and
2196 /// Library TR1 trait templates.
2197 ///
2198 /// \code
2199 ///   __is_pod(int) == true
2200 ///   __is_enum(std::string) == false
2201 ///   __is_trivially_constructible(vector<int>, int*, int*)
2202 /// \endcode
2203 class TypeTraitExpr : public Expr {
2204   /// \brief The location of the type trait keyword.
2205   SourceLocation Loc;
2206 
2207   /// \brief  The location of the closing parenthesis.
2208   SourceLocation RParenLoc;
2209 
2210   // Note: The TypeSourceInfos for the arguments are allocated after the
2211   // TypeTraitExpr.
2212 
2213   TypeTraitExpr(QualType T, SourceLocation Loc, TypeTrait Kind,
2214                 ArrayRef<TypeSourceInfo *> Args,
2215                 SourceLocation RParenLoc,
2216                 bool Value);
2217 
TypeTraitExpr(EmptyShell Empty)2218   TypeTraitExpr(EmptyShell Empty) : Expr(TypeTraitExprClass, Empty) { }
2219 
2220   /// \brief Retrieve the argument types.
getTypeSourceInfos()2221   TypeSourceInfo **getTypeSourceInfos() {
2222     return reinterpret_cast<TypeSourceInfo **>(this+1);
2223   }
2224 
2225   /// \brief Retrieve the argument types.
getTypeSourceInfos()2226   TypeSourceInfo * const *getTypeSourceInfos() const {
2227     return reinterpret_cast<TypeSourceInfo * const*>(this+1);
2228   }
2229 
2230 public:
2231   /// \brief Create a new type trait expression.
2232   static TypeTraitExpr *Create(const ASTContext &C, QualType T,
2233                                SourceLocation Loc, TypeTrait Kind,
2234                                ArrayRef<TypeSourceInfo *> Args,
2235                                SourceLocation RParenLoc,
2236                                bool Value);
2237 
2238   static TypeTraitExpr *CreateDeserialized(const ASTContext &C,
2239                                            unsigned NumArgs);
2240 
2241   /// \brief Determine which type trait this expression uses.
getTrait()2242   TypeTrait getTrait() const {
2243     return static_cast<TypeTrait>(TypeTraitExprBits.Kind);
2244   }
2245 
getValue()2246   bool getValue() const {
2247     assert(!isValueDependent());
2248     return TypeTraitExprBits.Value;
2249   }
2250 
2251   /// \brief Determine the number of arguments to this type trait.
getNumArgs()2252   unsigned getNumArgs() const { return TypeTraitExprBits.NumArgs; }
2253 
2254   /// \brief Retrieve the Ith argument.
getArg(unsigned I)2255   TypeSourceInfo *getArg(unsigned I) const {
2256     assert(I < getNumArgs() && "Argument out-of-range");
2257     return getArgs()[I];
2258   }
2259 
2260   /// \brief Retrieve the argument types.
getArgs()2261   ArrayRef<TypeSourceInfo *> getArgs() const {
2262     return llvm::makeArrayRef(getTypeSourceInfos(), getNumArgs());
2263   }
2264 
2265   typedef TypeSourceInfo **arg_iterator;
arg_begin()2266   arg_iterator arg_begin() {
2267     return getTypeSourceInfos();
2268   }
arg_end()2269   arg_iterator arg_end() {
2270     return getTypeSourceInfos() + getNumArgs();
2271   }
2272 
2273   typedef TypeSourceInfo const * const *arg_const_iterator;
arg_begin()2274   arg_const_iterator arg_begin() const { return getTypeSourceInfos(); }
arg_end()2275   arg_const_iterator arg_end() const {
2276     return getTypeSourceInfos() + getNumArgs();
2277   }
2278 
getLocStart()2279   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
getLocEnd()2280   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
2281 
classof(const Stmt * T)2282   static bool classof(const Stmt *T) {
2283     return T->getStmtClass() == TypeTraitExprClass;
2284   }
2285 
2286   // Iterators
children()2287   child_range children() {
2288     return child_range(child_iterator(), child_iterator());
2289   }
2290 
2291   friend class ASTStmtReader;
2292   friend class ASTStmtWriter;
2293 
2294 };
2295 
2296 /// \brief An Embarcadero array type trait, as used in the implementation of
2297 /// __array_rank and __array_extent.
2298 ///
2299 /// Example:
2300 /// \code
2301 ///   __array_rank(int[10][20]) == 2
2302 ///   __array_extent(int, 1)    == 20
2303 /// \endcode
2304 class ArrayTypeTraitExpr : public Expr {
2305   virtual void anchor();
2306 
2307   /// \brief The trait. An ArrayTypeTrait enum in MSVC compat unsigned.
2308   unsigned ATT : 2;
2309 
2310   /// \brief The value of the type trait. Unspecified if dependent.
2311   uint64_t Value;
2312 
2313   /// \brief The array dimension being queried, or -1 if not used.
2314   Expr *Dimension;
2315 
2316   /// \brief The location of the type trait keyword.
2317   SourceLocation Loc;
2318 
2319   /// \brief The location of the closing paren.
2320   SourceLocation RParen;
2321 
2322   /// \brief The type being queried.
2323   TypeSourceInfo *QueriedType;
2324 
2325 public:
ArrayTypeTraitExpr(SourceLocation loc,ArrayTypeTrait att,TypeSourceInfo * queried,uint64_t value,Expr * dimension,SourceLocation rparen,QualType ty)2326   ArrayTypeTraitExpr(SourceLocation loc, ArrayTypeTrait att,
2327                      TypeSourceInfo *queried, uint64_t value,
2328                      Expr *dimension, SourceLocation rparen, QualType ty)
2329     : Expr(ArrayTypeTraitExprClass, ty, VK_RValue, OK_Ordinary,
2330            false, queried->getType()->isDependentType(),
2331            (queried->getType()->isInstantiationDependentType() ||
2332             (dimension && dimension->isInstantiationDependent())),
2333            queried->getType()->containsUnexpandedParameterPack()),
2334       ATT(att), Value(value), Dimension(dimension),
2335       Loc(loc), RParen(rparen), QueriedType(queried) { }
2336 
2337 
ArrayTypeTraitExpr(EmptyShell Empty)2338   explicit ArrayTypeTraitExpr(EmptyShell Empty)
2339     : Expr(ArrayTypeTraitExprClass, Empty), ATT(0), Value(false),
2340       QueriedType() { }
2341 
~ArrayTypeTraitExpr()2342   virtual ~ArrayTypeTraitExpr() { }
2343 
getLocStart()2344   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
getLocEnd()2345   SourceLocation getLocEnd() const LLVM_READONLY { return RParen; }
2346 
getTrait()2347   ArrayTypeTrait getTrait() const { return static_cast<ArrayTypeTrait>(ATT); }
2348 
getQueriedType()2349   QualType getQueriedType() const { return QueriedType->getType(); }
2350 
getQueriedTypeSourceInfo()2351   TypeSourceInfo *getQueriedTypeSourceInfo() const { return QueriedType; }
2352 
getValue()2353   uint64_t getValue() const { assert(!isTypeDependent()); return Value; }
2354 
getDimensionExpression()2355   Expr *getDimensionExpression() const { return Dimension; }
2356 
classof(const Stmt * T)2357   static bool classof(const Stmt *T) {
2358     return T->getStmtClass() == ArrayTypeTraitExprClass;
2359   }
2360 
2361   // Iterators
children()2362   child_range children() {
2363     return child_range(child_iterator(), child_iterator());
2364   }
2365 
2366   friend class ASTStmtReader;
2367 };
2368 
2369 /// \brief An expression trait intrinsic.
2370 ///
2371 /// Example:
2372 /// \code
2373 ///   __is_lvalue_expr(std::cout) == true
2374 ///   __is_lvalue_expr(1) == false
2375 /// \endcode
2376 class ExpressionTraitExpr : public Expr {
2377   /// \brief The trait. A ExpressionTrait enum in MSVC compatible unsigned.
2378   unsigned ET : 31;
2379   /// \brief The value of the type trait. Unspecified if dependent.
2380   bool Value : 1;
2381 
2382   /// \brief The location of the type trait keyword.
2383   SourceLocation Loc;
2384 
2385   /// \brief The location of the closing paren.
2386   SourceLocation RParen;
2387 
2388   /// \brief The expression being queried.
2389   Expr* QueriedExpression;
2390 public:
ExpressionTraitExpr(SourceLocation loc,ExpressionTrait et,Expr * queried,bool value,SourceLocation rparen,QualType resultType)2391   ExpressionTraitExpr(SourceLocation loc, ExpressionTrait et,
2392                      Expr *queried, bool value,
2393                      SourceLocation rparen, QualType resultType)
2394     : Expr(ExpressionTraitExprClass, resultType, VK_RValue, OK_Ordinary,
2395            false, // Not type-dependent
2396            // Value-dependent if the argument is type-dependent.
2397            queried->isTypeDependent(),
2398            queried->isInstantiationDependent(),
2399            queried->containsUnexpandedParameterPack()),
2400       ET(et), Value(value), Loc(loc), RParen(rparen),
2401       QueriedExpression(queried) { }
2402 
ExpressionTraitExpr(EmptyShell Empty)2403   explicit ExpressionTraitExpr(EmptyShell Empty)
2404     : Expr(ExpressionTraitExprClass, Empty), ET(0), Value(false),
2405       QueriedExpression() { }
2406 
getLocStart()2407   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
getLocEnd()2408   SourceLocation getLocEnd() const LLVM_READONLY { return RParen; }
2409 
getTrait()2410   ExpressionTrait getTrait() const { return static_cast<ExpressionTrait>(ET); }
2411 
getQueriedExpression()2412   Expr *getQueriedExpression() const { return QueriedExpression; }
2413 
getValue()2414   bool getValue() const { return Value; }
2415 
classof(const Stmt * T)2416   static bool classof(const Stmt *T) {
2417     return T->getStmtClass() == ExpressionTraitExprClass;
2418   }
2419 
2420   // Iterators
children()2421   child_range children() {
2422     return child_range(child_iterator(), child_iterator());
2423   }
2424 
2425   friend class ASTStmtReader;
2426 };
2427 
2428 
2429 /// \brief A reference to an overloaded function set, either an
2430 /// \c UnresolvedLookupExpr or an \c UnresolvedMemberExpr.
2431 class LLVM_ALIGNAS(/*alignof(uint64_t)*/ 8) OverloadExpr : public Expr {
2432   /// \brief The common name of these declarations.
2433   DeclarationNameInfo NameInfo;
2434 
2435   /// \brief The nested-name-specifier that qualifies the name, if any.
2436   NestedNameSpecifierLoc QualifierLoc;
2437 
2438   /// The results.  These are undesugared, which is to say, they may
2439   /// include UsingShadowDecls.  Access is relative to the naming
2440   /// class.
2441   // FIXME: Allocate this data after the OverloadExpr subclass.
2442   DeclAccessPair *Results;
2443   unsigned NumResults;
2444 
2445 protected:
2446   /// \brief Whether the name includes info for explicit template
2447   /// keyword and arguments.
2448   bool HasTemplateKWAndArgsInfo;
2449 
2450   /// \brief Return the optional template keyword and arguments info.
2451   ASTTemplateKWAndArgsInfo *getTemplateKWAndArgsInfo(); // defined far below.
2452 
2453   /// \brief Return the optional template keyword and arguments info.
getTemplateKWAndArgsInfo()2454   const ASTTemplateKWAndArgsInfo *getTemplateKWAndArgsInfo() const {
2455     return const_cast<OverloadExpr*>(this)->getTemplateKWAndArgsInfo();
2456   }
2457 
2458   OverloadExpr(StmtClass K, const ASTContext &C,
2459                NestedNameSpecifierLoc QualifierLoc,
2460                SourceLocation TemplateKWLoc,
2461                const DeclarationNameInfo &NameInfo,
2462                const TemplateArgumentListInfo *TemplateArgs,
2463                UnresolvedSetIterator Begin, UnresolvedSetIterator End,
2464                bool KnownDependent,
2465                bool KnownInstantiationDependent,
2466                bool KnownContainsUnexpandedParameterPack);
2467 
OverloadExpr(StmtClass K,EmptyShell Empty)2468   OverloadExpr(StmtClass K, EmptyShell Empty)
2469     : Expr(K, Empty), QualifierLoc(), Results(nullptr), NumResults(0),
2470       HasTemplateKWAndArgsInfo(false) { }
2471 
2472   void initializeResults(const ASTContext &C,
2473                          UnresolvedSetIterator Begin,
2474                          UnresolvedSetIterator End);
2475 
2476 public:
2477   struct FindResult {
2478     OverloadExpr *Expression;
2479     bool IsAddressOfOperand;
2480     bool HasFormOfMemberPointer;
2481   };
2482 
2483   /// \brief Finds the overloaded expression in the given expression \p E of
2484   /// OverloadTy.
2485   ///
2486   /// \return the expression (which must be there) and true if it has
2487   /// the particular form of a member pointer expression
find(Expr * E)2488   static FindResult find(Expr *E) {
2489     assert(E->getType()->isSpecificBuiltinType(BuiltinType::Overload));
2490 
2491     FindResult Result;
2492 
2493     E = E->IgnoreParens();
2494     if (isa<UnaryOperator>(E)) {
2495       assert(cast<UnaryOperator>(E)->getOpcode() == UO_AddrOf);
2496       E = cast<UnaryOperator>(E)->getSubExpr();
2497       OverloadExpr *Ovl = cast<OverloadExpr>(E->IgnoreParens());
2498 
2499       Result.HasFormOfMemberPointer = (E == Ovl && Ovl->getQualifier());
2500       Result.IsAddressOfOperand = true;
2501       Result.Expression = Ovl;
2502     } else {
2503       Result.HasFormOfMemberPointer = false;
2504       Result.IsAddressOfOperand = false;
2505       Result.Expression = cast<OverloadExpr>(E);
2506     }
2507 
2508     return Result;
2509   }
2510 
2511   /// \brief Gets the naming class of this lookup, if any.
2512   CXXRecordDecl *getNamingClass() const;
2513 
2514   typedef UnresolvedSetImpl::iterator decls_iterator;
decls_begin()2515   decls_iterator decls_begin() const { return UnresolvedSetIterator(Results); }
decls_end()2516   decls_iterator decls_end() const {
2517     return UnresolvedSetIterator(Results + NumResults);
2518   }
decls()2519   llvm::iterator_range<decls_iterator> decls() const {
2520     return llvm::make_range(decls_begin(), decls_end());
2521   }
2522 
2523   /// \brief Gets the number of declarations in the unresolved set.
getNumDecls()2524   unsigned getNumDecls() const { return NumResults; }
2525 
2526   /// \brief Gets the full name info.
getNameInfo()2527   const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
2528 
2529   /// \brief Gets the name looked up.
getName()2530   DeclarationName getName() const { return NameInfo.getName(); }
2531 
2532   /// \brief Gets the location of the name.
getNameLoc()2533   SourceLocation getNameLoc() const { return NameInfo.getLoc(); }
2534 
2535   /// \brief Fetches the nested-name qualifier, if one was given.
getQualifier()2536   NestedNameSpecifier *getQualifier() const {
2537     return QualifierLoc.getNestedNameSpecifier();
2538   }
2539 
2540   /// \brief Fetches the nested-name qualifier with source-location
2541   /// information, if one was given.
getQualifierLoc()2542   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
2543 
2544   /// \brief Retrieve the location of the template keyword preceding
2545   /// this name, if any.
getTemplateKeywordLoc()2546   SourceLocation getTemplateKeywordLoc() const {
2547     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
2548     return getTemplateKWAndArgsInfo()->getTemplateKeywordLoc();
2549   }
2550 
2551   /// \brief Retrieve the location of the left angle bracket starting the
2552   /// explicit template argument list following the name, if any.
getLAngleLoc()2553   SourceLocation getLAngleLoc() const {
2554     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
2555     return getTemplateKWAndArgsInfo()->LAngleLoc;
2556   }
2557 
2558   /// \brief Retrieve the location of the right angle bracket ending the
2559   /// explicit template argument list following the name, if any.
getRAngleLoc()2560   SourceLocation getRAngleLoc() const {
2561     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
2562     return getTemplateKWAndArgsInfo()->RAngleLoc;
2563   }
2564 
2565   /// \brief Determines whether the name was preceded by the template keyword.
hasTemplateKeyword()2566   bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
2567 
2568   /// \brief Determines whether this expression had explicit template arguments.
hasExplicitTemplateArgs()2569   bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
2570 
2571   // Note that, inconsistently with the explicit-template-argument AST
2572   // nodes, users are *forbidden* from calling these methods on objects
2573   // without explicit template arguments.
2574 
getExplicitTemplateArgs()2575   ASTTemplateArgumentListInfo &getExplicitTemplateArgs() {
2576     assert(hasExplicitTemplateArgs());
2577     return *getTemplateKWAndArgsInfo();
2578   }
2579 
getExplicitTemplateArgs()2580   const ASTTemplateArgumentListInfo &getExplicitTemplateArgs() const {
2581     return const_cast<OverloadExpr*>(this)->getExplicitTemplateArgs();
2582   }
2583 
getTemplateArgs()2584   TemplateArgumentLoc const *getTemplateArgs() const {
2585     return getExplicitTemplateArgs().getTemplateArgs();
2586   }
2587 
getNumTemplateArgs()2588   unsigned getNumTemplateArgs() const {
2589     return getExplicitTemplateArgs().NumTemplateArgs;
2590   }
2591 
2592   /// \brief Copies the template arguments into the given structure.
copyTemplateArgumentsInto(TemplateArgumentListInfo & List)2593   void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
2594     getExplicitTemplateArgs().copyInto(List);
2595   }
2596 
2597   /// \brief Retrieves the optional explicit template arguments.
2598   ///
2599   /// This points to the same data as getExplicitTemplateArgs(), but
2600   /// returns null if there are no explicit template arguments.
getOptionalExplicitTemplateArgs()2601   const ASTTemplateArgumentListInfo *getOptionalExplicitTemplateArgs() const {
2602     if (!hasExplicitTemplateArgs()) return nullptr;
2603     return &getExplicitTemplateArgs();
2604   }
2605 
classof(const Stmt * T)2606   static bool classof(const Stmt *T) {
2607     return T->getStmtClass() == UnresolvedLookupExprClass ||
2608            T->getStmtClass() == UnresolvedMemberExprClass;
2609   }
2610 
2611   friend class ASTStmtReader;
2612   friend class ASTStmtWriter;
2613 };
2614 
2615 /// \brief A reference to a name which we were able to look up during
2616 /// parsing but could not resolve to a specific declaration.
2617 ///
2618 /// This arises in several ways:
2619 ///   * we might be waiting for argument-dependent lookup;
2620 ///   * the name might resolve to an overloaded function;
2621 /// and eventually:
2622 ///   * the lookup might have included a function template.
2623 ///
2624 /// These never include UnresolvedUsingValueDecls, which are always class
2625 /// members and therefore appear only in UnresolvedMemberLookupExprs.
2626 class UnresolvedLookupExpr : public OverloadExpr {
2627   /// True if these lookup results should be extended by
2628   /// argument-dependent lookup if this is the operand of a function
2629   /// call.
2630   bool RequiresADL;
2631 
2632   /// True if these lookup results are overloaded.  This is pretty
2633   /// trivially rederivable if we urgently need to kill this field.
2634   bool Overloaded;
2635 
2636   /// The naming class (C++ [class.access.base]p5) of the lookup, if
2637   /// any.  This can generally be recalculated from the context chain,
2638   /// but that can be fairly expensive for unqualified lookups.  If we
2639   /// want to improve memory use here, this could go in a union
2640   /// against the qualified-lookup bits.
2641   CXXRecordDecl *NamingClass;
2642 
UnresolvedLookupExpr(const ASTContext & C,CXXRecordDecl * NamingClass,NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,const DeclarationNameInfo & NameInfo,bool RequiresADL,bool Overloaded,const TemplateArgumentListInfo * TemplateArgs,UnresolvedSetIterator Begin,UnresolvedSetIterator End)2643   UnresolvedLookupExpr(const ASTContext &C,
2644                        CXXRecordDecl *NamingClass,
2645                        NestedNameSpecifierLoc QualifierLoc,
2646                        SourceLocation TemplateKWLoc,
2647                        const DeclarationNameInfo &NameInfo,
2648                        bool RequiresADL, bool Overloaded,
2649                        const TemplateArgumentListInfo *TemplateArgs,
2650                        UnresolvedSetIterator Begin, UnresolvedSetIterator End)
2651     : OverloadExpr(UnresolvedLookupExprClass, C, QualifierLoc, TemplateKWLoc,
2652                    NameInfo, TemplateArgs, Begin, End, false, false, false),
2653       RequiresADL(RequiresADL),
2654       Overloaded(Overloaded), NamingClass(NamingClass)
2655   {}
2656 
UnresolvedLookupExpr(EmptyShell Empty)2657   UnresolvedLookupExpr(EmptyShell Empty)
2658     : OverloadExpr(UnresolvedLookupExprClass, Empty),
2659       RequiresADL(false), Overloaded(false), NamingClass(nullptr)
2660   {}
2661 
2662   friend class ASTStmtReader;
2663 
2664 public:
Create(const ASTContext & C,CXXRecordDecl * NamingClass,NestedNameSpecifierLoc QualifierLoc,const DeclarationNameInfo & NameInfo,bool ADL,bool Overloaded,UnresolvedSetIterator Begin,UnresolvedSetIterator End)2665   static UnresolvedLookupExpr *Create(const ASTContext &C,
2666                                       CXXRecordDecl *NamingClass,
2667                                       NestedNameSpecifierLoc QualifierLoc,
2668                                       const DeclarationNameInfo &NameInfo,
2669                                       bool ADL, bool Overloaded,
2670                                       UnresolvedSetIterator Begin,
2671                                       UnresolvedSetIterator End) {
2672     return new(C) UnresolvedLookupExpr(C, NamingClass, QualifierLoc,
2673                                        SourceLocation(), NameInfo,
2674                                        ADL, Overloaded, nullptr, Begin, End);
2675   }
2676 
2677   static UnresolvedLookupExpr *Create(const ASTContext &C,
2678                                       CXXRecordDecl *NamingClass,
2679                                       NestedNameSpecifierLoc QualifierLoc,
2680                                       SourceLocation TemplateKWLoc,
2681                                       const DeclarationNameInfo &NameInfo,
2682                                       bool ADL,
2683                                       const TemplateArgumentListInfo *Args,
2684                                       UnresolvedSetIterator Begin,
2685                                       UnresolvedSetIterator End);
2686 
2687   static UnresolvedLookupExpr *CreateEmpty(const ASTContext &C,
2688                                            bool HasTemplateKWAndArgsInfo,
2689                                            unsigned NumTemplateArgs);
2690 
2691   /// True if this declaration should be extended by
2692   /// argument-dependent lookup.
requiresADL()2693   bool requiresADL() const { return RequiresADL; }
2694 
2695   /// True if this lookup is overloaded.
isOverloaded()2696   bool isOverloaded() const { return Overloaded; }
2697 
2698   /// Gets the 'naming class' (in the sense of C++0x
2699   /// [class.access.base]p5) of the lookup.  This is the scope
2700   /// that was looked in to find these results.
getNamingClass()2701   CXXRecordDecl *getNamingClass() const { return NamingClass; }
2702 
getLocStart()2703   SourceLocation getLocStart() const LLVM_READONLY {
2704     if (NestedNameSpecifierLoc l = getQualifierLoc())
2705       return l.getBeginLoc();
2706     return getNameInfo().getLocStart();
2707   }
getLocEnd()2708   SourceLocation getLocEnd() const LLVM_READONLY {
2709     if (hasExplicitTemplateArgs())
2710       return getRAngleLoc();
2711     return getNameInfo().getLocEnd();
2712   }
2713 
children()2714   child_range children() {
2715     return child_range(child_iterator(), child_iterator());
2716   }
2717 
classof(const Stmt * T)2718   static bool classof(const Stmt *T) {
2719     return T->getStmtClass() == UnresolvedLookupExprClass;
2720   }
2721 };
2722 
2723 /// \brief A qualified reference to a name whose declaration cannot
2724 /// yet be resolved.
2725 ///
2726 /// DependentScopeDeclRefExpr is similar to DeclRefExpr in that
2727 /// it expresses a reference to a declaration such as
2728 /// X<T>::value. The difference, however, is that an
2729 /// DependentScopeDeclRefExpr node is used only within C++ templates when
2730 /// the qualification (e.g., X<T>::) refers to a dependent type. In
2731 /// this case, X<T>::value cannot resolve to a declaration because the
2732 /// declaration will differ from one instantiation of X<T> to the
2733 /// next. Therefore, DependentScopeDeclRefExpr keeps track of the
2734 /// qualifier (X<T>::) and the name of the entity being referenced
2735 /// ("value"). Such expressions will instantiate to a DeclRefExpr once the
2736 /// declaration can be found.
2737 class LLVM_ALIGNAS(/*alignof(uint64_t)*/ 8) DependentScopeDeclRefExpr
2738     : public Expr {
2739   /// \brief The nested-name-specifier that qualifies this unresolved
2740   /// declaration name.
2741   NestedNameSpecifierLoc QualifierLoc;
2742 
2743   /// \brief The name of the entity we will be referencing.
2744   DeclarationNameInfo NameInfo;
2745 
2746   /// \brief Whether the name includes info for explicit template
2747   /// keyword and arguments.
2748   bool HasTemplateKWAndArgsInfo;
2749 
2750   /// \brief Return the optional template keyword and arguments info.
getTemplateKWAndArgsInfo()2751   ASTTemplateKWAndArgsInfo *getTemplateKWAndArgsInfo() {
2752     if (!HasTemplateKWAndArgsInfo) return nullptr;
2753     return reinterpret_cast<ASTTemplateKWAndArgsInfo*>(this + 1);
2754   }
2755   /// \brief Return the optional template keyword and arguments info.
getTemplateKWAndArgsInfo()2756   const ASTTemplateKWAndArgsInfo *getTemplateKWAndArgsInfo() const {
2757     return const_cast<DependentScopeDeclRefExpr*>(this)
2758       ->getTemplateKWAndArgsInfo();
2759   }
2760 
2761   DependentScopeDeclRefExpr(QualType T,
2762                             NestedNameSpecifierLoc QualifierLoc,
2763                             SourceLocation TemplateKWLoc,
2764                             const DeclarationNameInfo &NameInfo,
2765                             const TemplateArgumentListInfo *Args);
2766 
2767 public:
2768   static DependentScopeDeclRefExpr *Create(const ASTContext &C,
2769                                            NestedNameSpecifierLoc QualifierLoc,
2770                                            SourceLocation TemplateKWLoc,
2771                                            const DeclarationNameInfo &NameInfo,
2772                               const TemplateArgumentListInfo *TemplateArgs);
2773 
2774   static DependentScopeDeclRefExpr *CreateEmpty(const ASTContext &C,
2775                                                 bool HasTemplateKWAndArgsInfo,
2776                                                 unsigned NumTemplateArgs);
2777 
2778   /// \brief Retrieve the name that this expression refers to.
getNameInfo()2779   const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
2780 
2781   /// \brief Retrieve the name that this expression refers to.
getDeclName()2782   DeclarationName getDeclName() const { return NameInfo.getName(); }
2783 
2784   /// \brief Retrieve the location of the name within the expression.
2785   ///
2786   /// For example, in "X<T>::value" this is the location of "value".
getLocation()2787   SourceLocation getLocation() const { return NameInfo.getLoc(); }
2788 
2789   /// \brief Retrieve the nested-name-specifier that qualifies the
2790   /// name, with source location information.
getQualifierLoc()2791   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
2792 
2793   /// \brief Retrieve the nested-name-specifier that qualifies this
2794   /// declaration.
getQualifier()2795   NestedNameSpecifier *getQualifier() const {
2796     return QualifierLoc.getNestedNameSpecifier();
2797   }
2798 
2799   /// \brief Retrieve the location of the template keyword preceding
2800   /// this name, if any.
getTemplateKeywordLoc()2801   SourceLocation getTemplateKeywordLoc() const {
2802     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
2803     return getTemplateKWAndArgsInfo()->getTemplateKeywordLoc();
2804   }
2805 
2806   /// \brief Retrieve the location of the left angle bracket starting the
2807   /// explicit template argument list following the name, if any.
getLAngleLoc()2808   SourceLocation getLAngleLoc() const {
2809     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
2810     return getTemplateKWAndArgsInfo()->LAngleLoc;
2811   }
2812 
2813   /// \brief Retrieve the location of the right angle bracket ending the
2814   /// explicit template argument list following the name, if any.
getRAngleLoc()2815   SourceLocation getRAngleLoc() const {
2816     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
2817     return getTemplateKWAndArgsInfo()->RAngleLoc;
2818   }
2819 
2820   /// Determines whether the name was preceded by the template keyword.
hasTemplateKeyword()2821   bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
2822 
2823   /// Determines whether this lookup had explicit template arguments.
hasExplicitTemplateArgs()2824   bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
2825 
2826   // Note that, inconsistently with the explicit-template-argument AST
2827   // nodes, users are *forbidden* from calling these methods on objects
2828   // without explicit template arguments.
2829 
getExplicitTemplateArgs()2830   ASTTemplateArgumentListInfo &getExplicitTemplateArgs() {
2831     assert(hasExplicitTemplateArgs());
2832     return *reinterpret_cast<ASTTemplateArgumentListInfo*>(this + 1);
2833   }
2834 
2835   /// Gets a reference to the explicit template argument list.
getExplicitTemplateArgs()2836   const ASTTemplateArgumentListInfo &getExplicitTemplateArgs() const {
2837     assert(hasExplicitTemplateArgs());
2838     return *reinterpret_cast<const ASTTemplateArgumentListInfo*>(this + 1);
2839   }
2840 
2841   /// \brief Retrieves the optional explicit template arguments.
2842   ///
2843   /// This points to the same data as getExplicitTemplateArgs(), but
2844   /// returns null if there are no explicit template arguments.
getOptionalExplicitTemplateArgs()2845   const ASTTemplateArgumentListInfo *getOptionalExplicitTemplateArgs() const {
2846     if (!hasExplicitTemplateArgs()) return nullptr;
2847     return &getExplicitTemplateArgs();
2848   }
2849 
2850   /// \brief Copies the template arguments (if present) into the given
2851   /// structure.
copyTemplateArgumentsInto(TemplateArgumentListInfo & List)2852   void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
2853     getExplicitTemplateArgs().copyInto(List);
2854   }
2855 
getTemplateArgs()2856   TemplateArgumentLoc const *getTemplateArgs() const {
2857     return getExplicitTemplateArgs().getTemplateArgs();
2858   }
2859 
getNumTemplateArgs()2860   unsigned getNumTemplateArgs() const {
2861     return getExplicitTemplateArgs().NumTemplateArgs;
2862   }
2863 
2864   /// Note: getLocStart() is the start of the whole DependentScopeDeclRefExpr,
2865   /// and differs from getLocation().getStart().
getLocStart()2866   SourceLocation getLocStart() const LLVM_READONLY {
2867     return QualifierLoc.getBeginLoc();
2868   }
getLocEnd()2869   SourceLocation getLocEnd() const LLVM_READONLY {
2870     if (hasExplicitTemplateArgs())
2871       return getRAngleLoc();
2872     return getLocation();
2873   }
2874 
classof(const Stmt * T)2875   static bool classof(const Stmt *T) {
2876     return T->getStmtClass() == DependentScopeDeclRefExprClass;
2877   }
2878 
children()2879   child_range children() {
2880     return child_range(child_iterator(), child_iterator());
2881   }
2882 
2883   friend class ASTStmtReader;
2884   friend class ASTStmtWriter;
2885 };
2886 
2887 /// Represents an expression -- generally a full-expression -- that
2888 /// introduces cleanups to be run at the end of the sub-expression's
2889 /// evaluation.  The most common source of expression-introduced
2890 /// cleanups is temporary objects in C++, but several other kinds of
2891 /// expressions can create cleanups, including basically every
2892 /// call in ARC that returns an Objective-C pointer.
2893 ///
2894 /// This expression also tracks whether the sub-expression contains a
2895 /// potentially-evaluated block literal.  The lifetime of a block
2896 /// literal is the extent of the enclosing scope.
2897 class ExprWithCleanups : public Expr {
2898 public:
2899   /// The type of objects that are kept in the cleanup.
2900   /// It's useful to remember the set of blocks;  we could also
2901   /// remember the set of temporaries, but there's currently
2902   /// no need.
2903   typedef BlockDecl *CleanupObject;
2904 
2905 private:
2906   Stmt *SubExpr;
2907 
2908   ExprWithCleanups(EmptyShell, unsigned NumObjects);
2909   ExprWithCleanups(Expr *SubExpr, ArrayRef<CleanupObject> Objects);
2910 
getObjectsBuffer()2911   CleanupObject *getObjectsBuffer() {
2912     return reinterpret_cast<CleanupObject*>(this + 1);
2913   }
getObjectsBuffer()2914   const CleanupObject *getObjectsBuffer() const {
2915     return reinterpret_cast<const CleanupObject*>(this + 1);
2916   }
2917   friend class ASTStmtReader;
2918 
2919 public:
2920   static ExprWithCleanups *Create(const ASTContext &C, EmptyShell empty,
2921                                   unsigned numObjects);
2922 
2923   static ExprWithCleanups *Create(const ASTContext &C, Expr *subexpr,
2924                                   ArrayRef<CleanupObject> objects);
2925 
getObjects()2926   ArrayRef<CleanupObject> getObjects() const {
2927     return llvm::makeArrayRef(getObjectsBuffer(), getNumObjects());
2928   }
2929 
getNumObjects()2930   unsigned getNumObjects() const { return ExprWithCleanupsBits.NumObjects; }
2931 
getObject(unsigned i)2932   CleanupObject getObject(unsigned i) const {
2933     assert(i < getNumObjects() && "Index out of range");
2934     return getObjects()[i];
2935   }
2936 
getSubExpr()2937   Expr *getSubExpr() { return cast<Expr>(SubExpr); }
getSubExpr()2938   const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
2939 
2940   /// As with any mutator of the AST, be very careful
2941   /// when modifying an existing AST to preserve its invariants.
setSubExpr(Expr * E)2942   void setSubExpr(Expr *E) { SubExpr = E; }
2943 
getLocStart()2944   SourceLocation getLocStart() const LLVM_READONLY {
2945     return SubExpr->getLocStart();
2946   }
getLocEnd()2947   SourceLocation getLocEnd() const LLVM_READONLY { return SubExpr->getLocEnd();}
2948 
2949   // Implement isa/cast/dyncast/etc.
classof(const Stmt * T)2950   static bool classof(const Stmt *T) {
2951     return T->getStmtClass() == ExprWithCleanupsClass;
2952   }
2953 
2954   // Iterators
children()2955   child_range children() { return child_range(&SubExpr, &SubExpr + 1); }
2956 };
2957 
2958 /// \brief Describes an explicit type conversion that uses functional
2959 /// notion but could not be resolved because one or more arguments are
2960 /// type-dependent.
2961 ///
2962 /// The explicit type conversions expressed by
2963 /// CXXUnresolvedConstructExpr have the form <tt>T(a1, a2, ..., aN)</tt>,
2964 /// where \c T is some type and \c a1, \c a2, ..., \c aN are values, and
2965 /// either \c T is a dependent type or one or more of the <tt>a</tt>'s is
2966 /// type-dependent. For example, this would occur in a template such
2967 /// as:
2968 ///
2969 /// \code
2970 ///   template<typename T, typename A1>
2971 ///   inline T make_a(const A1& a1) {
2972 ///     return T(a1);
2973 ///   }
2974 /// \endcode
2975 ///
2976 /// When the returned expression is instantiated, it may resolve to a
2977 /// constructor call, conversion function call, or some kind of type
2978 /// conversion.
2979 class CXXUnresolvedConstructExpr : public Expr {
2980   /// \brief The type being constructed.
2981   TypeSourceInfo *Type;
2982 
2983   /// \brief The location of the left parentheses ('(').
2984   SourceLocation LParenLoc;
2985 
2986   /// \brief The location of the right parentheses (')').
2987   SourceLocation RParenLoc;
2988 
2989   /// \brief The number of arguments used to construct the type.
2990   unsigned NumArgs;
2991 
2992   CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
2993                              SourceLocation LParenLoc,
2994                              ArrayRef<Expr*> Args,
2995                              SourceLocation RParenLoc);
2996 
CXXUnresolvedConstructExpr(EmptyShell Empty,unsigned NumArgs)2997   CXXUnresolvedConstructExpr(EmptyShell Empty, unsigned NumArgs)
2998     : Expr(CXXUnresolvedConstructExprClass, Empty), Type(), NumArgs(NumArgs) { }
2999 
3000   friend class ASTStmtReader;
3001 
3002 public:
3003   static CXXUnresolvedConstructExpr *Create(const ASTContext &C,
3004                                             TypeSourceInfo *Type,
3005                                             SourceLocation LParenLoc,
3006                                             ArrayRef<Expr*> Args,
3007                                             SourceLocation RParenLoc);
3008 
3009   static CXXUnresolvedConstructExpr *CreateEmpty(const ASTContext &C,
3010                                                  unsigned NumArgs);
3011 
3012   /// \brief Retrieve the type that is being constructed, as specified
3013   /// in the source code.
getTypeAsWritten()3014   QualType getTypeAsWritten() const { return Type->getType(); }
3015 
3016   /// \brief Retrieve the type source information for the type being
3017   /// constructed.
getTypeSourceInfo()3018   TypeSourceInfo *getTypeSourceInfo() const { return Type; }
3019 
3020   /// \brief Retrieve the location of the left parentheses ('(') that
3021   /// precedes the argument list.
getLParenLoc()3022   SourceLocation getLParenLoc() const { return LParenLoc; }
setLParenLoc(SourceLocation L)3023   void setLParenLoc(SourceLocation L) { LParenLoc = L; }
3024 
3025   /// \brief Retrieve the location of the right parentheses (')') that
3026   /// follows the argument list.
getRParenLoc()3027   SourceLocation getRParenLoc() const { return RParenLoc; }
setRParenLoc(SourceLocation L)3028   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
3029 
3030   /// \brief Retrieve the number of arguments.
arg_size()3031   unsigned arg_size() const { return NumArgs; }
3032 
3033   typedef Expr** arg_iterator;
arg_begin()3034   arg_iterator arg_begin() { return reinterpret_cast<Expr**>(this + 1); }
arg_end()3035   arg_iterator arg_end() { return arg_begin() + NumArgs; }
3036 
3037   typedef const Expr* const * const_arg_iterator;
arg_begin()3038   const_arg_iterator arg_begin() const {
3039     return reinterpret_cast<const Expr* const *>(this + 1);
3040   }
arg_end()3041   const_arg_iterator arg_end() const {
3042     return arg_begin() + NumArgs;
3043   }
3044 
getArg(unsigned I)3045   Expr *getArg(unsigned I) {
3046     assert(I < NumArgs && "Argument index out-of-range");
3047     return *(arg_begin() + I);
3048   }
3049 
getArg(unsigned I)3050   const Expr *getArg(unsigned I) const {
3051     assert(I < NumArgs && "Argument index out-of-range");
3052     return *(arg_begin() + I);
3053   }
3054 
setArg(unsigned I,Expr * E)3055   void setArg(unsigned I, Expr *E) {
3056     assert(I < NumArgs && "Argument index out-of-range");
3057     *(arg_begin() + I) = E;
3058   }
3059 
3060   SourceLocation getLocStart() const LLVM_READONLY;
getLocEnd()3061   SourceLocation getLocEnd() const LLVM_READONLY {
3062     if (!RParenLoc.isValid() && NumArgs > 0)
3063       return getArg(NumArgs - 1)->getLocEnd();
3064     return RParenLoc;
3065   }
3066 
classof(const Stmt * T)3067   static bool classof(const Stmt *T) {
3068     return T->getStmtClass() == CXXUnresolvedConstructExprClass;
3069   }
3070 
3071   // Iterators
children()3072   child_range children() {
3073     Stmt **begin = reinterpret_cast<Stmt**>(this+1);
3074     return child_range(begin, begin + NumArgs);
3075   }
3076 };
3077 
3078 /// \brief Represents a C++ member access expression where the actual
3079 /// member referenced could not be resolved because the base
3080 /// expression or the member name was dependent.
3081 ///
3082 /// Like UnresolvedMemberExprs, these can be either implicit or
3083 /// explicit accesses.  It is only possible to get one of these with
3084 /// an implicit access if a qualifier is provided.
3085 class LLVM_ALIGNAS(/*alignof(uint64_t)*/ 8) CXXDependentScopeMemberExpr
3086     : public Expr {
3087   /// \brief The expression for the base pointer or class reference,
3088   /// e.g., the \c x in x.f.  Can be null in implicit accesses.
3089   Stmt *Base;
3090 
3091   /// \brief The type of the base expression.  Never null, even for
3092   /// implicit accesses.
3093   QualType BaseType;
3094 
3095   /// \brief Whether this member expression used the '->' operator or
3096   /// the '.' operator.
3097   bool IsArrow : 1;
3098 
3099   /// \brief Whether this member expression has info for explicit template
3100   /// keyword and arguments.
3101   bool HasTemplateKWAndArgsInfo : 1;
3102 
3103   /// \brief The location of the '->' or '.' operator.
3104   SourceLocation OperatorLoc;
3105 
3106   /// \brief The nested-name-specifier that precedes the member name, if any.
3107   NestedNameSpecifierLoc QualifierLoc;
3108 
3109   /// \brief In a qualified member access expression such as t->Base::f, this
3110   /// member stores the resolves of name lookup in the context of the member
3111   /// access expression, to be used at instantiation time.
3112   ///
3113   /// FIXME: This member, along with the QualifierLoc, could
3114   /// be stuck into a structure that is optionally allocated at the end of
3115   /// the CXXDependentScopeMemberExpr, to save space in the common case.
3116   NamedDecl *FirstQualifierFoundInScope;
3117 
3118   /// \brief The member to which this member expression refers, which
3119   /// can be name, overloaded operator, or destructor.
3120   ///
3121   /// FIXME: could also be a template-id
3122   DeclarationNameInfo MemberNameInfo;
3123 
3124   /// \brief Return the optional template keyword and arguments info.
getTemplateKWAndArgsInfo()3125   ASTTemplateKWAndArgsInfo *getTemplateKWAndArgsInfo() {
3126     if (!HasTemplateKWAndArgsInfo) return nullptr;
3127     return reinterpret_cast<ASTTemplateKWAndArgsInfo*>(this + 1);
3128   }
3129   /// \brief Return the optional template keyword and arguments info.
getTemplateKWAndArgsInfo()3130   const ASTTemplateKWAndArgsInfo *getTemplateKWAndArgsInfo() const {
3131     return const_cast<CXXDependentScopeMemberExpr*>(this)
3132       ->getTemplateKWAndArgsInfo();
3133   }
3134 
3135   CXXDependentScopeMemberExpr(const ASTContext &C, Expr *Base,
3136                               QualType BaseType, bool IsArrow,
3137                               SourceLocation OperatorLoc,
3138                               NestedNameSpecifierLoc QualifierLoc,
3139                               SourceLocation TemplateKWLoc,
3140                               NamedDecl *FirstQualifierFoundInScope,
3141                               DeclarationNameInfo MemberNameInfo,
3142                               const TemplateArgumentListInfo *TemplateArgs);
3143 
3144 public:
3145   CXXDependentScopeMemberExpr(const ASTContext &C, Expr *Base,
3146                               QualType BaseType, bool IsArrow,
3147                               SourceLocation OperatorLoc,
3148                               NestedNameSpecifierLoc QualifierLoc,
3149                               NamedDecl *FirstQualifierFoundInScope,
3150                               DeclarationNameInfo MemberNameInfo);
3151 
3152   static CXXDependentScopeMemberExpr *
3153   Create(const ASTContext &C, Expr *Base, QualType BaseType, bool IsArrow,
3154          SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc,
3155          SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope,
3156          DeclarationNameInfo MemberNameInfo,
3157          const TemplateArgumentListInfo *TemplateArgs);
3158 
3159   static CXXDependentScopeMemberExpr *
3160   CreateEmpty(const ASTContext &C, bool HasTemplateKWAndArgsInfo,
3161               unsigned NumTemplateArgs);
3162 
3163   /// \brief True if this is an implicit access, i.e. one in which the
3164   /// member being accessed was not written in the source.  The source
3165   /// location of the operator is invalid in this case.
3166   bool isImplicitAccess() const;
3167 
3168   /// \brief Retrieve the base object of this member expressions,
3169   /// e.g., the \c x in \c x.m.
getBase()3170   Expr *getBase() const {
3171     assert(!isImplicitAccess());
3172     return cast<Expr>(Base);
3173   }
3174 
getBaseType()3175   QualType getBaseType() const { return BaseType; }
3176 
3177   /// \brief Determine whether this member expression used the '->'
3178   /// operator; otherwise, it used the '.' operator.
isArrow()3179   bool isArrow() const { return IsArrow; }
3180 
3181   /// \brief Retrieve the location of the '->' or '.' operator.
getOperatorLoc()3182   SourceLocation getOperatorLoc() const { return OperatorLoc; }
3183 
3184   /// \brief Retrieve the nested-name-specifier that qualifies the member
3185   /// name.
getQualifier()3186   NestedNameSpecifier *getQualifier() const {
3187     return QualifierLoc.getNestedNameSpecifier();
3188   }
3189 
3190   /// \brief Retrieve the nested-name-specifier that qualifies the member
3191   /// name, with source location information.
getQualifierLoc()3192   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
3193 
3194 
3195   /// \brief Retrieve the first part of the nested-name-specifier that was
3196   /// found in the scope of the member access expression when the member access
3197   /// was initially parsed.
3198   ///
3199   /// This function only returns a useful result when member access expression
3200   /// uses a qualified member name, e.g., "x.Base::f". Here, the declaration
3201   /// returned by this function describes what was found by unqualified name
3202   /// lookup for the identifier "Base" within the scope of the member access
3203   /// expression itself. At template instantiation time, this information is
3204   /// combined with the results of name lookup into the type of the object
3205   /// expression itself (the class type of x).
getFirstQualifierFoundInScope()3206   NamedDecl *getFirstQualifierFoundInScope() const {
3207     return FirstQualifierFoundInScope;
3208   }
3209 
3210   /// \brief Retrieve the name of the member that this expression
3211   /// refers to.
getMemberNameInfo()3212   const DeclarationNameInfo &getMemberNameInfo() const {
3213     return MemberNameInfo;
3214   }
3215 
3216   /// \brief Retrieve the name of the member that this expression
3217   /// refers to.
getMember()3218   DeclarationName getMember() const { return MemberNameInfo.getName(); }
3219 
3220   // \brief Retrieve the location of the name of the member that this
3221   // expression refers to.
getMemberLoc()3222   SourceLocation getMemberLoc() const { return MemberNameInfo.getLoc(); }
3223 
3224   /// \brief Retrieve the location of the template keyword preceding the
3225   /// member name, if any.
getTemplateKeywordLoc()3226   SourceLocation getTemplateKeywordLoc() const {
3227     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
3228     return getTemplateKWAndArgsInfo()->getTemplateKeywordLoc();
3229   }
3230 
3231   /// \brief Retrieve the location of the left angle bracket starting the
3232   /// explicit template argument list following the member name, if any.
getLAngleLoc()3233   SourceLocation getLAngleLoc() const {
3234     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
3235     return getTemplateKWAndArgsInfo()->LAngleLoc;
3236   }
3237 
3238   /// \brief Retrieve the location of the right angle bracket ending the
3239   /// explicit template argument list following the member name, if any.
getRAngleLoc()3240   SourceLocation getRAngleLoc() const {
3241     if (!HasTemplateKWAndArgsInfo) return SourceLocation();
3242     return getTemplateKWAndArgsInfo()->RAngleLoc;
3243   }
3244 
3245   /// Determines whether the member name was preceded by the template keyword.
hasTemplateKeyword()3246   bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
3247 
3248   /// \brief Determines whether this member expression actually had a C++
3249   /// template argument list explicitly specified, e.g., x.f<int>.
hasExplicitTemplateArgs()3250   bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
3251 
3252   /// \brief Retrieve the explicit template argument list that followed the
3253   /// member template name, if any.
getExplicitTemplateArgs()3254   ASTTemplateArgumentListInfo &getExplicitTemplateArgs() {
3255     assert(hasExplicitTemplateArgs());
3256     return *reinterpret_cast<ASTTemplateArgumentListInfo *>(this + 1);
3257   }
3258 
3259   /// \brief Retrieve the explicit template argument list that followed the
3260   /// member template name, if any.
getExplicitTemplateArgs()3261   const ASTTemplateArgumentListInfo &getExplicitTemplateArgs() const {
3262     return const_cast<CXXDependentScopeMemberExpr *>(this)
3263              ->getExplicitTemplateArgs();
3264   }
3265 
3266   /// \brief Retrieves the optional explicit template arguments.
3267   ///
3268   /// This points to the same data as getExplicitTemplateArgs(), but
3269   /// returns null if there are no explicit template arguments.
getOptionalExplicitTemplateArgs()3270   const ASTTemplateArgumentListInfo *getOptionalExplicitTemplateArgs() const {
3271     if (!hasExplicitTemplateArgs()) return nullptr;
3272     return &getExplicitTemplateArgs();
3273   }
3274 
3275   /// \brief Copies the template arguments (if present) into the given
3276   /// structure.
copyTemplateArgumentsInto(TemplateArgumentListInfo & List)3277   void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
3278     getExplicitTemplateArgs().copyInto(List);
3279   }
3280 
3281   /// \brief Initializes the template arguments using the given structure.
initializeTemplateArgumentsFrom(const TemplateArgumentListInfo & List)3282   void initializeTemplateArgumentsFrom(const TemplateArgumentListInfo &List) {
3283     getExplicitTemplateArgs().initializeFrom(List);
3284   }
3285 
3286   /// \brief Retrieve the template arguments provided as part of this
3287   /// template-id.
getTemplateArgs()3288   const TemplateArgumentLoc *getTemplateArgs() const {
3289     return getExplicitTemplateArgs().getTemplateArgs();
3290   }
3291 
3292   /// \brief Retrieve the number of template arguments provided as part of this
3293   /// template-id.
getNumTemplateArgs()3294   unsigned getNumTemplateArgs() const {
3295     return getExplicitTemplateArgs().NumTemplateArgs;
3296   }
3297 
getLocStart()3298   SourceLocation getLocStart() const LLVM_READONLY {
3299     if (!isImplicitAccess())
3300       return Base->getLocStart();
3301     if (getQualifier())
3302       return getQualifierLoc().getBeginLoc();
3303     return MemberNameInfo.getBeginLoc();
3304 
3305   }
getLocEnd()3306   SourceLocation getLocEnd() const LLVM_READONLY {
3307     if (hasExplicitTemplateArgs())
3308       return getRAngleLoc();
3309     return MemberNameInfo.getEndLoc();
3310   }
3311 
classof(const Stmt * T)3312   static bool classof(const Stmt *T) {
3313     return T->getStmtClass() == CXXDependentScopeMemberExprClass;
3314   }
3315 
3316   // Iterators
children()3317   child_range children() {
3318     if (isImplicitAccess())
3319       return child_range(child_iterator(), child_iterator());
3320     return child_range(&Base, &Base + 1);
3321   }
3322 
3323   friend class ASTStmtReader;
3324   friend class ASTStmtWriter;
3325 };
3326 
3327 /// \brief Represents a C++ member access expression for which lookup
3328 /// produced a set of overloaded functions.
3329 ///
3330 /// The member access may be explicit or implicit:
3331 /// \code
3332 ///    struct A {
3333 ///      int a, b;
3334 ///      int explicitAccess() { return this->a + this->A::b; }
3335 ///      int implicitAccess() { return a + A::b; }
3336 ///    };
3337 /// \endcode
3338 ///
3339 /// In the final AST, an explicit access always becomes a MemberExpr.
3340 /// An implicit access may become either a MemberExpr or a
3341 /// DeclRefExpr, depending on whether the member is static.
3342 class LLVM_ALIGNAS(/*alignof(uint64_t)*/ 8) UnresolvedMemberExpr
3343     : public OverloadExpr {
3344   /// \brief Whether this member expression used the '->' operator or
3345   /// the '.' operator.
3346   bool IsArrow : 1;
3347 
3348   /// \brief Whether the lookup results contain an unresolved using
3349   /// declaration.
3350   bool HasUnresolvedUsing : 1;
3351 
3352   /// \brief The expression for the base pointer or class reference,
3353   /// e.g., the \c x in x.f.
3354   ///
3355   /// This can be null if this is an 'unbased' member expression.
3356   Stmt *Base;
3357 
3358   /// \brief The type of the base expression; never null.
3359   QualType BaseType;
3360 
3361   /// \brief The location of the '->' or '.' operator.
3362   SourceLocation OperatorLoc;
3363 
3364   UnresolvedMemberExpr(const ASTContext &C, bool HasUnresolvedUsing,
3365                        Expr *Base, QualType BaseType, bool IsArrow,
3366                        SourceLocation OperatorLoc,
3367                        NestedNameSpecifierLoc QualifierLoc,
3368                        SourceLocation TemplateKWLoc,
3369                        const DeclarationNameInfo &MemberNameInfo,
3370                        const TemplateArgumentListInfo *TemplateArgs,
3371                        UnresolvedSetIterator Begin, UnresolvedSetIterator End);
3372 
UnresolvedMemberExpr(EmptyShell Empty)3373   UnresolvedMemberExpr(EmptyShell Empty)
3374     : OverloadExpr(UnresolvedMemberExprClass, Empty), IsArrow(false),
3375       HasUnresolvedUsing(false), Base(nullptr) { }
3376 
3377   friend class ASTStmtReader;
3378 
3379 public:
3380   static UnresolvedMemberExpr *
3381   Create(const ASTContext &C, bool HasUnresolvedUsing,
3382          Expr *Base, QualType BaseType, bool IsArrow,
3383          SourceLocation OperatorLoc,
3384          NestedNameSpecifierLoc QualifierLoc,
3385          SourceLocation TemplateKWLoc,
3386          const DeclarationNameInfo &MemberNameInfo,
3387          const TemplateArgumentListInfo *TemplateArgs,
3388          UnresolvedSetIterator Begin, UnresolvedSetIterator End);
3389 
3390   static UnresolvedMemberExpr *
3391   CreateEmpty(const ASTContext &C, bool HasTemplateKWAndArgsInfo,
3392               unsigned NumTemplateArgs);
3393 
3394   /// \brief True if this is an implicit access, i.e., one in which the
3395   /// member being accessed was not written in the source.
3396   ///
3397   /// The source location of the operator is invalid in this case.
3398   bool isImplicitAccess() const;
3399 
3400   /// \brief Retrieve the base object of this member expressions,
3401   /// e.g., the \c x in \c x.m.
getBase()3402   Expr *getBase() {
3403     assert(!isImplicitAccess());
3404     return cast<Expr>(Base);
3405   }
getBase()3406   const Expr *getBase() const {
3407     assert(!isImplicitAccess());
3408     return cast<Expr>(Base);
3409   }
3410 
getBaseType()3411   QualType getBaseType() const { return BaseType; }
3412 
3413   /// \brief Determine whether the lookup results contain an unresolved using
3414   /// declaration.
hasUnresolvedUsing()3415   bool hasUnresolvedUsing() const { return HasUnresolvedUsing; }
3416 
3417   /// \brief Determine whether this member expression used the '->'
3418   /// operator; otherwise, it used the '.' operator.
isArrow()3419   bool isArrow() const { return IsArrow; }
3420 
3421   /// \brief Retrieve the location of the '->' or '.' operator.
getOperatorLoc()3422   SourceLocation getOperatorLoc() const { return OperatorLoc; }
3423 
3424   /// \brief Retrieve the naming class of this lookup.
3425   CXXRecordDecl *getNamingClass() const;
3426 
3427   /// \brief Retrieve the full name info for the member that this expression
3428   /// refers to.
getMemberNameInfo()3429   const DeclarationNameInfo &getMemberNameInfo() const { return getNameInfo(); }
3430 
3431   /// \brief Retrieve the name of the member that this expression
3432   /// refers to.
getMemberName()3433   DeclarationName getMemberName() const { return getName(); }
3434 
3435   // \brief Retrieve the location of the name of the member that this
3436   // expression refers to.
getMemberLoc()3437   SourceLocation getMemberLoc() const { return getNameLoc(); }
3438 
3439   // \brief Return the preferred location (the member name) for the arrow when
3440   // diagnosing a problem with this expression.
getExprLoc()3441   SourceLocation getExprLoc() const LLVM_READONLY { return getMemberLoc(); }
3442 
getLocStart()3443   SourceLocation getLocStart() const LLVM_READONLY {
3444     if (!isImplicitAccess())
3445       return Base->getLocStart();
3446     if (NestedNameSpecifierLoc l = getQualifierLoc())
3447       return l.getBeginLoc();
3448     return getMemberNameInfo().getLocStart();
3449   }
getLocEnd()3450   SourceLocation getLocEnd() const LLVM_READONLY {
3451     if (hasExplicitTemplateArgs())
3452       return getRAngleLoc();
3453     return getMemberNameInfo().getLocEnd();
3454   }
3455 
classof(const Stmt * T)3456   static bool classof(const Stmt *T) {
3457     return T->getStmtClass() == UnresolvedMemberExprClass;
3458   }
3459 
3460   // Iterators
children()3461   child_range children() {
3462     if (isImplicitAccess())
3463       return child_range(child_iterator(), child_iterator());
3464     return child_range(&Base, &Base + 1);
3465   }
3466 };
3467 
getTemplateKWAndArgsInfo()3468 inline ASTTemplateKWAndArgsInfo *OverloadExpr::getTemplateKWAndArgsInfo() {
3469   if (!HasTemplateKWAndArgsInfo)
3470     return nullptr;
3471   if (isa<UnresolvedLookupExpr>(this))
3472     return reinterpret_cast<ASTTemplateKWAndArgsInfo *>(
3473         cast<UnresolvedLookupExpr>(this) + 1);
3474   else
3475     return reinterpret_cast<ASTTemplateKWAndArgsInfo *>(
3476         cast<UnresolvedMemberExpr>(this) + 1);
3477 }
3478 
3479 /// \brief Represents a C++11 noexcept expression (C++ [expr.unary.noexcept]).
3480 ///
3481 /// The noexcept expression tests whether a given expression might throw. Its
3482 /// result is a boolean constant.
3483 class CXXNoexceptExpr : public Expr {
3484   bool Value : 1;
3485   Stmt *Operand;
3486   SourceRange Range;
3487 
3488   friend class ASTStmtReader;
3489 
3490 public:
CXXNoexceptExpr(QualType Ty,Expr * Operand,CanThrowResult Val,SourceLocation Keyword,SourceLocation RParen)3491   CXXNoexceptExpr(QualType Ty, Expr *Operand, CanThrowResult Val,
3492                   SourceLocation Keyword, SourceLocation RParen)
3493     : Expr(CXXNoexceptExprClass, Ty, VK_RValue, OK_Ordinary,
3494            /*TypeDependent*/false,
3495            /*ValueDependent*/Val == CT_Dependent,
3496            Val == CT_Dependent || Operand->isInstantiationDependent(),
3497            Operand->containsUnexpandedParameterPack()),
3498       Value(Val == CT_Cannot), Operand(Operand), Range(Keyword, RParen)
3499   { }
3500 
CXXNoexceptExpr(EmptyShell Empty)3501   CXXNoexceptExpr(EmptyShell Empty)
3502     : Expr(CXXNoexceptExprClass, Empty)
3503   { }
3504 
getOperand()3505   Expr *getOperand() const { return static_cast<Expr*>(Operand); }
3506 
getLocStart()3507   SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); }
getLocEnd()3508   SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); }
getSourceRange()3509   SourceRange getSourceRange() const LLVM_READONLY { return Range; }
3510 
getValue()3511   bool getValue() const { return Value; }
3512 
classof(const Stmt * T)3513   static bool classof(const Stmt *T) {
3514     return T->getStmtClass() == CXXNoexceptExprClass;
3515   }
3516 
3517   // Iterators
children()3518   child_range children() { return child_range(&Operand, &Operand + 1); }
3519 };
3520 
3521 /// \brief Represents a C++11 pack expansion that produces a sequence of
3522 /// expressions.
3523 ///
3524 /// A pack expansion expression contains a pattern (which itself is an
3525 /// expression) followed by an ellipsis. For example:
3526 ///
3527 /// \code
3528 /// template<typename F, typename ...Types>
3529 /// void forward(F f, Types &&...args) {
3530 ///   f(static_cast<Types&&>(args)...);
3531 /// }
3532 /// \endcode
3533 ///
3534 /// Here, the argument to the function object \c f is a pack expansion whose
3535 /// pattern is \c static_cast<Types&&>(args). When the \c forward function
3536 /// template is instantiated, the pack expansion will instantiate to zero or
3537 /// or more function arguments to the function object \c f.
3538 class PackExpansionExpr : public Expr {
3539   SourceLocation EllipsisLoc;
3540 
3541   /// \brief The number of expansions that will be produced by this pack
3542   /// expansion expression, if known.
3543   ///
3544   /// When zero, the number of expansions is not known. Otherwise, this value
3545   /// is the number of expansions + 1.
3546   unsigned NumExpansions;
3547 
3548   Stmt *Pattern;
3549 
3550   friend class ASTStmtReader;
3551   friend class ASTStmtWriter;
3552 
3553 public:
PackExpansionExpr(QualType T,Expr * Pattern,SourceLocation EllipsisLoc,Optional<unsigned> NumExpansions)3554   PackExpansionExpr(QualType T, Expr *Pattern, SourceLocation EllipsisLoc,
3555                     Optional<unsigned> NumExpansions)
3556     : Expr(PackExpansionExprClass, T, Pattern->getValueKind(),
3557            Pattern->getObjectKind(), /*TypeDependent=*/true,
3558            /*ValueDependent=*/true, /*InstantiationDependent=*/true,
3559            /*ContainsUnexpandedParameterPack=*/false),
3560       EllipsisLoc(EllipsisLoc),
3561       NumExpansions(NumExpansions? *NumExpansions + 1 : 0),
3562       Pattern(Pattern) { }
3563 
PackExpansionExpr(EmptyShell Empty)3564   PackExpansionExpr(EmptyShell Empty) : Expr(PackExpansionExprClass, Empty) { }
3565 
3566   /// \brief Retrieve the pattern of the pack expansion.
getPattern()3567   Expr *getPattern() { return reinterpret_cast<Expr *>(Pattern); }
3568 
3569   /// \brief Retrieve the pattern of the pack expansion.
getPattern()3570   const Expr *getPattern() const { return reinterpret_cast<Expr *>(Pattern); }
3571 
3572   /// \brief Retrieve the location of the ellipsis that describes this pack
3573   /// expansion.
getEllipsisLoc()3574   SourceLocation getEllipsisLoc() const { return EllipsisLoc; }
3575 
3576   /// \brief Determine the number of expansions that will be produced when
3577   /// this pack expansion is instantiated, if already known.
getNumExpansions()3578   Optional<unsigned> getNumExpansions() const {
3579     if (NumExpansions)
3580       return NumExpansions - 1;
3581 
3582     return None;
3583   }
3584 
getLocStart()3585   SourceLocation getLocStart() const LLVM_READONLY {
3586     return Pattern->getLocStart();
3587   }
getLocEnd()3588   SourceLocation getLocEnd() const LLVM_READONLY { return EllipsisLoc; }
3589 
classof(const Stmt * T)3590   static bool classof(const Stmt *T) {
3591     return T->getStmtClass() == PackExpansionExprClass;
3592   }
3593 
3594   // Iterators
children()3595   child_range children() {
3596     return child_range(&Pattern, &Pattern + 1);
3597   }
3598 };
3599 
3600 
3601 /// \brief Represents an expression that computes the length of a parameter
3602 /// pack.
3603 ///
3604 /// \code
3605 /// template<typename ...Types>
3606 /// struct count {
3607 ///   static const unsigned value = sizeof...(Types);
3608 /// };
3609 /// \endcode
3610 class SizeOfPackExpr : public Expr {
3611   /// \brief The location of the \c sizeof keyword.
3612   SourceLocation OperatorLoc;
3613 
3614   /// \brief The location of the name of the parameter pack.
3615   SourceLocation PackLoc;
3616 
3617   /// \brief The location of the closing parenthesis.
3618   SourceLocation RParenLoc;
3619 
3620   /// \brief The length of the parameter pack, if known.
3621   ///
3622   /// When this expression is not value-dependent, this is the length of
3623   /// the pack. When the expression was parsed rather than instantiated
3624   /// (and thus is value-dependent), this is zero.
3625   ///
3626   /// After partial substitution into a sizeof...(X) expression (for instance,
3627   /// within an alias template or during function template argument deduction),
3628   /// we store a trailing array of partially-substituted TemplateArguments,
3629   /// and this is the length of that array.
3630   unsigned Length;
3631 
3632   /// \brief The parameter pack.
3633   NamedDecl *Pack;
3634 
3635   friend class ASTStmtReader;
3636   friend class ASTStmtWriter;
3637 
3638   /// \brief Create an expression that computes the length of
3639   /// the given parameter pack.
SizeOfPackExpr(QualType SizeType,SourceLocation OperatorLoc,NamedDecl * Pack,SourceLocation PackLoc,SourceLocation RParenLoc,Optional<unsigned> Length,ArrayRef<TemplateArgument> PartialArgs)3640   SizeOfPackExpr(QualType SizeType, SourceLocation OperatorLoc, NamedDecl *Pack,
3641                  SourceLocation PackLoc, SourceLocation RParenLoc,
3642                  Optional<unsigned> Length, ArrayRef<TemplateArgument> PartialArgs)
3643       : Expr(SizeOfPackExprClass, SizeType, VK_RValue, OK_Ordinary,
3644              /*TypeDependent=*/false, /*ValueDependent=*/!Length,
3645              /*InstantiationDependent=*/!Length,
3646              /*ContainsUnexpandedParameterPack=*/false),
3647         OperatorLoc(OperatorLoc), PackLoc(PackLoc), RParenLoc(RParenLoc),
3648         Length(Length ? *Length : PartialArgs.size()), Pack(Pack) {
3649     assert((!Length || PartialArgs.empty()) &&
3650            "have partial args for non-dependent sizeof... expression");
3651     TemplateArgument *Args = reinterpret_cast<TemplateArgument *>(this + 1);
3652     std::uninitialized_copy(PartialArgs.begin(), PartialArgs.end(), Args);
3653   }
3654 
3655   /// \brief Create an empty expression.
SizeOfPackExpr(EmptyShell Empty,unsigned NumPartialArgs)3656   SizeOfPackExpr(EmptyShell Empty, unsigned NumPartialArgs)
3657       : Expr(SizeOfPackExprClass, Empty), Length(NumPartialArgs), Pack() {}
3658 
3659 public:
3660   static SizeOfPackExpr *Create(ASTContext &Context, SourceLocation OperatorLoc,
3661                                 NamedDecl *Pack, SourceLocation PackLoc,
3662                                 SourceLocation RParenLoc,
3663                                 Optional<unsigned> Length = None,
3664                                 ArrayRef<TemplateArgument> PartialArgs = None);
3665   static SizeOfPackExpr *CreateDeserialized(ASTContext &Context,
3666                                             unsigned NumPartialArgs);
3667 
3668   /// \brief Determine the location of the 'sizeof' keyword.
getOperatorLoc()3669   SourceLocation getOperatorLoc() const { return OperatorLoc; }
3670 
3671   /// \brief Determine the location of the parameter pack.
getPackLoc()3672   SourceLocation getPackLoc() const { return PackLoc; }
3673 
3674   /// \brief Determine the location of the right parenthesis.
getRParenLoc()3675   SourceLocation getRParenLoc() const { return RParenLoc; }
3676 
3677   /// \brief Retrieve the parameter pack.
getPack()3678   NamedDecl *getPack() const { return Pack; }
3679 
3680   /// \brief Retrieve the length of the parameter pack.
3681   ///
3682   /// This routine may only be invoked when the expression is not
3683   /// value-dependent.
getPackLength()3684   unsigned getPackLength() const {
3685     assert(!isValueDependent() &&
3686            "Cannot get the length of a value-dependent pack size expression");
3687     return Length;
3688   }
3689 
3690   /// \brief Determine whether this represents a partially-substituted sizeof...
3691   /// expression, such as is produced for:
3692   ///
3693   ///   template<typename ...Ts> using X = int[sizeof...(Ts)];
3694   ///   template<typename ...Us> void f(X<Us..., 1, 2, 3, Us...>);
isPartiallySubstituted()3695   bool isPartiallySubstituted() const {
3696     return isValueDependent() && Length;
3697   }
3698 
3699   /// \brief Get
getPartialArguments()3700   ArrayRef<TemplateArgument> getPartialArguments() const {
3701     assert(isPartiallySubstituted());
3702     const TemplateArgument *Args =
3703         reinterpret_cast<const TemplateArgument *>(this + 1);
3704     return llvm::makeArrayRef(Args, Args + Length);
3705   }
3706 
getLocStart()3707   SourceLocation getLocStart() const LLVM_READONLY { return OperatorLoc; }
getLocEnd()3708   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
3709 
classof(const Stmt * T)3710   static bool classof(const Stmt *T) {
3711     return T->getStmtClass() == SizeOfPackExprClass;
3712   }
3713 
3714   // Iterators
children()3715   child_range children() {
3716     return child_range(child_iterator(), child_iterator());
3717   }
3718 };
3719 
3720 /// \brief Represents a reference to a non-type template parameter
3721 /// that has been substituted with a template argument.
3722 class SubstNonTypeTemplateParmExpr : public Expr {
3723   /// \brief The replaced parameter.
3724   NonTypeTemplateParmDecl *Param;
3725 
3726   /// \brief The replacement expression.
3727   Stmt *Replacement;
3728 
3729   /// \brief The location of the non-type template parameter reference.
3730   SourceLocation NameLoc;
3731 
3732   friend class ASTReader;
3733   friend class ASTStmtReader;
SubstNonTypeTemplateParmExpr(EmptyShell Empty)3734   explicit SubstNonTypeTemplateParmExpr(EmptyShell Empty)
3735     : Expr(SubstNonTypeTemplateParmExprClass, Empty) { }
3736 
3737 public:
SubstNonTypeTemplateParmExpr(QualType type,ExprValueKind valueKind,SourceLocation loc,NonTypeTemplateParmDecl * param,Expr * replacement)3738   SubstNonTypeTemplateParmExpr(QualType type,
3739                                ExprValueKind valueKind,
3740                                SourceLocation loc,
3741                                NonTypeTemplateParmDecl *param,
3742                                Expr *replacement)
3743     : Expr(SubstNonTypeTemplateParmExprClass, type, valueKind, OK_Ordinary,
3744            replacement->isTypeDependent(), replacement->isValueDependent(),
3745            replacement->isInstantiationDependent(),
3746            replacement->containsUnexpandedParameterPack()),
3747       Param(param), Replacement(replacement), NameLoc(loc) {}
3748 
getNameLoc()3749   SourceLocation getNameLoc() const { return NameLoc; }
getLocStart()3750   SourceLocation getLocStart() const LLVM_READONLY { return NameLoc; }
getLocEnd()3751   SourceLocation getLocEnd() const LLVM_READONLY { return NameLoc; }
3752 
getReplacement()3753   Expr *getReplacement() const { return cast<Expr>(Replacement); }
3754 
getParameter()3755   NonTypeTemplateParmDecl *getParameter() const { return Param; }
3756 
classof(const Stmt * s)3757   static bool classof(const Stmt *s) {
3758     return s->getStmtClass() == SubstNonTypeTemplateParmExprClass;
3759   }
3760 
3761   // Iterators
children()3762   child_range children() { return child_range(&Replacement, &Replacement+1); }
3763 };
3764 
3765 /// \brief Represents a reference to a non-type template parameter pack that
3766 /// has been substituted with a non-template argument pack.
3767 ///
3768 /// When a pack expansion in the source code contains multiple parameter packs
3769 /// and those parameter packs correspond to different levels of template
3770 /// parameter lists, this node is used to represent a non-type template
3771 /// parameter pack from an outer level, which has already had its argument pack
3772 /// substituted but that still lives within a pack expansion that itself
3773 /// could not be instantiated. When actually performing a substitution into
3774 /// that pack expansion (e.g., when all template parameters have corresponding
3775 /// arguments), this type will be replaced with the appropriate underlying
3776 /// expression at the current pack substitution index.
3777 class SubstNonTypeTemplateParmPackExpr : public Expr {
3778   /// \brief The non-type template parameter pack itself.
3779   NonTypeTemplateParmDecl *Param;
3780 
3781   /// \brief A pointer to the set of template arguments that this
3782   /// parameter pack is instantiated with.
3783   const TemplateArgument *Arguments;
3784 
3785   /// \brief The number of template arguments in \c Arguments.
3786   unsigned NumArguments;
3787 
3788   /// \brief The location of the non-type template parameter pack reference.
3789   SourceLocation NameLoc;
3790 
3791   friend class ASTReader;
3792   friend class ASTStmtReader;
SubstNonTypeTemplateParmPackExpr(EmptyShell Empty)3793   explicit SubstNonTypeTemplateParmPackExpr(EmptyShell Empty)
3794     : Expr(SubstNonTypeTemplateParmPackExprClass, Empty) { }
3795 
3796 public:
3797   SubstNonTypeTemplateParmPackExpr(QualType T,
3798                                    NonTypeTemplateParmDecl *Param,
3799                                    SourceLocation NameLoc,
3800                                    const TemplateArgument &ArgPack);
3801 
3802   /// \brief Retrieve the non-type template parameter pack being substituted.
getParameterPack()3803   NonTypeTemplateParmDecl *getParameterPack() const { return Param; }
3804 
3805   /// \brief Retrieve the location of the parameter pack name.
getParameterPackLocation()3806   SourceLocation getParameterPackLocation() const { return NameLoc; }
3807 
3808   /// \brief Retrieve the template argument pack containing the substituted
3809   /// template arguments.
3810   TemplateArgument getArgumentPack() const;
3811 
getLocStart()3812   SourceLocation getLocStart() const LLVM_READONLY { return NameLoc; }
getLocEnd()3813   SourceLocation getLocEnd() const LLVM_READONLY { return NameLoc; }
3814 
classof(const Stmt * T)3815   static bool classof(const Stmt *T) {
3816     return T->getStmtClass() == SubstNonTypeTemplateParmPackExprClass;
3817   }
3818 
3819   // Iterators
children()3820   child_range children() {
3821     return child_range(child_iterator(), child_iterator());
3822   }
3823 };
3824 
3825 /// \brief Represents a reference to a function parameter pack that has been
3826 /// substituted but not yet expanded.
3827 ///
3828 /// When a pack expansion contains multiple parameter packs at different levels,
3829 /// this node is used to represent a function parameter pack at an outer level
3830 /// which we have already substituted to refer to expanded parameters, but where
3831 /// the containing pack expansion cannot yet be expanded.
3832 ///
3833 /// \code
3834 /// template<typename...Ts> struct S {
3835 ///   template<typename...Us> auto f(Ts ...ts) -> decltype(g(Us(ts)...));
3836 /// };
3837 /// template struct S<int, int>;
3838 /// \endcode
3839 class FunctionParmPackExpr : public Expr {
3840   /// \brief The function parameter pack which was referenced.
3841   ParmVarDecl *ParamPack;
3842 
3843   /// \brief The location of the function parameter pack reference.
3844   SourceLocation NameLoc;
3845 
3846   /// \brief The number of expansions of this pack.
3847   unsigned NumParameters;
3848 
3849   FunctionParmPackExpr(QualType T, ParmVarDecl *ParamPack,
3850                        SourceLocation NameLoc, unsigned NumParams,
3851                        ParmVarDecl *const *Params);
3852 
3853   friend class ASTReader;
3854   friend class ASTStmtReader;
3855 
3856 public:
3857   static FunctionParmPackExpr *Create(const ASTContext &Context, QualType T,
3858                                       ParmVarDecl *ParamPack,
3859                                       SourceLocation NameLoc,
3860                                       ArrayRef<ParmVarDecl *> Params);
3861   static FunctionParmPackExpr *CreateEmpty(const ASTContext &Context,
3862                                            unsigned NumParams);
3863 
3864   /// \brief Get the parameter pack which this expression refers to.
getParameterPack()3865   ParmVarDecl *getParameterPack() const { return ParamPack; }
3866 
3867   /// \brief Get the location of the parameter pack.
getParameterPackLocation()3868   SourceLocation getParameterPackLocation() const { return NameLoc; }
3869 
3870   /// \brief Iterators over the parameters which the parameter pack expanded
3871   /// into.
3872   typedef ParmVarDecl * const *iterator;
begin()3873   iterator begin() const { return reinterpret_cast<iterator>(this+1); }
end()3874   iterator end() const { return begin() + NumParameters; }
3875 
3876   /// \brief Get the number of parameters in this parameter pack.
getNumExpansions()3877   unsigned getNumExpansions() const { return NumParameters; }
3878 
3879   /// \brief Get an expansion of the parameter pack by index.
getExpansion(unsigned I)3880   ParmVarDecl *getExpansion(unsigned I) const { return begin()[I]; }
3881 
getLocStart()3882   SourceLocation getLocStart() const LLVM_READONLY { return NameLoc; }
getLocEnd()3883   SourceLocation getLocEnd() const LLVM_READONLY { return NameLoc; }
3884 
classof(const Stmt * T)3885   static bool classof(const Stmt *T) {
3886     return T->getStmtClass() == FunctionParmPackExprClass;
3887   }
3888 
children()3889   child_range children() {
3890     return child_range(child_iterator(), child_iterator());
3891   }
3892 };
3893 
3894 /// \brief Represents a prvalue temporary that is written into memory so that
3895 /// a reference can bind to it.
3896 ///
3897 /// Prvalue expressions are materialized when they need to have an address
3898 /// in memory for a reference to bind to. This happens when binding a
3899 /// reference to the result of a conversion, e.g.,
3900 ///
3901 /// \code
3902 /// const int &r = 1.0;
3903 /// \endcode
3904 ///
3905 /// Here, 1.0 is implicitly converted to an \c int. That resulting \c int is
3906 /// then materialized via a \c MaterializeTemporaryExpr, and the reference
3907 /// binds to the temporary. \c MaterializeTemporaryExprs are always glvalues
3908 /// (either an lvalue or an xvalue, depending on the kind of reference binding
3909 /// to it), maintaining the invariant that references always bind to glvalues.
3910 ///
3911 /// Reference binding and copy-elision can both extend the lifetime of a
3912 /// temporary. When either happens, the expression will also track the
3913 /// declaration which is responsible for the lifetime extension.
3914 class MaterializeTemporaryExpr : public Expr {
3915 private:
3916   struct ExtraState {
3917     /// \brief The temporary-generating expression whose value will be
3918     /// materialized.
3919     Stmt *Temporary;
3920 
3921     /// \brief The declaration which lifetime-extended this reference, if any.
3922     /// Either a VarDecl, or (for a ctor-initializer) a FieldDecl.
3923     const ValueDecl *ExtendingDecl;
3924 
3925     unsigned ManglingNumber;
3926   };
3927   llvm::PointerUnion<Stmt *, ExtraState *> State;
3928 
3929   friend class ASTStmtReader;
3930   friend class ASTStmtWriter;
3931 
3932   void initializeExtraState(const ValueDecl *ExtendedBy,
3933                             unsigned ManglingNumber);
3934 
3935 public:
MaterializeTemporaryExpr(QualType T,Expr * Temporary,bool BoundToLvalueReference)3936   MaterializeTemporaryExpr(QualType T, Expr *Temporary,
3937                            bool BoundToLvalueReference)
3938     : Expr(MaterializeTemporaryExprClass, T,
3939            BoundToLvalueReference? VK_LValue : VK_XValue, OK_Ordinary,
3940            Temporary->isTypeDependent(), Temporary->isValueDependent(),
3941            Temporary->isInstantiationDependent(),
3942            Temporary->containsUnexpandedParameterPack()),
3943         State(Temporary) {}
3944 
MaterializeTemporaryExpr(EmptyShell Empty)3945   MaterializeTemporaryExpr(EmptyShell Empty)
3946     : Expr(MaterializeTemporaryExprClass, Empty) { }
3947 
getTemporary()3948   Stmt *getTemporary() const {
3949     return State.is<Stmt *>() ? State.get<Stmt *>()
3950                               : State.get<ExtraState *>()->Temporary;
3951   }
3952 
3953   /// \brief Retrieve the temporary-generating subexpression whose value will
3954   /// be materialized into a glvalue.
GetTemporaryExpr()3955   Expr *GetTemporaryExpr() const { return static_cast<Expr *>(getTemporary()); }
3956 
3957   /// \brief Retrieve the storage duration for the materialized temporary.
getStorageDuration()3958   StorageDuration getStorageDuration() const {
3959     const ValueDecl *ExtendingDecl = getExtendingDecl();
3960     if (!ExtendingDecl)
3961       return SD_FullExpression;
3962     // FIXME: This is not necessarily correct for a temporary materialized
3963     // within a default initializer.
3964     if (isa<FieldDecl>(ExtendingDecl))
3965       return SD_Automatic;
3966     return cast<VarDecl>(ExtendingDecl)->getStorageDuration();
3967   }
3968 
3969   /// \brief Get the declaration which triggered the lifetime-extension of this
3970   /// temporary, if any.
getExtendingDecl()3971   const ValueDecl *getExtendingDecl() const {
3972     return State.is<Stmt *>() ? nullptr
3973                               : State.get<ExtraState *>()->ExtendingDecl;
3974   }
3975 
3976   void setExtendingDecl(const ValueDecl *ExtendedBy, unsigned ManglingNumber);
3977 
getManglingNumber()3978   unsigned getManglingNumber() const {
3979     return State.is<Stmt *>() ? 0 : State.get<ExtraState *>()->ManglingNumber;
3980   }
3981 
3982   /// \brief Determine whether this materialized temporary is bound to an
3983   /// lvalue reference; otherwise, it's bound to an rvalue reference.
isBoundToLvalueReference()3984   bool isBoundToLvalueReference() const {
3985     return getValueKind() == VK_LValue;
3986   }
3987 
getLocStart()3988   SourceLocation getLocStart() const LLVM_READONLY {
3989     return getTemporary()->getLocStart();
3990   }
getLocEnd()3991   SourceLocation getLocEnd() const LLVM_READONLY {
3992     return getTemporary()->getLocEnd();
3993   }
3994 
classof(const Stmt * T)3995   static bool classof(const Stmt *T) {
3996     return T->getStmtClass() == MaterializeTemporaryExprClass;
3997   }
3998 
3999   // Iterators
children()4000   child_range children() {
4001     if (State.is<Stmt *>())
4002       return child_range(State.getAddrOfPtr1(), State.getAddrOfPtr1() + 1);
4003 
4004     auto ES = State.get<ExtraState *>();
4005     return child_range(&ES->Temporary, &ES->Temporary + 1);
4006   }
4007 };
4008 
4009 /// \brief Represents a folding of a pack over an operator.
4010 ///
4011 /// This expression is always dependent and represents a pack expansion of the
4012 /// forms:
4013 ///
4014 ///    ( expr op ... )
4015 ///    ( ... op expr )
4016 ///    ( expr op ... op expr )
4017 class CXXFoldExpr : public Expr {
4018   SourceLocation LParenLoc;
4019   SourceLocation EllipsisLoc;
4020   SourceLocation RParenLoc;
4021   Stmt *SubExprs[2];
4022   BinaryOperatorKind Opcode;
4023 
4024   friend class ASTStmtReader;
4025   friend class ASTStmtWriter;
4026 public:
CXXFoldExpr(QualType T,SourceLocation LParenLoc,Expr * LHS,BinaryOperatorKind Opcode,SourceLocation EllipsisLoc,Expr * RHS,SourceLocation RParenLoc)4027   CXXFoldExpr(QualType T, SourceLocation LParenLoc, Expr *LHS,
4028               BinaryOperatorKind Opcode, SourceLocation EllipsisLoc, Expr *RHS,
4029               SourceLocation RParenLoc)
4030       : Expr(CXXFoldExprClass, T, VK_RValue, OK_Ordinary,
4031              /*Dependent*/ true, true, true,
4032              /*ContainsUnexpandedParameterPack*/ false),
4033         LParenLoc(LParenLoc), EllipsisLoc(EllipsisLoc), RParenLoc(RParenLoc),
4034         Opcode(Opcode) {
4035     SubExprs[0] = LHS;
4036     SubExprs[1] = RHS;
4037   }
CXXFoldExpr(EmptyShell Empty)4038   CXXFoldExpr(EmptyShell Empty) : Expr(CXXFoldExprClass, Empty) {}
4039 
getLHS()4040   Expr *getLHS() const { return static_cast<Expr*>(SubExprs[0]); }
getRHS()4041   Expr *getRHS() const { return static_cast<Expr*>(SubExprs[1]); }
4042 
4043   /// Does this produce a right-associated sequence of operators?
isRightFold()4044   bool isRightFold() const {
4045     return getLHS() && getLHS()->containsUnexpandedParameterPack();
4046   }
4047   /// Does this produce a left-associated sequence of operators?
isLeftFold()4048   bool isLeftFold() const { return !isRightFold(); }
4049   /// Get the pattern, that is, the operand that contains an unexpanded pack.
getPattern()4050   Expr *getPattern() const { return isLeftFold() ? getRHS() : getLHS(); }
4051   /// Get the operand that doesn't contain a pack, for a binary fold.
getInit()4052   Expr *getInit() const { return isLeftFold() ? getLHS() : getRHS(); }
4053 
getEllipsisLoc()4054   SourceLocation getEllipsisLoc() const { return EllipsisLoc; }
getOperator()4055   BinaryOperatorKind getOperator() const { return Opcode; }
4056 
getLocStart()4057   SourceLocation getLocStart() const LLVM_READONLY {
4058     return LParenLoc;
4059   }
getLocEnd()4060   SourceLocation getLocEnd() const LLVM_READONLY {
4061     return RParenLoc;
4062   }
4063 
classof(const Stmt * T)4064   static bool classof(const Stmt *T) {
4065     return T->getStmtClass() == CXXFoldExprClass;
4066   }
4067 
4068   // Iterators
children()4069   child_range children() { return child_range(SubExprs, SubExprs + 2); }
4070 };
4071 
4072 /// \brief Represents an expression that might suspend coroutine execution;
4073 /// either a co_await or co_yield expression.
4074 ///
4075 /// Evaluation of this expression first evaluates its 'ready' expression. If
4076 /// that returns 'false':
4077 ///  -- execution of the coroutine is suspended
4078 ///  -- the 'suspend' expression is evaluated
4079 ///     -- if the 'suspend' expression returns 'false', the coroutine is
4080 ///        resumed
4081 ///     -- otherwise, control passes back to the resumer.
4082 /// If the coroutine is not suspended, or when it is resumed, the 'resume'
4083 /// expression is evaluated, and its result is the result of the overall
4084 /// expression.
4085 class CoroutineSuspendExpr : public Expr {
4086   SourceLocation KeywordLoc;
4087 
4088   enum SubExpr { Common, Ready, Suspend, Resume, Count };
4089   Stmt *SubExprs[SubExpr::Count];
4090 
4091   friend class ASTStmtReader;
4092 public:
CoroutineSuspendExpr(StmtClass SC,SourceLocation KeywordLoc,Expr * Common,Expr * Ready,Expr * Suspend,Expr * Resume)4093   CoroutineSuspendExpr(StmtClass SC, SourceLocation KeywordLoc, Expr *Common,
4094                        Expr *Ready, Expr *Suspend, Expr *Resume)
4095       : Expr(SC, Resume->getType(), Resume->getValueKind(),
4096              Resume->getObjectKind(), Resume->isTypeDependent(),
4097              Resume->isValueDependent(), Common->isInstantiationDependent(),
4098              Common->containsUnexpandedParameterPack()),
4099         KeywordLoc(KeywordLoc) {
4100     SubExprs[SubExpr::Common] = Common;
4101     SubExprs[SubExpr::Ready] = Ready;
4102     SubExprs[SubExpr::Suspend] = Suspend;
4103     SubExprs[SubExpr::Resume] = Resume;
4104   }
CoroutineSuspendExpr(StmtClass SC,SourceLocation KeywordLoc,QualType Ty,Expr * Common)4105   CoroutineSuspendExpr(StmtClass SC, SourceLocation KeywordLoc, QualType Ty,
4106                        Expr *Common)
4107       : Expr(SC, Ty, VK_RValue, OK_Ordinary, true, true, true,
4108              Common->containsUnexpandedParameterPack()),
4109         KeywordLoc(KeywordLoc) {
4110     assert(Common->isTypeDependent() && Ty->isDependentType() &&
4111            "wrong constructor for non-dependent co_await/co_yield expression");
4112     SubExprs[SubExpr::Common] = Common;
4113     SubExprs[SubExpr::Ready] = nullptr;
4114     SubExprs[SubExpr::Suspend] = nullptr;
4115     SubExprs[SubExpr::Resume] = nullptr;
4116   }
CoroutineSuspendExpr(StmtClass SC,EmptyShell Empty)4117   CoroutineSuspendExpr(StmtClass SC, EmptyShell Empty) : Expr(SC, Empty) {
4118     SubExprs[SubExpr::Common] = nullptr;
4119     SubExprs[SubExpr::Ready] = nullptr;
4120     SubExprs[SubExpr::Suspend] = nullptr;
4121     SubExprs[SubExpr::Resume] = nullptr;
4122   }
4123 
getKeywordLoc()4124   SourceLocation getKeywordLoc() const { return KeywordLoc; }
getCommonExpr()4125   Expr *getCommonExpr() const {
4126     return static_cast<Expr*>(SubExprs[SubExpr::Common]);
4127   }
4128 
getReadyExpr()4129   Expr *getReadyExpr() const {
4130     return static_cast<Expr*>(SubExprs[SubExpr::Ready]);
4131   }
getSuspendExpr()4132   Expr *getSuspendExpr() const {
4133     return static_cast<Expr*>(SubExprs[SubExpr::Suspend]);
4134   }
getResumeExpr()4135   Expr *getResumeExpr() const {
4136     return static_cast<Expr*>(SubExprs[SubExpr::Resume]);
4137   }
4138 
getLocStart()4139   SourceLocation getLocStart() const LLVM_READONLY {
4140     return KeywordLoc;
4141   }
getLocEnd()4142   SourceLocation getLocEnd() const LLVM_READONLY {
4143     return getCommonExpr()->getLocEnd();
4144   }
4145 
children()4146   child_range children() {
4147     return child_range(SubExprs, SubExprs + SubExpr::Count);
4148   }
4149 
classof(const Stmt * T)4150   static bool classof(const Stmt *T) {
4151     return T->getStmtClass() == CoawaitExprClass ||
4152            T->getStmtClass() == CoyieldExprClass;
4153   }
4154 };
4155 
4156 /// \brief Represents a 'co_await' expression.
4157 class CoawaitExpr : public CoroutineSuspendExpr {
4158   friend class ASTStmtReader;
4159 public:
CoawaitExpr(SourceLocation CoawaitLoc,Expr * Operand,Expr * Ready,Expr * Suspend,Expr * Resume)4160   CoawaitExpr(SourceLocation CoawaitLoc, Expr *Operand, Expr *Ready,
4161               Expr *Suspend, Expr *Resume)
4162       : CoroutineSuspendExpr(CoawaitExprClass, CoawaitLoc, Operand, Ready,
4163                              Suspend, Resume) {}
CoawaitExpr(SourceLocation CoawaitLoc,QualType Ty,Expr * Operand)4164   CoawaitExpr(SourceLocation CoawaitLoc, QualType Ty, Expr *Operand)
4165       : CoroutineSuspendExpr(CoawaitExprClass, CoawaitLoc, Ty, Operand) {}
CoawaitExpr(EmptyShell Empty)4166   CoawaitExpr(EmptyShell Empty)
4167       : CoroutineSuspendExpr(CoawaitExprClass, Empty) {}
4168 
getOperand()4169   Expr *getOperand() const {
4170     // FIXME: Dig out the actual operand or store it.
4171     return getCommonExpr();
4172   }
4173 
classof(const Stmt * T)4174   static bool classof(const Stmt *T) {
4175     return T->getStmtClass() == CoawaitExprClass;
4176   }
4177 };
4178 
4179 /// \brief Represents a 'co_yield' expression.
4180 class CoyieldExpr : public CoroutineSuspendExpr {
4181   friend class ASTStmtReader;
4182 public:
CoyieldExpr(SourceLocation CoyieldLoc,Expr * Operand,Expr * Ready,Expr * Suspend,Expr * Resume)4183   CoyieldExpr(SourceLocation CoyieldLoc, Expr *Operand, Expr *Ready,
4184               Expr *Suspend, Expr *Resume)
4185       : CoroutineSuspendExpr(CoyieldExprClass, CoyieldLoc, Operand, Ready,
4186                              Suspend, Resume) {}
CoyieldExpr(SourceLocation CoyieldLoc,QualType Ty,Expr * Operand)4187   CoyieldExpr(SourceLocation CoyieldLoc, QualType Ty, Expr *Operand)
4188       : CoroutineSuspendExpr(CoyieldExprClass, CoyieldLoc, Ty, Operand) {}
CoyieldExpr(EmptyShell Empty)4189   CoyieldExpr(EmptyShell Empty)
4190       : CoroutineSuspendExpr(CoyieldExprClass, Empty) {}
4191 
getOperand()4192   Expr *getOperand() const {
4193     // FIXME: Dig out the actual operand or store it.
4194     return getCommonExpr();
4195   }
4196 
classof(const Stmt * T)4197   static bool classof(const Stmt *T) {
4198     return T->getStmtClass() == CoyieldExprClass;
4199   }
4200 };
4201 
4202 }  // end namespace clang
4203 
4204 #endif
4205