clang  20.0.0git
ExprCXX.h
Go to the documentation of this file.
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"
19 #include "clang/AST/Decl.h"
20 #include "clang/AST/DeclBase.h"
21 #include "clang/AST/DeclCXX.h"
22 #include "clang/AST/DeclTemplate.h"
25 #include "clang/AST/Expr.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"
35 #include "clang/Basic/LLVM.h"
36 #include "clang/Basic/Lambda.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 
86 
87  // CXXOperatorCallExpr has some trailing objects belonging
88  // to CallExpr. See CallExpr for the details.
89 
90  SourceRange getSourceRangeImpl() const LLVM_READONLY;
91 
93  ArrayRef<Expr *> Args, QualType Ty, ExprValueKind VK,
94  SourceLocation OperatorLoc, FPOptionsOverride FPFeatures,
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,
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.
112  return static_cast<OverloadedOperatorKind>(
113  CXXOperatorCallExprBits.OperatorKind);
114  }
115 
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 
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.
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 
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,
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".
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 
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.
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;
296  }
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.
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 
323  static StringRef getOpcodeStr(BinaryOperatorKind Op) {
324  return BinaryOperator::getOpcodeStr(Op);
325  }
326  StringRef getOpcodeStr() const {
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 {
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 {
352  return SourceRange(DF.LHS->getBeginLoc(), DF.RHS->getEndLoc());
353  }
354  //@}
355 
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).
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 
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> {
435  unsigned pathSize, TypeSourceInfo *writtenTy,
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;
457 
458  static CXXStaticCastExpr *
459  Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K,
460  Expr *Op, const CXXCastPath *Path, TypeSourceInfo *Written,
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.
477  : public CXXNamedCastExpr,
478  private llvm::TrailingObjects<CXXDynamicCastExpr, CXXBaseSpecifier *> {
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;
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.
521  : public CXXNamedCastExpr,
522  private llvm::TrailingObjects<CXXReinterpretCastExpr,
523  CXXBaseSpecifier *> {
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;
539 
540  static CXXReinterpretCastExpr *Create(const ASTContext &Context, QualType T,
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 *> {
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 
572  : CXXNamedCastExpr(CXXConstCastExprClass, Empty, 0,
573  /*HasFPFeatures*/ false) {}
574 
575 public:
576  friend class CastExpr;
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.
600  : public CXXNamedCastExpr,
601  private llvm::TrailingObjects<CXXAddrspaceCastExpr, CXXBaseSpecifier *> {
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 
610  : CXXNamedCastExpr(CXXAddrspaceCastExprClass, Empty, 0,
611  /*HasFPFeatures*/ false) {}
612 
613 public:
614  friend class CastExpr;
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 
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.
666  /// Raw form: operator "" X (const char *)
668 
669  /// Raw form: operator "" X<cs...> ()
671 
672  /// operator "" X (unsigned long long)
674 
675  /// operator "" X (long double)
677 
678  /// operator "" X (const CharT *, size_t)
680 
681  /// operator "" X (CharT)
683  };
684 
685  /// Returns the kind of literal operator invocation
686  /// which this expression represents.
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).
693  const Expr *getCookedLiteral() const {
694  return const_cast<UserDefinedLiteral*>(this)->getCookedLiteral();
695  }
696 
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:
723  : Expr(CXXBoolLiteralExprClass, Ty, VK_PRValue, OK_Ordinary) {
724  CXXBoolLiteralExprBits.Value = Val;
727  }
728 
730  : Expr(CXXBoolLiteralExprClass, Empty) {}
731 
732  static CXXBoolLiteralExpr *Create(const ASTContext &C, bool Val, QualType Ty,
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 
745 
746  static bool classof(const Stmt *T) {
747  return T->getStmtClass() == CXXBoolLiteralExprClass;
748  }
749 
750  // Iterators
753  }
754 
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:
768  : Expr(CXXNullPtrLiteralExprClass, Ty, VK_PRValue, OK_Ordinary) {
771  }
772 
774  : Expr(CXXNullPtrLiteralExprClass, Empty) {}
775 
776  SourceLocation getBeginLoc() const { return getLocation(); }
777  SourceLocation getEndLoc() const { return getLocation(); }
778 
781 
782  static bool classof(const Stmt *T) {
783  return T->getStmtClass() == CXXNullPtrLiteralExprClass;
784  }
785 
788  }
789 
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).
798  Stmt *SubExpr = nullptr;
799 
801  : Expr(CXXStdInitializerListExprClass, Empty) {}
802 
803 public:
804  friend class ASTReader;
805  friend class ASTStmtReader;
806 
808  : Expr(CXXStdInitializerListExprClass, Ty, VK_PRValue, OK_Ordinary),
809  SubExpr(SubExpr) {
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 
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;
851 
852 public:
854  : Expr(CXXTypeidExprClass, Ty, VK_LValue, OK_Ordinary), Operand(Operand),
855  Range(R) {
857  }
858 
860  : Expr(CXXTypeidExprClass, Ty, VK_LValue, OK_Ordinary), Operand(Operand),
861  Range(R) {
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(ASTContext &Context) const;
880 
881  bool isTypeOperand() const { return Operand.is<TypeSourceInfo *>(); }
882 
883  /// Retrieves the type operand of this typeid() expression after
884  /// various required adjustments (removing reference types, cv-qualifiers).
885  QualType getTypeOperand(ASTContext &Context) const;
886 
887  /// Retrieve source information for the type operand.
889  assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
890  return Operand.get<TypeSourceInfo *>();
891  }
892  Expr *getExprOperand() const {
893  assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)");
894  return static_cast<Expr*>(Operand.get<Stmt *>());
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; }
901 
902  static bool classof(const Stmt *T) {
903  return T->getStmtClass() == CXXTypeidExprClass;
904  }
905 
906  // Iterators
908  if (isTypeOperand())
910  auto **begin = reinterpret_cast<Stmt **>(&Operand);
911  return child_range(begin, begin + 1);
912  }
913 
915  if (isTypeOperand())
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 
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) {
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 
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 
974  return child_range((Stmt**)&BaseExpr, (Stmt**)&BaseExpr + 1);
975  }
976 
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.
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:
1017  ExprObjectKind OK, SourceLocation RBracketLoc)
1018  : Expr(MSPropertySubscriptExprClass, Ty, VK, OK),
1019  RBracketLoc(RBracketLoc) {
1020  SubExprs[BASE_EXPR] = Base;
1021  SubExprs[IDX_EXPR] = Idx;
1023  }
1024 
1025  /// Create an empty array subscript expression.
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
1054  return child_range(&SubExprs[0], &SubExprs[0] + NUM_SUBEXPRS);
1055  }
1056 
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;
1073 
1074 public:
1076  SourceRange R)
1077  : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary), Operand(Operand),
1078  Guid(Guid), Range(R) {
1080  }
1081 
1083  : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary), Operand(Operand),
1084  Guid(Guid), Range(R) {
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 Operand.is<TypeSourceInfo *>(); }
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.
1104  assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)");
1105  return Operand.get<TypeSourceInfo *>();
1106  }
1108  assert(!isTypeOperand() && "Cannot call getExprOperand for __uuidof(type)");
1109  return static_cast<Expr*>(Operand.get<Stmt *>());
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; }
1118 
1119  static bool classof(const Stmt *T) {
1120  return T->getStmtClass() == CXXUuidofExprClass;
1121  }
1122 
1123  // Iterators
1125  if (isTypeOperand())
1127  auto **begin = reinterpret_cast<Stmt **>(&Operand);
1128  return child_range(begin, begin + 1);
1129  }
1130 
1132  if (isTypeOperand())
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;
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 
1171 
1173  SourceLocation getEndLoc() const { return getLocation(); }
1174 
1175  bool isImplicit() const { return CXXThisExprBits.IsImplicit; }
1176  void setImplicit(bool I) { CXXThisExprBits.IsImplicit = I; }
1177 
1179  return CXXThisExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter;
1180  }
1181 
1183  CXXThisExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter = Set;
1185  }
1186 
1187  static bool classof(const Stmt *T) {
1188  return T->getStmtClass() == CXXThisExprClass;
1189  }
1190 
1191  // Iterators
1194  }
1195 
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.
1218  bool IsThrownVariableInScope)
1219  : Expr(CXXThrowExprClass, Ty, VK_PRValue, OK_Ordinary), Operand(Operand) {
1220  CXXThrowExprBits.ThrowLoc = Loc;
1221  CXXThrowExprBits.IsThrownVariableInScope = IsThrownVariableInScope;
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.
1237  return CXXThrowExprBits.IsThrownVariableInScope;
1238  }
1239 
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
1253  return child_range(&Operand, Operand ? &Operand + 1 : &Operand);
1254  }
1255 
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.
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 
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;
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 
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.
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.
1343 
1344  /// Default argument expressions have no representation in the
1345  /// source, so they have an empty source range.
1348 
1350 
1351  static bool classof(const Stmt *T) {
1352  return T->getStmtClass() == CXXDefaultArgExprClass;
1353  }
1354 
1355  // Iterators
1358  }
1359 
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).
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 
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.
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.
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.
1438 
1441 
1442  static bool classof(const Stmt *T) {
1443  return T->getStmtClass() == CXXDefaultInitExprClass;
1444  }
1445 
1446  // Iterators
1449  }
1450 
1453  }
1454 };
1455 
1456 /// Represents a C++ temporary.
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) {
1500  }
1501 
1502 public:
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 
1534  return const_child_range(&SubExpr, &SubExpr + 1);
1535  }
1536 };
1537 
1539  Complete,
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.
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 
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  }
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  }
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.
1640  return CXXConstructExprBits.StdInitListInitialization;
1641  }
1643  CXXConstructExprBits.StdInitListInitialization = V;
1644  }
1645 
1646  /// Whether this construction first requires
1647  /// zero-initialization before the initializer is called.
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).
1658  return static_cast<CXXConstructionKind>(
1659  CXXConstructExprBits.ConstructionKind);
1660  }
1662  CXXConstructExprBits.ConstructionKind = llvm::to_underlying(CK);
1663  }
1664 
1667  using arg_range = llvm::iterator_range<arg_iterator>;
1668  using const_arg_range = llvm::iterator_range<const_arg_iterator>;
1669 
1672  return const_arg_range(arg_begin(), arg_end());
1673  }
1674 
1675  arg_iterator arg_begin() { return getTrailingArgs(); }
1677  const_arg_iterator arg_begin() const { return getTrailingArgs(); }
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
1724  return child_range(getTrailingArgs(), getTrailingArgs() + getNumArgs());
1725  }
1726 
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.
1738 private:
1739  CXXConstructorDecl *Constructor = nullptr;
1740 
1741  /// The location of the using declaration.
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.
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());
1766  }
1767 
1768  /// Construct an empty C++ inheriting construction expression.
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; }
1780  return ConstructsVirtualBase ? CXXConstructionKind::VirtualBase
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 
1800  }
1801 
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
1815  : public ExplicitCastExpr,
1816  private llvm::TrailingObjects<CXXFunctionalCastExpr, CXXBaseSpecifier *,
1817  FPOptionsOverride> {
1818  SourceLocation LParenLoc;
1819  SourceLocation RParenLoc;
1820 
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;
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
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 
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;
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.
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.
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.
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.
2039 
2040  /// Retrieve an iterator pointing to the first explicit
2041  /// lambda capture.
2043 
2044  /// Retrieve an iterator pointing past the end of the sequence of
2045  /// explicit lambda captures.
2047 
2048  /// Retrieve this lambda's implicit captures.
2050 
2051  /// Retrieve an iterator pointing to the first implicit
2052  /// lambda capture.
2054 
2055  /// Retrieve an iterator pointing past the end of the sequence of
2056  /// implicit lambda captures.
2058 
2059  /// Iterator that walks over the capture initialization
2060  /// arguments.
2062 
2063  /// Const iterator that walks over the capture initialization
2064  /// arguments.
2065  /// FIXME: This interface is prone to being used incorrectly.
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).
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).
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.
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.
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.
2121 
2122  /// If this is a generic lambda expression, retrieve the template
2123  /// parameter list associated with it, or else return null.
2125 
2126  /// Get the template parameters were explicitly specified (as opposed to being
2127  /// invented by use of an auto parameter).
2129 
2130  /// Get the trailing requires clause, if any.
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;
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.
2176  const_child_range children() const;
2177 };
2178 
2179 /// An expression "T()" which creates a value-initialized rvalue of type
2180 /// T, which is a non-class type. See (C++98 [5.2.3p2]).
2182  friend class ASTStmtReader;
2183 
2185 
2186 public:
2187  /// Create an explicitly-written scalar-value initialization
2188  /// expression.
2190  SourceLocation RParenLoc)
2191  : Expr(CXXScalarValueInitExprClass, Type, VK_PRValue, OK_Ordinary),
2192  TypeInfo(TypeInfo) {
2193  CXXScalarValueInitExprBits.RParenLoc = RParenLoc;
2195  }
2196 
2198  : Expr(CXXScalarValueInitExprClass, Shell) {}
2199 
2201  return TypeInfo;
2202  }
2203 
2205  return CXXScalarValueInitExprBits.RParenLoc;
2206  }
2207 
2208  SourceLocation getBeginLoc() const LLVM_READONLY;
2209  SourceLocation getEndLoc() const { return getRParenLoc(); }
2210 
2211  static bool classof(const Stmt *T) {
2212  return T->getStmtClass() == CXXScalarValueInitExprClass;
2213  }
2214 
2215  // Iterators
2218  }
2219 
2222  }
2223 };
2224 
2226  /// New-expression has no initializer as written.
2227  None,
2228 
2229  /// New-expression has a C++98 paren-delimited initializer.
2230  Parens,
2231 
2232  /// New-expression has a C++11 list-initializer.
2233  Braces
2234 };
2235 
2236 /// Represents a new-expression for memory allocation and constructor
2237 /// calls, e.g: "new CXXNewExpr(foo)".
2238 class CXXNewExpr final
2239  : public Expr,
2240  private llvm::TrailingObjects<CXXNewExpr, Stmt *, SourceRange> {
2241  friend class ASTStmtReader;
2242  friend class ASTStmtWriter;
2243  friend TrailingObjects;
2244 
2245  /// Points to the allocation function used.
2246  FunctionDecl *OperatorNew;
2247 
2248  /// Points to the deallocation function used in case of error. May be null.
2249  FunctionDecl *OperatorDelete;
2250 
2251  /// The allocated type-source information, as written in the source.
2252  TypeSourceInfo *AllocatedTypeInfo;
2253 
2254  /// Range of the entire new expression.
2256 
2257  /// Source-range of a paren-delimited initializer.
2258  SourceRange DirectInitRange;
2259 
2260  // CXXNewExpr is followed by several optional trailing objects.
2261  // They are in order:
2262  //
2263  // * An optional "Stmt *" for the array size expression.
2264  // Present if and ony if isArray().
2265  //
2266  // * An optional "Stmt *" for the init expression.
2267  // Present if and only if hasInitializer().
2268  //
2269  // * An array of getNumPlacementArgs() "Stmt *" for the placement new
2270  // arguments, if any.
2271  //
2272  // * An optional SourceRange for the range covering the parenthesized type-id
2273  // if the allocated type was expressed as a parenthesized type-id.
2274  // Present if and only if isParenTypeId().
2275  unsigned arraySizeOffset() const { return 0; }
2276  unsigned initExprOffset() const { return arraySizeOffset() + isArray(); }
2277  unsigned placementNewArgsOffset() const {
2278  return initExprOffset() + hasInitializer();
2279  }
2280 
2281  unsigned numTrailingObjects(OverloadToken<Stmt *>) const {
2282  return isArray() + hasInitializer() + getNumPlacementArgs();
2283  }
2284 
2285  unsigned numTrailingObjects(OverloadToken<SourceRange>) const {
2286  return isParenTypeId();
2287  }
2288 
2289  /// Build a c++ new expression.
2290  CXXNewExpr(bool IsGlobalNew, FunctionDecl *OperatorNew,
2291  FunctionDecl *OperatorDelete, bool ShouldPassAlignment,
2292  bool UsualArrayDeleteWantsSize, ArrayRef<Expr *> PlacementArgs,
2293  SourceRange TypeIdParens, std::optional<Expr *> ArraySize,
2294  CXXNewInitializationStyle InitializationStyle, Expr *Initializer,
2295  QualType Ty, TypeSourceInfo *AllocatedTypeInfo, SourceRange Range,
2296  SourceRange DirectInitRange);
2297 
2298  /// Build an empty c++ new expression.
2299  CXXNewExpr(EmptyShell Empty, bool IsArray, unsigned NumPlacementArgs,
2300  bool IsParenTypeId);
2301 
2302 public:
2303  /// Create a c++ new expression.
2304  static CXXNewExpr *
2305  Create(const ASTContext &Ctx, bool IsGlobalNew, FunctionDecl *OperatorNew,
2306  FunctionDecl *OperatorDelete, bool ShouldPassAlignment,
2307  bool UsualArrayDeleteWantsSize, ArrayRef<Expr *> PlacementArgs,
2308  SourceRange TypeIdParens, std::optional<Expr *> ArraySize,
2309  CXXNewInitializationStyle InitializationStyle, Expr *Initializer,
2310  QualType Ty, TypeSourceInfo *AllocatedTypeInfo, SourceRange Range,
2311  SourceRange DirectInitRange);
2312 
2313  /// Create an empty c++ new expression.
2314  static CXXNewExpr *CreateEmpty(const ASTContext &Ctx, bool IsArray,
2315  bool HasInit, unsigned NumPlacementArgs,
2316  bool IsParenTypeId);
2317 
2319  return getType()->castAs<PointerType>()->getPointeeType();
2320  }
2321 
2323  return AllocatedTypeInfo;
2324  }
2325 
2326  /// True if the allocation result needs to be null-checked.
2327  ///
2328  /// C++11 [expr.new]p13:
2329  /// If the allocation function returns null, initialization shall
2330  /// not be done, the deallocation function shall not be called,
2331  /// and the value of the new-expression shall be null.
2332  ///
2333  /// C++ DR1748:
2334  /// If the allocation function is a reserved placement allocation
2335  /// function that returns null, the behavior is undefined.
2336  ///
2337  /// An allocation function is not allowed to return null unless it
2338  /// has a non-throwing exception-specification. The '03 rule is
2339  /// identical except that the definition of a non-throwing
2340  /// exception specification is just "is it throw()?".
2341  bool shouldNullCheckAllocation() const;
2342 
2343  FunctionDecl *getOperatorNew() const { return OperatorNew; }
2344  void setOperatorNew(FunctionDecl *D) { OperatorNew = D; }
2345  FunctionDecl *getOperatorDelete() const { return OperatorDelete; }
2346  void setOperatorDelete(FunctionDecl *D) { OperatorDelete = D; }
2347 
2348  bool isArray() const { return CXXNewExprBits.IsArray; }
2349 
2350  /// This might return std::nullopt even if isArray() returns true,
2351  /// since there might not be an array size expression.
2352  /// If the result is not std::nullopt, it will never wrap a nullptr.
2353  std::optional<Expr *> getArraySize() {
2354  if (!isArray())
2355  return std::nullopt;
2356 
2357  if (auto *Result =
2358  cast_or_null<Expr>(getTrailingObjects<Stmt *>()[arraySizeOffset()]))
2359  return Result;
2360 
2361  return std::nullopt;
2362  }
2363 
2364  /// This might return std::nullopt even if isArray() returns true,
2365  /// since there might not be an array size expression.
2366  /// If the result is not std::nullopt, it will never wrap a nullptr.
2367  std::optional<const Expr *> getArraySize() const {
2368  if (!isArray())
2369  return std::nullopt;
2370 
2371  if (auto *Result =
2372  cast_or_null<Expr>(getTrailingObjects<Stmt *>()[arraySizeOffset()]))
2373  return Result;
2374 
2375  return std::nullopt;
2376  }
2377 
2378  unsigned getNumPlacementArgs() const {
2379  return CXXNewExprBits.NumPlacementArgs;
2380  }
2381 
2383  return reinterpret_cast<Expr **>(getTrailingObjects<Stmt *>() +
2384  placementNewArgsOffset());
2385  }
2386 
2387  Expr *getPlacementArg(unsigned I) {
2388  assert((I < getNumPlacementArgs()) && "Index out of range!");
2389  return getPlacementArgs()[I];
2390  }
2391  const Expr *getPlacementArg(unsigned I) const {
2392  return const_cast<CXXNewExpr *>(this)->getPlacementArg(I);
2393  }
2394 
2395  bool isParenTypeId() const { return CXXNewExprBits.IsParenTypeId; }
2397  return isParenTypeId() ? getTrailingObjects<SourceRange>()[0]
2398  : SourceRange();
2399  }
2400 
2401  bool isGlobalNew() const { return CXXNewExprBits.IsGlobalNew; }
2402 
2403  /// Whether this new-expression has any initializer at all.
2404  bool hasInitializer() const { return CXXNewExprBits.HasInitializer; }
2405 
2406  /// The kind of initializer this new-expression has.
2408  return static_cast<CXXNewInitializationStyle>(
2409  CXXNewExprBits.StoredInitializationStyle);
2410  }
2411 
2412  /// The initializer of this new-expression.
2414  return hasInitializer()
2415  ? cast<Expr>(getTrailingObjects<Stmt *>()[initExprOffset()])
2416  : nullptr;
2417  }
2418  const Expr *getInitializer() const {
2419  return hasInitializer()
2420  ? cast<Expr>(getTrailingObjects<Stmt *>()[initExprOffset()])
2421  : nullptr;
2422  }
2423 
2424  /// Returns the CXXConstructExpr from this new-expression, or null.
2426  return dyn_cast_or_null<CXXConstructExpr>(getInitializer());
2427  }
2428 
2429  /// Indicates whether the required alignment should be implicitly passed to
2430  /// the allocation function.
2431  bool passAlignment() const { return CXXNewExprBits.ShouldPassAlignment; }
2432 
2433  /// Answers whether the usual array deallocation function for the
2434  /// allocated type expects the size of the allocation as a
2435  /// parameter.
2437  return CXXNewExprBits.UsualArrayDeleteWantsSize;
2438  }
2439 
2442 
2443  llvm::iterator_range<arg_iterator> placement_arguments() {
2444  return llvm::make_range(placement_arg_begin(), placement_arg_end());
2445  }
2446 
2447  llvm::iterator_range<const_arg_iterator> placement_arguments() const {
2448  return llvm::make_range(placement_arg_begin(), placement_arg_end());
2449  }
2450 
2452  return getTrailingObjects<Stmt *>() + placementNewArgsOffset();
2453  }
2456  }
2458  return getTrailingObjects<Stmt *>() + placementNewArgsOffset();
2459  }
2462  }
2463 
2465 
2466  raw_arg_iterator raw_arg_begin() { return getTrailingObjects<Stmt *>(); }
2468  return raw_arg_begin() + numTrailingObjects(OverloadToken<Stmt *>());
2469  }
2471  return getTrailingObjects<Stmt *>();
2472  }
2474  return raw_arg_begin() + numTrailingObjects(OverloadToken<Stmt *>());
2475  }
2476 
2477  SourceLocation getBeginLoc() const { return Range.getBegin(); }
2478  SourceLocation getEndLoc() const { return Range.getEnd(); }
2479 
2480  SourceRange getDirectInitRange() const { return DirectInitRange; }
2481  SourceRange getSourceRange() const { return Range; }
2482 
2483  static bool classof(const Stmt *T) {
2484  return T->getStmtClass() == CXXNewExprClass;
2485  }
2486 
2487  // Iterators
2489 
2491  return const_child_range(const_cast<CXXNewExpr *>(this)->children());
2492  }
2493 };
2494 
2495 /// Represents a \c delete expression for memory deallocation and
2496 /// destructor calls, e.g. "delete[] pArray".
2497 class CXXDeleteExpr : public Expr {
2498  friend class ASTStmtReader;
2499 
2500  /// Points to the operator delete overload that is used. Could be a member.
2501  FunctionDecl *OperatorDelete = nullptr;
2502 
2503  /// The pointer expression to be deleted.
2504  Stmt *Argument = nullptr;
2505 
2506 public:
2507  CXXDeleteExpr(QualType Ty, bool GlobalDelete, bool ArrayForm,
2508  bool ArrayFormAsWritten, bool UsualArrayDeleteWantsSize,
2509  FunctionDecl *OperatorDelete, Expr *Arg, SourceLocation Loc)
2510  : Expr(CXXDeleteExprClass, Ty, VK_PRValue, OK_Ordinary),
2511  OperatorDelete(OperatorDelete), Argument(Arg) {
2512  CXXDeleteExprBits.GlobalDelete = GlobalDelete;
2513  CXXDeleteExprBits.ArrayForm = ArrayForm;
2514  CXXDeleteExprBits.ArrayFormAsWritten = ArrayFormAsWritten;
2515  CXXDeleteExprBits.UsualArrayDeleteWantsSize = UsualArrayDeleteWantsSize;
2516  CXXDeleteExprBits.Loc = Loc;
2518  }
2519 
2520  explicit CXXDeleteExpr(EmptyShell Shell) : Expr(CXXDeleteExprClass, Shell) {}
2521 
2522  bool isGlobalDelete() const { return CXXDeleteExprBits.GlobalDelete; }
2523  bool isArrayForm() const { return CXXDeleteExprBits.ArrayForm; }
2524  bool isArrayFormAsWritten() const {
2525  return CXXDeleteExprBits.ArrayFormAsWritten;
2526  }
2527 
2528  /// Answers whether the usual array deallocation function for the
2529  /// allocated type expects the size of the allocation as a
2530  /// parameter. This can be true even if the actual deallocation
2531  /// function that we're using doesn't want a size.
2533  return CXXDeleteExprBits.UsualArrayDeleteWantsSize;
2534  }
2535 
2536  FunctionDecl *getOperatorDelete() const { return OperatorDelete; }
2537 
2538  Expr *getArgument() { return cast<Expr>(Argument); }
2539  const Expr *getArgument() const { return cast<Expr>(Argument); }
2540 
2541  /// Retrieve the type being destroyed.
2542  ///
2543  /// If the type being destroyed is a dependent type which may or may not
2544  /// be a pointer, return an invalid type.
2545  QualType getDestroyedType() const;
2546 
2548  SourceLocation getEndLoc() const LLVM_READONLY {
2549  return Argument->getEndLoc();
2550  }
2551 
2552  static bool classof(const Stmt *T) {
2553  return T->getStmtClass() == CXXDeleteExprClass;
2554  }
2555 
2556  // Iterators
2557  child_range children() { return child_range(&Argument, &Argument + 1); }
2558 
2560  return const_child_range(&Argument, &Argument + 1);
2561  }
2562 };
2563 
2564 /// Stores the type being destroyed by a pseudo-destructor expression.
2566  /// Either the type source information or the name of the type, if
2567  /// it couldn't be resolved due to type-dependence.
2568  llvm::PointerUnion<TypeSourceInfo *, const IdentifierInfo *> Type;
2569 
2570  /// The starting source location of the pseudo-destructor type.
2571  SourceLocation Location;
2572 
2573 public:
2575 
2577  : Type(II), Location(Loc) {}
2578 
2580 
2582  return Type.dyn_cast<TypeSourceInfo *>();
2583  }
2584 
2586  return Type.dyn_cast<const IdentifierInfo *>();
2587  }
2588 
2589  SourceLocation getLocation() const { return Location; }
2590 };
2591 
2592 /// Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
2593 ///
2594 /// A pseudo-destructor is an expression that looks like a member access to a
2595 /// destructor of a scalar type, except that scalar types don't have
2596 /// destructors. For example:
2597 ///
2598 /// \code
2599 /// typedef int T;
2600 /// void f(int *p) {
2601 /// p->T::~T();
2602 /// }
2603 /// \endcode
2604 ///
2605 /// Pseudo-destructors typically occur when instantiating templates such as:
2606 ///
2607 /// \code
2608 /// template<typename T>
2609 /// void destroy(T* ptr) {
2610 /// ptr->T::~T();
2611 /// }
2612 /// \endcode
2613 ///
2614 /// for scalar types. A pseudo-destructor expression has no run-time semantics
2615 /// beyond evaluating the base expression.
2617  friend class ASTStmtReader;
2618 
2619  /// The base expression (that is being destroyed).
2620  Stmt *Base = nullptr;
2621 
2622  /// Whether the operator was an arrow ('->'); otherwise, it was a
2623  /// period ('.').
2624  LLVM_PREFERRED_TYPE(bool)
2625  bool IsArrow : 1;
2626 
2627  /// The location of the '.' or '->' operator.
2628  SourceLocation OperatorLoc;
2629 
2630  /// The nested-name-specifier that follows the operator, if present.
2631  NestedNameSpecifierLoc QualifierLoc;
2632 
2633  /// The type that precedes the '::' in a qualified pseudo-destructor
2634  /// expression.
2635  TypeSourceInfo *ScopeType = nullptr;
2636 
2637  /// The location of the '::' in a qualified pseudo-destructor
2638  /// expression.
2639  SourceLocation ColonColonLoc;
2640 
2641  /// The location of the '~'.
2642  SourceLocation TildeLoc;
2643 
2644  /// The type being destroyed, or its name if we were unable to
2645  /// resolve the name.
2646  PseudoDestructorTypeStorage DestroyedType;
2647 
2648 public:
2649  CXXPseudoDestructorExpr(const ASTContext &Context,
2650  Expr *Base, bool isArrow, SourceLocation OperatorLoc,
2651  NestedNameSpecifierLoc QualifierLoc,
2653  SourceLocation ColonColonLoc,
2654  SourceLocation TildeLoc,
2655  PseudoDestructorTypeStorage DestroyedType);
2656 
2658  : Expr(CXXPseudoDestructorExprClass, Shell), IsArrow(false) {}
2659 
2660  Expr *getBase() const { return cast<Expr>(Base); }
2661 
2662  /// Determines whether this member expression actually had
2663  /// a C++ nested-name-specifier prior to the name of the member, e.g.,
2664  /// x->Base::foo.
2665  bool hasQualifier() const { return QualifierLoc.hasQualifier(); }
2666 
2667  /// Retrieves the nested-name-specifier that qualifies the type name,
2668  /// with source-location information.
2669  NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
2670 
2671  /// If the member name was qualified, retrieves the
2672  /// nested-name-specifier that precedes the member name. Otherwise, returns
2673  /// null.
2675  return QualifierLoc.getNestedNameSpecifier();
2676  }
2677 
2678  /// Determine whether this pseudo-destructor expression was written
2679  /// using an '->' (otherwise, it used a '.').
2680  bool isArrow() const { return IsArrow; }
2681 
2682  /// Retrieve the location of the '.' or '->' operator.
2683  SourceLocation getOperatorLoc() const { return OperatorLoc; }
2684 
2685  /// Retrieve the scope type in a qualified pseudo-destructor
2686  /// expression.
2687  ///
2688  /// Pseudo-destructor expressions can have extra qualification within them
2689  /// that is not part of the nested-name-specifier, e.g., \c p->T::~T().
2690  /// Here, if the object type of the expression is (or may be) a scalar type,
2691  /// \p T may also be a scalar type and, therefore, cannot be part of a
2692  /// nested-name-specifier. It is stored as the "scope type" of the pseudo-
2693  /// destructor expression.
2695 
2696  /// Retrieve the location of the '::' in a qualified pseudo-destructor
2697  /// expression.
2698  SourceLocation getColonColonLoc() const { return ColonColonLoc; }
2699 
2700  /// Retrieve the location of the '~'.
2701  SourceLocation getTildeLoc() const { return TildeLoc; }
2702 
2703  /// Retrieve the source location information for the type
2704  /// being destroyed.
2705  ///
2706  /// This type-source information is available for non-dependent
2707  /// pseudo-destructor expressions and some dependent pseudo-destructor
2708  /// expressions. Returns null if we only have the identifier for a
2709  /// dependent pseudo-destructor expression.
2711  return DestroyedType.getTypeSourceInfo();
2712  }
2713 
2714  /// In a dependent pseudo-destructor expression for which we do not
2715  /// have full type information on the destroyed type, provides the name
2716  /// of the destroyed type.
2718  return DestroyedType.getIdentifier();
2719  }
2720 
2721  /// Retrieve the type being destroyed.
2722  QualType getDestroyedType() const;
2723 
2724  /// Retrieve the starting location of the type being destroyed.
2726  return DestroyedType.getLocation();
2727  }
2728 
2729  /// Set the name of destroyed type for a dependent pseudo-destructor
2730  /// expression.
2732  DestroyedType = PseudoDestructorTypeStorage(II, Loc);
2733  }
2734 
2735  /// Set the destroyed type.
2737  DestroyedType = PseudoDestructorTypeStorage(Info);
2738  }
2739 
2740  SourceLocation getBeginLoc() const LLVM_READONLY {
2741  return Base->getBeginLoc();
2742  }
2743  SourceLocation getEndLoc() const LLVM_READONLY;
2744 
2745  static bool classof(const Stmt *T) {
2746  return T->getStmtClass() == CXXPseudoDestructorExprClass;
2747  }
2748 
2749  // Iterators
2750  child_range children() { return child_range(&Base, &Base + 1); }
2751 
2753  return const_child_range(&Base, &Base + 1);
2754  }
2755 };
2756 
2757 /// A type trait used in the implementation of various C++11 and
2758 /// Library TR1 trait templates.
2759 ///
2760 /// \code
2761 /// __is_pod(int) == true
2762 /// __is_enum(std::string) == false
2763 /// __is_trivially_constructible(vector<int>, int*, int*)
2764 /// \endcode
2765 class TypeTraitExpr final
2766  : public Expr,
2767  private llvm::TrailingObjects<TypeTraitExpr, TypeSourceInfo *> {
2768  /// The location of the type trait keyword.
2770 
2771  /// The location of the closing parenthesis.
2772  SourceLocation RParenLoc;
2773 
2774  // Note: The TypeSourceInfos for the arguments are allocated after the
2775  // TypeTraitExpr.
2776 
2779  SourceLocation RParenLoc,
2780  bool Value);
2781 
2782  TypeTraitExpr(EmptyShell Empty) : Expr(TypeTraitExprClass, Empty) {}
2783 
2784  size_t numTrailingObjects(OverloadToken<TypeSourceInfo *>) const {
2785  return getNumArgs();
2786  }
2787 
2788 public:
2789  friend class ASTStmtReader;
2790  friend class ASTStmtWriter;
2792 
2793  /// Create a new type trait expression.
2794  static TypeTraitExpr *Create(const ASTContext &C, QualType T,
2797  SourceLocation RParenLoc,
2798  bool Value);
2799 
2801  unsigned NumArgs);
2802 
2803  /// Determine which type trait this expression uses.
2805  return static_cast<TypeTrait>(TypeTraitExprBits.Kind);
2806  }
2807 
2808  bool getValue() const {
2809  assert(!isValueDependent());
2810  return TypeTraitExprBits.Value;
2811  }
2812 
2813  /// Determine the number of arguments to this type trait.
2814  unsigned getNumArgs() const { return TypeTraitExprBits.NumArgs; }
2815 
2816  /// Retrieve the Ith argument.
2817  TypeSourceInfo *getArg(unsigned I) const {
2818  assert(I < getNumArgs() && "Argument out-of-range");
2819  return getArgs()[I];
2820  }
2821 
2822  /// Retrieve the argument types.
2824  return llvm::ArrayRef(getTrailingObjects<TypeSourceInfo *>(), getNumArgs());
2825  }
2826 
2827  SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
2828  SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
2829 
2830  static bool classof(const Stmt *T) {
2831  return T->getStmtClass() == TypeTraitExprClass;
2832  }
2833 
2834  // Iterators
2837  }
2838 
2841  }
2842 };
2843 
2844 /// An Embarcadero array type trait, as used in the implementation of
2845 /// __array_rank and __array_extent.
2846 ///
2847 /// Example:
2848 /// \code
2849 /// __array_rank(int[10][20]) == 2
2850 /// __array_extent(int, 1) == 20
2851 /// \endcode
2852 class ArrayTypeTraitExpr : public Expr {
2853  /// The trait. An ArrayTypeTrait enum in MSVC compat unsigned.
2854  LLVM_PREFERRED_TYPE(ArrayTypeTrait)
2855  unsigned ATT : 2;
2856 
2857  /// The value of the type trait. Unspecified if dependent.
2858  uint64_t Value = 0;
2859 
2860  /// The array dimension being queried, or -1 if not used.
2861  Expr *Dimension;
2862 
2863  /// The location of the type trait keyword.
2865 
2866  /// The location of the closing paren.
2867  SourceLocation RParen;
2868 
2869  /// The type being queried.
2870  TypeSourceInfo *QueriedType = nullptr;
2871 
2872 public:
2873  friend class ASTStmtReader;
2874 
2876  TypeSourceInfo *queried, uint64_t value, Expr *dimension,
2877  SourceLocation rparen, QualType ty)
2878  : Expr(ArrayTypeTraitExprClass, ty, VK_PRValue, OK_Ordinary), ATT(att),
2879  Value(value), Dimension(dimension), Loc(loc), RParen(rparen),
2880  QueriedType(queried) {
2881  assert(att <= ATT_Last && "invalid enum value!");
2882  assert(static_cast<unsigned>(att) == ATT && "ATT overflow!");
2884  }
2885 
2887  : Expr(ArrayTypeTraitExprClass, Empty), ATT(0) {}
2888 
2889  SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
2890  SourceLocation getEndLoc() const LLVM_READONLY { return RParen; }
2891 
2892  ArrayTypeTrait getTrait() const { return static_cast<ArrayTypeTrait>(ATT); }
2893 
2894  QualType getQueriedType() const { return QueriedType->getType(); }
2895 
2896  TypeSourceInfo *getQueriedTypeSourceInfo() const { return QueriedType; }
2897 
2898  uint64_t getValue() const { assert(!isTypeDependent()); return Value; }
2899 
2900  Expr *getDimensionExpression() const { return Dimension; }
2901 
2902  static bool classof(const Stmt *T) {
2903  return T->getStmtClass() == ArrayTypeTraitExprClass;
2904  }
2905 
2906  // Iterators
2909  }
2910 
2913  }
2914 };
2915 
2916 /// An expression trait intrinsic.
2917 ///
2918 /// Example:
2919 /// \code
2920 /// __is_lvalue_expr(std::cout) == true
2921 /// __is_lvalue_expr(1) == false
2922 /// \endcode
2923 class ExpressionTraitExpr : public Expr {
2924  /// The trait. A ExpressionTrait enum in MSVC compatible unsigned.
2925  LLVM_PREFERRED_TYPE(ExpressionTrait)
2926  unsigned ET : 31;
2927 
2928  /// The value of the type trait. Unspecified if dependent.
2929  LLVM_PREFERRED_TYPE(bool)
2930  unsigned Value : 1;
2931 
2932  /// The location of the type trait keyword.
2934 
2935  /// The location of the closing paren.
2936  SourceLocation RParen;
2937 
2938  /// The expression being queried.
2939  Expr* QueriedExpression = nullptr;
2940 
2941 public:
2942  friend class ASTStmtReader;
2943 
2945  bool value, SourceLocation rparen, QualType resultType)
2946  : Expr(ExpressionTraitExprClass, resultType, VK_PRValue, OK_Ordinary),
2947  ET(et), Value(value), Loc(loc), RParen(rparen),
2948  QueriedExpression(queried) {
2949  assert(et <= ET_Last && "invalid enum value!");
2950  assert(static_cast<unsigned>(et) == ET && "ET overflow!");
2952  }
2953 
2955  : Expr(ExpressionTraitExprClass, Empty), ET(0), Value(false) {}
2956 
2957  SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
2958  SourceLocation getEndLoc() const LLVM_READONLY { return RParen; }
2959 
2960  ExpressionTrait getTrait() const { return static_cast<ExpressionTrait>(ET); }
2961 
2962  Expr *getQueriedExpression() const { return QueriedExpression; }
2963 
2964  bool getValue() const { return Value; }
2965 
2966  static bool classof(const Stmt *T) {
2967  return T->getStmtClass() == ExpressionTraitExprClass;
2968  }
2969 
2970  // Iterators
2973  }
2974 
2977  }
2978 };
2979 
2980 /// A reference to an overloaded function set, either an
2981 /// \c UnresolvedLookupExpr or an \c UnresolvedMemberExpr.
2982 class OverloadExpr : public Expr {
2983  friend class ASTStmtReader;
2984  friend class ASTStmtWriter;
2985 
2986  /// The common name of these declarations.
2987  DeclarationNameInfo NameInfo;
2988 
2989  /// The nested-name-specifier that qualifies the name, if any.
2990  NestedNameSpecifierLoc QualifierLoc;
2991 
2992 protected:
2993  OverloadExpr(StmtClass SC, const ASTContext &Context,
2994  NestedNameSpecifierLoc QualifierLoc,
2995  SourceLocation TemplateKWLoc,
2996  const DeclarationNameInfo &NameInfo,
2997  const TemplateArgumentListInfo *TemplateArgs,
2999  bool KnownDependent, bool KnownInstantiationDependent,
3000  bool KnownContainsUnexpandedParameterPack);
3001 
3002  OverloadExpr(StmtClass SC, EmptyShell Empty, unsigned NumResults,
3003  bool HasTemplateKWAndArgsInfo);
3004 
3005  /// Return the results. Defined after UnresolvedMemberExpr.
3008  return const_cast<OverloadExpr *>(this)->getTrailingResults();
3009  }
3010 
3011  /// Return the optional template keyword and arguments info.
3012  /// Defined after UnresolvedMemberExpr.
3015  return const_cast<OverloadExpr *>(this)
3017  }
3018 
3019  /// Return the optional template arguments. Defined after
3020  /// UnresolvedMemberExpr.
3023  return const_cast<OverloadExpr *>(this)->getTrailingTemplateArgumentLoc();
3024  }
3025 
3027  return OverloadExprBits.HasTemplateKWAndArgsInfo;
3028  }
3029 
3030 public:
3031  struct FindResult {
3033  bool IsAddressOfOperand = false;
3036  };
3037 
3038  /// Finds the overloaded expression in the given expression \p E of
3039  /// OverloadTy.
3040  ///
3041  /// \return the expression (which must be there) and true if it has
3042  /// the particular form of a member pointer expression
3043  static FindResult find(Expr *E) {
3044  assert(E->getType()->isSpecificBuiltinType(BuiltinType::Overload));
3045 
3046  FindResult Result;
3047  bool HasParen = isa<ParenExpr>(E);
3048 
3049  E = E->IgnoreParens();
3050  if (isa<UnaryOperator>(E)) {
3051  assert(cast<UnaryOperator>(E)->getOpcode() == UO_AddrOf);
3052  E = cast<UnaryOperator>(E)->getSubExpr();
3053  auto *Ovl = cast<OverloadExpr>(E->IgnoreParens());
3054 
3055  Result.HasFormOfMemberPointer = (E == Ovl && Ovl->getQualifier());
3056  Result.IsAddressOfOperand = true;
3057  Result.IsAddressOfOperandWithParen = HasParen;
3058  Result.Expression = Ovl;
3059  } else {
3060  Result.Expression = cast<OverloadExpr>(E);
3061  }
3062 
3063  return Result;
3064  }
3065 
3066  /// Gets the naming class of this lookup, if any.
3067  /// Defined after UnresolvedMemberExpr.
3068  inline CXXRecordDecl *getNamingClass();
3070  return const_cast<OverloadExpr *>(this)->getNamingClass();
3071  }
3072 
3074 
3077  }
3080  }
3081  llvm::iterator_range<decls_iterator> decls() const {
3082  return llvm::make_range(decls_begin(), decls_end());
3083  }
3084 
3085  /// Gets the number of declarations in the unresolved set.
3086  unsigned getNumDecls() const { return OverloadExprBits.NumResults; }
3087 
3088  /// Gets the full name info.
3089  const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
3090 
3091  /// Gets the name looked up.
3092  DeclarationName getName() const { return NameInfo.getName(); }
3093 
3094  /// Gets the location of the name.
3095  SourceLocation getNameLoc() const { return NameInfo.getLoc(); }
3096 
3097  /// Fetches the nested-name qualifier, if one was given.
3099  return QualifierLoc.getNestedNameSpecifier();
3100  }
3101 
3102  /// Fetches the nested-name qualifier with source-location
3103  /// information, if one was given.
3104  NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
3105 
3106  /// Retrieve the location of the template keyword preceding
3107  /// this name, if any.
3109  if (!hasTemplateKWAndArgsInfo())
3110  return SourceLocation();
3112  }
3113 
3114  /// Retrieve the location of the left angle bracket starting the
3115  /// explicit template argument list following the name, if any.
3117  if (!hasTemplateKWAndArgsInfo())
3118  return SourceLocation();
3120  }
3121 
3122  /// Retrieve the location of the right angle bracket ending the
3123  /// explicit template argument list following the name, if any.
3125  if (!hasTemplateKWAndArgsInfo())
3126  return SourceLocation();
3128  }
3129 
3130  /// Determines whether the name was preceded by the template keyword.
3131  bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
3132 
3133  /// Determines whether this expression had explicit template arguments.
3134  bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
3135 
3137  if (!hasExplicitTemplateArgs())
3138  return nullptr;
3139  return const_cast<OverloadExpr *>(this)->getTrailingTemplateArgumentLoc();
3140  }
3141 
3142  unsigned getNumTemplateArgs() const {
3143  if (!hasExplicitTemplateArgs())
3144  return 0;
3145 
3147  }
3148 
3150  return {getTemplateArgs(), getNumTemplateArgs()};
3151  }
3152 
3153  /// Copies the template arguments into the given structure.
3157  }
3158 
3159  static bool classof(const Stmt *T) {
3160  return T->getStmtClass() == UnresolvedLookupExprClass ||
3161  T->getStmtClass() == UnresolvedMemberExprClass;
3162  }
3163 };
3164 
3165 /// A reference to a name which we were able to look up during
3166 /// parsing but could not resolve to a specific declaration.
3167 ///
3168 /// This arises in several ways:
3169 /// * we might be waiting for argument-dependent lookup;
3170 /// * the name might resolve to an overloaded function;
3171 /// * the name might resolve to a non-function template; for example, in the
3172 /// following snippet, the return expression of the member function
3173 /// 'foo()' might remain unresolved until instantiation:
3174 ///
3175 /// \code
3176 /// struct P {
3177 /// template <class T> using I = T;
3178 /// };
3179 ///
3180 /// struct Q {
3181 /// template <class T> int foo() {
3182 /// return T::template I<int>;
3183 /// }
3184 /// };
3185 /// \endcode
3186 ///
3187 /// ...which is distinct from modeling function overloads, and therefore we use
3188 /// a different builtin type 'UnresolvedTemplate' to avoid confusion. This is
3189 /// done in Sema::BuildTemplateIdExpr.
3190 ///
3191 /// and eventually:
3192 /// * the lookup might have included a function template.
3193 /// * the unresolved template gets transformed in an instantiation or gets
3194 /// diagnosed for its direct use.
3195 ///
3196 /// These never include UnresolvedUsingValueDecls, which are always class
3197 /// members and therefore appear only in UnresolvedMemberLookupExprs.
3199  : public OverloadExpr,
3200  private llvm::TrailingObjects<UnresolvedLookupExpr, DeclAccessPair,
3201  ASTTemplateKWAndArgsInfo,
3202  TemplateArgumentLoc> {
3203  friend class ASTStmtReader;
3204  friend class OverloadExpr;
3205  friend TrailingObjects;
3206 
3207  /// The naming class (C++ [class.access.base]p5) of the lookup, if
3208  /// any. This can generally be recalculated from the context chain,
3209  /// but that can be fairly expensive for unqualified lookups.
3210  CXXRecordDecl *NamingClass;
3211 
3212  // UnresolvedLookupExpr is followed by several trailing objects.
3213  // They are in order:
3214  //
3215  // * An array of getNumResults() DeclAccessPair for the results. These are
3216  // undesugared, which is to say, they may include UsingShadowDecls.
3217  // Access is relative to the naming class.
3218  //
3219  // * An optional ASTTemplateKWAndArgsInfo for the explicitly specified
3220  // template keyword and arguments. Present if and only if
3221  // hasTemplateKWAndArgsInfo().
3222  //
3223  // * An array of getNumTemplateArgs() TemplateArgumentLoc containing
3224  // location information for the explicitly specified template arguments.
3225 
3226  UnresolvedLookupExpr(const ASTContext &Context, CXXRecordDecl *NamingClass,
3227  NestedNameSpecifierLoc QualifierLoc,
3228  SourceLocation TemplateKWLoc,
3229  const DeclarationNameInfo &NameInfo, bool RequiresADL,
3230  const TemplateArgumentListInfo *TemplateArgs,
3232  bool KnownDependent, bool KnownInstantiationDependent);
3233 
3234  UnresolvedLookupExpr(EmptyShell Empty, unsigned NumResults,
3235  bool HasTemplateKWAndArgsInfo);
3236 
3237  unsigned numTrailingObjects(OverloadToken<DeclAccessPair>) const {
3238  return getNumDecls();
3239  }
3240 
3241  unsigned numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
3242  return hasTemplateKWAndArgsInfo();
3243  }
3244 
3245 public:
3246  static UnresolvedLookupExpr *
3247  Create(const ASTContext &Context, CXXRecordDecl *NamingClass,
3248  NestedNameSpecifierLoc QualifierLoc,
3249  const DeclarationNameInfo &NameInfo, bool RequiresADL,
3250  UnresolvedSetIterator Begin, UnresolvedSetIterator End,
3251  bool KnownDependent, bool KnownInstantiationDependent);
3252 
3253  // After canonicalization, there may be dependent template arguments in
3254  // CanonicalConverted But none of Args is dependent. When any of
3255  // CanonicalConverted dependent, KnownDependent is true.
3256  static UnresolvedLookupExpr *
3257  Create(const ASTContext &Context, CXXRecordDecl *NamingClass,
3258  NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc,
3259  const DeclarationNameInfo &NameInfo, bool RequiresADL,
3260  const TemplateArgumentListInfo *Args, UnresolvedSetIterator Begin,
3261  UnresolvedSetIterator End, bool KnownDependent,
3262  bool KnownInstantiationDependent);
3263 
3264  static UnresolvedLookupExpr *CreateEmpty(const ASTContext &Context,
3265  unsigned NumResults,
3266  bool HasTemplateKWAndArgsInfo,
3267  unsigned NumTemplateArgs);
3268 
3269  /// True if this declaration should be extended by
3270  /// argument-dependent lookup.
3271  bool requiresADL() const { return UnresolvedLookupExprBits.RequiresADL; }
3272 
3273  /// Gets the 'naming class' (in the sense of C++0x
3274  /// [class.access.base]p5) of the lookup. This is the scope
3275  /// that was looked in to find these results.
3276  CXXRecordDecl *getNamingClass() { return NamingClass; }
3277  const CXXRecordDecl *getNamingClass() const { return NamingClass; }
3278 
3279  SourceLocation getBeginLoc() const LLVM_READONLY {
3281  return l.getBeginLoc();
3282  return getNameInfo().getBeginLoc();
3283  }
3284 
3285  SourceLocation getEndLoc() const LLVM_READONLY {
3287  return getRAngleLoc();
3288  return getNameInfo().getEndLoc();
3289  }
3290 
3293  }
3294 
3297  }
3298 
3299  static bool classof(const Stmt *T) {
3300  return T->getStmtClass() == UnresolvedLookupExprClass;
3301  }
3302 };
3303 
3304 /// A qualified reference to a name whose declaration cannot
3305 /// yet be resolved.
3306 ///
3307 /// DependentScopeDeclRefExpr is similar to DeclRefExpr in that
3308 /// it expresses a reference to a declaration such as
3309 /// X<T>::value. The difference, however, is that an
3310 /// DependentScopeDeclRefExpr node is used only within C++ templates when
3311 /// the qualification (e.g., X<T>::) refers to a dependent type. In
3312 /// this case, X<T>::value cannot resolve to a declaration because the
3313 /// declaration will differ from one instantiation of X<T> to the
3314 /// next. Therefore, DependentScopeDeclRefExpr keeps track of the
3315 /// qualifier (X<T>::) and the name of the entity being referenced
3316 /// ("value"). Such expressions will instantiate to a DeclRefExpr once the
3317 /// declaration can be found.
3319  : public Expr,
3320  private llvm::TrailingObjects<DependentScopeDeclRefExpr,
3321  ASTTemplateKWAndArgsInfo,
3322  TemplateArgumentLoc> {
3323  friend class ASTStmtReader;
3324  friend class ASTStmtWriter;
3325  friend TrailingObjects;
3326 
3327  /// The nested-name-specifier that qualifies this unresolved
3328  /// declaration name.
3329  NestedNameSpecifierLoc QualifierLoc;
3330 
3331  /// The name of the entity we will be referencing.
3332  DeclarationNameInfo NameInfo;
3333 
3335  SourceLocation TemplateKWLoc,
3336  const DeclarationNameInfo &NameInfo,
3337  const TemplateArgumentListInfo *Args);
3338 
3339  size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
3340  return hasTemplateKWAndArgsInfo();
3341  }
3342 
3343  bool hasTemplateKWAndArgsInfo() const {
3344  return DependentScopeDeclRefExprBits.HasTemplateKWAndArgsInfo;
3345  }
3346 
3347 public:
3348  static DependentScopeDeclRefExpr *
3349  Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc,
3350  SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo,
3351  const TemplateArgumentListInfo *TemplateArgs);
3352 
3353  static DependentScopeDeclRefExpr *CreateEmpty(const ASTContext &Context,
3354  bool HasTemplateKWAndArgsInfo,
3355  unsigned NumTemplateArgs);
3356 
3357  /// Retrieve the name that this expression refers to.
3358  const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
3359 
3360  /// Retrieve the name that this expression refers to.
3361  DeclarationName getDeclName() const { return NameInfo.getName(); }
3362 
3363  /// Retrieve the location of the name within the expression.
3364  ///
3365  /// For example, in "X<T>::value" this is the location of "value".
3366  SourceLocation getLocation() const { return NameInfo.getLoc(); }
3367 
3368  /// Retrieve the nested-name-specifier that qualifies the
3369  /// name, with source location information.
3370  NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
3371 
3372  /// Retrieve the nested-name-specifier that qualifies this
3373  /// declaration.
3375  return QualifierLoc.getNestedNameSpecifier();
3376  }
3377 
3378  /// Retrieve the location of the template keyword preceding
3379  /// this name, if any.
3381  if (!hasTemplateKWAndArgsInfo())
3382  return SourceLocation();
3383  return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc;
3384  }
3385 
3386  /// Retrieve the location of the left angle bracket starting the
3387  /// explicit template argument list following the name, if any.
3389  if (!hasTemplateKWAndArgsInfo())
3390  return SourceLocation();
3391  return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc;
3392  }
3393 
3394  /// Retrieve the location of the right angle bracket ending the
3395  /// explicit template argument list following the name, if any.
3397  if (!hasTemplateKWAndArgsInfo())
3398  return SourceLocation();
3399  return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc;
3400  }
3401 
3402  /// Determines whether the name was preceded by the template keyword.
3403  bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
3404 
3405  /// Determines whether this lookup had explicit template arguments.
3406  bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
3407 
3408  /// Copies the template arguments (if present) into the given
3409  /// structure.
3412  getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto(
3413  getTrailingObjects<TemplateArgumentLoc>(), List);
3414  }
3415 
3417  if (!hasExplicitTemplateArgs())
3418  return nullptr;
3419 
3420  return getTrailingObjects<TemplateArgumentLoc>();
3421  }
3422 
3423  unsigned getNumTemplateArgs() const {
3424  if (!hasExplicitTemplateArgs())
3425  return 0;
3426 
3427  return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
3428  }
3429 
3431  return {getTemplateArgs(), getNumTemplateArgs()};
3432  }
3433 
3434  /// Note: getBeginLoc() is the start of the whole DependentScopeDeclRefExpr,
3435  /// and differs from getLocation().getStart().
3436  SourceLocation getBeginLoc() const LLVM_READONLY {
3437  return QualifierLoc.getBeginLoc();
3438  }
3439 
3440  SourceLocation getEndLoc() const LLVM_READONLY {
3442  return getRAngleLoc();
3443  return getLocation();
3444  }
3445 
3446  static bool classof(const Stmt *T) {
3447  return T->getStmtClass() == DependentScopeDeclRefExprClass;
3448  }
3449 
3452  }
3453 
3456  }
3457 };
3458 
3459 /// Represents an expression -- generally a full-expression -- that
3460 /// introduces cleanups to be run at the end of the sub-expression's
3461 /// evaluation. The most common source of expression-introduced
3462 /// cleanups is temporary objects in C++, but several other kinds of
3463 /// expressions can create cleanups, including basically every
3464 /// call in ARC that returns an Objective-C pointer.
3465 ///
3466 /// This expression also tracks whether the sub-expression contains a
3467 /// potentially-evaluated block literal. The lifetime of a block
3468 /// literal is the extent of the enclosing scope.
3469 class ExprWithCleanups final
3470  : public FullExpr,
3471  private llvm::TrailingObjects<
3472  ExprWithCleanups,
3473  llvm::PointerUnion<BlockDecl *, CompoundLiteralExpr *>> {
3474 public:
3475  /// The type of objects that are kept in the cleanup.
3476  /// It's useful to remember the set of blocks and block-scoped compound
3477  /// literals; we could also remember the set of temporaries, but there's
3478  /// currently no need.
3479  using CleanupObject = llvm::PointerUnion<BlockDecl *, CompoundLiteralExpr *>;
3480 
3481 private:
3482  friend class ASTStmtReader;
3483  friend TrailingObjects;
3484 
3485  ExprWithCleanups(EmptyShell, unsigned NumObjects);
3486  ExprWithCleanups(Expr *SubExpr, bool CleanupsHaveSideEffects,
3487  ArrayRef<CleanupObject> Objects);
3488 
3489 public:
3490  static ExprWithCleanups *Create(const ASTContext &C, EmptyShell empty,
3491  unsigned numObjects);
3492 
3493  static ExprWithCleanups *Create(const ASTContext &C, Expr *subexpr,
3494  bool CleanupsHaveSideEffects,
3495  ArrayRef<CleanupObject> objects);
3496 
3498  return llvm::ArrayRef(getTrailingObjects<CleanupObject>(), getNumObjects());
3499  }
3500 
3501  unsigned getNumObjects() const { return ExprWithCleanupsBits.NumObjects; }
3502 
3503  CleanupObject getObject(unsigned i) const {
3504  assert(i < getNumObjects() && "Index out of range");
3505  return getObjects()[i];
3506  }
3507 
3509  return ExprWithCleanupsBits.CleanupsHaveSideEffects;
3510  }
3511 
3512  SourceLocation getBeginLoc() const LLVM_READONLY {
3513  return SubExpr->getBeginLoc();
3514  }
3515 
3516  SourceLocation getEndLoc() const LLVM_READONLY {
3517  return SubExpr->getEndLoc();
3518  }
3519 
3520  // Implement isa/cast/dyncast/etc.
3521  static bool classof(const Stmt *T) {
3522  return T->getStmtClass() == ExprWithCleanupsClass;
3523  }
3524 
3525  // Iterators
3527 
3529  return const_child_range(&SubExpr, &SubExpr + 1);
3530  }
3531 };
3532 
3533 /// Describes an explicit type conversion that uses functional
3534 /// notion but could not be resolved because one or more arguments are
3535 /// type-dependent.
3536 ///
3537 /// The explicit type conversions expressed by
3538 /// CXXUnresolvedConstructExpr have the form <tt>T(a1, a2, ..., aN)</tt>,
3539 /// where \c T is some type and \c a1, \c a2, ..., \c aN are values, and
3540 /// either \c T is a dependent type or one or more of the <tt>a</tt>'s is
3541 /// type-dependent. For example, this would occur in a template such
3542 /// as:
3543 ///
3544 /// \code
3545 /// template<typename T, typename A1>
3546 /// inline T make_a(const A1& a1) {
3547 /// return T(a1);
3548 /// }
3549 /// \endcode
3550 ///
3551 /// When the returned expression is instantiated, it may resolve to a
3552 /// constructor call, conversion function call, or some kind of type
3553 /// conversion.
3555  : public Expr,
3556  private llvm::TrailingObjects<CXXUnresolvedConstructExpr, Expr *> {
3557  friend class ASTStmtReader;
3558  friend TrailingObjects;
3559 
3560  /// The type being constructed, and whether the construct expression models
3561  /// list initialization or not.
3562  llvm::PointerIntPair<TypeSourceInfo *, 1> TypeAndInitForm;
3563 
3564  /// The location of the left parentheses ('(').
3565  SourceLocation LParenLoc;
3566 
3567  /// The location of the right parentheses (')').
3568  SourceLocation RParenLoc;
3569 
3571  SourceLocation LParenLoc, ArrayRef<Expr *> Args,
3572  SourceLocation RParenLoc, bool IsListInit);
3573 
3574  CXXUnresolvedConstructExpr(EmptyShell Empty, unsigned NumArgs)
3575  : Expr(CXXUnresolvedConstructExprClass, Empty) {
3576  CXXUnresolvedConstructExprBits.NumArgs = NumArgs;
3577  }
3578 
3579 public:
3581  Create(const ASTContext &Context, QualType T, TypeSourceInfo *TSI,
3582  SourceLocation LParenLoc, ArrayRef<Expr *> Args,
3583  SourceLocation RParenLoc, bool IsListInit);
3584 
3585  static CXXUnresolvedConstructExpr *CreateEmpty(const ASTContext &Context,
3586  unsigned NumArgs);
3587 
3588  /// Retrieve the type that is being constructed, as specified
3589  /// in the source code.
3591 
3592  /// Retrieve the type source information for the type being
3593  /// constructed.
3595  return TypeAndInitForm.getPointer();
3596  }
3597 
3598  /// Retrieve the location of the left parentheses ('(') that
3599  /// precedes the argument list.
3600  SourceLocation getLParenLoc() const { return LParenLoc; }
3601  void setLParenLoc(SourceLocation L) { LParenLoc = L; }
3602 
3603  /// Retrieve the location of the right parentheses (')') that
3604  /// follows the argument list.
3605  SourceLocation getRParenLoc() const { return RParenLoc; }
3606  void setRParenLoc(SourceLocation L) { RParenLoc = L; }
3607 
3608  /// Determine whether this expression models list-initialization.
3609  /// If so, there will be exactly one subexpression, which will be
3610  /// an InitListExpr.
3611  bool isListInitialization() const { return TypeAndInitForm.getInt(); }
3612 
3613  /// Retrieve the number of arguments.
3614  unsigned getNumArgs() const { return CXXUnresolvedConstructExprBits.NumArgs; }
3615 
3616  using arg_iterator = Expr **;
3617  using arg_range = llvm::iterator_range<arg_iterator>;
3618 
3619  arg_iterator arg_begin() { return getTrailingObjects<Expr *>(); }
3622 
3623  using const_arg_iterator = const Expr* const *;
3624  using const_arg_range = llvm::iterator_range<const_arg_iterator>;
3625 
3626  const_arg_iterator arg_begin() const { return getTrailingObjects<Expr *>(); }
3629  return const_arg_range(arg_begin(), arg_end());
3630  }
3631 
3632  Expr *getArg(unsigned I) {
3633  assert(I < getNumArgs() && "Argument index out-of-range");
3634  return arg_begin()[I];
3635  }
3636 
3637  const Expr *getArg(unsigned I) const {
3638  assert(I < getNumArgs() && "Argument index out-of-range");
3639  return arg_begin()[I];
3640  }
3641 
3642  void setArg(unsigned I, Expr *E) {
3643  assert(I < getNumArgs() && "Argument index out-of-range");
3644  arg_begin()[I] = E;
3645  }
3646 
3647  SourceLocation getBeginLoc() const LLVM_READONLY;
3648  SourceLocation getEndLoc() const LLVM_READONLY {
3649  if (!RParenLoc.isValid() && getNumArgs() > 0)
3650  return getArg(getNumArgs() - 1)->getEndLoc();
3651  return RParenLoc;
3652  }
3653 
3654  static bool classof(const Stmt *T) {
3655  return T->getStmtClass() == CXXUnresolvedConstructExprClass;
3656  }
3657 
3658  // Iterators
3660  auto **begin = reinterpret_cast<Stmt **>(arg_begin());
3661  return child_range(begin, begin + getNumArgs());
3662  }
3663 
3665  auto **begin = reinterpret_cast<Stmt **>(
3666  const_cast<CXXUnresolvedConstructExpr *>(this)->arg_begin());
3667  return const_child_range(begin, begin + getNumArgs());
3668  }
3669 };
3670 
3671 /// Represents a C++ member access expression where the actual
3672 /// member referenced could not be resolved because the base
3673 /// expression or the member name was dependent.
3674 ///
3675 /// Like UnresolvedMemberExprs, these can be either implicit or
3676 /// explicit accesses. It is only possible to get one of these with
3677 /// an implicit access if a qualifier is provided.
3679  : public Expr,
3680  private llvm::TrailingObjects<CXXDependentScopeMemberExpr,
3681  ASTTemplateKWAndArgsInfo,
3682  TemplateArgumentLoc, NamedDecl *> {
3683  friend class ASTStmtReader;
3684  friend class ASTStmtWriter;
3685  friend TrailingObjects;
3686 
3687  /// The expression for the base pointer or class reference,
3688  /// e.g., the \c x in x.f. Can be null in implicit accesses.
3689  Stmt *Base;
3690 
3691  /// The type of the base expression. Never null, even for
3692  /// implicit accesses.
3693  QualType BaseType;
3694 
3695  /// The nested-name-specifier that precedes the member name, if any.
3696  /// FIXME: This could be in principle store as a trailing object.
3697  /// However the performance impact of doing so should be investigated first.
3698  NestedNameSpecifierLoc QualifierLoc;
3699 
3700  /// The member to which this member expression refers, which
3701  /// can be name, overloaded operator, or destructor.
3702  ///
3703  /// FIXME: could also be a template-id
3704  DeclarationNameInfo MemberNameInfo;
3705 
3706  // CXXDependentScopeMemberExpr is followed by several trailing objects,
3707  // some of which optional. They are in order:
3708  //
3709  // * An optional ASTTemplateKWAndArgsInfo for the explicitly specified
3710  // template keyword and arguments. Present if and only if
3711  // hasTemplateKWAndArgsInfo().
3712  //
3713  // * An array of getNumTemplateArgs() TemplateArgumentLoc containing location
3714  // information for the explicitly specified template arguments.
3715  //
3716  // * An optional NamedDecl *. In a qualified member access expression such
3717  // as t->Base::f, this member stores the resolves of name lookup in the
3718  // context of the member access expression, to be used at instantiation
3719  // time. Present if and only if hasFirstQualifierFoundInScope().
3720 
3721  bool hasTemplateKWAndArgsInfo() const {
3722  return CXXDependentScopeMemberExprBits.HasTemplateKWAndArgsInfo;
3723  }
3724 
3725  bool hasFirstQualifierFoundInScope() const {
3726  return CXXDependentScopeMemberExprBits.HasFirstQualifierFoundInScope;
3727  }
3728 
3729  unsigned numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
3730  return hasTemplateKWAndArgsInfo();
3731  }
3732 
3733  unsigned numTrailingObjects(OverloadToken<TemplateArgumentLoc>) const {
3734  return getNumTemplateArgs();
3735  }
3736 
3737  unsigned numTrailingObjects(OverloadToken<NamedDecl *>) const {
3738  return hasFirstQualifierFoundInScope();
3739  }
3740 
3741  CXXDependentScopeMemberExpr(const ASTContext &Ctx, Expr *Base,
3742  QualType BaseType, bool IsArrow,
3743  SourceLocation OperatorLoc,
3744  NestedNameSpecifierLoc QualifierLoc,
3745  SourceLocation TemplateKWLoc,
3746  NamedDecl *FirstQualifierFoundInScope,
3747  DeclarationNameInfo MemberNameInfo,
3748  const TemplateArgumentListInfo *TemplateArgs);
3749 
3750  CXXDependentScopeMemberExpr(EmptyShell Empty, bool HasTemplateKWAndArgsInfo,
3751  bool HasFirstQualifierFoundInScope);
3752 
3753 public:
3754  static CXXDependentScopeMemberExpr *
3755  Create(const ASTContext &Ctx, Expr *Base, QualType BaseType, bool IsArrow,
3756  SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc,
3757  SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope,
3758  DeclarationNameInfo MemberNameInfo,
3759  const TemplateArgumentListInfo *TemplateArgs);
3760 
3761  static CXXDependentScopeMemberExpr *
3762  CreateEmpty(const ASTContext &Ctx, bool HasTemplateKWAndArgsInfo,
3763  unsigned NumTemplateArgs, bool HasFirstQualifierFoundInScope);
3764 
3765  /// True if this is an implicit access, i.e. one in which the
3766  /// member being accessed was not written in the source. The source
3767  /// location of the operator is invalid in this case.
3768  bool isImplicitAccess() const {
3769  if (!Base)
3770  return true;
3771  return cast<Expr>(Base)->isImplicitCXXThis();
3772  }
3773 
3774  /// Retrieve the base object of this member expressions,
3775  /// e.g., the \c x in \c x.m.
3776  Expr *getBase() const {
3777  assert(!isImplicitAccess());
3778  return cast<Expr>(Base);
3779  }
3780 
3781  QualType getBaseType() const { return BaseType; }
3782 
3783  /// Determine whether this member expression used the '->'
3784  /// operator; otherwise, it used the '.' operator.
3785  bool isArrow() const { return CXXDependentScopeMemberExprBits.IsArrow; }
3786 
3787  /// Retrieve the location of the '->' or '.' operator.
3789  return CXXDependentScopeMemberExprBits.OperatorLoc;
3790  }
3791 
3792  /// Retrieve the nested-name-specifier that qualifies the member name.
3794  return QualifierLoc.getNestedNameSpecifier();
3795  }
3796 
3797  /// Retrieve the nested-name-specifier that qualifies the member
3798  /// name, with source location information.
3799  NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
3800 
3801  /// Retrieve the first part of the nested-name-specifier that was
3802  /// found in the scope of the member access expression when the member access
3803  /// was initially parsed.
3804  ///
3805  /// This function only returns a useful result when member access expression
3806  /// uses a qualified member name, e.g., "x.Base::f". Here, the declaration
3807  /// returned by this function describes what was found by unqualified name
3808  /// lookup for the identifier "Base" within the scope of the member access
3809  /// expression itself. At template instantiation time, this information is
3810  /// combined with the results of name lookup into the type of the object
3811  /// expression itself (the class type of x).
3813  if (!hasFirstQualifierFoundInScope())
3814  return nullptr;
3815  return *getTrailingObjects<NamedDecl *>();
3816  }
3817 
3818  /// Retrieve the name of the member that this expression refers to.
3820  return MemberNameInfo;
3821  }
3822 
3823  /// Retrieve the name of the member that this expression refers to.
3824  DeclarationName getMember() const { return MemberNameInfo.getName(); }
3825 
3826  // Retrieve the location of the name of the member that this
3827  // expression refers to.
3828  SourceLocation getMemberLoc() const { return MemberNameInfo.getLoc(); }
3829 
3830  /// Retrieve the location of the template keyword preceding the
3831  /// member name, if any.
3833  if (!hasTemplateKWAndArgsInfo())
3834  return SourceLocation();
3835  return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc;
3836  }
3837 
3838  /// Retrieve the location of the left angle bracket starting the
3839  /// explicit template argument list following the member name, if any.
3841  if (!hasTemplateKWAndArgsInfo())
3842  return SourceLocation();
3843  return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc;
3844  }
3845 
3846  /// Retrieve the location of the right angle bracket ending the
3847  /// explicit template argument list following the member name, if any.
3849  if (!hasTemplateKWAndArgsInfo())
3850  return SourceLocation();
3851  return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc;
3852  }
3853 
3854  /// Determines whether the member name was preceded by the template keyword.
3855  bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
3856 
3857  /// Determines whether this member expression actually had a C++
3858  /// template argument list explicitly specified, e.g., x.f<int>.
3859  bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
3860 
3861  /// Copies the template arguments (if present) into the given
3862  /// structure.
3865  getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto(
3866  getTrailingObjects<TemplateArgumentLoc>(), List);
3867  }
3868 
3869  /// Retrieve the template arguments provided as part of this
3870  /// template-id.
3872  if (!hasExplicitTemplateArgs())
3873  return nullptr;
3874 
3875  return getTrailingObjects<TemplateArgumentLoc>();
3876  }
3877 
3878  /// Retrieve the number of template arguments provided as part of this
3879  /// template-id.
3880  unsigned getNumTemplateArgs() const {
3881  if (!hasExplicitTemplateArgs())
3882  return 0;
3883 
3884  return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
3885  }
3886 
3888  return {getTemplateArgs(), getNumTemplateArgs()};
3889  }
3890 
3891  SourceLocation getBeginLoc() const LLVM_READONLY {
3892  if (!isImplicitAccess())
3893  return Base->getBeginLoc();
3894  if (getQualifier())
3895  return getQualifierLoc().getBeginLoc();
3896  return MemberNameInfo.getBeginLoc();
3897  }
3898 
3899  SourceLocation getEndLoc() const LLVM_READONLY {
3901  return getRAngleLoc();
3902  return MemberNameInfo.getEndLoc();
3903  }
3904 
3905  static bool classof(const Stmt *T) {
3906  return T->getStmtClass() == CXXDependentScopeMemberExprClass;
3907  }
3908 
3909  // Iterators
3911  if (isImplicitAccess())
3913  return child_range(&Base, &Base + 1);
3914  }
3915 
3917  if (isImplicitAccess())
3919  return const_child_range(&Base, &Base + 1);
3920  }
3921 };
3922 
3923 /// Represents a C++ member access expression for which lookup
3924 /// produced a set of overloaded functions.
3925 ///
3926 /// The member access may be explicit or implicit:
3927 /// \code
3928 /// struct A {
3929 /// int a, b;
3930 /// int explicitAccess() { return this->a + this->A::b; }
3931 /// int implicitAccess() { return a + A::b; }
3932 /// };
3933 /// \endcode
3934 ///
3935 /// In the final AST, an explicit access always becomes a MemberExpr.
3936 /// An implicit access may become either a MemberExpr or a
3937 /// DeclRefExpr, depending on whether the member is static.
3939  : public OverloadExpr,
3940  private llvm::TrailingObjects<UnresolvedMemberExpr, DeclAccessPair,
3941  ASTTemplateKWAndArgsInfo,
3942  TemplateArgumentLoc> {
3943  friend class ASTStmtReader;
3944  friend class OverloadExpr;
3945  friend TrailingObjects;
3946 
3947  /// The expression for the base pointer or class reference,
3948  /// e.g., the \c x in x.f.
3949  ///
3950  /// This can be null if this is an 'unbased' member expression.
3951  Stmt *Base;
3952 
3953  /// The type of the base expression; never null.
3954  QualType BaseType;
3955 
3956  /// The location of the '->' or '.' operator.
3957  SourceLocation OperatorLoc;
3958 
3959  // UnresolvedMemberExpr is followed by several trailing objects.
3960  // They are in order:
3961  //
3962  // * An array of getNumResults() DeclAccessPair for the results. These are
3963  // undesugared, which is to say, they may include UsingShadowDecls.
3964  // Access is relative to the naming class.
3965  //
3966  // * An optional ASTTemplateKWAndArgsInfo for the explicitly specified
3967  // template keyword and arguments. Present if and only if
3968  // hasTemplateKWAndArgsInfo().
3969  //
3970  // * An array of getNumTemplateArgs() TemplateArgumentLoc containing
3971  // location information for the explicitly specified template arguments.
3972 
3973  UnresolvedMemberExpr(const ASTContext &Context, bool HasUnresolvedUsing,
3974  Expr *Base, QualType BaseType, bool IsArrow,
3975  SourceLocation OperatorLoc,
3976  NestedNameSpecifierLoc QualifierLoc,
3977  SourceLocation TemplateKWLoc,
3978  const DeclarationNameInfo &MemberNameInfo,
3979  const TemplateArgumentListInfo *TemplateArgs,
3981 
3982  UnresolvedMemberExpr(EmptyShell Empty, unsigned NumResults,
3983  bool HasTemplateKWAndArgsInfo);
3984 
3985  unsigned numTrailingObjects(OverloadToken<DeclAccessPair>) const {
3986  return getNumDecls();
3987  }
3988 
3989  unsigned numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
3990  return hasTemplateKWAndArgsInfo();
3991  }
3992 
3993 public:
3994  static UnresolvedMemberExpr *
3995  Create(const ASTContext &Context, bool HasUnresolvedUsing, Expr *Base,
3996  QualType BaseType, bool IsArrow, SourceLocation OperatorLoc,
3997  NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc,
3998  const DeclarationNameInfo &MemberNameInfo,
3999  const TemplateArgumentListInfo *TemplateArgs,
4000  UnresolvedSetIterator Begin, UnresolvedSetIterator End);
4001 
4002  static UnresolvedMemberExpr *CreateEmpty(const ASTContext &Context,
4003  unsigned NumResults,
4004  bool HasTemplateKWAndArgsInfo,
4005  unsigned NumTemplateArgs);
4006 
4007  /// True if this is an implicit access, i.e., one in which the
4008  /// member being accessed was not written in the source.
4009  ///
4010  /// The source location of the operator is invalid in this case.
4011  bool isImplicitAccess() const;
4012 
4013  /// Retrieve the base object of this member expressions,
4014  /// e.g., the \c x in \c x.m.
4016  assert(!isImplicitAccess());
4017  return cast<Expr>(Base);
4018  }
4019  const Expr *getBase() const {
4020  assert(!isImplicitAccess());
4021  return cast<Expr>(Base);
4022  }
4023 
4024  QualType getBaseType() const { return BaseType; }
4025 
4026  /// Determine whether the lookup results contain an unresolved using
4027  /// declaration.
4028  bool hasUnresolvedUsing() const {
4029  return UnresolvedMemberExprBits.HasUnresolvedUsing;
4030  }
4031 
4032  /// Determine whether this member expression used the '->'
4033  /// operator; otherwise, it used the '.' operator.
4034  bool isArrow() const { return UnresolvedMemberExprBits.IsArrow; }
4035 
4036  /// Retrieve the location of the '->' or '.' operator.
4037  SourceLocation getOperatorLoc() const { return OperatorLoc; }
4038 
4039  /// Retrieve the naming class of this lookup.
4042  return const_cast<UnresolvedMemberExpr *>(this)->getNamingClass();
4043  }
4044 
4045  /// Retrieve the full name info for the member that this expression
4046  /// refers to.
4048 
4049  /// Retrieve the name of the member that this expression refers to.
4050  DeclarationName getMemberName() const { return getName(); }
4051 
4052  /// Retrieve the location of the name of the member that this
4053  /// expression refers to.
4055 
4056  /// Return the preferred location (the member name) for the arrow when
4057  /// diagnosing a problem with this expression.
4058  SourceLocation getExprLoc() const LLVM_READONLY { return getMemberLoc(); }
4059 
4060  SourceLocation getBeginLoc() const LLVM_READONLY {
4061  if (!isImplicitAccess())
4062  return Base->getBeginLoc();
4064  return l.getBeginLoc();
4065  return getMemberNameInfo().getBeginLoc();
4066  }
4067 
4068  SourceLocation getEndLoc() const LLVM_READONLY {
4070  return getRAngleLoc();
4071  return getMemberNameInfo().getEndLoc();
4072  }
4073 
4074  static bool classof(const Stmt *T) {
4075  return T->getStmtClass() == UnresolvedMemberExprClass;
4076  }
4077 
4078  // Iterators
4080  if (isImplicitAccess())
4082  return child_range(&Base, &Base + 1);
4083  }
4084 
4086  if (isImplicitAccess())
4088  return const_child_range(&Base, &Base + 1);
4089  }
4090 };
4091 
4093  if (auto *ULE = dyn_cast<UnresolvedLookupExpr>(this))
4094  return ULE->getTrailingObjects<DeclAccessPair>();
4095  return cast<UnresolvedMemberExpr>(this)->getTrailingObjects<DeclAccessPair>();
4096 }
4097 
4099  if (!hasTemplateKWAndArgsInfo())
4100  return nullptr;
4101 
4102  if (auto *ULE = dyn_cast<UnresolvedLookupExpr>(this))
4103  return ULE->getTrailingObjects<ASTTemplateKWAndArgsInfo>();
4104  return cast<UnresolvedMemberExpr>(this)
4105  ->getTrailingObjects<ASTTemplateKWAndArgsInfo>();
4106 }
4107 
4109  if (auto *ULE = dyn_cast<UnresolvedLookupExpr>(this))
4110  return ULE->getTrailingObjects<TemplateArgumentLoc>();
4111  return cast<UnresolvedMemberExpr>(this)
4112  ->getTrailingObjects<TemplateArgumentLoc>();
4113 }
4114 
4116  if (auto *ULE = dyn_cast<UnresolvedLookupExpr>(this))
4117  return ULE->getNamingClass();
4118  return cast<UnresolvedMemberExpr>(this)->getNamingClass();
4119 }
4120 
4121 /// Represents a C++11 noexcept expression (C++ [expr.unary.noexcept]).
4122 ///
4123 /// The noexcept expression tests whether a given expression might throw. Its
4124 /// result is a boolean constant.
4125 class CXXNoexceptExpr : public Expr {
4126  friend class ASTStmtReader;
4127 
4128  Stmt *Operand;
4130 
4131 public:
4133  SourceLocation Keyword, SourceLocation RParen)
4134  : Expr(CXXNoexceptExprClass, Ty, VK_PRValue, OK_Ordinary),
4135  Operand(Operand), Range(Keyword, RParen) {
4136  CXXNoexceptExprBits.Value = Val == CT_Cannot;
4137  setDependence(computeDependence(this, Val));
4138  }
4139 
4140  CXXNoexceptExpr(EmptyShell Empty) : Expr(CXXNoexceptExprClass, Empty) {}
4141 
4142  Expr *getOperand() const { return static_cast<Expr *>(Operand); }
4143 
4144  SourceLocation getBeginLoc() const { return Range.getBegin(); }
4145  SourceLocation getEndLoc() const { return Range.getEnd(); }
4146  SourceRange getSourceRange() const { return Range; }
4147 
4148  bool getValue() const { return CXXNoexceptExprBits.Value; }
4149 
4150  static bool classof(const Stmt *T) {
4151  return T->getStmtClass() == CXXNoexceptExprClass;
4152  }
4153 
4154  // Iterators
4155  child_range children() { return child_range(&Operand, &Operand + 1); }
4156 
4158  return const_child_range(&Operand, &Operand + 1);
4159  }
4160 };
4161 
4162 /// Represents a C++11 pack expansion that produces a sequence of
4163 /// expressions.
4164 ///
4165 /// A pack expansion expression contains a pattern (which itself is an
4166 /// expression) followed by an ellipsis. For example:
4167 ///
4168 /// \code
4169 /// template<typename F, typename ...Types>
4170 /// void forward(F f, Types &&...args) {
4171 /// f(static_cast<Types&&>(args)...);
4172 /// }
4173 /// \endcode
4174 ///
4175 /// Here, the argument to the function object \c f is a pack expansion whose
4176 /// pattern is \c static_cast<Types&&>(args). When the \c forward function
4177 /// template is instantiated, the pack expansion will instantiate to zero or
4178 /// or more function arguments to the function object \c f.
4179 class PackExpansionExpr : public Expr {
4180  friend class ASTStmtReader;
4181  friend class ASTStmtWriter;
4182 
4183  SourceLocation EllipsisLoc;
4184 
4185  /// The number of expansions that will be produced by this pack
4186  /// expansion expression, if known.
4187  ///
4188  /// When zero, the number of expansions is not known. Otherwise, this value
4189  /// is the number of expansions + 1.
4190  unsigned NumExpansions;
4191 
4192  Stmt *Pattern;
4193 
4194 public:
4196  std::optional<unsigned> NumExpansions)
4197  : Expr(PackExpansionExprClass, T, Pattern->getValueKind(),
4198  Pattern->getObjectKind()),
4199  EllipsisLoc(EllipsisLoc),
4200  NumExpansions(NumExpansions ? *NumExpansions + 1 : 0),
4201  Pattern(Pattern) {
4203  }
4204 
4205  PackExpansionExpr(EmptyShell Empty) : Expr(PackExpansionExprClass, Empty) {}
4206 
4207  /// Retrieve the pattern of the pack expansion.
4208  Expr *getPattern() { return reinterpret_cast<Expr *>(Pattern); }
4209 
4210  /// Retrieve the pattern of the pack expansion.
4211  const Expr *getPattern() const { return reinterpret_cast<Expr *>(Pattern); }
4212 
4213  /// Retrieve the location of the ellipsis that describes this pack
4214  /// expansion.
4215  SourceLocation getEllipsisLoc() const { return EllipsisLoc; }
4216 
4217  /// Determine the number of expansions that will be produced when
4218  /// this pack expansion is instantiated, if already known.
4219  std::optional<unsigned> getNumExpansions() const {
4220  if (NumExpansions)
4221  return NumExpansions - 1;
4222 
4223  return std::nullopt;
4224  }
4225 
4226  SourceLocation getBeginLoc() const LLVM_READONLY {
4227  return Pattern->getBeginLoc();
4228  }
4229 
4230  SourceLocation getEndLoc() const LLVM_READONLY { return EllipsisLoc; }
4231 
4232  static bool classof(const Stmt *T) {
4233  return T->getStmtClass() == PackExpansionExprClass;
4234  }
4235 
4236  // Iterators
4238  return child_range(&Pattern, &Pattern + 1);
4239  }
4240 
4242  return const_child_range(&Pattern, &Pattern + 1);
4243  }
4244 };
4245 
4246 /// Represents an expression that computes the length of a parameter
4247 /// pack.
4248 ///
4249 /// \code
4250 /// template<typename ...Types>
4251 /// struct count {
4252 /// static const unsigned value = sizeof...(Types);
4253 /// };
4254 /// \endcode
4255 class SizeOfPackExpr final
4256  : public Expr,
4257  private llvm::TrailingObjects<SizeOfPackExpr, TemplateArgument> {
4258  friend class ASTStmtReader;
4259  friend class ASTStmtWriter;
4260  friend TrailingObjects;
4261 
4262  /// The location of the \c sizeof keyword.
4263  SourceLocation OperatorLoc;
4264 
4265  /// The location of the name of the parameter pack.
4266  SourceLocation PackLoc;
4267 
4268  /// The location of the closing parenthesis.
4269  SourceLocation RParenLoc;
4270 
4271  /// The length of the parameter pack, if known.
4272  ///
4273  /// When this expression is not value-dependent, this is the length of
4274  /// the pack. When the expression was parsed rather than instantiated
4275  /// (and thus is value-dependent), this is zero.
4276  ///
4277  /// After partial substitution into a sizeof...(X) expression (for instance,
4278  /// within an alias template or during function template argument deduction),
4279  /// we store a trailing array of partially-substituted TemplateArguments,
4280  /// and this is the length of that array.
4281  unsigned Length;
4282 
4283  /// The parameter pack.
4284  NamedDecl *Pack = nullptr;
4285 
4286  /// Create an expression that computes the length of
4287  /// the given parameter pack.
4288  SizeOfPackExpr(QualType SizeType, SourceLocation OperatorLoc, NamedDecl *Pack,
4289  SourceLocation PackLoc, SourceLocation RParenLoc,
4290  std::optional<unsigned> Length,
4291  ArrayRef<TemplateArgument> PartialArgs)
4292  : Expr(SizeOfPackExprClass, SizeType, VK_PRValue, OK_Ordinary),
4293  OperatorLoc(OperatorLoc), PackLoc(PackLoc), RParenLoc(RParenLoc),
4294  Length(Length ? *Length : PartialArgs.size()), Pack(Pack) {
4295  assert((!Length || PartialArgs.empty()) &&
4296  "have partial args for non-dependent sizeof... expression");
4297  auto *Args = getTrailingObjects<TemplateArgument>();
4298  std::uninitialized_copy(PartialArgs.begin(), PartialArgs.end(), Args);
4300  : ExprDependence::ValueInstantiation);
4301  }
4302 
4303  /// Create an empty expression.
4304  SizeOfPackExpr(EmptyShell Empty, unsigned NumPartialArgs)
4305  : Expr(SizeOfPackExprClass, Empty), Length(NumPartialArgs) {}
4306 
4307 public:
4308  static SizeOfPackExpr *
4309  Create(ASTContext &Context, SourceLocation OperatorLoc, NamedDecl *Pack,
4310  SourceLocation PackLoc, SourceLocation RParenLoc,
4311  std::optional<unsigned> Length = std::nullopt,
4312  ArrayRef<TemplateArgument> PartialArgs = std::nullopt);
4313  static SizeOfPackExpr *CreateDeserialized(ASTContext &Context,
4314  unsigned NumPartialArgs);
4315 
4316  /// Determine the location of the 'sizeof' keyword.
4317  SourceLocation getOperatorLoc() const { return OperatorLoc; }
4318 
4319  /// Determine the location of the parameter pack.
4320  SourceLocation getPackLoc() const { return PackLoc; }
4321 
4322  /// Determine the location of the right parenthesis.
4323  SourceLocation getRParenLoc() const { return RParenLoc; }
4324 
4325  /// Retrieve the parameter pack.
4326  NamedDecl *getPack() const { return Pack; }
4327 
4328  /// Retrieve the length of the parameter pack.
4329  ///
4330  /// This routine may only be invoked when the expression is not
4331  /// value-dependent.
4332  unsigned getPackLength() const {
4333  assert(!isValueDependent() &&
4334  "Cannot get the length of a value-dependent pack size expression");
4335  return Length;
4336  }
4337 
4338  /// Determine whether this represents a partially-substituted sizeof...
4339  /// expression, such as is produced for:
4340  ///
4341  /// template<typename ...Ts> using X = int[sizeof...(Ts)];
4342  /// template<typename ...Us> void f(X<Us..., 1, 2, 3, Us...>);
4343  bool isPartiallySubstituted() const {
4344  return isValueDependent() && Length;
4345  }
4346 
4347  /// Get
4349  assert(isPartiallySubstituted());
4350  const auto *Args = getTrailingObjects<TemplateArgument>();
4351  return llvm::ArrayRef(Args, Args + Length);
4352  }
4353 
4354  SourceLocation getBeginLoc() const LLVM_READONLY { return OperatorLoc; }
4355  SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
4356 
4357  static bool classof(const Stmt *T) {
4358  return T->getStmtClass() == SizeOfPackExprClass;
4359  }
4360 
4361  // Iterators
4364  }
4365 
4368  }
4369 };
4370 
4371 class PackIndexingExpr final
4372  : public Expr,
4373  private llvm::TrailingObjects<PackIndexingExpr, Expr *> {
4374  friend class ASTStmtReader;
4375  friend class ASTStmtWriter;
4376  friend TrailingObjects;
4377 
4378  SourceLocation EllipsisLoc;
4379 
4380  // The location of the closing bracket
4381  SourceLocation RSquareLoc;
4382 
4383  // The pack being indexed, followed by the index
4384  Stmt *SubExprs[2];
4385 
4386  // The size of the trailing expressions.
4387  unsigned TransformedExpressions : 31;
4388 
4389  LLVM_PREFERRED_TYPE(bool)
4390  unsigned ExpandedToEmptyPack : 1;
4391 
4393  SourceLocation RSquareLoc, Expr *PackIdExpr, Expr *IndexExpr,
4394  ArrayRef<Expr *> SubstitutedExprs = {},
4395  bool ExpandedToEmptyPack = false)
4396  : Expr(PackIndexingExprClass, Type, VK_LValue, OK_Ordinary),
4397  EllipsisLoc(EllipsisLoc), RSquareLoc(RSquareLoc),
4398  SubExprs{PackIdExpr, IndexExpr},
4399  TransformedExpressions(SubstitutedExprs.size()),
4400  ExpandedToEmptyPack(ExpandedToEmptyPack) {
4401 
4402  auto *Exprs = getTrailingObjects<Expr *>();
4403  std::uninitialized_copy(SubstitutedExprs.begin(), SubstitutedExprs.end(),
4404  Exprs);
4405 
4407  if (!isInstantiationDependent())
4409  }
4410 
4411  /// Create an empty expression.
4412  PackIndexingExpr(EmptyShell Empty) : Expr(PackIndexingExprClass, Empty) {}
4413 
4414  unsigned numTrailingObjects(OverloadToken<Expr *>) const {
4415  return TransformedExpressions;
4416  }
4417 
4418 public:
4419  static PackIndexingExpr *Create(ASTContext &Context,
4420  SourceLocation EllipsisLoc,
4421  SourceLocation RSquareLoc, Expr *PackIdExpr,
4422  Expr *IndexExpr, std::optional<int64_t> Index,
4423  ArrayRef<Expr *> SubstitutedExprs = {},
4424  bool ExpandedToEmptyPack = false);
4425  static PackIndexingExpr *CreateDeserialized(ASTContext &Context,
4426  unsigned NumTransformedExprs);
4427 
4428  /// Determine if the expression was expanded to empty.
4429  bool expandsToEmptyPack() const { return ExpandedToEmptyPack; }
4430 
4431  /// Determine the location of the 'sizeof' keyword.
4432  SourceLocation getEllipsisLoc() const { return EllipsisLoc; }
4433 
4434  /// Determine the location of the parameter pack.
4435  SourceLocation getPackLoc() const { return SubExprs[0]->getBeginLoc(); }
4436 
4437  /// Determine the location of the right parenthesis.
4438  SourceLocation getRSquareLoc() const { return RSquareLoc; }
4439 
4440  SourceLocation getBeginLoc() const LLVM_READONLY { return getPackLoc(); }
4441  SourceLocation getEndLoc() const LLVM_READONLY { return RSquareLoc; }
4442 
4443  Expr *getPackIdExpression() const { return cast<Expr>(SubExprs[0]); }
4444 
4445  NamedDecl *getPackDecl() const;
4446 
4447  Expr *getIndexExpr() const { return cast<Expr>(SubExprs[1]); }
4448 
4449  std::optional<unsigned> getSelectedIndex() const {
4451  return std::nullopt;
4452  ConstantExpr *CE = cast<ConstantExpr>(getIndexExpr());
4453  auto Index = CE->getResultAsAPSInt();
4454  assert(Index.isNonNegative() && "Invalid index");
4455  return static_cast<unsigned>(Index.getExtValue());
4456  }
4457 
4459  std::optional<unsigned> Index = getSelectedIndex();
4460  assert(Index && "extracting the indexed expression of a dependant pack");
4461  return getTrailingObjects<Expr *>()[*Index];
4462  }
4463 
4464  /// Return the trailing expressions, regardless of the expansion.
4466  return {getTrailingObjects<Expr *>(), TransformedExpressions};
4467  }
4468 
4469  static bool classof(const Stmt *T) {
4470  return T->getStmtClass() == PackIndexingExprClass;
4471  }
4472 
4473  // Iterators
4474  child_range children() { return child_range(SubExprs, SubExprs + 2); }
4475 
4477  return const_child_range(SubExprs, SubExprs + 2);
4478  }
4479 };
4480 
4481 /// Represents a reference to a non-type template parameter
4482 /// that has been substituted with a template argument.
4484  friend class ASTReader;
4485  friend class ASTStmtReader;
4486 
4487  /// The replacement expression.
4488  Stmt *Replacement;
4489 
4490  /// The associated declaration and a flag indicating if it was a reference
4491  /// parameter. For class NTTPs, we can't determine that based on the value
4492  /// category alone.
4493  llvm::PointerIntPair<Decl *, 1, bool> AssociatedDeclAndRef;
4494 
4495  unsigned Index : 15;
4496  unsigned PackIndex : 16;
4497 
4499  : Expr(SubstNonTypeTemplateParmExprClass, Empty) {}
4500 
4501 public:
4503  SourceLocation Loc, Expr *Replacement,
4504  Decl *AssociatedDecl, unsigned Index,
4505  std::optional<unsigned> PackIndex, bool RefParam)
4506  : Expr(SubstNonTypeTemplateParmExprClass, Ty, ValueKind, OK_Ordinary),
4507  Replacement(Replacement),
4508  AssociatedDeclAndRef(AssociatedDecl, RefParam), Index(Index),
4509  PackIndex(PackIndex ? *PackIndex + 1 : 0) {
4510  assert(AssociatedDecl != nullptr);
4513  }
4514 
4516  return SubstNonTypeTemplateParmExprBits.NameLoc;
4517  }
4518  SourceLocation getBeginLoc() const { return getNameLoc(); }
4519  SourceLocation getEndLoc() const { return getNameLoc(); }
4520 
4521  Expr *getReplacement() const { return cast<Expr>(Replacement); }
4522 
4523  /// A template-like entity which owns the whole pattern being substituted.
4524  /// This will own a set of template parameters.
4525  Decl *getAssociatedDecl() const { return AssociatedDeclAndRef.getPointer(); }
4526 
4527  /// Returns the index of the replaced parameter in the associated declaration.
4528  /// This should match the result of `getParameter()->getIndex()`.
4529  unsigned getIndex() const { return Index; }
4530 
4531  std::optional<unsigned> getPackIndex() const {
4532  if (PackIndex == 0)
4533  return std::nullopt;
4534  return PackIndex - 1;
4535  }
4536 
4538 
4539  bool isReferenceParameter() const { return AssociatedDeclAndRef.getInt(); }
4540 
4541  /// Determine the substituted type of the template parameter.
4542  QualType getParameterType(const ASTContext &Ctx) const;
4543 
4544  static bool classof(const Stmt *s) {
4545  return s->getStmtClass() == SubstNonTypeTemplateParmExprClass;
4546  }
4547 
4548  // Iterators
4549  child_range children() { return child_range(&Replacement, &Replacement + 1); }
4550 
4552  return const_child_range(&Replacement, &Replacement + 1);
4553  }
4554 };
4555 
4556 /// Represents a reference to a non-type template parameter pack that
4557 /// has been substituted with a non-template argument pack.
4558 ///
4559 /// When a pack expansion in the source code contains multiple parameter packs
4560 /// and those parameter packs correspond to different levels of template
4561 /// parameter lists, this node is used to represent a non-type template
4562 /// parameter pack from an outer level, which has already had its argument pack
4563 /// substituted but that still lives within a pack expansion that itself
4564 /// could not be instantiated. When actually performing a substitution into
4565 /// that pack expansion (e.g., when all template parameters have corresponding
4566 /// arguments), this type will be replaced with the appropriate underlying
4567 /// expression at the current pack substitution index.
4569  friend class ASTReader;
4570  friend class ASTStmtReader;
4571 
4572  /// The non-type template parameter pack itself.
4573  Decl *AssociatedDecl;
4574 
4575  /// A pointer to the set of template arguments that this
4576  /// parameter pack is instantiated with.
4577  const TemplateArgument *Arguments;
4578 
4579  /// The number of template arguments in \c Arguments.
4580  unsigned NumArguments : 16;
4581 
4582  unsigned Index : 16;
4583 
4584  /// The location of the non-type template parameter pack reference.
4585  SourceLocation NameLoc;
4586 
4588  : Expr(SubstNonTypeTemplateParmPackExprClass, Empty) {}
4589 
4590 public:
4592  SourceLocation NameLoc,
4593  const TemplateArgument &ArgPack,
4594  Decl *AssociatedDecl, unsigned Index);
4595 
4596  /// A template-like entity which owns the whole pattern being substituted.
4597  /// This will own a set of template parameters.
4598  Decl *getAssociatedDecl() const { return AssociatedDecl; }
4599 
4600  /// Returns the index of the replaced parameter in the associated declaration.
4601  /// This should match the result of `getParameterPack()->getIndex()`.
4602  unsigned getIndex() const { return Index; }
4603 
4604  /// Retrieve the non-type template parameter pack being substituted.
4606 
4607  /// Retrieve the location of the parameter pack name.
4608  SourceLocation getParameterPackLocation() const { return NameLoc; }
4609 
4610  /// Retrieve the template argument pack containing the substituted
4611  /// template arguments.
4613 
4614  SourceLocation getBeginLoc() const LLVM_READONLY { return NameLoc; }
4615  SourceLocation getEndLoc() const LLVM_READONLY { return NameLoc; }
4616 
4617  static bool classof(const Stmt *T) {
4618  return T->getStmtClass() == SubstNonTypeTemplateParmPackExprClass;
4619  }
4620 
4621  // Iterators
4624  }
4625 
4628  }
4629 };
4630 
4631 /// Represents a reference to a function parameter pack or init-capture pack
4632 /// that has been substituted but not yet expanded.
4633 ///
4634 /// When a pack expansion contains multiple parameter packs at different levels,
4635 /// this node is used to represent a function parameter pack at an outer level
4636 /// which we have already substituted to refer to expanded parameters, but where
4637 /// the containing pack expansion cannot yet be expanded.
4638 ///
4639 /// \code
4640 /// template<typename...Ts> struct S {
4641 /// template<typename...Us> auto f(Ts ...ts) -> decltype(g(Us(ts)...));
4642 /// };
4643 /// template struct S<int, int>;
4644 /// \endcode
4646  : public Expr,
4647  private llvm::TrailingObjects<FunctionParmPackExpr, VarDecl *> {
4648  friend class ASTReader;
4649  friend class ASTStmtReader;
4650  friend TrailingObjects;
4651 
4652  /// The function parameter pack which was referenced.
4653  VarDecl *ParamPack;
4654 
4655  /// The location of the function parameter pack reference.
4656  SourceLocation NameLoc;
4657 
4658  /// The number of expansions of this pack.
4659  unsigned NumParameters;
4660 
4661  FunctionParmPackExpr(QualType T, VarDecl *ParamPack,
4662  SourceLocation NameLoc, unsigned NumParams,
4663  VarDecl *const *Params);
4664 
4665 public:
4666  static FunctionParmPackExpr *Create(const ASTContext &Context, QualType T,
4667  VarDecl *ParamPack,
4668  SourceLocation NameLoc,
4669  ArrayRef<VarDecl *> Params);
4670  static FunctionParmPackExpr *CreateEmpty(const ASTContext &Context,
4671  unsigned NumParams);
4672 
4673  /// Get the parameter pack which this expression refers to.
4674  VarDecl *getParameterPack() const { return ParamPack; }
4675 
4676  /// Get the location of the parameter pack.
4677  SourceLocation getParameterPackLocation() const { return NameLoc; }
4678 
4679  /// Iterators over the parameters which the parameter pack expanded
4680  /// into.
4681  using iterator = VarDecl * const *;
4682  iterator begin() const { return getTrailingObjects<VarDecl *>(); }
4683  iterator end() const { return begin() + NumParameters; }
4684 
4685  /// Get the number of parameters in this parameter pack.
4686  unsigned getNumExpansions() const { return NumParameters; }
4687 
4688  /// Get an expansion of the parameter pack by index.
4689  VarDecl *getExpansion(unsigned I) const { return begin()[I]; }
4690 
4691  SourceLocation getBeginLoc() const LLVM_READONLY { return NameLoc; }
4692  SourceLocation getEndLoc() const LLVM_READONLY { return NameLoc; }
4693 
4694  static bool classof(const Stmt *T) {
4695  return T->getStmtClass() == FunctionParmPackExprClass;
4696  }
4697 
4700  }
4701 
4704  }
4705 };
4706 
4707 /// Represents a prvalue temporary that is written into memory so that
4708 /// a reference can bind to it.
4709 ///
4710 /// Prvalue expressions are materialized when they need to have an address
4711 /// in memory for a reference to bind to. This happens when binding a
4712 /// reference to the result of a conversion, e.g.,
4713 ///
4714 /// \code
4715 /// const int &r = 1.0;
4716 /// \endcode
4717 ///
4718 /// Here, 1.0 is implicitly converted to an \c int. That resulting \c int is
4719 /// then materialized via a \c MaterializeTemporaryExpr, and the reference
4720 /// binds to the temporary. \c MaterializeTemporaryExprs are always glvalues
4721 /// (either an lvalue or an xvalue, depending on the kind of reference binding
4722 /// to it), maintaining the invariant that references always bind to glvalues.
4723 ///
4724 /// Reference binding and copy-elision can both extend the lifetime of a
4725 /// temporary. When either happens, the expression will also track the
4726 /// declaration which is responsible for the lifetime extension.
4728 private:
4729  friend class ASTStmtReader;
4730  friend class ASTStmtWriter;
4731 
4732  llvm::PointerUnion<Stmt *, LifetimeExtendedTemporaryDecl *> State;
4733 
4734 public:
4736  bool BoundToLvalueReference,
4737  LifetimeExtendedTemporaryDecl *MTD = nullptr);
4738 
4740  : Expr(MaterializeTemporaryExprClass, Empty) {}
4741 
4742  /// Retrieve the temporary-generating subexpression whose value will
4743  /// be materialized into a glvalue.
4744  Expr *getSubExpr() const {
4745  return cast<Expr>(
4746  State.is<Stmt *>()
4747  ? State.get<Stmt *>()
4749  }
4750 
4751  /// Retrieve the storage duration for the materialized temporary.
4753  return State.is<Stmt *>() ? SD_FullExpression
4755  ->getStorageDuration();
4756  }
4757 
4758  /// Get the storage for the constant value of a materialized temporary
4759  /// of static storage duration.
4760  APValue *getOrCreateValue(bool MayCreate) const {
4761  assert(State.is<LifetimeExtendedTemporaryDecl *>() &&
4762  "the temporary has not been lifetime extended");
4764  MayCreate);
4765  }
4766 
4768  return State.dyn_cast<LifetimeExtendedTemporaryDecl *>();
4769  }
4772  return State.dyn_cast<LifetimeExtendedTemporaryDecl *>();
4773  }
4774 
4775  /// Get the declaration which triggered the lifetime-extension of this
4776  /// temporary, if any.
4778  return State.is<Stmt *>() ? nullptr
4780  ->getExtendingDecl();
4781  }
4782  const ValueDecl *getExtendingDecl() const {
4783  return const_cast<MaterializeTemporaryExpr *>(this)->getExtendingDecl();
4784  }
4785 
4786  void setExtendingDecl(ValueDecl *ExtendedBy, unsigned ManglingNumber);
4787 
4788  unsigned getManglingNumber() const {
4789  return State.is<Stmt *>() ? 0
4791  ->getManglingNumber();
4792  }
4793 
4794  /// Determine whether this materialized temporary is bound to an
4795  /// lvalue reference; otherwise, it's bound to an rvalue reference.
4796  bool isBoundToLvalueReference() const { return isLValue(); }
4797 
4798  /// Determine whether this temporary object is usable in constant
4799  /// expressions, as specified in C++20 [expr.const]p4.
4800  bool isUsableInConstantExpressions(const ASTContext &Context) const;
4801 
4802  SourceLocation getBeginLoc() const LLVM_READONLY {
4803  return getSubExpr()->getBeginLoc();
4804  }
4805 
4806  SourceLocation getEndLoc() const LLVM_READONLY {
4807  return getSubExpr()->getEndLoc();
4808  }
4809 
4810  static bool classof(const Stmt *T) {
4811  return T->getStmtClass() == MaterializeTemporaryExprClass;
4812  }
4813 
4814  // Iterators
4816  return State.is<Stmt *>()
4817  ? child_range(State.getAddrOfPtr1(), State.getAddrOfPtr1() + 1)
4819  }
4820 
4822  return State.is<Stmt *>()
4823  ? const_child_range(State.getAddrOfPtr1(),
4824  State.getAddrOfPtr1() + 1)
4825  : const_cast<const LifetimeExtendedTemporaryDecl *>(
4827  ->childrenExpr();
4828  }
4829 };
4830 
4831 /// Represents a folding of a pack over an operator.
4832 ///
4833 /// This expression is always dependent and represents a pack expansion of the
4834 /// forms:
4835 ///
4836 /// ( expr op ... )
4837 /// ( ... op expr )
4838 /// ( expr op ... op expr )
4839 class CXXFoldExpr : public Expr {
4840  friend class ASTStmtReader;
4841  friend class ASTStmtWriter;
4842 
4843  enum SubExpr { Callee, LHS, RHS, Count };
4844 
4845  SourceLocation LParenLoc;
4846  SourceLocation EllipsisLoc;
4847  SourceLocation RParenLoc;
4848  // When 0, the number of expansions is not known. Otherwise, this is one more
4849  // than the number of expansions.
4850  unsigned NumExpansions;
4851  Stmt *SubExprs[SubExpr::Count];
4853 
4854 public:
4856  SourceLocation LParenLoc, Expr *LHS, BinaryOperatorKind Opcode,
4857  SourceLocation EllipsisLoc, Expr *RHS, SourceLocation RParenLoc,
4858  std::optional<unsigned> NumExpansions);
4859 
4860  CXXFoldExpr(EmptyShell Empty) : Expr(CXXFoldExprClass, Empty) {}
4861 
4863  return static_cast<UnresolvedLookupExpr *>(SubExprs[SubExpr::Callee]);
4864  }
4865  Expr *getLHS() const { return static_cast<Expr*>(SubExprs[SubExpr::LHS]); }
4866  Expr *getRHS() const { return static_cast<Expr*>(SubExprs[SubExpr::RHS]); }
4867 
4868  /// Does this produce a right-associated sequence of operators?
4869  bool isRightFold() const {
4871  }
4872 
4873  /// Does this produce a left-associated sequence of operators?
4874  bool isLeftFold() const { return !isRightFold(); }
4875 
4876  /// Get the pattern, that is, the operand that contains an unexpanded pack.
4877  Expr *getPattern() const { return isLeftFold() ? getRHS() : getLHS(); }
4878 
4879  /// Get the operand that doesn't contain a pack, for a binary fold.
4880  Expr *getInit() const { return isLeftFold() ? getLHS() : getRHS(); }
4881 
4882  SourceLocation getLParenLoc() const { return LParenLoc; }
4883  SourceLocation getRParenLoc() const { return RParenLoc; }
4884  SourceLocation getEllipsisLoc() const { return EllipsisLoc; }
4886 
4887  std::optional<unsigned> getNumExpansions() const {
4888  if (NumExpansions)
4889  return NumExpansions - 1;
4890  return std::nullopt;
4891  }
4892 
4893  SourceLocation getBeginLoc() const LLVM_READONLY {
4894  if (LParenLoc.isValid())
4895  return LParenLoc;
4896  if (isLeftFold())
4897  return getEllipsisLoc();
4898  return getLHS()->getBeginLoc();
4899  }
4900 
4901  SourceLocation getEndLoc() const LLVM_READONLY {
4902  if (RParenLoc.isValid())
4903  return RParenLoc;
4904  if (isRightFold())
4905  return getEllipsisLoc();
4906  return getRHS()->getEndLoc();
4907  }
4908 
4909  static bool classof(const Stmt *T) {
4910  return T->getStmtClass() == CXXFoldExprClass;
4911  }
4912 
4913  // Iterators
4915  return child_range(SubExprs, SubExprs + SubExpr::Count);
4916  }
4917 
4919  return const_child_range(SubExprs, SubExprs + SubExpr::Count);
4920  }
4921 };
4922 
4923 /// Represents a list-initialization with parenthesis.
4924 ///
4925 /// As per P0960R3, this is a C++20 feature that allows aggregate to
4926 /// be initialized with a parenthesized list of values:
4927 /// ```
4928 /// struct A {
4929 /// int a;
4930 /// double b;
4931 /// };
4932 ///
4933 /// void foo() {
4934 /// A a1(0); // Well-formed in C++20
4935 /// A a2(1.5, 1.0); // Well-formed in C++20
4936 /// }
4937 /// ```
4938 /// It has some sort of similiarity to braced
4939 /// list-initialization, with some differences such as
4940 /// it allows narrowing conversion whilst braced
4941 /// list-initialization doesn't.
4942 /// ```
4943 /// struct A {
4944 /// char a;
4945 /// };
4946 /// void foo() {
4947 /// A a(1.5); // Well-formed in C++20
4948 /// A b{1.5}; // Ill-formed !
4949 /// }
4950 /// ```
4952  : public Expr,
4953  private llvm::TrailingObjects<CXXParenListInitExpr, Expr *> {
4954  friend class TrailingObjects;
4955  friend class ASTStmtReader;
4956  friend class ASTStmtWriter;
4957 
4958  unsigned NumExprs;
4959  unsigned NumUserSpecifiedExprs;
4960  SourceLocation InitLoc, LParenLoc, RParenLoc;
4961  llvm::PointerUnion<Expr *, FieldDecl *> ArrayFillerOrUnionFieldInit;
4962 
4964  unsigned NumUserSpecifiedExprs, SourceLocation InitLoc,
4965  SourceLocation LParenLoc, SourceLocation RParenLoc)
4966  : Expr(CXXParenListInitExprClass, T, getValueKindForType(T), OK_Ordinary),
4967  NumExprs(Args.size()), NumUserSpecifiedExprs(NumUserSpecifiedExprs),
4968  InitLoc(InitLoc), LParenLoc(LParenLoc), RParenLoc(RParenLoc) {
4969  std::copy(Args.begin(), Args.end(), getTrailingObjects<Expr *>());
4970  assert(NumExprs >= NumUserSpecifiedExprs &&
4971  "number of user specified inits is greater than the number of "
4972  "passed inits");
4974  }
4975 
4976  size_t numTrailingObjects(OverloadToken<Expr *>) const { return NumExprs; }
4977 
4978 public:
4979  static CXXParenListInitExpr *
4980  Create(ASTContext &C, ArrayRef<Expr *> Args, QualType T,
4981  unsigned NumUserSpecifiedExprs, SourceLocation InitLoc,
4982  SourceLocation LParenLoc, SourceLocation RParenLoc);
4983 
4984  static CXXParenListInitExpr *CreateEmpty(ASTContext &C, unsigned numExprs,
4985  EmptyShell Empty);
4986 
4987  explicit CXXParenListInitExpr(EmptyShell Empty, unsigned NumExprs)
4988  : Expr(CXXParenListInitExprClass, Empty), NumExprs(NumExprs),
4989  NumUserSpecifiedExprs(0) {}
4990 
4992 
4994  return ArrayRef(getTrailingObjects<Expr *>(), NumExprs);
4995  }
4996 
4998  return ArrayRef(getTrailingObjects<Expr *>(), NumExprs);
4999  }
5000 
5002  return ArrayRef(getTrailingObjects<Expr *>(), NumUserSpecifiedExprs);
5003  }
5004 
5006  return ArrayRef(getTrailingObjects<Expr *>(), NumUserSpecifiedExprs);
5007  }
5008 
5009  SourceLocation getBeginLoc() const LLVM_READONLY { return LParenLoc; }
5010 
5011  SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
5012 
5013  SourceLocation getInitLoc() const LLVM_READONLY { return InitLoc; }
5014 
5015  SourceRange getSourceRange() const LLVM_READONLY {
5016  return SourceRange(getBeginLoc(), getEndLoc());
5017  }
5018 
5019  void setArrayFiller(Expr *E) { ArrayFillerOrUnionFieldInit = E; }
5020 
5022  return ArrayFillerOrUnionFieldInit.dyn_cast<Expr *>();
5023  }
5024 
5025  const Expr *getArrayFiller() const {
5026  return ArrayFillerOrUnionFieldInit.dyn_cast<Expr *>();
5027  }
5028 
5030  ArrayFillerOrUnionFieldInit = FD;
5031  }
5032 
5034  return ArrayFillerOrUnionFieldInit.dyn_cast<FieldDecl *>();
5035  }
5036 
5038  return ArrayFillerOrUnionFieldInit.dyn_cast<FieldDecl *>();
5039  }
5040 
5042  Stmt **Begin = reinterpret_cast<Stmt **>(getTrailingObjects<Expr *>());
5043  return child_range(Begin, Begin + NumExprs);
5044  }
5045 
5047  Stmt *const *Begin =
5048  reinterpret_cast<Stmt *const *>(getTrailingObjects<Expr *>());
5049  return const_child_range(Begin, Begin + NumExprs);
5050  }
5051 
5052  static bool classof(const Stmt *T) {
5053  return T->getStmtClass() == CXXParenListInitExprClass;
5054  }
5055 };
5056 
5057 /// Represents an expression that might suspend coroutine execution;
5058 /// either a co_await or co_yield expression.
5059 ///
5060 /// Evaluation of this expression first evaluates its 'ready' expression. If
5061 /// that returns 'false':
5062 /// -- execution of the coroutine is suspended
5063 /// -- the 'suspend' expression is evaluated
5064 /// -- if the 'suspend' expression returns 'false', the coroutine is
5065 /// resumed
5066 /// -- otherwise, control passes back to the resumer.
5067 /// If the coroutine is not suspended, or when it is resumed, the 'resume'
5068 /// expression is evaluated, and its result is the result of the overall
5069 /// expression.
5070 class CoroutineSuspendExpr : public Expr {
5071  friend class ASTStmtReader;
5072 
5073  SourceLocation KeywordLoc;
5074 
5075  enum SubExpr { Operand, Common, Ready, Suspend, Resume, Count };
5076 
5077  Stmt *SubExprs[SubExpr::Count];
5078  OpaqueValueExpr *OpaqueValue = nullptr;
5079 
5080 public:
5081  // These types correspond to the three C++ 'await_suspend' return variants
5083 
5085  Expr *Common, Expr *Ready, Expr *Suspend, Expr *Resume,
5086  OpaqueValueExpr *OpaqueValue)
5087  : Expr(SC, Resume->getType(), Resume->getValueKind(),
5088  Resume->getObjectKind()),
5089  KeywordLoc(KeywordLoc), OpaqueValue(OpaqueValue) {
5090  SubExprs[SubExpr::Operand] = Operand;
5091  SubExprs[SubExpr::Common] = Common;
5092  SubExprs[SubExpr::Ready] = Ready;
5093  SubExprs[SubExpr::Suspend] = Suspend;
5094  SubExprs[SubExpr::Resume] = Resume;
5096  }
5097 
5099  Expr *Operand, Expr *Common)
5100  : Expr(SC, Ty, VK_PRValue, OK_Ordinary), KeywordLoc(KeywordLoc) {
5101  assert(Common->isTypeDependent() && Ty->isDependentType() &&
5102  "wrong constructor for non-dependent co_await/co_yield expression");
5103  SubExprs[SubExpr::Operand] = Operand;
5104  SubExprs[SubExpr::Common] = Common;
5105  SubExprs[SubExpr::Ready] = nullptr;
5106  SubExprs[SubExpr::Suspend] = nullptr;
5107  SubExprs[SubExpr::Resume] = nullptr;
5109  }
5110 
5112  SubExprs[SubExpr::Operand] = nullptr;
5113  SubExprs[SubExpr::Common] = nullptr;
5114  SubExprs[SubExpr::Ready] = nullptr;
5115  SubExprs[SubExpr::Suspend] = nullptr;
5116  SubExprs[SubExpr::Resume] = nullptr;
5117  }
5118 
5119  Expr *getCommonExpr() const {
5120  return static_cast<Expr*>(SubExprs[SubExpr::Common]);
5121  }
5122 
5123  /// getOpaqueValue - Return the opaque value placeholder.
5124  OpaqueValueExpr *getOpaqueValue() const { return OpaqueValue; }
5125 
5126  Expr *getReadyExpr() const {
5127  return static_cast<Expr*>(SubExprs[SubExpr::Ready]);
5128  }
5129 
5131  return static_cast<Expr*>(SubExprs[SubExpr::Suspend]);
5132  }
5133 
5134  Expr *getResumeExpr() const {
5135  return static_cast<Expr*>(SubExprs[SubExpr::Resume]);
5136  }
5137 
5138  // The syntactic operand written in the code
5139  Expr *getOperand() const {
5140  return static_cast<Expr *>(SubExprs[SubExpr::Operand]);
5141  }
5142 
5144  auto *SuspendExpr = getSuspendExpr();
5145  assert(SuspendExpr);
5146 
5147  auto SuspendType = SuspendExpr->getType();
5148 
5149  if (SuspendType->isVoidType())
5151  if (SuspendType->isBooleanType())
5153 
5154  // Void pointer is the type of handle.address(), which is returned
5155  // from the await suspend wrapper so that the temporary coroutine handle
5156  // value won't go to the frame by mistake
5157  assert(SuspendType->isVoidPointerType());
5159  }
5160 
5161  SourceLocation getKeywordLoc() const { return KeywordLoc; }
5162 
5163  SourceLocation getBeginLoc() const LLVM_READONLY { return KeywordLoc; }
5164 
5165  SourceLocation getEndLoc() const LLVM_READONLY {
5166  return getOperand()->getEndLoc();
5167  }
5168 
5170  return child_range(SubExprs, SubExprs + SubExpr::Count);
5171  }
5172 
5174  return const_child_range(SubExprs, SubExprs + SubExpr::Count);
5175  }
5176 
5177  static bool classof(const Stmt *T) {
5178  return T->getStmtClass() == CoawaitExprClass ||
5179  T->getStmtClass() == CoyieldExprClass;
5180  }
5181 };
5182 
5183 /// Represents a 'co_await' expression.
5185  friend class ASTStmtReader;
5186 
5187 public:
5188  CoawaitExpr(SourceLocation CoawaitLoc, Expr *Operand, Expr *Common,
5189  Expr *Ready, Expr *Suspend, Expr *Resume,
5190  OpaqueValueExpr *OpaqueValue, bool IsImplicit = false)
5191  : CoroutineSuspendExpr(CoawaitExprClass, CoawaitLoc, Operand, Common,
5192  Ready, Suspend, Resume, OpaqueValue) {
5193  CoawaitBits.IsImplicit = IsImplicit;
5194  }
5195 
5196  CoawaitExpr(SourceLocation CoawaitLoc, QualType Ty, Expr *Operand,
5197  Expr *Common, bool IsImplicit = false)
5198  : CoroutineSuspendExpr(CoawaitExprClass, CoawaitLoc, Ty, Operand,
5199  Common) {
5200  CoawaitBits.IsImplicit = IsImplicit;
5201  }
5202 
5204  : CoroutineSuspendExpr(CoawaitExprClass, Empty) {}
5205 
5206  bool isImplicit() const { return CoawaitBits.IsImplicit; }
5207  void setIsImplicit(bool value = true) { CoawaitBits.IsImplicit = value; }
5208 
5209  static bool classof(const Stmt *T) {
5210  return T->getStmtClass() == CoawaitExprClass;
5211  }
5212 };
5213 
5214 /// Represents a 'co_await' expression while the type of the promise
5215 /// is dependent.
5216 class DependentCoawaitExpr : public Expr {
5217  friend class ASTStmtReader;
5218 
5219  SourceLocation KeywordLoc;
5220  Stmt *SubExprs[2];
5221 
5222 public:
5224  UnresolvedLookupExpr *OpCoawait)
5225  : Expr(DependentCoawaitExprClass, Ty, VK_PRValue, OK_Ordinary),
5226  KeywordLoc(KeywordLoc) {
5227  // NOTE: A co_await expression is dependent on the coroutines promise
5228  // type and may be dependent even when the `Op` expression is not.
5229  assert(Ty->isDependentType() &&
5230  "wrong constructor for non-dependent co_await/co_yield expression");
5231  SubExprs[0] = Op;
5232  SubExprs[1] = OpCoawait;
5234  }
5235 
5237  : Expr(DependentCoawaitExprClass, Empty) {}
5238 
5239  Expr *getOperand() const { return cast<Expr>(SubExprs[0]); }
5240 
5242  return cast<UnresolvedLookupExpr>(SubExprs[1]);
5243  }
5244 
5245  SourceLocation getKeywordLoc() const { return KeywordLoc; }
5246 
5247  SourceLocation getBeginLoc() const LLVM_READONLY { return KeywordLoc; }
5248 
5249  SourceLocation getEndLoc() const LLVM_READONLY {
5250  return getOperand()->getEndLoc();
5251  }
5252 
5253  child_range children() { return child_range(SubExprs, SubExprs + 2); }
5254 
5256  return const_child_range(SubExprs, SubExprs + 2);
5257  }
5258 
5259  static bool classof(const Stmt *T) {
5260  return T->getStmtClass() == DependentCoawaitExprClass;
5261  }
5262 };
5263 
5264 /// Represents a 'co_yield' expression.
5266  friend class ASTStmtReader;
5267 
5268 public:
5269  CoyieldExpr(SourceLocation CoyieldLoc, Expr *Operand, Expr *Common,
5270  Expr *Ready, Expr *Suspend, Expr *Resume,
5271  OpaqueValueExpr *OpaqueValue)
5272  : CoroutineSuspendExpr(CoyieldExprClass, CoyieldLoc, Operand, Common,
5273  Ready, Suspend, Resume, OpaqueValue) {}
5274  CoyieldExpr(SourceLocation CoyieldLoc, QualType Ty, Expr *Operand,
5275  Expr *Common)
5276  : CoroutineSuspendExpr(CoyieldExprClass, CoyieldLoc, Ty, Operand,
5277  Common) {}
5279  : CoroutineSuspendExpr(CoyieldExprClass, Empty) {}
5280 
5281  static bool classof(const Stmt *T) {
5282  return T->getStmtClass() == CoyieldExprClass;
5283  }
5284 };
5285 
5286 /// Represents a C++2a __builtin_bit_cast(T, v) expression. Used to implement
5287 /// std::bit_cast. These can sometimes be evaluated as part of a constant
5288 /// expression, but otherwise CodeGen to a simple memcpy in general.
5290  : public ExplicitCastExpr,
5291  private llvm::TrailingObjects<BuiltinBitCastExpr, CXXBaseSpecifier *> {
5292  friend class ASTStmtReader;
5293  friend class CastExpr;
5294  friend TrailingObjects;
5295 
5296  SourceLocation KWLoc;
5297  SourceLocation RParenLoc;
5298 
5299 public:
5301  TypeSourceInfo *DstType, SourceLocation KWLoc,
5302  SourceLocation RParenLoc)
5303  : ExplicitCastExpr(BuiltinBitCastExprClass, T, VK, CK, SrcExpr, 0, false,
5304  DstType),
5305  KWLoc(KWLoc), RParenLoc(RParenLoc) {}
5307  : ExplicitCastExpr(BuiltinBitCastExprClass, Empty, 0, false) {}
5308 
5309  SourceLocation getBeginLoc() const LLVM_READONLY { return KWLoc; }
5310  SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
5311 
5312  static bool classof(const Stmt *T) {
5313  return T->getStmtClass() == BuiltinBitCastExprClass;
5314  }
5315 };
5316 
5317 /// Represents a __builtin_num_fields expression.
5319  friend class ASTStmtReader;
5320 
5322  QualType SourceTy;
5323 
5324 public:
5326  QualType RetTy)
5327  : Expr(SYCLBuiltinNumFieldsExprClass, RetTy, VK_PRValue, OK_Ordinary),
5328  Loc(Loc), SourceTy(SourceTy) {
5330  }
5331 
5333  : Expr(SYCLBuiltinNumFieldsExprClass, Empty) {}
5334 
5335  QualType getSourceType() const { return SourceTy; }
5336  unsigned getNumFields() const {
5337  assert(!SourceTy->isDependentType());
5338  assert(SourceTy->isRecordType());
5339  const auto *RD = SourceTy->getAsRecordDecl();
5340  assert(RD);
5341  return static_cast<unsigned>(
5342  std::distance(RD->field_begin(), RD->field_end()));
5343  }
5344 
5345  SourceLocation getBeginLoc() const { return Loc; }
5346  SourceLocation getEndLoc() const { return Loc; }
5347 
5348  SourceLocation getLocation() const { return Loc; }
5349  void setLocation(SourceLocation L) { Loc = L; }
5350 
5353  }
5354 
5357  }
5358 
5359  static bool classof(const Stmt *T) {
5360  return T->getStmtClass() == SYCLBuiltinNumFieldsExprClass;
5361  }
5362 };
5363 
5364 /// Represents a __builtin_field_type expression. This does not actually return
5365 /// the type itself (it would need to be a new type in the type system rather
5366 /// than an expression to do that), but instead is a valueless expression of
5367 /// the field's type. The expected usage is to use decltype to extract the
5368 /// actual type information. This expression can only be used in an unevaluated
5369 /// context.
5371  friend class ASTStmtReader;
5372 
5374  QualType SourceTy;
5375  Stmt *Index = nullptr;
5376 
5377 public:
5379  QualType FieldTy, ExprValueKind ValueKind)
5380  : Expr(SYCLBuiltinFieldTypeExprClass, FieldTy, ValueKind, OK_Ordinary),
5381  Loc(Loc), SourceTy(SourceTy), Index(Index) {
5383  }
5384 
5386  : Expr(SYCLBuiltinFieldTypeExprClass, Empty) {}
5387 
5388  QualType getSourceType() const { return SourceTy; }
5389 
5390  const Expr *getIndex() const { return static_cast<const Expr *>(Index); }
5391  Expr *getIndex() { return static_cast<Expr *>(Index); }
5392 
5393  SourceLocation getBeginLoc() const { return Loc; }
5394  SourceLocation getEndLoc() const { return Loc; }
5395 
5396  SourceLocation getLocation() const { return Loc; }
5397  void setLocation(SourceLocation L) { Loc = L; }
5398 
5399  static bool classof(const Stmt *T) {
5400  return T->getStmtClass() == SYCLBuiltinFieldTypeExprClass;
5401  }
5402 
5403  child_range children() { return child_range(&Index, &Index + 1); }
5404 
5406  return const_child_range(&Index, &Index + 1);
5407  }
5408 };
5409 
5410 /// Represents a __builtin_num_bases expression.
5412  friend class ASTStmtReader;
5413 
5415  QualType SourceTy;
5416 
5417 public:
5419  : Expr(SYCLBuiltinNumBasesExprClass, RetTy, VK_PRValue, OK_Ordinary),
5420  Loc(Loc), SourceTy(SourceTy) {
5422  }
5423 
5425  : Expr(SYCLBuiltinNumBasesExprClass, Empty) {}
5426 
5427  QualType getSourceType() const { return SourceTy; }
5428  unsigned getNumBases() const {
5429  assert(!SourceTy->isDependentType());
5430  assert(SourceTy->isRecordType());
5431  const auto *RD = SourceTy->getAsCXXRecordDecl();
5432  assert(RD);
5433  return RD->getNumBases();
5434  }
5435 
5436  SourceLocation getBeginLoc() const { return Loc; }
5437  SourceLocation getEndLoc() const { return Loc; }
5438 
5439  SourceLocation getLocation() const { return Loc; }
5440  void setLocation(SourceLocation L) { Loc = L; }
5441 
5444  }
5445 
5448  }
5449 
5450  static bool classof(const Stmt *T) {
5451  return T->getStmtClass() == SYCLBuiltinNumBasesExprClass;
5452  }
5453 };
5454 
5455 /// Represents a __builtin_base_type expression. This has the same behavior and
5456 /// constraints as __builtin_field_type.
5458  friend class ASTStmtReader;
5459 
5461  QualType SourceTy;
5462  Stmt *Index = nullptr;
5463 
5464 public:
5466  QualType BaseTy)
5467  : Expr(SYCLBuiltinBaseTypeExprClass, BaseTy, VK_PRValue, OK_Ordinary),
5468  Loc(Loc), SourceTy(SourceTy), Index(Index) {
5470  }
5471 
5473  : Expr(SYCLBuiltinBaseTypeExprClass, Empty) {}
5474 
5475  QualType getSourceType() const { return SourceTy; }
5476 
5477  const Expr *getIndex() const { return static_cast<const Expr *>(Index); }
5478  Expr *getIndex() { return static_cast<Expr *>(Index); }
5479 
5480  SourceLocation getBeginLoc() const { return Loc; }
5481  SourceLocation getEndLoc() const { return Loc; }
5482 
5483  SourceLocation getLocation() const { return Loc; }
5484  void setLocation(SourceLocation L) { Loc = L; }
5485 
5486  static bool classof(const Stmt *T) {
5487  return T->getStmtClass() == SYCLBuiltinBaseTypeExprClass;
5488  }
5489 
5490  child_range children() { return child_range(&Index, &Index + 1); }
5491 
5493  return const_child_range(&Index, &Index + 1);
5494  }
5495 };
5496 
5497 } // namespace clang
5498 
5499 #endif // LLVM_CLANG_AST_EXPRCXX_H
This file provides AST data structures related to concepts.
#define V(N, I)
Definition: ASTContext.h:3346
const Decl * D
IndirectLocalPath & Path
enum clang::sema::@1659::IndirectLocalPathEntry::EntryKind Kind
Expr * E
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the ExceptionSpecificationType enumeration and various utility functions.
Defines enumerations for expression traits intrinsics.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines several types used to describe C++ lambda expressions that are shared between the parser and ...
Defines the clang::LangOptions interface.
Defines an enumeration for C++ overloaded operators.
SourceRange Range
Definition: SemaObjC.cpp:758
SourceLocation Loc
Definition: SemaObjC.cpp:759
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
Defines enumerations for the type traits support.
C Language Family Type Representation.
SourceLocation End
SourceLocation Begin
LineState State
__device__ __2f16 float __ockl_bool s
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Definition: APValue.h:122
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:187
Reads an AST files chain containing the contents of a translation unit.
Definition: ASTReader.h:378
An Embarcadero array type trait, as used in the implementation of __array_rank and __array_extent.
Definition: ExprCXX.h:2852
ArrayTypeTraitExpr(SourceLocation loc, ArrayTypeTrait att, TypeSourceInfo *queried, uint64_t value, Expr *dimension, SourceLocation rparen, QualType ty)
Definition: ExprCXX.h:2875
uint64_t getValue() const
Definition: ExprCXX.h:2898
TypeSourceInfo * getQueriedTypeSourceInfo() const
Definition: ExprCXX.h:2896
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:2890
ArrayTypeTrait getTrait() const
Definition: ExprCXX.h:2892
QualType getQueriedType() const
Definition: ExprCXX.h:2894
ArrayTypeTraitExpr(EmptyShell Empty)
Definition: ExprCXX.h:2886
Expr * getDimensionExpression() const
Definition: ExprCXX.h:2900
child_range children()
Definition: ExprCXX.h:2907
const_child_range children() const
Definition: ExprCXX.h:2911
static bool classof(const Stmt *T)
Definition: ExprCXX.h:2902
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:2889
StringRef getOpcodeStr() const
Definition: Expr.h:3977
Represents a C++2a __builtin_bit_cast(T, v) expression.
Definition: ExprCXX.h:5291
static bool classof(const Stmt *T)
Definition: ExprCXX.h:5312
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:5310
BuiltinBitCastExpr(EmptyShell Empty)
Definition: ExprCXX.h:5306
BuiltinBitCastExpr(QualType T, ExprValueKind VK, CastKind CK, Expr *SrcExpr, TypeSourceInfo *DstType, SourceLocation KWLoc, SourceLocation RParenLoc)
Definition: ExprCXX.h:5300
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:5309
Represents a call to a CUDA kernel function.
Definition: ExprCXX.h:231
CallExpr * getConfig()
Definition: ExprCXX.h:260
static CUDAKernelCallExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty)
Definition: ExprCXX.cpp:1921
static CUDAKernelCallExpr * Create(const ASTContext &Ctx, Expr *Fn, CallExpr *Config, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RP, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0)
Definition: ExprCXX.cpp:1907
static bool classof(const Stmt *T)
Definition: ExprCXX.h:262
const CallExpr * getConfig() const
Definition: ExprCXX.h:257
A C++ addrspace_cast expression (currently only enabled for OpenCL).
Definition: ExprCXX.h:601
static bool classof(const Stmt *T)
Definition: ExprCXX.h:623
static CXXAddrspaceCastExpr * CreateEmpty(const ASTContext &Context)
Definition: ExprCXX.cpp:898
static CXXAddrspaceCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind Kind, Expr *Op, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
Definition: ExprCXX.cpp:890
Represents binding an expression to a temporary.
Definition: ExprCXX.h:1491
CXXBindTemporaryExpr(EmptyShell Empty)
Definition: ExprCXX.h:1503
static bool classof(const Stmt *T)
Definition: ExprCXX.h:1526
void setTemporary(CXXTemporary *T)
Definition: ExprCXX.h:1511
void setSubExpr(Expr *E)
Definition: ExprCXX.h:1515
const_child_range children() const
Definition: ExprCXX.h:1533
const Expr * getSubExpr() const
Definition: ExprCXX.h:1513
static CXXBindTemporaryExpr * Create(const ASTContext &C, CXXTemporary *Temp, Expr *SubExpr)
Definition: ExprCXX.cpp:1098
child_range children()
Definition: ExprCXX.h:1531
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:1521
CXXTemporary * getTemporary()
Definition: ExprCXX.h:1509
const CXXTemporary * getTemporary() const
Definition: ExprCXX.h:1510
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:1517
A boolean literal, per ([C++ lex.bool] Boolean literals).
Definition: ExprCXX.h:720
const_child_range children() const
Definition: ExprCXX.h:755
CXXBoolLiteralExpr(bool Val, QualType Ty, SourceLocation Loc)
Definition: ExprCXX.h:722
SourceLocation getEndLoc() const
Definition: ExprCXX.h:741
static bool classof(const Stmt *T)
Definition: ExprCXX.h:746
bool getValue() const
Definition: ExprCXX.h:737
CXXBoolLiteralExpr(EmptyShell Empty)
Definition: ExprCXX.h:729
SourceLocation getBeginLoc() const
Definition: ExprCXX.h:740
void setValue(bool V)
Definition: ExprCXX.h:738
static CXXBoolLiteralExpr * Create(const ASTContext &C, bool Val, QualType Ty, SourceLocation Loc)
Definition: ExprCXX.h:732
SourceLocation getLocation() const
Definition: ExprCXX.h:743
void setLocation(SourceLocation L)
Definition: ExprCXX.h:744
child_range children()
Definition: ExprCXX.h:751
A C++ const_cast expression (C++ [expr.const.cast]).
Definition: ExprCXX.h:563
static bool classof(const Stmt *T)
Definition: ExprCXX.h:586
static CXXConstCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, Expr *Op, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
Definition: ExprCXX.cpp:876
static CXXConstCastExpr * CreateEmpty(const ASTContext &Context)
Definition: ExprCXX.cpp:885
Represents a call to a C++ constructor.
Definition: ExprCXX.h:1546
arg_iterator arg_begin()
Definition: ExprCXX.h:1675
SourceRange getParenOrBraceRange() const
Definition: ExprCXX.h:1714
void setElidable(bool E)
Definition: ExprCXX.h:1616
const_arg_iterator arg_end() const
Definition: ExprCXX.h:1678
void setStdInitListInitialization(bool V)
Definition: ExprCXX.h:1642
void setConstructionKind(CXXConstructionKind CK)
Definition: ExprCXX.h:1661
void setIsImmediateEscalating(bool Set)
Definition: ExprCXX.h:1708
llvm::iterator_range< arg_iterator > arg_range
Definition: ExprCXX.h:1667
bool isElidable() const
Whether this construction is elidable.
Definition: ExprCXX.h:1615
const Expr *const * getArgs() const
Definition: ExprCXX.h:1681
bool hadMultipleCandidates() const
Whether the referred constructor was resolved from an overloaded set having size greater than 1.
Definition: ExprCXX.h:1620
static CXXConstructExpr * Create(const ASTContext &Ctx, QualType Ty, SourceLocation Loc, CXXConstructorDecl *Ctor, bool Elidable, ArrayRef< Expr * > Args, bool HadMultipleCandidates, bool ListInitialization, bool StdInitListInitialization, bool ZeroInitialization, CXXConstructionKind ConstructKind, SourceRange ParenOrBraceRange)
Create a C++ construction expression.
Definition: ExprCXX.cpp:1160
child_range children()
Definition: ExprCXX.h:1723
const Expr * getArg(unsigned Arg) const
Definition: ExprCXX.h:1693
CXXConstructExpr(StmtClass SC, QualType Ty, SourceLocation Loc, CXXConstructorDecl *Ctor, bool Elidable, ArrayRef< Expr * > Args, bool HadMultipleCandidates, bool ListInitialization, bool StdInitListInitialization, bool ZeroInitialization, CXXConstructionKind ConstructKind, SourceRange ParenOrBraceRange)
Build a C++ construction expression.
Definition: ExprCXX.cpp:1184
arg_range arguments()
Definition: ExprCXX.h:1670
bool isStdInitListInitialization() const
Whether this constructor call was written as list-initialization, but was interpreted as forming a st...
Definition: ExprCXX.h:1639
void setListInitialization(bool V)
Definition: ExprCXX.h:1631
bool isImmediateEscalating() const
Definition: ExprCXX.h:1704
bool requiresZeroInitialization() const
Whether this construction first requires zero-initialization before the initializer is called.
Definition: ExprCXX.h:1648
void setRequiresZeroInitialization(bool ZeroInit)
Definition: ExprCXX.h:1651
SourceLocation getLocation() const
Definition: ExprCXX.h:1611
const_arg_range arguments() const
Definition: ExprCXX.h:1671
Expr * getArg(unsigned Arg)
Return the specified argument.
Definition: ExprCXX.h:1689
arg_iterator arg_end()
Definition: ExprCXX.h:1676
static unsigned sizeOfTrailingObjects(unsigned NumArgs)
Return the size in bytes of the trailing objects.
Definition: ExprCXX.h:1592
void setArg(unsigned Arg, Expr *ArgExpr)
Set the specified argument.
Definition: ExprCXX.h:1699
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.cpp:569
llvm::iterator_range< const_arg_iterator > const_arg_range
Definition: ExprCXX.h:1668
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.cpp:563
void setParenOrBraceRange(SourceRange Range)
Definition: ExprCXX.h:1715
const_arg_iterator arg_begin() const
Definition: ExprCXX.h:1677
const_child_range children() const
Definition: ExprCXX.h:1727
bool isListInitialization() const
Whether this constructor call was written as list-initialization.
Definition: ExprCXX.h:1628
unsigned getNumArgs() const
Return the number of arguments to the constructor call.
Definition: ExprCXX.h:1686
CXXConstructionKind getConstructionKind() const
Determine whether this constructor is actually constructing a base class (rather than a complete obje...
Definition: ExprCXX.h:1657
void setHadMultipleCandidates(bool V)
Definition: ExprCXX.h:1623
void setLocation(SourceLocation Loc)
Definition: ExprCXX.h:1612
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Definition: ExprCXX.h:1609
static bool classof(const Stmt *T)
Definition: ExprCXX.h:1717
static CXXConstructExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs)
Create an empty C++ construction expression.
Definition: ExprCXX.cpp:1175
Represents a C++ constructor within a class.
Definition: DeclCXX.h:2539
A default argument (C++ [dcl.fct.default]).
Definition: ExprCXX.h:1268
SourceLocation getEndLoc() const
Definition: ExprCXX.h:1347
const_child_range children() const
Definition: ExprCXX.h:1360
SourceLocation getBeginLoc() const
Default argument expressions have no representation in the source, so they have an empty source range...
Definition: ExprCXX.h:1346
DeclContext * getUsedContext()
Definition: ExprCXX.h:1339
const ParmVarDecl * getParam() const
Definition: ExprCXX.h:1310
SourceLocation getUsedLocation() const
Retrieve the location where this default argument was actually used.
Definition: ExprCXX.h:1342
const Expr * getExpr() const
Definition: ExprCXX.h:1319
const Expr * getAdjustedRewrittenExpr() const
Definition: ExprCXX.h:1334
Expr * getAdjustedRewrittenExpr()
Definition: ExprCXX.cpp:1035
SourceLocation getExprLoc() const
Definition: ExprCXX.h:1349
ParmVarDecl * getParam()
Definition: ExprCXX.h:1311
static CXXDefaultArgExpr * Create(const ASTContext &C, SourceLocation Loc, ParmVarDecl *Param, Expr *RewrittenExpr, DeclContext *UsedContext)
Definition: ExprCXX.cpp:1019
static bool classof(const Stmt *T)
Definition: ExprCXX.h:1351
static CXXDefaultArgExpr * CreateEmpty(const ASTContext &C, bool HasRewrittenInit)
Definition: ExprCXX.cpp:1012
child_range children()
Definition: ExprCXX.h:1356
const Expr * getRewrittenExpr() const
Definition: ExprCXX.h:1327
const DeclContext * getUsedContext() const
Definition: ExprCXX.h:1338
bool hasRewrittenInit() const
Definition: ExprCXX.h:1313
A use of a default initializer in a constructor or in aggregate initialization.
Definition: ExprCXX.h:1375
static CXXDefaultInitExpr * Create(const ASTContext &Ctx, SourceLocation Loc, FieldDecl *Field, DeclContext *UsedContext, Expr *RewrittenInitExpr)
Field is the non-static data member whose default initializer is used by this expression.
Definition: ExprCXX.cpp:1073
static bool classof(const Stmt *T)
Definition: ExprCXX.h:1442
child_range children()
Definition: ExprCXX.h:1447
bool hasRewrittenInit() const
Definition: ExprCXX.h:1404
Expr * getExpr()
Get the initialization expression that will be used.
Definition: ExprCXX.cpp:1085
static CXXDefaultInitExpr * CreateEmpty(const ASTContext &C, bool HasRewrittenInit)
Definition: ExprCXX.cpp:1066
Expr * getRewrittenExpr()
Retrieve the initializing expression with evaluated immediate calls, if any.
Definition: ExprCXX.h:1427
const FieldDecl * getField() const
Definition: ExprCXX.h:1410
SourceLocation getBeginLoc() const
Definition: ExprCXX.h:1439
const Expr * getRewrittenExpr() const
Retrieve the initializing expression with evaluated immediate calls, if any.
Definition: ExprCXX.h:1420
const Expr * getExpr() const
Definition: ExprCXX.h:1414
SourceLocation getEndLoc() const
Definition: ExprCXX.h:1440
const_child_range children() const
Definition: ExprCXX.h:1451
const DeclContext * getUsedContext() const
Definition: ExprCXX.h:1432
SourceLocation getUsedLocation() const
Retrieve the location where this default initializer expression was actually used.
Definition: ExprCXX.h:1437
DeclContext * getUsedContext()
Definition: ExprCXX.h:1433
FieldDecl * getField()
Get the field whose initializer will be used.
Definition: ExprCXX.h:1409
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition: ExprCXX.h:2497
static bool classof(const Stmt *T)
Definition: ExprCXX.h:2552
child_range children()
Definition: ExprCXX.h:2557
const Expr * getArgument() const
Definition: ExprCXX.h:2539
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:2548
Expr * getArgument()
Definition: ExprCXX.h:2538
bool isArrayForm() const
Definition: ExprCXX.h:2523
CXXDeleteExpr(EmptyShell Shell)
Definition: ExprCXX.h:2520
const_child_range children() const
Definition: ExprCXX.h:2559
SourceLocation getBeginLoc() const
Definition: ExprCXX.h:2547
FunctionDecl * getOperatorDelete() const
Definition: ExprCXX.h:2536
bool isGlobalDelete() const
Definition: ExprCXX.h:2522
bool doesUsualArrayDeleteWantSize() const
Answers whether the usual array deallocation function for the allocated type expects the size of the ...
Definition: ExprCXX.h:2532
QualType getDestroyedType() const
Retrieve the type being destroyed.
Definition: ExprCXX.cpp:338
bool isArrayFormAsWritten() const
Definition: ExprCXX.h:2524
CXXDeleteExpr(QualType Ty, bool GlobalDelete, bool ArrayForm, bool ArrayFormAsWritten, bool UsualArrayDeleteWantsSize, FunctionDecl *OperatorDelete, Expr *Arg, SourceLocation Loc)
Definition: ExprCXX.h:2507
Represents a C++ member access expression where the actual member referenced could not be resolved be...
Definition: ExprCXX.h:3682
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
Definition: ExprCXX.h:3785
SourceLocation getOperatorLoc() const
Retrieve the location of the '->' or '.' operator.
Definition: ExprCXX.h:3788
static CXXDependentScopeMemberExpr * Create(const ASTContext &Ctx, Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs)
Definition: ExprCXX.cpp:1534
const DeclarationNameInfo & getMemberNameInfo() const
Retrieve the name of the member that this expression refers to.
Definition: ExprCXX.h:3819
SourceLocation getLAngleLoc() const
Retrieve the location of the left angle bracket starting the explicit template argument list followin...
Definition: ExprCXX.h:3840
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding the member name, if any.
Definition: ExprCXX.h:3832
Expr * getBase() const
Retrieve the base object of this member expressions, e.g., the x in x.m.
Definition: ExprCXX.h:3776
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:3891
void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const
Copies the template arguments (if present) into the given structure.
Definition: ExprCXX.h:3863
unsigned getNumTemplateArgs() const
Retrieve the number of template arguments provided as part of this template-id.
Definition: ExprCXX.h:3880
ArrayRef< TemplateArgumentLoc > template_arguments() const
Definition: ExprCXX.h:3887
NestedNameSpecifier * getQualifier() const
Retrieve the nested-name-specifier that qualifies the member name.
Definition: ExprCXX.h:3793
bool hasExplicitTemplateArgs() const
Determines whether this member expression actually had a C++ template argument list explicitly specif...
Definition: ExprCXX.h:3859
static CXXDependentScopeMemberExpr * CreateEmpty(const ASTContext &Ctx, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs, bool HasFirstQualifierFoundInScope)
Definition: ExprCXX.cpp:1555
SourceLocation getMemberLoc() const
Definition: ExprCXX.h:3828
static bool classof(const Stmt *T)
Definition: ExprCXX.h:3905
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
Definition: ExprCXX.h:3848
DeclarationName getMember() const
Retrieve the name of the member that this expression refers to.
Definition: ExprCXX.h:3824
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:3899
const TemplateArgumentLoc * getTemplateArgs() const
Retrieve the template arguments provided as part of this template-id.
Definition: ExprCXX.h:3871
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the member name, with source location information.
Definition: ExprCXX.h:3799
const_child_range children() const
Definition: ExprCXX.h:3916
bool hasTemplateKeyword() const
Determines whether the member name was preceded by the template keyword.
Definition: ExprCXX.h:3855
bool isImplicitAccess() const
True if this is an implicit access, i.e.
Definition: ExprCXX.h:3768
NamedDecl * getFirstQualifierFoundInScope() const
Retrieve the first part of the nested-name-specifier that was found in the scope of the member access...
Definition: ExprCXX.h:3812
Represents a C++ destructor within a class.
Definition: DeclCXX.h:2803
A C++ dynamic_cast expression (C++ [expr.dynamic.cast]).
Definition: ExprCXX.h:478
static bool classof(const Stmt *T)
Definition: ExprCXX.h:507
static CXXDynamicCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind Kind, Expr *Op, const CXXCastPath *Path, TypeSourceInfo *Written, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
Definition: ExprCXX.cpp:788
static CXXDynamicCastExpr * CreateEmpty(const ASTContext &Context, unsigned pathSize)
Definition: ExprCXX.cpp:807
bool isAlwaysNull() const
isAlwaysNull - Return whether the result of the dynamic_cast is proven to always be null.
Definition: ExprCXX.cpp:821
Represents a folding of a pack over an operator.
Definition: ExprCXX.h:4839
static bool classof(const Stmt *T)
Definition: ExprCXX.h:4909
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:4893
CXXFoldExpr(EmptyShell Empty)
Definition: ExprCXX.h:4860
UnresolvedLookupExpr * getCallee() const
Definition: ExprCXX.h:4862
Expr * getInit() const
Get the operand that doesn't contain a pack, for a binary fold.
Definition: ExprCXX.h:4880
Expr * getRHS() const
Definition: ExprCXX.h:4866
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:4901
Expr * getLHS() const
Definition: ExprCXX.h:4865
const_child_range children() const
Definition: ExprCXX.h:4918
SourceLocation getLParenLoc() const
Definition: ExprCXX.h:4882
SourceLocation getEllipsisLoc() const
Definition: ExprCXX.h:4884
bool isLeftFold() const
Does this produce a left-associated sequence of operators?
Definition: ExprCXX.h:4874
CXXFoldExpr(QualType T, UnresolvedLookupExpr *Callee, SourceLocation LParenLoc, Expr *LHS, BinaryOperatorKind Opcode, SourceLocation EllipsisLoc, Expr *RHS, SourceLocation RParenLoc, std::optional< unsigned > NumExpansions)
Definition: ExprCXX.cpp:1951
std::optional< unsigned > getNumExpansions() const
Definition: ExprCXX.h:4887
child_range children()
Definition: ExprCXX.h:4914
bool isRightFold() const
Does this produce a right-associated sequence of operators?
Definition: ExprCXX.h:4869
Expr * getPattern() const
Get the pattern, that is, the operand that contains an unexpanded pack.
Definition: ExprCXX.h:4877
SourceLocation getRParenLoc() const
Definition: ExprCXX.h:4883
BinaryOperatorKind getOperator() const
Definition: ExprCXX.h:4885
Represents an explicit C++ type conversion that uses "functional" notation (C++ [expr....
Definition: ExprCXX.h:1817
void setLParenLoc(SourceLocation L)
Definition: ExprCXX.h:1855
SourceLocation getLParenLoc() const
Definition: ExprCXX.h:1854
static CXXFunctionalCastExpr * CreateEmpty(const ASTContext &Context, unsigned PathSize, bool HasFPFeatures)
Definition: ExprCXX.cpp:918
SourceLocation getRParenLoc() const
Definition: ExprCXX.h:1856
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.cpp:928
void setRParenLoc(SourceLocation L)
Definition: ExprCXX.h:1857
static bool classof(const Stmt *T)
Definition: ExprCXX.h:1865
bool isListInitialization() const
Determine whether this expression models list-initialization.
Definition: ExprCXX.h:1860
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.cpp:932
static CXXFunctionalCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, TypeSourceInfo *Written, CastKind Kind, Expr *Op, const CXXCastPath *Path, FPOptionsOverride FPO, SourceLocation LPLoc, SourceLocation RPLoc)
Definition: ExprCXX.cpp:902
Represents a call to an inherited base class constructor from an inheriting constructor.
Definition: ExprCXX.h:1737
CXXInheritedCtorInitExpr(EmptyShell Empty)
Construct an empty C++ inheriting construction expression.
Definition: ExprCXX.h:1769
const_child_range children() const
Definition: ExprCXX.h:1802
CXXConstructionKind getConstructionKind() const
Definition: ExprCXX.h:1779
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:1791
static bool classof(const Stmt *T)
Definition: ExprCXX.h:1794
bool constructsVBase() const
Determine whether this constructor is actually constructing a base class (rather than a complete obje...
Definition: ExprCXX.h:1778
CXXInheritedCtorInitExpr(SourceLocation Loc, QualType T, CXXConstructorDecl *Ctor, bool ConstructsVirtualBase, bool InheritedFromVirtualBase)
Construct a C++ inheriting construction expression.
Definition: ExprCXX.h:1757
SourceLocation getLocation() const LLVM_READONLY
Definition: ExprCXX.h:1790
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:1792
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will call.
Definition: ExprCXX.h:1774
bool inheritedFromVBase() const
Determine whether the inherited constructor is inherited from a virtual base of the object we constru...
Definition: ExprCXX.h:1788
Represents a call to a member function that may be written either with member call syntax (e....
Definition: ExprCXX.h:176
CXXMethodDecl * getMethodDecl() const
Retrieve the declaration of the called method.
Definition: ExprCXX.cpp:723
Expr * getImplicitObjectArgument() const
Retrieve the implicit object argument for the member call.
Definition: ExprCXX.cpp:704
static CXXMemberCallExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty)
Definition: ExprCXX.cpp:692
static CXXMemberCallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RP, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0)
Definition: ExprCXX.cpp:676
QualType getObjectType() const
Retrieve the type of the object argument.
Definition: ExprCXX.cpp:716
SourceLocation getExprLoc() const LLVM_READONLY
Definition: ExprCXX.h:217
static bool classof(const Stmt *T)
Definition: ExprCXX.h:225
CXXRecordDecl * getRecordDecl() const
Retrieve the CXXRecordDecl for the underlying type of the implicit object argument.
Definition: ExprCXX.cpp:732
Represents a static or instance method of a struct/union/class.
Definition: DeclCXX.h:2064
Abstract class common to all of the C++ "named"/"keyword" casts.
Definition: ExprCXX.h:372
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:408
SourceLocation getOperatorLoc() const
Retrieve the location of the cast operator keyword, e.g., static_cast.
Definition: ExprCXX.h:403
const char * getCastName() const
getCastName - Get the name of the C++ cast being used, e.g., "static_cast", "dynamic_cast",...
Definition: ExprCXX.cpp:750
CXXNamedCastExpr(StmtClass SC, QualType ty, ExprValueKind VK, CastKind kind, Expr *op, unsigned PathSize, bool HasFPFeatures, TypeSourceInfo *writtenTy, SourceLocation l, SourceLocation RParenLoc, SourceRange AngleBrackets)
Definition: ExprCXX.h:386
static bool classof(const Stmt *T)
Definition: ExprCXX.h:412
CXXNamedCastExpr(StmtClass SC, EmptyShell Shell, unsigned PathSize, bool HasFPFeatures)
Definition: ExprCXX.h:394
SourceRange getAngleBrackets() const LLVM_READONLY
Definition: ExprCXX.h:410
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:409
SourceLocation getRParenLoc() const
Retrieve the location of the closing parenthesis.
Definition: ExprCXX.h:406
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
Definition: ExprCXX.h:2240
llvm::iterator_range< const_arg_iterator > placement_arguments() const
Definition: ExprCXX.h:2447
static CXXNewExpr * CreateEmpty(const ASTContext &Ctx, bool IsArray, bool HasInit, unsigned NumPlacementArgs, bool IsParenTypeId)
Create an empty c++ new expression.
Definition: ExprCXX.cpp:315
bool isArray() const
Definition: ExprCXX.h:2348
Expr * getPlacementArg(unsigned I)
Definition: ExprCXX.h:2387
const CXXConstructExpr * getConstructExpr() const
Returns the CXXConstructExpr from this new-expression, or null.
Definition: ExprCXX.h:2425
SourceRange getDirectInitRange() const
Definition: ExprCXX.h:2480
QualType getAllocatedType() const
Definition: ExprCXX.h:2318
Expr ** getPlacementArgs()
Definition: ExprCXX.h:2382
arg_iterator placement_arg_end()
Definition: ExprCXX.h:2454
const_arg_iterator placement_arg_begin() const
Definition: ExprCXX.h:2457
SourceLocation getEndLoc() const
Definition: ExprCXX.h:2478
CXXNewInitializationStyle getInitializationStyle() const
The kind of initializer this new-expression has.
Definition: ExprCXX.h:2407
bool hasInitializer() const
Whether this new-expression has any initializer at all.
Definition: ExprCXX.h:2404
bool shouldNullCheckAllocation() const
True if the allocation result needs to be null-checked.
Definition: ExprCXX.cpp:326
static bool classof(const Stmt *T)
Definition: ExprCXX.h:2483
SourceLocation getBeginLoc() const
Definition: ExprCXX.h:2477
void setOperatorDelete(FunctionDecl *D)
Definition: ExprCXX.h:2346
bool passAlignment() const
Indicates whether the required alignment should be implicitly passed to the allocation function.
Definition: ExprCXX.h:2431
unsigned getNumPlacementArgs() const
Definition: ExprCXX.h:2378
Expr * getInitializer()
The initializer of this new-expression.
Definition: ExprCXX.h:2413
const_arg_iterator placement_arg_end() const
Definition: ExprCXX.h:2460
TypeSourceInfo * getAllocatedTypeSourceInfo() const
Definition: ExprCXX.h:2322
SourceRange getSourceRange() const
Definition: ExprCXX.h:2481
SourceRange getTypeIdParens() const
Definition: ExprCXX.h:2396
bool isParenTypeId() const
Definition: ExprCXX.h:2395
llvm::iterator_range< arg_iterator > placement_arguments()
Definition: ExprCXX.h:2443
FunctionDecl * getOperatorDelete() const
Definition: ExprCXX.h:2345
raw_arg_iterator raw_arg_end()
Definition: ExprCXX.h:2467
child_range children()
Definition: ExprCXX.h:2488
bool doesUsualArrayDeleteWantSize() const
Answers whether the usual array deallocation function for the allocated type expects the size of the ...
Definition: ExprCXX.h:2436
std::optional< const Expr * > getArraySize() const
This might return std::nullopt even if isArray() returns true, since there might not be an array size...
Definition: ExprCXX.h:2367
const_arg_iterator raw_arg_end() const
Definition: ExprCXX.h:2473
const_child_range children() const
Definition: ExprCXX.h:2490
arg_iterator placement_arg_begin()
Definition: ExprCXX.h:2451
raw_arg_iterator raw_arg_begin()
Definition: ExprCXX.h:2466
const Expr * getInitializer() const
Definition: ExprCXX.h:2418
void setOperatorNew(FunctionDecl *D)
Definition: ExprCXX.h:2344
const_arg_iterator raw_arg_begin() const
Definition: ExprCXX.h:2470
bool isGlobalNew() const
Definition: ExprCXX.h:2401
const Expr * getPlacementArg(unsigned I) const
Definition: ExprCXX.h:2391
FunctionDecl * getOperatorNew() const
Definition: ExprCXX.h:2343
std::optional< Expr * > getArraySize()
This might return std::nullopt even if isArray() returns true, since there might not be an array size...
Definition: ExprCXX.h:2353
static CXXNewExpr * Create(const ASTContext &Ctx, bool IsGlobalNew, FunctionDecl *OperatorNew, FunctionDecl *OperatorDelete, bool ShouldPassAlignment, bool UsualArrayDeleteWantsSize, ArrayRef< Expr * > PlacementArgs, SourceRange TypeIdParens, std::optional< Expr * > ArraySize, CXXNewInitializationStyle InitializationStyle, Expr *Initializer, QualType Ty, TypeSourceInfo *AllocatedTypeInfo, SourceRange Range, SourceRange DirectInitRange)
Create a c++ new expression.
Definition: ExprCXX.cpp:292
Represents a C++11 noexcept expression (C++ [expr.unary.noexcept]).
Definition: ExprCXX.h:4125
bool getValue() const
Definition: ExprCXX.h:4148
static bool classof(const Stmt *T)
Definition: ExprCXX.h:4150
Expr * getOperand() const
Definition: ExprCXX.h:4142
const_child_range children() const
Definition: ExprCXX.h:4157
SourceLocation getEndLoc() const
Definition: ExprCXX.h:4145
SourceLocation getBeginLoc() const
Definition: ExprCXX.h:4144
SourceRange getSourceRange() const
Definition: ExprCXX.h:4146
CXXNoexceptExpr(EmptyShell Empty)
Definition: ExprCXX.h:4140
CXXNoexceptExpr(QualType Ty, Expr *Operand, CanThrowResult Val, SourceLocation Keyword, SourceLocation RParen)
Definition: ExprCXX.h:4132
child_range children()
Definition: ExprCXX.h:4155
The null pointer literal (C++11 [lex.nullptr])
Definition: ExprCXX.h:765
const_child_range children() const
Definition: ExprCXX.h:790
CXXNullPtrLiteralExpr(EmptyShell Empty)
Definition: ExprCXX.h:773
void setLocation(SourceLocation L)
Definition: ExprCXX.h:780
SourceLocation getEndLoc() const
Definition: ExprCXX.h:777
static bool classof(const Stmt *T)
Definition: ExprCXX.h:782
CXXNullPtrLiteralExpr(QualType Ty, SourceLocation Loc)
Definition: ExprCXX.h:767
SourceLocation getLocation() const
Definition: ExprCXX.h:779
child_range children()
Definition: ExprCXX.h:786
SourceLocation getBeginLoc() const
Definition: ExprCXX.h:776
A call to an overloaded operator written using operator syntax.
Definition: ExprCXX.h:81
bool isInfixBinaryOp() const
Is this written as an infix binary operator?
Definition: ExprCXX.cpp:49
bool isAssignmentOp() const
Definition: ExprCXX.h:123
static bool classof(const Stmt *T)
Definition: ExprCXX.h:163
SourceLocation getOperatorLoc() const
Returns the location of the operator symbol in the expression.
Definition: ExprCXX.h:149
SourceLocation getEndLoc() const
Definition: ExprCXX.h:160
SourceLocation getExprLoc() const LLVM_READONLY
Definition: ExprCXX.h:151
OverloadedOperatorKind getOperator() const
Returns the kind of overloaded operator that this expression refers to.
Definition: ExprCXX.h:111
static CXXOperatorCallExpr * Create(const ASTContext &Ctx, OverloadedOperatorKind OpKind, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation OperatorLoc, FPOptionsOverride FPFeatures, ADLCallKind UsesADL=NotADL)
Definition: ExprCXX.cpp:612
static CXXOperatorCallExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty)
Definition: ExprCXX.cpp:627
SourceLocation getBeginLoc() const
Definition: ExprCXX.h:159
static bool isComparisonOp(OverloadedOperatorKind Opc)
Definition: ExprCXX.h:125
static bool isAssignmentOp(OverloadedOperatorKind Opc)
Definition: ExprCXX.h:116
bool isComparisonOp() const
Definition: ExprCXX.h:139
SourceRange getSourceRange() const
Definition: ExprCXX.h:161
Represents a list-initialization with parenthesis.
Definition: ExprCXX.h:4953
FieldDecl * getInitializedFieldInUnion()
Definition: ExprCXX.h:5033
const ArrayRef< Expr * > getInitExprs() const
Definition: ExprCXX.h:4997
SourceRange getSourceRange() const LLVM_READONLY
Definition: ExprCXX.h:5015
ArrayRef< Expr * > getUserSpecifiedInitExprs()
Definition: ExprCXX.h:5001
static CXXParenListInitExpr * Create(ASTContext &C, ArrayRef< Expr * > Args, QualType T, unsigned NumUserSpecifiedExprs, SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
Definition: ExprCXX.cpp:1934
const_child_range children() const
Definition: ExprCXX.h:5046
ArrayRef< Expr * > getInitExprs()
Definition: ExprCXX.h:4993
void setInitializedFieldInUnion(FieldDecl *FD)
Definition: ExprCXX.h:5029
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:5011
SourceLocation getInitLoc() const LLVM_READONLY
Definition: ExprCXX.h:5013
const FieldDecl * getInitializedFieldInUnion() const
Definition: ExprCXX.h:5037
CXXParenListInitExpr(EmptyShell Empty, unsigned NumExprs)
Definition: ExprCXX.h:4987
friend class TrailingObjects
Definition: ExprCXX.h:4954
static CXXParenListInitExpr * CreateEmpty(ASTContext &C, unsigned numExprs, EmptyShell Empty)
Definition: ExprCXX.cpp:1943
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:5009
static bool classof(const Stmt *T)
Definition: ExprCXX.h:5052
const ArrayRef< Expr * > getUserSpecifiedInitExprs() const
Definition: ExprCXX.h:5005
child_range children()
Definition: ExprCXX.h:5041
const Expr * getArrayFiller() const
Definition: ExprCXX.h:5025
void setArrayFiller(Expr *E)
Definition: ExprCXX.h:5019
Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
Definition: ExprCXX.h:2616
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:2740
bool isArrow() const
Determine whether this pseudo-destructor expression was written using an '->' (otherwise,...
Definition: ExprCXX.h:2680
CXXPseudoDestructorExpr(const ASTContext &Context, Expr *Base, bool isArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, TypeSourceInfo *ScopeType, SourceLocation ColonColonLoc, SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType)
Definition: ExprCXX.cpp:371
static bool classof(const Stmt *T)
Definition: ExprCXX.h:2745
SourceLocation getTildeLoc() const
Retrieve the location of the '~'.
Definition: ExprCXX.h:2701
TypeSourceInfo * getScopeTypeInfo() const
Retrieve the scope type in a qualified pseudo-destructor expression.
Definition: ExprCXX.h:2694
NestedNameSpecifierLoc getQualifierLoc() const
Retrieves the nested-name-specifier that qualifies the type name, with source-location information.
Definition: ExprCXX.h:2669
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.cpp:392
SourceLocation getDestroyedTypeLoc() const
Retrieve the starting location of the type being destroyed.
Definition: ExprCXX.h:2725
const IdentifierInfo * getDestroyedTypeIdentifier() const
In a dependent pseudo-destructor expression for which we do not have full type information on the des...
Definition: ExprCXX.h:2717
SourceLocation getColonColonLoc() const
Retrieve the location of the '::' in a qualified pseudo-destructor expression.
Definition: ExprCXX.h:2698
const_child_range children() const
Definition: ExprCXX.h:2752
QualType getDestroyedType() const
Retrieve the type being destroyed.
Definition: ExprCXX.cpp:385
SourceLocation getOperatorLoc() const
Retrieve the location of the '.' or '->' operator.
Definition: ExprCXX.h:2683
NestedNameSpecifier * getQualifier() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name.
Definition: ExprCXX.h:2674
void setDestroyedType(IdentifierInfo *II, SourceLocation Loc)
Set the name of destroyed type for a dependent pseudo-destructor expression.
Definition: ExprCXX.h:2731
TypeSourceInfo * getDestroyedTypeInfo() const
Retrieve the source location information for the type being destroyed.
Definition: ExprCXX.h:2710
void setDestroyedType(TypeSourceInfo *Info)
Set the destroyed type.
Definition: ExprCXX.h:2736
bool hasQualifier() const
Determines whether this member expression actually had a C++ nested-name-specifier prior to the name ...
Definition: ExprCXX.h:2665
CXXPseudoDestructorExpr(EmptyShell Shell)
Definition: ExprCXX.h:2657
Represents a C++ struct/union/class.
Definition: DeclCXX.h:258
A C++ reinterpret_cast expression (C++ [expr.reinterpret.cast]).
Definition: ExprCXX.h:523
static CXXReinterpretCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind Kind, Expr *Op, const CXXCastPath *Path, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
Definition: ExprCXX.cpp:853
static bool classof(const Stmt *T)
Definition: ExprCXX.h:549
static CXXReinterpretCastExpr * CreateEmpty(const ASTContext &Context, unsigned pathSize)
Definition: ExprCXX.cpp:871
A rewritten comparison expression that was originally written using operator syntax.
Definition: ExprCXX.h:283
SourceLocation getOperatorLoc() const LLVM_READONLY
Definition: ExprCXX.h:335
BinaryOperatorKind getOperator() const
Definition: ExprCXX.h:321
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:347
SourceRange getSourceRange() const LLVM_READONLY
Definition: ExprCXX.h:350
bool isReversed() const
Determine whether this expression was rewritten in reverse form.
Definition: ExprCXX.h:319
CXXRewrittenBinaryOperator(Expr *SemanticForm, bool IsReversed)
Definition: ExprCXX.h:290
StringRef getOpcodeStr() const
Definition: ExprCXX.h:326
CXXRewrittenBinaryOperator(EmptyShell Empty)
Definition: ExprCXX.h:297
SourceLocation getBeginLoc() const LLVM_READONLY
Compute the begin and end locations from the decomposed form.
Definition: ExprCXX.h:344
SourceLocation getExprLoc() const LLVM_READONLY
Definition: ExprCXX.h:338
const Expr * getRHS() const
Definition: ExprCXX.h:333
static bool classof(const Stmt *T)
Definition: ExprCXX.h:360
Expr * getSemanticForm()
Get an equivalent semantic form for this expression.
Definition: ExprCXX.h:301
const Expr * getSemanticForm() const
Definition: ExprCXX.h:302
BinaryOperatorKind getOpcode() const
Definition: ExprCXX.h:322
const Expr * getLHS() const
Definition: ExprCXX.h:332
static StringRef getOpcodeStr(BinaryOperatorKind Op)
Definition: ExprCXX.h:323
DecomposedForm getDecomposedForm() const LLVM_READONLY
Decompose this operator into its syntactic form.
Definition: ExprCXX.cpp:66
An expression "T()" which creates a value-initialized rvalue of type T, which is a non-class type.
Definition: ExprCXX.h:2181
CXXScalarValueInitExpr(EmptyShell Shell)
Definition: ExprCXX.h:2197
const_child_range children() const
Definition: ExprCXX.h:2220
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.cpp:224
TypeSourceInfo * getTypeSourceInfo() const
Definition: ExprCXX.h:2200
static bool classof(const Stmt *T)
Definition: ExprCXX.h:2211
SourceLocation getEndLoc() const
Definition: ExprCXX.h:2209
SourceLocation getRParenLoc() const
Definition: ExprCXX.h:2204
CXXScalarValueInitExpr(QualType Type, TypeSourceInfo *TypeInfo, SourceLocation RParenLoc)
Create an explicitly-written scalar-value initialization expression.
Definition: ExprCXX.h:2189
A C++ static_cast expression (C++ [expr.static.cast]).
Definition: ExprCXX.h:433
static CXXStaticCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K, Expr *Op, const CXXCastPath *Path, TypeSourceInfo *Written, FPOptionsOverride FPO, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
Definition: ExprCXX.cpp:762
static CXXStaticCastExpr * CreateEmpty(const ASTContext &Context, unsigned PathSize, bool hasFPFeatures)
Definition: ExprCXX.cpp:779
static bool classof(const Stmt *T)
Definition: ExprCXX.h:466
Implicit construction of a std::initializer_list<T> object from an array temporary within list-initia...
Definition: ExprCXX.h:797
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range of the expression.
Definition: ExprCXX.h:825
const_child_range children() const
Definition: ExprCXX.h:835
CXXStdInitializerListExpr(QualType Ty, Expr *SubExpr)
Definition: ExprCXX.h:807
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:820
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:816
const Expr * getSubExpr() const
Definition: ExprCXX.h:814
static bool classof(const Stmt *S)
Definition: ExprCXX.h:829
Represents a C++ functional cast expression that builds a temporary object.
Definition: ExprCXX.h:1885
static CXXTemporaryObjectExpr * Create(const ASTContext &Ctx, CXXConstructorDecl *Cons, QualType Ty, TypeSourceInfo *TSI, ArrayRef< Expr * > Args, SourceRange ParenOrBraceRange, bool HadMultipleCandidates, bool ListInitialization, bool StdInitListInitialization, bool ZeroInitialization)
Definition: ExprCXX.cpp:1126
TypeSourceInfo * getTypeSourceInfo() const
Definition: ExprCXX.h:1914
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.cpp:1153
static CXXTemporaryObjectExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs)
Definition: ExprCXX.cpp:1141
static bool classof(const Stmt *T)
Definition: ExprCXX.h:1919
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.cpp:1149
Represents a C++ temporary.
Definition: ExprCXX.h:1457
const CXXDestructorDecl * getDestructor() const
Definition: ExprCXX.h:1468
void setDestructor(const CXXDestructorDecl *Dtor)
Definition: ExprCXX.h:1470
static CXXTemporary * Create(const ASTContext &C, const CXXDestructorDecl *Destructor)
Definition: ExprCXX.cpp:1093
Represents the this expression in C++.
Definition: ExprCXX.h:1152
void setCapturedByCopyInLambdaWithExplicitObjectParameter(bool Set)
Definition: ExprCXX.h:1182
SourceLocation getBeginLoc() const
Definition: ExprCXX.h:1172
void setLocation(SourceLocation L)
Definition: ExprCXX.h:1170
SourceLocation getEndLoc() const
Definition: ExprCXX.h:1173
bool isCapturedByCopyInLambdaWithExplicitObjectParameter() const
Definition: ExprCXX.h:1178
static CXXThisExpr * CreateEmpty(const ASTContext &Ctx)
Definition: ExprCXX.cpp:1575
void setImplicit(bool I)
Definition: ExprCXX.h:1176
child_range children()
Definition: ExprCXX.h:1192
bool isImplicit() const
Definition: ExprCXX.h:1175
static bool classof(const Stmt *T)
Definition: ExprCXX.h:1187
const_child_range children() const
Definition: ExprCXX.h:1196
static CXXThisExpr * Create(const ASTContext &Ctx, SourceLocation L, QualType Ty, bool IsImplicit)
Definition: ExprCXX.cpp:1569
SourceLocation getLocation() const
Definition: ExprCXX.h:1169
A C++ throw-expression (C++ [except.throw]).
Definition: ExprCXX.h:1206
CXXThrowExpr(EmptyShell Empty)
Definition: ExprCXX.h:1224
const Expr * getSubExpr() const
Definition: ExprCXX.h:1226
const_child_range children() const
Definition: ExprCXX.h:1256
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:1241
CXXThrowExpr(Expr *Operand, QualType Ty, SourceLocation Loc, bool IsThrownVariableInScope)
Definition: ExprCXX.h:1217
SourceLocation getThrowLoc() const
Definition: ExprCXX.h:1229
SourceLocation getBeginLoc() const
Definition: ExprCXX.h:1240
bool isThrownVariableInScope() const
Determines whether the variable thrown by this expression (if any!) is within the innermost try block...
Definition: ExprCXX.h:1236
static bool classof(const Stmt *T)
Definition: ExprCXX.h:1247
child_range children()
Definition: ExprCXX.h:1252
Expr * getSubExpr()
Definition: ExprCXX.h:1227
A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...
Definition: ExprCXX.h:845
CXXTypeidExpr(QualType Ty, Expr *Operand, SourceRange R)
Definition: ExprCXX.h:859
static bool classof(const Stmt *T)
Definition: ExprCXX.h:902
TypeSourceInfo * getTypeOperandSourceInfo() const
Retrieve source information for the type operand.
Definition: ExprCXX.h:888
QualType getTypeOperand(ASTContext &Context) const
Retrieves the type operand of this typeid() expression after various required adjustments (removing r...
Definition: ExprCXX.cpp:162
CXXTypeidExpr(QualType Ty, TypeSourceInfo *Operand, SourceRange R)
Definition: ExprCXX.h:853
bool isTypeOperand() const
Definition: ExprCXX.h:881
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:897
child_range children()
Definition: ExprCXX.h:907
bool isMostDerived(ASTContext &Context) const
Best-effort check if the expression operand refers to a most derived object.
Definition: ExprCXX.cpp:150
SourceRange getSourceRange() const LLVM_READONLY
Definition: ExprCXX.h:899
void setSourceRange(SourceRange R)
Definition: ExprCXX.h:900
const_child_range children() const
Definition: ExprCXX.h:914
Expr * getExprOperand() const
Definition: ExprCXX.h:892
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:898
bool isPotentiallyEvaluated() const
Determine whether this typeid has a type operand which is potentially evaluated, per C++11 [expr....
Definition: ExprCXX.cpp:135
CXXTypeidExpr(EmptyShell Empty, bool isExpr)
Definition: ExprCXX.h:865
bool hasNullCheck() const
Whether this is of a form like "typeid(*ptr)" that can throw a std::bad_typeid if a pointer is a null...
Definition: ExprCXX.cpp:201
Describes an explicit type conversion that uses functional notion but could not be resolved because o...
Definition: ExprCXX.h:3556
const_child_range children() const
Definition: ExprCXX.h:3664
const Expr *const * const_arg_iterator
Definition: ExprCXX.h:3623
void setRParenLoc(SourceLocation L)
Definition: ExprCXX.h:3606
void setArg(unsigned I, Expr *E)
Definition: ExprCXX.h:3642
SourceLocation getLParenLoc() const
Retrieve the location of the left parentheses ('(') that precedes the argument list.
Definition: ExprCXX.h:3600
bool isListInitialization() const
Determine whether this expression models list-initialization.
Definition: ExprCXX.h:3611
static CXXUnresolvedConstructExpr * Create(const ASTContext &Context, QualType T, TypeSourceInfo *TSI, SourceLocation LParenLoc, ArrayRef< Expr * > Args, SourceLocation RParenLoc, bool IsListInit)
Definition: ExprCXX.cpp:1472
const_arg_range arguments() const
Definition: ExprCXX.h:3628
const Expr * getArg(unsigned I) const
Definition: ExprCXX.h:3637
QualType getTypeAsWritten() const
Retrieve the type that is being constructed, as specified in the source code.
Definition: ExprCXX.h:3590
const_arg_iterator arg_end() const
Definition: ExprCXX.h:3627
TypeSourceInfo * getTypeSourceInfo() const
Retrieve the type source information for the type being constructed.
Definition: ExprCXX.h:3594
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:3648
llvm::iterator_range< const_arg_iterator > const_arg_range
Definition: ExprCXX.h:3624
void setLParenLoc(SourceLocation L)
Definition: ExprCXX.h:3601
SourceLocation getRParenLoc() const
Retrieve the location of the right parentheses (')') that follows the argument list.
Definition: ExprCXX.h:3605
Expr * getArg(unsigned I)
Definition: ExprCXX.h:3632
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.cpp:1488
unsigned getNumArgs() const
Retrieve the number of arguments.
Definition: ExprCXX.h:3614
static bool classof(const Stmt *T)
Definition: ExprCXX.h:3654
static CXXUnresolvedConstructExpr * CreateEmpty(const ASTContext &Context, unsigned NumArgs)
Definition: ExprCXX.cpp:1482
llvm::iterator_range< arg_iterator > arg_range
Definition: ExprCXX.h:3617
const_arg_iterator arg_begin() const
Definition: ExprCXX.h:3626
A Microsoft C++ __uuidof expression, which gets the _GUID that corresponds to the supplied type or ex...
Definition: ExprCXX.h:1066
child_range children()
Definition: ExprCXX.h:1124
Expr * getExprOperand() const
Definition: ExprCXX.h:1107
TypeSourceInfo * getTypeOperandSourceInfo() const
Retrieve source information for the type operand.
Definition: ExprCXX.h:1103
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:1114
static bool classof(const Stmt *T)
Definition: ExprCXX.h:1119
const_child_range children() const
Definition: ExprCXX.h:1131
MSGuidDecl * getGuidDecl() const
Definition: ExprCXX.h:1112
CXXUuidofExpr(QualType Ty, TypeSourceInfo *Operand, MSGuidDecl *Guid, SourceRange R)
Definition: ExprCXX.h:1075
QualType getTypeOperand(ASTContext &Context) const
Retrieves the type operand of this __uuidof() expression after various required adjustments (removing...
Definition: ExprCXX.cpp:216
bool isTypeOperand() const
Definition: ExprCXX.h:1096
CXXUuidofExpr(QualType Ty, Expr *Operand, MSGuidDecl *Guid, SourceRange R)
Definition: ExprCXX.h:1082
void setSourceRange(SourceRange R)
Definition: ExprCXX.h:1117
SourceRange getSourceRange() const LLVM_READONLY
Definition: ExprCXX.h:1116
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:1115
CXXUuidofExpr(EmptyShell Empty, bool isExpr)
Definition: ExprCXX.h:1088
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition: Expr.h:2882
static constexpr ADLCallKind NotADL
Definition: Expr.h:2939
Stmt * getPreArg(unsigned I)
Definition: Expr.h:2962
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: Expr.cpp:1693
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
Definition: Expr.h:3073
SourceLocation getRParenLoc() const
Definition: Expr.h:3197
Expr * getCallee()
Definition: Expr.h:3032
static constexpr ADLCallKind UsesADL
Definition: Expr.h:2940
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Definition: Expr.h:3550
FPOptionsOverride * getTrailingFPFeatures()
Return a pointer to the trailing FPOptions.
Definition: Expr.cpp:2109
unsigned path_size() const
Definition: Expr.h:3619
bool hasStoredFPFeatures() const
Definition: Expr.h:3649
Represents a 'co_await' expression.
Definition: ExprCXX.h:5184
void setIsImplicit(bool value=true)
Definition: ExprCXX.h:5207
bool isImplicit() const
Definition: ExprCXX.h:5206
static bool classof(const Stmt *T)
Definition: ExprCXX.h:5209
CoawaitExpr(EmptyShell Empty)
Definition: ExprCXX.h:5203
CoawaitExpr(SourceLocation CoawaitLoc, QualType Ty, Expr *Operand, Expr *Common, bool IsImplicit=false)
Definition: ExprCXX.h:5196
CoawaitExpr(SourceLocation CoawaitLoc, Expr *Operand, Expr *Common, Expr *Ready, Expr *Suspend, Expr *Resume, OpaqueValueExpr *OpaqueValue, bool IsImplicit=false)
Definition: ExprCXX.h:5188
CompoundStmt - This represents a group of statements like { stmt stmt }.
Definition: Stmt.h:1606
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
Definition: Expr.h:1077
llvm::APSInt getResultAsAPSInt() const
Definition: Expr.cpp:401
Represents an expression that might suspend coroutine execution; either a co_await or co_yield expres...
Definition: ExprCXX.h:5070
Expr * getSuspendExpr() const
Definition: ExprCXX.h:5130
SuspendReturnType getSuspendReturnType() const
Definition: ExprCXX.h:5143
CoroutineSuspendExpr(StmtClass SC, SourceLocation KeywordLoc, Expr *Operand, Expr *Common, Expr *Ready, Expr *Suspend, Expr *Resume, OpaqueValueExpr *OpaqueValue)
Definition: ExprCXX.h:5084
SourceLocation getKeywordLoc() const
Definition: ExprCXX.h:5161
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:5163
CoroutineSuspendExpr(StmtClass SC, SourceLocation KeywordLoc, QualType Ty, Expr *Operand, Expr *Common)
Definition: ExprCXX.h:5098
static bool classof(const Stmt *T)
Definition: ExprCXX.h:5177
Expr * getCommonExpr() const
Definition: ExprCXX.h:5119
const_child_range children() const
Definition: ExprCXX.h:5173
child_range children()
Definition: ExprCXX.h:5169
Expr * getOperand() const
Definition: ExprCXX.h:5139
Expr * getReadyExpr() const
Definition: ExprCXX.h:5126
CoroutineSuspendExpr(StmtClass SC, EmptyShell Empty)
Definition: ExprCXX.h:5111
Expr * getResumeExpr() const
Definition: ExprCXX.h:5134
OpaqueValueExpr * getOpaqueValue() const
getOpaqueValue - Return the opaque value placeholder.
Definition: ExprCXX.h:5124
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:5165
Represents a 'co_yield' expression.
Definition: ExprCXX.h:5265
CoyieldExpr(EmptyShell Empty)
Definition: ExprCXX.h:5278
CoyieldExpr(SourceLocation CoyieldLoc, Expr *Operand, Expr *Common, Expr *Ready, Expr *Suspend, Expr *Resume, OpaqueValueExpr *OpaqueValue)
Definition: ExprCXX.h:5269
static bool classof(const Stmt *T)
Definition: ExprCXX.h:5281
CoyieldExpr(SourceLocation CoyieldLoc, QualType Ty, Expr *Operand, Expr *Common)
Definition: ExprCXX.h:5274
A POD class for pairing a NamedDecl* with an access specifier.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1436
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
The name of a declaration.
Represents a 'co_await' expression while the type of the promise is dependent.
Definition: ExprCXX.h:5216
static bool classof(const Stmt *T)
Definition: ExprCXX.h:5259
DependentCoawaitExpr(EmptyShell Empty)
Definition: ExprCXX.h:5236
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:5249
const_child_range children() const
Definition: ExprCXX.h:5255
Expr * getOperand() const
Definition: ExprCXX.h:5239
UnresolvedLookupExpr * getOperatorCoawaitLookup() const
Definition: ExprCXX.h:5241
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:5247
DependentCoawaitExpr(SourceLocation KeywordLoc, QualType Ty, Expr *Op, UnresolvedLookupExpr *OpCoawait)
Definition: ExprCXX.h:5223
SourceLocation getKeywordLoc() const
Definition: ExprCXX.h:5245
child_range children()
Definition: ExprCXX.h:5253
A qualified reference to a name whose declaration cannot yet be resolved.
Definition: ExprCXX.h:3322
static DependentScopeDeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)
Definition: ExprCXX.cpp:532
const DeclarationNameInfo & getNameInfo() const
Retrieve the name that this expression refers to.
Definition: ExprCXX.h:3358
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
Definition: ExprCXX.h:3396
static DependentScopeDeclRefExpr * CreateEmpty(const ASTContext &Context, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs)
Definition: ExprCXX.cpp:547
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source location information.
Definition: ExprCXX.h:3370
SourceLocation getLocation() const
Retrieve the location of the name within the expression.
Definition: ExprCXX.h:3366
SourceLocation getLAngleLoc() const
Retrieve the location of the left angle bracket starting the explicit template argument list followin...
Definition: ExprCXX.h:3388
const_child_range children() const
Definition: ExprCXX.h:3454
static bool classof(const Stmt *T)
Definition: ExprCXX.h:3446
bool hasExplicitTemplateArgs() const
Determines whether this lookup had explicit template arguments.
Definition: ExprCXX.h:3406
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:3440
SourceLocation getBeginLoc() const LLVM_READONLY
Note: getBeginLoc() is the start of the whole DependentScopeDeclRefExpr, and differs from getLocation...
Definition: ExprCXX.h:3436
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding this name, if any.
Definition: ExprCXX.h:3380
bool hasTemplateKeyword() const
Determines whether the name was preceded by the template keyword.
Definition: ExprCXX.h:3403
TemplateArgumentLoc const * getTemplateArgs() const
Definition: ExprCXX.h:3416
unsigned getNumTemplateArgs() const
Definition: ExprCXX.h:3423
DeclarationName getDeclName() const
Retrieve the name that this expression refers to.
Definition: ExprCXX.h:3361
void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const
Copies the template arguments (if present) into the given structure.
Definition: ExprCXX.h:3410
ArrayRef< TemplateArgumentLoc > template_arguments() const
Definition: ExprCXX.h:3430
NestedNameSpecifier * getQualifier() const
Retrieve the nested-name-specifier that qualifies this declaration.
Definition: ExprCXX.h:3374
ExplicitCastExpr - An explicit cast written in the source code.
Definition: Expr.h:3802
ExplicitCastExpr(StmtClass SC, QualType exprTy, ExprValueKind VK, CastKind kind, Expr *op, unsigned PathSize, bool HasFPFeatures, TypeSourceInfo *writtenTy)
Definition: Expr.h:3808
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
Definition: ExprCXX.h:3473
bool cleanupsHaveSideEffects() const
Definition: ExprCXX.h:3508
static bool classof(const Stmt *T)
Definition: ExprCXX.h:3521
CleanupObject getObject(unsigned i) const
Definition: ExprCXX.h:3503
child_range children()
Definition: ExprCXX.h:3526
unsigned getNumObjects() const
Definition: ExprCXX.h:3501
ArrayRef< CleanupObject > getObjects() const
Definition: ExprCXX.h:3497
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:3516
const_child_range children() const
Definition: ExprCXX.h:3528
llvm::PointerUnion< BlockDecl *, CompoundLiteralExpr * > CleanupObject
The type of objects that are kept in the cleanup.
Definition: ExprCXX.h:3479
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:3512
static ExprWithCleanups * Create(const ASTContext &C, EmptyShell empty, unsigned numObjects)
Definition: ExprCXX.cpp:1447
This represents one expression.
Definition: Expr.h:110
bool isImplicitCXXThis() const
Whether this expression is an implicit reference to 'this' in C++.
Definition: Expr.cpp:3298
bool isValueDependent() const
Determines whether the value of this expression depends on.
Definition: Expr.h:175
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
Definition: Expr.h:437
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Definition: Expr.h:192
bool containsUnexpandedParameterPack() const
Whether this expression contains an unexpanded parameter pack (for C++11 variadic templates).
Definition: Expr.h:239
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
Definition: Expr.h:277
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
Definition: Expr.h:444
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
Definition: Expr.h:221
Expr()=delete
void setValueKind(ExprValueKind Cat)
setValueKind - Set the value kind produced by this expression.
Definition: Expr.h:454
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition: Expr.cpp:277
QualType getType() const
Definition: Expr.h:142
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
Definition: Expr.h:427
void setDependence(ExprDependence Deps)
Each concrete expr subclass is expected to compute its dependence and call this in the constructor.
Definition: Expr.h:135
An expression trait intrinsic.
Definition: ExprCXX.h:2923
ExpressionTraitExpr(SourceLocation loc, ExpressionTrait et, Expr *queried, bool value, SourceLocation rparen, QualType resultType)
Definition: ExprCXX.h:2944
static bool classof(const Stmt *T)
Definition: ExprCXX.h:2966
Expr * getQueriedExpression() const
Definition: ExprCXX.h:2962
ExpressionTraitExpr(EmptyShell Empty)
Definition: ExprCXX.h:2954
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:2957
ExpressionTrait getTrait() const
Definition: ExprCXX.h:2960
child_range children()
Definition: ExprCXX.h:2971
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:2958
const_child_range children() const
Definition: ExprCXX.h:2975
Represents difference between two FPOptions values.
Definition: LangOptions.h:958
bool requiresTrailingStorage() const
Definition: LangOptions.h:984
Represents a member of a struct/union/class.
Definition: Decl.h:3031
FullExpr - Represents a "full-expression" node.
Definition: Expr.h:1044
Stmt * SubExpr
Definition: Expr.h:1046
Represents a function declaration or definition.
Definition: Decl.h:1933
Represents a reference to a function parameter pack or init-capture pack that has been substituted bu...
Definition: ExprCXX.h:4647
const_child_range children() const
Definition: ExprCXX.h:4702
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:4692
VarDecl * getParameterPack() const
Get the parameter pack which this expression refers to.
Definition: ExprCXX.h:4674
iterator end() const
Definition: ExprCXX.h:4683
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:4691
VarDecl *const * iterator
Iterators over the parameters which the parameter pack expanded into.
Definition: ExprCXX.h:4681
unsigned getNumExpansions() const
Get the number of parameters in this parameter pack.
Definition: ExprCXX.h:4686
static bool classof(const Stmt *T)
Definition: ExprCXX.h:4694
SourceLocation getParameterPackLocation() const
Get the location of the parameter pack.
Definition: ExprCXX.h:4677
static FunctionParmPackExpr * Create(const ASTContext &Context, QualType T, VarDecl *ParamPack, SourceLocation NameLoc, ArrayRef< VarDecl * > Params)
Definition: ExprCXX.cpp:1797
child_range children()
Definition: ExprCXX.h:4698
VarDecl * getExpansion(unsigned I) const
Get an expansion of the parameter pack by index.
Definition: ExprCXX.h:4689
static FunctionParmPackExpr * CreateEmpty(const ASTContext &Context, unsigned NumParams)
Definition: ExprCXX.cpp:1805
iterator begin() const
Definition: ExprCXX.h:4682
Declaration of a template function.
Definition: DeclTemplate.h:957
One of these records is kept for each identifier that is lexed.
Describes the capture of a variable or of this, or of a C++1y init-capture.
Definition: LambdaCapture.h:25
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
Definition: ExprCXX.h:1954
capture_iterator capture_begin() const
Retrieve an iterator pointing to the first lambda capture.
Definition: ExprCXX.cpp:1345
static LambdaExpr * CreateDeserialized(const ASTContext &C, unsigned NumCaptures)
Construct a new lambda expression that will be deserialized from an external source.
Definition: ExprCXX.cpp:1314
static LambdaExpr * Create(const ASTContext &C, CXXRecordDecl *Class, SourceRange IntroducerRange, LambdaCaptureDefault CaptureDefault, SourceLocation CaptureDefaultLoc, bool ExplicitParams, bool ExplicitResultType, ArrayRef< Expr * > CaptureInits, SourceLocation ClosingBrace, bool ContainsUnexpandedParameterPack)
Construct a new lambda expression.
Definition: ExprCXX.cpp:1294
llvm::iterator_range< capture_init_iterator > capture_inits()
Retrieve the initialization expressions for this lambda's captures.
Definition: ExprCXX.h:2069
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:2172
Stmt * getBody() const
Retrieve the body of the lambda.
Definition: ExprCXX.cpp:1328
bool hasExplicitParameters() const
Determine whether this lambda has an explicit parameter list vs.
Definition: ExprCXX.h:2157
const_capture_init_iterator capture_init_begin() const
Retrieve the first initialization argument for this lambda expression (which initializes the first ca...
Definition: ExprCXX.h:2086
bool isGenericLambda() const
Whether this is a generic lambda.
Definition: ExprCXX.h:2134
SourceRange getIntroducerRange() const
Retrieve the source range covering the lambda introducer, which contains the explicit capture list su...
Definition: ExprCXX.h:2105
bool isMutable() const
Determine whether the lambda is mutable, meaning that any captures values can be modified.
Definition: ExprCXX.cpp:1410
capture_iterator implicit_capture_end() const
Retrieve an iterator pointing past the end of the sequence of implicit lambda captures.
Definition: ExprCXX.cpp:1374
llvm::iterator_range< const_capture_init_iterator > capture_inits() const
Retrieve the initialization expressions for this lambda's captures.
Definition: ExprCXX.h:2074
friend TrailingObjects
Definition: ExprCXX.h:1991
unsigned capture_size() const
Determine the number of captures in this lambda.
Definition: ExprCXX.h:2035
capture_range explicit_captures() const
Retrieve this lambda's explicit captures.
Definition: ExprCXX.cpp:1366
bool isInitCapture(const LambdaCapture *Capture) const
Determine whether one of this lambda's captures is an init-capture.
Definition: ExprCXX.cpp:1340
const_capture_init_iterator capture_init_end() const
Retrieve the iterator pointing one past the last initialization argument for this lambda expression.
Definition: ExprCXX.h:2098
CXXMethodDecl * getCallOperator() const
Retrieve the function call operator associated with this lambda expression.
Definition: ExprCXX.cpp:1386
const CompoundStmt * getCompoundStmtBody() const
Retrieve the CompoundStmt representing the body of the lambda.
Definition: ExprCXX.cpp:1333
bool hasExplicitResultType() const
Whether this lambda had its result type explicitly specified.
Definition: ExprCXX.h:2160
capture_range implicit_captures() const
Retrieve this lambda's implicit captures.
Definition: ExprCXX.cpp:1378
TemplateParameterList * getTemplateParameterList() const
If this is a generic lambda expression, retrieve the template parameter list associated with it,...
Definition: ExprCXX.cpp:1396
ArrayRef< NamedDecl * > getExplicitTemplateParameters() const
Get the template parameters were explicitly specified (as opposed to being invented by use of an auto...
Definition: ExprCXX.cpp:1401
capture_iterator implicit_capture_begin() const
Retrieve an iterator pointing to the first implicit lambda capture.
Definition: ExprCXX.cpp:1370
capture_iterator explicit_capture_end() const
Retrieve an iterator pointing past the end of the sequence of explicit lambda captures.
Definition: ExprCXX.cpp:1361
capture_iterator capture_end() const
Retrieve an iterator pointing past the end of the sequence of lambda captures.
Definition: ExprCXX.cpp:1349
llvm::iterator_range< capture_iterator > capture_range
An iterator over a range of lambda captures.
Definition: ExprCXX.h:2022
SourceLocation getCaptureDefaultLoc() const
Retrieve the location of this lambda's capture-default, if any.
Definition: ExprCXX.h:2012
capture_init_iterator capture_init_end()
Retrieve the iterator pointing one past the last initialization argument for this lambda expression.
Definition: ExprCXX.h:2092
const LambdaCapture * capture_iterator
An iterator that walks over the captures of the lambda, both implicit and explicit.
Definition: ExprCXX.h:2019
Expr *const * const_capture_init_iterator
Const iterator that walks over the capture initialization arguments.
Definition: ExprCXX.h:2066
Expr * getTrailingRequiresClause() const
Get the trailing requires clause, if any.
Definition: ExprCXX.cpp:1406
capture_iterator explicit_capture_begin() const
Retrieve an iterator pointing to the first explicit lambda capture.
Definition: ExprCXX.cpp:1357
child_range children()
Includes the captures and the body of the lambda.
Definition: ExprCXX.cpp:1412
FunctionTemplateDecl * getDependentCallOperator() const
Retrieve the function template call operator associated with this lambda expression.
Definition: ExprCXX.cpp:1391
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:2168
static bool classof(const Stmt *T)
Definition: ExprCXX.h:2164
capture_range captures() const
Retrieve this lambda's captures.
Definition: ExprCXX.cpp:1353
capture_init_iterator capture_init_begin()
Retrieve the first initialization argument for this lambda expression (which initializes the first ca...
Definition: ExprCXX.h:2080
CompoundStmt * getCompoundStmtBody()
Definition: ExprCXX.h:2146
LambdaCaptureDefault getCaptureDefault() const
Determine the default capture kind for this lambda.
Definition: ExprCXX.h:2007
CXXRecordDecl * getLambdaClass() const
Retrieve the class that corresponds to the lambda.
Definition: ExprCXX.cpp:1382
Implicit declaration of a temporary that was materialized by a MaterializeTemporaryExpr and lifetime-...
Definition: DeclCXX.h:3233
unsigned getManglingNumber() const
Definition: DeclCXX.h:3282
Stmt::child_range childrenExpr()
Definition: DeclCXX.h:3291
Expr * getTemporaryExpr()
Retrieve the expression to which the temporary materialization conversion was applied.
Definition: DeclCXX.h:3279
StorageDuration getStorageDuration() const
Retrieve the storage duration for the materialized temporary.
Definition: DeclCXX.cpp:3078
A global _GUID constant.
Definition: DeclCXX.h:4293
An instance of this class represents the declaration of a property member.
Definition: DeclCXX.h:4239
A member reference to an MSPropertyDecl.
Definition: ExprCXX.h:933
const_child_range children() const
Definition: ExprCXX.h:977
NestedNameSpecifierLoc getQualifierLoc() const
Definition: ExprCXX.h:990
MSPropertyDecl * getPropertyDecl() const
Definition: ExprCXX.h:987
MSPropertyRefExpr(EmptyShell Empty)
Definition: ExprCXX.h:952
bool isArrow() const
Definition: ExprCXX.h:988
bool isImplicitAccess() const
Definition: ExprCXX.h:958
SourceRange getSourceRange() const LLVM_READONLY
Definition: ExprCXX.h:954
SourceLocation getEndLoc() const
Definition: ExprCXX.h:971
child_range children()
Definition: ExprCXX.h:973
MSPropertyRefExpr(Expr *baseExpr, MSPropertyDecl *decl, bool isArrow, QualType ty, ExprValueKind VK, NestedNameSpecifierLoc qualifierLoc, SourceLocation nameLoc)
Definition: ExprCXX.h:943
static bool classof(const Stmt *T)
Definition: ExprCXX.h:982
Expr * getBaseExpr() const
Definition: ExprCXX.h:986
SourceLocation getBeginLoc() const
Definition: ExprCXX.h:962
SourceLocation getMemberLoc() const
Definition: ExprCXX.h:989
MS property subscript expression.
Definition: ExprCXX.h:1004
static bool classof(const Stmt *T)
Definition: ExprCXX.h:1048
const Expr * getBase() const
Definition: ExprCXX.h:1030
void setRBracketLoc(SourceLocation L)
Definition: ExprCXX.h:1042
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:1039
MSPropertySubscriptExpr(Expr *Base, Expr *Idx, QualType Ty, ExprValueKind VK, ExprObjectKind OK, SourceLocation RBracketLoc)
Definition: ExprCXX.h:1016
SourceLocation getExprLoc() const LLVM_READONLY
Definition: ExprCXX.h:1044
const_child_range children() const
Definition: ExprCXX.h:1057
MSPropertySubscriptExpr(EmptyShell Shell)
Create an empty array subscript expression.
Definition: ExprCXX.h:1026
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:1035
const Expr * getIdx() const
Definition: ExprCXX.h:1033
SourceLocation getRBracketLoc() const
Definition: ExprCXX.h:1041
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Definition: ExprCXX.h:4727
const ValueDecl * getExtendingDecl() const
Definition: ExprCXX.h:4782
MaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference, LifetimeExtendedTemporaryDecl *MTD=nullptr)
Definition: ExprCXX.cpp:1811
StorageDuration getStorageDuration() const
Retrieve the storage duration for the materialized temporary.
Definition: ExprCXX.h:4752
LifetimeExtendedTemporaryDecl * getLifetimeExtendedTemporaryDecl()
Definition: ExprCXX.h:4767
bool isBoundToLvalueReference() const
Determine whether this materialized temporary is bound to an lvalue reference; otherwise,...
Definition: ExprCXX.h:4796
ValueDecl * getExtendingDecl()
Get the declaration which triggered the lifetime-extension of this temporary, if any.
Definition: ExprCXX.h:4777
Expr * getSubExpr() const
Retrieve the temporary-generating subexpression whose value will be materialized into a glvalue.
Definition: ExprCXX.h:4744
bool isUsableInConstantExpressions(const ASTContext &Context) const
Determine whether this temporary object is usable in constant expressions, as specified in C++20 [exp...
Definition: ExprCXX.cpp:1842
MaterializeTemporaryExpr(EmptyShell Empty)
Definition: ExprCXX.h:4739
const LifetimeExtendedTemporaryDecl * getLifetimeExtendedTemporaryDecl() const
Definition: ExprCXX.h:4771
void setExtendingDecl(ValueDecl *ExtendedBy, unsigned ManglingNumber)
Definition: ExprCXX.cpp:1825
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:4806
APValue * getOrCreateValue(bool MayCreate) const
Get the storage for the constant value of a materialized temporary of static storage duration.
Definition: ExprCXX.h:4760
static bool classof(const Stmt *T)
Definition: ExprCXX.h:4810
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:4802
unsigned getManglingNumber() const
Definition: ExprCXX.h:4788
const_child_range children() const
Definition: ExprCXX.h:4821
This represents a decl that may have a name.
Definition: Decl.h:249
A C++ nested-name-specifier augmented with source location information.
SourceLocation getBeginLoc() const
Retrieve the location of the beginning of this nested-name-specifier.
NestedNameSpecifier * getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
bool hasQualifier() const
Evaluates true when this nested-name-specifier location is non-empty.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Definition: Expr.h:1173
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
Definition: ExprCXX.h:2982
llvm::iterator_range< decls_iterator > decls() const
Definition: ExprCXX.h:3081
static bool classof(const Stmt *T)
Definition: ExprCXX.h:3159
ASTTemplateKWAndArgsInfo * getTrailingASTTemplateKWAndArgsInfo()
Return the optional template keyword and arguments info.
Definition: ExprCXX.h:4098
bool hasExplicitTemplateArgs() const
Determines whether this expression had explicit template arguments.
Definition: ExprCXX.h:3134
static FindResult find(Expr *E)
Finds the overloaded expression in the given expression E of OverloadTy.
Definition: ExprCXX.h:3043
SourceLocation getLAngleLoc() const
Retrieve the location of the left angle bracket starting the explicit template argument list followin...
Definition: ExprCXX.h:3116
SourceLocation getNameLoc() const
Gets the location of the name.
Definition: ExprCXX.h:3095
decls_iterator decls_begin() const
Definition: ExprCXX.h:3075
CXXRecordDecl * getNamingClass()
Gets the naming class of this lookup, if any.
Definition: ExprCXX.h:4115
const CXXRecordDecl * getNamingClass() const
Definition: ExprCXX.h:3069
unsigned getNumDecls() const
Gets the number of declarations in the unresolved set.
Definition: ExprCXX.h:3086
TemplateArgumentLoc const * getTemplateArgs() const
Definition: ExprCXX.h:3136
NestedNameSpecifier * getQualifier() const
Fetches the nested-name qualifier, if one was given.
Definition: ExprCXX.h:3098
const DeclarationNameInfo & getNameInfo() const
Gets the full name info.
Definition: ExprCXX.h:3089
const TemplateArgumentLoc * getTrailingTemplateArgumentLoc() const
Definition: ExprCXX.h:3022
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding this name, if any.
Definition: ExprCXX.h:3108
NestedNameSpecifierLoc getQualifierLoc() const
Fetches the nested-name qualifier with source-location information, if one was given.
Definition: ExprCXX.h:3104
const ASTTemplateKWAndArgsInfo * getTrailingASTTemplateKWAndArgsInfo() const
Definition: ExprCXX.h:3014
const DeclAccessPair * getTrailingResults() const
Definition: ExprCXX.h:3007
void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const
Copies the template arguments into the given structure.
Definition: ExprCXX.h:3154
TemplateArgumentLoc * getTrailingTemplateArgumentLoc()
Return the optional template arguments.
Definition: ExprCXX.h:4108
DeclAccessPair * getTrailingResults()
Return the results. Defined after UnresolvedMemberExpr.
Definition: ExprCXX.h:4092
OverloadExpr(StmtClass SC, const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent, bool KnownContainsUnexpandedParameterPack)
Definition: ExprCXX.cpp:467
bool hasTemplateKWAndArgsInfo() const
Definition: ExprCXX.h:3026
decls_iterator decls_end() const
Definition: ExprCXX.h:3078
unsigned getNumTemplateArgs() const
Definition: ExprCXX.h:3142
DeclarationName getName() const
Gets the name looked up.
Definition: ExprCXX.h:3092
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
Definition: ExprCXX.h:3124
bool hasTemplateKeyword() const
Determines whether the name was preceded by the template keyword.
Definition: ExprCXX.h:3131
ArrayRef< TemplateArgumentLoc > template_arguments() const
Definition: ExprCXX.h:3149
Represents a C++11 pack expansion that produces a sequence of expressions.
Definition: ExprCXX.h:4179
const Expr * getPattern() const
Retrieve the pattern of the pack expansion.
Definition: ExprCXX.h:4211
child_range children()
Definition: ExprCXX.h:4237
PackExpansionExpr(QualType T, Expr *Pattern, SourceLocation EllipsisLoc, std::optional< unsigned > NumExpansions)
Definition: ExprCXX.h:4195
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:4226
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:4230
std::optional< unsigned > getNumExpansions() const
Determine the number of expansions that will be produced when this pack expansion is instantiated,...
Definition: ExprCXX.h:4219
const_child_range children() const
Definition: ExprCXX.h:4241
SourceLocation getEllipsisLoc() const
Retrieve the location of the ellipsis that describes this pack expansion.
Definition: ExprCXX.h:4215
PackExpansionExpr(EmptyShell Empty)
Definition: ExprCXX.h:4205
Expr * getPattern()
Retrieve the pattern of the pack expansion.
Definition: ExprCXX.h:4208
static bool classof(const Stmt *T)
Definition: ExprCXX.h:4232
std::optional< unsigned > getSelectedIndex() const
Definition: ExprCXX.h:4449
NamedDecl * getPackDecl() const
Definition: ExprCXX.cpp:1735
static PackIndexingExpr * CreateDeserialized(ASTContext &Context, unsigned NumTransformedExprs)
Definition: ExprCXX.cpp:1746
SourceLocation getEllipsisLoc() const
Determine the location of the 'sizeof' keyword.
Definition: ExprCXX.h:4432
Expr * getSelectedExpr() const
Definition: ExprCXX.h:4458
child_range children()
Definition: ExprCXX.h:4474
Expr * getPackIdExpression() const
Definition: ExprCXX.h:4443
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:4441
SourceLocation getPackLoc() const
Determine the location of the parameter pack.
Definition: ExprCXX.h:4435
SourceLocation getRSquareLoc() const
Determine the location of the right parenthesis.
Definition: ExprCXX.h:4438
ArrayRef< Expr * > getExpressions() const
Return the trailing expressions, regardless of the expansion.
Definition: ExprCXX.h:4465
bool expandsToEmptyPack() const
Determine if the expression was expanded to empty.
Definition: ExprCXX.h:4429
static PackIndexingExpr * Create(ASTContext &Context, SourceLocation EllipsisLoc, SourceLocation RSquareLoc, Expr *PackIdExpr, Expr *IndexExpr, std::optional< int64_t > Index, ArrayRef< Expr * > SubstitutedExprs={}, bool ExpandedToEmptyPack=false)
Definition: ExprCXX.cpp:1718
static bool classof(const Stmt *T)
Definition: ExprCXX.h:4469
Expr * getIndexExpr() const
Definition: ExprCXX.h:4447
const_child_range children() const
Definition: ExprCXX.h:4476
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:4440
Represents a parameter to a function.
Definition: Decl.h:1723
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition: Type.h:3197
Stores the type being destroyed by a pseudo-destructor expression.
Definition: ExprCXX.h:2565
TypeSourceInfo * getTypeSourceInfo() const
Definition: ExprCXX.h:2581
PseudoDestructorTypeStorage(const IdentifierInfo *II, SourceLocation Loc)
Definition: ExprCXX.h:2576
const IdentifierInfo * getIdentifier() const
Definition: ExprCXX.h:2585
SourceLocation getLocation() const
Definition: ExprCXX.h:2589
A (possibly-)qualified type.
Definition: Type.h:941
Represents a __builtin_base_type expression.
Definition: ExprCXX.h:5457
QualType getSourceType() const
Definition: ExprCXX.h:5475
static bool classof(const Stmt *T)
Definition: ExprCXX.h:5486
const_child_range children() const
Definition: ExprCXX.h:5492
SYCLBuiltinBaseTypeExpr(SourceLocation Loc, QualType SourceTy, Expr *Index, QualType BaseTy)
Definition: ExprCXX.h:5465
void setLocation(SourceLocation L)
Definition: ExprCXX.h:5484
const Expr * getIndex() const
Definition: ExprCXX.h:5477
SYCLBuiltinBaseTypeExpr(EmptyShell Empty)
Definition: ExprCXX.h:5472
SourceLocation getLocation() const
Definition: ExprCXX.h:5483
SourceLocation getBeginLoc() const
Definition: ExprCXX.h:5480
SourceLocation getEndLoc() const
Definition: ExprCXX.h:5481
Represents a __builtin_field_type expression.
Definition: ExprCXX.h:5370
const_child_range children() const
Definition: ExprCXX.h:5405
void setLocation(SourceLocation L)
Definition: ExprCXX.h:5397
SourceLocation getBeginLoc() const
Definition: ExprCXX.h:5393
SourceLocation getEndLoc() const
Definition: ExprCXX.h:5394
SYCLBuiltinFieldTypeExpr(EmptyShell Empty)
Definition: ExprCXX.h:5385
QualType getSourceType() const
Definition: ExprCXX.h:5388
SYCLBuiltinFieldTypeExpr(SourceLocation Loc, QualType SourceTy, Expr *Index, QualType FieldTy, ExprValueKind ValueKind)
Definition: ExprCXX.h:5378
static bool classof(const Stmt *T)
Definition: ExprCXX.h:5399
SourceLocation getLocation() const
Definition: ExprCXX.h:5396
const Expr * getIndex() const
Definition: ExprCXX.h:5390
Represents a __builtin_num_bases expression.
Definition: ExprCXX.h:5411
SourceLocation getLocation() const
Definition: ExprCXX.h:5439
QualType getSourceType() const
Definition: ExprCXX.h:5427
void setLocation(SourceLocation L)
Definition: ExprCXX.h:5440
SYCLBuiltinNumBasesExpr(EmptyShell Empty)
Definition: ExprCXX.h:5424
static bool classof(const Stmt *T)
Definition: ExprCXX.h:5450
SourceLocation getEndLoc() const
Definition: ExprCXX.h:5437
const_child_range children() const
Definition: ExprCXX.h:5446
unsigned getNumBases() const
Definition: ExprCXX.h:5428
SYCLBuiltinNumBasesExpr(SourceLocation Loc, QualType SourceTy, QualType RetTy)
Definition: ExprCXX.h:5418
SourceLocation getBeginLoc() const
Definition: ExprCXX.h:5436
Represents a __builtin_num_fields expression.
Definition: ExprCXX.h:5318
SourceLocation getBeginLoc() const
Definition: ExprCXX.h:5345
unsigned getNumFields() const
Definition: ExprCXX.h:5336
void setLocation(SourceLocation L)
Definition: ExprCXX.h:5349
SYCLBuiltinNumFieldsExpr(SourceLocation Loc, QualType SourceTy, QualType RetTy)
Definition: ExprCXX.h:5325
static bool classof(const Stmt *T)
Definition: ExprCXX.h:5359
SourceLocation getEndLoc() const
Definition: ExprCXX.h:5346
SYCLBuiltinNumFieldsExpr(EmptyShell Empty)
Definition: ExprCXX.h:5332
QualType getSourceType() const
Definition: ExprCXX.h:5335
const_child_range children() const
Definition: ExprCXX.h:5355
SourceLocation getLocation() const
Definition: ExprCXX.h:5348
Represents an expression that computes the length of a parameter pack.
Definition: ExprCXX.h:4257
SourceLocation getPackLoc() const
Determine the location of the parameter pack.
Definition: ExprCXX.h:4320
child_range children()
Definition: ExprCXX.h:4362
static bool classof(const Stmt *T)
Definition: ExprCXX.h:4357
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:4355
static SizeOfPackExpr * CreateDeserialized(ASTContext &Context, unsigned NumPartialArgs)
Definition: ExprCXX.cpp:1706
ArrayRef< TemplateArgument > getPartialArguments() const
Get.
Definition: ExprCXX.h:4348
bool isPartiallySubstituted() const
Determine whether this represents a partially-substituted sizeof...
Definition: ExprCXX.h:4343
const_child_range children() const
Definition: ExprCXX.h:4366
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:4354
NamedDecl * getPack() const
Retrieve the parameter pack.
Definition: ExprCXX.h:4326
static SizeOfPackExpr * Create(ASTContext &Context, SourceLocation OperatorLoc, NamedDecl *Pack, SourceLocation PackLoc, SourceLocation RParenLoc, std::optional< unsigned > Length=std::nullopt, ArrayRef< TemplateArgument > PartialArgs=std::nullopt)
Definition: ExprCXX.cpp:1694
SourceLocation getOperatorLoc() const
Determine the location of the 'sizeof' keyword.
Definition: ExprCXX.h:4317
SourceLocation getRParenLoc() const
Determine the location of the right parenthesis.
Definition: ExprCXX.h:4323
unsigned getPackLength() const
Retrieve the length of the parameter pack.
Definition: ExprCXX.h:4332
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
Stmt - This represents one statement.
Definition: Stmt.h:84
SourceLocation getEndLoc() const LLVM_READONLY
Definition: Stmt.cpp:350
StmtClass
Definition: Stmt.h:86
CXXUnresolvedConstructExprBitfields CXXUnresolvedConstructExprBits
Definition: Stmt.h:1256
LambdaExprBitfields LambdaExprBits
Definition: Stmt.h:1263
UnresolvedLookupExprBitfields UnresolvedLookupExprBits
Definition: Stmt.h:1259
SubstNonTypeTemplateParmExprBitfields SubstNonTypeTemplateParmExprBits
Definition: Stmt.h:1262
CXXNoexceptExprBitfields CXXNoexceptExprBits
Definition: Stmt.h:1261
StmtIterator child_iterator
Child Iterators: All subclasses must implement 'children' to permit easy iteration over the substatem...
Definition: Stmt.h:1444
CXXRewrittenBinaryOperatorBitfields CXXRewrittenBinaryOperatorBits
Definition: Stmt.h:1242
ExprWithCleanupsBitfields ExprWithCleanupsBits
Definition: Stmt.h:1255
StmtClass getStmtClass() const
Definition: Stmt.h:1358
CXXScalarValueInitExprBitfields CXXScalarValueInitExprBits
Definition: Stmt.h:1249
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition: Stmt.cpp:326
OverloadExprBitfields OverloadExprBits
Definition: Stmt.h:1258
CXXConstructExprBitfields CXXConstructExprBits
Definition: Stmt.h:1254
CXXDependentScopeMemberExprBitfields CXXDependentScopeMemberExprBits
Definition: Stmt.h:1257
ConstCastIterator< Expr > ConstExprIterator
Definition: Stmt.h:1332
TypeTraitExprBitfields TypeTraitExprBits
Definition: Stmt.h:1252
CXXNewExprBitfields CXXNewExprBits
Definition: Stmt.h:1250
CXXNullPtrLiteralExprBitfields CXXNullPtrLiteralExprBits
Definition: Stmt.h:1244
CoawaitExprBitfields CoawaitBits
Definition: Stmt.h:1267
llvm::iterator_range< child_iterator > child_range
Definition: Stmt.h:1447
CXXThrowExprBitfields CXXThrowExprBits
Definition: Stmt.h:1246
ConstStmtIterator const_child_iterator
Definition: Stmt.h:1445
CXXBoolLiteralExprBitfields CXXBoolLiteralExprBits
Definition: Stmt.h:1243
CXXOperatorCallExprBitfields CXXOperatorCallExprBits
Definition: Stmt.h:1241
CXXDefaultInitExprBitfields CXXDefaultInitExprBits
Definition: Stmt.h:1248
DependentScopeDeclRefExprBitfields DependentScopeDeclRefExprBits
Definition: Stmt.h:1253
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: Stmt.cpp:338
UnresolvedMemberExprBitfields UnresolvedMemberExprBits
Definition: Stmt.h:1260
llvm::iterator_range< const_child_iterator > const_child_range
Definition: Stmt.h:1448
CXXDeleteExprBitfields CXXDeleteExprBits
Definition: Stmt.h:1251
CXXDefaultArgExprBitfields CXXDefaultArgExprBits
Definition: Stmt.h:1247
CXXThisExprBitfields CXXThisExprBits
Definition: Stmt.h:1245
CastIterator< Expr > ExprIterator
Definition: Stmt.h:1331
Represents a reference to a non-type template parameter that has been substituted with a template arg...
Definition: ExprCXX.h:4483
SourceLocation getEndLoc() const
Definition: ExprCXX.h:4519
QualType getParameterType(const ASTContext &Ctx) const
Determine the substituted type of the template parameter.
Definition: ExprCXX.cpp:1753
const_child_range children() const
Definition: ExprCXX.h:4551
std::optional< unsigned > getPackIndex() const
Definition: ExprCXX.h:4531
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
Definition: ExprCXX.h:4529
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
Definition: ExprCXX.h:4525
SourceLocation getNameLoc() const
Definition: ExprCXX.h:4515
NonTypeTemplateParmDecl * getParameter() const
Definition: ExprCXX.cpp:1713
SourceLocation getBeginLoc() const
Definition: ExprCXX.h:4518
SubstNonTypeTemplateParmExpr(QualType Ty, ExprValueKind ValueKind, SourceLocation Loc, Expr *Replacement, Decl *AssociatedDecl, unsigned Index, std::optional< unsigned > PackIndex, bool RefParam)
Definition: ExprCXX.h:4502
static bool classof(const Stmt *s)
Definition: ExprCXX.h:4544
Represents a reference to a non-type template parameter pack that has been substituted with a non-tem...
Definition: ExprCXX.h:4568
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:4614
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
Definition: ExprCXX.h:4598
TemplateArgument getArgumentPack() const
Retrieve the template argument pack containing the substituted template arguments.
Definition: ExprCXX.cpp:1779
SourceLocation getParameterPackLocation() const
Retrieve the location of the parameter pack name.
Definition: ExprCXX.h:4608
const_child_range children() const
Definition: ExprCXX.h:4626
NonTypeTemplateParmDecl * getParameterPack() const
Retrieve the non-type template parameter pack being substituted.
Definition: ExprCXX.cpp:1774
static bool classof(const Stmt *T)
Definition: ExprCXX.h:4617
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
Definition: ExprCXX.h:4602
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:4615
A convenient class for passing around template argument information.
Definition: TemplateBase.h:632
Location wrapper for a TemplateArgument.
Definition: TemplateBase.h:524
Represents a template argument.
Definition: TemplateBase.h:61
Stores a list of template parameters for a TemplateDecl and its derived classes.
Definition: DeclTemplate.h:73
A container of type source information.
Definition: Type.h:7731
QualType getType() const
Return the type wrapped by this type source info.
Definition: Type.h:7742
A type trait used in the implementation of various C++11 and Library TR1 trait templates.
Definition: ExprCXX.h:2767
friend TrailingObjects
Definition: ExprCXX.h:2791
static TypeTraitExpr * Create(const ASTContext &C, QualType T, SourceLocation Loc, TypeTrait Kind, ArrayRef< TypeSourceInfo * > Args, SourceLocation RParenLoc, bool Value)
Create a new type trait expression.
Definition: ExprCXX.cpp:1877
static TypeTraitExpr * CreateDeserialized(const ASTContext &C, unsigned NumArgs)
Definition: ExprCXX.cpp:1887
child_range children()
Definition: ExprCXX.h:2835
ArrayRef< TypeSourceInfo * > getArgs() const
Retrieve the argument types.
Definition: ExprCXX.h:2823
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:2828
const_child_range children() const
Definition: ExprCXX.h:2839
unsigned getNumArgs() const
Determine the number of arguments to this type trait.
Definition: ExprCXX.h:2814
TypeSourceInfo * getArg(unsigned I) const
Retrieve the Ith argument.
Definition: ExprCXX.h:2817
bool getValue() const
Definition: ExprCXX.h:2808
TypeTrait getTrait() const
Determine which type trait this expression uses.
Definition: ExprCXX.h:2804
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:2827
static bool classof(const Stmt *T)
Definition: ExprCXX.h:2830
The base class of the type hierarchy.
Definition: Type.h:1829
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition: Type.cpp:1882
const T * castAs() const
Member-template castAs<specific type>.
Definition: Type.h:8635
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition: Type.h:2701
bool isRecordType() const
Definition: Type.h:8113
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
Definition: Type.cpp:1886
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
Definition: ExprCXX.h:3202
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:3279
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:3285
child_range children()
Definition: ExprCXX.h:3291
const CXXRecordDecl * getNamingClass() const
Definition: ExprCXX.h:3277
static UnresolvedLookupExpr * CreateEmpty(const ASTContext &Context, unsigned NumResults, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs)
Definition: ExprCXX.cpp:455
static bool classof(const Stmt *T)
Definition: ExprCXX.h:3299
bool requiresADL() const
True if this declaration should be extended by argument-dependent lookup.
Definition: ExprCXX.h:3271
const_child_range children() const
Definition: ExprCXX.h:3295
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
Definition: ExprCXX.cpp:420
CXXRecordDecl * getNamingClass()
Gets the 'naming class' (in the sense of C++0x [class.access.base]p5) of the lookup.
Definition: ExprCXX.h:3276
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
Definition: ExprCXX.h:3942
SourceLocation getEndLoc() const LLVM_READONLY
Definition: ExprCXX.h:4068
DeclarationName getMemberName() const
Retrieve the name of the member that this expression refers to.
Definition: ExprCXX.h:4050
const Expr * getBase() const
Definition: ExprCXX.h:4019
QualType getBaseType() const
Definition: ExprCXX.h:4024
const CXXRecordDecl * getNamingClass() const
Definition: ExprCXX.h:4041
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
Definition: ExprCXX.h:4034
SourceLocation getOperatorLoc() const
Retrieve the location of the '->' or '.' operator.
Definition: ExprCXX.h:4037
bool hasUnresolvedUsing() const
Determine whether the lookup results contain an unresolved using declaration.
Definition: ExprCXX.h:4028
child_range children()
Definition: ExprCXX.h:4079
SourceLocation getExprLoc() const LLVM_READONLY
Return the preferred location (the member name) for the arrow when diagnosing a problem with this exp...
Definition: ExprCXX.h:4058
Expr * getBase()
Retrieve the base object of this member expressions, e.g., the x in x.m.
Definition: ExprCXX.h:4015
const DeclarationNameInfo & getMemberNameInfo() const
Retrieve the full name info for the member that this expression refers to.
Definition: ExprCXX.h:4047
static UnresolvedMemberExpr * Create(const ASTContext &Context, bool HasUnresolvedUsing, Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, const DeclarationNameInfo &MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs, UnresolvedSetIterator Begin, UnresolvedSetIterator End)
Definition: ExprCXX.cpp:1636
static bool classof(const Stmt *T)
Definition: ExprCXX.h:4074
CXXRecordDecl * getNamingClass()
Retrieve the naming class of this lookup.
Definition: ExprCXX.cpp:1667
bool isImplicitAccess() const
True if this is an implicit access, i.e., one in which the member being accessed was not written in t...
Definition: ExprCXX.cpp:1629
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: ExprCXX.h:4060
static UnresolvedMemberExpr * CreateEmpty(const ASTContext &Context, unsigned NumResults, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs)
Definition: ExprCXX.cpp:1655
const_child_range children() const
Definition: ExprCXX.h:4085
SourceLocation getMemberLoc() const
Retrieve the location of the name of the member that this expression refers to.
Definition: ExprCXX.h:4054
UnresolvedSetIterator iterator
Definition: UnresolvedSet.h:81
The iterator over UnresolvedSets.
Definition: UnresolvedSet.h:35
A call to a literal operator (C++11 [over.literal]) written as a user-defined literal (C++11 [lit....
Definition: ExprCXX.h:637
LiteralOperatorKind getLiteralOperatorKind() const
Returns the kind of literal operator invocation which this expression represents.
Definition: ExprCXX.cpp:979
const IdentifierInfo * getUDSuffix() const
Returns the ud-suffix specified for this literal.
Definition: ExprCXX.cpp:1008
static UserDefinedLiteral * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation LitEndLoc, SourceLocation SuffixLoc, FPOptionsOverride FPFeatures)
Definition: ExprCXX.cpp:950
static UserDefinedLiteral * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPOptions, EmptyShell Empty)
Definition: ExprCXX.cpp:966
const Expr * getCookedLiteral() const
Definition: ExprCXX.h:693
SourceLocation getEndLoc() const
Definition: ExprCXX.h:703
Expr * getCookedLiteral()
If this is not a raw user-defined literal, get the underlying cooked literal (representing the litera...
Definition: ExprCXX.cpp:1000
SourceLocation getBeginLoc() const
Definition: ExprCXX.h:697
SourceLocation getUDSuffixLoc() const
Returns the location of a ud-suffix in the expression.
Definition: ExprCXX.h:709
LiteralOperatorKind
The kind of literal operator which is invoked.
Definition: ExprCXX.h:665
@ LOK_String
operator "" X (const CharT *, size_t)
Definition: ExprCXX.h:679
@ LOK_Raw
Raw form: operator "" X (const char *)
Definition: ExprCXX.h:667
@ LOK_Floating
operator "" X (long double)
Definition: ExprCXX.h:676
@ LOK_Integer
operator "" X (unsigned long long)
Definition: ExprCXX.h:673
@ LOK_Template
Raw form: operator "" X<cs...> ()
Definition: ExprCXX.h:670
@ LOK_Character
operator "" X (CharT)
Definition: ExprCXX.h:682
static bool classof(const Stmt *S)
Definition: ExprCXX.h:714
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition: Decl.h:668
Stmt(StmtClass SC, EmptyShell)
Construct an empty statement.
Definition: Stmt.h:1340
Represents a variable declaration or definition.
Definition: Decl.h:880
constexpr XRayInstrMask None
Definition: XRayInstr.h:38
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, CastExpr > castExpr
Matches any cast nodes of Clang's AST.
unsigned kind
All of the diagnostics that can be emitted by the frontend.
Definition: DiagnosticIDs.h:65
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
Definition: OperatorKinds.h:21
ArrayTypeTrait
Names for the array type traits.
Definition: TypeTraits.h:42
@ ATT_Last
Definition: TypeTraits.h:45
CanThrowResult
Possible results from evaluation of a noexcept expression.
CXXConstructionKind
Definition: ExprCXX.h:1538
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
Definition: Specifiers.h:149
@ OK_Ordinary
An ordinary object is located at an address in memory.
Definition: Specifiers.h:151
BinaryOperatorKind
ExprDependence computeDependence(FullExpr *E)
StorageDuration
The storage duration for an object (per C++ [basic.stc]).
Definition: Specifiers.h:327
@ SD_FullExpression
Full-expression storage duration (for temporaries).
Definition: Specifiers.h:328
CastKind
CastKind - The kind of operation required for a conversion.
LambdaCaptureDefault
The default, if any, capture method for a lambda expression.
Definition: Lambda.h:22
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
Definition: Specifiers.h:132
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
Definition: Specifiers.h:135
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Definition: Specifiers.h:139
const FunctionProtoType * T
TypeTrait
Names for traits that operate specifically on types.
Definition: TypeTraits.h:21
CXXNewInitializationStyle
Definition: ExprCXX.h:2225
@ Parens
New-expression has a C++98 paren-delimited initializer.
@ None
New-expression has no initializer as written.
@ Braces
New-expression has a C++11 list-initializer.
unsigned long uint64_t
float __ovld __cnfn distance(float, float)
Returns the distance between p0 and p1.
#define false
Definition: stdbool.h:26
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
Definition: TemplateBase.h:728
SourceLocation LAngleLoc
The source location of the left angle bracket ('<').
Definition: TemplateBase.h:730
void copyInto(const TemplateArgumentLoc *ArgArray, TemplateArgumentListInfo &List) const
unsigned NumTemplateArgs
The number of template arguments in TemplateArgs.
Definition: TemplateBase.h:742
SourceLocation RAngleLoc
The source location of the right angle bracket ('>').
Definition: TemplateBase.h:733
SourceLocation TemplateKWLoc
The source location of the template keyword; this is used as part of the representation of qualified ...
Definition: TemplateBase.h:739
const Expr * RHS
The original right-hand side.
Definition: ExprCXX.h:310
const Expr * InnerBinOp
The inner == or <=> operator expression.
Definition: ExprCXX.h:312
BinaryOperatorKind Opcode
The original opcode, prior to rewriting.
Definition: ExprCXX.h:306
const Expr * LHS
The original left-hand side.
Definition: ExprCXX.h:308
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
SourceLocation getBeginLoc() const
getBeginLoc - Retrieve the location of the first token.
SourceLocation getEndLoc() const LLVM_READONLY
Iterator for iterating over Stmt * arrays that contain only T *.
Definition: Stmt.h:1316
A placeholder type used to construct an empty shell of a type, that will be filled in later (e....
Definition: Stmt.h:1298