ExprCXX.cpp revision 6ec278d1a354517e20f13a877481453ee7940c78
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/Basic/IdentifierTable.h" 15#include "clang/AST/DeclCXX.h" 16#include "clang/AST/DeclTemplate.h" 17#include "clang/AST/ExprCXX.h" 18#include "clang/AST/TypeLoc.h" 19using namespace clang; 20 21 22//===----------------------------------------------------------------------===// 23// Child Iterators for iterating over subexpressions/substatements 24//===----------------------------------------------------------------------===// 25 26QualType CXXTypeidExpr::getTypeOperand() const { 27 assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)"); 28 return Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType() 29 .getUnqualifiedType(); 30} 31 32// CXXTypeidExpr - has child iterators if the operand is an expression 33Stmt::child_iterator CXXTypeidExpr::child_begin() { 34 return isTypeOperand() ? child_iterator() 35 : reinterpret_cast<Stmt **>(&Operand); 36} 37Stmt::child_iterator CXXTypeidExpr::child_end() { 38 return isTypeOperand() ? child_iterator() 39 : reinterpret_cast<Stmt **>(&Operand) + 1; 40} 41 42QualType CXXUuidofExpr::getTypeOperand() const { 43 assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)"); 44 return Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType() 45 .getUnqualifiedType(); 46} 47 48// CXXUuidofExpr - has child iterators if the operand is an expression 49Stmt::child_iterator CXXUuidofExpr::child_begin() { 50 return isTypeOperand() ? child_iterator() 51 : reinterpret_cast<Stmt **>(&Operand); 52} 53Stmt::child_iterator CXXUuidofExpr::child_end() { 54 return isTypeOperand() ? child_iterator() 55 : reinterpret_cast<Stmt **>(&Operand) + 1; 56} 57 58// CXXBoolLiteralExpr 59Stmt::child_iterator CXXBoolLiteralExpr::child_begin() { 60 return child_iterator(); 61} 62Stmt::child_iterator CXXBoolLiteralExpr::child_end() { 63 return child_iterator(); 64} 65 66// CXXNullPtrLiteralExpr 67Stmt::child_iterator CXXNullPtrLiteralExpr::child_begin() { 68 return child_iterator(); 69} 70Stmt::child_iterator CXXNullPtrLiteralExpr::child_end() { 71 return child_iterator(); 72} 73 74// CXXThisExpr 75Stmt::child_iterator CXXThisExpr::child_begin() { return child_iterator(); } 76Stmt::child_iterator CXXThisExpr::child_end() { return child_iterator(); } 77 78// CXXThrowExpr 79Stmt::child_iterator CXXThrowExpr::child_begin() { return &Op; } 80Stmt::child_iterator CXXThrowExpr::child_end() { 81 // If Op is 0, we are processing throw; which has no children. 82 return Op ? &Op+1 : &Op; 83} 84 85// CXXDefaultArgExpr 86Stmt::child_iterator CXXDefaultArgExpr::child_begin() { 87 return child_iterator(); 88} 89Stmt::child_iterator CXXDefaultArgExpr::child_end() { 90 return child_iterator(); 91} 92 93// CXXScalarValueInitExpr 94SourceRange CXXScalarValueInitExpr::getSourceRange() const { 95 SourceLocation Start = RParenLoc; 96 if (TypeInfo) 97 Start = TypeInfo->getTypeLoc().getBeginLoc(); 98 return SourceRange(Start, RParenLoc); 99} 100 101Stmt::child_iterator CXXScalarValueInitExpr::child_begin() { 102 return child_iterator(); 103} 104Stmt::child_iterator CXXScalarValueInitExpr::child_end() { 105 return child_iterator(); 106} 107 108// CXXNewExpr 109CXXNewExpr::CXXNewExpr(ASTContext &C, bool globalNew, FunctionDecl *operatorNew, 110 Expr **placementArgs, unsigned numPlaceArgs, 111 SourceRange TypeIdParens, Expr *arraySize, 112 CXXConstructorDecl *constructor, bool initializer, 113 Expr **constructorArgs, unsigned numConsArgs, 114 FunctionDecl *operatorDelete, 115 bool usualArrayDeleteWantsSize, QualType ty, 116 TypeSourceInfo *AllocatedTypeInfo, 117 SourceLocation startLoc, SourceLocation endLoc, 118 SourceLocation constructorLParen, 119 SourceLocation constructorRParen) 120 : Expr(CXXNewExprClass, ty, VK_RValue, OK_Ordinary, 121 ty->isDependentType(), ty->isDependentType(), 122 ty->containsUnexpandedParameterPack()), 123 GlobalNew(globalNew), Initializer(initializer), 124 UsualArrayDeleteWantsSize(usualArrayDeleteWantsSize), 125 SubExprs(0), OperatorNew(operatorNew), 126 OperatorDelete(operatorDelete), Constructor(constructor), 127 AllocatedTypeInfo(AllocatedTypeInfo), TypeIdParens(TypeIdParens), 128 StartLoc(startLoc), EndLoc(endLoc), ConstructorLParen(constructorLParen), 129 ConstructorRParen(constructorRParen) { 130 AllocateArgsArray(C, arraySize != 0, numPlaceArgs, numConsArgs); 131 unsigned i = 0; 132 if (Array) { 133 if (arraySize->containsUnexpandedParameterPack()) 134 ExprBits.ContainsUnexpandedParameterPack = true; 135 136 SubExprs[i++] = arraySize; 137 } 138 139 for (unsigned j = 0; j < NumPlacementArgs; ++j) { 140 if (placementArgs[j]->containsUnexpandedParameterPack()) 141 ExprBits.ContainsUnexpandedParameterPack = true; 142 143 SubExprs[i++] = placementArgs[j]; 144 } 145 146 for (unsigned j = 0; j < NumConstructorArgs; ++j) { 147 if (constructorArgs[j]->containsUnexpandedParameterPack()) 148 ExprBits.ContainsUnexpandedParameterPack = true; 149 150 SubExprs[i++] = constructorArgs[j]; 151 } 152} 153 154void CXXNewExpr::AllocateArgsArray(ASTContext &C, bool isArray, 155 unsigned numPlaceArgs, unsigned numConsArgs){ 156 assert(SubExprs == 0 && "SubExprs already allocated"); 157 Array = isArray; 158 NumPlacementArgs = numPlaceArgs; 159 NumConstructorArgs = numConsArgs; 160 161 unsigned TotalSize = Array + NumPlacementArgs + NumConstructorArgs; 162 SubExprs = new (C) Stmt*[TotalSize]; 163} 164 165 166Stmt::child_iterator CXXNewExpr::child_begin() { return &SubExprs[0]; } 167Stmt::child_iterator CXXNewExpr::child_end() { 168 return &SubExprs[0] + Array + getNumPlacementArgs() + getNumConstructorArgs(); 169} 170 171// CXXDeleteExpr 172QualType CXXDeleteExpr::getDestroyedType() const { 173 const Expr *Arg = getArgument(); 174 while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Arg)) { 175 if (ICE->getCastKind() != CK_UserDefinedConversion && 176 ICE->getType()->isVoidPointerType()) 177 Arg = ICE->getSubExpr(); 178 else 179 break; 180 } 181 // The type-to-delete may not be a pointer if it's a dependent type. 182 const QualType ArgType = Arg->getType(); 183 184 if (ArgType->isDependentType() && !ArgType->isPointerType()) 185 return QualType(); 186 187 return ArgType->getAs<PointerType>()->getPointeeType(); 188} 189 190Stmt::child_iterator CXXDeleteExpr::child_begin() { return &Argument; } 191Stmt::child_iterator CXXDeleteExpr::child_end() { return &Argument+1; } 192 193// CXXPseudoDestructorExpr 194Stmt::child_iterator CXXPseudoDestructorExpr::child_begin() { return &Base; } 195Stmt::child_iterator CXXPseudoDestructorExpr::child_end() { 196 return &Base + 1; 197} 198 199PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info) 200 : Type(Info) 201{ 202 Location = Info->getTypeLoc().getLocalSourceRange().getBegin(); 203} 204 205CXXPseudoDestructorExpr::CXXPseudoDestructorExpr(ASTContext &Context, 206 Expr *Base, bool isArrow, SourceLocation OperatorLoc, 207 NestedNameSpecifier *Qualifier, SourceRange QualifierRange, 208 TypeSourceInfo *ScopeType, SourceLocation ColonColonLoc, 209 SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType) 210 : Expr(CXXPseudoDestructorExprClass, 211 Context.getPointerType(Context.getFunctionType(Context.VoidTy, 0, 0, 212 FunctionProtoType::ExtProtoInfo())), 213 VK_RValue, OK_Ordinary, 214 /*isTypeDependent=*/(Base->isTypeDependent() || 215 (DestroyedType.getTypeSourceInfo() && 216 DestroyedType.getTypeSourceInfo()->getType()->isDependentType())), 217 /*isValueDependent=*/Base->isValueDependent(), 218 // ContainsUnexpandedParameterPack 219 (Base->containsUnexpandedParameterPack() || 220 (Qualifier && Qualifier->containsUnexpandedParameterPack()) || 221 (ScopeType && 222 ScopeType->getType()->containsUnexpandedParameterPack()) || 223 (DestroyedType.getTypeSourceInfo() && 224 DestroyedType.getTypeSourceInfo()->getType() 225 ->containsUnexpandedParameterPack()))), 226 Base(static_cast<Stmt *>(Base)), IsArrow(isArrow), 227 OperatorLoc(OperatorLoc), Qualifier(Qualifier), 228 QualifierRange(QualifierRange), 229 ScopeType(ScopeType), ColonColonLoc(ColonColonLoc), TildeLoc(TildeLoc), 230 DestroyedType(DestroyedType) { } 231 232QualType CXXPseudoDestructorExpr::getDestroyedType() const { 233 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo()) 234 return TInfo->getType(); 235 236 return QualType(); 237} 238 239SourceRange CXXPseudoDestructorExpr::getSourceRange() const { 240 SourceLocation End = DestroyedType.getLocation(); 241 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo()) 242 End = TInfo->getTypeLoc().getLocalSourceRange().getEnd(); 243 return SourceRange(Base->getLocStart(), End); 244} 245 246 247// UnresolvedLookupExpr 248UnresolvedLookupExpr * 249UnresolvedLookupExpr::Create(ASTContext &C, 250 CXXRecordDecl *NamingClass, 251 NestedNameSpecifier *Qualifier, 252 SourceRange QualifierRange, 253 const DeclarationNameInfo &NameInfo, 254 bool ADL, 255 const TemplateArgumentListInfo &Args, 256 UnresolvedSetIterator Begin, 257 UnresolvedSetIterator End) 258{ 259 void *Mem = C.Allocate(sizeof(UnresolvedLookupExpr) + 260 ExplicitTemplateArgumentList::sizeFor(Args)); 261 return new (Mem) UnresolvedLookupExpr(C, NamingClass, 262 Qualifier, QualifierRange, NameInfo, 263 ADL, /*Overload*/ true, &Args, 264 Begin, End); 265} 266 267UnresolvedLookupExpr * 268UnresolvedLookupExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) { 269 std::size_t size = sizeof(UnresolvedLookupExpr); 270 if (NumTemplateArgs != 0) 271 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs); 272 273 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedLookupExpr>()); 274 UnresolvedLookupExpr *E = new (Mem) UnresolvedLookupExpr(EmptyShell()); 275 E->HasExplicitTemplateArgs = NumTemplateArgs != 0; 276 return E; 277} 278 279OverloadExpr::OverloadExpr(StmtClass K, ASTContext &C, 280 NestedNameSpecifier *Qualifier, SourceRange QRange, 281 const DeclarationNameInfo &NameInfo, 282 const TemplateArgumentListInfo *TemplateArgs, 283 UnresolvedSetIterator Begin, 284 UnresolvedSetIterator End, 285 bool KnownDependent, 286 bool KnownContainsUnexpandedParameterPack) 287 : Expr(K, C.OverloadTy, VK_LValue, OK_Ordinary, KnownDependent, 288 KnownDependent, 289 (KnownContainsUnexpandedParameterPack || 290 NameInfo.containsUnexpandedParameterPack() || 291 (Qualifier && Qualifier->containsUnexpandedParameterPack()))), 292 Results(0), NumResults(End - Begin), NameInfo(NameInfo), 293 Qualifier(Qualifier), QualifierRange(QRange), 294 HasExplicitTemplateArgs(TemplateArgs != 0) 295{ 296 NumResults = End - Begin; 297 if (NumResults) { 298 // Determine whether this expression is type-dependent. 299 for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I) { 300 if ((*I)->getDeclContext()->isDependentContext() || 301 isa<UnresolvedUsingValueDecl>(*I)) { 302 ExprBits.TypeDependent = true; 303 ExprBits.ValueDependent = true; 304 } 305 } 306 307 Results = static_cast<DeclAccessPair *>( 308 C.Allocate(sizeof(DeclAccessPair) * NumResults, 309 llvm::alignOf<DeclAccessPair>())); 310 memcpy(Results, &*Begin.getIterator(), 311 NumResults * sizeof(DeclAccessPair)); 312 } 313 314 // If we have explicit template arguments, check for dependent 315 // template arguments and whether they contain any unexpanded pack 316 // expansions. 317 if (TemplateArgs) { 318 bool Dependent = false; 319 bool ContainsUnexpandedParameterPack = false; 320 getExplicitTemplateArgs().initializeFrom(*TemplateArgs, Dependent, 321 ContainsUnexpandedParameterPack); 322 323 if (Dependent) { 324 ExprBits.TypeDependent = true; 325 ExprBits.ValueDependent = true; 326 } 327 if (ContainsUnexpandedParameterPack) 328 ExprBits.ContainsUnexpandedParameterPack = true; 329 } 330 331 if (isTypeDependent()) 332 setType(C.DependentTy); 333} 334 335void OverloadExpr::initializeResults(ASTContext &C, 336 UnresolvedSetIterator Begin, 337 UnresolvedSetIterator End) { 338 assert(Results == 0 && "Results already initialized!"); 339 NumResults = End - Begin; 340 if (NumResults) { 341 Results = static_cast<DeclAccessPair *>( 342 C.Allocate(sizeof(DeclAccessPair) * NumResults, 343 344 llvm::alignOf<DeclAccessPair>())); 345 memcpy(Results, &*Begin.getIterator(), 346 NumResults * sizeof(DeclAccessPair)); 347 } 348} 349 350CXXRecordDecl *OverloadExpr::getNamingClass() const { 351 if (isa<UnresolvedLookupExpr>(this)) 352 return cast<UnresolvedLookupExpr>(this)->getNamingClass(); 353 else 354 return cast<UnresolvedMemberExpr>(this)->getNamingClass(); 355} 356 357Stmt::child_iterator UnresolvedLookupExpr::child_begin() { 358 return child_iterator(); 359} 360Stmt::child_iterator UnresolvedLookupExpr::child_end() { 361 return child_iterator(); 362} 363// UnaryTypeTraitExpr 364Stmt::child_iterator UnaryTypeTraitExpr::child_begin() { 365 return child_iterator(); 366} 367Stmt::child_iterator UnaryTypeTraitExpr::child_end() { 368 return child_iterator(); 369} 370 371//BinaryTypeTraitExpr 372Stmt::child_iterator BinaryTypeTraitExpr::child_begin() { 373 return child_iterator(); 374} 375Stmt::child_iterator BinaryTypeTraitExpr::child_end() { 376 return child_iterator(); 377} 378 379// DependentScopeDeclRefExpr 380DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(QualType T, 381 NestedNameSpecifier *Qualifier, 382 SourceRange QualifierRange, 383 const DeclarationNameInfo &NameInfo, 384 const TemplateArgumentListInfo *Args) 385 : Expr(DependentScopeDeclRefExprClass, T, VK_LValue, OK_Ordinary, 386 true, true, 387 (NameInfo.containsUnexpandedParameterPack() || 388 (Qualifier && Qualifier->containsUnexpandedParameterPack()))), 389 NameInfo(NameInfo), QualifierRange(QualifierRange), Qualifier(Qualifier), 390 HasExplicitTemplateArgs(Args != 0) 391{ 392 if (Args) { 393 bool Dependent = true; 394 bool ContainsUnexpandedParameterPack 395 = ExprBits.ContainsUnexpandedParameterPack; 396 397 reinterpret_cast<ExplicitTemplateArgumentList*>(this+1) 398 ->initializeFrom(*Args, Dependent, ContainsUnexpandedParameterPack); 399 ExprBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack; 400 } 401} 402 403DependentScopeDeclRefExpr * 404DependentScopeDeclRefExpr::Create(ASTContext &C, 405 NestedNameSpecifier *Qualifier, 406 SourceRange QualifierRange, 407 const DeclarationNameInfo &NameInfo, 408 const TemplateArgumentListInfo *Args) { 409 std::size_t size = sizeof(DependentScopeDeclRefExpr); 410 if (Args) 411 size += ExplicitTemplateArgumentList::sizeFor(*Args); 412 void *Mem = C.Allocate(size); 413 return new (Mem) DependentScopeDeclRefExpr(C.DependentTy, 414 Qualifier, QualifierRange, 415 NameInfo, Args); 416} 417 418DependentScopeDeclRefExpr * 419DependentScopeDeclRefExpr::CreateEmpty(ASTContext &C, 420 unsigned NumTemplateArgs) { 421 std::size_t size = sizeof(DependentScopeDeclRefExpr); 422 if (NumTemplateArgs) 423 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs); 424 void *Mem = C.Allocate(size); 425 return new (Mem) DependentScopeDeclRefExpr(QualType(), 0, SourceRange(), 426 DeclarationNameInfo(), 0); 427} 428 429StmtIterator DependentScopeDeclRefExpr::child_begin() { 430 return child_iterator(); 431} 432 433StmtIterator DependentScopeDeclRefExpr::child_end() { 434 return child_iterator(); 435} 436 437SourceRange CXXConstructExpr::getSourceRange() const { 438 if (ParenRange.isValid()) 439 return SourceRange(Loc, ParenRange.getEnd()); 440 441 SourceLocation End = Loc; 442 for (unsigned I = getNumArgs(); I > 0; --I) { 443 const Expr *Arg = getArg(I-1); 444 if (!Arg->isDefaultArgument()) { 445 SourceLocation NewEnd = Arg->getLocEnd(); 446 if (NewEnd.isValid()) { 447 End = NewEnd; 448 break; 449 } 450 } 451 } 452 453 return SourceRange(Loc, End); 454} 455 456SourceRange CXXOperatorCallExpr::getSourceRange() const { 457 OverloadedOperatorKind Kind = getOperator(); 458 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) { 459 if (getNumArgs() == 1) 460 // Prefix operator 461 return SourceRange(getOperatorLoc(), 462 getArg(0)->getSourceRange().getEnd()); 463 else 464 // Postfix operator 465 return SourceRange(getArg(0)->getSourceRange().getEnd(), 466 getOperatorLoc()); 467 } else if (Kind == OO_Call) { 468 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc()); 469 } else if (Kind == OO_Subscript) { 470 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc()); 471 } else if (getNumArgs() == 1) { 472 return SourceRange(getOperatorLoc(), getArg(0)->getSourceRange().getEnd()); 473 } else if (getNumArgs() == 2) { 474 return SourceRange(getArg(0)->getSourceRange().getBegin(), 475 getArg(1)->getSourceRange().getEnd()); 476 } else { 477 return SourceRange(); 478 } 479} 480 481Expr *CXXMemberCallExpr::getImplicitObjectArgument() { 482 if (MemberExpr *MemExpr = dyn_cast<MemberExpr>(getCallee()->IgnoreParens())) 483 return MemExpr->getBase(); 484 485 // FIXME: Will eventually need to cope with member pointers. 486 return 0; 487} 488 489CXXRecordDecl *CXXMemberCallExpr::getRecordDecl() { 490 Expr* ThisArg = getImplicitObjectArgument(); 491 if (!ThisArg) 492 return 0; 493 494 if (ThisArg->getType()->isAnyPointerType()) 495 return ThisArg->getType()->getPointeeType()->getAsCXXRecordDecl(); 496 497 return ThisArg->getType()->getAsCXXRecordDecl(); 498} 499 500SourceRange CXXMemberCallExpr::getSourceRange() const { 501 SourceLocation LocStart = getCallee()->getLocStart(); 502 if (LocStart.isInvalid() && getNumArgs() > 0) 503 LocStart = getArg(0)->getLocStart(); 504 return SourceRange(LocStart, getRParenLoc()); 505} 506 507 508//===----------------------------------------------------------------------===// 509// Named casts 510//===----------------------------------------------------------------------===// 511 512/// getCastName - Get the name of the C++ cast being used, e.g., 513/// "static_cast", "dynamic_cast", "reinterpret_cast", or 514/// "const_cast". The returned pointer must not be freed. 515const char *CXXNamedCastExpr::getCastName() const { 516 switch (getStmtClass()) { 517 case CXXStaticCastExprClass: return "static_cast"; 518 case CXXDynamicCastExprClass: return "dynamic_cast"; 519 case CXXReinterpretCastExprClass: return "reinterpret_cast"; 520 case CXXConstCastExprClass: return "const_cast"; 521 default: return "<invalid cast>"; 522 } 523} 524 525CXXStaticCastExpr *CXXStaticCastExpr::Create(ASTContext &C, QualType T, 526 ExprValueKind VK, 527 CastKind K, Expr *Op, 528 const CXXCastPath *BasePath, 529 TypeSourceInfo *WrittenTy, 530 SourceLocation L, 531 SourceLocation RParenLoc) { 532 unsigned PathSize = (BasePath ? BasePath->size() : 0); 533 void *Buffer = C.Allocate(sizeof(CXXStaticCastExpr) 534 + PathSize * sizeof(CXXBaseSpecifier*)); 535 CXXStaticCastExpr *E = 536 new (Buffer) CXXStaticCastExpr(T, VK, K, Op, PathSize, WrittenTy, L, 537 RParenLoc); 538 if (PathSize) E->setCastPath(*BasePath); 539 return E; 540} 541 542CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(ASTContext &C, 543 unsigned PathSize) { 544 void *Buffer = 545 C.Allocate(sizeof(CXXStaticCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 546 return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize); 547} 548 549CXXDynamicCastExpr *CXXDynamicCastExpr::Create(ASTContext &C, QualType T, 550 ExprValueKind VK, 551 CastKind K, Expr *Op, 552 const CXXCastPath *BasePath, 553 TypeSourceInfo *WrittenTy, 554 SourceLocation L, 555 SourceLocation RParenLoc) { 556 unsigned PathSize = (BasePath ? BasePath->size() : 0); 557 void *Buffer = C.Allocate(sizeof(CXXDynamicCastExpr) 558 + PathSize * sizeof(CXXBaseSpecifier*)); 559 CXXDynamicCastExpr *E = 560 new (Buffer) CXXDynamicCastExpr(T, VK, K, Op, PathSize, WrittenTy, L, 561 RParenLoc); 562 if (PathSize) E->setCastPath(*BasePath); 563 return E; 564} 565 566CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(ASTContext &C, 567 unsigned PathSize) { 568 void *Buffer = 569 C.Allocate(sizeof(CXXDynamicCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 570 return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize); 571} 572 573CXXReinterpretCastExpr * 574CXXReinterpretCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK, 575 CastKind K, Expr *Op, 576 const CXXCastPath *BasePath, 577 TypeSourceInfo *WrittenTy, SourceLocation L, 578 SourceLocation RParenLoc) { 579 unsigned PathSize = (BasePath ? BasePath->size() : 0); 580 void *Buffer = 581 C.Allocate(sizeof(CXXReinterpretCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 582 CXXReinterpretCastExpr *E = 583 new (Buffer) CXXReinterpretCastExpr(T, VK, K, Op, PathSize, WrittenTy, L, 584 RParenLoc); 585 if (PathSize) E->setCastPath(*BasePath); 586 return E; 587} 588 589CXXReinterpretCastExpr * 590CXXReinterpretCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) { 591 void *Buffer = C.Allocate(sizeof(CXXReinterpretCastExpr) 592 + PathSize * sizeof(CXXBaseSpecifier*)); 593 return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize); 594} 595 596CXXConstCastExpr *CXXConstCastExpr::Create(ASTContext &C, QualType T, 597 ExprValueKind VK, Expr *Op, 598 TypeSourceInfo *WrittenTy, 599 SourceLocation L, 600 SourceLocation RParenLoc) { 601 return new (C) CXXConstCastExpr(T, VK, Op, WrittenTy, L, RParenLoc); 602} 603 604CXXConstCastExpr *CXXConstCastExpr::CreateEmpty(ASTContext &C) { 605 return new (C) CXXConstCastExpr(EmptyShell()); 606} 607 608CXXFunctionalCastExpr * 609CXXFunctionalCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK, 610 TypeSourceInfo *Written, SourceLocation L, 611 CastKind K, Expr *Op, const CXXCastPath *BasePath, 612 SourceLocation R) { 613 unsigned PathSize = (BasePath ? BasePath->size() : 0); 614 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr) 615 + PathSize * sizeof(CXXBaseSpecifier*)); 616 CXXFunctionalCastExpr *E = 617 new (Buffer) CXXFunctionalCastExpr(T, VK, Written, L, K, Op, PathSize, R); 618 if (PathSize) E->setCastPath(*BasePath); 619 return E; 620} 621 622CXXFunctionalCastExpr * 623CXXFunctionalCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) { 624 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr) 625 + PathSize * sizeof(CXXBaseSpecifier*)); 626 return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize); 627} 628 629 630CXXDefaultArgExpr * 631CXXDefaultArgExpr::Create(ASTContext &C, SourceLocation Loc, 632 ParmVarDecl *Param, Expr *SubExpr) { 633 void *Mem = C.Allocate(sizeof(CXXDefaultArgExpr) + sizeof(Stmt *)); 634 return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param, 635 SubExpr); 636} 637 638CXXTemporary *CXXTemporary::Create(ASTContext &C, 639 const CXXDestructorDecl *Destructor) { 640 return new (C) CXXTemporary(Destructor); 641} 642 643CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C, 644 CXXTemporary *Temp, 645 Expr* SubExpr) { 646 assert(SubExpr->getType()->isRecordType() && 647 "Expression bound to a temporary must have record type!"); 648 649 return new (C) CXXBindTemporaryExpr(Temp, SubExpr); 650} 651 652CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C, 653 CXXConstructorDecl *Cons, 654 TypeSourceInfo *Type, 655 Expr **Args, 656 unsigned NumArgs, 657 SourceRange parenRange, 658 bool ZeroInitialization) 659 : CXXConstructExpr(C, CXXTemporaryObjectExprClass, 660 Type->getType().getNonReferenceType(), 661 Type->getTypeLoc().getBeginLoc(), 662 Cons, false, Args, NumArgs, ZeroInitialization, 663 CXXConstructExpr::CK_Complete, parenRange), 664 Type(Type) { 665} 666 667SourceRange CXXTemporaryObjectExpr::getSourceRange() const { 668 return SourceRange(Type->getTypeLoc().getBeginLoc(), 669 getParenRange().getEnd()); 670} 671 672CXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T, 673 SourceLocation Loc, 674 CXXConstructorDecl *D, bool Elidable, 675 Expr **Args, unsigned NumArgs, 676 bool ZeroInitialization, 677 ConstructionKind ConstructKind, 678 SourceRange ParenRange) { 679 return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D, 680 Elidable, Args, NumArgs, ZeroInitialization, 681 ConstructKind, ParenRange); 682} 683 684CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T, 685 SourceLocation Loc, 686 CXXConstructorDecl *D, bool elidable, 687 Expr **args, unsigned numargs, 688 bool ZeroInitialization, 689 ConstructionKind ConstructKind, 690 SourceRange ParenRange) 691 : Expr(SC, T, VK_RValue, OK_Ordinary, 692 T->isDependentType(), T->isDependentType(), 693 T->containsUnexpandedParameterPack()), 694 Constructor(D), Loc(Loc), ParenRange(ParenRange), Elidable(elidable), 695 ZeroInitialization(ZeroInitialization), ConstructKind(ConstructKind), 696 Args(0), NumArgs(numargs) 697{ 698 if (NumArgs) { 699 Args = new (C) Stmt*[NumArgs]; 700 701 for (unsigned i = 0; i != NumArgs; ++i) { 702 assert(args[i] && "NULL argument in CXXConstructExpr"); 703 704 if (args[i]->isValueDependent()) 705 ExprBits.ValueDependent = true; 706 if (args[i]->containsUnexpandedParameterPack()) 707 ExprBits.ContainsUnexpandedParameterPack = true; 708 709 Args[i] = args[i]; 710 } 711 } 712} 713 714ExprWithCleanups::ExprWithCleanups(ASTContext &C, 715 Expr *subexpr, 716 CXXTemporary **temps, 717 unsigned numtemps) 718 : Expr(ExprWithCleanupsClass, subexpr->getType(), 719 subexpr->getValueKind(), subexpr->getObjectKind(), 720 subexpr->isTypeDependent(), subexpr->isValueDependent(), 721 subexpr->containsUnexpandedParameterPack()), 722 SubExpr(subexpr), Temps(0), NumTemps(0) { 723 if (numtemps) { 724 setNumTemporaries(C, numtemps); 725 for (unsigned i = 0; i != numtemps; ++i) 726 Temps[i] = temps[i]; 727 } 728} 729 730void ExprWithCleanups::setNumTemporaries(ASTContext &C, unsigned N) { 731 assert(Temps == 0 && "Cannot resize with this"); 732 NumTemps = N; 733 Temps = new (C) CXXTemporary*[NumTemps]; 734} 735 736 737ExprWithCleanups *ExprWithCleanups::Create(ASTContext &C, 738 Expr *SubExpr, 739 CXXTemporary **Temps, 740 unsigned NumTemps) { 741 return new (C) ExprWithCleanups(C, SubExpr, Temps, NumTemps); 742} 743 744// CXXBindTemporaryExpr 745Stmt::child_iterator CXXBindTemporaryExpr::child_begin() { 746 return &SubExpr; 747} 748 749Stmt::child_iterator CXXBindTemporaryExpr::child_end() { 750 return &SubExpr + 1; 751} 752 753// CXXConstructExpr 754Stmt::child_iterator CXXConstructExpr::child_begin() { 755 return &Args[0]; 756} 757Stmt::child_iterator CXXConstructExpr::child_end() { 758 return &Args[0]+NumArgs; 759} 760 761// ExprWithCleanups 762Stmt::child_iterator ExprWithCleanups::child_begin() { 763 return &SubExpr; 764} 765 766Stmt::child_iterator ExprWithCleanups::child_end() { 767 return &SubExpr + 1; 768} 769 770CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type, 771 SourceLocation LParenLoc, 772 Expr **Args, 773 unsigned NumArgs, 774 SourceLocation RParenLoc) 775 : Expr(CXXUnresolvedConstructExprClass, 776 Type->getType().getNonReferenceType(), 777 VK_LValue, OK_Ordinary, 778 Type->getType()->isDependentType(), true, 779 Type->getType()->containsUnexpandedParameterPack()), 780 Type(Type), 781 LParenLoc(LParenLoc), 782 RParenLoc(RParenLoc), 783 NumArgs(NumArgs) { 784 Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1); 785 for (unsigned I = 0; I != NumArgs; ++I) { 786 if (Args[I]->containsUnexpandedParameterPack()) 787 ExprBits.ContainsUnexpandedParameterPack = true; 788 789 StoredArgs[I] = Args[I]; 790 } 791} 792 793CXXUnresolvedConstructExpr * 794CXXUnresolvedConstructExpr::Create(ASTContext &C, 795 TypeSourceInfo *Type, 796 SourceLocation LParenLoc, 797 Expr **Args, 798 unsigned NumArgs, 799 SourceLocation RParenLoc) { 800 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) + 801 sizeof(Expr *) * NumArgs); 802 return new (Mem) CXXUnresolvedConstructExpr(Type, LParenLoc, 803 Args, NumArgs, RParenLoc); 804} 805 806CXXUnresolvedConstructExpr * 807CXXUnresolvedConstructExpr::CreateEmpty(ASTContext &C, unsigned NumArgs) { 808 Stmt::EmptyShell Empty; 809 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) + 810 sizeof(Expr *) * NumArgs); 811 return new (Mem) CXXUnresolvedConstructExpr(Empty, NumArgs); 812} 813 814SourceRange CXXUnresolvedConstructExpr::getSourceRange() const { 815 return SourceRange(Type->getTypeLoc().getBeginLoc(), RParenLoc); 816} 817 818Stmt::child_iterator CXXUnresolvedConstructExpr::child_begin() { 819 return child_iterator(reinterpret_cast<Stmt **>(this + 1)); 820} 821 822Stmt::child_iterator CXXUnresolvedConstructExpr::child_end() { 823 return child_iterator(reinterpret_cast<Stmt **>(this + 1) + NumArgs); 824} 825 826CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C, 827 Expr *Base, QualType BaseType, 828 bool IsArrow, 829 SourceLocation OperatorLoc, 830 NestedNameSpecifier *Qualifier, 831 SourceRange QualifierRange, 832 NamedDecl *FirstQualifierFoundInScope, 833 DeclarationNameInfo MemberNameInfo, 834 const TemplateArgumentListInfo *TemplateArgs) 835 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy, 836 VK_LValue, OK_Ordinary, true, true, 837 ((Base && Base->containsUnexpandedParameterPack()) || 838 (Qualifier && Qualifier->containsUnexpandedParameterPack()) || 839 MemberNameInfo.containsUnexpandedParameterPack())), 840 Base(Base), BaseType(BaseType), IsArrow(IsArrow), 841 HasExplicitTemplateArgs(TemplateArgs != 0), 842 OperatorLoc(OperatorLoc), 843 Qualifier(Qualifier), QualifierRange(QualifierRange), 844 FirstQualifierFoundInScope(FirstQualifierFoundInScope), 845 MemberNameInfo(MemberNameInfo) { 846 if (TemplateArgs) { 847 bool Dependent = true; 848 bool ContainsUnexpandedParameterPack = false; 849 getExplicitTemplateArgs().initializeFrom(*TemplateArgs, Dependent, 850 ContainsUnexpandedParameterPack); 851 if (ContainsUnexpandedParameterPack) 852 ExprBits.ContainsUnexpandedParameterPack = true; 853 } 854} 855 856CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C, 857 Expr *Base, QualType BaseType, 858 bool IsArrow, 859 SourceLocation OperatorLoc, 860 NestedNameSpecifier *Qualifier, 861 SourceRange QualifierRange, 862 NamedDecl *FirstQualifierFoundInScope, 863 DeclarationNameInfo MemberNameInfo) 864 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy, 865 VK_LValue, OK_Ordinary, true, true, 866 ((Base && Base->containsUnexpandedParameterPack()) || 867 (Qualifier && Qualifier->containsUnexpandedParameterPack()) || 868 MemberNameInfo.containsUnexpandedParameterPack())), 869 Base(Base), BaseType(BaseType), IsArrow(IsArrow), 870 HasExplicitTemplateArgs(false), OperatorLoc(OperatorLoc), 871 Qualifier(Qualifier), QualifierRange(QualifierRange), 872 FirstQualifierFoundInScope(FirstQualifierFoundInScope), 873 MemberNameInfo(MemberNameInfo) { } 874 875CXXDependentScopeMemberExpr * 876CXXDependentScopeMemberExpr::Create(ASTContext &C, 877 Expr *Base, QualType BaseType, bool IsArrow, 878 SourceLocation OperatorLoc, 879 NestedNameSpecifier *Qualifier, 880 SourceRange QualifierRange, 881 NamedDecl *FirstQualifierFoundInScope, 882 DeclarationNameInfo MemberNameInfo, 883 const TemplateArgumentListInfo *TemplateArgs) { 884 if (!TemplateArgs) 885 return new (C) CXXDependentScopeMemberExpr(C, Base, BaseType, 886 IsArrow, OperatorLoc, 887 Qualifier, QualifierRange, 888 FirstQualifierFoundInScope, 889 MemberNameInfo); 890 891 std::size_t size = sizeof(CXXDependentScopeMemberExpr); 892 if (TemplateArgs) 893 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs); 894 895 void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>()); 896 return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType, 897 IsArrow, OperatorLoc, 898 Qualifier, QualifierRange, 899 FirstQualifierFoundInScope, 900 MemberNameInfo, TemplateArgs); 901} 902 903CXXDependentScopeMemberExpr * 904CXXDependentScopeMemberExpr::CreateEmpty(ASTContext &C, 905 unsigned NumTemplateArgs) { 906 if (NumTemplateArgs == 0) 907 return new (C) CXXDependentScopeMemberExpr(C, 0, QualType(), 908 0, SourceLocation(), 0, 909 SourceRange(), 0, 910 DeclarationNameInfo()); 911 912 std::size_t size = sizeof(CXXDependentScopeMemberExpr) + 913 ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs); 914 void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>()); 915 CXXDependentScopeMemberExpr *E 916 = new (Mem) CXXDependentScopeMemberExpr(C, 0, QualType(), 917 0, SourceLocation(), 0, 918 SourceRange(), 0, 919 DeclarationNameInfo(), 0); 920 E->HasExplicitTemplateArgs = true; 921 return E; 922} 923 924Stmt::child_iterator CXXDependentScopeMemberExpr::child_begin() { 925 return child_iterator(&Base); 926} 927 928Stmt::child_iterator CXXDependentScopeMemberExpr::child_end() { 929 if (isImplicitAccess()) 930 return child_iterator(&Base); 931 return child_iterator(&Base + 1); 932} 933 934UnresolvedMemberExpr::UnresolvedMemberExpr(ASTContext &C, 935 bool HasUnresolvedUsing, 936 Expr *Base, QualType BaseType, 937 bool IsArrow, 938 SourceLocation OperatorLoc, 939 NestedNameSpecifier *Qualifier, 940 SourceRange QualifierRange, 941 const DeclarationNameInfo &MemberNameInfo, 942 const TemplateArgumentListInfo *TemplateArgs, 943 UnresolvedSetIterator Begin, 944 UnresolvedSetIterator End) 945 : OverloadExpr(UnresolvedMemberExprClass, C, 946 Qualifier, QualifierRange, MemberNameInfo, 947 TemplateArgs, Begin, End, 948 // Dependent 949 ((Base && Base->isTypeDependent()) || 950 BaseType->isDependentType()), 951 // Contains unexpanded parameter pack 952 ((Base && Base->containsUnexpandedParameterPack()) || 953 BaseType->containsUnexpandedParameterPack())), 954 IsArrow(IsArrow), HasUnresolvedUsing(HasUnresolvedUsing), 955 Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) { 956} 957 958UnresolvedMemberExpr * 959UnresolvedMemberExpr::Create(ASTContext &C, 960 bool HasUnresolvedUsing, 961 Expr *Base, QualType BaseType, bool IsArrow, 962 SourceLocation OperatorLoc, 963 NestedNameSpecifier *Qualifier, 964 SourceRange QualifierRange, 965 const DeclarationNameInfo &MemberNameInfo, 966 const TemplateArgumentListInfo *TemplateArgs, 967 UnresolvedSetIterator Begin, 968 UnresolvedSetIterator End) { 969 std::size_t size = sizeof(UnresolvedMemberExpr); 970 if (TemplateArgs) 971 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs); 972 973 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>()); 974 return new (Mem) UnresolvedMemberExpr(C, 975 HasUnresolvedUsing, Base, BaseType, 976 IsArrow, OperatorLoc, Qualifier, QualifierRange, 977 MemberNameInfo, TemplateArgs, Begin, End); 978} 979 980UnresolvedMemberExpr * 981UnresolvedMemberExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) { 982 std::size_t size = sizeof(UnresolvedMemberExpr); 983 if (NumTemplateArgs != 0) 984 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs); 985 986 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>()); 987 UnresolvedMemberExpr *E = new (Mem) UnresolvedMemberExpr(EmptyShell()); 988 E->HasExplicitTemplateArgs = NumTemplateArgs != 0; 989 return E; 990} 991 992CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const { 993 // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this. 994 995 // If there was a nested name specifier, it names the naming class. 996 // It can't be dependent: after all, we were actually able to do the 997 // lookup. 998 CXXRecordDecl *Record = 0; 999 if (getQualifier()) { 1000 const Type *T = getQualifier()->getAsType(); 1001 assert(T && "qualifier in member expression does not name type"); 1002 Record = T->getAsCXXRecordDecl(); 1003 assert(Record && "qualifier in member expression does not name record"); 1004 } 1005 // Otherwise the naming class must have been the base class. 1006 else { 1007 QualType BaseType = getBaseType().getNonReferenceType(); 1008 if (isArrow()) { 1009 const PointerType *PT = BaseType->getAs<PointerType>(); 1010 assert(PT && "base of arrow member access is not pointer"); 1011 BaseType = PT->getPointeeType(); 1012 } 1013 1014 Record = BaseType->getAsCXXRecordDecl(); 1015 assert(Record && "base of member expression does not name record"); 1016 } 1017 1018 return Record; 1019} 1020 1021Stmt::child_iterator UnresolvedMemberExpr::child_begin() { 1022 return child_iterator(&Base); 1023} 1024 1025Stmt::child_iterator UnresolvedMemberExpr::child_end() { 1026 if (isImplicitAccess()) 1027 return child_iterator(&Base); 1028 return child_iterator(&Base + 1); 1029} 1030 1031Stmt::child_iterator CXXNoexceptExpr::child_begin() { 1032 return child_iterator(&Operand); 1033} 1034Stmt::child_iterator CXXNoexceptExpr::child_end() { 1035 return child_iterator(&Operand + 1); 1036} 1037 1038SourceRange PackExpansionExpr::getSourceRange() const { 1039 return SourceRange(Pattern->getLocStart(), EllipsisLoc); 1040} 1041 1042Stmt::child_iterator PackExpansionExpr::child_begin() { 1043 return child_iterator(&Pattern); 1044} 1045 1046Stmt::child_iterator PackExpansionExpr::child_end() { 1047 return child_iterator(&Pattern + 1); 1048} 1049 1050SourceRange SizeOfPackExpr::getSourceRange() const { 1051 return SourceRange(OperatorLoc, RParenLoc); 1052} 1053 1054Stmt::child_iterator SizeOfPackExpr::child_begin() { 1055 return child_iterator(); 1056} 1057 1058Stmt::child_iterator SizeOfPackExpr::child_end() { 1059 return child_iterator(); 1060} 1061 1062SubstNonTypeTemplateParmPackExpr:: 1063SubstNonTypeTemplateParmPackExpr(QualType T, 1064 NonTypeTemplateParmDecl *Param, 1065 SourceLocation NameLoc, 1066 const TemplateArgument &ArgPack) 1067 : Expr(SubstNonTypeTemplateParmPackExprClass, T, VK_RValue, OK_Ordinary, 1068 true, false, true), 1069 Param(Param), Arguments(ArgPack.pack_begin()), 1070 NumArguments(ArgPack.pack_size()), NameLoc(NameLoc) { } 1071 1072TemplateArgument SubstNonTypeTemplateParmPackExpr::getArgumentPack() const { 1073 return TemplateArgument(Arguments, NumArguments); 1074} 1075 1076SourceRange SubstNonTypeTemplateParmPackExpr::getSourceRange() const { 1077 return NameLoc; 1078} 1079 1080Stmt::child_iterator SubstNonTypeTemplateParmPackExpr::child_begin() { 1081 return child_iterator(); 1082} 1083 1084Stmt::child_iterator SubstNonTypeTemplateParmPackExpr::child_end() { 1085 return child_iterator(); 1086} 1087 1088 1089