ExprCXX.cpp revision 007a9b1c632bfaac20e41c60cbe07fdc6d0e647c
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, QualType ty, 115 TypeSourceInfo *AllocatedTypeInfo, 116 SourceLocation startLoc, SourceLocation endLoc, 117 SourceLocation constructorLParen, 118 SourceLocation constructorRParen) 119 : Expr(CXXNewExprClass, ty, ty->isDependentType(), ty->isDependentType()), 120 GlobalNew(globalNew), 121 Initializer(initializer), SubExprs(0), OperatorNew(operatorNew), 122 OperatorDelete(operatorDelete), Constructor(constructor), 123 AllocatedTypeInfo(AllocatedTypeInfo), TypeIdParens(TypeIdParens), 124 StartLoc(startLoc), EndLoc(endLoc), ConstructorLParen(constructorLParen), 125 ConstructorRParen(constructorRParen) { 126 AllocateArgsArray(C, arraySize != 0, numPlaceArgs, numConsArgs); 127 unsigned i = 0; 128 if (Array) 129 SubExprs[i++] = arraySize; 130 for (unsigned j = 0; j < NumPlacementArgs; ++j) 131 SubExprs[i++] = placementArgs[j]; 132 for (unsigned j = 0; j < NumConstructorArgs; ++j) 133 SubExprs[i++] = constructorArgs[j]; 134} 135 136void CXXNewExpr::AllocateArgsArray(ASTContext &C, bool isArray, 137 unsigned numPlaceArgs, unsigned numConsArgs){ 138 assert(SubExprs == 0 && "SubExprs already allocated"); 139 Array = isArray; 140 NumPlacementArgs = numPlaceArgs; 141 NumConstructorArgs = numConsArgs; 142 143 unsigned TotalSize = Array + NumPlacementArgs + NumConstructorArgs; 144 SubExprs = new (C) Stmt*[TotalSize]; 145} 146 147 148Stmt::child_iterator CXXNewExpr::child_begin() { return &SubExprs[0]; } 149Stmt::child_iterator CXXNewExpr::child_end() { 150 return &SubExprs[0] + Array + getNumPlacementArgs() + getNumConstructorArgs(); 151} 152 153// CXXDeleteExpr 154QualType CXXDeleteExpr::getDestroyedType() const { 155 const Expr *Arg = getArgument(); 156 while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Arg)) { 157 if (ICE->getCastKind() != CK_UserDefinedConversion && 158 ICE->getType()->isVoidPointerType()) 159 Arg = ICE->getSubExpr(); 160 else 161 break; 162 } 163 // The type-to-delete may not be a pointer if it's a dependent type. 164 const QualType ArgType = Arg->getType(); 165 if (ArgType->isDependentType()) 166 return ArgType; 167 168 return ArgType->getAs<PointerType>()->getPointeeType(); 169} 170 171Stmt::child_iterator CXXDeleteExpr::child_begin() { return &Argument; } 172Stmt::child_iterator CXXDeleteExpr::child_end() { return &Argument+1; } 173 174// CXXPseudoDestructorExpr 175Stmt::child_iterator CXXPseudoDestructorExpr::child_begin() { return &Base; } 176Stmt::child_iterator CXXPseudoDestructorExpr::child_end() { 177 return &Base + 1; 178} 179 180PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info) 181 : Type(Info) 182{ 183 Location = Info->getTypeLoc().getLocalSourceRange().getBegin(); 184} 185 186QualType CXXPseudoDestructorExpr::getDestroyedType() const { 187 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo()) 188 return TInfo->getType(); 189 190 return QualType(); 191} 192 193SourceRange CXXPseudoDestructorExpr::getSourceRange() const { 194 SourceLocation End = DestroyedType.getLocation(); 195 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo()) 196 End = TInfo->getTypeLoc().getLocalSourceRange().getEnd(); 197 return SourceRange(Base->getLocStart(), End); 198} 199 200 201// UnresolvedLookupExpr 202UnresolvedLookupExpr * 203UnresolvedLookupExpr::Create(ASTContext &C, bool Dependent, 204 CXXRecordDecl *NamingClass, 205 NestedNameSpecifier *Qualifier, 206 SourceRange QualifierRange, 207 const DeclarationNameInfo &NameInfo, 208 bool ADL, 209 const TemplateArgumentListInfo &Args, 210 UnresolvedSetIterator Begin, 211 UnresolvedSetIterator End) 212{ 213 void *Mem = C.Allocate(sizeof(UnresolvedLookupExpr) + 214 ExplicitTemplateArgumentList::sizeFor(Args)); 215 UnresolvedLookupExpr *ULE 216 = new (Mem) UnresolvedLookupExpr(C, 217 Dependent ? C.DependentTy : C.OverloadTy, 218 Dependent, NamingClass, 219 Qualifier, QualifierRange, NameInfo, 220 ADL, 221 /*Overload*/ true, 222 /*ExplicitTemplateArgs*/ true, 223 Begin, End); 224 225 reinterpret_cast<ExplicitTemplateArgumentList*>(ULE+1)->initializeFrom(Args); 226 227 return ULE; 228} 229 230UnresolvedLookupExpr * 231UnresolvedLookupExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) { 232 std::size_t size = sizeof(UnresolvedLookupExpr); 233 if (NumTemplateArgs != 0) 234 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs); 235 236 void *Mem = C.Allocate(size, llvm::alignof<UnresolvedLookupExpr>()); 237 UnresolvedLookupExpr *E = new (Mem) UnresolvedLookupExpr(EmptyShell()); 238 E->HasExplicitTemplateArgs = NumTemplateArgs != 0; 239 return E; 240} 241 242OverloadExpr::OverloadExpr(StmtClass K, ASTContext &C, QualType T, 243 bool Dependent, NestedNameSpecifier *Qualifier, 244 SourceRange QRange, 245 const DeclarationNameInfo &NameInfo, 246 bool HasTemplateArgs, 247 UnresolvedSetIterator Begin, 248 UnresolvedSetIterator End) 249 : Expr(K, T, Dependent, Dependent), 250 Results(0), NumResults(0), NameInfo(NameInfo), Qualifier(Qualifier), 251 QualifierRange(QRange), HasExplicitTemplateArgs(HasTemplateArgs) 252{ 253 initializeResults(C, Begin, End); 254} 255 256void OverloadExpr::initializeResults(ASTContext &C, 257 UnresolvedSetIterator Begin, 258 UnresolvedSetIterator End) { 259 assert(Results == 0 && "Results already initialized!"); 260 NumResults = End - Begin; 261 if (NumResults) { 262 Results = static_cast<DeclAccessPair *>( 263 C.Allocate(sizeof(DeclAccessPair) * NumResults, 264 llvm::alignof<DeclAccessPair>())); 265 memcpy(Results, &*Begin.getIterator(), 266 NumResults * sizeof(DeclAccessPair)); 267 } 268} 269 270 271bool OverloadExpr::ComputeDependence(UnresolvedSetIterator Begin, 272 UnresolvedSetIterator End, 273 const TemplateArgumentListInfo *Args) { 274 for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I) 275 if ((*I)->getDeclContext()->isDependentContext()) 276 return true; 277 278 if (Args && TemplateSpecializationType::anyDependentTemplateArguments(*Args)) 279 return true; 280 281 return false; 282} 283 284CXXRecordDecl *OverloadExpr::getNamingClass() const { 285 if (isa<UnresolvedLookupExpr>(this)) 286 return cast<UnresolvedLookupExpr>(this)->getNamingClass(); 287 else 288 return cast<UnresolvedMemberExpr>(this)->getNamingClass(); 289} 290 291Stmt::child_iterator UnresolvedLookupExpr::child_begin() { 292 return child_iterator(); 293} 294Stmt::child_iterator UnresolvedLookupExpr::child_end() { 295 return child_iterator(); 296} 297// UnaryTypeTraitExpr 298Stmt::child_iterator UnaryTypeTraitExpr::child_begin() { 299 return child_iterator(); 300} 301Stmt::child_iterator UnaryTypeTraitExpr::child_end() { 302 return child_iterator(); 303} 304 305// DependentScopeDeclRefExpr 306DependentScopeDeclRefExpr * 307DependentScopeDeclRefExpr::Create(ASTContext &C, 308 NestedNameSpecifier *Qualifier, 309 SourceRange QualifierRange, 310 const DeclarationNameInfo &NameInfo, 311 const TemplateArgumentListInfo *Args) { 312 std::size_t size = sizeof(DependentScopeDeclRefExpr); 313 if (Args) size += ExplicitTemplateArgumentList::sizeFor(*Args); 314 void *Mem = C.Allocate(size); 315 316 DependentScopeDeclRefExpr *DRE 317 = new (Mem) DependentScopeDeclRefExpr(C.DependentTy, 318 Qualifier, QualifierRange, 319 NameInfo, Args != 0); 320 321 if (Args) 322 reinterpret_cast<ExplicitTemplateArgumentList*>(DRE+1) 323 ->initializeFrom(*Args); 324 325 return DRE; 326} 327 328DependentScopeDeclRefExpr * 329DependentScopeDeclRefExpr::CreateEmpty(ASTContext &C, 330 unsigned NumTemplateArgs) { 331 std::size_t size = sizeof(DependentScopeDeclRefExpr); 332 if (NumTemplateArgs) 333 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs); 334 void *Mem = C.Allocate(size); 335 336 return new (Mem) DependentScopeDeclRefExpr(QualType(), 0, SourceRange(), 337 DeclarationNameInfo(), 338 NumTemplateArgs != 0); 339} 340 341StmtIterator DependentScopeDeclRefExpr::child_begin() { 342 return child_iterator(); 343} 344 345StmtIterator DependentScopeDeclRefExpr::child_end() { 346 return child_iterator(); 347} 348 349SourceRange CXXConstructExpr::getSourceRange() const { 350 return ParenRange.isValid() ? 351 SourceRange(Loc, ParenRange.getEnd()) : 352 SourceRange(Loc); 353} 354 355SourceRange CXXOperatorCallExpr::getSourceRange() const { 356 OverloadedOperatorKind Kind = getOperator(); 357 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) { 358 if (getNumArgs() == 1) 359 // Prefix operator 360 return SourceRange(getOperatorLoc(), 361 getArg(0)->getSourceRange().getEnd()); 362 else 363 // Postfix operator 364 return SourceRange(getArg(0)->getSourceRange().getEnd(), 365 getOperatorLoc()); 366 } else if (Kind == OO_Call) { 367 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc()); 368 } else if (Kind == OO_Subscript) { 369 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc()); 370 } else if (getNumArgs() == 1) { 371 return SourceRange(getOperatorLoc(), getArg(0)->getSourceRange().getEnd()); 372 } else if (getNumArgs() == 2) { 373 return SourceRange(getArg(0)->getSourceRange().getBegin(), 374 getArg(1)->getSourceRange().getEnd()); 375 } else { 376 return SourceRange(); 377 } 378} 379 380Expr *CXXMemberCallExpr::getImplicitObjectArgument() { 381 if (MemberExpr *MemExpr = dyn_cast<MemberExpr>(getCallee()->IgnoreParens())) 382 return MemExpr->getBase(); 383 384 // FIXME: Will eventually need to cope with member pointers. 385 return 0; 386} 387 388CXXRecordDecl *CXXMemberCallExpr::getRecordDecl() { 389 Expr* ThisArg = getImplicitObjectArgument(); 390 if (!ThisArg) 391 return 0; 392 393 if (ThisArg->getType()->isAnyPointerType()) 394 return ThisArg->getType()->getPointeeType()->getAsCXXRecordDecl(); 395 396 return ThisArg->getType()->getAsCXXRecordDecl(); 397} 398 399SourceRange CXXMemberCallExpr::getSourceRange() const { 400 SourceLocation LocStart = getCallee()->getLocStart(); 401 if (LocStart.isInvalid() && getNumArgs() > 0) 402 LocStart = getArg(0)->getLocStart(); 403 return SourceRange(LocStart, getRParenLoc()); 404} 405 406 407//===----------------------------------------------------------------------===// 408// Named casts 409//===----------------------------------------------------------------------===// 410 411/// getCastName - Get the name of the C++ cast being used, e.g., 412/// "static_cast", "dynamic_cast", "reinterpret_cast", or 413/// "const_cast". The returned pointer must not be freed. 414const char *CXXNamedCastExpr::getCastName() const { 415 switch (getStmtClass()) { 416 case CXXStaticCastExprClass: return "static_cast"; 417 case CXXDynamicCastExprClass: return "dynamic_cast"; 418 case CXXReinterpretCastExprClass: return "reinterpret_cast"; 419 case CXXConstCastExprClass: return "const_cast"; 420 default: return "<invalid cast>"; 421 } 422} 423 424CXXStaticCastExpr *CXXStaticCastExpr::Create(ASTContext &C, QualType T, 425 CastKind K, Expr *Op, 426 const CXXCastPath *BasePath, 427 TypeSourceInfo *WrittenTy, 428 SourceLocation L) { 429 unsigned PathSize = (BasePath ? BasePath->size() : 0); 430 void *Buffer = C.Allocate(sizeof(CXXStaticCastExpr) 431 + PathSize * sizeof(CXXBaseSpecifier*)); 432 CXXStaticCastExpr *E = 433 new (Buffer) CXXStaticCastExpr(T, K, Op, PathSize, WrittenTy, L); 434 if (PathSize) E->setCastPath(*BasePath); 435 return E; 436} 437 438CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(ASTContext &C, 439 unsigned PathSize) { 440 void *Buffer = 441 C.Allocate(sizeof(CXXStaticCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 442 return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize); 443} 444 445CXXDynamicCastExpr *CXXDynamicCastExpr::Create(ASTContext &C, QualType T, 446 CastKind K, Expr *Op, 447 const CXXCastPath *BasePath, 448 TypeSourceInfo *WrittenTy, 449 SourceLocation L) { 450 unsigned PathSize = (BasePath ? BasePath->size() : 0); 451 void *Buffer = C.Allocate(sizeof(CXXDynamicCastExpr) 452 + PathSize * sizeof(CXXBaseSpecifier*)); 453 CXXDynamicCastExpr *E = 454 new (Buffer) CXXDynamicCastExpr(T, K, Op, PathSize, WrittenTy, L); 455 if (PathSize) E->setCastPath(*BasePath); 456 return E; 457} 458 459CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(ASTContext &C, 460 unsigned PathSize) { 461 void *Buffer = 462 C.Allocate(sizeof(CXXDynamicCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 463 return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize); 464} 465 466CXXReinterpretCastExpr * 467CXXReinterpretCastExpr::Create(ASTContext &C, QualType T, CastKind K, Expr *Op, 468 const CXXCastPath *BasePath, 469 TypeSourceInfo *WrittenTy, SourceLocation L) { 470 unsigned PathSize = (BasePath ? BasePath->size() : 0); 471 void *Buffer = 472 C.Allocate(sizeof(CXXReinterpretCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 473 CXXReinterpretCastExpr *E = 474 new (Buffer) CXXReinterpretCastExpr(T, K, Op, PathSize, WrittenTy, L); 475 if (PathSize) E->setCastPath(*BasePath); 476 return E; 477} 478 479CXXReinterpretCastExpr * 480CXXReinterpretCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) { 481 void *Buffer = C.Allocate(sizeof(CXXReinterpretCastExpr) 482 + PathSize * sizeof(CXXBaseSpecifier*)); 483 return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize); 484} 485 486CXXConstCastExpr *CXXConstCastExpr::Create(ASTContext &C, QualType T, Expr *Op, 487 TypeSourceInfo *WrittenTy, 488 SourceLocation L) { 489 return new (C) CXXConstCastExpr(T, Op, WrittenTy, L); 490} 491 492CXXConstCastExpr *CXXConstCastExpr::CreateEmpty(ASTContext &C) { 493 return new (C) CXXConstCastExpr(EmptyShell()); 494} 495 496CXXFunctionalCastExpr * 497CXXFunctionalCastExpr::Create(ASTContext &C, QualType T, 498 TypeSourceInfo *Written, SourceLocation L, 499 CastKind K, Expr *Op, const CXXCastPath *BasePath, 500 SourceLocation R) { 501 unsigned PathSize = (BasePath ? BasePath->size() : 0); 502 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr) 503 + PathSize * sizeof(CXXBaseSpecifier*)); 504 CXXFunctionalCastExpr *E = 505 new (Buffer) CXXFunctionalCastExpr(T, Written, L, K, Op, PathSize, R); 506 if (PathSize) E->setCastPath(*BasePath); 507 return E; 508} 509 510CXXFunctionalCastExpr * 511CXXFunctionalCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) { 512 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr) 513 + PathSize * sizeof(CXXBaseSpecifier*)); 514 return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize); 515} 516 517 518CXXDefaultArgExpr * 519CXXDefaultArgExpr::Create(ASTContext &C, SourceLocation Loc, 520 ParmVarDecl *Param, Expr *SubExpr) { 521 void *Mem = C.Allocate(sizeof(CXXDefaultArgExpr) + sizeof(Stmt *)); 522 return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param, 523 SubExpr); 524} 525 526CXXTemporary *CXXTemporary::Create(ASTContext &C, 527 const CXXDestructorDecl *Destructor) { 528 return new (C) CXXTemporary(Destructor); 529} 530 531CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C, 532 CXXTemporary *Temp, 533 Expr* SubExpr) { 534 assert(SubExpr->getType()->isRecordType() && 535 "Expression bound to a temporary must have record type!"); 536 537 return new (C) CXXBindTemporaryExpr(Temp, SubExpr); 538} 539 540CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C, 541 CXXConstructorDecl *Cons, 542 TypeSourceInfo *Type, 543 Expr **Args, 544 unsigned NumArgs, 545 SourceRange parenRange, 546 bool ZeroInitialization) 547 : CXXConstructExpr(C, CXXTemporaryObjectExprClass, 548 Type->getType().getNonReferenceType(), 549 Type->getTypeLoc().getBeginLoc(), 550 Cons, false, Args, NumArgs, ZeroInitialization, 551 CXXConstructExpr::CK_Complete, parenRange), 552 Type(Type) { 553} 554 555SourceRange CXXTemporaryObjectExpr::getSourceRange() const { 556 return SourceRange(Type->getTypeLoc().getBeginLoc(), 557 getParenRange().getEnd()); 558} 559 560CXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T, 561 SourceLocation Loc, 562 CXXConstructorDecl *D, bool Elidable, 563 Expr **Args, unsigned NumArgs, 564 bool ZeroInitialization, 565 ConstructionKind ConstructKind, 566 SourceRange ParenRange) { 567 return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D, 568 Elidable, Args, NumArgs, ZeroInitialization, 569 ConstructKind, ParenRange); 570} 571 572CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T, 573 SourceLocation Loc, 574 CXXConstructorDecl *D, bool elidable, 575 Expr **args, unsigned numargs, 576 bool ZeroInitialization, 577 ConstructionKind ConstructKind, 578 SourceRange ParenRange) 579: Expr(SC, T, 580 T->isDependentType(), 581 (T->isDependentType() || 582 CallExpr::hasAnyValueDependentArguments(args, numargs))), 583 Constructor(D), Loc(Loc), ParenRange(ParenRange), Elidable(elidable), 584 ZeroInitialization(ZeroInitialization), ConstructKind(ConstructKind), 585 Args(0), NumArgs(numargs) 586{ 587 if (NumArgs) { 588 Args = new (C) Stmt*[NumArgs]; 589 590 for (unsigned i = 0; i != NumArgs; ++i) { 591 assert(args[i] && "NULL argument in CXXConstructExpr"); 592 Args[i] = args[i]; 593 } 594 } 595} 596 597CXXExprWithTemporaries::CXXExprWithTemporaries(ASTContext &C, 598 Expr *subexpr, 599 CXXTemporary **temps, 600 unsigned numtemps) 601 : Expr(CXXExprWithTemporariesClass, subexpr->getType(), 602 subexpr->isTypeDependent(), subexpr->isValueDependent()), 603 SubExpr(subexpr), Temps(0), NumTemps(0) { 604 if (numtemps) { 605 setNumTemporaries(C, numtemps); 606 for (unsigned i = 0; i != numtemps; ++i) 607 Temps[i] = temps[i]; 608 } 609} 610 611void CXXExprWithTemporaries::setNumTemporaries(ASTContext &C, unsigned N) { 612 assert(Temps == 0 && "Cannot resize with this"); 613 NumTemps = N; 614 Temps = new (C) CXXTemporary*[NumTemps]; 615} 616 617 618CXXExprWithTemporaries *CXXExprWithTemporaries::Create(ASTContext &C, 619 Expr *SubExpr, 620 CXXTemporary **Temps, 621 unsigned NumTemps) { 622 return new (C) CXXExprWithTemporaries(C, SubExpr, Temps, NumTemps); 623} 624 625// CXXBindTemporaryExpr 626Stmt::child_iterator CXXBindTemporaryExpr::child_begin() { 627 return &SubExpr; 628} 629 630Stmt::child_iterator CXXBindTemporaryExpr::child_end() { 631 return &SubExpr + 1; 632} 633 634// CXXConstructExpr 635Stmt::child_iterator CXXConstructExpr::child_begin() { 636 return &Args[0]; 637} 638Stmt::child_iterator CXXConstructExpr::child_end() { 639 return &Args[0]+NumArgs; 640} 641 642// CXXExprWithTemporaries 643Stmt::child_iterator CXXExprWithTemporaries::child_begin() { 644 return &SubExpr; 645} 646 647Stmt::child_iterator CXXExprWithTemporaries::child_end() { 648 return &SubExpr + 1; 649} 650 651CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type, 652 SourceLocation LParenLoc, 653 Expr **Args, 654 unsigned NumArgs, 655 SourceLocation RParenLoc) 656 : Expr(CXXUnresolvedConstructExprClass, 657 Type->getType().getNonReferenceType(), 658 Type->getType()->isDependentType(), true), 659 Type(Type), 660 LParenLoc(LParenLoc), 661 RParenLoc(RParenLoc), 662 NumArgs(NumArgs) { 663 Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1); 664 memcpy(StoredArgs, Args, sizeof(Expr *) * NumArgs); 665} 666 667CXXUnresolvedConstructExpr * 668CXXUnresolvedConstructExpr::Create(ASTContext &C, 669 TypeSourceInfo *Type, 670 SourceLocation LParenLoc, 671 Expr **Args, 672 unsigned NumArgs, 673 SourceLocation RParenLoc) { 674 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) + 675 sizeof(Expr *) * NumArgs); 676 return new (Mem) CXXUnresolvedConstructExpr(Type, LParenLoc, 677 Args, NumArgs, RParenLoc); 678} 679 680CXXUnresolvedConstructExpr * 681CXXUnresolvedConstructExpr::CreateEmpty(ASTContext &C, unsigned NumArgs) { 682 Stmt::EmptyShell Empty; 683 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) + 684 sizeof(Expr *) * NumArgs); 685 return new (Mem) CXXUnresolvedConstructExpr(Empty, NumArgs); 686} 687 688SourceRange CXXUnresolvedConstructExpr::getSourceRange() const { 689 return SourceRange(Type->getTypeLoc().getBeginLoc(), RParenLoc); 690} 691 692Stmt::child_iterator CXXUnresolvedConstructExpr::child_begin() { 693 return child_iterator(reinterpret_cast<Stmt **>(this + 1)); 694} 695 696Stmt::child_iterator CXXUnresolvedConstructExpr::child_end() { 697 return child_iterator(reinterpret_cast<Stmt **>(this + 1) + NumArgs); 698} 699 700CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C, 701 Expr *Base, QualType BaseType, 702 bool IsArrow, 703 SourceLocation OperatorLoc, 704 NestedNameSpecifier *Qualifier, 705 SourceRange QualifierRange, 706 NamedDecl *FirstQualifierFoundInScope, 707 DeclarationNameInfo MemberNameInfo, 708 const TemplateArgumentListInfo *TemplateArgs) 709 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy, true, true), 710 Base(Base), BaseType(BaseType), IsArrow(IsArrow), 711 HasExplicitTemplateArgs(TemplateArgs != 0), 712 OperatorLoc(OperatorLoc), 713 Qualifier(Qualifier), QualifierRange(QualifierRange), 714 FirstQualifierFoundInScope(FirstQualifierFoundInScope), 715 MemberNameInfo(MemberNameInfo) { 716 if (TemplateArgs) 717 getExplicitTemplateArgs().initializeFrom(*TemplateArgs); 718} 719 720CXXDependentScopeMemberExpr * 721CXXDependentScopeMemberExpr::Create(ASTContext &C, 722 Expr *Base, QualType BaseType, bool IsArrow, 723 SourceLocation OperatorLoc, 724 NestedNameSpecifier *Qualifier, 725 SourceRange QualifierRange, 726 NamedDecl *FirstQualifierFoundInScope, 727 DeclarationNameInfo MemberNameInfo, 728 const TemplateArgumentListInfo *TemplateArgs) { 729 if (!TemplateArgs) 730 return new (C) CXXDependentScopeMemberExpr(C, Base, BaseType, 731 IsArrow, OperatorLoc, 732 Qualifier, QualifierRange, 733 FirstQualifierFoundInScope, 734 MemberNameInfo); 735 736 std::size_t size = sizeof(CXXDependentScopeMemberExpr); 737 if (TemplateArgs) 738 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs); 739 740 void *Mem = C.Allocate(size, llvm::alignof<CXXDependentScopeMemberExpr>()); 741 return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType, 742 IsArrow, OperatorLoc, 743 Qualifier, QualifierRange, 744 FirstQualifierFoundInScope, 745 MemberNameInfo, TemplateArgs); 746} 747 748CXXDependentScopeMemberExpr * 749CXXDependentScopeMemberExpr::CreateEmpty(ASTContext &C, 750 unsigned NumTemplateArgs) { 751 if (NumTemplateArgs == 0) 752 return new (C) CXXDependentScopeMemberExpr(C, 0, QualType(), 753 0, SourceLocation(), 0, 754 SourceRange(), 0, 755 DeclarationNameInfo()); 756 757 std::size_t size = sizeof(CXXDependentScopeMemberExpr) + 758 ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs); 759 void *Mem = C.Allocate(size, llvm::alignof<CXXDependentScopeMemberExpr>()); 760 CXXDependentScopeMemberExpr *E 761 = new (Mem) CXXDependentScopeMemberExpr(C, 0, QualType(), 762 0, SourceLocation(), 0, 763 SourceRange(), 0, 764 DeclarationNameInfo(), 0); 765 E->HasExplicitTemplateArgs = true; 766 return E; 767} 768 769Stmt::child_iterator CXXDependentScopeMemberExpr::child_begin() { 770 return child_iterator(&Base); 771} 772 773Stmt::child_iterator CXXDependentScopeMemberExpr::child_end() { 774 if (isImplicitAccess()) 775 return child_iterator(&Base); 776 return child_iterator(&Base + 1); 777} 778 779UnresolvedMemberExpr::UnresolvedMemberExpr(ASTContext &C, QualType T, 780 bool Dependent, 781 bool HasUnresolvedUsing, 782 Expr *Base, QualType BaseType, 783 bool IsArrow, 784 SourceLocation OperatorLoc, 785 NestedNameSpecifier *Qualifier, 786 SourceRange QualifierRange, 787 const DeclarationNameInfo &MemberNameInfo, 788 const TemplateArgumentListInfo *TemplateArgs, 789 UnresolvedSetIterator Begin, 790 UnresolvedSetIterator End) 791 : OverloadExpr(UnresolvedMemberExprClass, C, T, Dependent, 792 Qualifier, QualifierRange, MemberNameInfo, 793 TemplateArgs != 0, Begin, End), 794 IsArrow(IsArrow), HasUnresolvedUsing(HasUnresolvedUsing), 795 Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) { 796 if (TemplateArgs) 797 getExplicitTemplateArgs().initializeFrom(*TemplateArgs); 798} 799 800UnresolvedMemberExpr * 801UnresolvedMemberExpr::Create(ASTContext &C, bool Dependent, 802 bool HasUnresolvedUsing, 803 Expr *Base, QualType BaseType, bool IsArrow, 804 SourceLocation OperatorLoc, 805 NestedNameSpecifier *Qualifier, 806 SourceRange QualifierRange, 807 const DeclarationNameInfo &MemberNameInfo, 808 const TemplateArgumentListInfo *TemplateArgs, 809 UnresolvedSetIterator Begin, 810 UnresolvedSetIterator End) { 811 std::size_t size = sizeof(UnresolvedMemberExpr); 812 if (TemplateArgs) 813 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs); 814 815 void *Mem = C.Allocate(size, llvm::alignof<UnresolvedMemberExpr>()); 816 return new (Mem) UnresolvedMemberExpr(C, 817 Dependent ? C.DependentTy : C.OverloadTy, 818 Dependent, HasUnresolvedUsing, Base, BaseType, 819 IsArrow, OperatorLoc, Qualifier, QualifierRange, 820 MemberNameInfo, TemplateArgs, Begin, End); 821} 822 823UnresolvedMemberExpr * 824UnresolvedMemberExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) { 825 std::size_t size = sizeof(UnresolvedMemberExpr); 826 if (NumTemplateArgs != 0) 827 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs); 828 829 void *Mem = C.Allocate(size, llvm::alignof<UnresolvedMemberExpr>()); 830 UnresolvedMemberExpr *E = new (Mem) UnresolvedMemberExpr(EmptyShell()); 831 E->HasExplicitTemplateArgs = NumTemplateArgs != 0; 832 return E; 833} 834 835CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const { 836 // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this. 837 838 // If there was a nested name specifier, it names the naming class. 839 // It can't be dependent: after all, we were actually able to do the 840 // lookup. 841 CXXRecordDecl *Record = 0; 842 if (getQualifier()) { 843 Type *T = getQualifier()->getAsType(); 844 assert(T && "qualifier in member expression does not name type"); 845 Record = T->getAsCXXRecordDecl(); 846 assert(Record && "qualifier in member expression does not name record"); 847 } 848 // Otherwise the naming class must have been the base class. 849 else { 850 QualType BaseType = getBaseType().getNonReferenceType(); 851 if (isArrow()) { 852 const PointerType *PT = BaseType->getAs<PointerType>(); 853 assert(PT && "base of arrow member access is not pointer"); 854 BaseType = PT->getPointeeType(); 855 } 856 857 Record = BaseType->getAsCXXRecordDecl(); 858 assert(Record && "base of member expression does not name record"); 859 } 860 861 return Record; 862} 863 864Stmt::child_iterator UnresolvedMemberExpr::child_begin() { 865 return child_iterator(&Base); 866} 867 868Stmt::child_iterator UnresolvedMemberExpr::child_end() { 869 if (isImplicitAccess()) 870 return child_iterator(&Base); 871 return child_iterator(&Base + 1); 872} 873 874Stmt::child_iterator CXXNoexceptExpr::child_begin() { 875 return child_iterator(&Operand); 876} 877Stmt::child_iterator CXXNoexceptExpr::child_end() { 878 return child_iterator(&Operand + 1); 879} 880