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