1 //===--- ExprCXX.cpp - (C++) Expression AST Node Implementation -----------===// 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 // This file implements the subclesses of Expr class declared in ExprCXX.h 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "clang/AST/ASTContext.h" 15 #include "clang/AST/Attr.h" 16 #include "clang/AST/DeclCXX.h" 17 #include "clang/AST/DeclTemplate.h" 18 #include "clang/AST/ExprCXX.h" 19 #include "clang/AST/TypeLoc.h" 20 #include "clang/Basic/IdentifierTable.h" 21 using namespace clang; 22 23 24 //===----------------------------------------------------------------------===// 25 // Child Iterators for iterating over subexpressions/substatements 26 //===----------------------------------------------------------------------===// 27 28 bool CXXTypeidExpr::isPotentiallyEvaluated() const { 29 if (isTypeOperand()) 30 return false; 31 32 // C++11 [expr.typeid]p3: 33 // When typeid is applied to an expression other than a glvalue of 34 // polymorphic class type, [...] the expression is an unevaluated operand. 35 const Expr *E = getExprOperand(); 36 if (const CXXRecordDecl *RD = E->getType()->getAsCXXRecordDecl()) 37 if (RD->isPolymorphic() && E->isGLValue()) 38 return true; 39 40 return false; 41 } 42 43 QualType CXXTypeidExpr::getTypeOperand(ASTContext &Context) const { 44 assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)"); 45 Qualifiers Quals; 46 return Context.getUnqualifiedArrayType( 47 Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType(), Quals); 48 } 49 50 QualType CXXUuidofExpr::getTypeOperand(ASTContext &Context) const { 51 assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)"); 52 Qualifiers Quals; 53 return Context.getUnqualifiedArrayType( 54 Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType(), Quals); 55 } 56 57 // static 58 const UuidAttr *CXXUuidofExpr::GetUuidAttrOfType(QualType QT, 59 bool *RDHasMultipleGUIDsPtr) { 60 // Optionally remove one level of pointer, reference or array indirection. 61 const Type *Ty = QT.getTypePtr(); 62 if (QT->isPointerType() || QT->isReferenceType()) 63 Ty = QT->getPointeeType().getTypePtr(); 64 else if (QT->isArrayType()) 65 Ty = Ty->getBaseElementTypeUnsafe(); 66 67 const CXXRecordDecl *RD = Ty->getAsCXXRecordDecl(); 68 if (!RD) 69 return nullptr; 70 71 if (const UuidAttr *Uuid = RD->getMostRecentDecl()->getAttr<UuidAttr>()) 72 return Uuid; 73 74 // __uuidof can grab UUIDs from template arguments. 75 if (const ClassTemplateSpecializationDecl *CTSD = 76 dyn_cast<ClassTemplateSpecializationDecl>(RD)) { 77 const TemplateArgumentList &TAL = CTSD->getTemplateArgs(); 78 const UuidAttr *UuidForRD = nullptr; 79 80 for (const TemplateArgument &TA : TAL.asArray()) { 81 bool SeenMultipleGUIDs = false; 82 83 const UuidAttr *UuidForTA = nullptr; 84 if (TA.getKind() == TemplateArgument::Type) 85 UuidForTA = GetUuidAttrOfType(TA.getAsType(), &SeenMultipleGUIDs); 86 else if (TA.getKind() == TemplateArgument::Declaration) 87 UuidForTA = 88 GetUuidAttrOfType(TA.getAsDecl()->getType(), &SeenMultipleGUIDs); 89 90 // If the template argument has a UUID, there are three cases: 91 // - This is the first UUID seen for this RecordDecl. 92 // - This is a different UUID than previously seen for this RecordDecl. 93 // - This is the same UUID than previously seen for this RecordDecl. 94 if (UuidForTA) { 95 if (!UuidForRD) 96 UuidForRD = UuidForTA; 97 else if (UuidForRD != UuidForTA) 98 SeenMultipleGUIDs = true; 99 } 100 101 // Seeing multiple UUIDs means that we couldn't find a UUID 102 if (SeenMultipleGUIDs) { 103 if (RDHasMultipleGUIDsPtr) 104 *RDHasMultipleGUIDsPtr = true; 105 return nullptr; 106 } 107 } 108 109 return UuidForRD; 110 } 111 112 return nullptr; 113 } 114 115 StringRef CXXUuidofExpr::getUuidAsStringRef(ASTContext &Context) const { 116 StringRef Uuid; 117 if (isTypeOperand()) 118 Uuid = CXXUuidofExpr::GetUuidAttrOfType(getTypeOperand(Context))->getGuid(); 119 else { 120 // Special case: __uuidof(0) means an all-zero GUID. 121 Expr *Op = getExprOperand(); 122 if (!Op->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull)) 123 Uuid = CXXUuidofExpr::GetUuidAttrOfType(Op->getType())->getGuid(); 124 else 125 Uuid = "00000000-0000-0000-0000-000000000000"; 126 } 127 return Uuid; 128 } 129 130 // CXXScalarValueInitExpr 131 SourceLocation CXXScalarValueInitExpr::getLocStart() const { 132 return TypeInfo ? TypeInfo->getTypeLoc().getBeginLoc() : RParenLoc; 133 } 134 135 // CXXNewExpr 136 CXXNewExpr::CXXNewExpr(const ASTContext &C, bool globalNew, 137 FunctionDecl *operatorNew, FunctionDecl *operatorDelete, 138 bool usualArrayDeleteWantsSize, 139 ArrayRef<Expr*> placementArgs, 140 SourceRange typeIdParens, Expr *arraySize, 141 InitializationStyle initializationStyle, 142 Expr *initializer, QualType ty, 143 TypeSourceInfo *allocatedTypeInfo, 144 SourceRange Range, SourceRange directInitRange) 145 : Expr(CXXNewExprClass, ty, VK_RValue, OK_Ordinary, 146 ty->isDependentType(), ty->isDependentType(), 147 ty->isInstantiationDependentType(), 148 ty->containsUnexpandedParameterPack()), 149 SubExprs(nullptr), OperatorNew(operatorNew), OperatorDelete(operatorDelete), 150 AllocatedTypeInfo(allocatedTypeInfo), TypeIdParens(typeIdParens), 151 Range(Range), DirectInitRange(directInitRange), 152 GlobalNew(globalNew), UsualArrayDeleteWantsSize(usualArrayDeleteWantsSize) { 153 assert((initializer != nullptr || initializationStyle == NoInit) && 154 "Only NoInit can have no initializer."); 155 StoredInitializationStyle = initializer ? initializationStyle + 1 : 0; 156 AllocateArgsArray(C, arraySize != nullptr, placementArgs.size(), 157 initializer != nullptr); 158 unsigned i = 0; 159 if (Array) { 160 if (arraySize->isInstantiationDependent()) 161 ExprBits.InstantiationDependent = true; 162 163 if (arraySize->containsUnexpandedParameterPack()) 164 ExprBits.ContainsUnexpandedParameterPack = true; 165 166 SubExprs[i++] = arraySize; 167 } 168 169 if (initializer) { 170 if (initializer->isInstantiationDependent()) 171 ExprBits.InstantiationDependent = true; 172 173 if (initializer->containsUnexpandedParameterPack()) 174 ExprBits.ContainsUnexpandedParameterPack = true; 175 176 SubExprs[i++] = initializer; 177 } 178 179 for (unsigned j = 0; j != placementArgs.size(); ++j) { 180 if (placementArgs[j]->isInstantiationDependent()) 181 ExprBits.InstantiationDependent = true; 182 if (placementArgs[j]->containsUnexpandedParameterPack()) 183 ExprBits.ContainsUnexpandedParameterPack = true; 184 185 SubExprs[i++] = placementArgs[j]; 186 } 187 188 switch (getInitializationStyle()) { 189 case CallInit: 190 this->Range.setEnd(DirectInitRange.getEnd()); break; 191 case ListInit: 192 this->Range.setEnd(getInitializer()->getSourceRange().getEnd()); break; 193 default: 194 if (TypeIdParens.isValid()) 195 this->Range.setEnd(TypeIdParens.getEnd()); 196 break; 197 } 198 } 199 200 void CXXNewExpr::AllocateArgsArray(const ASTContext &C, bool isArray, 201 unsigned numPlaceArgs, bool hasInitializer){ 202 assert(SubExprs == nullptr && "SubExprs already allocated"); 203 Array = isArray; 204 NumPlacementArgs = numPlaceArgs; 205 206 unsigned TotalSize = Array + hasInitializer + NumPlacementArgs; 207 SubExprs = new (C) Stmt*[TotalSize]; 208 } 209 210 bool CXXNewExpr::shouldNullCheckAllocation(const ASTContext &Ctx) const { 211 return getOperatorNew()->getType()->castAs<FunctionProtoType>()->isNothrow( 212 Ctx) && 213 !getOperatorNew()->isReservedGlobalPlacementOperator(); 214 } 215 216 // CXXDeleteExpr 217 QualType CXXDeleteExpr::getDestroyedType() const { 218 const Expr *Arg = getArgument(); 219 // The type-to-delete may not be a pointer if it's a dependent type. 220 const QualType ArgType = Arg->getType(); 221 222 if (ArgType->isDependentType() && !ArgType->isPointerType()) 223 return QualType(); 224 225 return ArgType->getAs<PointerType>()->getPointeeType(); 226 } 227 228 // CXXPseudoDestructorExpr 229 PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info) 230 : Type(Info) 231 { 232 Location = Info->getTypeLoc().getLocalSourceRange().getBegin(); 233 } 234 235 CXXPseudoDestructorExpr::CXXPseudoDestructorExpr(const ASTContext &Context, 236 Expr *Base, bool isArrow, SourceLocation OperatorLoc, 237 NestedNameSpecifierLoc QualifierLoc, TypeSourceInfo *ScopeType, 238 SourceLocation ColonColonLoc, SourceLocation TildeLoc, 239 PseudoDestructorTypeStorage DestroyedType) 240 : Expr(CXXPseudoDestructorExprClass, 241 Context.BoundMemberTy, 242 VK_RValue, OK_Ordinary, 243 /*isTypeDependent=*/(Base->isTypeDependent() || 244 (DestroyedType.getTypeSourceInfo() && 245 DestroyedType.getTypeSourceInfo()->getType()->isDependentType())), 246 /*isValueDependent=*/Base->isValueDependent(), 247 (Base->isInstantiationDependent() || 248 (QualifierLoc && 249 QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent()) || 250 (ScopeType && 251 ScopeType->getType()->isInstantiationDependentType()) || 252 (DestroyedType.getTypeSourceInfo() && 253 DestroyedType.getTypeSourceInfo()->getType() 254 ->isInstantiationDependentType())), 255 // ContainsUnexpandedParameterPack 256 (Base->containsUnexpandedParameterPack() || 257 (QualifierLoc && 258 QualifierLoc.getNestedNameSpecifier() 259 ->containsUnexpandedParameterPack()) || 260 (ScopeType && 261 ScopeType->getType()->containsUnexpandedParameterPack()) || 262 (DestroyedType.getTypeSourceInfo() && 263 DestroyedType.getTypeSourceInfo()->getType() 264 ->containsUnexpandedParameterPack()))), 265 Base(static_cast<Stmt *>(Base)), IsArrow(isArrow), 266 OperatorLoc(OperatorLoc), QualifierLoc(QualifierLoc), 267 ScopeType(ScopeType), ColonColonLoc(ColonColonLoc), TildeLoc(TildeLoc), 268 DestroyedType(DestroyedType) { } 269 270 QualType CXXPseudoDestructorExpr::getDestroyedType() const { 271 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo()) 272 return TInfo->getType(); 273 274 return QualType(); 275 } 276 277 SourceLocation CXXPseudoDestructorExpr::getLocEnd() const { 278 SourceLocation End = DestroyedType.getLocation(); 279 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo()) 280 End = TInfo->getTypeLoc().getLocalSourceRange().getEnd(); 281 return End; 282 } 283 284 // UnresolvedLookupExpr 285 UnresolvedLookupExpr * 286 UnresolvedLookupExpr::Create(const ASTContext &C, 287 CXXRecordDecl *NamingClass, 288 NestedNameSpecifierLoc QualifierLoc, 289 SourceLocation TemplateKWLoc, 290 const DeclarationNameInfo &NameInfo, 291 bool ADL, 292 const TemplateArgumentListInfo *Args, 293 UnresolvedSetIterator Begin, 294 UnresolvedSetIterator End) 295 { 296 assert(Args || TemplateKWLoc.isValid()); 297 unsigned num_args = Args ? Args->size() : 0; 298 299 std::size_t Size = 300 totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(1, 301 num_args); 302 void *Mem = C.Allocate(Size, llvm::alignOf<UnresolvedLookupExpr>()); 303 return new (Mem) UnresolvedLookupExpr(C, NamingClass, QualifierLoc, 304 TemplateKWLoc, NameInfo, 305 ADL, /*Overload*/ true, Args, 306 Begin, End); 307 } 308 309 UnresolvedLookupExpr * 310 UnresolvedLookupExpr::CreateEmpty(const ASTContext &C, 311 bool HasTemplateKWAndArgsInfo, 312 unsigned NumTemplateArgs) { 313 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo); 314 std::size_t Size = 315 totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>( 316 HasTemplateKWAndArgsInfo, NumTemplateArgs); 317 void *Mem = C.Allocate(Size, llvm::alignOf<UnresolvedLookupExpr>()); 318 UnresolvedLookupExpr *E = new (Mem) UnresolvedLookupExpr(EmptyShell()); 319 E->HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo; 320 return E; 321 } 322 323 OverloadExpr::OverloadExpr(StmtClass K, const ASTContext &C, 324 NestedNameSpecifierLoc QualifierLoc, 325 SourceLocation TemplateKWLoc, 326 const DeclarationNameInfo &NameInfo, 327 const TemplateArgumentListInfo *TemplateArgs, 328 UnresolvedSetIterator Begin, 329 UnresolvedSetIterator End, 330 bool KnownDependent, 331 bool KnownInstantiationDependent, 332 bool KnownContainsUnexpandedParameterPack) 333 : Expr(K, C.OverloadTy, VK_LValue, OK_Ordinary, KnownDependent, 334 KnownDependent, 335 (KnownInstantiationDependent || 336 NameInfo.isInstantiationDependent() || 337 (QualifierLoc && 338 QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent())), 339 (KnownContainsUnexpandedParameterPack || 340 NameInfo.containsUnexpandedParameterPack() || 341 (QualifierLoc && 342 QualifierLoc.getNestedNameSpecifier() 343 ->containsUnexpandedParameterPack()))), 344 NameInfo(NameInfo), QualifierLoc(QualifierLoc), 345 Results(nullptr), NumResults(End - Begin), 346 HasTemplateKWAndArgsInfo(TemplateArgs != nullptr || 347 TemplateKWLoc.isValid()) { 348 NumResults = End - Begin; 349 if (NumResults) { 350 // Determine whether this expression is type-dependent. 351 for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I) { 352 if ((*I)->getDeclContext()->isDependentContext() || 353 isa<UnresolvedUsingValueDecl>(*I)) { 354 ExprBits.TypeDependent = true; 355 ExprBits.ValueDependent = true; 356 ExprBits.InstantiationDependent = true; 357 } 358 } 359 360 Results = static_cast<DeclAccessPair *>( 361 C.Allocate(sizeof(DeclAccessPair) * NumResults, 362 llvm::alignOf<DeclAccessPair>())); 363 memcpy(Results, Begin.I, NumResults * sizeof(DeclAccessPair)); 364 } 365 366 // If we have explicit template arguments, check for dependent 367 // template arguments and whether they contain any unexpanded pack 368 // expansions. 369 if (TemplateArgs) { 370 bool Dependent = false; 371 bool InstantiationDependent = false; 372 bool ContainsUnexpandedParameterPack = false; 373 getTrailingASTTemplateKWAndArgsInfo()->initializeFrom( 374 TemplateKWLoc, *TemplateArgs, getTrailingTemplateArgumentLoc(), 375 Dependent, InstantiationDependent, ContainsUnexpandedParameterPack); 376 377 if (Dependent) { 378 ExprBits.TypeDependent = true; 379 ExprBits.ValueDependent = true; 380 } 381 if (InstantiationDependent) 382 ExprBits.InstantiationDependent = true; 383 if (ContainsUnexpandedParameterPack) 384 ExprBits.ContainsUnexpandedParameterPack = true; 385 } else if (TemplateKWLoc.isValid()) { 386 getTrailingASTTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc); 387 } 388 389 if (isTypeDependent()) 390 setType(C.DependentTy); 391 } 392 393 void OverloadExpr::initializeResults(const ASTContext &C, 394 UnresolvedSetIterator Begin, 395 UnresolvedSetIterator End) { 396 assert(!Results && "Results already initialized!"); 397 NumResults = End - Begin; 398 if (NumResults) { 399 Results = static_cast<DeclAccessPair *>( 400 C.Allocate(sizeof(DeclAccessPair) * NumResults, 401 402 llvm::alignOf<DeclAccessPair>())); 403 memcpy(Results, Begin.I, NumResults * sizeof(DeclAccessPair)); 404 } 405 } 406 407 CXXRecordDecl *OverloadExpr::getNamingClass() const { 408 if (isa<UnresolvedLookupExpr>(this)) 409 return cast<UnresolvedLookupExpr>(this)->getNamingClass(); 410 else 411 return cast<UnresolvedMemberExpr>(this)->getNamingClass(); 412 } 413 414 // DependentScopeDeclRefExpr 415 DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(QualType T, 416 NestedNameSpecifierLoc QualifierLoc, 417 SourceLocation TemplateKWLoc, 418 const DeclarationNameInfo &NameInfo, 419 const TemplateArgumentListInfo *Args) 420 : Expr(DependentScopeDeclRefExprClass, T, VK_LValue, OK_Ordinary, 421 true, true, 422 (NameInfo.isInstantiationDependent() || 423 (QualifierLoc && 424 QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent())), 425 (NameInfo.containsUnexpandedParameterPack() || 426 (QualifierLoc && 427 QualifierLoc.getNestedNameSpecifier() 428 ->containsUnexpandedParameterPack()))), 429 QualifierLoc(QualifierLoc), NameInfo(NameInfo), 430 HasTemplateKWAndArgsInfo(Args != nullptr || TemplateKWLoc.isValid()) 431 { 432 if (Args) { 433 bool Dependent = true; 434 bool InstantiationDependent = true; 435 bool ContainsUnexpandedParameterPack 436 = ExprBits.ContainsUnexpandedParameterPack; 437 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom( 438 TemplateKWLoc, *Args, getTrailingObjects<TemplateArgumentLoc>(), 439 Dependent, InstantiationDependent, ContainsUnexpandedParameterPack); 440 ExprBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack; 441 } else if (TemplateKWLoc.isValid()) { 442 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom( 443 TemplateKWLoc); 444 } 445 } 446 447 DependentScopeDeclRefExpr * 448 DependentScopeDeclRefExpr::Create(const ASTContext &C, 449 NestedNameSpecifierLoc QualifierLoc, 450 SourceLocation TemplateKWLoc, 451 const DeclarationNameInfo &NameInfo, 452 const TemplateArgumentListInfo *Args) { 453 assert(QualifierLoc && "should be created for dependent qualifiers"); 454 bool HasTemplateKWAndArgsInfo = Args || TemplateKWLoc.isValid(); 455 std::size_t Size = 456 totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>( 457 HasTemplateKWAndArgsInfo, Args ? Args->size() : 0); 458 void *Mem = C.Allocate(Size); 459 return new (Mem) DependentScopeDeclRefExpr(C.DependentTy, QualifierLoc, 460 TemplateKWLoc, NameInfo, Args); 461 } 462 463 DependentScopeDeclRefExpr * 464 DependentScopeDeclRefExpr::CreateEmpty(const ASTContext &C, 465 bool HasTemplateKWAndArgsInfo, 466 unsigned NumTemplateArgs) { 467 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo); 468 std::size_t Size = 469 totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>( 470 HasTemplateKWAndArgsInfo, NumTemplateArgs); 471 void *Mem = C.Allocate(Size); 472 DependentScopeDeclRefExpr *E 473 = new (Mem) DependentScopeDeclRefExpr(QualType(), NestedNameSpecifierLoc(), 474 SourceLocation(), 475 DeclarationNameInfo(), nullptr); 476 E->HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo; 477 return E; 478 } 479 480 SourceLocation CXXConstructExpr::getLocStart() const { 481 if (isa<CXXTemporaryObjectExpr>(this)) 482 return cast<CXXTemporaryObjectExpr>(this)->getLocStart(); 483 return Loc; 484 } 485 486 SourceLocation CXXConstructExpr::getLocEnd() const { 487 if (isa<CXXTemporaryObjectExpr>(this)) 488 return cast<CXXTemporaryObjectExpr>(this)->getLocEnd(); 489 490 if (ParenOrBraceRange.isValid()) 491 return ParenOrBraceRange.getEnd(); 492 493 SourceLocation End = Loc; 494 for (unsigned I = getNumArgs(); I > 0; --I) { 495 const Expr *Arg = getArg(I-1); 496 if (!Arg->isDefaultArgument()) { 497 SourceLocation NewEnd = Arg->getLocEnd(); 498 if (NewEnd.isValid()) { 499 End = NewEnd; 500 break; 501 } 502 } 503 } 504 505 return End; 506 } 507 508 SourceRange CXXOperatorCallExpr::getSourceRangeImpl() const { 509 OverloadedOperatorKind Kind = getOperator(); 510 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) { 511 if (getNumArgs() == 1) 512 // Prefix operator 513 return SourceRange(getOperatorLoc(), getArg(0)->getLocEnd()); 514 else 515 // Postfix operator 516 return SourceRange(getArg(0)->getLocStart(), getOperatorLoc()); 517 } else if (Kind == OO_Arrow) { 518 return getArg(0)->getSourceRange(); 519 } else if (Kind == OO_Call) { 520 return SourceRange(getArg(0)->getLocStart(), getRParenLoc()); 521 } else if (Kind == OO_Subscript) { 522 return SourceRange(getArg(0)->getLocStart(), getRParenLoc()); 523 } else if (getNumArgs() == 1) { 524 return SourceRange(getOperatorLoc(), getArg(0)->getLocEnd()); 525 } else if (getNumArgs() == 2) { 526 return SourceRange(getArg(0)->getLocStart(), getArg(1)->getLocEnd()); 527 } else { 528 return getOperatorLoc(); 529 } 530 } 531 532 Expr *CXXMemberCallExpr::getImplicitObjectArgument() const { 533 const Expr *Callee = getCallee()->IgnoreParens(); 534 if (const MemberExpr *MemExpr = dyn_cast<MemberExpr>(Callee)) 535 return MemExpr->getBase(); 536 if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(Callee)) 537 if (BO->getOpcode() == BO_PtrMemD || BO->getOpcode() == BO_PtrMemI) 538 return BO->getLHS(); 539 540 // FIXME: Will eventually need to cope with member pointers. 541 return nullptr; 542 } 543 544 CXXMethodDecl *CXXMemberCallExpr::getMethodDecl() const { 545 if (const MemberExpr *MemExpr = 546 dyn_cast<MemberExpr>(getCallee()->IgnoreParens())) 547 return cast<CXXMethodDecl>(MemExpr->getMemberDecl()); 548 549 // FIXME: Will eventually need to cope with member pointers. 550 return nullptr; 551 } 552 553 554 CXXRecordDecl *CXXMemberCallExpr::getRecordDecl() const { 555 Expr* ThisArg = getImplicitObjectArgument(); 556 if (!ThisArg) 557 return nullptr; 558 559 if (ThisArg->getType()->isAnyPointerType()) 560 return ThisArg->getType()->getPointeeType()->getAsCXXRecordDecl(); 561 562 return ThisArg->getType()->getAsCXXRecordDecl(); 563 } 564 565 566 //===----------------------------------------------------------------------===// 567 // Named casts 568 //===----------------------------------------------------------------------===// 569 570 /// getCastName - Get the name of the C++ cast being used, e.g., 571 /// "static_cast", "dynamic_cast", "reinterpret_cast", or 572 /// "const_cast". The returned pointer must not be freed. 573 const char *CXXNamedCastExpr::getCastName() const { 574 switch (getStmtClass()) { 575 case CXXStaticCastExprClass: return "static_cast"; 576 case CXXDynamicCastExprClass: return "dynamic_cast"; 577 case CXXReinterpretCastExprClass: return "reinterpret_cast"; 578 case CXXConstCastExprClass: return "const_cast"; 579 default: return "<invalid cast>"; 580 } 581 } 582 583 CXXStaticCastExpr *CXXStaticCastExpr::Create(const ASTContext &C, QualType T, 584 ExprValueKind VK, 585 CastKind K, Expr *Op, 586 const CXXCastPath *BasePath, 587 TypeSourceInfo *WrittenTy, 588 SourceLocation L, 589 SourceLocation RParenLoc, 590 SourceRange AngleBrackets) { 591 unsigned PathSize = (BasePath ? BasePath->size() : 0); 592 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize)); 593 CXXStaticCastExpr *E = 594 new (Buffer) CXXStaticCastExpr(T, VK, K, Op, PathSize, WrittenTy, L, 595 RParenLoc, AngleBrackets); 596 if (PathSize) 597 std::uninitialized_copy_n(BasePath->data(), BasePath->size(), 598 E->getTrailingObjects<CXXBaseSpecifier *>()); 599 return E; 600 } 601 602 CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(const ASTContext &C, 603 unsigned PathSize) { 604 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize)); 605 return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize); 606 } 607 608 CXXDynamicCastExpr *CXXDynamicCastExpr::Create(const ASTContext &C, QualType T, 609 ExprValueKind VK, 610 CastKind K, Expr *Op, 611 const CXXCastPath *BasePath, 612 TypeSourceInfo *WrittenTy, 613 SourceLocation L, 614 SourceLocation RParenLoc, 615 SourceRange AngleBrackets) { 616 unsigned PathSize = (BasePath ? BasePath->size() : 0); 617 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize)); 618 CXXDynamicCastExpr *E = 619 new (Buffer) CXXDynamicCastExpr(T, VK, K, Op, PathSize, WrittenTy, L, 620 RParenLoc, AngleBrackets); 621 if (PathSize) 622 std::uninitialized_copy_n(BasePath->data(), BasePath->size(), 623 E->getTrailingObjects<CXXBaseSpecifier *>()); 624 return E; 625 } 626 627 CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(const ASTContext &C, 628 unsigned PathSize) { 629 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize)); 630 return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize); 631 } 632 633 /// isAlwaysNull - Return whether the result of the dynamic_cast is proven 634 /// to always be null. For example: 635 /// 636 /// struct A { }; 637 /// struct B final : A { }; 638 /// struct C { }; 639 /// 640 /// C *f(B* b) { return dynamic_cast<C*>(b); } 641 bool CXXDynamicCastExpr::isAlwaysNull() const 642 { 643 QualType SrcType = getSubExpr()->getType(); 644 QualType DestType = getType(); 645 646 if (const PointerType *SrcPTy = SrcType->getAs<PointerType>()) { 647 SrcType = SrcPTy->getPointeeType(); 648 DestType = DestType->castAs<PointerType>()->getPointeeType(); 649 } 650 651 if (DestType->isVoidType()) 652 return false; 653 654 const CXXRecordDecl *SrcRD = 655 cast<CXXRecordDecl>(SrcType->castAs<RecordType>()->getDecl()); 656 657 if (!SrcRD->hasAttr<FinalAttr>()) 658 return false; 659 660 const CXXRecordDecl *DestRD = 661 cast<CXXRecordDecl>(DestType->castAs<RecordType>()->getDecl()); 662 663 return !DestRD->isDerivedFrom(SrcRD); 664 } 665 666 CXXReinterpretCastExpr * 667 CXXReinterpretCastExpr::Create(const ASTContext &C, QualType T, 668 ExprValueKind VK, CastKind K, Expr *Op, 669 const CXXCastPath *BasePath, 670 TypeSourceInfo *WrittenTy, SourceLocation L, 671 SourceLocation RParenLoc, 672 SourceRange AngleBrackets) { 673 unsigned PathSize = (BasePath ? BasePath->size() : 0); 674 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize)); 675 CXXReinterpretCastExpr *E = 676 new (Buffer) CXXReinterpretCastExpr(T, VK, K, Op, PathSize, WrittenTy, L, 677 RParenLoc, AngleBrackets); 678 if (PathSize) 679 std::uninitialized_copy_n(BasePath->data(), BasePath->size(), 680 E->getTrailingObjects<CXXBaseSpecifier *>()); 681 return E; 682 } 683 684 CXXReinterpretCastExpr * 685 CXXReinterpretCastExpr::CreateEmpty(const ASTContext &C, unsigned PathSize) { 686 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize)); 687 return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize); 688 } 689 690 CXXConstCastExpr *CXXConstCastExpr::Create(const ASTContext &C, QualType T, 691 ExprValueKind VK, Expr *Op, 692 TypeSourceInfo *WrittenTy, 693 SourceLocation L, 694 SourceLocation RParenLoc, 695 SourceRange AngleBrackets) { 696 return new (C) CXXConstCastExpr(T, VK, Op, WrittenTy, L, RParenLoc, AngleBrackets); 697 } 698 699 CXXConstCastExpr *CXXConstCastExpr::CreateEmpty(const ASTContext &C) { 700 return new (C) CXXConstCastExpr(EmptyShell()); 701 } 702 703 CXXFunctionalCastExpr * 704 CXXFunctionalCastExpr::Create(const ASTContext &C, QualType T, ExprValueKind VK, 705 TypeSourceInfo *Written, CastKind K, Expr *Op, 706 const CXXCastPath *BasePath, 707 SourceLocation L, SourceLocation R) { 708 unsigned PathSize = (BasePath ? BasePath->size() : 0); 709 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize)); 710 CXXFunctionalCastExpr *E = 711 new (Buffer) CXXFunctionalCastExpr(T, VK, Written, K, Op, PathSize, L, R); 712 if (PathSize) 713 std::uninitialized_copy_n(BasePath->data(), BasePath->size(), 714 E->getTrailingObjects<CXXBaseSpecifier *>()); 715 return E; 716 } 717 718 CXXFunctionalCastExpr * 719 CXXFunctionalCastExpr::CreateEmpty(const ASTContext &C, unsigned PathSize) { 720 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize)); 721 return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize); 722 } 723 724 SourceLocation CXXFunctionalCastExpr::getLocStart() const { 725 return getTypeInfoAsWritten()->getTypeLoc().getLocStart(); 726 } 727 728 SourceLocation CXXFunctionalCastExpr::getLocEnd() const { 729 return RParenLoc.isValid() ? RParenLoc : getSubExpr()->getLocEnd(); 730 } 731 732 UserDefinedLiteral::LiteralOperatorKind 733 UserDefinedLiteral::getLiteralOperatorKind() const { 734 if (getNumArgs() == 0) 735 return LOK_Template; 736 if (getNumArgs() == 2) 737 return LOK_String; 738 739 assert(getNumArgs() == 1 && "unexpected #args in literal operator call"); 740 QualType ParamTy = 741 cast<FunctionDecl>(getCalleeDecl())->getParamDecl(0)->getType(); 742 if (ParamTy->isPointerType()) 743 return LOK_Raw; 744 if (ParamTy->isAnyCharacterType()) 745 return LOK_Character; 746 if (ParamTy->isIntegerType()) 747 return LOK_Integer; 748 if (ParamTy->isFloatingType()) 749 return LOK_Floating; 750 751 llvm_unreachable("unknown kind of literal operator"); 752 } 753 754 Expr *UserDefinedLiteral::getCookedLiteral() { 755 #ifndef NDEBUG 756 LiteralOperatorKind LOK = getLiteralOperatorKind(); 757 assert(LOK != LOK_Template && LOK != LOK_Raw && "not a cooked literal"); 758 #endif 759 return getArg(0); 760 } 761 762 const IdentifierInfo *UserDefinedLiteral::getUDSuffix() const { 763 return cast<FunctionDecl>(getCalleeDecl())->getLiteralIdentifier(); 764 } 765 766 CXXDefaultInitExpr::CXXDefaultInitExpr(const ASTContext &C, SourceLocation Loc, 767 FieldDecl *Field, QualType T) 768 : Expr(CXXDefaultInitExprClass, T.getNonLValueExprType(C), 769 T->isLValueReferenceType() ? VK_LValue : T->isRValueReferenceType() 770 ? VK_XValue 771 : VK_RValue, 772 /*FIXME*/ OK_Ordinary, false, false, false, false), 773 Field(Field), Loc(Loc) { 774 assert(Field->hasInClassInitializer()); 775 } 776 777 CXXTemporary *CXXTemporary::Create(const ASTContext &C, 778 const CXXDestructorDecl *Destructor) { 779 return new (C) CXXTemporary(Destructor); 780 } 781 782 CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(const ASTContext &C, 783 CXXTemporary *Temp, 784 Expr* SubExpr) { 785 assert((SubExpr->getType()->isRecordType() || 786 SubExpr->getType()->isArrayType()) && 787 "Expression bound to a temporary must have record or array type!"); 788 789 return new (C) CXXBindTemporaryExpr(Temp, SubExpr); 790 } 791 792 CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(const ASTContext &C, 793 CXXConstructorDecl *Cons, 794 TypeSourceInfo *Type, 795 ArrayRef<Expr*> Args, 796 SourceRange ParenOrBraceRange, 797 bool HadMultipleCandidates, 798 bool ListInitialization, 799 bool StdInitListInitialization, 800 bool ZeroInitialization) 801 : CXXConstructExpr(C, CXXTemporaryObjectExprClass, 802 Type->getType().getNonReferenceType(), 803 Type->getTypeLoc().getBeginLoc(), 804 Cons, false, Args, 805 HadMultipleCandidates, 806 ListInitialization, 807 StdInitListInitialization, 808 ZeroInitialization, 809 CXXConstructExpr::CK_Complete, ParenOrBraceRange), 810 Type(Type) { 811 } 812 813 SourceLocation CXXTemporaryObjectExpr::getLocStart() const { 814 return Type->getTypeLoc().getBeginLoc(); 815 } 816 817 SourceLocation CXXTemporaryObjectExpr::getLocEnd() const { 818 SourceLocation Loc = getParenOrBraceRange().getEnd(); 819 if (Loc.isInvalid() && getNumArgs()) 820 Loc = getArg(getNumArgs()-1)->getLocEnd(); 821 return Loc; 822 } 823 824 CXXConstructExpr *CXXConstructExpr::Create(const ASTContext &C, QualType T, 825 SourceLocation Loc, 826 CXXConstructorDecl *D, bool Elidable, 827 ArrayRef<Expr*> Args, 828 bool HadMultipleCandidates, 829 bool ListInitialization, 830 bool StdInitListInitialization, 831 bool ZeroInitialization, 832 ConstructionKind ConstructKind, 833 SourceRange ParenOrBraceRange) { 834 return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D, 835 Elidable, Args, 836 HadMultipleCandidates, ListInitialization, 837 StdInitListInitialization, 838 ZeroInitialization, ConstructKind, 839 ParenOrBraceRange); 840 } 841 842 CXXConstructExpr::CXXConstructExpr(const ASTContext &C, StmtClass SC, 843 QualType T, SourceLocation Loc, 844 CXXConstructorDecl *D, bool elidable, 845 ArrayRef<Expr*> args, 846 bool HadMultipleCandidates, 847 bool ListInitialization, 848 bool StdInitListInitialization, 849 bool ZeroInitialization, 850 ConstructionKind ConstructKind, 851 SourceRange ParenOrBraceRange) 852 : Expr(SC, T, VK_RValue, OK_Ordinary, 853 T->isDependentType(), T->isDependentType(), 854 T->isInstantiationDependentType(), 855 T->containsUnexpandedParameterPack()), 856 Constructor(D), Loc(Loc), ParenOrBraceRange(ParenOrBraceRange), 857 NumArgs(args.size()), 858 Elidable(elidable), HadMultipleCandidates(HadMultipleCandidates), 859 ListInitialization(ListInitialization), 860 StdInitListInitialization(StdInitListInitialization), 861 ZeroInitialization(ZeroInitialization), 862 ConstructKind(ConstructKind), Args(nullptr) 863 { 864 if (NumArgs) { 865 Args = new (C) Stmt*[args.size()]; 866 867 for (unsigned i = 0; i != args.size(); ++i) { 868 assert(args[i] && "NULL argument in CXXConstructExpr"); 869 870 if (args[i]->isValueDependent()) 871 ExprBits.ValueDependent = true; 872 if (args[i]->isInstantiationDependent()) 873 ExprBits.InstantiationDependent = true; 874 if (args[i]->containsUnexpandedParameterPack()) 875 ExprBits.ContainsUnexpandedParameterPack = true; 876 877 Args[i] = args[i]; 878 } 879 } 880 } 881 882 LambdaCapture::LambdaCapture(SourceLocation Loc, bool Implicit, 883 LambdaCaptureKind Kind, VarDecl *Var, 884 SourceLocation EllipsisLoc) 885 : DeclAndBits(Var, 0), Loc(Loc), EllipsisLoc(EllipsisLoc) 886 { 887 unsigned Bits = 0; 888 if (Implicit) 889 Bits |= Capture_Implicit; 890 891 switch (Kind) { 892 case LCK_This: 893 assert(!Var && "'this' capture cannot have a variable!"); 894 break; 895 896 case LCK_ByCopy: 897 Bits |= Capture_ByCopy; 898 // Fall through 899 case LCK_ByRef: 900 assert(Var && "capture must have a variable!"); 901 break; 902 case LCK_VLAType: 903 assert(!Var && "VLA type capture cannot have a variable!"); 904 Bits |= Capture_ByCopy; 905 break; 906 } 907 DeclAndBits.setInt(Bits); 908 } 909 910 LambdaCaptureKind LambdaCapture::getCaptureKind() const { 911 Decl *D = DeclAndBits.getPointer(); 912 bool CapByCopy = DeclAndBits.getInt() & Capture_ByCopy; 913 if (!D) 914 return CapByCopy ? LCK_VLAType : LCK_This; 915 916 return CapByCopy ? LCK_ByCopy : LCK_ByRef; 917 } 918 919 LambdaExpr::LambdaExpr(QualType T, SourceRange IntroducerRange, 920 LambdaCaptureDefault CaptureDefault, 921 SourceLocation CaptureDefaultLoc, 922 ArrayRef<LambdaCapture> Captures, bool ExplicitParams, 923 bool ExplicitResultType, ArrayRef<Expr *> CaptureInits, 924 ArrayRef<VarDecl *> ArrayIndexVars, 925 ArrayRef<unsigned> ArrayIndexStarts, 926 SourceLocation ClosingBrace, 927 bool ContainsUnexpandedParameterPack) 928 : Expr(LambdaExprClass, T, VK_RValue, OK_Ordinary, T->isDependentType(), 929 T->isDependentType(), T->isDependentType(), 930 ContainsUnexpandedParameterPack), 931 IntroducerRange(IntroducerRange), CaptureDefaultLoc(CaptureDefaultLoc), 932 NumCaptures(Captures.size()), CaptureDefault(CaptureDefault), 933 ExplicitParams(ExplicitParams), ExplicitResultType(ExplicitResultType), 934 ClosingBrace(ClosingBrace) { 935 assert(CaptureInits.size() == Captures.size() && "Wrong number of arguments"); 936 CXXRecordDecl *Class = getLambdaClass(); 937 CXXRecordDecl::LambdaDefinitionData &Data = Class->getLambdaData(); 938 939 // FIXME: Propagate "has unexpanded parameter pack" bit. 940 941 // Copy captures. 942 const ASTContext &Context = Class->getASTContext(); 943 Data.NumCaptures = NumCaptures; 944 Data.NumExplicitCaptures = 0; 945 Data.Captures = 946 (LambdaCapture *)Context.Allocate(sizeof(LambdaCapture) * NumCaptures); 947 LambdaCapture *ToCapture = Data.Captures; 948 for (unsigned I = 0, N = Captures.size(); I != N; ++I) { 949 if (Captures[I].isExplicit()) 950 ++Data.NumExplicitCaptures; 951 952 *ToCapture++ = Captures[I]; 953 } 954 955 // Copy initialization expressions for the non-static data members. 956 Stmt **Stored = getStoredStmts(); 957 for (unsigned I = 0, N = CaptureInits.size(); I != N; ++I) 958 *Stored++ = CaptureInits[I]; 959 960 // Copy the body of the lambda. 961 *Stored++ = getCallOperator()->getBody(); 962 963 // Copy the array index variables, if any. 964 HasArrayIndexVars = !ArrayIndexVars.empty(); 965 if (HasArrayIndexVars) { 966 assert(ArrayIndexStarts.size() == NumCaptures); 967 memcpy(getArrayIndexVars(), ArrayIndexVars.data(), 968 sizeof(VarDecl *) * ArrayIndexVars.size()); 969 memcpy(getArrayIndexStarts(), ArrayIndexStarts.data(), 970 sizeof(unsigned) * Captures.size()); 971 getArrayIndexStarts()[Captures.size()] = ArrayIndexVars.size(); 972 } 973 } 974 975 LambdaExpr *LambdaExpr::Create( 976 const ASTContext &Context, CXXRecordDecl *Class, 977 SourceRange IntroducerRange, LambdaCaptureDefault CaptureDefault, 978 SourceLocation CaptureDefaultLoc, ArrayRef<LambdaCapture> Captures, 979 bool ExplicitParams, bool ExplicitResultType, ArrayRef<Expr *> CaptureInits, 980 ArrayRef<VarDecl *> ArrayIndexVars, ArrayRef<unsigned> ArrayIndexStarts, 981 SourceLocation ClosingBrace, bool ContainsUnexpandedParameterPack) { 982 // Determine the type of the expression (i.e., the type of the 983 // function object we're creating). 984 QualType T = Context.getTypeDeclType(Class); 985 986 unsigned Size = totalSizeToAlloc<Stmt *, unsigned, VarDecl *>( 987 Captures.size() + 1, ArrayIndexVars.empty() ? 0 : Captures.size() + 1, 988 ArrayIndexVars.size()); 989 void *Mem = Context.Allocate(Size); 990 return new (Mem) LambdaExpr(T, IntroducerRange, 991 CaptureDefault, CaptureDefaultLoc, Captures, 992 ExplicitParams, ExplicitResultType, 993 CaptureInits, ArrayIndexVars, ArrayIndexStarts, 994 ClosingBrace, ContainsUnexpandedParameterPack); 995 } 996 997 LambdaExpr *LambdaExpr::CreateDeserialized(const ASTContext &C, 998 unsigned NumCaptures, 999 unsigned NumArrayIndexVars) { 1000 unsigned Size = totalSizeToAlloc<Stmt *, unsigned, VarDecl *>( 1001 NumCaptures + 1, NumArrayIndexVars ? NumCaptures + 1 : 0, 1002 NumArrayIndexVars); 1003 void *Mem = C.Allocate(Size); 1004 return new (Mem) LambdaExpr(EmptyShell(), NumCaptures, NumArrayIndexVars > 0); 1005 } 1006 1007 bool LambdaExpr::isInitCapture(const LambdaCapture *C) const { 1008 return (C->capturesVariable() && C->getCapturedVar()->isInitCapture() && 1009 (getCallOperator() == C->getCapturedVar()->getDeclContext())); 1010 } 1011 1012 LambdaExpr::capture_iterator LambdaExpr::capture_begin() const { 1013 return getLambdaClass()->getLambdaData().Captures; 1014 } 1015 1016 LambdaExpr::capture_iterator LambdaExpr::capture_end() const { 1017 return capture_begin() + NumCaptures; 1018 } 1019 1020 LambdaExpr::capture_range LambdaExpr::captures() const { 1021 return capture_range(capture_begin(), capture_end()); 1022 } 1023 1024 LambdaExpr::capture_iterator LambdaExpr::explicit_capture_begin() const { 1025 return capture_begin(); 1026 } 1027 1028 LambdaExpr::capture_iterator LambdaExpr::explicit_capture_end() const { 1029 struct CXXRecordDecl::LambdaDefinitionData &Data 1030 = getLambdaClass()->getLambdaData(); 1031 return Data.Captures + Data.NumExplicitCaptures; 1032 } 1033 1034 LambdaExpr::capture_range LambdaExpr::explicit_captures() const { 1035 return capture_range(explicit_capture_begin(), explicit_capture_end()); 1036 } 1037 1038 LambdaExpr::capture_iterator LambdaExpr::implicit_capture_begin() const { 1039 return explicit_capture_end(); 1040 } 1041 1042 LambdaExpr::capture_iterator LambdaExpr::implicit_capture_end() const { 1043 return capture_end(); 1044 } 1045 1046 LambdaExpr::capture_range LambdaExpr::implicit_captures() const { 1047 return capture_range(implicit_capture_begin(), implicit_capture_end()); 1048 } 1049 1050 ArrayRef<VarDecl *> 1051 LambdaExpr::getCaptureInitIndexVars(const_capture_init_iterator Iter) const { 1052 assert(HasArrayIndexVars && "No array index-var data?"); 1053 1054 unsigned Index = Iter - capture_init_begin(); 1055 assert(Index < getLambdaClass()->getLambdaData().NumCaptures && 1056 "Capture index out-of-range"); 1057 VarDecl *const *IndexVars = getArrayIndexVars(); 1058 const unsigned *IndexStarts = getArrayIndexStarts(); 1059 return llvm::makeArrayRef(IndexVars + IndexStarts[Index], 1060 IndexVars + IndexStarts[Index + 1]); 1061 } 1062 1063 CXXRecordDecl *LambdaExpr::getLambdaClass() const { 1064 return getType()->getAsCXXRecordDecl(); 1065 } 1066 1067 CXXMethodDecl *LambdaExpr::getCallOperator() const { 1068 CXXRecordDecl *Record = getLambdaClass(); 1069 return Record->getLambdaCallOperator(); 1070 } 1071 1072 TemplateParameterList *LambdaExpr::getTemplateParameterList() const { 1073 CXXRecordDecl *Record = getLambdaClass(); 1074 return Record->getGenericLambdaTemplateParameterList(); 1075 1076 } 1077 1078 CompoundStmt *LambdaExpr::getBody() const { 1079 // FIXME: this mutation in getBody is bogus. It should be 1080 // initialized in ASTStmtReader::VisitLambdaExpr, but for reasons I 1081 // don't understand, that doesn't work. 1082 if (!getStoredStmts()[NumCaptures]) 1083 *const_cast<clang::Stmt **>(&getStoredStmts()[NumCaptures]) = 1084 getCallOperator()->getBody(); 1085 1086 return static_cast<CompoundStmt *>(getStoredStmts()[NumCaptures]); 1087 } 1088 1089 bool LambdaExpr::isMutable() const { 1090 return !getCallOperator()->isConst(); 1091 } 1092 1093 ExprWithCleanups::ExprWithCleanups(Expr *subexpr, 1094 ArrayRef<CleanupObject> objects) 1095 : Expr(ExprWithCleanupsClass, subexpr->getType(), 1096 subexpr->getValueKind(), subexpr->getObjectKind(), 1097 subexpr->isTypeDependent(), subexpr->isValueDependent(), 1098 subexpr->isInstantiationDependent(), 1099 subexpr->containsUnexpandedParameterPack()), 1100 SubExpr(subexpr) { 1101 ExprWithCleanupsBits.NumObjects = objects.size(); 1102 for (unsigned i = 0, e = objects.size(); i != e; ++i) 1103 getTrailingObjects<CleanupObject>()[i] = objects[i]; 1104 } 1105 1106 ExprWithCleanups *ExprWithCleanups::Create(const ASTContext &C, Expr *subexpr, 1107 ArrayRef<CleanupObject> objects) { 1108 void *buffer = C.Allocate(totalSizeToAlloc<CleanupObject>(objects.size()), 1109 llvm::alignOf<ExprWithCleanups>()); 1110 return new (buffer) ExprWithCleanups(subexpr, objects); 1111 } 1112 1113 ExprWithCleanups::ExprWithCleanups(EmptyShell empty, unsigned numObjects) 1114 : Expr(ExprWithCleanupsClass, empty) { 1115 ExprWithCleanupsBits.NumObjects = numObjects; 1116 } 1117 1118 ExprWithCleanups *ExprWithCleanups::Create(const ASTContext &C, 1119 EmptyShell empty, 1120 unsigned numObjects) { 1121 void *buffer = C.Allocate(totalSizeToAlloc<CleanupObject>(numObjects), 1122 llvm::alignOf<ExprWithCleanups>()); 1123 return new (buffer) ExprWithCleanups(empty, numObjects); 1124 } 1125 1126 CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type, 1127 SourceLocation LParenLoc, 1128 ArrayRef<Expr*> Args, 1129 SourceLocation RParenLoc) 1130 : Expr(CXXUnresolvedConstructExprClass, 1131 Type->getType().getNonReferenceType(), 1132 (Type->getType()->isLValueReferenceType() ? VK_LValue 1133 :Type->getType()->isRValueReferenceType()? VK_XValue 1134 :VK_RValue), 1135 OK_Ordinary, 1136 Type->getType()->isDependentType(), true, true, 1137 Type->getType()->containsUnexpandedParameterPack()), 1138 Type(Type), 1139 LParenLoc(LParenLoc), 1140 RParenLoc(RParenLoc), 1141 NumArgs(Args.size()) { 1142 Expr **StoredArgs = getTrailingObjects<Expr *>(); 1143 for (unsigned I = 0; I != Args.size(); ++I) { 1144 if (Args[I]->containsUnexpandedParameterPack()) 1145 ExprBits.ContainsUnexpandedParameterPack = true; 1146 1147 StoredArgs[I] = Args[I]; 1148 } 1149 } 1150 1151 CXXUnresolvedConstructExpr * 1152 CXXUnresolvedConstructExpr::Create(const ASTContext &C, 1153 TypeSourceInfo *Type, 1154 SourceLocation LParenLoc, 1155 ArrayRef<Expr*> Args, 1156 SourceLocation RParenLoc) { 1157 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(Args.size())); 1158 return new (Mem) CXXUnresolvedConstructExpr(Type, LParenLoc, Args, RParenLoc); 1159 } 1160 1161 CXXUnresolvedConstructExpr * 1162 CXXUnresolvedConstructExpr::CreateEmpty(const ASTContext &C, unsigned NumArgs) { 1163 Stmt::EmptyShell Empty; 1164 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(NumArgs)); 1165 return new (Mem) CXXUnresolvedConstructExpr(Empty, NumArgs); 1166 } 1167 1168 SourceLocation CXXUnresolvedConstructExpr::getLocStart() const { 1169 return Type->getTypeLoc().getBeginLoc(); 1170 } 1171 1172 CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr( 1173 const ASTContext &C, Expr *Base, QualType BaseType, bool IsArrow, 1174 SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, 1175 SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope, 1176 DeclarationNameInfo MemberNameInfo, 1177 const TemplateArgumentListInfo *TemplateArgs) 1178 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy, VK_LValue, 1179 OK_Ordinary, true, true, true, 1180 ((Base && Base->containsUnexpandedParameterPack()) || 1181 (QualifierLoc && 1182 QualifierLoc.getNestedNameSpecifier() 1183 ->containsUnexpandedParameterPack()) || 1184 MemberNameInfo.containsUnexpandedParameterPack())), 1185 Base(Base), BaseType(BaseType), IsArrow(IsArrow), 1186 HasTemplateKWAndArgsInfo(TemplateArgs != nullptr || 1187 TemplateKWLoc.isValid()), 1188 OperatorLoc(OperatorLoc), QualifierLoc(QualifierLoc), 1189 FirstQualifierFoundInScope(FirstQualifierFoundInScope), 1190 MemberNameInfo(MemberNameInfo) { 1191 if (TemplateArgs) { 1192 bool Dependent = true; 1193 bool InstantiationDependent = true; 1194 bool ContainsUnexpandedParameterPack = false; 1195 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom( 1196 TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(), 1197 Dependent, InstantiationDependent, ContainsUnexpandedParameterPack); 1198 if (ContainsUnexpandedParameterPack) 1199 ExprBits.ContainsUnexpandedParameterPack = true; 1200 } else if (TemplateKWLoc.isValid()) { 1201 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom( 1202 TemplateKWLoc); 1203 } 1204 } 1205 1206 CXXDependentScopeMemberExpr * 1207 CXXDependentScopeMemberExpr::Create(const ASTContext &C, 1208 Expr *Base, QualType BaseType, bool IsArrow, 1209 SourceLocation OperatorLoc, 1210 NestedNameSpecifierLoc QualifierLoc, 1211 SourceLocation TemplateKWLoc, 1212 NamedDecl *FirstQualifierFoundInScope, 1213 DeclarationNameInfo MemberNameInfo, 1214 const TemplateArgumentListInfo *TemplateArgs) { 1215 bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.isValid(); 1216 unsigned NumTemplateArgs = TemplateArgs ? TemplateArgs->size() : 0; 1217 std::size_t Size = 1218 totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>( 1219 HasTemplateKWAndArgsInfo, NumTemplateArgs); 1220 1221 void *Mem = C.Allocate(Size, llvm::alignOf<CXXDependentScopeMemberExpr>()); 1222 return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType, 1223 IsArrow, OperatorLoc, 1224 QualifierLoc, 1225 TemplateKWLoc, 1226 FirstQualifierFoundInScope, 1227 MemberNameInfo, TemplateArgs); 1228 } 1229 1230 CXXDependentScopeMemberExpr * 1231 CXXDependentScopeMemberExpr::CreateEmpty(const ASTContext &C, 1232 bool HasTemplateKWAndArgsInfo, 1233 unsigned NumTemplateArgs) { 1234 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo); 1235 std::size_t Size = 1236 totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>( 1237 HasTemplateKWAndArgsInfo, NumTemplateArgs); 1238 void *Mem = C.Allocate(Size, llvm::alignOf<CXXDependentScopeMemberExpr>()); 1239 CXXDependentScopeMemberExpr *E 1240 = new (Mem) CXXDependentScopeMemberExpr(C, nullptr, QualType(), 1241 0, SourceLocation(), 1242 NestedNameSpecifierLoc(), 1243 SourceLocation(), nullptr, 1244 DeclarationNameInfo(), nullptr); 1245 E->HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo; 1246 return E; 1247 } 1248 1249 bool CXXDependentScopeMemberExpr::isImplicitAccess() const { 1250 if (!Base) 1251 return true; 1252 1253 return cast<Expr>(Base)->isImplicitCXXThis(); 1254 } 1255 1256 static bool hasOnlyNonStaticMemberFunctions(UnresolvedSetIterator begin, 1257 UnresolvedSetIterator end) { 1258 do { 1259 NamedDecl *decl = *begin; 1260 if (isa<UnresolvedUsingValueDecl>(decl)) 1261 return false; 1262 1263 // Unresolved member expressions should only contain methods and 1264 // method templates. 1265 if (cast<CXXMethodDecl>(decl->getUnderlyingDecl()->getAsFunction()) 1266 ->isStatic()) 1267 return false; 1268 } while (++begin != end); 1269 1270 return true; 1271 } 1272 1273 UnresolvedMemberExpr::UnresolvedMemberExpr(const ASTContext &C, 1274 bool HasUnresolvedUsing, 1275 Expr *Base, QualType BaseType, 1276 bool IsArrow, 1277 SourceLocation OperatorLoc, 1278 NestedNameSpecifierLoc QualifierLoc, 1279 SourceLocation TemplateKWLoc, 1280 const DeclarationNameInfo &MemberNameInfo, 1281 const TemplateArgumentListInfo *TemplateArgs, 1282 UnresolvedSetIterator Begin, 1283 UnresolvedSetIterator End) 1284 : OverloadExpr(UnresolvedMemberExprClass, C, QualifierLoc, TemplateKWLoc, 1285 MemberNameInfo, TemplateArgs, Begin, End, 1286 // Dependent 1287 ((Base && Base->isTypeDependent()) || 1288 BaseType->isDependentType()), 1289 ((Base && Base->isInstantiationDependent()) || 1290 BaseType->isInstantiationDependentType()), 1291 // Contains unexpanded parameter pack 1292 ((Base && Base->containsUnexpandedParameterPack()) || 1293 BaseType->containsUnexpandedParameterPack())), 1294 IsArrow(IsArrow), HasUnresolvedUsing(HasUnresolvedUsing), 1295 Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) { 1296 1297 // Check whether all of the members are non-static member functions, 1298 // and if so, mark give this bound-member type instead of overload type. 1299 if (hasOnlyNonStaticMemberFunctions(Begin, End)) 1300 setType(C.BoundMemberTy); 1301 } 1302 1303 bool UnresolvedMemberExpr::isImplicitAccess() const { 1304 if (!Base) 1305 return true; 1306 1307 return cast<Expr>(Base)->isImplicitCXXThis(); 1308 } 1309 1310 UnresolvedMemberExpr *UnresolvedMemberExpr::Create( 1311 const ASTContext &C, bool HasUnresolvedUsing, Expr *Base, QualType BaseType, 1312 bool IsArrow, SourceLocation OperatorLoc, 1313 NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, 1314 const DeclarationNameInfo &MemberNameInfo, 1315 const TemplateArgumentListInfo *TemplateArgs, UnresolvedSetIterator Begin, 1316 UnresolvedSetIterator End) { 1317 bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.isValid(); 1318 std::size_t Size = 1319 totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>( 1320 HasTemplateKWAndArgsInfo, TemplateArgs ? TemplateArgs->size() : 0); 1321 1322 void *Mem = C.Allocate(Size, llvm::alignOf<UnresolvedMemberExpr>()); 1323 return new (Mem) UnresolvedMemberExpr( 1324 C, HasUnresolvedUsing, Base, BaseType, IsArrow, OperatorLoc, QualifierLoc, 1325 TemplateKWLoc, MemberNameInfo, TemplateArgs, Begin, End); 1326 } 1327 1328 UnresolvedMemberExpr * 1329 UnresolvedMemberExpr::CreateEmpty(const ASTContext &C, 1330 bool HasTemplateKWAndArgsInfo, 1331 unsigned NumTemplateArgs) { 1332 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo); 1333 std::size_t Size = 1334 totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>( 1335 HasTemplateKWAndArgsInfo, NumTemplateArgs); 1336 1337 void *Mem = C.Allocate(Size, llvm::alignOf<UnresolvedMemberExpr>()); 1338 UnresolvedMemberExpr *E = new (Mem) UnresolvedMemberExpr(EmptyShell()); 1339 E->HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo; 1340 return E; 1341 } 1342 1343 CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const { 1344 // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this. 1345 1346 // If there was a nested name specifier, it names the naming class. 1347 // It can't be dependent: after all, we were actually able to do the 1348 // lookup. 1349 CXXRecordDecl *Record = nullptr; 1350 auto *NNS = getQualifier(); 1351 if (NNS && NNS->getKind() != NestedNameSpecifier::Super) { 1352 const Type *T = getQualifier()->getAsType(); 1353 assert(T && "qualifier in member expression does not name type"); 1354 Record = T->getAsCXXRecordDecl(); 1355 assert(Record && "qualifier in member expression does not name record"); 1356 } 1357 // Otherwise the naming class must have been the base class. 1358 else { 1359 QualType BaseType = getBaseType().getNonReferenceType(); 1360 if (isArrow()) { 1361 const PointerType *PT = BaseType->getAs<PointerType>(); 1362 assert(PT && "base of arrow member access is not pointer"); 1363 BaseType = PT->getPointeeType(); 1364 } 1365 1366 Record = BaseType->getAsCXXRecordDecl(); 1367 assert(Record && "base of member expression does not name record"); 1368 } 1369 1370 return Record; 1371 } 1372 1373 SizeOfPackExpr * 1374 SizeOfPackExpr::Create(ASTContext &Context, SourceLocation OperatorLoc, 1375 NamedDecl *Pack, SourceLocation PackLoc, 1376 SourceLocation RParenLoc, 1377 Optional<unsigned> Length, 1378 ArrayRef<TemplateArgument> PartialArgs) { 1379 void *Storage = 1380 Context.Allocate(totalSizeToAlloc<TemplateArgument>(PartialArgs.size())); 1381 return new (Storage) SizeOfPackExpr(Context.getSizeType(), OperatorLoc, Pack, 1382 PackLoc, RParenLoc, Length, PartialArgs); 1383 } 1384 1385 SizeOfPackExpr *SizeOfPackExpr::CreateDeserialized(ASTContext &Context, 1386 unsigned NumPartialArgs) { 1387 void *Storage = 1388 Context.Allocate(totalSizeToAlloc<TemplateArgument>(NumPartialArgs)); 1389 return new (Storage) SizeOfPackExpr(EmptyShell(), NumPartialArgs); 1390 } 1391 1392 SubstNonTypeTemplateParmPackExpr:: 1393 SubstNonTypeTemplateParmPackExpr(QualType T, 1394 NonTypeTemplateParmDecl *Param, 1395 SourceLocation NameLoc, 1396 const TemplateArgument &ArgPack) 1397 : Expr(SubstNonTypeTemplateParmPackExprClass, T, VK_RValue, OK_Ordinary, 1398 true, true, true, true), 1399 Param(Param), Arguments(ArgPack.pack_begin()), 1400 NumArguments(ArgPack.pack_size()), NameLoc(NameLoc) { } 1401 1402 TemplateArgument SubstNonTypeTemplateParmPackExpr::getArgumentPack() const { 1403 return TemplateArgument(llvm::makeArrayRef(Arguments, NumArguments)); 1404 } 1405 1406 FunctionParmPackExpr::FunctionParmPackExpr(QualType T, ParmVarDecl *ParamPack, 1407 SourceLocation NameLoc, 1408 unsigned NumParams, 1409 ParmVarDecl *const *Params) 1410 : Expr(FunctionParmPackExprClass, T, VK_LValue, OK_Ordinary, true, true, 1411 true, true), 1412 ParamPack(ParamPack), NameLoc(NameLoc), NumParameters(NumParams) { 1413 if (Params) 1414 std::uninitialized_copy(Params, Params + NumParams, 1415 getTrailingObjects<ParmVarDecl *>()); 1416 } 1417 1418 FunctionParmPackExpr * 1419 FunctionParmPackExpr::Create(const ASTContext &Context, QualType T, 1420 ParmVarDecl *ParamPack, SourceLocation NameLoc, 1421 ArrayRef<ParmVarDecl *> Params) { 1422 return new (Context.Allocate(totalSizeToAlloc<ParmVarDecl *>(Params.size()))) 1423 FunctionParmPackExpr(T, ParamPack, NameLoc, Params.size(), Params.data()); 1424 } 1425 1426 FunctionParmPackExpr * 1427 FunctionParmPackExpr::CreateEmpty(const ASTContext &Context, 1428 unsigned NumParams) { 1429 return new (Context.Allocate(totalSizeToAlloc<ParmVarDecl *>(NumParams))) 1430 FunctionParmPackExpr(QualType(), nullptr, SourceLocation(), 0, nullptr); 1431 } 1432 1433 void MaterializeTemporaryExpr::setExtendingDecl(const ValueDecl *ExtendedBy, 1434 unsigned ManglingNumber) { 1435 // We only need extra state if we have to remember more than just the Stmt. 1436 if (!ExtendedBy) 1437 return; 1438 1439 // We may need to allocate extra storage for the mangling number and the 1440 // extended-by ValueDecl. 1441 if (!State.is<ExtraState *>()) { 1442 auto ES = new (ExtendedBy->getASTContext()) ExtraState; 1443 ES->Temporary = State.get<Stmt *>(); 1444 State = ES; 1445 } 1446 1447 auto ES = State.get<ExtraState *>(); 1448 ES->ExtendingDecl = ExtendedBy; 1449 ES->ManglingNumber = ManglingNumber; 1450 } 1451 1452 TypeTraitExpr::TypeTraitExpr(QualType T, SourceLocation Loc, TypeTrait Kind, 1453 ArrayRef<TypeSourceInfo *> Args, 1454 SourceLocation RParenLoc, 1455 bool Value) 1456 : Expr(TypeTraitExprClass, T, VK_RValue, OK_Ordinary, 1457 /*TypeDependent=*/false, 1458 /*ValueDependent=*/false, 1459 /*InstantiationDependent=*/false, 1460 /*ContainsUnexpandedParameterPack=*/false), 1461 Loc(Loc), RParenLoc(RParenLoc) 1462 { 1463 TypeTraitExprBits.Kind = Kind; 1464 TypeTraitExprBits.Value = Value; 1465 TypeTraitExprBits.NumArgs = Args.size(); 1466 1467 TypeSourceInfo **ToArgs = getTrailingObjects<TypeSourceInfo *>(); 1468 1469 for (unsigned I = 0, N = Args.size(); I != N; ++I) { 1470 if (Args[I]->getType()->isDependentType()) 1471 setValueDependent(true); 1472 if (Args[I]->getType()->isInstantiationDependentType()) 1473 setInstantiationDependent(true); 1474 if (Args[I]->getType()->containsUnexpandedParameterPack()) 1475 setContainsUnexpandedParameterPack(true); 1476 1477 ToArgs[I] = Args[I]; 1478 } 1479 } 1480 1481 TypeTraitExpr *TypeTraitExpr::Create(const ASTContext &C, QualType T, 1482 SourceLocation Loc, 1483 TypeTrait Kind, 1484 ArrayRef<TypeSourceInfo *> Args, 1485 SourceLocation RParenLoc, 1486 bool Value) { 1487 void *Mem = C.Allocate(totalSizeToAlloc<TypeSourceInfo *>(Args.size())); 1488 return new (Mem) TypeTraitExpr(T, Loc, Kind, Args, RParenLoc, Value); 1489 } 1490 1491 TypeTraitExpr *TypeTraitExpr::CreateDeserialized(const ASTContext &C, 1492 unsigned NumArgs) { 1493 void *Mem = C.Allocate(totalSizeToAlloc<TypeSourceInfo *>(NumArgs)); 1494 return new (Mem) TypeTraitExpr(EmptyShell()); 1495 } 1496 1497 void ArrayTypeTraitExpr::anchor() { } 1498