xref: /llvm-project/clang/include/clang/AST/ExprCXX.h (revision abc8812df02599fc413d9ed77b992f8236ed2af9)
1 //===- ExprCXX.h - Classes for representing expressions ---------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 /// \file
10 /// Defines the clang::Expr interface and subclasses for C++ expressions.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CLANG_AST_EXPRCXX_H
15 #define LLVM_CLANG_AST_EXPRCXX_H
16 
17 #include "clang/AST/ASTConcept.h"
18 #include "clang/AST/ComputeDependence.h"
19 #include "clang/AST/Decl.h"
20 #include "clang/AST/DeclBase.h"
21 #include "clang/AST/DeclCXX.h"
22 #include "clang/AST/DeclTemplate.h"
23 #include "clang/AST/DeclarationName.h"
24 #include "clang/AST/DependenceFlags.h"
25 #include "clang/AST/Expr.h"
26 #include "clang/AST/NestedNameSpecifier.h"
27 #include "clang/AST/OperationKinds.h"
28 #include "clang/AST/Stmt.h"
29 #include "clang/AST/StmtCXX.h"
30 #include "clang/AST/TemplateBase.h"
31 #include "clang/AST/Type.h"
32 #include "clang/AST/UnresolvedSet.h"
33 #include "clang/Basic/ExceptionSpecificationType.h"
34 #include "clang/Basic/ExpressionTraits.h"
35 #include "clang/Basic/LLVM.h"
36 #include "clang/Basic/Lambda.h"
37 #include "clang/Basic/LangOptions.h"
38 #include "clang/Basic/OperatorKinds.h"
39 #include "clang/Basic/SourceLocation.h"
40 #include "clang/Basic/Specifiers.h"
41 #include "clang/Basic/TypeTraits.h"
42 #include "llvm/ADT/ArrayRef.h"
43 #include "llvm/ADT/PointerUnion.h"
44 #include "llvm/ADT/StringRef.h"
45 #include "llvm/ADT/iterator_range.h"
46 #include "llvm/Support/Casting.h"
47 #include "llvm/Support/Compiler.h"
48 #include "llvm/Support/TrailingObjects.h"
49 #include <cassert>
50 #include <cstddef>
51 #include <cstdint>
52 #include <memory>
53 #include <optional>
54 
55 namespace clang {
56 
57 class ASTContext;
58 class DeclAccessPair;
59 class IdentifierInfo;
60 class LambdaCapture;
61 class NonTypeTemplateParmDecl;
62 class TemplateParameterList;
63 
64 //===--------------------------------------------------------------------===//
65 // C++ Expressions.
66 //===--------------------------------------------------------------------===//
67 
68 /// A call to an overloaded operator written using operator
69 /// syntax.
70 ///
71 /// Represents a call to an overloaded operator written using operator
72 /// syntax, e.g., "x + y" or "*p". While semantically equivalent to a
73 /// normal call, this AST node provides better information about the
74 /// syntactic representation of the call.
75 ///
76 /// In a C++ template, this expression node kind will be used whenever
77 /// any of the arguments are type-dependent. In this case, the
78 /// function itself will be a (possibly empty) set of functions and
79 /// function templates that were found by name lookup at template
80 /// definition time.
81 class CXXOperatorCallExpr final : public CallExpr {
82   friend class ASTStmtReader;
83   friend class ASTStmtWriter;
84 
85   SourceRange Range;
86 
87   // CXXOperatorCallExpr has some trailing objects belonging
88   // to CallExpr. See CallExpr for the details.
89 
90   SourceRange getSourceRangeImpl() const LLVM_READONLY;
91 
92   CXXOperatorCallExpr(OverloadedOperatorKind OpKind, Expr *Fn,
93                       ArrayRef<Expr *> Args, QualType Ty, ExprValueKind VK,
94                       SourceLocation OperatorLoc, FPOptionsOverride FPFeatures,
95                       ADLCallKind UsesADL);
96 
97   CXXOperatorCallExpr(unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty);
98 
99 public:
100   static CXXOperatorCallExpr *
101   Create(const ASTContext &Ctx, OverloadedOperatorKind OpKind, Expr *Fn,
102          ArrayRef<Expr *> Args, QualType Ty, ExprValueKind VK,
103          SourceLocation OperatorLoc, FPOptionsOverride FPFeatures,
104          ADLCallKind UsesADL = NotADL);
105 
106   static CXXOperatorCallExpr *CreateEmpty(const ASTContext &Ctx,
107                                           unsigned NumArgs, bool HasFPFeatures,
108                                           EmptyShell Empty);
109 
110   /// Returns the kind of overloaded operator that this expression refers to.
111   OverloadedOperatorKind getOperator() const {
112     return static_cast<OverloadedOperatorKind>(
113         CXXOperatorCallExprBits.OperatorKind);
114   }
115 
116   static bool isAssignmentOp(OverloadedOperatorKind Opc) {
117     return Opc == OO_Equal || Opc == OO_StarEqual || Opc == OO_SlashEqual ||
118            Opc == OO_PercentEqual || Opc == OO_PlusEqual ||
119            Opc == OO_MinusEqual || Opc == OO_LessLessEqual ||
120            Opc == OO_GreaterGreaterEqual || Opc == OO_AmpEqual ||
121            Opc == OO_CaretEqual || Opc == OO_PipeEqual;
122   }
123   bool isAssignmentOp() const { return isAssignmentOp(getOperator()); }
124 
125   static bool isComparisonOp(OverloadedOperatorKind Opc) {
126     switch (Opc) {
127     case OO_EqualEqual:
128     case OO_ExclaimEqual:
129     case OO_Greater:
130     case OO_GreaterEqual:
131     case OO_Less:
132     case OO_LessEqual:
133     case OO_Spaceship:
134       return true;
135     default:
136       return false;
137     }
138   }
139   bool isComparisonOp() const { return isComparisonOp(getOperator()); }
140 
141   /// Is this written as an infix binary operator?
142   bool isInfixBinaryOp() const;
143 
144   /// Returns the location of the operator symbol in the expression.
145   ///
146   /// When \c getOperator()==OO_Call, this is the location of the right
147   /// parentheses; when \c getOperator()==OO_Subscript, this is the location
148   /// of the right bracket.
149   SourceLocation getOperatorLoc() const { return getRParenLoc(); }
150 
151   SourceLocation getExprLoc() const LLVM_READONLY {
152     OverloadedOperatorKind Operator = getOperator();
153     return (Operator < OO_Plus || Operator >= OO_Arrow ||
154             Operator == OO_PlusPlus || Operator == OO_MinusMinus)
155                ? getBeginLoc()
156                : getOperatorLoc();
157   }
158 
159   SourceLocation getBeginLoc() const { return Range.getBegin(); }
160   SourceLocation getEndLoc() const { return Range.getEnd(); }
161   SourceRange getSourceRange() const { return Range; }
162 
163   static bool classof(const Stmt *T) {
164     return T->getStmtClass() == CXXOperatorCallExprClass;
165   }
166 };
167 
168 /// Represents a call to a member function that
169 /// may be written either with member call syntax (e.g., "obj.func()"
170 /// or "objptr->func()") or with normal function-call syntax
171 /// ("func()") within a member function that ends up calling a member
172 /// function. The callee in either case is a MemberExpr that contains
173 /// both the object argument and the member function, while the
174 /// arguments are the arguments within the parentheses (not including
175 /// the object argument).
176 class CXXMemberCallExpr final : public CallExpr {
177   // CXXMemberCallExpr has some trailing objects belonging
178   // to CallExpr. See CallExpr for the details.
179 
180   CXXMemberCallExpr(Expr *Fn, ArrayRef<Expr *> Args, QualType Ty,
181                     ExprValueKind VK, SourceLocation RP,
182                     FPOptionsOverride FPOptions, unsigned MinNumArgs);
183 
184   CXXMemberCallExpr(unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty);
185 
186 public:
187   static CXXMemberCallExpr *Create(const ASTContext &Ctx, Expr *Fn,
188                                    ArrayRef<Expr *> Args, QualType Ty,
189                                    ExprValueKind VK, SourceLocation RP,
190                                    FPOptionsOverride FPFeatures,
191                                    unsigned MinNumArgs = 0);
192 
193   static CXXMemberCallExpr *CreateEmpty(const ASTContext &Ctx, unsigned NumArgs,
194                                         bool HasFPFeatures, EmptyShell Empty);
195 
196   /// Retrieve the implicit object argument for the member call.
197   ///
198   /// For example, in "x.f(5)", this returns the sub-expression "x".
199   Expr *getImplicitObjectArgument() const;
200 
201   /// Retrieve the type of the object argument.
202   ///
203   /// Note that this always returns a non-pointer type.
204   QualType getObjectType() const;
205 
206   /// Retrieve the declaration of the called method.
207   CXXMethodDecl *getMethodDecl() const;
208 
209   /// Retrieve the CXXRecordDecl for the underlying type of
210   /// the implicit object argument.
211   ///
212   /// Note that this is may not be the same declaration as that of the class
213   /// context of the CXXMethodDecl which this function is calling.
214   /// FIXME: Returns 0 for member pointer call exprs.
215   CXXRecordDecl *getRecordDecl() const;
216 
217   SourceLocation getExprLoc() const LLVM_READONLY {
218     SourceLocation CLoc = getCallee()->getExprLoc();
219     if (CLoc.isValid())
220       return CLoc;
221 
222     return getBeginLoc();
223   }
224 
225   static bool classof(const Stmt *T) {
226     return T->getStmtClass() == CXXMemberCallExprClass;
227   }
228 };
229 
230 /// Represents a call to a CUDA kernel function.
231 class CUDAKernelCallExpr final : public CallExpr {
232   friend class ASTStmtReader;
233 
234   enum { CONFIG, END_PREARG };
235 
236   // CUDAKernelCallExpr has some trailing objects belonging
237   // to CallExpr. See CallExpr for the details.
238 
239   CUDAKernelCallExpr(Expr *Fn, CallExpr *Config, ArrayRef<Expr *> Args,
240                      QualType Ty, ExprValueKind VK, SourceLocation RP,
241                      FPOptionsOverride FPFeatures, unsigned MinNumArgs);
242 
243   CUDAKernelCallExpr(unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty);
244 
245 public:
246   static CUDAKernelCallExpr *Create(const ASTContext &Ctx, Expr *Fn,
247                                     CallExpr *Config, ArrayRef<Expr *> Args,
248                                     QualType Ty, ExprValueKind VK,
249                                     SourceLocation RP,
250                                     FPOptionsOverride FPFeatures,
251                                     unsigned MinNumArgs = 0);
252 
253   static CUDAKernelCallExpr *CreateEmpty(const ASTContext &Ctx,
254                                          unsigned NumArgs, bool HasFPFeatures,
255                                          EmptyShell Empty);
256 
257   const CallExpr *getConfig() const {
258     return cast_or_null<CallExpr>(getPreArg(CONFIG));
259   }
260   CallExpr *getConfig() { return cast_or_null<CallExpr>(getPreArg(CONFIG)); }
261 
262   static bool classof(const Stmt *T) {
263     return T->getStmtClass() == CUDAKernelCallExprClass;
264   }
265 };
266 
267 /// A rewritten comparison expression that was originally written using
268 /// operator syntax.
269 ///
270 /// In C++20, the following rewrites are performed:
271 /// - <tt>a == b</tt> -> <tt>b == a</tt>
272 /// - <tt>a != b</tt> -> <tt>!(a == b)</tt>
273 /// - <tt>a != b</tt> -> <tt>!(b == a)</tt>
274 /// - For \c \@ in \c <, \c <=, \c >, \c >=, \c <=>:
275 ///   - <tt>a @ b</tt> -> <tt>(a <=> b) @ 0</tt>
276 ///   - <tt>a @ b</tt> -> <tt>0 @ (b <=> a)</tt>
277 ///
278 /// This expression provides access to both the original syntax and the
279 /// rewritten expression.
280 ///
281 /// Note that the rewritten calls to \c ==, \c <=>, and \c \@ are typically
282 /// \c CXXOperatorCallExprs, but could theoretically be \c BinaryOperators.
283 class CXXRewrittenBinaryOperator : public Expr {
284   friend class ASTStmtReader;
285 
286   /// The rewritten semantic form.
287   Stmt *SemanticForm;
288 
289 public:
290   CXXRewrittenBinaryOperator(Expr *SemanticForm, bool IsReversed)
291       : Expr(CXXRewrittenBinaryOperatorClass, SemanticForm->getType(),
292              SemanticForm->getValueKind(), SemanticForm->getObjectKind()),
293         SemanticForm(SemanticForm) {
294     CXXRewrittenBinaryOperatorBits.IsReversed = IsReversed;
295     setDependence(computeDependence(this));
296   }
297   CXXRewrittenBinaryOperator(EmptyShell Empty)
298       : Expr(CXXRewrittenBinaryOperatorClass, Empty), SemanticForm() {}
299 
300   /// Get an equivalent semantic form for this expression.
301   Expr *getSemanticForm() { return cast<Expr>(SemanticForm); }
302   const Expr *getSemanticForm() const { return cast<Expr>(SemanticForm); }
303 
304   struct DecomposedForm {
305     /// The original opcode, prior to rewriting.
306     BinaryOperatorKind Opcode;
307     /// The original left-hand side.
308     const Expr *LHS;
309     /// The original right-hand side.
310     const Expr *RHS;
311     /// The inner \c == or \c <=> operator expression.
312     const Expr *InnerBinOp;
313   };
314 
315   /// Decompose this operator into its syntactic form.
316   DecomposedForm getDecomposedForm() const LLVM_READONLY;
317 
318   /// Determine whether this expression was rewritten in reverse form.
319   bool isReversed() const { return CXXRewrittenBinaryOperatorBits.IsReversed; }
320 
321   BinaryOperatorKind getOperator() const { return getDecomposedForm().Opcode; }
322   BinaryOperatorKind getOpcode() const { return getOperator(); }
323   static StringRef getOpcodeStr(BinaryOperatorKind Op) {
324     return BinaryOperator::getOpcodeStr(Op);
325   }
326   StringRef getOpcodeStr() const {
327     return BinaryOperator::getOpcodeStr(getOpcode());
328   }
329   bool isComparisonOp() const { return true; }
330   bool isAssignmentOp() const { return false; }
331 
332   const Expr *getLHS() const { return getDecomposedForm().LHS; }
333   const Expr *getRHS() const { return getDecomposedForm().RHS; }
334 
335   SourceLocation getOperatorLoc() const LLVM_READONLY {
336     return getDecomposedForm().InnerBinOp->getExprLoc();
337   }
338   SourceLocation getExprLoc() const LLVM_READONLY { return getOperatorLoc(); }
339 
340   /// Compute the begin and end locations from the decomposed form.
341   /// The locations of the semantic form are not reliable if this is
342   /// a reversed expression.
343   //@{
344   SourceLocation getBeginLoc() const LLVM_READONLY {
345     return getDecomposedForm().LHS->getBeginLoc();
346   }
347   SourceLocation getEndLoc() const LLVM_READONLY {
348     return getDecomposedForm().RHS->getEndLoc();
349   }
350   SourceRange getSourceRange() const LLVM_READONLY {
351     DecomposedForm DF = getDecomposedForm();
352     return SourceRange(DF.LHS->getBeginLoc(), DF.RHS->getEndLoc());
353   }
354   //@}
355 
356   child_range children() {
357     return child_range(&SemanticForm, &SemanticForm + 1);
358   }
359 
360   static bool classof(const Stmt *T) {
361     return T->getStmtClass() == CXXRewrittenBinaryOperatorClass;
362   }
363 };
364 
365 /// Abstract class common to all of the C++ "named"/"keyword" casts.
366 ///
367 /// This abstract class is inherited by all of the classes
368 /// representing "named" casts: CXXStaticCastExpr for \c static_cast,
369 /// CXXDynamicCastExpr for \c dynamic_cast, CXXReinterpretCastExpr for
370 /// reinterpret_cast, CXXConstCastExpr for \c const_cast and
371 /// CXXAddrspaceCastExpr for addrspace_cast (in OpenCL).
372 class CXXNamedCastExpr : public ExplicitCastExpr {
373 private:
374   // the location of the casting op
375   SourceLocation Loc;
376 
377   // the location of the right parenthesis
378   SourceLocation RParenLoc;
379 
380   // range for '<' '>'
381   SourceRange AngleBrackets;
382 
383 protected:
384   friend class ASTStmtReader;
385 
386   CXXNamedCastExpr(StmtClass SC, QualType ty, ExprValueKind VK, CastKind kind,
387                    Expr *op, unsigned PathSize, bool HasFPFeatures,
388                    TypeSourceInfo *writtenTy, SourceLocation l,
389                    SourceLocation RParenLoc, SourceRange AngleBrackets)
390       : ExplicitCastExpr(SC, ty, VK, kind, op, PathSize, HasFPFeatures,
391                          writtenTy),
392         Loc(l), RParenLoc(RParenLoc), AngleBrackets(AngleBrackets) {}
393 
394   explicit CXXNamedCastExpr(StmtClass SC, EmptyShell Shell, unsigned PathSize,
395                             bool HasFPFeatures)
396       : ExplicitCastExpr(SC, Shell, PathSize, HasFPFeatures) {}
397 
398 public:
399   const char *getCastName() const;
400 
401   /// Retrieve the location of the cast operator keyword, e.g.,
402   /// \c static_cast.
403   SourceLocation getOperatorLoc() const { return Loc; }
404 
405   /// Retrieve the location of the closing parenthesis.
406   SourceLocation getRParenLoc() const { return RParenLoc; }
407 
408   SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
409   SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
410   SourceRange getAngleBrackets() const LLVM_READONLY { return AngleBrackets; }
411 
412   static bool classof(const Stmt *T) {
413     switch (T->getStmtClass()) {
414     case CXXStaticCastExprClass:
415     case CXXDynamicCastExprClass:
416     case CXXReinterpretCastExprClass:
417     case CXXConstCastExprClass:
418     case CXXAddrspaceCastExprClass:
419       return true;
420     default:
421       return false;
422     }
423   }
424 };
425 
426 /// A C++ \c static_cast expression (C++ [expr.static.cast]).
427 ///
428 /// This expression node represents a C++ static cast, e.g.,
429 /// \c static_cast<int>(1.0).
430 class CXXStaticCastExpr final
431     : public CXXNamedCastExpr,
432       private llvm::TrailingObjects<CXXStaticCastExpr, CXXBaseSpecifier *,
433                                     FPOptionsOverride> {
434   CXXStaticCastExpr(QualType ty, ExprValueKind vk, CastKind kind, Expr *op,
435                     unsigned pathSize, TypeSourceInfo *writtenTy,
436                     FPOptionsOverride FPO, SourceLocation l,
437                     SourceLocation RParenLoc, SourceRange AngleBrackets)
438       : CXXNamedCastExpr(CXXStaticCastExprClass, ty, vk, kind, op, pathSize,
439                          FPO.requiresTrailingStorage(), writtenTy, l, RParenLoc,
440                          AngleBrackets) {
441     if (hasStoredFPFeatures())
442       *getTrailingFPFeatures() = FPO;
443   }
444 
445   explicit CXXStaticCastExpr(EmptyShell Empty, unsigned PathSize,
446                              bool HasFPFeatures)
447       : CXXNamedCastExpr(CXXStaticCastExprClass, Empty, PathSize,
448                          HasFPFeatures) {}
449 
450   unsigned numTrailingObjects(OverloadToken<CXXBaseSpecifier *>) const {
451     return path_size();
452   }
453 
454 public:
455   friend class CastExpr;
456   friend TrailingObjects;
457 
458   static CXXStaticCastExpr *
459   Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K,
460          Expr *Op, const CXXCastPath *Path, TypeSourceInfo *Written,
461          FPOptionsOverride FPO, SourceLocation L, SourceLocation RParenLoc,
462          SourceRange AngleBrackets);
463   static CXXStaticCastExpr *CreateEmpty(const ASTContext &Context,
464                                         unsigned PathSize, bool hasFPFeatures);
465 
466   static bool classof(const Stmt *T) {
467     return T->getStmtClass() == CXXStaticCastExprClass;
468   }
469 };
470 
471 /// A C++ @c dynamic_cast expression (C++ [expr.dynamic.cast]).
472 ///
473 /// This expression node represents a dynamic cast, e.g.,
474 /// \c dynamic_cast<Derived*>(BasePtr). Such a cast may perform a run-time
475 /// check to determine how to perform the type conversion.
476 class CXXDynamicCastExpr final
477     : public CXXNamedCastExpr,
478       private llvm::TrailingObjects<CXXDynamicCastExpr, CXXBaseSpecifier *> {
479   CXXDynamicCastExpr(QualType ty, ExprValueKind VK, CastKind kind, Expr *op,
480                      unsigned pathSize, TypeSourceInfo *writtenTy,
481                      SourceLocation l, SourceLocation RParenLoc,
482                      SourceRange AngleBrackets)
483       : CXXNamedCastExpr(CXXDynamicCastExprClass, ty, VK, kind, op, pathSize,
484                          /*HasFPFeatures*/ false, writtenTy, l, RParenLoc,
485                          AngleBrackets) {}
486 
487   explicit CXXDynamicCastExpr(EmptyShell Empty, unsigned pathSize)
488       : CXXNamedCastExpr(CXXDynamicCastExprClass, Empty, pathSize,
489                          /*HasFPFeatures*/ false) {}
490 
491 public:
492   friend class CastExpr;
493   friend TrailingObjects;
494 
495   static CXXDynamicCastExpr *Create(const ASTContext &Context, QualType T,
496                                     ExprValueKind VK, CastKind Kind, Expr *Op,
497                                     const CXXCastPath *Path,
498                                     TypeSourceInfo *Written, SourceLocation L,
499                                     SourceLocation RParenLoc,
500                                     SourceRange AngleBrackets);
501 
502   static CXXDynamicCastExpr *CreateEmpty(const ASTContext &Context,
503                                          unsigned pathSize);
504 
505   bool isAlwaysNull() const;
506 
507   static bool classof(const Stmt *T) {
508     return T->getStmtClass() == CXXDynamicCastExprClass;
509   }
510 };
511 
512 /// A C++ @c reinterpret_cast expression (C++ [expr.reinterpret.cast]).
513 ///
514 /// This expression node represents a reinterpret cast, e.g.,
515 /// @c reinterpret_cast<int>(VoidPtr).
516 ///
517 /// A reinterpret_cast provides a differently-typed view of a value but
518 /// (in Clang, as in most C++ implementations) performs no actual work at
519 /// run time.
520 class CXXReinterpretCastExpr final
521     : public CXXNamedCastExpr,
522       private llvm::TrailingObjects<CXXReinterpretCastExpr,
523                                     CXXBaseSpecifier *> {
524   CXXReinterpretCastExpr(QualType ty, ExprValueKind vk, CastKind kind, Expr *op,
525                          unsigned pathSize, TypeSourceInfo *writtenTy,
526                          SourceLocation l, SourceLocation RParenLoc,
527                          SourceRange AngleBrackets)
528       : CXXNamedCastExpr(CXXReinterpretCastExprClass, ty, vk, kind, op,
529                          pathSize, /*HasFPFeatures*/ false, writtenTy, l,
530                          RParenLoc, AngleBrackets) {}
531 
532   CXXReinterpretCastExpr(EmptyShell Empty, unsigned pathSize)
533       : CXXNamedCastExpr(CXXReinterpretCastExprClass, Empty, pathSize,
534                          /*HasFPFeatures*/ false) {}
535 
536 public:
537   friend class CastExpr;
538   friend TrailingObjects;
539 
540   static CXXReinterpretCastExpr *Create(const ASTContext &Context, QualType T,
541                                         ExprValueKind VK, CastKind Kind,
542                                         Expr *Op, const CXXCastPath *Path,
543                                  TypeSourceInfo *WrittenTy, SourceLocation L,
544                                         SourceLocation RParenLoc,
545                                         SourceRange AngleBrackets);
546   static CXXReinterpretCastExpr *CreateEmpty(const ASTContext &Context,
547                                              unsigned pathSize);
548 
549   static bool classof(const Stmt *T) {
550     return T->getStmtClass() == CXXReinterpretCastExprClass;
551   }
552 };
553 
554 /// A C++ \c const_cast expression (C++ [expr.const.cast]).
555 ///
556 /// This expression node represents a const cast, e.g.,
557 /// \c const_cast<char*>(PtrToConstChar).
558 ///
559 /// A const_cast can remove type qualifiers but does not change the underlying
560 /// value.
561 class CXXConstCastExpr final
562     : public CXXNamedCastExpr,
563       private llvm::TrailingObjects<CXXConstCastExpr, CXXBaseSpecifier *> {
564   CXXConstCastExpr(QualType ty, ExprValueKind VK, Expr *op,
565                    TypeSourceInfo *writtenTy, SourceLocation l,
566                    SourceLocation RParenLoc, SourceRange AngleBrackets)
567       : CXXNamedCastExpr(CXXConstCastExprClass, ty, VK, CK_NoOp, op, 0,
568                          /*HasFPFeatures*/ false, writtenTy, l, RParenLoc,
569                          AngleBrackets) {}
570 
571   explicit CXXConstCastExpr(EmptyShell Empty)
572       : CXXNamedCastExpr(CXXConstCastExprClass, Empty, 0,
573                          /*HasFPFeatures*/ false) {}
574 
575 public:
576   friend class CastExpr;
577   friend TrailingObjects;
578 
579   static CXXConstCastExpr *Create(const ASTContext &Context, QualType T,
580                                   ExprValueKind VK, Expr *Op,
581                                   TypeSourceInfo *WrittenTy, SourceLocation L,
582                                   SourceLocation RParenLoc,
583                                   SourceRange AngleBrackets);
584   static CXXConstCastExpr *CreateEmpty(const ASTContext &Context);
585 
586   static bool classof(const Stmt *T) {
587     return T->getStmtClass() == CXXConstCastExprClass;
588   }
589 };
590 
591 /// A C++ addrspace_cast expression (currently only enabled for OpenCL).
592 ///
593 /// This expression node represents a cast between pointers to objects in
594 /// different address spaces e.g.,
595 /// \c addrspace_cast<global int*>(PtrToGenericInt).
596 ///
597 /// A addrspace_cast can cast address space type qualifiers but does not change
598 /// the underlying value.
599 class CXXAddrspaceCastExpr final
600     : public CXXNamedCastExpr,
601       private llvm::TrailingObjects<CXXAddrspaceCastExpr, CXXBaseSpecifier *> {
602   CXXAddrspaceCastExpr(QualType ty, ExprValueKind VK, CastKind Kind, Expr *op,
603                        TypeSourceInfo *writtenTy, SourceLocation l,
604                        SourceLocation RParenLoc, SourceRange AngleBrackets)
605       : CXXNamedCastExpr(CXXAddrspaceCastExprClass, ty, VK, Kind, op, 0,
606                          /*HasFPFeatures*/ false, writtenTy, l, RParenLoc,
607                          AngleBrackets) {}
608 
609   explicit CXXAddrspaceCastExpr(EmptyShell Empty)
610       : CXXNamedCastExpr(CXXAddrspaceCastExprClass, Empty, 0,
611                          /*HasFPFeatures*/ false) {}
612 
613 public:
614   friend class CastExpr;
615   friend TrailingObjects;
616 
617   static CXXAddrspaceCastExpr *
618   Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind Kind,
619          Expr *Op, TypeSourceInfo *WrittenTy, SourceLocation L,
620          SourceLocation RParenLoc, SourceRange AngleBrackets);
621   static CXXAddrspaceCastExpr *CreateEmpty(const ASTContext &Context);
622 
623   static bool classof(const Stmt *T) {
624     return T->getStmtClass() == CXXAddrspaceCastExprClass;
625   }
626 };
627 
628 /// A call to a literal operator (C++11 [over.literal])
629 /// written as a user-defined literal (C++11 [lit.ext]).
630 ///
631 /// Represents a user-defined literal, e.g. "foo"_bar or 1.23_xyz. While this
632 /// is semantically equivalent to a normal call, this AST node provides better
633 /// information about the syntactic representation of the literal.
634 ///
635 /// Since literal operators are never found by ADL and can only be declared at
636 /// namespace scope, a user-defined literal is never dependent.
637 class UserDefinedLiteral final : public CallExpr {
638   friend class ASTStmtReader;
639   friend class ASTStmtWriter;
640 
641   /// The location of a ud-suffix within the literal.
642   SourceLocation UDSuffixLoc;
643 
644   // UserDefinedLiteral has some trailing objects belonging
645   // to CallExpr. See CallExpr for the details.
646 
647   UserDefinedLiteral(Expr *Fn, ArrayRef<Expr *> Args, QualType Ty,
648                      ExprValueKind VK, SourceLocation LitEndLoc,
649                      SourceLocation SuffixLoc, FPOptionsOverride FPFeatures);
650 
651   UserDefinedLiteral(unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty);
652 
653 public:
654   static UserDefinedLiteral *Create(const ASTContext &Ctx, Expr *Fn,
655                                     ArrayRef<Expr *> Args, QualType Ty,
656                                     ExprValueKind VK, SourceLocation LitEndLoc,
657                                     SourceLocation SuffixLoc,
658                                     FPOptionsOverride FPFeatures);
659 
660   static UserDefinedLiteral *CreateEmpty(const ASTContext &Ctx,
661                                          unsigned NumArgs, bool HasFPOptions,
662                                          EmptyShell Empty);
663 
664   /// The kind of literal operator which is invoked.
665   enum LiteralOperatorKind {
666     /// Raw form: operator "" X (const char *)
667     LOK_Raw,
668 
669     /// Raw form: operator "" X<cs...> ()
670     LOK_Template,
671 
672     /// operator "" X (unsigned long long)
673     LOK_Integer,
674 
675     /// operator "" X (long double)
676     LOK_Floating,
677 
678     /// operator "" X (const CharT *, size_t)
679     LOK_String,
680 
681     /// operator "" X (CharT)
682     LOK_Character
683   };
684 
685   /// Returns the kind of literal operator invocation
686   /// which this expression represents.
687   LiteralOperatorKind getLiteralOperatorKind() const;
688 
689   /// If this is not a raw user-defined literal, get the
690   /// underlying cooked literal (representing the literal with the suffix
691   /// removed).
692   Expr *getCookedLiteral();
693   const Expr *getCookedLiteral() const {
694     return const_cast<UserDefinedLiteral*>(this)->getCookedLiteral();
695   }
696 
697   SourceLocation getBeginLoc() const {
698     if (getLiteralOperatorKind() == LOK_Template)
699       return getRParenLoc();
700     return getArg(0)->getBeginLoc();
701   }
702 
703   SourceLocation getEndLoc() const { return getRParenLoc(); }
704 
705   /// Returns the location of a ud-suffix in the expression.
706   ///
707   /// For a string literal, there may be multiple identical suffixes. This
708   /// returns the first.
709   SourceLocation getUDSuffixLoc() const { return UDSuffixLoc; }
710 
711   /// Returns the ud-suffix specified for this literal.
712   const IdentifierInfo *getUDSuffix() const;
713 
714   static bool classof(const Stmt *S) {
715     return S->getStmtClass() == UserDefinedLiteralClass;
716   }
717 };
718 
719 /// A boolean literal, per ([C++ lex.bool] Boolean literals).
720 class CXXBoolLiteralExpr : public Expr {
721 public:
722   CXXBoolLiteralExpr(bool Val, QualType Ty, SourceLocation Loc)
723       : Expr(CXXBoolLiteralExprClass, Ty, VK_PRValue, OK_Ordinary) {
724     CXXBoolLiteralExprBits.Value = Val;
725     CXXBoolLiteralExprBits.Loc = Loc;
726     setDependence(ExprDependence::None);
727   }
728 
729   explicit CXXBoolLiteralExpr(EmptyShell Empty)
730       : Expr(CXXBoolLiteralExprClass, Empty) {}
731 
732   static CXXBoolLiteralExpr *Create(const ASTContext &C, bool Val, QualType Ty,
733                                     SourceLocation Loc) {
734     return new (C) CXXBoolLiteralExpr(Val, Ty, Loc);
735   }
736 
737   bool getValue() const { return CXXBoolLiteralExprBits.Value; }
738   void setValue(bool V) { CXXBoolLiteralExprBits.Value = V; }
739 
740   SourceLocation getBeginLoc() const { return getLocation(); }
741   SourceLocation getEndLoc() const { return getLocation(); }
742 
743   SourceLocation getLocation() const { return CXXBoolLiteralExprBits.Loc; }
744   void setLocation(SourceLocation L) { CXXBoolLiteralExprBits.Loc = L; }
745 
746   static bool classof(const Stmt *T) {
747     return T->getStmtClass() == CXXBoolLiteralExprClass;
748   }
749 
750   // Iterators
751   child_range children() {
752     return child_range(child_iterator(), child_iterator());
753   }
754 
755   const_child_range children() const {
756     return const_child_range(const_child_iterator(), const_child_iterator());
757   }
758 };
759 
760 /// The null pointer literal (C++11 [lex.nullptr])
761 ///
762 /// Introduced in C++11, the only literal of type \c nullptr_t is \c nullptr.
763 /// This also implements the null pointer literal in C23 (C23 6.4.1) which is
764 /// intended to have the same semantics as the feature in C++.
765 class CXXNullPtrLiteralExpr : public Expr {
766 public:
767   CXXNullPtrLiteralExpr(QualType Ty, SourceLocation Loc)
768       : Expr(CXXNullPtrLiteralExprClass, Ty, VK_PRValue, OK_Ordinary) {
769     CXXNullPtrLiteralExprBits.Loc = Loc;
770     setDependence(ExprDependence::None);
771   }
772 
773   explicit CXXNullPtrLiteralExpr(EmptyShell Empty)
774       : Expr(CXXNullPtrLiteralExprClass, Empty) {}
775 
776   SourceLocation getBeginLoc() const { return getLocation(); }
777   SourceLocation getEndLoc() const { return getLocation(); }
778 
779   SourceLocation getLocation() const { return CXXNullPtrLiteralExprBits.Loc; }
780   void setLocation(SourceLocation L) { CXXNullPtrLiteralExprBits.Loc = L; }
781 
782   static bool classof(const Stmt *T) {
783     return T->getStmtClass() == CXXNullPtrLiteralExprClass;
784   }
785 
786   child_range children() {
787     return child_range(child_iterator(), child_iterator());
788   }
789 
790   const_child_range children() const {
791     return const_child_range(const_child_iterator(), const_child_iterator());
792   }
793 };
794 
795 /// Implicit construction of a std::initializer_list<T> object from an
796 /// array temporary within list-initialization (C++11 [dcl.init.list]p5).
797 class CXXStdInitializerListExpr : public Expr {
798   Stmt *SubExpr = nullptr;
799 
800   CXXStdInitializerListExpr(EmptyShell Empty)
801       : Expr(CXXStdInitializerListExprClass, Empty) {}
802 
803 public:
804   friend class ASTReader;
805   friend class ASTStmtReader;
806 
807   CXXStdInitializerListExpr(QualType Ty, Expr *SubExpr)
808       : Expr(CXXStdInitializerListExprClass, Ty, VK_PRValue, OK_Ordinary),
809         SubExpr(SubExpr) {
810     setDependence(computeDependence(this));
811   }
812 
813   Expr *getSubExpr() { return static_cast<Expr*>(SubExpr); }
814   const Expr *getSubExpr() const { return static_cast<const Expr*>(SubExpr); }
815 
816   SourceLocation getBeginLoc() const LLVM_READONLY {
817     return SubExpr->getBeginLoc();
818   }
819 
820   SourceLocation getEndLoc() const LLVM_READONLY {
821     return SubExpr->getEndLoc();
822   }
823 
824   /// Retrieve the source range of the expression.
825   SourceRange getSourceRange() const LLVM_READONLY {
826     return SubExpr->getSourceRange();
827   }
828 
829   static bool classof(const Stmt *S) {
830     return S->getStmtClass() == CXXStdInitializerListExprClass;
831   }
832 
833   child_range children() { return child_range(&SubExpr, &SubExpr + 1); }
834 
835   const_child_range children() const {
836     return const_child_range(&SubExpr, &SubExpr + 1);
837   }
838 };
839 
840 /// A C++ \c typeid expression (C++ [expr.typeid]), which gets
841 /// the \c type_info that corresponds to the supplied type, or the (possibly
842 /// dynamic) type of the supplied expression.
843 ///
844 /// This represents code like \c typeid(int) or \c typeid(*objPtr)
845 class CXXTypeidExpr : public Expr {
846   friend class ASTStmtReader;
847 
848 private:
849   llvm::PointerUnion<Stmt *, TypeSourceInfo *> Operand;
850   SourceRange Range;
851 
852 public:
853   CXXTypeidExpr(QualType Ty, TypeSourceInfo *Operand, SourceRange R)
854       : Expr(CXXTypeidExprClass, Ty, VK_LValue, OK_Ordinary), Operand(Operand),
855         Range(R) {
856     setDependence(computeDependence(this));
857   }
858 
859   CXXTypeidExpr(QualType Ty, Expr *Operand, SourceRange R)
860       : Expr(CXXTypeidExprClass, Ty, VK_LValue, OK_Ordinary), Operand(Operand),
861         Range(R) {
862     setDependence(computeDependence(this));
863   }
864 
865   CXXTypeidExpr(EmptyShell Empty, bool isExpr)
866       : Expr(CXXTypeidExprClass, Empty) {
867     if (isExpr)
868       Operand = (Expr*)nullptr;
869     else
870       Operand = (TypeSourceInfo*)nullptr;
871   }
872 
873   /// Determine whether this typeid has a type operand which is potentially
874   /// evaluated, per C++11 [expr.typeid]p3.
875   bool isPotentiallyEvaluated() const;
876 
877   /// Best-effort check if the expression operand refers to a most derived
878   /// object. This is not a strong guarantee.
879   bool isMostDerived(const ASTContext &Context) const;
880 
881   bool isTypeOperand() const { return isa<TypeSourceInfo *>(Operand); }
882 
883   /// Retrieves the type operand of this typeid() expression after
884   /// various required adjustments (removing reference types, cv-qualifiers).
885   QualType getTypeOperand(const ASTContext &Context) const;
886 
887   /// Retrieve source information for the type operand.
888   TypeSourceInfo *getTypeOperandSourceInfo() const {
889     assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
890     return cast<TypeSourceInfo *>(Operand);
891   }
892   Expr *getExprOperand() const {
893     assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)");
894     return static_cast<Expr *>(cast<Stmt *>(Operand));
895   }
896 
897   SourceLocation getBeginLoc() const LLVM_READONLY { return Range.getBegin(); }
898   SourceLocation getEndLoc() const LLVM_READONLY { return Range.getEnd(); }
899   SourceRange getSourceRange() const LLVM_READONLY { return Range; }
900   void setSourceRange(SourceRange R) { Range = R; }
901 
902   static bool classof(const Stmt *T) {
903     return T->getStmtClass() == CXXTypeidExprClass;
904   }
905 
906   // Iterators
907   child_range children() {
908     if (isTypeOperand())
909       return child_range(child_iterator(), child_iterator());
910     auto **begin = reinterpret_cast<Stmt **>(&Operand);
911     return child_range(begin, begin + 1);
912   }
913 
914   const_child_range children() const {
915     if (isTypeOperand())
916       return const_child_range(const_child_iterator(), const_child_iterator());
917 
918     auto **begin =
919         reinterpret_cast<Stmt **>(&const_cast<CXXTypeidExpr *>(this)->Operand);
920     return const_child_range(begin, begin + 1);
921   }
922 
923   /// Whether this is of a form like "typeid(*ptr)" that can throw a
924   /// std::bad_typeid if a pointer is a null pointer ([expr.typeid]p2)
925   bool hasNullCheck() const;
926 };
927 
928 /// A member reference to an MSPropertyDecl.
929 ///
930 /// This expression always has pseudo-object type, and therefore it is
931 /// typically not encountered in a fully-typechecked expression except
932 /// within the syntactic form of a PseudoObjectExpr.
933 class MSPropertyRefExpr : public Expr {
934   Expr *BaseExpr;
935   MSPropertyDecl *TheDecl;
936   SourceLocation MemberLoc;
937   bool IsArrow;
938   NestedNameSpecifierLoc QualifierLoc;
939 
940 public:
941   friend class ASTStmtReader;
942 
943   MSPropertyRefExpr(Expr *baseExpr, MSPropertyDecl *decl, bool isArrow,
944                     QualType ty, ExprValueKind VK,
945                     NestedNameSpecifierLoc qualifierLoc, SourceLocation nameLoc)
946       : Expr(MSPropertyRefExprClass, ty, VK, OK_Ordinary), BaseExpr(baseExpr),
947         TheDecl(decl), MemberLoc(nameLoc), IsArrow(isArrow),
948         QualifierLoc(qualifierLoc) {
949     setDependence(computeDependence(this));
950   }
951 
952   MSPropertyRefExpr(EmptyShell Empty) : Expr(MSPropertyRefExprClass, Empty) {}
953 
954   SourceRange getSourceRange() const LLVM_READONLY {
955     return SourceRange(getBeginLoc(), getEndLoc());
956   }
957 
958   bool isImplicitAccess() const {
959     return getBaseExpr() && getBaseExpr()->isImplicitCXXThis();
960   }
961 
962   SourceLocation getBeginLoc() const {
963     if (!isImplicitAccess())
964       return BaseExpr->getBeginLoc();
965     else if (QualifierLoc)
966       return QualifierLoc.getBeginLoc();
967     else
968         return MemberLoc;
969   }
970 
971   SourceLocation getEndLoc() const { return getMemberLoc(); }
972 
973   child_range children() {
974     return child_range((Stmt**)&BaseExpr, (Stmt**)&BaseExpr + 1);
975   }
976 
977   const_child_range children() const {
978     auto Children = const_cast<MSPropertyRefExpr *>(this)->children();
979     return const_child_range(Children.begin(), Children.end());
980   }
981 
982   static bool classof(const Stmt *T) {
983     return T->getStmtClass() == MSPropertyRefExprClass;
984   }
985 
986   Expr *getBaseExpr() const { return BaseExpr; }
987   MSPropertyDecl *getPropertyDecl() const { return TheDecl; }
988   bool isArrow() const { return IsArrow; }
989   SourceLocation getMemberLoc() const { return MemberLoc; }
990   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
991 };
992 
993 /// MS property subscript expression.
994 /// MSVC supports 'property' attribute and allows to apply it to the
995 /// declaration of an empty array in a class or structure definition.
996 /// For example:
997 /// \code
998 /// __declspec(property(get=GetX, put=PutX)) int x[];
999 /// \endcode
1000 /// The above statement indicates that x[] can be used with one or more array
1001 /// indices. In this case, i=p->x[a][b] will be turned into i=p->GetX(a, b), and
1002 /// p->x[a][b] = i will be turned into p->PutX(a, b, i).
1003 /// This is a syntactic pseudo-object expression.
1004 class MSPropertySubscriptExpr : public Expr {
1005   friend class ASTStmtReader;
1006 
1007   enum { BASE_EXPR, IDX_EXPR, NUM_SUBEXPRS = 2 };
1008 
1009   Stmt *SubExprs[NUM_SUBEXPRS];
1010   SourceLocation RBracketLoc;
1011 
1012   void setBase(Expr *Base) { SubExprs[BASE_EXPR] = Base; }
1013   void setIdx(Expr *Idx) { SubExprs[IDX_EXPR] = Idx; }
1014 
1015 public:
1016   MSPropertySubscriptExpr(Expr *Base, Expr *Idx, QualType Ty, ExprValueKind VK,
1017                           ExprObjectKind OK, SourceLocation RBracketLoc)
1018       : Expr(MSPropertySubscriptExprClass, Ty, VK, OK),
1019         RBracketLoc(RBracketLoc) {
1020     SubExprs[BASE_EXPR] = Base;
1021     SubExprs[IDX_EXPR] = Idx;
1022     setDependence(computeDependence(this));
1023   }
1024 
1025   /// Create an empty array subscript expression.
1026   explicit MSPropertySubscriptExpr(EmptyShell Shell)
1027       : Expr(MSPropertySubscriptExprClass, Shell) {}
1028 
1029   Expr *getBase() { return cast<Expr>(SubExprs[BASE_EXPR]); }
1030   const Expr *getBase() const { return cast<Expr>(SubExprs[BASE_EXPR]); }
1031 
1032   Expr *getIdx() { return cast<Expr>(SubExprs[IDX_EXPR]); }
1033   const Expr *getIdx() const { return cast<Expr>(SubExprs[IDX_EXPR]); }
1034 
1035   SourceLocation getBeginLoc() const LLVM_READONLY {
1036     return getBase()->getBeginLoc();
1037   }
1038 
1039   SourceLocation getEndLoc() const LLVM_READONLY { return RBracketLoc; }
1040 
1041   SourceLocation getRBracketLoc() const { return RBracketLoc; }
1042   void setRBracketLoc(SourceLocation L) { RBracketLoc = L; }
1043 
1044   SourceLocation getExprLoc() const LLVM_READONLY {
1045     return getBase()->getExprLoc();
1046   }
1047 
1048   static bool classof(const Stmt *T) {
1049     return T->getStmtClass() == MSPropertySubscriptExprClass;
1050   }
1051 
1052   // Iterators
1053   child_range children() {
1054     return child_range(&SubExprs[0], &SubExprs[0] + NUM_SUBEXPRS);
1055   }
1056 
1057   const_child_range children() const {
1058     return const_child_range(&SubExprs[0], &SubExprs[0] + NUM_SUBEXPRS);
1059   }
1060 };
1061 
1062 /// A Microsoft C++ @c __uuidof expression, which gets
1063 /// the _GUID that corresponds to the supplied type or expression.
1064 ///
1065 /// This represents code like @c __uuidof(COMTYPE) or @c __uuidof(*comPtr)
1066 class CXXUuidofExpr : public Expr {
1067   friend class ASTStmtReader;
1068 
1069 private:
1070   llvm::PointerUnion<Stmt *, TypeSourceInfo *> Operand;
1071   MSGuidDecl *Guid;
1072   SourceRange Range;
1073 
1074 public:
1075   CXXUuidofExpr(QualType Ty, TypeSourceInfo *Operand, MSGuidDecl *Guid,
1076                 SourceRange R)
1077       : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary), Operand(Operand),
1078         Guid(Guid), Range(R) {
1079     setDependence(computeDependence(this));
1080   }
1081 
1082   CXXUuidofExpr(QualType Ty, Expr *Operand, MSGuidDecl *Guid, SourceRange R)
1083       : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary), Operand(Operand),
1084         Guid(Guid), Range(R) {
1085     setDependence(computeDependence(this));
1086   }
1087 
1088   CXXUuidofExpr(EmptyShell Empty, bool isExpr)
1089     : Expr(CXXUuidofExprClass, Empty) {
1090     if (isExpr)
1091       Operand = (Expr*)nullptr;
1092     else
1093       Operand = (TypeSourceInfo*)nullptr;
1094   }
1095 
1096   bool isTypeOperand() const { return isa<TypeSourceInfo *>(Operand); }
1097 
1098   /// Retrieves the type operand of this __uuidof() expression after
1099   /// various required adjustments (removing reference types, cv-qualifiers).
1100   QualType getTypeOperand(ASTContext &Context) const;
1101 
1102   /// Retrieve source information for the type operand.
1103   TypeSourceInfo *getTypeOperandSourceInfo() const {
1104     assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)");
1105     return cast<TypeSourceInfo *>(Operand);
1106   }
1107   Expr *getExprOperand() const {
1108     assert(!isTypeOperand() && "Cannot call getExprOperand for __uuidof(type)");
1109     return static_cast<Expr *>(cast<Stmt *>(Operand));
1110   }
1111 
1112   MSGuidDecl *getGuidDecl() const { return Guid; }
1113 
1114   SourceLocation getBeginLoc() const LLVM_READONLY { return Range.getBegin(); }
1115   SourceLocation getEndLoc() const LLVM_READONLY { return Range.getEnd(); }
1116   SourceRange getSourceRange() const LLVM_READONLY { return Range; }
1117   void setSourceRange(SourceRange R) { Range = R; }
1118 
1119   static bool classof(const Stmt *T) {
1120     return T->getStmtClass() == CXXUuidofExprClass;
1121   }
1122 
1123   // Iterators
1124   child_range children() {
1125     if (isTypeOperand())
1126       return child_range(child_iterator(), child_iterator());
1127     auto **begin = reinterpret_cast<Stmt **>(&Operand);
1128     return child_range(begin, begin + 1);
1129   }
1130 
1131   const_child_range children() const {
1132     if (isTypeOperand())
1133       return const_child_range(const_child_iterator(), const_child_iterator());
1134     auto **begin =
1135         reinterpret_cast<Stmt **>(&const_cast<CXXUuidofExpr *>(this)->Operand);
1136     return const_child_range(begin, begin + 1);
1137   }
1138 };
1139 
1140 /// Represents the \c this expression in C++.
1141 ///
1142 /// This is a pointer to the object on which the current member function is
1143 /// executing (C++ [expr.prim]p3). Example:
1144 ///
1145 /// \code
1146 /// class Foo {
1147 /// public:
1148 ///   void bar();
1149 ///   void test() { this->bar(); }
1150 /// };
1151 /// \endcode
1152 class CXXThisExpr : public Expr {
1153   CXXThisExpr(SourceLocation L, QualType Ty, bool IsImplicit, ExprValueKind VK)
1154       : Expr(CXXThisExprClass, Ty, VK, OK_Ordinary) {
1155     CXXThisExprBits.IsImplicit = IsImplicit;
1156     CXXThisExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter = false;
1157     CXXThisExprBits.Loc = L;
1158     setDependence(computeDependence(this));
1159   }
1160 
1161   CXXThisExpr(EmptyShell Empty) : Expr(CXXThisExprClass, Empty) {}
1162 
1163 public:
1164   static CXXThisExpr *Create(const ASTContext &Ctx, SourceLocation L,
1165                              QualType Ty, bool IsImplicit);
1166 
1167   static CXXThisExpr *CreateEmpty(const ASTContext &Ctx);
1168 
1169   SourceLocation getLocation() const { return CXXThisExprBits.Loc; }
1170   void setLocation(SourceLocation L) { CXXThisExprBits.Loc = L; }
1171 
1172   SourceLocation getBeginLoc() const { return getLocation(); }
1173   SourceLocation getEndLoc() const { return getLocation(); }
1174 
1175   bool isImplicit() const { return CXXThisExprBits.IsImplicit; }
1176   void setImplicit(bool I) { CXXThisExprBits.IsImplicit = I; }
1177 
1178   bool isCapturedByCopyInLambdaWithExplicitObjectParameter() const {
1179     return CXXThisExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter;
1180   }
1181 
1182   void setCapturedByCopyInLambdaWithExplicitObjectParameter(bool Set) {
1183     CXXThisExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter = Set;
1184     setDependence(computeDependence(this));
1185   }
1186 
1187   static bool classof(const Stmt *T) {
1188     return T->getStmtClass() == CXXThisExprClass;
1189   }
1190 
1191   // Iterators
1192   child_range children() {
1193     return child_range(child_iterator(), child_iterator());
1194   }
1195 
1196   const_child_range children() const {
1197     return const_child_range(const_child_iterator(), const_child_iterator());
1198   }
1199 };
1200 
1201 /// A C++ throw-expression (C++ [except.throw]).
1202 ///
1203 /// This handles 'throw' (for re-throwing the current exception) and
1204 /// 'throw' assignment-expression.  When assignment-expression isn't
1205 /// present, Op will be null.
1206 class CXXThrowExpr : public Expr {
1207   friend class ASTStmtReader;
1208 
1209   /// The optional expression in the throw statement.
1210   Stmt *Operand;
1211 
1212 public:
1213   // \p Ty is the void type which is used as the result type of the
1214   // expression. The \p Loc is the location of the throw keyword.
1215   // \p Operand is the expression in the throw statement, and can be
1216   // null if not present.
1217   CXXThrowExpr(Expr *Operand, QualType Ty, SourceLocation Loc,
1218                bool IsThrownVariableInScope)
1219       : Expr(CXXThrowExprClass, Ty, VK_PRValue, OK_Ordinary), Operand(Operand) {
1220     CXXThrowExprBits.ThrowLoc = Loc;
1221     CXXThrowExprBits.IsThrownVariableInScope = IsThrownVariableInScope;
1222     setDependence(computeDependence(this));
1223   }
1224   CXXThrowExpr(EmptyShell Empty) : Expr(CXXThrowExprClass, Empty) {}
1225 
1226   const Expr *getSubExpr() const { return cast_or_null<Expr>(Operand); }
1227   Expr *getSubExpr() { return cast_or_null<Expr>(Operand); }
1228 
1229   SourceLocation getThrowLoc() const { return CXXThrowExprBits.ThrowLoc; }
1230 
1231   /// Determines whether the variable thrown by this expression (if any!)
1232   /// is within the innermost try block.
1233   ///
1234   /// This information is required to determine whether the NRVO can apply to
1235   /// this variable.
1236   bool isThrownVariableInScope() const {
1237     return CXXThrowExprBits.IsThrownVariableInScope;
1238   }
1239 
1240   SourceLocation getBeginLoc() const { return getThrowLoc(); }
1241   SourceLocation getEndLoc() const LLVM_READONLY {
1242     if (!getSubExpr())
1243       return getThrowLoc();
1244     return getSubExpr()->getEndLoc();
1245   }
1246 
1247   static bool classof(const Stmt *T) {
1248     return T->getStmtClass() == CXXThrowExprClass;
1249   }
1250 
1251   // Iterators
1252   child_range children() {
1253     return child_range(&Operand, Operand ? &Operand + 1 : &Operand);
1254   }
1255 
1256   const_child_range children() const {
1257     return const_child_range(&Operand, Operand ? &Operand + 1 : &Operand);
1258   }
1259 };
1260 
1261 /// A default argument (C++ [dcl.fct.default]).
1262 ///
1263 /// This wraps up a function call argument that was created from the
1264 /// corresponding parameter's default argument, when the call did not
1265 /// explicitly supply arguments for all of the parameters.
1266 class CXXDefaultArgExpr final
1267     : public Expr,
1268       private llvm::TrailingObjects<CXXDefaultArgExpr, Expr *> {
1269   friend class ASTStmtReader;
1270   friend class ASTReader;
1271   friend TrailingObjects;
1272 
1273   /// The parameter whose default is being used.
1274   ParmVarDecl *Param;
1275 
1276   /// The context where the default argument expression was used.
1277   DeclContext *UsedContext;
1278 
1279   CXXDefaultArgExpr(StmtClass SC, SourceLocation Loc, ParmVarDecl *Param,
1280                     Expr *RewrittenExpr, DeclContext *UsedContext)
1281       : Expr(SC,
1282              Param->hasUnparsedDefaultArg()
1283                  ? Param->getType().getNonReferenceType()
1284                  : Param->getDefaultArg()->getType(),
1285              Param->getDefaultArg()->getValueKind(),
1286              Param->getDefaultArg()->getObjectKind()),
1287         Param(Param), UsedContext(UsedContext) {
1288     CXXDefaultArgExprBits.Loc = Loc;
1289     CXXDefaultArgExprBits.HasRewrittenInit = RewrittenExpr != nullptr;
1290     if (RewrittenExpr)
1291       *getTrailingObjects<Expr *>() = RewrittenExpr;
1292     setDependence(computeDependence(this));
1293   }
1294 
1295   CXXDefaultArgExpr(EmptyShell Empty, bool HasRewrittenInit)
1296       : Expr(CXXDefaultArgExprClass, Empty) {
1297     CXXDefaultArgExprBits.HasRewrittenInit = HasRewrittenInit;
1298   }
1299 
1300 public:
1301   static CXXDefaultArgExpr *CreateEmpty(const ASTContext &C,
1302                                         bool HasRewrittenInit);
1303 
1304   // \p Param is the parameter whose default argument is used by this
1305   // expression.
1306   static CXXDefaultArgExpr *Create(const ASTContext &C, SourceLocation Loc,
1307                                    ParmVarDecl *Param, Expr *RewrittenExpr,
1308                                    DeclContext *UsedContext);
1309   // Retrieve the parameter that the argument was created from.
1310   const ParmVarDecl *getParam() const { return Param; }
1311   ParmVarDecl *getParam() { return Param; }
1312 
1313   bool hasRewrittenInit() const {
1314     return CXXDefaultArgExprBits.HasRewrittenInit;
1315   }
1316 
1317   // Retrieve the argument to the function call.
1318   Expr *getExpr();
1319   const Expr *getExpr() const {
1320     return const_cast<CXXDefaultArgExpr *>(this)->getExpr();
1321   }
1322 
1323   Expr *getRewrittenExpr() {
1324     return hasRewrittenInit() ? *getTrailingObjects<Expr *>() : nullptr;
1325   }
1326 
1327   const Expr *getRewrittenExpr() const {
1328     return const_cast<CXXDefaultArgExpr *>(this)->getRewrittenExpr();
1329   }
1330 
1331   // Retrieve the rewritten init expression (for an init expression containing
1332   // immediate calls) with the top level FullExpr and ConstantExpr stripped off.
1333   Expr *getAdjustedRewrittenExpr();
1334   const Expr *getAdjustedRewrittenExpr() const {
1335     return const_cast<CXXDefaultArgExpr *>(this)->getAdjustedRewrittenExpr();
1336   }
1337 
1338   const DeclContext *getUsedContext() const { return UsedContext; }
1339   DeclContext *getUsedContext() { return UsedContext; }
1340 
1341   /// Retrieve the location where this default argument was actually used.
1342   SourceLocation getUsedLocation() const { return CXXDefaultArgExprBits.Loc; }
1343 
1344   /// Default argument expressions have no representation in the
1345   /// source, so they have an empty source range.
1346   SourceLocation getBeginLoc() const { return SourceLocation(); }
1347   SourceLocation getEndLoc() const { return SourceLocation(); }
1348 
1349   SourceLocation getExprLoc() const { return getUsedLocation(); }
1350 
1351   static bool classof(const Stmt *T) {
1352     return T->getStmtClass() == CXXDefaultArgExprClass;
1353   }
1354 
1355   // Iterators
1356   child_range children() {
1357     return child_range(child_iterator(), child_iterator());
1358   }
1359 
1360   const_child_range children() const {
1361     return const_child_range(const_child_iterator(), const_child_iterator());
1362   }
1363 };
1364 
1365 /// A use of a default initializer in a constructor or in aggregate
1366 /// initialization.
1367 ///
1368 /// This wraps a use of a C++ default initializer (technically,
1369 /// a brace-or-equal-initializer for a non-static data member) when it
1370 /// is implicitly used in a mem-initializer-list in a constructor
1371 /// (C++11 [class.base.init]p8) or in aggregate initialization
1372 /// (C++1y [dcl.init.aggr]p7).
1373 class CXXDefaultInitExpr final
1374     : public Expr,
1375       private llvm::TrailingObjects<CXXDefaultInitExpr, Expr *> {
1376 
1377   friend class ASTStmtReader;
1378   friend class ASTReader;
1379   friend TrailingObjects;
1380   /// The field whose default is being used.
1381   FieldDecl *Field;
1382 
1383   /// The context where the default initializer expression was used.
1384   DeclContext *UsedContext;
1385 
1386   CXXDefaultInitExpr(const ASTContext &Ctx, SourceLocation Loc,
1387                      FieldDecl *Field, QualType Ty, DeclContext *UsedContext,
1388                      Expr *RewrittenInitExpr);
1389 
1390   CXXDefaultInitExpr(EmptyShell Empty, bool HasRewrittenInit)
1391       : Expr(CXXDefaultInitExprClass, Empty) {
1392     CXXDefaultInitExprBits.HasRewrittenInit = HasRewrittenInit;
1393   }
1394 
1395 public:
1396   static CXXDefaultInitExpr *CreateEmpty(const ASTContext &C,
1397                                          bool HasRewrittenInit);
1398   /// \p Field is the non-static data member whose default initializer is used
1399   /// by this expression.
1400   static CXXDefaultInitExpr *Create(const ASTContext &Ctx, SourceLocation Loc,
1401                                     FieldDecl *Field, DeclContext *UsedContext,
1402                                     Expr *RewrittenInitExpr);
1403 
1404   bool hasRewrittenInit() const {
1405     return CXXDefaultInitExprBits.HasRewrittenInit;
1406   }
1407 
1408   /// Get the field whose initializer will be used.
1409   FieldDecl *getField() { return Field; }
1410   const FieldDecl *getField() const { return Field; }
1411 
1412   /// Get the initialization expression that will be used.
1413   Expr *getExpr();
1414   const Expr *getExpr() const {
1415     return const_cast<CXXDefaultInitExpr *>(this)->getExpr();
1416   }
1417 
1418   /// Retrieve the initializing expression with evaluated immediate calls, if
1419   /// any.
1420   const Expr *getRewrittenExpr() const {
1421     assert(hasRewrittenInit() && "expected a rewritten init expression");
1422     return *getTrailingObjects<Expr *>();
1423   }
1424 
1425   /// Retrieve the initializing expression with evaluated immediate calls, if
1426   /// any.
1427   Expr *getRewrittenExpr() {
1428     assert(hasRewrittenInit() && "expected a rewritten init expression");
1429     return *getTrailingObjects<Expr *>();
1430   }
1431 
1432   const DeclContext *getUsedContext() const { return UsedContext; }
1433   DeclContext *getUsedContext() { return UsedContext; }
1434 
1435   /// Retrieve the location where this default initializer expression was
1436   /// actually used.
1437   SourceLocation getUsedLocation() const { return getBeginLoc(); }
1438 
1439   SourceLocation getBeginLoc() const { return CXXDefaultInitExprBits.Loc; }
1440   SourceLocation getEndLoc() const { return CXXDefaultInitExprBits.Loc; }
1441 
1442   static bool classof(const Stmt *T) {
1443     return T->getStmtClass() == CXXDefaultInitExprClass;
1444   }
1445 
1446   // Iterators
1447   child_range children() {
1448     return child_range(child_iterator(), child_iterator());
1449   }
1450 
1451   const_child_range children() const {
1452     return const_child_range(const_child_iterator(), const_child_iterator());
1453   }
1454 };
1455 
1456 /// Represents a C++ temporary.
1457 class CXXTemporary {
1458   /// The destructor that needs to be called.
1459   const CXXDestructorDecl *Destructor;
1460 
1461   explicit CXXTemporary(const CXXDestructorDecl *destructor)
1462       : Destructor(destructor) {}
1463 
1464 public:
1465   static CXXTemporary *Create(const ASTContext &C,
1466                               const CXXDestructorDecl *Destructor);
1467 
1468   const CXXDestructorDecl *getDestructor() const { return Destructor; }
1469 
1470   void setDestructor(const CXXDestructorDecl *Dtor) {
1471     Destructor = Dtor;
1472   }
1473 };
1474 
1475 /// Represents binding an expression to a temporary.
1476 ///
1477 /// This ensures the destructor is called for the temporary. It should only be
1478 /// needed for non-POD, non-trivially destructable class types. For example:
1479 ///
1480 /// \code
1481 ///   struct S {
1482 ///     S() { }  // User defined constructor makes S non-POD.
1483 ///     ~S() { } // User defined destructor makes it non-trivial.
1484 ///   };
1485 ///   void test() {
1486 ///     const S &s_ref = S(); // Requires a CXXBindTemporaryExpr.
1487 ///   }
1488 /// \endcode
1489 ///
1490 /// Destructor might be null if destructor declaration is not valid.
1491 class CXXBindTemporaryExpr : public Expr {
1492   CXXTemporary *Temp = nullptr;
1493   Stmt *SubExpr = nullptr;
1494 
1495   CXXBindTemporaryExpr(CXXTemporary *temp, Expr *SubExpr)
1496       : Expr(CXXBindTemporaryExprClass, SubExpr->getType(), VK_PRValue,
1497              OK_Ordinary),
1498         Temp(temp), SubExpr(SubExpr) {
1499     setDependence(computeDependence(this));
1500   }
1501 
1502 public:
1503   CXXBindTemporaryExpr(EmptyShell Empty)
1504       : Expr(CXXBindTemporaryExprClass, Empty) {}
1505 
1506   static CXXBindTemporaryExpr *Create(const ASTContext &C, CXXTemporary *Temp,
1507                                       Expr* SubExpr);
1508 
1509   CXXTemporary *getTemporary() { return Temp; }
1510   const CXXTemporary *getTemporary() const { return Temp; }
1511   void setTemporary(CXXTemporary *T) { Temp = T; }
1512 
1513   const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
1514   Expr *getSubExpr() { return cast<Expr>(SubExpr); }
1515   void setSubExpr(Expr *E) { SubExpr = E; }
1516 
1517   SourceLocation getBeginLoc() const LLVM_READONLY {
1518     return SubExpr->getBeginLoc();
1519   }
1520 
1521   SourceLocation getEndLoc() const LLVM_READONLY {
1522     return SubExpr->getEndLoc();
1523   }
1524 
1525   // Implement isa/cast/dyncast/etc.
1526   static bool classof(const Stmt *T) {
1527     return T->getStmtClass() == CXXBindTemporaryExprClass;
1528   }
1529 
1530   // Iterators
1531   child_range children() { return child_range(&SubExpr, &SubExpr + 1); }
1532 
1533   const_child_range children() const {
1534     return const_child_range(&SubExpr, &SubExpr + 1);
1535   }
1536 };
1537 
1538 enum class CXXConstructionKind {
1539   Complete,
1540   NonVirtualBase,
1541   VirtualBase,
1542   Delegating
1543 };
1544 
1545 /// Represents a call to a C++ constructor.
1546 class CXXConstructExpr : public Expr {
1547   friend class ASTStmtReader;
1548 
1549   /// A pointer to the constructor which will be ultimately called.
1550   CXXConstructorDecl *Constructor;
1551 
1552   SourceRange ParenOrBraceRange;
1553 
1554   /// The number of arguments.
1555   unsigned NumArgs;
1556 
1557   // We would like to stash the arguments of the constructor call after
1558   // CXXConstructExpr. However CXXConstructExpr is used as a base class of
1559   // CXXTemporaryObjectExpr which makes the use of llvm::TrailingObjects
1560   // impossible.
1561   //
1562   // Instead we manually stash the trailing object after the full object
1563   // containing CXXConstructExpr (that is either CXXConstructExpr or
1564   // CXXTemporaryObjectExpr).
1565   //
1566   // The trailing objects are:
1567   //
1568   // * An array of getNumArgs() "Stmt *" for the arguments of the
1569   //   constructor call.
1570 
1571   /// Return a pointer to the start of the trailing arguments.
1572   /// Defined just after CXXTemporaryObjectExpr.
1573   inline Stmt **getTrailingArgs();
1574   const Stmt *const *getTrailingArgs() const {
1575     return const_cast<CXXConstructExpr *>(this)->getTrailingArgs();
1576   }
1577 
1578 protected:
1579   /// Build a C++ construction expression.
1580   CXXConstructExpr(StmtClass SC, QualType Ty, SourceLocation Loc,
1581                    CXXConstructorDecl *Ctor, bool Elidable,
1582                    ArrayRef<Expr *> Args, bool HadMultipleCandidates,
1583                    bool ListInitialization, bool StdInitListInitialization,
1584                    bool ZeroInitialization, CXXConstructionKind ConstructKind,
1585                    SourceRange ParenOrBraceRange);
1586 
1587   /// Build an empty C++ construction expression.
1588   CXXConstructExpr(StmtClass SC, EmptyShell Empty, unsigned NumArgs);
1589 
1590   /// Return the size in bytes of the trailing objects. Used by
1591   /// CXXTemporaryObjectExpr to allocate the right amount of storage.
1592   static unsigned sizeOfTrailingObjects(unsigned NumArgs) {
1593     return NumArgs * sizeof(Stmt *);
1594   }
1595 
1596 public:
1597   /// Create a C++ construction expression.
1598   static CXXConstructExpr *
1599   Create(const ASTContext &Ctx, QualType Ty, SourceLocation Loc,
1600          CXXConstructorDecl *Ctor, bool Elidable, ArrayRef<Expr *> Args,
1601          bool HadMultipleCandidates, bool ListInitialization,
1602          bool StdInitListInitialization, bool ZeroInitialization,
1603          CXXConstructionKind ConstructKind, SourceRange ParenOrBraceRange);
1604 
1605   /// Create an empty C++ construction expression.
1606   static CXXConstructExpr *CreateEmpty(const ASTContext &Ctx, unsigned NumArgs);
1607 
1608   /// Get the constructor that this expression will (ultimately) call.
1609   CXXConstructorDecl *getConstructor() const { return Constructor; }
1610 
1611   SourceLocation getLocation() const { return CXXConstructExprBits.Loc; }
1612   void setLocation(SourceLocation Loc) { CXXConstructExprBits.Loc = Loc; }
1613 
1614   /// Whether this construction is elidable.
1615   bool isElidable() const { return CXXConstructExprBits.Elidable; }
1616   void setElidable(bool E) { CXXConstructExprBits.Elidable = E; }
1617 
1618   /// Whether the referred constructor was resolved from
1619   /// an overloaded set having size greater than 1.
1620   bool hadMultipleCandidates() const {
1621     return CXXConstructExprBits.HadMultipleCandidates;
1622   }
1623   void setHadMultipleCandidates(bool V) {
1624     CXXConstructExprBits.HadMultipleCandidates = V;
1625   }
1626 
1627   /// Whether this constructor call was written as list-initialization.
1628   bool isListInitialization() const {
1629     return CXXConstructExprBits.ListInitialization;
1630   }
1631   void setListInitialization(bool V) {
1632     CXXConstructExprBits.ListInitialization = V;
1633   }
1634 
1635   /// Whether this constructor call was written as list-initialization,
1636   /// but was interpreted as forming a std::initializer_list<T> from the list
1637   /// and passing that as a single constructor argument.
1638   /// See C++11 [over.match.list]p1 bullet 1.
1639   bool isStdInitListInitialization() const {
1640     return CXXConstructExprBits.StdInitListInitialization;
1641   }
1642   void setStdInitListInitialization(bool V) {
1643     CXXConstructExprBits.StdInitListInitialization = V;
1644   }
1645 
1646   /// Whether this construction first requires
1647   /// zero-initialization before the initializer is called.
1648   bool requiresZeroInitialization() const {
1649     return CXXConstructExprBits.ZeroInitialization;
1650   }
1651   void setRequiresZeroInitialization(bool ZeroInit) {
1652     CXXConstructExprBits.ZeroInitialization = ZeroInit;
1653   }
1654 
1655   /// Determine whether this constructor is actually constructing
1656   /// a base class (rather than a complete object).
1657   CXXConstructionKind getConstructionKind() const {
1658     return static_cast<CXXConstructionKind>(
1659         CXXConstructExprBits.ConstructionKind);
1660   }
1661   void setConstructionKind(CXXConstructionKind CK) {
1662     CXXConstructExprBits.ConstructionKind = llvm::to_underlying(CK);
1663   }
1664 
1665   using arg_iterator = ExprIterator;
1666   using const_arg_iterator = ConstExprIterator;
1667   using arg_range = llvm::iterator_range<arg_iterator>;
1668   using const_arg_range = llvm::iterator_range<const_arg_iterator>;
1669 
1670   arg_range arguments() { return arg_range(arg_begin(), arg_end()); }
1671   const_arg_range arguments() const {
1672     return const_arg_range(arg_begin(), arg_end());
1673   }
1674 
1675   arg_iterator arg_begin() { return getTrailingArgs(); }
1676   arg_iterator arg_end() { return arg_begin() + getNumArgs(); }
1677   const_arg_iterator arg_begin() const { return getTrailingArgs(); }
1678   const_arg_iterator arg_end() const { return arg_begin() + getNumArgs(); }
1679 
1680   Expr **getArgs() { return reinterpret_cast<Expr **>(getTrailingArgs()); }
1681   const Expr *const *getArgs() const {
1682     return reinterpret_cast<const Expr *const *>(getTrailingArgs());
1683   }
1684 
1685   /// Return the number of arguments to the constructor call.
1686   unsigned getNumArgs() const { return NumArgs; }
1687 
1688   /// Return the specified argument.
1689   Expr *getArg(unsigned Arg) {
1690     assert(Arg < getNumArgs() && "Arg access out of range!");
1691     return getArgs()[Arg];
1692   }
1693   const Expr *getArg(unsigned Arg) const {
1694     assert(Arg < getNumArgs() && "Arg access out of range!");
1695     return getArgs()[Arg];
1696   }
1697 
1698   /// Set the specified argument.
1699   void setArg(unsigned Arg, Expr *ArgExpr) {
1700     assert(Arg < getNumArgs() && "Arg access out of range!");
1701     getArgs()[Arg] = ArgExpr;
1702   }
1703 
1704   bool isImmediateEscalating() const {
1705     return CXXConstructExprBits.IsImmediateEscalating;
1706   }
1707 
1708   void setIsImmediateEscalating(bool Set) {
1709     CXXConstructExprBits.IsImmediateEscalating = Set;
1710   }
1711 
1712   SourceLocation getBeginLoc() const LLVM_READONLY;
1713   SourceLocation getEndLoc() const LLVM_READONLY;
1714   SourceRange getParenOrBraceRange() const { return ParenOrBraceRange; }
1715   void setParenOrBraceRange(SourceRange Range) { ParenOrBraceRange = Range; }
1716 
1717   static bool classof(const Stmt *T) {
1718     return T->getStmtClass() == CXXConstructExprClass ||
1719            T->getStmtClass() == CXXTemporaryObjectExprClass;
1720   }
1721 
1722   // Iterators
1723   child_range children() {
1724     return child_range(getTrailingArgs(), getTrailingArgs() + getNumArgs());
1725   }
1726 
1727   const_child_range children() const {
1728     auto Children = const_cast<CXXConstructExpr *>(this)->children();
1729     return const_child_range(Children.begin(), Children.end());
1730   }
1731 };
1732 
1733 /// Represents a call to an inherited base class constructor from an
1734 /// inheriting constructor. This call implicitly forwards the arguments from
1735 /// the enclosing context (an inheriting constructor) to the specified inherited
1736 /// base class constructor.
1737 class CXXInheritedCtorInitExpr : public Expr {
1738 private:
1739   CXXConstructorDecl *Constructor = nullptr;
1740 
1741   /// The location of the using declaration.
1742   SourceLocation Loc;
1743 
1744   /// Whether this is the construction of a virtual base.
1745   LLVM_PREFERRED_TYPE(bool)
1746   unsigned ConstructsVirtualBase : 1;
1747 
1748   /// Whether the constructor is inherited from a virtual base class of the
1749   /// class that we construct.
1750   LLVM_PREFERRED_TYPE(bool)
1751   unsigned InheritedFromVirtualBase : 1;
1752 
1753 public:
1754   friend class ASTStmtReader;
1755 
1756   /// Construct a C++ inheriting construction expression.
1757   CXXInheritedCtorInitExpr(SourceLocation Loc, QualType T,
1758                            CXXConstructorDecl *Ctor, bool ConstructsVirtualBase,
1759                            bool InheritedFromVirtualBase)
1760       : Expr(CXXInheritedCtorInitExprClass, T, VK_PRValue, OK_Ordinary),
1761         Constructor(Ctor), Loc(Loc),
1762         ConstructsVirtualBase(ConstructsVirtualBase),
1763         InheritedFromVirtualBase(InheritedFromVirtualBase) {
1764     assert(!T->isDependentType());
1765     setDependence(ExprDependence::None);
1766   }
1767 
1768   /// Construct an empty C++ inheriting construction expression.
1769   explicit CXXInheritedCtorInitExpr(EmptyShell Empty)
1770       : Expr(CXXInheritedCtorInitExprClass, Empty),
1771         ConstructsVirtualBase(false), InheritedFromVirtualBase(false) {}
1772 
1773   /// Get the constructor that this expression will call.
1774   CXXConstructorDecl *getConstructor() const { return Constructor; }
1775 
1776   /// Determine whether this constructor is actually constructing
1777   /// a base class (rather than a complete object).
1778   bool constructsVBase() const { return ConstructsVirtualBase; }
1779   CXXConstructionKind getConstructionKind() const {
1780     return ConstructsVirtualBase ? CXXConstructionKind::VirtualBase
1781                                  : CXXConstructionKind::NonVirtualBase;
1782   }
1783 
1784   /// Determine whether the inherited constructor is inherited from a
1785   /// virtual base of the object we construct. If so, we are not responsible
1786   /// for calling the inherited constructor (the complete object constructor
1787   /// does that), and so we don't need to pass any arguments.
1788   bool inheritedFromVBase() const { return InheritedFromVirtualBase; }
1789 
1790   SourceLocation getLocation() const LLVM_READONLY { return Loc; }
1791   SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
1792   SourceLocation getEndLoc() const LLVM_READONLY { return Loc; }
1793 
1794   static bool classof(const Stmt *T) {
1795     return T->getStmtClass() == CXXInheritedCtorInitExprClass;
1796   }
1797 
1798   child_range children() {
1799     return child_range(child_iterator(), child_iterator());
1800   }
1801 
1802   const_child_range children() const {
1803     return const_child_range(const_child_iterator(), const_child_iterator());
1804   }
1805 };
1806 
1807 /// Represents an explicit C++ type conversion that uses "functional"
1808 /// notation (C++ [expr.type.conv]).
1809 ///
1810 /// Example:
1811 /// \code
1812 ///   x = int(0.5);
1813 /// \endcode
1814 class CXXFunctionalCastExpr final
1815     : public ExplicitCastExpr,
1816       private llvm::TrailingObjects<CXXFunctionalCastExpr, CXXBaseSpecifier *,
1817                                     FPOptionsOverride> {
1818   SourceLocation LParenLoc;
1819   SourceLocation RParenLoc;
1820 
1821   CXXFunctionalCastExpr(QualType ty, ExprValueKind VK,
1822                         TypeSourceInfo *writtenTy, CastKind kind,
1823                         Expr *castExpr, unsigned pathSize,
1824                         FPOptionsOverride FPO, SourceLocation lParenLoc,
1825                         SourceLocation rParenLoc)
1826       : ExplicitCastExpr(CXXFunctionalCastExprClass, ty, VK, kind, castExpr,
1827                          pathSize, FPO.requiresTrailingStorage(), writtenTy),
1828         LParenLoc(lParenLoc), RParenLoc(rParenLoc) {
1829     if (hasStoredFPFeatures())
1830       *getTrailingFPFeatures() = FPO;
1831   }
1832 
1833   explicit CXXFunctionalCastExpr(EmptyShell Shell, unsigned PathSize,
1834                                  bool HasFPFeatures)
1835       : ExplicitCastExpr(CXXFunctionalCastExprClass, Shell, PathSize,
1836                          HasFPFeatures) {}
1837 
1838   unsigned numTrailingObjects(OverloadToken<CXXBaseSpecifier *>) const {
1839     return path_size();
1840   }
1841 
1842 public:
1843   friend class CastExpr;
1844   friend TrailingObjects;
1845 
1846   static CXXFunctionalCastExpr *
1847   Create(const ASTContext &Context, QualType T, ExprValueKind VK,
1848          TypeSourceInfo *Written, CastKind Kind, Expr *Op,
1849          const CXXCastPath *Path, FPOptionsOverride FPO, SourceLocation LPLoc,
1850          SourceLocation RPLoc);
1851   static CXXFunctionalCastExpr *
1852   CreateEmpty(const ASTContext &Context, unsigned PathSize, bool HasFPFeatures);
1853 
1854   SourceLocation getLParenLoc() const { return LParenLoc; }
1855   void setLParenLoc(SourceLocation L) { LParenLoc = L; }
1856   SourceLocation getRParenLoc() const { return RParenLoc; }
1857   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
1858 
1859   /// Determine whether this expression models list-initialization.
1860   bool isListInitialization() const { return LParenLoc.isInvalid(); }
1861 
1862   SourceLocation getBeginLoc() const LLVM_READONLY;
1863   SourceLocation getEndLoc() const LLVM_READONLY;
1864 
1865   static bool classof(const Stmt *T) {
1866     return T->getStmtClass() == CXXFunctionalCastExprClass;
1867   }
1868 };
1869 
1870 /// Represents a C++ functional cast expression that builds a
1871 /// temporary object.
1872 ///
1873 /// This expression type represents a C++ "functional" cast
1874 /// (C++[expr.type.conv]) with N != 1 arguments that invokes a
1875 /// constructor to build a temporary object. With N == 1 arguments the
1876 /// functional cast expression will be represented by CXXFunctionalCastExpr.
1877 /// Example:
1878 /// \code
1879 /// struct X { X(int, float); }
1880 ///
1881 /// X create_X() {
1882 ///   return X(1, 3.14f); // creates a CXXTemporaryObjectExpr
1883 /// };
1884 /// \endcode
1885 class CXXTemporaryObjectExpr final : public CXXConstructExpr {
1886   friend class ASTStmtReader;
1887 
1888   // CXXTemporaryObjectExpr has some trailing objects belonging
1889   // to CXXConstructExpr. See the comment inside CXXConstructExpr
1890   // for more details.
1891 
1892   TypeSourceInfo *TSI;
1893 
1894   CXXTemporaryObjectExpr(CXXConstructorDecl *Cons, QualType Ty,
1895                          TypeSourceInfo *TSI, ArrayRef<Expr *> Args,
1896                          SourceRange ParenOrBraceRange,
1897                          bool HadMultipleCandidates, bool ListInitialization,
1898                          bool StdInitListInitialization,
1899                          bool ZeroInitialization);
1900 
1901   CXXTemporaryObjectExpr(EmptyShell Empty, unsigned NumArgs);
1902 
1903 public:
1904   static CXXTemporaryObjectExpr *
1905   Create(const ASTContext &Ctx, CXXConstructorDecl *Cons, QualType Ty,
1906          TypeSourceInfo *TSI, ArrayRef<Expr *> Args,
1907          SourceRange ParenOrBraceRange, bool HadMultipleCandidates,
1908          bool ListInitialization, bool StdInitListInitialization,
1909          bool ZeroInitialization);
1910 
1911   static CXXTemporaryObjectExpr *CreateEmpty(const ASTContext &Ctx,
1912                                              unsigned NumArgs);
1913 
1914   TypeSourceInfo *getTypeSourceInfo() const { return TSI; }
1915 
1916   SourceLocation getBeginLoc() const LLVM_READONLY;
1917   SourceLocation getEndLoc() const LLVM_READONLY;
1918 
1919   static bool classof(const Stmt *T) {
1920     return T->getStmtClass() == CXXTemporaryObjectExprClass;
1921   }
1922 };
1923 
1924 Stmt **CXXConstructExpr::getTrailingArgs() {
1925   if (auto *E = dyn_cast<CXXTemporaryObjectExpr>(this))
1926     return reinterpret_cast<Stmt **>(E + 1);
1927   assert((getStmtClass() == CXXConstructExprClass) &&
1928          "Unexpected class deriving from CXXConstructExpr!");
1929   return reinterpret_cast<Stmt **>(this + 1);
1930 }
1931 
1932 /// A C++ lambda expression, which produces a function object
1933 /// (of unspecified type) that can be invoked later.
1934 ///
1935 /// Example:
1936 /// \code
1937 /// void low_pass_filter(std::vector<double> &values, double cutoff) {
1938 ///   values.erase(std::remove_if(values.begin(), values.end(),
1939 ///                               [=](double value) { return value > cutoff; });
1940 /// }
1941 /// \endcode
1942 ///
1943 /// C++11 lambda expressions can capture local variables, either by copying
1944 /// the values of those local variables at the time the function
1945 /// object is constructed (not when it is called!) or by holding a
1946 /// reference to the local variable. These captures can occur either
1947 /// implicitly or can be written explicitly between the square
1948 /// brackets ([...]) that start the lambda expression.
1949 ///
1950 /// C++1y introduces a new form of "capture" called an init-capture that
1951 /// includes an initializing expression (rather than capturing a variable),
1952 /// and which can never occur implicitly.
1953 class LambdaExpr final : public Expr,
1954                          private llvm::TrailingObjects<LambdaExpr, Stmt *> {
1955   // LambdaExpr has some data stored in LambdaExprBits.
1956 
1957   /// The source range that covers the lambda introducer ([...]).
1958   SourceRange IntroducerRange;
1959 
1960   /// The source location of this lambda's capture-default ('=' or '&').
1961   SourceLocation CaptureDefaultLoc;
1962 
1963   /// The location of the closing brace ('}') that completes
1964   /// the lambda.
1965   ///
1966   /// The location of the brace is also available by looking up the
1967   /// function call operator in the lambda class. However, it is
1968   /// stored here to improve the performance of getSourceRange(), and
1969   /// to avoid having to deserialize the function call operator from a
1970   /// module file just to determine the source range.
1971   SourceLocation ClosingBrace;
1972 
1973   /// Construct a lambda expression.
1974   LambdaExpr(QualType T, SourceRange IntroducerRange,
1975              LambdaCaptureDefault CaptureDefault,
1976              SourceLocation CaptureDefaultLoc, bool ExplicitParams,
1977              bool ExplicitResultType, ArrayRef<Expr *> CaptureInits,
1978              SourceLocation ClosingBrace, bool ContainsUnexpandedParameterPack);
1979 
1980   /// Construct an empty lambda expression.
1981   LambdaExpr(EmptyShell Empty, unsigned NumCaptures);
1982 
1983   Stmt **getStoredStmts() { return getTrailingObjects<Stmt *>(); }
1984   Stmt *const *getStoredStmts() const { return getTrailingObjects<Stmt *>(); }
1985 
1986   void initBodyIfNeeded() const;
1987 
1988 public:
1989   friend class ASTStmtReader;
1990   friend class ASTStmtWriter;
1991   friend TrailingObjects;
1992 
1993   /// Construct a new lambda expression.
1994   static LambdaExpr *
1995   Create(const ASTContext &C, CXXRecordDecl *Class, SourceRange IntroducerRange,
1996          LambdaCaptureDefault CaptureDefault, SourceLocation CaptureDefaultLoc,
1997          bool ExplicitParams, bool ExplicitResultType,
1998          ArrayRef<Expr *> CaptureInits, SourceLocation ClosingBrace,
1999          bool ContainsUnexpandedParameterPack);
2000 
2001   /// Construct a new lambda expression that will be deserialized from
2002   /// an external source.
2003   static LambdaExpr *CreateDeserialized(const ASTContext &C,
2004                                         unsigned NumCaptures);
2005 
2006   /// Determine the default capture kind for this lambda.
2007   LambdaCaptureDefault getCaptureDefault() const {
2008     return static_cast<LambdaCaptureDefault>(LambdaExprBits.CaptureDefault);
2009   }
2010 
2011   /// Retrieve the location of this lambda's capture-default, if any.
2012   SourceLocation getCaptureDefaultLoc() const { return CaptureDefaultLoc; }
2013 
2014   /// Determine whether one of this lambda's captures is an init-capture.
2015   bool isInitCapture(const LambdaCapture *Capture) const;
2016 
2017   /// An iterator that walks over the captures of the lambda,
2018   /// both implicit and explicit.
2019   using capture_iterator = const LambdaCapture *;
2020 
2021   /// An iterator over a range of lambda captures.
2022   using capture_range = llvm::iterator_range<capture_iterator>;
2023 
2024   /// Retrieve this lambda's captures.
2025   capture_range captures() const;
2026 
2027   /// Retrieve an iterator pointing to the first lambda capture.
2028   capture_iterator capture_begin() const;
2029 
2030   /// Retrieve an iterator pointing past the end of the
2031   /// sequence of lambda captures.
2032   capture_iterator capture_end() const;
2033 
2034   /// Determine the number of captures in this lambda.
2035   unsigned capture_size() const { return LambdaExprBits.NumCaptures; }
2036 
2037   /// Retrieve this lambda's explicit captures.
2038   capture_range explicit_captures() const;
2039 
2040   /// Retrieve an iterator pointing to the first explicit
2041   /// lambda capture.
2042   capture_iterator explicit_capture_begin() const;
2043 
2044   /// Retrieve an iterator pointing past the end of the sequence of
2045   /// explicit lambda captures.
2046   capture_iterator explicit_capture_end() const;
2047 
2048   /// Retrieve this lambda's implicit captures.
2049   capture_range implicit_captures() const;
2050 
2051   /// Retrieve an iterator pointing to the first implicit
2052   /// lambda capture.
2053   capture_iterator implicit_capture_begin() const;
2054 
2055   /// Retrieve an iterator pointing past the end of the sequence of
2056   /// implicit lambda captures.
2057   capture_iterator implicit_capture_end() const;
2058 
2059   /// Iterator that walks over the capture initialization
2060   /// arguments.
2061   using capture_init_iterator = Expr **;
2062 
2063   /// Const iterator that walks over the capture initialization
2064   /// arguments.
2065   /// FIXME: This interface is prone to being used incorrectly.
2066   using const_capture_init_iterator = Expr *const *;
2067 
2068   /// Retrieve the initialization expressions for this lambda's captures.
2069   llvm::iterator_range<capture_init_iterator> capture_inits() {
2070     return llvm::make_range(capture_init_begin(), capture_init_end());
2071   }
2072 
2073   /// Retrieve the initialization expressions for this lambda's captures.
2074   llvm::iterator_range<const_capture_init_iterator> capture_inits() const {
2075     return llvm::make_range(capture_init_begin(), capture_init_end());
2076   }
2077 
2078   /// Retrieve the first initialization argument for this
2079   /// lambda expression (which initializes the first capture field).
2080   capture_init_iterator capture_init_begin() {
2081     return reinterpret_cast<Expr **>(getStoredStmts());
2082   }
2083 
2084   /// Retrieve the first initialization argument for this
2085   /// lambda expression (which initializes the first capture field).
2086   const_capture_init_iterator capture_init_begin() const {
2087     return reinterpret_cast<Expr *const *>(getStoredStmts());
2088   }
2089 
2090   /// Retrieve the iterator pointing one past the last
2091   /// initialization argument for this lambda expression.
2092   capture_init_iterator capture_init_end() {
2093     return capture_init_begin() + capture_size();
2094   }
2095 
2096   /// Retrieve the iterator pointing one past the last
2097   /// initialization argument for this lambda expression.
2098   const_capture_init_iterator capture_init_end() const {
2099     return capture_init_begin() + capture_size();
2100   }
2101 
2102   /// Retrieve the source range covering the lambda introducer,
2103   /// which contains the explicit capture list surrounded by square
2104   /// brackets ([...]).
2105   SourceRange getIntroducerRange() const { return IntroducerRange; }
2106 
2107   /// Retrieve the class that corresponds to the lambda.
2108   ///
2109   /// This is the "closure type" (C++1y [expr.prim.lambda]), and stores the
2110   /// captures in its fields and provides the various operations permitted
2111   /// on a lambda (copying, calling).
2112   CXXRecordDecl *getLambdaClass() const;
2113 
2114   /// Retrieve the function call operator associated with this
2115   /// lambda expression.
2116   CXXMethodDecl *getCallOperator() const;
2117 
2118   /// Retrieve the function template call operator associated with this
2119   /// lambda expression.
2120   FunctionTemplateDecl *getDependentCallOperator() const;
2121 
2122   /// If this is a generic lambda expression, retrieve the template
2123   /// parameter list associated with it, or else return null.
2124   TemplateParameterList *getTemplateParameterList() const;
2125 
2126   /// Get the template parameters were explicitly specified (as opposed to being
2127   /// invented by use of an auto parameter).
2128   ArrayRef<NamedDecl *> getExplicitTemplateParameters() const;
2129 
2130   /// Get the trailing requires clause, if any.
2131   Expr *getTrailingRequiresClause() const;
2132 
2133   /// Whether this is a generic lambda.
2134   bool isGenericLambda() const { return getTemplateParameterList(); }
2135 
2136   /// Retrieve the body of the lambda. This will be most of the time
2137   /// a \p CompoundStmt, but can also be \p CoroutineBodyStmt wrapping
2138   /// a \p CompoundStmt. Note that unlike functions, lambda-expressions
2139   /// cannot have a function-try-block.
2140   Stmt *getBody() const;
2141 
2142   /// Retrieve the \p CompoundStmt representing the body of the lambda.
2143   /// This is a convenience function for callers who do not need
2144   /// to handle node(s) which may wrap a \p CompoundStmt.
2145   const CompoundStmt *getCompoundStmtBody() const;
2146   CompoundStmt *getCompoundStmtBody() {
2147     const auto *ConstThis = this;
2148     return const_cast<CompoundStmt *>(ConstThis->getCompoundStmtBody());
2149   }
2150 
2151   /// Determine whether the lambda is mutable, meaning that any
2152   /// captures values can be modified.
2153   bool isMutable() const;
2154 
2155   /// Determine whether this lambda has an explicit parameter
2156   /// list vs. an implicit (empty) parameter list.
2157   bool hasExplicitParameters() const { return LambdaExprBits.ExplicitParams; }
2158 
2159   /// Whether this lambda had its result type explicitly specified.
2160   bool hasExplicitResultType() const {
2161     return LambdaExprBits.ExplicitResultType;
2162   }
2163 
2164   static bool classof(const Stmt *T) {
2165     return T->getStmtClass() == LambdaExprClass;
2166   }
2167 
2168   SourceLocation getBeginLoc() const LLVM_READONLY {
2169     return IntroducerRange.getBegin();
2170   }
2171 
2172   SourceLocation getEndLoc() const LLVM_READONLY { return ClosingBrace; }
2173 
2174   /// Includes the captures and the body of the lambda.
2175   child_range children();
2176   const_child_range children() const;
2177 };
2178 
2179 /// An expression "T()" which creates an rvalue of a non-class type T.
2180 /// For non-void T, the rvalue is value-initialized.
2181 /// See (C++98 [5.2.3p2]).
2182 class CXXScalarValueInitExpr : public Expr {
2183   friend class ASTStmtReader;
2184 
2185   TypeSourceInfo *TypeInfo;
2186 
2187 public:
2188   /// Create an explicitly-written scalar-value initialization
2189   /// expression.
2190   CXXScalarValueInitExpr(QualType Type, TypeSourceInfo *TypeInfo,
2191                          SourceLocation RParenLoc)
2192       : Expr(CXXScalarValueInitExprClass, Type, VK_PRValue, OK_Ordinary),
2193         TypeInfo(TypeInfo) {
2194     CXXScalarValueInitExprBits.RParenLoc = RParenLoc;
2195     setDependence(computeDependence(this));
2196   }
2197 
2198   explicit CXXScalarValueInitExpr(EmptyShell Shell)
2199       : Expr(CXXScalarValueInitExprClass, Shell) {}
2200 
2201   TypeSourceInfo *getTypeSourceInfo() const {
2202     return TypeInfo;
2203   }
2204 
2205   SourceLocation getRParenLoc() const {
2206     return CXXScalarValueInitExprBits.RParenLoc;
2207   }
2208 
2209   SourceLocation getBeginLoc() const LLVM_READONLY;
2210   SourceLocation getEndLoc() const { return getRParenLoc(); }
2211 
2212   static bool classof(const Stmt *T) {
2213     return T->getStmtClass() == CXXScalarValueInitExprClass;
2214   }
2215 
2216   // Iterators
2217   child_range children() {
2218     return child_range(child_iterator(), child_iterator());
2219   }
2220 
2221   const_child_range children() const {
2222     return const_child_range(const_child_iterator(), const_child_iterator());
2223   }
2224 };
2225 
2226 enum class CXXNewInitializationStyle {
2227   /// New-expression has no initializer as written.
2228   None,
2229 
2230   /// New-expression has a C++98 paren-delimited initializer.
2231   Parens,
2232 
2233   /// New-expression has a C++11 list-initializer.
2234   Braces
2235 };
2236 
2237 /// Represents a new-expression for memory allocation and constructor
2238 /// calls, e.g: "new CXXNewExpr(foo)".
2239 class CXXNewExpr final
2240     : public Expr,
2241       private llvm::TrailingObjects<CXXNewExpr, Stmt *, SourceRange> {
2242   friend class ASTStmtReader;
2243   friend class ASTStmtWriter;
2244   friend TrailingObjects;
2245 
2246   /// Points to the allocation function used.
2247   FunctionDecl *OperatorNew;
2248 
2249   /// Points to the deallocation function used in case of error. May be null.
2250   FunctionDecl *OperatorDelete;
2251 
2252   /// The allocated type-source information, as written in the source.
2253   TypeSourceInfo *AllocatedTypeInfo;
2254 
2255   /// Range of the entire new expression.
2256   SourceRange Range;
2257 
2258   /// Source-range of a paren-delimited initializer.
2259   SourceRange DirectInitRange;
2260 
2261   // CXXNewExpr is followed by several optional trailing objects.
2262   // They are in order:
2263   //
2264   // * An optional "Stmt *" for the array size expression.
2265   //    Present if and ony if isArray().
2266   //
2267   // * An optional "Stmt *" for the init expression.
2268   //    Present if and only if hasInitializer().
2269   //
2270   // * An array of getNumPlacementArgs() "Stmt *" for the placement new
2271   //   arguments, if any.
2272   //
2273   // * An optional SourceRange for the range covering the parenthesized type-id
2274   //    if the allocated type was expressed as a parenthesized type-id.
2275   //    Present if and only if isParenTypeId().
2276   unsigned arraySizeOffset() const { return 0; }
2277   unsigned initExprOffset() const { return arraySizeOffset() + isArray(); }
2278   unsigned placementNewArgsOffset() const {
2279     return initExprOffset() + hasInitializer();
2280   }
2281 
2282   unsigned numTrailingObjects(OverloadToken<Stmt *>) const {
2283     return isArray() + hasInitializer() + getNumPlacementArgs();
2284   }
2285 
2286   unsigned numTrailingObjects(OverloadToken<SourceRange>) const {
2287     return isParenTypeId();
2288   }
2289 
2290   /// Build a c++ new expression.
2291   CXXNewExpr(bool IsGlobalNew, FunctionDecl *OperatorNew,
2292              FunctionDecl *OperatorDelete, bool ShouldPassAlignment,
2293              bool UsualArrayDeleteWantsSize, ArrayRef<Expr *> PlacementArgs,
2294              SourceRange TypeIdParens, std::optional<Expr *> ArraySize,
2295              CXXNewInitializationStyle InitializationStyle, Expr *Initializer,
2296              QualType Ty, TypeSourceInfo *AllocatedTypeInfo, SourceRange Range,
2297              SourceRange DirectInitRange);
2298 
2299   /// Build an empty c++ new expression.
2300   CXXNewExpr(EmptyShell Empty, bool IsArray, unsigned NumPlacementArgs,
2301              bool IsParenTypeId);
2302 
2303 public:
2304   /// Create a c++ new expression.
2305   static CXXNewExpr *
2306   Create(const ASTContext &Ctx, bool IsGlobalNew, FunctionDecl *OperatorNew,
2307          FunctionDecl *OperatorDelete, bool ShouldPassAlignment,
2308          bool UsualArrayDeleteWantsSize, ArrayRef<Expr *> PlacementArgs,
2309          SourceRange TypeIdParens, std::optional<Expr *> ArraySize,
2310          CXXNewInitializationStyle InitializationStyle, Expr *Initializer,
2311          QualType Ty, TypeSourceInfo *AllocatedTypeInfo, SourceRange Range,
2312          SourceRange DirectInitRange);
2313 
2314   /// Create an empty c++ new expression.
2315   static CXXNewExpr *CreateEmpty(const ASTContext &Ctx, bool IsArray,
2316                                  bool HasInit, unsigned NumPlacementArgs,
2317                                  bool IsParenTypeId);
2318 
2319   QualType getAllocatedType() const {
2320     return getType()->castAs<PointerType>()->getPointeeType();
2321   }
2322 
2323   TypeSourceInfo *getAllocatedTypeSourceInfo() const {
2324     return AllocatedTypeInfo;
2325   }
2326 
2327   /// True if the allocation result needs to be null-checked.
2328   ///
2329   /// C++11 [expr.new]p13:
2330   ///   If the allocation function returns null, initialization shall
2331   ///   not be done, the deallocation function shall not be called,
2332   ///   and the value of the new-expression shall be null.
2333   ///
2334   /// C++ DR1748:
2335   ///   If the allocation function is a reserved placement allocation
2336   ///   function that returns null, the behavior is undefined.
2337   ///
2338   /// An allocation function is not allowed to return null unless it
2339   /// has a non-throwing exception-specification.  The '03 rule is
2340   /// identical except that the definition of a non-throwing
2341   /// exception specification is just "is it throw()?".
2342   bool shouldNullCheckAllocation() const;
2343 
2344   FunctionDecl *getOperatorNew() const { return OperatorNew; }
2345   void setOperatorNew(FunctionDecl *D) { OperatorNew = D; }
2346   FunctionDecl *getOperatorDelete() const { return OperatorDelete; }
2347   void setOperatorDelete(FunctionDecl *D) { OperatorDelete = D; }
2348 
2349   bool isArray() const { return CXXNewExprBits.IsArray; }
2350 
2351   /// This might return std::nullopt even if isArray() returns true,
2352   /// since there might not be an array size expression.
2353   /// If the result is not std::nullopt, it will never wrap a nullptr.
2354   std::optional<Expr *> getArraySize() {
2355     if (!isArray())
2356       return std::nullopt;
2357 
2358     if (auto *Result =
2359             cast_or_null<Expr>(getTrailingObjects<Stmt *>()[arraySizeOffset()]))
2360       return Result;
2361 
2362     return std::nullopt;
2363   }
2364 
2365   /// This might return std::nullopt even if isArray() returns true,
2366   /// since there might not be an array size expression.
2367   /// If the result is not std::nullopt, it will never wrap a nullptr.
2368   std::optional<const Expr *> getArraySize() const {
2369     if (!isArray())
2370       return std::nullopt;
2371 
2372     if (auto *Result =
2373             cast_or_null<Expr>(getTrailingObjects<Stmt *>()[arraySizeOffset()]))
2374       return Result;
2375 
2376     return std::nullopt;
2377   }
2378 
2379   unsigned getNumPlacementArgs() const {
2380     return CXXNewExprBits.NumPlacementArgs;
2381   }
2382 
2383   Expr **getPlacementArgs() {
2384     return reinterpret_cast<Expr **>(getTrailingObjects<Stmt *>() +
2385                                      placementNewArgsOffset());
2386   }
2387 
2388   Expr *getPlacementArg(unsigned I) {
2389     assert((I < getNumPlacementArgs()) && "Index out of range!");
2390     return getPlacementArgs()[I];
2391   }
2392   const Expr *getPlacementArg(unsigned I) const {
2393     return const_cast<CXXNewExpr *>(this)->getPlacementArg(I);
2394   }
2395 
2396   bool isParenTypeId() const { return CXXNewExprBits.IsParenTypeId; }
2397   SourceRange getTypeIdParens() const {
2398     return isParenTypeId() ? getTrailingObjects<SourceRange>()[0]
2399                            : SourceRange();
2400   }
2401 
2402   bool isGlobalNew() const { return CXXNewExprBits.IsGlobalNew; }
2403 
2404   /// Whether this new-expression has any initializer at all.
2405   bool hasInitializer() const { return CXXNewExprBits.HasInitializer; }
2406 
2407   /// The kind of initializer this new-expression has.
2408   CXXNewInitializationStyle getInitializationStyle() const {
2409     return static_cast<CXXNewInitializationStyle>(
2410         CXXNewExprBits.StoredInitializationStyle);
2411   }
2412 
2413   /// The initializer of this new-expression.
2414   Expr *getInitializer() {
2415     return hasInitializer()
2416                ? cast<Expr>(getTrailingObjects<Stmt *>()[initExprOffset()])
2417                : nullptr;
2418   }
2419   const Expr *getInitializer() const {
2420     return hasInitializer()
2421                ? cast<Expr>(getTrailingObjects<Stmt *>()[initExprOffset()])
2422                : nullptr;
2423   }
2424 
2425   /// Returns the CXXConstructExpr from this new-expression, or null.
2426   const CXXConstructExpr *getConstructExpr() const {
2427     return dyn_cast_or_null<CXXConstructExpr>(getInitializer());
2428   }
2429 
2430   /// Indicates whether the required alignment should be implicitly passed to
2431   /// the allocation function.
2432   bool passAlignment() const { return CXXNewExprBits.ShouldPassAlignment; }
2433 
2434   /// Answers whether the usual array deallocation function for the
2435   /// allocated type expects the size of the allocation as a
2436   /// parameter.
2437   bool doesUsualArrayDeleteWantSize() const {
2438     return CXXNewExprBits.UsualArrayDeleteWantsSize;
2439   }
2440 
2441   using arg_iterator = ExprIterator;
2442   using const_arg_iterator = ConstExprIterator;
2443 
2444   llvm::iterator_range<arg_iterator> placement_arguments() {
2445     return llvm::make_range(placement_arg_begin(), placement_arg_end());
2446   }
2447 
2448   llvm::iterator_range<const_arg_iterator> placement_arguments() const {
2449     return llvm::make_range(placement_arg_begin(), placement_arg_end());
2450   }
2451 
2452   arg_iterator placement_arg_begin() {
2453     return getTrailingObjects<Stmt *>() + placementNewArgsOffset();
2454   }
2455   arg_iterator placement_arg_end() {
2456     return placement_arg_begin() + getNumPlacementArgs();
2457   }
2458   const_arg_iterator placement_arg_begin() const {
2459     return getTrailingObjects<Stmt *>() + placementNewArgsOffset();
2460   }
2461   const_arg_iterator placement_arg_end() const {
2462     return placement_arg_begin() + getNumPlacementArgs();
2463   }
2464 
2465   using raw_arg_iterator = Stmt **;
2466 
2467   raw_arg_iterator raw_arg_begin() { return getTrailingObjects<Stmt *>(); }
2468   raw_arg_iterator raw_arg_end() {
2469     return raw_arg_begin() + numTrailingObjects(OverloadToken<Stmt *>());
2470   }
2471   const_arg_iterator raw_arg_begin() const {
2472     return getTrailingObjects<Stmt *>();
2473   }
2474   const_arg_iterator raw_arg_end() const {
2475     return raw_arg_begin() + numTrailingObjects(OverloadToken<Stmt *>());
2476   }
2477 
2478   SourceLocation getBeginLoc() const { return Range.getBegin(); }
2479   SourceLocation getEndLoc() const { return Range.getEnd(); }
2480 
2481   SourceRange getDirectInitRange() const { return DirectInitRange; }
2482   SourceRange getSourceRange() const { return Range; }
2483 
2484   static bool classof(const Stmt *T) {
2485     return T->getStmtClass() == CXXNewExprClass;
2486   }
2487 
2488   // Iterators
2489   child_range children() { return child_range(raw_arg_begin(), raw_arg_end()); }
2490 
2491   const_child_range children() const {
2492     return const_child_range(const_cast<CXXNewExpr *>(this)->children());
2493   }
2494 };
2495 
2496 /// Represents a \c delete expression for memory deallocation and
2497 /// destructor calls, e.g. "delete[] pArray".
2498 class CXXDeleteExpr : public Expr {
2499   friend class ASTStmtReader;
2500 
2501   /// Points to the operator delete overload that is used. Could be a member.
2502   FunctionDecl *OperatorDelete = nullptr;
2503 
2504   /// The pointer expression to be deleted.
2505   Stmt *Argument = nullptr;
2506 
2507 public:
2508   CXXDeleteExpr(QualType Ty, bool GlobalDelete, bool ArrayForm,
2509                 bool ArrayFormAsWritten, bool UsualArrayDeleteWantsSize,
2510                 FunctionDecl *OperatorDelete, Expr *Arg, SourceLocation Loc)
2511       : Expr(CXXDeleteExprClass, Ty, VK_PRValue, OK_Ordinary),
2512         OperatorDelete(OperatorDelete), Argument(Arg) {
2513     CXXDeleteExprBits.GlobalDelete = GlobalDelete;
2514     CXXDeleteExprBits.ArrayForm = ArrayForm;
2515     CXXDeleteExprBits.ArrayFormAsWritten = ArrayFormAsWritten;
2516     CXXDeleteExprBits.UsualArrayDeleteWantsSize = UsualArrayDeleteWantsSize;
2517     CXXDeleteExprBits.Loc = Loc;
2518     setDependence(computeDependence(this));
2519   }
2520 
2521   explicit CXXDeleteExpr(EmptyShell Shell) : Expr(CXXDeleteExprClass, Shell) {}
2522 
2523   bool isGlobalDelete() const { return CXXDeleteExprBits.GlobalDelete; }
2524   bool isArrayForm() const { return CXXDeleteExprBits.ArrayForm; }
2525   bool isArrayFormAsWritten() const {
2526     return CXXDeleteExprBits.ArrayFormAsWritten;
2527   }
2528 
2529   /// Answers whether the usual array deallocation function for the
2530   /// allocated type expects the size of the allocation as a
2531   /// parameter.  This can be true even if the actual deallocation
2532   /// function that we're using doesn't want a size.
2533   bool doesUsualArrayDeleteWantSize() const {
2534     return CXXDeleteExprBits.UsualArrayDeleteWantsSize;
2535   }
2536 
2537   FunctionDecl *getOperatorDelete() const { return OperatorDelete; }
2538 
2539   Expr *getArgument() { return cast<Expr>(Argument); }
2540   const Expr *getArgument() const { return cast<Expr>(Argument); }
2541 
2542   /// Retrieve the type being destroyed.
2543   ///
2544   /// If the type being destroyed is a dependent type which may or may not
2545   /// be a pointer, return an invalid type.
2546   QualType getDestroyedType() const;
2547 
2548   SourceLocation getBeginLoc() const { return CXXDeleteExprBits.Loc; }
2549   SourceLocation getEndLoc() const LLVM_READONLY {
2550     return Argument->getEndLoc();
2551   }
2552 
2553   static bool classof(const Stmt *T) {
2554     return T->getStmtClass() == CXXDeleteExprClass;
2555   }
2556 
2557   // Iterators
2558   child_range children() { return child_range(&Argument, &Argument + 1); }
2559 
2560   const_child_range children() const {
2561     return const_child_range(&Argument, &Argument + 1);
2562   }
2563 };
2564 
2565 /// Stores the type being destroyed by a pseudo-destructor expression.
2566 class PseudoDestructorTypeStorage {
2567   /// Either the type source information or the name of the type, if
2568   /// it couldn't be resolved due to type-dependence.
2569   llvm::PointerUnion<TypeSourceInfo *, const IdentifierInfo *> Type;
2570 
2571   /// The starting source location of the pseudo-destructor type.
2572   SourceLocation Location;
2573 
2574 public:
2575   PseudoDestructorTypeStorage() = default;
2576 
2577   PseudoDestructorTypeStorage(const IdentifierInfo *II, SourceLocation Loc)
2578       : Type(II), Location(Loc) {}
2579 
2580   PseudoDestructorTypeStorage(TypeSourceInfo *Info);
2581 
2582   TypeSourceInfo *getTypeSourceInfo() const {
2583     return Type.dyn_cast<TypeSourceInfo *>();
2584   }
2585 
2586   const IdentifierInfo *getIdentifier() const {
2587     return Type.dyn_cast<const IdentifierInfo *>();
2588   }
2589 
2590   SourceLocation getLocation() const { return Location; }
2591 };
2592 
2593 /// Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
2594 ///
2595 /// A pseudo-destructor is an expression that looks like a member access to a
2596 /// destructor of a scalar type, except that scalar types don't have
2597 /// destructors. For example:
2598 ///
2599 /// \code
2600 /// typedef int T;
2601 /// void f(int *p) {
2602 ///   p->T::~T();
2603 /// }
2604 /// \endcode
2605 ///
2606 /// Pseudo-destructors typically occur when instantiating templates such as:
2607 ///
2608 /// \code
2609 /// template<typename T>
2610 /// void destroy(T* ptr) {
2611 ///   ptr->T::~T();
2612 /// }
2613 /// \endcode
2614 ///
2615 /// for scalar types. A pseudo-destructor expression has no run-time semantics
2616 /// beyond evaluating the base expression.
2617 class CXXPseudoDestructorExpr : public Expr {
2618   friend class ASTStmtReader;
2619 
2620   /// The base expression (that is being destroyed).
2621   Stmt *Base = nullptr;
2622 
2623   /// Whether the operator was an arrow ('->'); otherwise, it was a
2624   /// period ('.').
2625   LLVM_PREFERRED_TYPE(bool)
2626   bool IsArrow : 1;
2627 
2628   /// The location of the '.' or '->' operator.
2629   SourceLocation OperatorLoc;
2630 
2631   /// The nested-name-specifier that follows the operator, if present.
2632   NestedNameSpecifierLoc QualifierLoc;
2633 
2634   /// The type that precedes the '::' in a qualified pseudo-destructor
2635   /// expression.
2636   TypeSourceInfo *ScopeType = nullptr;
2637 
2638   /// The location of the '::' in a qualified pseudo-destructor
2639   /// expression.
2640   SourceLocation ColonColonLoc;
2641 
2642   /// The location of the '~'.
2643   SourceLocation TildeLoc;
2644 
2645   /// The type being destroyed, or its name if we were unable to
2646   /// resolve the name.
2647   PseudoDestructorTypeStorage DestroyedType;
2648 
2649 public:
2650   CXXPseudoDestructorExpr(const ASTContext &Context,
2651                           Expr *Base, bool isArrow, SourceLocation OperatorLoc,
2652                           NestedNameSpecifierLoc QualifierLoc,
2653                           TypeSourceInfo *ScopeType,
2654                           SourceLocation ColonColonLoc,
2655                           SourceLocation TildeLoc,
2656                           PseudoDestructorTypeStorage DestroyedType);
2657 
2658   explicit CXXPseudoDestructorExpr(EmptyShell Shell)
2659       : Expr(CXXPseudoDestructorExprClass, Shell), IsArrow(false) {}
2660 
2661   Expr *getBase() const { return cast<Expr>(Base); }
2662 
2663   /// Determines whether this member expression actually had
2664   /// a C++ nested-name-specifier prior to the name of the member, e.g.,
2665   /// x->Base::foo.
2666   bool hasQualifier() const { return QualifierLoc.hasQualifier(); }
2667 
2668   /// Retrieves the nested-name-specifier that qualifies the type name,
2669   /// with source-location information.
2670   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
2671 
2672   /// If the member name was qualified, retrieves the
2673   /// nested-name-specifier that precedes the member name. Otherwise, returns
2674   /// null.
2675   NestedNameSpecifier *getQualifier() const {
2676     return QualifierLoc.getNestedNameSpecifier();
2677   }
2678 
2679   /// Determine whether this pseudo-destructor expression was written
2680   /// using an '->' (otherwise, it used a '.').
2681   bool isArrow() const { return IsArrow; }
2682 
2683   /// Retrieve the location of the '.' or '->' operator.
2684   SourceLocation getOperatorLoc() const { return OperatorLoc; }
2685 
2686   /// Retrieve the scope type in a qualified pseudo-destructor
2687   /// expression.
2688   ///
2689   /// Pseudo-destructor expressions can have extra qualification within them
2690   /// that is not part of the nested-name-specifier, e.g., \c p->T::~T().
2691   /// Here, if the object type of the expression is (or may be) a scalar type,
2692   /// \p T may also be a scalar type and, therefore, cannot be part of a
2693   /// nested-name-specifier. It is stored as the "scope type" of the pseudo-
2694   /// destructor expression.
2695   TypeSourceInfo *getScopeTypeInfo() const { return ScopeType; }
2696 
2697   /// Retrieve the location of the '::' in a qualified pseudo-destructor
2698   /// expression.
2699   SourceLocation getColonColonLoc() const { return ColonColonLoc; }
2700 
2701   /// Retrieve the location of the '~'.
2702   SourceLocation getTildeLoc() const { return TildeLoc; }
2703 
2704   /// Retrieve the source location information for the type
2705   /// being destroyed.
2706   ///
2707   /// This type-source information is available for non-dependent
2708   /// pseudo-destructor expressions and some dependent pseudo-destructor
2709   /// expressions. Returns null if we only have the identifier for a
2710   /// dependent pseudo-destructor expression.
2711   TypeSourceInfo *getDestroyedTypeInfo() const {
2712     return DestroyedType.getTypeSourceInfo();
2713   }
2714 
2715   /// In a dependent pseudo-destructor expression for which we do not
2716   /// have full type information on the destroyed type, provides the name
2717   /// of the destroyed type.
2718   const IdentifierInfo *getDestroyedTypeIdentifier() const {
2719     return DestroyedType.getIdentifier();
2720   }
2721 
2722   /// Retrieve the type being destroyed.
2723   QualType getDestroyedType() const;
2724 
2725   /// Retrieve the starting location of the type being destroyed.
2726   SourceLocation getDestroyedTypeLoc() const {
2727     return DestroyedType.getLocation();
2728   }
2729 
2730   /// Set the name of destroyed type for a dependent pseudo-destructor
2731   /// expression.
2732   void setDestroyedType(IdentifierInfo *II, SourceLocation Loc) {
2733     DestroyedType = PseudoDestructorTypeStorage(II, Loc);
2734   }
2735 
2736   /// Set the destroyed type.
2737   void setDestroyedType(TypeSourceInfo *Info) {
2738     DestroyedType = PseudoDestructorTypeStorage(Info);
2739   }
2740 
2741   SourceLocation getBeginLoc() const LLVM_READONLY {
2742     return Base->getBeginLoc();
2743   }
2744   SourceLocation getEndLoc() const LLVM_READONLY;
2745 
2746   static bool classof(const Stmt *T) {
2747     return T->getStmtClass() == CXXPseudoDestructorExprClass;
2748   }
2749 
2750   // Iterators
2751   child_range children() { return child_range(&Base, &Base + 1); }
2752 
2753   const_child_range children() const {
2754     return const_child_range(&Base, &Base + 1);
2755   }
2756 };
2757 
2758 /// A type trait used in the implementation of various C++11 and
2759 /// Library TR1 trait templates.
2760 ///
2761 /// \code
2762 ///   __is_pod(int) == true
2763 ///   __is_enum(std::string) == false
2764 ///   __is_trivially_constructible(vector<int>, int*, int*)
2765 /// \endcode
2766 class TypeTraitExpr final
2767     : public Expr,
2768       private llvm::TrailingObjects<TypeTraitExpr, TypeSourceInfo *> {
2769   /// The location of the type trait keyword.
2770   SourceLocation Loc;
2771 
2772   ///  The location of the closing parenthesis.
2773   SourceLocation RParenLoc;
2774 
2775   // Note: The TypeSourceInfos for the arguments are allocated after the
2776   // TypeTraitExpr.
2777 
2778   TypeTraitExpr(QualType T, SourceLocation Loc, TypeTrait Kind,
2779                 ArrayRef<TypeSourceInfo *> Args,
2780                 SourceLocation RParenLoc,
2781                 bool Value);
2782 
2783   TypeTraitExpr(EmptyShell Empty) : Expr(TypeTraitExprClass, Empty) {}
2784 
2785   size_t numTrailingObjects(OverloadToken<TypeSourceInfo *>) const {
2786     return getNumArgs();
2787   }
2788 
2789 public:
2790   friend class ASTStmtReader;
2791   friend class ASTStmtWriter;
2792   friend TrailingObjects;
2793 
2794   /// Create a new type trait expression.
2795   static TypeTraitExpr *Create(const ASTContext &C, QualType T,
2796                                SourceLocation Loc, TypeTrait Kind,
2797                                ArrayRef<TypeSourceInfo *> Args,
2798                                SourceLocation RParenLoc,
2799                                bool Value);
2800 
2801   static TypeTraitExpr *CreateDeserialized(const ASTContext &C,
2802                                            unsigned NumArgs);
2803 
2804   /// Determine which type trait this expression uses.
2805   TypeTrait getTrait() const {
2806     return static_cast<TypeTrait>(TypeTraitExprBits.Kind);
2807   }
2808 
2809   bool getValue() const {
2810     assert(!isValueDependent());
2811     return TypeTraitExprBits.Value;
2812   }
2813 
2814   /// Determine the number of arguments to this type trait.
2815   unsigned getNumArgs() const { return TypeTraitExprBits.NumArgs; }
2816 
2817   /// Retrieve the Ith argument.
2818   TypeSourceInfo *getArg(unsigned I) const {
2819     assert(I < getNumArgs() && "Argument out-of-range");
2820     return getArgs()[I];
2821   }
2822 
2823   /// Retrieve the argument types.
2824   ArrayRef<TypeSourceInfo *> getArgs() const {
2825     return llvm::ArrayRef(getTrailingObjects<TypeSourceInfo *>(), getNumArgs());
2826   }
2827 
2828   SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
2829   SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
2830 
2831   static bool classof(const Stmt *T) {
2832     return T->getStmtClass() == TypeTraitExprClass;
2833   }
2834 
2835   // Iterators
2836   child_range children() {
2837     return child_range(child_iterator(), child_iterator());
2838   }
2839 
2840   const_child_range children() const {
2841     return const_child_range(const_child_iterator(), const_child_iterator());
2842   }
2843 };
2844 
2845 /// An Embarcadero array type trait, as used in the implementation of
2846 /// __array_rank and __array_extent.
2847 ///
2848 /// Example:
2849 /// \code
2850 ///   __array_rank(int[10][20])      == 2
2851 ///   __array_extent(int[10][20], 1) == 20
2852 /// \endcode
2853 class ArrayTypeTraitExpr : public Expr {
2854   /// The trait. An ArrayTypeTrait enum in MSVC compat unsigned.
2855   LLVM_PREFERRED_TYPE(ArrayTypeTrait)
2856   unsigned ATT : 2;
2857 
2858   /// The value of the type trait. Unspecified if dependent.
2859   uint64_t Value = 0;
2860 
2861   /// The array dimension being queried, or -1 if not used.
2862   Expr *Dimension;
2863 
2864   /// The location of the type trait keyword.
2865   SourceLocation Loc;
2866 
2867   /// The location of the closing paren.
2868   SourceLocation RParen;
2869 
2870   /// The type being queried.
2871   TypeSourceInfo *QueriedType = nullptr;
2872 
2873 public:
2874   friend class ASTStmtReader;
2875 
2876   ArrayTypeTraitExpr(SourceLocation loc, ArrayTypeTrait att,
2877                      TypeSourceInfo *queried, uint64_t value, Expr *dimension,
2878                      SourceLocation rparen, QualType ty)
2879       : Expr(ArrayTypeTraitExprClass, ty, VK_PRValue, OK_Ordinary), ATT(att),
2880         Value(value), Dimension(dimension), Loc(loc), RParen(rparen),
2881         QueriedType(queried) {
2882     assert(att <= ATT_Last && "invalid enum value!");
2883     assert(static_cast<unsigned>(att) == ATT && "ATT overflow!");
2884     setDependence(computeDependence(this));
2885   }
2886 
2887   explicit ArrayTypeTraitExpr(EmptyShell Empty)
2888       : Expr(ArrayTypeTraitExprClass, Empty), ATT(0) {}
2889 
2890   SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
2891   SourceLocation getEndLoc() const LLVM_READONLY { return RParen; }
2892 
2893   ArrayTypeTrait getTrait() const { return static_cast<ArrayTypeTrait>(ATT); }
2894 
2895   QualType getQueriedType() const { return QueriedType->getType(); }
2896 
2897   TypeSourceInfo *getQueriedTypeSourceInfo() const { return QueriedType; }
2898 
2899   uint64_t getValue() const { assert(!isTypeDependent()); return Value; }
2900 
2901   Expr *getDimensionExpression() const { return Dimension; }
2902 
2903   static bool classof(const Stmt *T) {
2904     return T->getStmtClass() == ArrayTypeTraitExprClass;
2905   }
2906 
2907   // Iterators
2908   child_range children() {
2909     return child_range(child_iterator(), child_iterator());
2910   }
2911 
2912   const_child_range children() const {
2913     return const_child_range(const_child_iterator(), const_child_iterator());
2914   }
2915 };
2916 
2917 /// An expression trait intrinsic.
2918 ///
2919 /// Example:
2920 /// \code
2921 ///   __is_lvalue_expr(std::cout) == true
2922 ///   __is_lvalue_expr(1) == false
2923 /// \endcode
2924 class ExpressionTraitExpr : public Expr {
2925   /// The trait. A ExpressionTrait enum in MSVC compatible unsigned.
2926   LLVM_PREFERRED_TYPE(ExpressionTrait)
2927   unsigned ET : 31;
2928 
2929   /// The value of the type trait. Unspecified if dependent.
2930   LLVM_PREFERRED_TYPE(bool)
2931   unsigned Value : 1;
2932 
2933   /// The location of the type trait keyword.
2934   SourceLocation Loc;
2935 
2936   /// The location of the closing paren.
2937   SourceLocation RParen;
2938 
2939   /// The expression being queried.
2940   Expr* QueriedExpression = nullptr;
2941 
2942 public:
2943   friend class ASTStmtReader;
2944 
2945   ExpressionTraitExpr(SourceLocation loc, ExpressionTrait et, Expr *queried,
2946                       bool value, SourceLocation rparen, QualType resultType)
2947       : Expr(ExpressionTraitExprClass, resultType, VK_PRValue, OK_Ordinary),
2948         ET(et), Value(value), Loc(loc), RParen(rparen),
2949         QueriedExpression(queried) {
2950     assert(et <= ET_Last && "invalid enum value!");
2951     assert(static_cast<unsigned>(et) == ET && "ET overflow!");
2952     setDependence(computeDependence(this));
2953   }
2954 
2955   explicit ExpressionTraitExpr(EmptyShell Empty)
2956       : Expr(ExpressionTraitExprClass, Empty), ET(0), Value(false) {}
2957 
2958   SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
2959   SourceLocation getEndLoc() const LLVM_READONLY { return RParen; }
2960 
2961   ExpressionTrait getTrait() const { return static_cast<ExpressionTrait>(ET); }
2962 
2963   Expr *getQueriedExpression() const { return QueriedExpression; }
2964 
2965   bool getValue() const { return Value; }
2966 
2967   static bool classof(const Stmt *T) {
2968     return T->getStmtClass() == ExpressionTraitExprClass;
2969   }
2970 
2971   // Iterators
2972   child_range children() {
2973     return child_range(child_iterator(), child_iterator());
2974   }
2975 
2976   const_child_range children() const {
2977     return const_child_range(const_child_iterator(), const_child_iterator());
2978   }
2979 };
2980 
2981 /// A reference to an overloaded function set, either an
2982 /// \c UnresolvedLookupExpr or an \c UnresolvedMemberExpr.
2983 class OverloadExpr : public Expr {
2984   friend class ASTStmtReader;
2985   friend class ASTStmtWriter;
2986 
2987   /// The common name of these declarations.
2988   DeclarationNameInfo NameInfo;
2989 
2990   /// The nested-name-specifier that qualifies the name, if any.
2991   NestedNameSpecifierLoc QualifierLoc;
2992 
2993 protected:
2994   OverloadExpr(StmtClass SC, const ASTContext &Context,
2995                NestedNameSpecifierLoc QualifierLoc,
2996                SourceLocation TemplateKWLoc,
2997                const DeclarationNameInfo &NameInfo,
2998                const TemplateArgumentListInfo *TemplateArgs,
2999                UnresolvedSetIterator Begin, UnresolvedSetIterator End,
3000                bool KnownDependent, bool KnownInstantiationDependent,
3001                bool KnownContainsUnexpandedParameterPack);
3002 
3003   OverloadExpr(StmtClass SC, EmptyShell Empty, unsigned NumResults,
3004                bool HasTemplateKWAndArgsInfo);
3005 
3006   /// Return the results. Defined after UnresolvedMemberExpr.
3007   inline DeclAccessPair *getTrailingResults();
3008   const DeclAccessPair *getTrailingResults() const {
3009     return const_cast<OverloadExpr *>(this)->getTrailingResults();
3010   }
3011 
3012   /// Return the optional template keyword and arguments info.
3013   /// Defined after UnresolvedMemberExpr.
3014   inline ASTTemplateKWAndArgsInfo *getTrailingASTTemplateKWAndArgsInfo();
3015   const ASTTemplateKWAndArgsInfo *getTrailingASTTemplateKWAndArgsInfo() const {
3016     return const_cast<OverloadExpr *>(this)
3017         ->getTrailingASTTemplateKWAndArgsInfo();
3018   }
3019 
3020   /// Return the optional template arguments. Defined after
3021   /// UnresolvedMemberExpr.
3022   inline TemplateArgumentLoc *getTrailingTemplateArgumentLoc();
3023   const TemplateArgumentLoc *getTrailingTemplateArgumentLoc() const {
3024     return const_cast<OverloadExpr *>(this)->getTrailingTemplateArgumentLoc();
3025   }
3026 
3027   bool hasTemplateKWAndArgsInfo() const {
3028     return OverloadExprBits.HasTemplateKWAndArgsInfo;
3029   }
3030 
3031 public:
3032   struct FindResult {
3033     OverloadExpr *Expression = nullptr;
3034     bool IsAddressOfOperand = false;
3035     bool IsAddressOfOperandWithParen = false;
3036     bool HasFormOfMemberPointer = false;
3037   };
3038 
3039   /// Finds the overloaded expression in the given expression \p E of
3040   /// OverloadTy.
3041   ///
3042   /// \return the expression (which must be there) and true if it has
3043   /// the particular form of a member pointer expression
3044   static FindResult find(Expr *E) {
3045     assert(E->getType()->isSpecificBuiltinType(BuiltinType::Overload));
3046 
3047     FindResult Result;
3048     bool HasParen = isa<ParenExpr>(E);
3049 
3050     E = E->IgnoreParens();
3051     if (isa<UnaryOperator>(E)) {
3052       assert(cast<UnaryOperator>(E)->getOpcode() == UO_AddrOf);
3053       E = cast<UnaryOperator>(E)->getSubExpr();
3054       auto *Ovl = cast<OverloadExpr>(E->IgnoreParens());
3055 
3056       Result.HasFormOfMemberPointer = (E == Ovl && Ovl->getQualifier());
3057       Result.IsAddressOfOperand = true;
3058       Result.IsAddressOfOperandWithParen = HasParen;
3059       Result.Expression = Ovl;
3060     } else {
3061       Result.Expression = cast<OverloadExpr>(E);
3062     }
3063 
3064     return Result;
3065   }
3066 
3067   /// Gets the naming class of this lookup, if any.
3068   /// Defined after UnresolvedMemberExpr.
3069   inline CXXRecordDecl *getNamingClass();
3070   const CXXRecordDecl *getNamingClass() const {
3071     return const_cast<OverloadExpr *>(this)->getNamingClass();
3072   }
3073 
3074   using decls_iterator = UnresolvedSetImpl::iterator;
3075 
3076   decls_iterator decls_begin() const {
3077     return UnresolvedSetIterator(getTrailingResults());
3078   }
3079   decls_iterator decls_end() const {
3080     return UnresolvedSetIterator(getTrailingResults() + getNumDecls());
3081   }
3082   llvm::iterator_range<decls_iterator> decls() const {
3083     return llvm::make_range(decls_begin(), decls_end());
3084   }
3085 
3086   /// Gets the number of declarations in the unresolved set.
3087   unsigned getNumDecls() const { return OverloadExprBits.NumResults; }
3088 
3089   /// Gets the full name info.
3090   const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
3091 
3092   /// Gets the name looked up.
3093   DeclarationName getName() const { return NameInfo.getName(); }
3094 
3095   /// Gets the location of the name.
3096   SourceLocation getNameLoc() const { return NameInfo.getLoc(); }
3097 
3098   /// Fetches the nested-name qualifier, if one was given.
3099   NestedNameSpecifier *getQualifier() const {
3100     return QualifierLoc.getNestedNameSpecifier();
3101   }
3102 
3103   /// Fetches the nested-name qualifier with source-location
3104   /// information, if one was given.
3105   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
3106 
3107   /// Retrieve the location of the template keyword preceding
3108   /// this name, if any.
3109   SourceLocation getTemplateKeywordLoc() const {
3110     if (!hasTemplateKWAndArgsInfo())
3111       return SourceLocation();
3112     return getTrailingASTTemplateKWAndArgsInfo()->TemplateKWLoc;
3113   }
3114 
3115   /// Retrieve the location of the left angle bracket starting the
3116   /// explicit template argument list following the name, if any.
3117   SourceLocation getLAngleLoc() const {
3118     if (!hasTemplateKWAndArgsInfo())
3119       return SourceLocation();
3120     return getTrailingASTTemplateKWAndArgsInfo()->LAngleLoc;
3121   }
3122 
3123   /// Retrieve the location of the right angle bracket ending the
3124   /// explicit template argument list following the name, if any.
3125   SourceLocation getRAngleLoc() const {
3126     if (!hasTemplateKWAndArgsInfo())
3127       return SourceLocation();
3128     return getTrailingASTTemplateKWAndArgsInfo()->RAngleLoc;
3129   }
3130 
3131   /// Determines whether the name was preceded by the template keyword.
3132   bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
3133 
3134   /// Determines whether this expression had explicit template arguments.
3135   bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
3136 
3137   TemplateArgumentLoc const *getTemplateArgs() const {
3138     if (!hasExplicitTemplateArgs())
3139       return nullptr;
3140     return const_cast<OverloadExpr *>(this)->getTrailingTemplateArgumentLoc();
3141   }
3142 
3143   unsigned getNumTemplateArgs() const {
3144     if (!hasExplicitTemplateArgs())
3145       return 0;
3146 
3147     return getTrailingASTTemplateKWAndArgsInfo()->NumTemplateArgs;
3148   }
3149 
3150   ArrayRef<TemplateArgumentLoc> template_arguments() const {
3151     return {getTemplateArgs(), getNumTemplateArgs()};
3152   }
3153 
3154   /// Copies the template arguments into the given structure.
3155   void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
3156     if (hasExplicitTemplateArgs())
3157       getTrailingASTTemplateKWAndArgsInfo()->copyInto(getTemplateArgs(), List);
3158   }
3159 
3160   static bool classof(const Stmt *T) {
3161     return T->getStmtClass() == UnresolvedLookupExprClass ||
3162            T->getStmtClass() == UnresolvedMemberExprClass;
3163   }
3164 };
3165 
3166 /// A reference to a name which we were able to look up during
3167 /// parsing but could not resolve to a specific declaration.
3168 ///
3169 /// This arises in several ways:
3170 ///   * we might be waiting for argument-dependent lookup;
3171 ///   * the name might resolve to an overloaded function;
3172 ///   * the name might resolve to a non-function template; for example, in the
3173 ///   following snippet, the return expression of the member function
3174 ///   'foo()' might remain unresolved until instantiation:
3175 ///
3176 /// \code
3177 /// struct P {
3178 ///   template <class T> using I = T;
3179 /// };
3180 ///
3181 /// struct Q {
3182 ///   template <class T> int foo() {
3183 ///     return T::template I<int>;
3184 ///   }
3185 /// };
3186 /// \endcode
3187 ///
3188 /// ...which is distinct from modeling function overloads, and therefore we use
3189 /// a different builtin type 'UnresolvedTemplate' to avoid confusion. This is
3190 /// done in Sema::BuildTemplateIdExpr.
3191 ///
3192 /// and eventually:
3193 ///   * the lookup might have included a function template.
3194 ///   * the unresolved template gets transformed in an instantiation or gets
3195 ///   diagnosed for its direct use.
3196 ///
3197 /// These never include UnresolvedUsingValueDecls, which are always class
3198 /// members and therefore appear only in UnresolvedMemberLookupExprs.
3199 class UnresolvedLookupExpr final
3200     : public OverloadExpr,
3201       private llvm::TrailingObjects<UnresolvedLookupExpr, DeclAccessPair,
3202                                     ASTTemplateKWAndArgsInfo,
3203                                     TemplateArgumentLoc> {
3204   friend class ASTStmtReader;
3205   friend class OverloadExpr;
3206   friend TrailingObjects;
3207 
3208   /// The naming class (C++ [class.access.base]p5) of the lookup, if
3209   /// any.  This can generally be recalculated from the context chain,
3210   /// but that can be fairly expensive for unqualified lookups.
3211   CXXRecordDecl *NamingClass;
3212 
3213   // UnresolvedLookupExpr is followed by several trailing objects.
3214   // They are in order:
3215   //
3216   // * An array of getNumResults() DeclAccessPair for the results. These are
3217   //   undesugared, which is to say, they may include UsingShadowDecls.
3218   //   Access is relative to the naming class.
3219   //
3220   // * An optional ASTTemplateKWAndArgsInfo for the explicitly specified
3221   //   template keyword and arguments. Present if and only if
3222   //   hasTemplateKWAndArgsInfo().
3223   //
3224   // * An array of getNumTemplateArgs() TemplateArgumentLoc containing
3225   //   location information for the explicitly specified template arguments.
3226 
3227   UnresolvedLookupExpr(const ASTContext &Context, CXXRecordDecl *NamingClass,
3228                        NestedNameSpecifierLoc QualifierLoc,
3229                        SourceLocation TemplateKWLoc,
3230                        const DeclarationNameInfo &NameInfo, bool RequiresADL,
3231                        const TemplateArgumentListInfo *TemplateArgs,
3232                        UnresolvedSetIterator Begin, UnresolvedSetIterator End,
3233                        bool KnownDependent, bool KnownInstantiationDependent);
3234 
3235   UnresolvedLookupExpr(EmptyShell Empty, unsigned NumResults,
3236                        bool HasTemplateKWAndArgsInfo);
3237 
3238   unsigned numTrailingObjects(OverloadToken<DeclAccessPair>) const {
3239     return getNumDecls();
3240   }
3241 
3242   unsigned numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
3243     return hasTemplateKWAndArgsInfo();
3244   }
3245 
3246 public:
3247   static UnresolvedLookupExpr *
3248   Create(const ASTContext &Context, CXXRecordDecl *NamingClass,
3249          NestedNameSpecifierLoc QualifierLoc,
3250          const DeclarationNameInfo &NameInfo, bool RequiresADL,
3251          UnresolvedSetIterator Begin, UnresolvedSetIterator End,
3252          bool KnownDependent, bool KnownInstantiationDependent);
3253 
3254   // After canonicalization, there may be dependent template arguments in
3255   // CanonicalConverted But none of Args is dependent. When any of
3256   // CanonicalConverted dependent, KnownDependent is true.
3257   static UnresolvedLookupExpr *
3258   Create(const ASTContext &Context, CXXRecordDecl *NamingClass,
3259          NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc,
3260          const DeclarationNameInfo &NameInfo, bool RequiresADL,
3261          const TemplateArgumentListInfo *Args, UnresolvedSetIterator Begin,
3262          UnresolvedSetIterator End, bool KnownDependent,
3263          bool KnownInstantiationDependent);
3264 
3265   static UnresolvedLookupExpr *CreateEmpty(const ASTContext &Context,
3266                                            unsigned NumResults,
3267                                            bool HasTemplateKWAndArgsInfo,
3268                                            unsigned NumTemplateArgs);
3269 
3270   /// True if this declaration should be extended by
3271   /// argument-dependent lookup.
3272   bool requiresADL() const { return UnresolvedLookupExprBits.RequiresADL; }
3273 
3274   /// Gets the 'naming class' (in the sense of C++0x
3275   /// [class.access.base]p5) of the lookup.  This is the scope
3276   /// that was looked in to find these results.
3277   CXXRecordDecl *getNamingClass() { return NamingClass; }
3278   const CXXRecordDecl *getNamingClass() const { return NamingClass; }
3279 
3280   SourceLocation getBeginLoc() const LLVM_READONLY {
3281     if (NestedNameSpecifierLoc l = getQualifierLoc())
3282       return l.getBeginLoc();
3283     return getNameInfo().getBeginLoc();
3284   }
3285 
3286   SourceLocation getEndLoc() const LLVM_READONLY {
3287     if (hasExplicitTemplateArgs())
3288       return getRAngleLoc();
3289     return getNameInfo().getEndLoc();
3290   }
3291 
3292   child_range children() {
3293     return child_range(child_iterator(), child_iterator());
3294   }
3295 
3296   const_child_range children() const {
3297     return const_child_range(const_child_iterator(), const_child_iterator());
3298   }
3299 
3300   static bool classof(const Stmt *T) {
3301     return T->getStmtClass() == UnresolvedLookupExprClass;
3302   }
3303 };
3304 
3305 /// A qualified reference to a name whose declaration cannot
3306 /// yet be resolved.
3307 ///
3308 /// DependentScopeDeclRefExpr is similar to DeclRefExpr in that
3309 /// it expresses a reference to a declaration such as
3310 /// X<T>::value. The difference, however, is that an
3311 /// DependentScopeDeclRefExpr node is used only within C++ templates when
3312 /// the qualification (e.g., X<T>::) refers to a dependent type. In
3313 /// this case, X<T>::value cannot resolve to a declaration because the
3314 /// declaration will differ from one instantiation of X<T> to the
3315 /// next. Therefore, DependentScopeDeclRefExpr keeps track of the
3316 /// qualifier (X<T>::) and the name of the entity being referenced
3317 /// ("value"). Such expressions will instantiate to a DeclRefExpr once the
3318 /// declaration can be found.
3319 class DependentScopeDeclRefExpr final
3320     : public Expr,
3321       private llvm::TrailingObjects<DependentScopeDeclRefExpr,
3322                                     ASTTemplateKWAndArgsInfo,
3323                                     TemplateArgumentLoc> {
3324   friend class ASTStmtReader;
3325   friend class ASTStmtWriter;
3326   friend TrailingObjects;
3327 
3328   /// The nested-name-specifier that qualifies this unresolved
3329   /// declaration name.
3330   NestedNameSpecifierLoc QualifierLoc;
3331 
3332   /// The name of the entity we will be referencing.
3333   DeclarationNameInfo NameInfo;
3334 
3335   DependentScopeDeclRefExpr(QualType Ty, NestedNameSpecifierLoc QualifierLoc,
3336                             SourceLocation TemplateKWLoc,
3337                             const DeclarationNameInfo &NameInfo,
3338                             const TemplateArgumentListInfo *Args);
3339 
3340   size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
3341     return hasTemplateKWAndArgsInfo();
3342   }
3343 
3344   bool hasTemplateKWAndArgsInfo() const {
3345     return DependentScopeDeclRefExprBits.HasTemplateKWAndArgsInfo;
3346   }
3347 
3348 public:
3349   static DependentScopeDeclRefExpr *
3350   Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc,
3351          SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo,
3352          const TemplateArgumentListInfo *TemplateArgs);
3353 
3354   static DependentScopeDeclRefExpr *CreateEmpty(const ASTContext &Context,
3355                                                 bool HasTemplateKWAndArgsInfo,
3356                                                 unsigned NumTemplateArgs);
3357 
3358   /// Retrieve the name that this expression refers to.
3359   const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
3360 
3361   /// Retrieve the name that this expression refers to.
3362   DeclarationName getDeclName() const { return NameInfo.getName(); }
3363 
3364   /// Retrieve the location of the name within the expression.
3365   ///
3366   /// For example, in "X<T>::value" this is the location of "value".
3367   SourceLocation getLocation() const { return NameInfo.getLoc(); }
3368 
3369   /// Retrieve the nested-name-specifier that qualifies the
3370   /// name, with source location information.
3371   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
3372 
3373   /// Retrieve the nested-name-specifier that qualifies this
3374   /// declaration.
3375   NestedNameSpecifier *getQualifier() const {
3376     return QualifierLoc.getNestedNameSpecifier();
3377   }
3378 
3379   /// Retrieve the location of the template keyword preceding
3380   /// this name, if any.
3381   SourceLocation getTemplateKeywordLoc() const {
3382     if (!hasTemplateKWAndArgsInfo())
3383       return SourceLocation();
3384     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc;
3385   }
3386 
3387   /// Retrieve the location of the left angle bracket starting the
3388   /// explicit template argument list following the name, if any.
3389   SourceLocation getLAngleLoc() const {
3390     if (!hasTemplateKWAndArgsInfo())
3391       return SourceLocation();
3392     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc;
3393   }
3394 
3395   /// Retrieve the location of the right angle bracket ending the
3396   /// explicit template argument list following the name, if any.
3397   SourceLocation getRAngleLoc() const {
3398     if (!hasTemplateKWAndArgsInfo())
3399       return SourceLocation();
3400     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc;
3401   }
3402 
3403   /// Determines whether the name was preceded by the template keyword.
3404   bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
3405 
3406   /// Determines whether this lookup had explicit template arguments.
3407   bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
3408 
3409   /// Copies the template arguments (if present) into the given
3410   /// structure.
3411   void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
3412     if (hasExplicitTemplateArgs())
3413       getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto(
3414           getTrailingObjects<TemplateArgumentLoc>(), List);
3415   }
3416 
3417   TemplateArgumentLoc const *getTemplateArgs() const {
3418     if (!hasExplicitTemplateArgs())
3419       return nullptr;
3420 
3421     return getTrailingObjects<TemplateArgumentLoc>();
3422   }
3423 
3424   unsigned getNumTemplateArgs() const {
3425     if (!hasExplicitTemplateArgs())
3426       return 0;
3427 
3428     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
3429   }
3430 
3431   ArrayRef<TemplateArgumentLoc> template_arguments() const {
3432     return {getTemplateArgs(), getNumTemplateArgs()};
3433   }
3434 
3435   /// Note: getBeginLoc() is the start of the whole DependentScopeDeclRefExpr,
3436   /// and differs from getLocation().getStart().
3437   SourceLocation getBeginLoc() const LLVM_READONLY {
3438     return QualifierLoc.getBeginLoc();
3439   }
3440 
3441   SourceLocation getEndLoc() const LLVM_READONLY {
3442     if (hasExplicitTemplateArgs())
3443       return getRAngleLoc();
3444     return getLocation();
3445   }
3446 
3447   static bool classof(const Stmt *T) {
3448     return T->getStmtClass() == DependentScopeDeclRefExprClass;
3449   }
3450 
3451   child_range children() {
3452     return child_range(child_iterator(), child_iterator());
3453   }
3454 
3455   const_child_range children() const {
3456     return const_child_range(const_child_iterator(), const_child_iterator());
3457   }
3458 };
3459 
3460 /// Represents an expression -- generally a full-expression -- that
3461 /// introduces cleanups to be run at the end of the sub-expression's
3462 /// evaluation.  The most common source of expression-introduced
3463 /// cleanups is temporary objects in C++, but several other kinds of
3464 /// expressions can create cleanups, including basically every
3465 /// call in ARC that returns an Objective-C pointer.
3466 ///
3467 /// This expression also tracks whether the sub-expression contains a
3468 /// potentially-evaluated block literal.  The lifetime of a block
3469 /// literal is the extent of the enclosing scope.
3470 class ExprWithCleanups final
3471     : public FullExpr,
3472       private llvm::TrailingObjects<
3473           ExprWithCleanups,
3474           llvm::PointerUnion<BlockDecl *, CompoundLiteralExpr *>> {
3475 public:
3476   /// The type of objects that are kept in the cleanup.
3477   /// It's useful to remember the set of blocks and block-scoped compound
3478   /// literals; we could also remember the set of temporaries, but there's
3479   /// currently no need.
3480   using CleanupObject = llvm::PointerUnion<BlockDecl *, CompoundLiteralExpr *>;
3481 
3482 private:
3483   friend class ASTStmtReader;
3484   friend TrailingObjects;
3485 
3486   ExprWithCleanups(EmptyShell, unsigned NumObjects);
3487   ExprWithCleanups(Expr *SubExpr, bool CleanupsHaveSideEffects,
3488                    ArrayRef<CleanupObject> Objects);
3489 
3490 public:
3491   static ExprWithCleanups *Create(const ASTContext &C, EmptyShell empty,
3492                                   unsigned numObjects);
3493 
3494   static ExprWithCleanups *Create(const ASTContext &C, Expr *subexpr,
3495                                   bool CleanupsHaveSideEffects,
3496                                   ArrayRef<CleanupObject> objects);
3497 
3498   ArrayRef<CleanupObject> getObjects() const {
3499     return llvm::ArrayRef(getTrailingObjects<CleanupObject>(), getNumObjects());
3500   }
3501 
3502   unsigned getNumObjects() const { return ExprWithCleanupsBits.NumObjects; }
3503 
3504   CleanupObject getObject(unsigned i) const {
3505     assert(i < getNumObjects() && "Index out of range");
3506     return getObjects()[i];
3507   }
3508 
3509   bool cleanupsHaveSideEffects() const {
3510     return ExprWithCleanupsBits.CleanupsHaveSideEffects;
3511   }
3512 
3513   SourceLocation getBeginLoc() const LLVM_READONLY {
3514     return SubExpr->getBeginLoc();
3515   }
3516 
3517   SourceLocation getEndLoc() const LLVM_READONLY {
3518     return SubExpr->getEndLoc();
3519   }
3520 
3521   // Implement isa/cast/dyncast/etc.
3522   static bool classof(const Stmt *T) {
3523     return T->getStmtClass() == ExprWithCleanupsClass;
3524   }
3525 
3526   // Iterators
3527   child_range children() { return child_range(&SubExpr, &SubExpr + 1); }
3528 
3529   const_child_range children() const {
3530     return const_child_range(&SubExpr, &SubExpr + 1);
3531   }
3532 };
3533 
3534 /// Describes an explicit type conversion that uses functional
3535 /// notion but could not be resolved because one or more arguments are
3536 /// type-dependent.
3537 ///
3538 /// The explicit type conversions expressed by
3539 /// CXXUnresolvedConstructExpr have the form <tt>T(a1, a2, ..., aN)</tt>,
3540 /// where \c T is some type and \c a1, \c a2, ..., \c aN are values, and
3541 /// either \c T is a dependent type or one or more of the <tt>a</tt>'s is
3542 /// type-dependent. For example, this would occur in a template such
3543 /// as:
3544 ///
3545 /// \code
3546 ///   template<typename T, typename A1>
3547 ///   inline T make_a(const A1& a1) {
3548 ///     return T(a1);
3549 ///   }
3550 /// \endcode
3551 ///
3552 /// When the returned expression is instantiated, it may resolve to a
3553 /// constructor call, conversion function call, or some kind of type
3554 /// conversion.
3555 class CXXUnresolvedConstructExpr final
3556     : public Expr,
3557       private llvm::TrailingObjects<CXXUnresolvedConstructExpr, Expr *> {
3558   friend class ASTStmtReader;
3559   friend TrailingObjects;
3560 
3561   /// The type being constructed, and whether the construct expression models
3562   /// list initialization or not.
3563   llvm::PointerIntPair<TypeSourceInfo *, 1> TypeAndInitForm;
3564 
3565   /// The location of the left parentheses ('(').
3566   SourceLocation LParenLoc;
3567 
3568   /// The location of the right parentheses (')').
3569   SourceLocation RParenLoc;
3570 
3571   CXXUnresolvedConstructExpr(QualType T, TypeSourceInfo *TSI,
3572                              SourceLocation LParenLoc, ArrayRef<Expr *> Args,
3573                              SourceLocation RParenLoc, bool IsListInit);
3574 
3575   CXXUnresolvedConstructExpr(EmptyShell Empty, unsigned NumArgs)
3576       : Expr(CXXUnresolvedConstructExprClass, Empty) {
3577     CXXUnresolvedConstructExprBits.NumArgs = NumArgs;
3578   }
3579 
3580 public:
3581   static CXXUnresolvedConstructExpr *
3582   Create(const ASTContext &Context, QualType T, TypeSourceInfo *TSI,
3583          SourceLocation LParenLoc, ArrayRef<Expr *> Args,
3584          SourceLocation RParenLoc, bool IsListInit);
3585 
3586   static CXXUnresolvedConstructExpr *CreateEmpty(const ASTContext &Context,
3587                                                  unsigned NumArgs);
3588 
3589   /// Retrieve the type that is being constructed, as specified
3590   /// in the source code.
3591   QualType getTypeAsWritten() const { return getTypeSourceInfo()->getType(); }
3592 
3593   /// Retrieve the type source information for the type being
3594   /// constructed.
3595   TypeSourceInfo *getTypeSourceInfo() const {
3596     return TypeAndInitForm.getPointer();
3597   }
3598 
3599   /// Retrieve the location of the left parentheses ('(') that
3600   /// precedes the argument list.
3601   SourceLocation getLParenLoc() const { return LParenLoc; }
3602   void setLParenLoc(SourceLocation L) { LParenLoc = L; }
3603 
3604   /// Retrieve the location of the right parentheses (')') that
3605   /// follows the argument list.
3606   SourceLocation getRParenLoc() const { return RParenLoc; }
3607   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
3608 
3609   /// Determine whether this expression models list-initialization.
3610   /// If so, there will be exactly one subexpression, which will be
3611   /// an InitListExpr.
3612   bool isListInitialization() const { return TypeAndInitForm.getInt(); }
3613 
3614   /// Retrieve the number of arguments.
3615   unsigned getNumArgs() const { return CXXUnresolvedConstructExprBits.NumArgs; }
3616 
3617   using arg_iterator = Expr **;
3618   using arg_range = llvm::iterator_range<arg_iterator>;
3619 
3620   arg_iterator arg_begin() { return getTrailingObjects<Expr *>(); }
3621   arg_iterator arg_end() { return arg_begin() + getNumArgs(); }
3622   arg_range arguments() { return arg_range(arg_begin(), arg_end()); }
3623 
3624   using const_arg_iterator = const Expr* const *;
3625   using const_arg_range = llvm::iterator_range<const_arg_iterator>;
3626 
3627   const_arg_iterator arg_begin() const { return getTrailingObjects<Expr *>(); }
3628   const_arg_iterator arg_end() const { return arg_begin() + getNumArgs(); }
3629   const_arg_range arguments() const {
3630     return const_arg_range(arg_begin(), arg_end());
3631   }
3632 
3633   Expr *getArg(unsigned I) {
3634     assert(I < getNumArgs() && "Argument index out-of-range");
3635     return arg_begin()[I];
3636   }
3637 
3638   const Expr *getArg(unsigned I) const {
3639     assert(I < getNumArgs() && "Argument index out-of-range");
3640     return arg_begin()[I];
3641   }
3642 
3643   void setArg(unsigned I, Expr *E) {
3644     assert(I < getNumArgs() && "Argument index out-of-range");
3645     arg_begin()[I] = E;
3646   }
3647 
3648   SourceLocation getBeginLoc() const LLVM_READONLY;
3649   SourceLocation getEndLoc() const LLVM_READONLY {
3650     if (!RParenLoc.isValid() && getNumArgs() > 0)
3651       return getArg(getNumArgs() - 1)->getEndLoc();
3652     return RParenLoc;
3653   }
3654 
3655   static bool classof(const Stmt *T) {
3656     return T->getStmtClass() == CXXUnresolvedConstructExprClass;
3657   }
3658 
3659   // Iterators
3660   child_range children() {
3661     auto **begin = reinterpret_cast<Stmt **>(arg_begin());
3662     return child_range(begin, begin + getNumArgs());
3663   }
3664 
3665   const_child_range children() const {
3666     auto **begin = reinterpret_cast<Stmt **>(
3667         const_cast<CXXUnresolvedConstructExpr *>(this)->arg_begin());
3668     return const_child_range(begin, begin + getNumArgs());
3669   }
3670 };
3671 
3672 /// Represents a C++ member access expression where the actual
3673 /// member referenced could not be resolved because the base
3674 /// expression or the member name was dependent.
3675 ///
3676 /// Like UnresolvedMemberExprs, these can be either implicit or
3677 /// explicit accesses.  It is only possible to get one of these with
3678 /// an implicit access if a qualifier is provided.
3679 class CXXDependentScopeMemberExpr final
3680     : public Expr,
3681       private llvm::TrailingObjects<CXXDependentScopeMemberExpr,
3682                                     ASTTemplateKWAndArgsInfo,
3683                                     TemplateArgumentLoc, NamedDecl *> {
3684   friend class ASTStmtReader;
3685   friend class ASTStmtWriter;
3686   friend TrailingObjects;
3687 
3688   /// The expression for the base pointer or class reference,
3689   /// e.g., the \c x in x.f.  Can be null in implicit accesses.
3690   Stmt *Base;
3691 
3692   /// The type of the base expression.  Never null, even for
3693   /// implicit accesses.
3694   QualType BaseType;
3695 
3696   /// The nested-name-specifier that precedes the member name, if any.
3697   /// FIXME: This could be in principle store as a trailing object.
3698   /// However the performance impact of doing so should be investigated first.
3699   NestedNameSpecifierLoc QualifierLoc;
3700 
3701   /// The member to which this member expression refers, which
3702   /// can be name, overloaded operator, or destructor.
3703   ///
3704   /// FIXME: could also be a template-id
3705   DeclarationNameInfo MemberNameInfo;
3706 
3707   // CXXDependentScopeMemberExpr is followed by several trailing objects,
3708   // some of which optional. They are in order:
3709   //
3710   // * An optional ASTTemplateKWAndArgsInfo for the explicitly specified
3711   //   template keyword and arguments. Present if and only if
3712   //   hasTemplateKWAndArgsInfo().
3713   //
3714   // * An array of getNumTemplateArgs() TemplateArgumentLoc containing location
3715   //   information for the explicitly specified template arguments.
3716   //
3717   // * An optional NamedDecl *. In a qualified member access expression such
3718   //   as t->Base::f, this member stores the resolves of name lookup in the
3719   //   context of the member access expression, to be used at instantiation
3720   //   time. Present if and only if hasFirstQualifierFoundInScope().
3721 
3722   bool hasTemplateKWAndArgsInfo() const {
3723     return CXXDependentScopeMemberExprBits.HasTemplateKWAndArgsInfo;
3724   }
3725 
3726   bool hasFirstQualifierFoundInScope() const {
3727     return CXXDependentScopeMemberExprBits.HasFirstQualifierFoundInScope;
3728   }
3729 
3730   unsigned numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
3731     return hasTemplateKWAndArgsInfo();
3732   }
3733 
3734   unsigned numTrailingObjects(OverloadToken<TemplateArgumentLoc>) const {
3735     return getNumTemplateArgs();
3736   }
3737 
3738   unsigned numTrailingObjects(OverloadToken<NamedDecl *>) const {
3739     return hasFirstQualifierFoundInScope();
3740   }
3741 
3742   CXXDependentScopeMemberExpr(const ASTContext &Ctx, Expr *Base,
3743                               QualType BaseType, bool IsArrow,
3744                               SourceLocation OperatorLoc,
3745                               NestedNameSpecifierLoc QualifierLoc,
3746                               SourceLocation TemplateKWLoc,
3747                               NamedDecl *FirstQualifierFoundInScope,
3748                               DeclarationNameInfo MemberNameInfo,
3749                               const TemplateArgumentListInfo *TemplateArgs);
3750 
3751   CXXDependentScopeMemberExpr(EmptyShell Empty, bool HasTemplateKWAndArgsInfo,
3752                               bool HasFirstQualifierFoundInScope);
3753 
3754 public:
3755   static CXXDependentScopeMemberExpr *
3756   Create(const ASTContext &Ctx, Expr *Base, QualType BaseType, bool IsArrow,
3757          SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc,
3758          SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope,
3759          DeclarationNameInfo MemberNameInfo,
3760          const TemplateArgumentListInfo *TemplateArgs);
3761 
3762   static CXXDependentScopeMemberExpr *
3763   CreateEmpty(const ASTContext &Ctx, bool HasTemplateKWAndArgsInfo,
3764               unsigned NumTemplateArgs, bool HasFirstQualifierFoundInScope);
3765 
3766   /// True if this is an implicit access, i.e. one in which the
3767   /// member being accessed was not written in the source.  The source
3768   /// location of the operator is invalid in this case.
3769   bool isImplicitAccess() const {
3770     if (!Base)
3771       return true;
3772     return cast<Expr>(Base)->isImplicitCXXThis();
3773   }
3774 
3775   /// Retrieve the base object of this member expressions,
3776   /// e.g., the \c x in \c x.m.
3777   Expr *getBase() const {
3778     assert(!isImplicitAccess());
3779     return cast<Expr>(Base);
3780   }
3781 
3782   QualType getBaseType() const { return BaseType; }
3783 
3784   /// Determine whether this member expression used the '->'
3785   /// operator; otherwise, it used the '.' operator.
3786   bool isArrow() const { return CXXDependentScopeMemberExprBits.IsArrow; }
3787 
3788   /// Retrieve the location of the '->' or '.' operator.
3789   SourceLocation getOperatorLoc() const {
3790     return CXXDependentScopeMemberExprBits.OperatorLoc;
3791   }
3792 
3793   /// Retrieve the nested-name-specifier that qualifies the member name.
3794   NestedNameSpecifier *getQualifier() const {
3795     return QualifierLoc.getNestedNameSpecifier();
3796   }
3797 
3798   /// Retrieve the nested-name-specifier that qualifies the member
3799   /// name, with source location information.
3800   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
3801 
3802   /// Retrieve the first part of the nested-name-specifier that was
3803   /// found in the scope of the member access expression when the member access
3804   /// was initially parsed.
3805   ///
3806   /// This function only returns a useful result when member access expression
3807   /// uses a qualified member name, e.g., "x.Base::f". Here, the declaration
3808   /// returned by this function describes what was found by unqualified name
3809   /// lookup for the identifier "Base" within the scope of the member access
3810   /// expression itself. At template instantiation time, this information is
3811   /// combined with the results of name lookup into the type of the object
3812   /// expression itself (the class type of x).
3813   NamedDecl *getFirstQualifierFoundInScope() const {
3814     if (!hasFirstQualifierFoundInScope())
3815       return nullptr;
3816     return *getTrailingObjects<NamedDecl *>();
3817   }
3818 
3819   /// Retrieve the name of the member that this expression refers to.
3820   const DeclarationNameInfo &getMemberNameInfo() const {
3821     return MemberNameInfo;
3822   }
3823 
3824   /// Retrieve the name of the member that this expression refers to.
3825   DeclarationName getMember() const { return MemberNameInfo.getName(); }
3826 
3827   // Retrieve the location of the name of the member that this
3828   // expression refers to.
3829   SourceLocation getMemberLoc() const { return MemberNameInfo.getLoc(); }
3830 
3831   /// Retrieve the location of the template keyword preceding the
3832   /// member name, if any.
3833   SourceLocation getTemplateKeywordLoc() const {
3834     if (!hasTemplateKWAndArgsInfo())
3835       return SourceLocation();
3836     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc;
3837   }
3838 
3839   /// Retrieve the location of the left angle bracket starting the
3840   /// explicit template argument list following the member name, if any.
3841   SourceLocation getLAngleLoc() const {
3842     if (!hasTemplateKWAndArgsInfo())
3843       return SourceLocation();
3844     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc;
3845   }
3846 
3847   /// Retrieve the location of the right angle bracket ending the
3848   /// explicit template argument list following the member name, if any.
3849   SourceLocation getRAngleLoc() const {
3850     if (!hasTemplateKWAndArgsInfo())
3851       return SourceLocation();
3852     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc;
3853   }
3854 
3855   /// Determines whether the member name was preceded by the template keyword.
3856   bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
3857 
3858   /// Determines whether this member expression actually had a C++
3859   /// template argument list explicitly specified, e.g., x.f<int>.
3860   bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
3861 
3862   /// Copies the template arguments (if present) into the given
3863   /// structure.
3864   void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
3865     if (hasExplicitTemplateArgs())
3866       getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto(
3867           getTrailingObjects<TemplateArgumentLoc>(), List);
3868   }
3869 
3870   /// Retrieve the template arguments provided as part of this
3871   /// template-id.
3872   const TemplateArgumentLoc *getTemplateArgs() const {
3873     if (!hasExplicitTemplateArgs())
3874       return nullptr;
3875 
3876     return getTrailingObjects<TemplateArgumentLoc>();
3877   }
3878 
3879   /// Retrieve the number of template arguments provided as part of this
3880   /// template-id.
3881   unsigned getNumTemplateArgs() const {
3882     if (!hasExplicitTemplateArgs())
3883       return 0;
3884 
3885     return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
3886   }
3887 
3888   ArrayRef<TemplateArgumentLoc> template_arguments() const {
3889     return {getTemplateArgs(), getNumTemplateArgs()};
3890   }
3891 
3892   SourceLocation getBeginLoc() const LLVM_READONLY {
3893     if (!isImplicitAccess())
3894       return Base->getBeginLoc();
3895     if (getQualifier())
3896       return getQualifierLoc().getBeginLoc();
3897     return MemberNameInfo.getBeginLoc();
3898   }
3899 
3900   SourceLocation getEndLoc() const LLVM_READONLY {
3901     if (hasExplicitTemplateArgs())
3902       return getRAngleLoc();
3903     return MemberNameInfo.getEndLoc();
3904   }
3905 
3906   static bool classof(const Stmt *T) {
3907     return T->getStmtClass() == CXXDependentScopeMemberExprClass;
3908   }
3909 
3910   // Iterators
3911   child_range children() {
3912     if (isImplicitAccess())
3913       return child_range(child_iterator(), child_iterator());
3914     return child_range(&Base, &Base + 1);
3915   }
3916 
3917   const_child_range children() const {
3918     if (isImplicitAccess())
3919       return const_child_range(const_child_iterator(), const_child_iterator());
3920     return const_child_range(&Base, &Base + 1);
3921   }
3922 };
3923 
3924 /// Represents a C++ member access expression for which lookup
3925 /// produced a set of overloaded functions.
3926 ///
3927 /// The member access may be explicit or implicit:
3928 /// \code
3929 ///    struct A {
3930 ///      int a, b;
3931 ///      int explicitAccess() { return this->a + this->A::b; }
3932 ///      int implicitAccess() { return a + A::b; }
3933 ///    };
3934 /// \endcode
3935 ///
3936 /// In the final AST, an explicit access always becomes a MemberExpr.
3937 /// An implicit access may become either a MemberExpr or a
3938 /// DeclRefExpr, depending on whether the member is static.
3939 class UnresolvedMemberExpr final
3940     : public OverloadExpr,
3941       private llvm::TrailingObjects<UnresolvedMemberExpr, DeclAccessPair,
3942                                     ASTTemplateKWAndArgsInfo,
3943                                     TemplateArgumentLoc> {
3944   friend class ASTStmtReader;
3945   friend class OverloadExpr;
3946   friend TrailingObjects;
3947 
3948   /// The expression for the base pointer or class reference,
3949   /// e.g., the \c x in x.f.
3950   ///
3951   /// This can be null if this is an 'unbased' member expression.
3952   Stmt *Base;
3953 
3954   /// The type of the base expression; never null.
3955   QualType BaseType;
3956 
3957   /// The location of the '->' or '.' operator.
3958   SourceLocation OperatorLoc;
3959 
3960   // UnresolvedMemberExpr is followed by several trailing objects.
3961   // They are in order:
3962   //
3963   // * An array of getNumResults() DeclAccessPair for the results. These are
3964   //   undesugared, which is to say, they may include UsingShadowDecls.
3965   //   Access is relative to the naming class.
3966   //
3967   // * An optional ASTTemplateKWAndArgsInfo for the explicitly specified
3968   //   template keyword and arguments. Present if and only if
3969   //   hasTemplateKWAndArgsInfo().
3970   //
3971   // * An array of getNumTemplateArgs() TemplateArgumentLoc containing
3972   //   location information for the explicitly specified template arguments.
3973 
3974   UnresolvedMemberExpr(const ASTContext &Context, bool HasUnresolvedUsing,
3975                        Expr *Base, QualType BaseType, bool IsArrow,
3976                        SourceLocation OperatorLoc,
3977                        NestedNameSpecifierLoc QualifierLoc,
3978                        SourceLocation TemplateKWLoc,
3979                        const DeclarationNameInfo &MemberNameInfo,
3980                        const TemplateArgumentListInfo *TemplateArgs,
3981                        UnresolvedSetIterator Begin, UnresolvedSetIterator End);
3982 
3983   UnresolvedMemberExpr(EmptyShell Empty, unsigned NumResults,
3984                        bool HasTemplateKWAndArgsInfo);
3985 
3986   unsigned numTrailingObjects(OverloadToken<DeclAccessPair>) const {
3987     return getNumDecls();
3988   }
3989 
3990   unsigned numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
3991     return hasTemplateKWAndArgsInfo();
3992   }
3993 
3994 public:
3995   static UnresolvedMemberExpr *
3996   Create(const ASTContext &Context, bool HasUnresolvedUsing, Expr *Base,
3997          QualType BaseType, bool IsArrow, SourceLocation OperatorLoc,
3998          NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc,
3999          const DeclarationNameInfo &MemberNameInfo,
4000          const TemplateArgumentListInfo *TemplateArgs,
4001          UnresolvedSetIterator Begin, UnresolvedSetIterator End);
4002 
4003   static UnresolvedMemberExpr *CreateEmpty(const ASTContext &Context,
4004                                            unsigned NumResults,
4005                                            bool HasTemplateKWAndArgsInfo,
4006                                            unsigned NumTemplateArgs);
4007 
4008   /// True if this is an implicit access, i.e., one in which the
4009   /// member being accessed was not written in the source.
4010   ///
4011   /// The source location of the operator is invalid in this case.
4012   bool isImplicitAccess() const;
4013 
4014   /// Retrieve the base object of this member expressions,
4015   /// e.g., the \c x in \c x.m.
4016   Expr *getBase() {
4017     assert(!isImplicitAccess());
4018     return cast<Expr>(Base);
4019   }
4020   const Expr *getBase() const {
4021     assert(!isImplicitAccess());
4022     return cast<Expr>(Base);
4023   }
4024 
4025   QualType getBaseType() const { return BaseType; }
4026 
4027   /// Determine whether the lookup results contain an unresolved using
4028   /// declaration.
4029   bool hasUnresolvedUsing() const {
4030     return UnresolvedMemberExprBits.HasUnresolvedUsing;
4031   }
4032 
4033   /// Determine whether this member expression used the '->'
4034   /// operator; otherwise, it used the '.' operator.
4035   bool isArrow() const { return UnresolvedMemberExprBits.IsArrow; }
4036 
4037   /// Retrieve the location of the '->' or '.' operator.
4038   SourceLocation getOperatorLoc() const { return OperatorLoc; }
4039 
4040   /// Retrieve the naming class of this lookup.
4041   CXXRecordDecl *getNamingClass();
4042   const CXXRecordDecl *getNamingClass() const {
4043     return const_cast<UnresolvedMemberExpr *>(this)->getNamingClass();
4044   }
4045 
4046   /// Retrieve the full name info for the member that this expression
4047   /// refers to.
4048   const DeclarationNameInfo &getMemberNameInfo() const { return getNameInfo(); }
4049 
4050   /// Retrieve the name of the member that this expression refers to.
4051   DeclarationName getMemberName() const { return getName(); }
4052 
4053   /// Retrieve the location of the name of the member that this
4054   /// expression refers to.
4055   SourceLocation getMemberLoc() const { return getNameLoc(); }
4056 
4057   /// Return the preferred location (the member name) for the arrow when
4058   /// diagnosing a problem with this expression.
4059   SourceLocation getExprLoc() const LLVM_READONLY { return getMemberLoc(); }
4060 
4061   SourceLocation getBeginLoc() const LLVM_READONLY {
4062     if (!isImplicitAccess())
4063       return Base->getBeginLoc();
4064     if (NestedNameSpecifierLoc l = getQualifierLoc())
4065       return l.getBeginLoc();
4066     return getMemberNameInfo().getBeginLoc();
4067   }
4068 
4069   SourceLocation getEndLoc() const LLVM_READONLY {
4070     if (hasExplicitTemplateArgs())
4071       return getRAngleLoc();
4072     return getMemberNameInfo().getEndLoc();
4073   }
4074 
4075   static bool classof(const Stmt *T) {
4076     return T->getStmtClass() == UnresolvedMemberExprClass;
4077   }
4078 
4079   // Iterators
4080   child_range children() {
4081     if (isImplicitAccess())
4082       return child_range(child_iterator(), child_iterator());
4083     return child_range(&Base, &Base + 1);
4084   }
4085 
4086   const_child_range children() const {
4087     if (isImplicitAccess())
4088       return const_child_range(const_child_iterator(), const_child_iterator());
4089     return const_child_range(&Base, &Base + 1);
4090   }
4091 };
4092 
4093 DeclAccessPair *OverloadExpr::getTrailingResults() {
4094   if (auto *ULE = dyn_cast<UnresolvedLookupExpr>(this))
4095     return ULE->getTrailingObjects<DeclAccessPair>();
4096   return cast<UnresolvedMemberExpr>(this)->getTrailingObjects<DeclAccessPair>();
4097 }
4098 
4099 ASTTemplateKWAndArgsInfo *OverloadExpr::getTrailingASTTemplateKWAndArgsInfo() {
4100   if (!hasTemplateKWAndArgsInfo())
4101     return nullptr;
4102 
4103   if (auto *ULE = dyn_cast<UnresolvedLookupExpr>(this))
4104     return ULE->getTrailingObjects<ASTTemplateKWAndArgsInfo>();
4105   return cast<UnresolvedMemberExpr>(this)
4106       ->getTrailingObjects<ASTTemplateKWAndArgsInfo>();
4107 }
4108 
4109 TemplateArgumentLoc *OverloadExpr::getTrailingTemplateArgumentLoc() {
4110   if (auto *ULE = dyn_cast<UnresolvedLookupExpr>(this))
4111     return ULE->getTrailingObjects<TemplateArgumentLoc>();
4112   return cast<UnresolvedMemberExpr>(this)
4113       ->getTrailingObjects<TemplateArgumentLoc>();
4114 }
4115 
4116 CXXRecordDecl *OverloadExpr::getNamingClass() {
4117   if (auto *ULE = dyn_cast<UnresolvedLookupExpr>(this))
4118     return ULE->getNamingClass();
4119   return cast<UnresolvedMemberExpr>(this)->getNamingClass();
4120 }
4121 
4122 /// Represents a C++11 noexcept expression (C++ [expr.unary.noexcept]).
4123 ///
4124 /// The noexcept expression tests whether a given expression might throw. Its
4125 /// result is a boolean constant.
4126 class CXXNoexceptExpr : public Expr {
4127   friend class ASTStmtReader;
4128 
4129   Stmt *Operand;
4130   SourceRange Range;
4131 
4132 public:
4133   CXXNoexceptExpr(QualType Ty, Expr *Operand, CanThrowResult Val,
4134                   SourceLocation Keyword, SourceLocation RParen)
4135       : Expr(CXXNoexceptExprClass, Ty, VK_PRValue, OK_Ordinary),
4136         Operand(Operand), Range(Keyword, RParen) {
4137     CXXNoexceptExprBits.Value = Val == CT_Cannot;
4138     setDependence(computeDependence(this, Val));
4139   }
4140 
4141   CXXNoexceptExpr(EmptyShell Empty) : Expr(CXXNoexceptExprClass, Empty) {}
4142 
4143   Expr *getOperand() const { return static_cast<Expr *>(Operand); }
4144 
4145   SourceLocation getBeginLoc() const { return Range.getBegin(); }
4146   SourceLocation getEndLoc() const { return Range.getEnd(); }
4147   SourceRange getSourceRange() const { return Range; }
4148 
4149   bool getValue() const { return CXXNoexceptExprBits.Value; }
4150 
4151   static bool classof(const Stmt *T) {
4152     return T->getStmtClass() == CXXNoexceptExprClass;
4153   }
4154 
4155   // Iterators
4156   child_range children() { return child_range(&Operand, &Operand + 1); }
4157 
4158   const_child_range children() const {
4159     return const_child_range(&Operand, &Operand + 1);
4160   }
4161 };
4162 
4163 /// Represents a C++11 pack expansion that produces a sequence of
4164 /// expressions.
4165 ///
4166 /// A pack expansion expression contains a pattern (which itself is an
4167 /// expression) followed by an ellipsis. For example:
4168 ///
4169 /// \code
4170 /// template<typename F, typename ...Types>
4171 /// void forward(F f, Types &&...args) {
4172 ///   f(static_cast<Types&&>(args)...);
4173 /// }
4174 /// \endcode
4175 ///
4176 /// Here, the argument to the function object \c f is a pack expansion whose
4177 /// pattern is \c static_cast<Types&&>(args). When the \c forward function
4178 /// template is instantiated, the pack expansion will instantiate to zero or
4179 /// or more function arguments to the function object \c f.
4180 class PackExpansionExpr : public Expr {
4181   friend class ASTStmtReader;
4182   friend class ASTStmtWriter;
4183 
4184   SourceLocation EllipsisLoc;
4185 
4186   /// The number of expansions that will be produced by this pack
4187   /// expansion expression, if known.
4188   ///
4189   /// When zero, the number of expansions is not known. Otherwise, this value
4190   /// is the number of expansions + 1.
4191   unsigned NumExpansions;
4192 
4193   Stmt *Pattern;
4194 
4195 public:
4196   PackExpansionExpr(QualType T, Expr *Pattern, SourceLocation EllipsisLoc,
4197                     std::optional<unsigned> NumExpansions)
4198       : Expr(PackExpansionExprClass, T, Pattern->getValueKind(),
4199              Pattern->getObjectKind()),
4200         EllipsisLoc(EllipsisLoc),
4201         NumExpansions(NumExpansions ? *NumExpansions + 1 : 0),
4202         Pattern(Pattern) {
4203     setDependence(computeDependence(this));
4204   }
4205 
4206   PackExpansionExpr(EmptyShell Empty) : Expr(PackExpansionExprClass, Empty) {}
4207 
4208   /// Retrieve the pattern of the pack expansion.
4209   Expr *getPattern() { return reinterpret_cast<Expr *>(Pattern); }
4210 
4211   /// Retrieve the pattern of the pack expansion.
4212   const Expr *getPattern() const { return reinterpret_cast<Expr *>(Pattern); }
4213 
4214   /// Retrieve the location of the ellipsis that describes this pack
4215   /// expansion.
4216   SourceLocation getEllipsisLoc() const { return EllipsisLoc; }
4217 
4218   /// Determine the number of expansions that will be produced when
4219   /// this pack expansion is instantiated, if already known.
4220   std::optional<unsigned> getNumExpansions() const {
4221     if (NumExpansions)
4222       return NumExpansions - 1;
4223 
4224     return std::nullopt;
4225   }
4226 
4227   SourceLocation getBeginLoc() const LLVM_READONLY {
4228     return Pattern->getBeginLoc();
4229   }
4230 
4231   SourceLocation getEndLoc() const LLVM_READONLY { return EllipsisLoc; }
4232 
4233   static bool classof(const Stmt *T) {
4234     return T->getStmtClass() == PackExpansionExprClass;
4235   }
4236 
4237   // Iterators
4238   child_range children() {
4239     return child_range(&Pattern, &Pattern + 1);
4240   }
4241 
4242   const_child_range children() const {
4243     return const_child_range(&Pattern, &Pattern + 1);
4244   }
4245 };
4246 
4247 /// Represents an expression that computes the length of a parameter
4248 /// pack.
4249 ///
4250 /// \code
4251 /// template<typename ...Types>
4252 /// struct count {
4253 ///   static const unsigned value = sizeof...(Types);
4254 /// };
4255 /// \endcode
4256 class SizeOfPackExpr final
4257     : public Expr,
4258       private llvm::TrailingObjects<SizeOfPackExpr, TemplateArgument> {
4259   friend class ASTStmtReader;
4260   friend class ASTStmtWriter;
4261   friend TrailingObjects;
4262 
4263   /// The location of the \c sizeof keyword.
4264   SourceLocation OperatorLoc;
4265 
4266   /// The location of the name of the parameter pack.
4267   SourceLocation PackLoc;
4268 
4269   /// The location of the closing parenthesis.
4270   SourceLocation RParenLoc;
4271 
4272   /// The length of the parameter pack, if known.
4273   ///
4274   /// When this expression is not value-dependent, this is the length of
4275   /// the pack. When the expression was parsed rather than instantiated
4276   /// (and thus is value-dependent), this is zero.
4277   ///
4278   /// After partial substitution into a sizeof...(X) expression (for instance,
4279   /// within an alias template or during function template argument deduction),
4280   /// we store a trailing array of partially-substituted TemplateArguments,
4281   /// and this is the length of that array.
4282   unsigned Length;
4283 
4284   /// The parameter pack.
4285   NamedDecl *Pack = nullptr;
4286 
4287   /// Create an expression that computes the length of
4288   /// the given parameter pack.
4289   SizeOfPackExpr(QualType SizeType, SourceLocation OperatorLoc, NamedDecl *Pack,
4290                  SourceLocation PackLoc, SourceLocation RParenLoc,
4291                  std::optional<unsigned> Length,
4292                  ArrayRef<TemplateArgument> PartialArgs)
4293       : Expr(SizeOfPackExprClass, SizeType, VK_PRValue, OK_Ordinary),
4294         OperatorLoc(OperatorLoc), PackLoc(PackLoc), RParenLoc(RParenLoc),
4295         Length(Length ? *Length : PartialArgs.size()), Pack(Pack) {
4296     assert((!Length || PartialArgs.empty()) &&
4297            "have partial args for non-dependent sizeof... expression");
4298     auto *Args = getTrailingObjects<TemplateArgument>();
4299     std::uninitialized_copy(PartialArgs.begin(), PartialArgs.end(), Args);
4300     setDependence(Length ? ExprDependence::None
4301                          : ExprDependence::ValueInstantiation);
4302   }
4303 
4304   /// Create an empty expression.
4305   SizeOfPackExpr(EmptyShell Empty, unsigned NumPartialArgs)
4306       : Expr(SizeOfPackExprClass, Empty), Length(NumPartialArgs) {}
4307 
4308 public:
4309   static SizeOfPackExpr *Create(ASTContext &Context, SourceLocation OperatorLoc,
4310                                 NamedDecl *Pack, SourceLocation PackLoc,
4311                                 SourceLocation RParenLoc,
4312                                 std::optional<unsigned> Length = std::nullopt,
4313                                 ArrayRef<TemplateArgument> PartialArgs = {});
4314   static SizeOfPackExpr *CreateDeserialized(ASTContext &Context,
4315                                             unsigned NumPartialArgs);
4316 
4317   /// Determine the location of the 'sizeof' keyword.
4318   SourceLocation getOperatorLoc() const { return OperatorLoc; }
4319 
4320   /// Determine the location of the parameter pack.
4321   SourceLocation getPackLoc() const { return PackLoc; }
4322 
4323   /// Determine the location of the right parenthesis.
4324   SourceLocation getRParenLoc() const { return RParenLoc; }
4325 
4326   /// Retrieve the parameter pack.
4327   NamedDecl *getPack() const { return Pack; }
4328 
4329   /// Retrieve the length of the parameter pack.
4330   ///
4331   /// This routine may only be invoked when the expression is not
4332   /// value-dependent.
4333   unsigned getPackLength() const {
4334     assert(!isValueDependent() &&
4335            "Cannot get the length of a value-dependent pack size expression");
4336     return Length;
4337   }
4338 
4339   /// Determine whether this represents a partially-substituted sizeof...
4340   /// expression, such as is produced for:
4341   ///
4342   ///   template<typename ...Ts> using X = int[sizeof...(Ts)];
4343   ///   template<typename ...Us> void f(X<Us..., 1, 2, 3, Us...>);
4344   bool isPartiallySubstituted() const {
4345     return isValueDependent() && Length;
4346   }
4347 
4348   /// Get
4349   ArrayRef<TemplateArgument> getPartialArguments() const {
4350     assert(isPartiallySubstituted());
4351     const auto *Args = getTrailingObjects<TemplateArgument>();
4352     return llvm::ArrayRef(Args, Args + Length);
4353   }
4354 
4355   SourceLocation getBeginLoc() const LLVM_READONLY { return OperatorLoc; }
4356   SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
4357 
4358   static bool classof(const Stmt *T) {
4359     return T->getStmtClass() == SizeOfPackExprClass;
4360   }
4361 
4362   // Iterators
4363   child_range children() {
4364     return child_range(child_iterator(), child_iterator());
4365   }
4366 
4367   const_child_range children() const {
4368     return const_child_range(const_child_iterator(), const_child_iterator());
4369   }
4370 };
4371 
4372 class PackIndexingExpr final
4373     : public Expr,
4374       private llvm::TrailingObjects<PackIndexingExpr, Expr *> {
4375   friend class ASTStmtReader;
4376   friend class ASTStmtWriter;
4377   friend TrailingObjects;
4378 
4379   SourceLocation EllipsisLoc;
4380 
4381   // The location of the closing bracket
4382   SourceLocation RSquareLoc;
4383 
4384   // The pack being indexed, followed by the index
4385   Stmt *SubExprs[2];
4386 
4387   // The size of the trailing expressions.
4388   unsigned TransformedExpressions : 31;
4389 
4390   LLVM_PREFERRED_TYPE(bool)
4391   unsigned FullySubstituted : 1;
4392 
4393   PackIndexingExpr(QualType Type, SourceLocation EllipsisLoc,
4394                    SourceLocation RSquareLoc, Expr *PackIdExpr, Expr *IndexExpr,
4395                    ArrayRef<Expr *> SubstitutedExprs = {},
4396                    bool FullySubstituted = false)
4397       : Expr(PackIndexingExprClass, Type, VK_LValue, OK_Ordinary),
4398         EllipsisLoc(EllipsisLoc), RSquareLoc(RSquareLoc),
4399         SubExprs{PackIdExpr, IndexExpr},
4400         TransformedExpressions(SubstitutedExprs.size()),
4401         FullySubstituted(FullySubstituted) {
4402 
4403     auto *Exprs = getTrailingObjects<Expr *>();
4404     std::uninitialized_copy(SubstitutedExprs.begin(), SubstitutedExprs.end(),
4405                             Exprs);
4406 
4407     setDependence(computeDependence(this));
4408     if (!isInstantiationDependent())
4409       setValueKind(getSelectedExpr()->getValueKind());
4410   }
4411 
4412   /// Create an empty expression.
4413   PackIndexingExpr(EmptyShell Empty) : Expr(PackIndexingExprClass, Empty) {}
4414 
4415   unsigned numTrailingObjects(OverloadToken<Expr *>) const {
4416     return TransformedExpressions;
4417   }
4418 
4419 public:
4420   static PackIndexingExpr *Create(ASTContext &Context,
4421                                   SourceLocation EllipsisLoc,
4422                                   SourceLocation RSquareLoc, Expr *PackIdExpr,
4423                                   Expr *IndexExpr, std::optional<int64_t> Index,
4424                                   ArrayRef<Expr *> SubstitutedExprs = {},
4425                                   bool FullySubstituted = false);
4426   static PackIndexingExpr *CreateDeserialized(ASTContext &Context,
4427                                               unsigned NumTransformedExprs);
4428 
4429   bool isFullySubstituted() const { return FullySubstituted; }
4430 
4431   /// Determine if the expression was expanded to empty.
4432   bool expandsToEmptyPack() const {
4433     return isFullySubstituted() && TransformedExpressions == 0;
4434   }
4435 
4436   /// Determine the location of the 'sizeof' keyword.
4437   SourceLocation getEllipsisLoc() const { return EllipsisLoc; }
4438 
4439   /// Determine the location of the parameter pack.
4440   SourceLocation getPackLoc() const { return SubExprs[0]->getBeginLoc(); }
4441 
4442   /// Determine the location of the right parenthesis.
4443   SourceLocation getRSquareLoc() const { return RSquareLoc; }
4444 
4445   SourceLocation getBeginLoc() const LLVM_READONLY { return getPackLoc(); }
4446   SourceLocation getEndLoc() const LLVM_READONLY { return RSquareLoc; }
4447 
4448   Expr *getPackIdExpression() const { return cast<Expr>(SubExprs[0]); }
4449 
4450   NamedDecl *getPackDecl() const;
4451 
4452   Expr *getIndexExpr() const { return cast<Expr>(SubExprs[1]); }
4453 
4454   std::optional<unsigned> getSelectedIndex() const {
4455     if (isInstantiationDependent())
4456       return std::nullopt;
4457     ConstantExpr *CE = cast<ConstantExpr>(getIndexExpr());
4458     auto Index = CE->getResultAsAPSInt();
4459     assert(Index.isNonNegative() && "Invalid index");
4460     return static_cast<unsigned>(Index.getExtValue());
4461   }
4462 
4463   Expr *getSelectedExpr() const {
4464     std::optional<unsigned> Index = getSelectedIndex();
4465     assert(Index && "extracting the indexed expression of a dependant pack");
4466     return getTrailingObjects<Expr *>()[*Index];
4467   }
4468 
4469   /// Return the trailing expressions, regardless of the expansion.
4470   ArrayRef<Expr *> getExpressions() const {
4471     return {getTrailingObjects<Expr *>(), TransformedExpressions};
4472   }
4473 
4474   static bool classof(const Stmt *T) {
4475     return T->getStmtClass() == PackIndexingExprClass;
4476   }
4477 
4478   // Iterators
4479   child_range children() { return child_range(SubExprs, SubExprs + 2); }
4480 
4481   const_child_range children() const {
4482     return const_child_range(SubExprs, SubExprs + 2);
4483   }
4484 };
4485 
4486 /// Represents a reference to a non-type template parameter
4487 /// that has been substituted with a template argument.
4488 class SubstNonTypeTemplateParmExpr : public Expr {
4489   friend class ASTReader;
4490   friend class ASTStmtReader;
4491 
4492   /// The replacement expression.
4493   Stmt *Replacement;
4494 
4495   /// The associated declaration and a flag indicating if it was a reference
4496   /// parameter. For class NTTPs, we can't determine that based on the value
4497   /// category alone.
4498   llvm::PointerIntPair<Decl *, 1, bool> AssociatedDeclAndRef;
4499 
4500   unsigned Index : 15;
4501   unsigned PackIndex : 16;
4502 
4503   explicit SubstNonTypeTemplateParmExpr(EmptyShell Empty)
4504       : Expr(SubstNonTypeTemplateParmExprClass, Empty) {}
4505 
4506 public:
4507   SubstNonTypeTemplateParmExpr(QualType Ty, ExprValueKind ValueKind,
4508                                SourceLocation Loc, Expr *Replacement,
4509                                Decl *AssociatedDecl, unsigned Index,
4510                                std::optional<unsigned> PackIndex, bool RefParam)
4511       : Expr(SubstNonTypeTemplateParmExprClass, Ty, ValueKind, OK_Ordinary),
4512         Replacement(Replacement),
4513         AssociatedDeclAndRef(AssociatedDecl, RefParam), Index(Index),
4514         PackIndex(PackIndex ? *PackIndex + 1 : 0) {
4515     assert(AssociatedDecl != nullptr);
4516     SubstNonTypeTemplateParmExprBits.NameLoc = Loc;
4517     setDependence(computeDependence(this));
4518   }
4519 
4520   SourceLocation getNameLoc() const {
4521     return SubstNonTypeTemplateParmExprBits.NameLoc;
4522   }
4523   SourceLocation getBeginLoc() const { return getNameLoc(); }
4524   SourceLocation getEndLoc() const { return getNameLoc(); }
4525 
4526   Expr *getReplacement() const { return cast<Expr>(Replacement); }
4527 
4528   /// A template-like entity which owns the whole pattern being substituted.
4529   /// This will own a set of template parameters.
4530   Decl *getAssociatedDecl() const { return AssociatedDeclAndRef.getPointer(); }
4531 
4532   /// Returns the index of the replaced parameter in the associated declaration.
4533   /// This should match the result of `getParameter()->getIndex()`.
4534   unsigned getIndex() const { return Index; }
4535 
4536   std::optional<unsigned> getPackIndex() const {
4537     if (PackIndex == 0)
4538       return std::nullopt;
4539     return PackIndex - 1;
4540   }
4541 
4542   NonTypeTemplateParmDecl *getParameter() const;
4543 
4544   bool isReferenceParameter() const { return AssociatedDeclAndRef.getInt(); }
4545 
4546   /// Determine the substituted type of the template parameter.
4547   QualType getParameterType(const ASTContext &Ctx) const;
4548 
4549   static bool classof(const Stmt *s) {
4550     return s->getStmtClass() == SubstNonTypeTemplateParmExprClass;
4551   }
4552 
4553   // Iterators
4554   child_range children() { return child_range(&Replacement, &Replacement + 1); }
4555 
4556   const_child_range children() const {
4557     return const_child_range(&Replacement, &Replacement + 1);
4558   }
4559 };
4560 
4561 /// Represents a reference to a non-type template parameter pack that
4562 /// has been substituted with a non-template argument pack.
4563 ///
4564 /// When a pack expansion in the source code contains multiple parameter packs
4565 /// and those parameter packs correspond to different levels of template
4566 /// parameter lists, this node is used to represent a non-type template
4567 /// parameter pack from an outer level, which has already had its argument pack
4568 /// substituted but that still lives within a pack expansion that itself
4569 /// could not be instantiated. When actually performing a substitution into
4570 /// that pack expansion (e.g., when all template parameters have corresponding
4571 /// arguments), this type will be replaced with the appropriate underlying
4572 /// expression at the current pack substitution index.
4573 class SubstNonTypeTemplateParmPackExpr : public Expr {
4574   friend class ASTReader;
4575   friend class ASTStmtReader;
4576 
4577   /// The non-type template parameter pack itself.
4578   Decl *AssociatedDecl;
4579 
4580   /// A pointer to the set of template arguments that this
4581   /// parameter pack is instantiated with.
4582   const TemplateArgument *Arguments;
4583 
4584   /// The number of template arguments in \c Arguments.
4585   unsigned NumArguments : 16;
4586 
4587   unsigned Index : 16;
4588 
4589   /// The location of the non-type template parameter pack reference.
4590   SourceLocation NameLoc;
4591 
4592   explicit SubstNonTypeTemplateParmPackExpr(EmptyShell Empty)
4593       : Expr(SubstNonTypeTemplateParmPackExprClass, Empty) {}
4594 
4595 public:
4596   SubstNonTypeTemplateParmPackExpr(QualType T, ExprValueKind ValueKind,
4597                                    SourceLocation NameLoc,
4598                                    const TemplateArgument &ArgPack,
4599                                    Decl *AssociatedDecl, unsigned Index);
4600 
4601   /// A template-like entity which owns the whole pattern being substituted.
4602   /// This will own a set of template parameters.
4603   Decl *getAssociatedDecl() const { return AssociatedDecl; }
4604 
4605   /// Returns the index of the replaced parameter in the associated declaration.
4606   /// This should match the result of `getParameterPack()->getIndex()`.
4607   unsigned getIndex() const { return Index; }
4608 
4609   /// Retrieve the non-type template parameter pack being substituted.
4610   NonTypeTemplateParmDecl *getParameterPack() const;
4611 
4612   /// Retrieve the location of the parameter pack name.
4613   SourceLocation getParameterPackLocation() const { return NameLoc; }
4614 
4615   /// Retrieve the template argument pack containing the substituted
4616   /// template arguments.
4617   TemplateArgument getArgumentPack() const;
4618 
4619   SourceLocation getBeginLoc() const LLVM_READONLY { return NameLoc; }
4620   SourceLocation getEndLoc() const LLVM_READONLY { return NameLoc; }
4621 
4622   static bool classof(const Stmt *T) {
4623     return T->getStmtClass() == SubstNonTypeTemplateParmPackExprClass;
4624   }
4625 
4626   // Iterators
4627   child_range children() {
4628     return child_range(child_iterator(), child_iterator());
4629   }
4630 
4631   const_child_range children() const {
4632     return const_child_range(const_child_iterator(), const_child_iterator());
4633   }
4634 };
4635 
4636 /// Represents a reference to a function parameter pack or init-capture pack
4637 /// that has been substituted but not yet expanded.
4638 ///
4639 /// When a pack expansion contains multiple parameter packs at different levels,
4640 /// this node is used to represent a function parameter pack at an outer level
4641 /// which we have already substituted to refer to expanded parameters, but where
4642 /// the containing pack expansion cannot yet be expanded.
4643 ///
4644 /// \code
4645 /// template<typename...Ts> struct S {
4646 ///   template<typename...Us> auto f(Ts ...ts) -> decltype(g(Us(ts)...));
4647 /// };
4648 /// template struct S<int, int>;
4649 /// \endcode
4650 class FunctionParmPackExpr final
4651     : public Expr,
4652       private llvm::TrailingObjects<FunctionParmPackExpr, VarDecl *> {
4653   friend class ASTReader;
4654   friend class ASTStmtReader;
4655   friend TrailingObjects;
4656 
4657   /// The function parameter pack which was referenced.
4658   VarDecl *ParamPack;
4659 
4660   /// The location of the function parameter pack reference.
4661   SourceLocation NameLoc;
4662 
4663   /// The number of expansions of this pack.
4664   unsigned NumParameters;
4665 
4666   FunctionParmPackExpr(QualType T, VarDecl *ParamPack,
4667                        SourceLocation NameLoc, unsigned NumParams,
4668                        VarDecl *const *Params);
4669 
4670 public:
4671   static FunctionParmPackExpr *Create(const ASTContext &Context, QualType T,
4672                                       VarDecl *ParamPack,
4673                                       SourceLocation NameLoc,
4674                                       ArrayRef<VarDecl *> Params);
4675   static FunctionParmPackExpr *CreateEmpty(const ASTContext &Context,
4676                                            unsigned NumParams);
4677 
4678   /// Get the parameter pack which this expression refers to.
4679   VarDecl *getParameterPack() const { return ParamPack; }
4680 
4681   /// Get the location of the parameter pack.
4682   SourceLocation getParameterPackLocation() const { return NameLoc; }
4683 
4684   /// Iterators over the parameters which the parameter pack expanded
4685   /// into.
4686   using iterator = VarDecl * const *;
4687   iterator begin() const { return getTrailingObjects<VarDecl *>(); }
4688   iterator end() const { return begin() + NumParameters; }
4689 
4690   /// Get the number of parameters in this parameter pack.
4691   unsigned getNumExpansions() const { return NumParameters; }
4692 
4693   /// Get an expansion of the parameter pack by index.
4694   VarDecl *getExpansion(unsigned I) const { return begin()[I]; }
4695 
4696   SourceLocation getBeginLoc() const LLVM_READONLY { return NameLoc; }
4697   SourceLocation getEndLoc() const LLVM_READONLY { return NameLoc; }
4698 
4699   static bool classof(const Stmt *T) {
4700     return T->getStmtClass() == FunctionParmPackExprClass;
4701   }
4702 
4703   child_range children() {
4704     return child_range(child_iterator(), child_iterator());
4705   }
4706 
4707   const_child_range children() const {
4708     return const_child_range(const_child_iterator(), const_child_iterator());
4709   }
4710 };
4711 
4712 /// Represents a prvalue temporary that is written into memory so that
4713 /// a reference can bind to it.
4714 ///
4715 /// Prvalue expressions are materialized when they need to have an address
4716 /// in memory for a reference to bind to. This happens when binding a
4717 /// reference to the result of a conversion, e.g.,
4718 ///
4719 /// \code
4720 /// const int &r = 1.0;
4721 /// \endcode
4722 ///
4723 /// Here, 1.0 is implicitly converted to an \c int. That resulting \c int is
4724 /// then materialized via a \c MaterializeTemporaryExpr, and the reference
4725 /// binds to the temporary. \c MaterializeTemporaryExprs are always glvalues
4726 /// (either an lvalue or an xvalue, depending on the kind of reference binding
4727 /// to it), maintaining the invariant that references always bind to glvalues.
4728 ///
4729 /// Reference binding and copy-elision can both extend the lifetime of a
4730 /// temporary. When either happens, the expression will also track the
4731 /// declaration which is responsible for the lifetime extension.
4732 class MaterializeTemporaryExpr : public Expr {
4733 private:
4734   friend class ASTStmtReader;
4735   friend class ASTStmtWriter;
4736 
4737   llvm::PointerUnion<Stmt *, LifetimeExtendedTemporaryDecl *> State;
4738 
4739 public:
4740   MaterializeTemporaryExpr(QualType T, Expr *Temporary,
4741                            bool BoundToLvalueReference,
4742                            LifetimeExtendedTemporaryDecl *MTD = nullptr);
4743 
4744   MaterializeTemporaryExpr(EmptyShell Empty)
4745       : Expr(MaterializeTemporaryExprClass, Empty) {}
4746 
4747   /// Retrieve the temporary-generating subexpression whose value will
4748   /// be materialized into a glvalue.
4749   Expr *getSubExpr() const {
4750     return cast<Expr>(
4751         isa<Stmt *>(State)
4752             ? cast<Stmt *>(State)
4753             : cast<LifetimeExtendedTemporaryDecl *>(State)->getTemporaryExpr());
4754   }
4755 
4756   /// Retrieve the storage duration for the materialized temporary.
4757   StorageDuration getStorageDuration() const {
4758     return isa<Stmt *>(State) ? SD_FullExpression
4759                               : cast<LifetimeExtendedTemporaryDecl *>(State)
4760                                     ->getStorageDuration();
4761   }
4762 
4763   /// Get the storage for the constant value of a materialized temporary
4764   /// of static storage duration.
4765   APValue *getOrCreateValue(bool MayCreate) const {
4766     assert(isa<LifetimeExtendedTemporaryDecl *>(State) &&
4767            "the temporary has not been lifetime extended");
4768     return cast<LifetimeExtendedTemporaryDecl *>(State)->getOrCreateValue(
4769         MayCreate);
4770   }
4771 
4772   LifetimeExtendedTemporaryDecl *getLifetimeExtendedTemporaryDecl() {
4773     return State.dyn_cast<LifetimeExtendedTemporaryDecl *>();
4774   }
4775   const LifetimeExtendedTemporaryDecl *
4776   getLifetimeExtendedTemporaryDecl() const {
4777     return State.dyn_cast<LifetimeExtendedTemporaryDecl *>();
4778   }
4779 
4780   /// Get the declaration which triggered the lifetime-extension of this
4781   /// temporary, if any.
4782   ValueDecl *getExtendingDecl() {
4783     return isa<Stmt *>(State) ? nullptr
4784                               : cast<LifetimeExtendedTemporaryDecl *>(State)
4785                                     ->getExtendingDecl();
4786   }
4787   const ValueDecl *getExtendingDecl() const {
4788     return const_cast<MaterializeTemporaryExpr *>(this)->getExtendingDecl();
4789   }
4790 
4791   void setExtendingDecl(ValueDecl *ExtendedBy, unsigned ManglingNumber);
4792 
4793   unsigned getManglingNumber() const {
4794     return isa<Stmt *>(State) ? 0
4795                               : cast<LifetimeExtendedTemporaryDecl *>(State)
4796                                     ->getManglingNumber();
4797   }
4798 
4799   /// Determine whether this materialized temporary is bound to an
4800   /// lvalue reference; otherwise, it's bound to an rvalue reference.
4801   bool isBoundToLvalueReference() const { return isLValue(); }
4802 
4803   /// Determine whether this temporary object is usable in constant
4804   /// expressions, as specified in C++20 [expr.const]p4.
4805   bool isUsableInConstantExpressions(const ASTContext &Context) const;
4806 
4807   SourceLocation getBeginLoc() const LLVM_READONLY {
4808     return getSubExpr()->getBeginLoc();
4809   }
4810 
4811   SourceLocation getEndLoc() const LLVM_READONLY {
4812     return getSubExpr()->getEndLoc();
4813   }
4814 
4815   static bool classof(const Stmt *T) {
4816     return T->getStmtClass() == MaterializeTemporaryExprClass;
4817   }
4818 
4819   // Iterators
4820   child_range children() {
4821     return isa<Stmt *>(State)
4822                ? child_range(State.getAddrOfPtr1(), State.getAddrOfPtr1() + 1)
4823                : cast<LifetimeExtendedTemporaryDecl *>(State)->childrenExpr();
4824   }
4825 
4826   const_child_range children() const {
4827     return isa<Stmt *>(State)
4828                ? const_child_range(State.getAddrOfPtr1(),
4829                                    State.getAddrOfPtr1() + 1)
4830                : const_cast<const LifetimeExtendedTemporaryDecl *>(
4831                      cast<LifetimeExtendedTemporaryDecl *>(State))
4832                      ->childrenExpr();
4833   }
4834 };
4835 
4836 /// Represents a folding of a pack over an operator.
4837 ///
4838 /// This expression is always dependent and represents a pack expansion of the
4839 /// forms:
4840 ///
4841 ///    ( expr op ... )
4842 ///    ( ... op expr )
4843 ///    ( expr op ... op expr )
4844 class CXXFoldExpr : public Expr {
4845   friend class ASTStmtReader;
4846   friend class ASTStmtWriter;
4847 
4848   enum SubExpr { Callee, LHS, RHS, Count };
4849 
4850   SourceLocation LParenLoc;
4851   SourceLocation EllipsisLoc;
4852   SourceLocation RParenLoc;
4853   // When 0, the number of expansions is not known. Otherwise, this is one more
4854   // than the number of expansions.
4855   unsigned NumExpansions;
4856   Stmt *SubExprs[SubExpr::Count];
4857   BinaryOperatorKind Opcode;
4858 
4859 public:
4860   CXXFoldExpr(QualType T, UnresolvedLookupExpr *Callee,
4861               SourceLocation LParenLoc, Expr *LHS, BinaryOperatorKind Opcode,
4862               SourceLocation EllipsisLoc, Expr *RHS, SourceLocation RParenLoc,
4863               std::optional<unsigned> NumExpansions);
4864 
4865   CXXFoldExpr(EmptyShell Empty) : Expr(CXXFoldExprClass, Empty) {}
4866 
4867   UnresolvedLookupExpr *getCallee() const {
4868     return static_cast<UnresolvedLookupExpr *>(SubExprs[SubExpr::Callee]);
4869   }
4870   Expr *getLHS() const { return static_cast<Expr*>(SubExprs[SubExpr::LHS]); }
4871   Expr *getRHS() const { return static_cast<Expr*>(SubExprs[SubExpr::RHS]); }
4872 
4873   /// Does this produce a right-associated sequence of operators?
4874   bool isRightFold() const {
4875     return getLHS() && getLHS()->containsUnexpandedParameterPack();
4876   }
4877 
4878   /// Does this produce a left-associated sequence of operators?
4879   bool isLeftFold() const { return !isRightFold(); }
4880 
4881   /// Get the pattern, that is, the operand that contains an unexpanded pack.
4882   Expr *getPattern() const { return isLeftFold() ? getRHS() : getLHS(); }
4883 
4884   /// Get the operand that doesn't contain a pack, for a binary fold.
4885   Expr *getInit() const { return isLeftFold() ? getLHS() : getRHS(); }
4886 
4887   SourceLocation getLParenLoc() const { return LParenLoc; }
4888   SourceLocation getRParenLoc() const { return RParenLoc; }
4889   SourceLocation getEllipsisLoc() const { return EllipsisLoc; }
4890   BinaryOperatorKind getOperator() const { return Opcode; }
4891 
4892   std::optional<unsigned> getNumExpansions() const {
4893     if (NumExpansions)
4894       return NumExpansions - 1;
4895     return std::nullopt;
4896   }
4897 
4898   SourceLocation getBeginLoc() const LLVM_READONLY {
4899     if (LParenLoc.isValid())
4900       return LParenLoc;
4901     if (isLeftFold())
4902       return getEllipsisLoc();
4903     return getLHS()->getBeginLoc();
4904   }
4905 
4906   SourceLocation getEndLoc() const LLVM_READONLY {
4907     if (RParenLoc.isValid())
4908       return RParenLoc;
4909     if (isRightFold())
4910       return getEllipsisLoc();
4911     return getRHS()->getEndLoc();
4912   }
4913 
4914   static bool classof(const Stmt *T) {
4915     return T->getStmtClass() == CXXFoldExprClass;
4916   }
4917 
4918   // Iterators
4919   child_range children() {
4920     return child_range(SubExprs, SubExprs + SubExpr::Count);
4921   }
4922 
4923   const_child_range children() const {
4924     return const_child_range(SubExprs, SubExprs + SubExpr::Count);
4925   }
4926 };
4927 
4928 /// Represents a list-initialization with parenthesis.
4929 ///
4930 /// As per P0960R3, this is a C++20 feature that allows aggregate to
4931 /// be initialized with a parenthesized list of values:
4932 /// ```
4933 /// struct A {
4934 ///   int a;
4935 ///   double b;
4936 /// };
4937 ///
4938 /// void foo() {
4939 ///   A a1(0);        // Well-formed in C++20
4940 ///   A a2(1.5, 1.0); // Well-formed in C++20
4941 /// }
4942 /// ```
4943 /// It has some sort of similiarity to braced
4944 /// list-initialization, with some differences such as
4945 /// it allows narrowing conversion whilst braced
4946 /// list-initialization doesn't.
4947 /// ```
4948 /// struct A {
4949 ///   char a;
4950 /// };
4951 /// void foo() {
4952 ///   A a(1.5); // Well-formed in C++20
4953 ///   A b{1.5}; // Ill-formed !
4954 /// }
4955 /// ```
4956 class CXXParenListInitExpr final
4957     : public Expr,
4958       private llvm::TrailingObjects<CXXParenListInitExpr, Expr *> {
4959   friend class TrailingObjects;
4960   friend class ASTStmtReader;
4961   friend class ASTStmtWriter;
4962 
4963   unsigned NumExprs;
4964   unsigned NumUserSpecifiedExprs;
4965   SourceLocation InitLoc, LParenLoc, RParenLoc;
4966   llvm::PointerUnion<Expr *, FieldDecl *> ArrayFillerOrUnionFieldInit;
4967 
4968   CXXParenListInitExpr(ArrayRef<Expr *> Args, QualType T,
4969                        unsigned NumUserSpecifiedExprs, SourceLocation InitLoc,
4970                        SourceLocation LParenLoc, SourceLocation RParenLoc)
4971       : Expr(CXXParenListInitExprClass, T, getValueKindForType(T), OK_Ordinary),
4972         NumExprs(Args.size()), NumUserSpecifiedExprs(NumUserSpecifiedExprs),
4973         InitLoc(InitLoc), LParenLoc(LParenLoc), RParenLoc(RParenLoc) {
4974     std::copy(Args.begin(), Args.end(), getTrailingObjects<Expr *>());
4975     assert(NumExprs >= NumUserSpecifiedExprs &&
4976            "number of user specified inits is greater than the number of "
4977            "passed inits");
4978     setDependence(computeDependence(this));
4979   }
4980 
4981   size_t numTrailingObjects(OverloadToken<Expr *>) const { return NumExprs; }
4982 
4983 public:
4984   static CXXParenListInitExpr *
4985   Create(ASTContext &C, ArrayRef<Expr *> Args, QualType T,
4986          unsigned NumUserSpecifiedExprs, SourceLocation InitLoc,
4987          SourceLocation LParenLoc, SourceLocation RParenLoc);
4988 
4989   static CXXParenListInitExpr *CreateEmpty(ASTContext &C, unsigned numExprs,
4990                                            EmptyShell Empty);
4991 
4992   explicit CXXParenListInitExpr(EmptyShell Empty, unsigned NumExprs)
4993       : Expr(CXXParenListInitExprClass, Empty), NumExprs(NumExprs),
4994         NumUserSpecifiedExprs(0) {}
4995 
4996   void updateDependence() { setDependence(computeDependence(this)); }
4997 
4998   ArrayRef<Expr *> getInitExprs() {
4999     return ArrayRef(getTrailingObjects<Expr *>(), NumExprs);
5000   }
5001 
5002   const ArrayRef<Expr *> getInitExprs() const {
5003     return ArrayRef(getTrailingObjects<Expr *>(), NumExprs);
5004   }
5005 
5006   ArrayRef<Expr *> getUserSpecifiedInitExprs() {
5007     return ArrayRef(getTrailingObjects<Expr *>(), NumUserSpecifiedExprs);
5008   }
5009 
5010   const ArrayRef<Expr *> getUserSpecifiedInitExprs() const {
5011     return ArrayRef(getTrailingObjects<Expr *>(), NumUserSpecifiedExprs);
5012   }
5013 
5014   SourceLocation getBeginLoc() const LLVM_READONLY { return LParenLoc; }
5015 
5016   SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
5017 
5018   SourceLocation getInitLoc() const LLVM_READONLY { return InitLoc; }
5019 
5020   SourceRange getSourceRange() const LLVM_READONLY {
5021     return SourceRange(getBeginLoc(), getEndLoc());
5022   }
5023 
5024   void setArrayFiller(Expr *E) { ArrayFillerOrUnionFieldInit = E; }
5025 
5026   Expr *getArrayFiller() {
5027     return dyn_cast_if_present<Expr *>(ArrayFillerOrUnionFieldInit);
5028   }
5029 
5030   const Expr *getArrayFiller() const {
5031     return dyn_cast_if_present<Expr *>(ArrayFillerOrUnionFieldInit);
5032   }
5033 
5034   void setInitializedFieldInUnion(FieldDecl *FD) {
5035     ArrayFillerOrUnionFieldInit = FD;
5036   }
5037 
5038   FieldDecl *getInitializedFieldInUnion() {
5039     return dyn_cast_if_present<FieldDecl *>(ArrayFillerOrUnionFieldInit);
5040   }
5041 
5042   const FieldDecl *getInitializedFieldInUnion() const {
5043     return ArrayFillerOrUnionFieldInit.dyn_cast<FieldDecl *>();
5044   }
5045 
5046   child_range children() {
5047     Stmt **Begin = reinterpret_cast<Stmt **>(getTrailingObjects<Expr *>());
5048     return child_range(Begin, Begin + NumExprs);
5049   }
5050 
5051   const_child_range children() const {
5052     Stmt *const *Begin =
5053         reinterpret_cast<Stmt *const *>(getTrailingObjects<Expr *>());
5054     return const_child_range(Begin, Begin + NumExprs);
5055   }
5056 
5057   static bool classof(const Stmt *T) {
5058     return T->getStmtClass() == CXXParenListInitExprClass;
5059   }
5060 };
5061 
5062 /// Represents an expression that might suspend coroutine execution;
5063 /// either a co_await or co_yield expression.
5064 ///
5065 /// Evaluation of this expression first evaluates its 'ready' expression. If
5066 /// that returns 'false':
5067 ///  -- execution of the coroutine is suspended
5068 ///  -- the 'suspend' expression is evaluated
5069 ///     -- if the 'suspend' expression returns 'false', the coroutine is
5070 ///        resumed
5071 ///     -- otherwise, control passes back to the resumer.
5072 /// If the coroutine is not suspended, or when it is resumed, the 'resume'
5073 /// expression is evaluated, and its result is the result of the overall
5074 /// expression.
5075 class CoroutineSuspendExpr : public Expr {
5076   friend class ASTStmtReader;
5077 
5078   SourceLocation KeywordLoc;
5079 
5080   enum SubExpr { Operand, Common, Ready, Suspend, Resume, Count };
5081 
5082   Stmt *SubExprs[SubExpr::Count];
5083   OpaqueValueExpr *OpaqueValue = nullptr;
5084 
5085 public:
5086   // These types correspond to the three C++ 'await_suspend' return variants
5087   enum class SuspendReturnType { SuspendVoid, SuspendBool, SuspendHandle };
5088 
5089   CoroutineSuspendExpr(StmtClass SC, SourceLocation KeywordLoc, Expr *Operand,
5090                        Expr *Common, Expr *Ready, Expr *Suspend, Expr *Resume,
5091                        OpaqueValueExpr *OpaqueValue)
5092       : Expr(SC, Resume->getType(), Resume->getValueKind(),
5093              Resume->getObjectKind()),
5094         KeywordLoc(KeywordLoc), OpaqueValue(OpaqueValue) {
5095     SubExprs[SubExpr::Operand] = Operand;
5096     SubExprs[SubExpr::Common] = Common;
5097     SubExprs[SubExpr::Ready] = Ready;
5098     SubExprs[SubExpr::Suspend] = Suspend;
5099     SubExprs[SubExpr::Resume] = Resume;
5100     setDependence(computeDependence(this));
5101   }
5102 
5103   CoroutineSuspendExpr(StmtClass SC, SourceLocation KeywordLoc, QualType Ty,
5104                        Expr *Operand, Expr *Common)
5105       : Expr(SC, Ty, VK_PRValue, OK_Ordinary), KeywordLoc(KeywordLoc) {
5106     assert(Common->isTypeDependent() && Ty->isDependentType() &&
5107            "wrong constructor for non-dependent co_await/co_yield expression");
5108     SubExprs[SubExpr::Operand] = Operand;
5109     SubExprs[SubExpr::Common] = Common;
5110     SubExprs[SubExpr::Ready] = nullptr;
5111     SubExprs[SubExpr::Suspend] = nullptr;
5112     SubExprs[SubExpr::Resume] = nullptr;
5113     setDependence(computeDependence(this));
5114   }
5115 
5116   CoroutineSuspendExpr(StmtClass SC, EmptyShell Empty) : Expr(SC, Empty) {
5117     SubExprs[SubExpr::Operand] = nullptr;
5118     SubExprs[SubExpr::Common] = nullptr;
5119     SubExprs[SubExpr::Ready] = nullptr;
5120     SubExprs[SubExpr::Suspend] = nullptr;
5121     SubExprs[SubExpr::Resume] = nullptr;
5122   }
5123 
5124   Expr *getCommonExpr() const {
5125     return static_cast<Expr*>(SubExprs[SubExpr::Common]);
5126   }
5127 
5128   /// getOpaqueValue - Return the opaque value placeholder.
5129   OpaqueValueExpr *getOpaqueValue() const { return OpaqueValue; }
5130 
5131   Expr *getReadyExpr() const {
5132     return static_cast<Expr*>(SubExprs[SubExpr::Ready]);
5133   }
5134 
5135   Expr *getSuspendExpr() const {
5136     return static_cast<Expr*>(SubExprs[SubExpr::Suspend]);
5137   }
5138 
5139   Expr *getResumeExpr() const {
5140     return static_cast<Expr*>(SubExprs[SubExpr::Resume]);
5141   }
5142 
5143   // The syntactic operand written in the code
5144   Expr *getOperand() const {
5145     return static_cast<Expr *>(SubExprs[SubExpr::Operand]);
5146   }
5147 
5148   SuspendReturnType getSuspendReturnType() const {
5149     auto *SuspendExpr = getSuspendExpr();
5150     assert(SuspendExpr);
5151 
5152     auto SuspendType = SuspendExpr->getType();
5153 
5154     if (SuspendType->isVoidType())
5155       return SuspendReturnType::SuspendVoid;
5156     if (SuspendType->isBooleanType())
5157       return SuspendReturnType::SuspendBool;
5158 
5159     // Void pointer is the type of handle.address(), which is returned
5160     // from the await suspend wrapper so that the temporary coroutine handle
5161     // value won't go to the frame by mistake
5162     assert(SuspendType->isVoidPointerType());
5163     return SuspendReturnType::SuspendHandle;
5164   }
5165 
5166   SourceLocation getKeywordLoc() const { return KeywordLoc; }
5167 
5168   SourceLocation getBeginLoc() const LLVM_READONLY { return KeywordLoc; }
5169 
5170   SourceLocation getEndLoc() const LLVM_READONLY {
5171     return getOperand()->getEndLoc();
5172   }
5173 
5174   child_range children() {
5175     return child_range(SubExprs, SubExprs + SubExpr::Count);
5176   }
5177 
5178   const_child_range children() const {
5179     return const_child_range(SubExprs, SubExprs + SubExpr::Count);
5180   }
5181 
5182   static bool classof(const Stmt *T) {
5183     return T->getStmtClass() == CoawaitExprClass ||
5184            T->getStmtClass() == CoyieldExprClass;
5185   }
5186 };
5187 
5188 /// Represents a 'co_await' expression.
5189 class CoawaitExpr : public CoroutineSuspendExpr {
5190   friend class ASTStmtReader;
5191 
5192 public:
5193   CoawaitExpr(SourceLocation CoawaitLoc, Expr *Operand, Expr *Common,
5194               Expr *Ready, Expr *Suspend, Expr *Resume,
5195               OpaqueValueExpr *OpaqueValue, bool IsImplicit = false)
5196       : CoroutineSuspendExpr(CoawaitExprClass, CoawaitLoc, Operand, Common,
5197                              Ready, Suspend, Resume, OpaqueValue) {
5198     CoawaitBits.IsImplicit = IsImplicit;
5199   }
5200 
5201   CoawaitExpr(SourceLocation CoawaitLoc, QualType Ty, Expr *Operand,
5202               Expr *Common, bool IsImplicit = false)
5203       : CoroutineSuspendExpr(CoawaitExprClass, CoawaitLoc, Ty, Operand,
5204                              Common) {
5205     CoawaitBits.IsImplicit = IsImplicit;
5206   }
5207 
5208   CoawaitExpr(EmptyShell Empty)
5209       : CoroutineSuspendExpr(CoawaitExprClass, Empty) {}
5210 
5211   bool isImplicit() const { return CoawaitBits.IsImplicit; }
5212   void setIsImplicit(bool value = true) { CoawaitBits.IsImplicit = value; }
5213 
5214   static bool classof(const Stmt *T) {
5215     return T->getStmtClass() == CoawaitExprClass;
5216   }
5217 };
5218 
5219 /// Represents a 'co_await' expression while the type of the promise
5220 /// is dependent.
5221 class DependentCoawaitExpr : public Expr {
5222   friend class ASTStmtReader;
5223 
5224   SourceLocation KeywordLoc;
5225   Stmt *SubExprs[2];
5226 
5227 public:
5228   DependentCoawaitExpr(SourceLocation KeywordLoc, QualType Ty, Expr *Op,
5229                        UnresolvedLookupExpr *OpCoawait)
5230       : Expr(DependentCoawaitExprClass, Ty, VK_PRValue, OK_Ordinary),
5231         KeywordLoc(KeywordLoc) {
5232     // NOTE: A co_await expression is dependent on the coroutines promise
5233     // type and may be dependent even when the `Op` expression is not.
5234     assert(Ty->isDependentType() &&
5235            "wrong constructor for non-dependent co_await/co_yield expression");
5236     SubExprs[0] = Op;
5237     SubExprs[1] = OpCoawait;
5238     setDependence(computeDependence(this));
5239   }
5240 
5241   DependentCoawaitExpr(EmptyShell Empty)
5242       : Expr(DependentCoawaitExprClass, Empty) {}
5243 
5244   Expr *getOperand() const { return cast<Expr>(SubExprs[0]); }
5245 
5246   UnresolvedLookupExpr *getOperatorCoawaitLookup() const {
5247     return cast<UnresolvedLookupExpr>(SubExprs[1]);
5248   }
5249 
5250   SourceLocation getKeywordLoc() const { return KeywordLoc; }
5251 
5252   SourceLocation getBeginLoc() const LLVM_READONLY { return KeywordLoc; }
5253 
5254   SourceLocation getEndLoc() const LLVM_READONLY {
5255     return getOperand()->getEndLoc();
5256   }
5257 
5258   child_range children() { return child_range(SubExprs, SubExprs + 2); }
5259 
5260   const_child_range children() const {
5261     return const_child_range(SubExprs, SubExprs + 2);
5262   }
5263 
5264   static bool classof(const Stmt *T) {
5265     return T->getStmtClass() == DependentCoawaitExprClass;
5266   }
5267 };
5268 
5269 /// Represents a 'co_yield' expression.
5270 class CoyieldExpr : public CoroutineSuspendExpr {
5271   friend class ASTStmtReader;
5272 
5273 public:
5274   CoyieldExpr(SourceLocation CoyieldLoc, Expr *Operand, Expr *Common,
5275               Expr *Ready, Expr *Suspend, Expr *Resume,
5276               OpaqueValueExpr *OpaqueValue)
5277       : CoroutineSuspendExpr(CoyieldExprClass, CoyieldLoc, Operand, Common,
5278                              Ready, Suspend, Resume, OpaqueValue) {}
5279   CoyieldExpr(SourceLocation CoyieldLoc, QualType Ty, Expr *Operand,
5280               Expr *Common)
5281       : CoroutineSuspendExpr(CoyieldExprClass, CoyieldLoc, Ty, Operand,
5282                              Common) {}
5283   CoyieldExpr(EmptyShell Empty)
5284       : CoroutineSuspendExpr(CoyieldExprClass, Empty) {}
5285 
5286   static bool classof(const Stmt *T) {
5287     return T->getStmtClass() == CoyieldExprClass;
5288   }
5289 };
5290 
5291 /// Represents a C++2a __builtin_bit_cast(T, v) expression. Used to implement
5292 /// std::bit_cast. These can sometimes be evaluated as part of a constant
5293 /// expression, but otherwise CodeGen to a simple memcpy in general.
5294 class BuiltinBitCastExpr final
5295     : public ExplicitCastExpr,
5296       private llvm::TrailingObjects<BuiltinBitCastExpr, CXXBaseSpecifier *> {
5297   friend class ASTStmtReader;
5298   friend class CastExpr;
5299   friend TrailingObjects;
5300 
5301   SourceLocation KWLoc;
5302   SourceLocation RParenLoc;
5303 
5304 public:
5305   BuiltinBitCastExpr(QualType T, ExprValueKind VK, CastKind CK, Expr *SrcExpr,
5306                      TypeSourceInfo *DstType, SourceLocation KWLoc,
5307                      SourceLocation RParenLoc)
5308       : ExplicitCastExpr(BuiltinBitCastExprClass, T, VK, CK, SrcExpr, 0, false,
5309                          DstType),
5310         KWLoc(KWLoc), RParenLoc(RParenLoc) {}
5311   BuiltinBitCastExpr(EmptyShell Empty)
5312       : ExplicitCastExpr(BuiltinBitCastExprClass, Empty, 0, false) {}
5313 
5314   SourceLocation getBeginLoc() const LLVM_READONLY { return KWLoc; }
5315   SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
5316 
5317   static bool classof(const Stmt *T) {
5318     return T->getStmtClass() == BuiltinBitCastExprClass;
5319   }
5320 };
5321 
5322 // Represents an unexpanded pack where the list of expressions are
5323 // known. These are used when structured bindings introduce a pack.
5324 class ResolvedUnexpandedPackExpr final
5325     : public Expr,
5326       private llvm::TrailingObjects<ResolvedUnexpandedPackExpr, Expr *> {
5327   friend class ASTStmtReader;
5328   friend class ASTStmtWriter;
5329   friend TrailingObjects;
5330 
5331   SourceLocation BeginLoc;
5332   unsigned NumExprs;
5333 
5334   ResolvedUnexpandedPackExpr(SourceLocation BL, QualType QT, unsigned NumExprs);
5335 
5336 public:
5337   static ResolvedUnexpandedPackExpr *CreateDeserialized(ASTContext &C,
5338                                                         unsigned NumExprs);
5339   static ResolvedUnexpandedPackExpr *
5340   Create(ASTContext &C, SourceLocation BeginLoc, QualType T, unsigned NumExprs);
5341   static ResolvedUnexpandedPackExpr *Create(ASTContext &C,
5342                                             SourceLocation BeginLoc, QualType T,
5343                                             llvm::ArrayRef<Expr *> Exprs);
5344 
5345   unsigned getNumExprs() const { return NumExprs; }
5346 
5347   llvm::MutableArrayRef<Expr *> getExprs() {
5348     return {getTrailingObjects<Expr *>(), NumExprs};
5349   }
5350 
5351   llvm::ArrayRef<Expr *> getExprs() const {
5352     return {getTrailingObjects<Expr *>(), NumExprs};
5353   }
5354 
5355   Expr *getExpansion(unsigned Idx) { return getExprs()[Idx]; }
5356   Expr *getExpansion(unsigned Idx) const { return getExprs()[Idx]; }
5357 
5358   // Iterators
5359   child_range children() {
5360     return child_range((Stmt **)getTrailingObjects<Expr *>(),
5361                        (Stmt **)getTrailingObjects<Expr *>() + getNumExprs());
5362   }
5363 
5364   SourceLocation getBeginLoc() const LLVM_READONLY { return BeginLoc; }
5365   SourceLocation getEndLoc() const LLVM_READONLY { return BeginLoc; }
5366 
5367   // Returns the resolved pack of a decl or nullptr
5368   static ResolvedUnexpandedPackExpr *getFromDecl(Decl *);
5369 
5370   static bool classof(const Stmt *T) {
5371     return T->getStmtClass() == ResolvedUnexpandedPackExprClass;
5372   }
5373 };
5374 
5375 } // namespace clang
5376 
5377 #endif // LLVM_CLANG_AST_EXPRCXX_H
5378