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