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