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