1a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek//===--- ExprCXX.cpp - (C++) Expression AST Node Implementation -----------===// 2a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek// 3a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek// The LLVM Compiler Infrastructure 4a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 7a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek// 8a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek//===----------------------------------------------------------------------===// 9a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek// 10a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek// This file implements the subclesses of Expr class declared in ExprCXX.h 11a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek// 12a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek//===----------------------------------------------------------------------===// 13a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek 14b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#include "clang/Basic/IdentifierTable.h" 15471c8b49982d1132f30b0b0da27fef94fd6e4f67Benjamin Kramer#include "clang/AST/ASTContext.h" 16b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#include "clang/AST/DeclCXX.h" 17edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor#include "clang/AST/DeclTemplate.h" 18a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek#include "clang/AST/ExprCXX.h" 1926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor#include "clang/AST/TypeLoc.h" 20a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenekusing namespace clang; 21a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek 2257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor 23a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek//===----------------------------------------------------------------------===// 24a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek// Child Iterators for iterating over subexpressions/substatements 25a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek//===----------------------------------------------------------------------===// 26a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek 270d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smithbool CXXTypeidExpr::isPotentiallyEvaluated() const { 280d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith if (isTypeOperand()) 290d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith return false; 300d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith 310d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith // C++11 [expr.typeid]p3: 320d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith // When typeid is applied to an expression other than a glvalue of 330d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith // polymorphic class type, [...] the expression is an unevaluated operand. 340d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith const Expr *E = getExprOperand(); 350d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith if (const CXXRecordDecl *RD = E->getType()->getAsCXXRecordDecl()) 360d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith if (RD->isPolymorphic() && E->isGLValue()) 370d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith return true; 380d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith 390d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith return false; 400d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith} 410d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith 4257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas GregorQualType CXXTypeidExpr::getTypeOperand() const { 4357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)"); 4457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor return Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType() 4557fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor .getUnqualifiedType(); 4657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor} 4757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor 4801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois PichetQualType CXXUuidofExpr::getTypeOperand() const { 4901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)"); 5001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType() 5101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet .getUnqualifiedType(); 5201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet} 5301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 54ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor// CXXScalarValueInitExpr 55ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas GregorSourceRange CXXScalarValueInitExpr::getSourceRange() const { 56ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation Start = RParenLoc; 57ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (TypeInfo) 58ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor Start = TypeInfo->getTypeLoc().getBeginLoc(); 59ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return SourceRange(Start, RParenLoc); 60ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor} 61ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor 624c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl// CXXNewExpr 63ad7fe864862305c2f71e047cdf6706ef43aebdc0Ted KremenekCXXNewExpr::CXXNewExpr(ASTContext &C, bool globalNew, FunctionDecl *operatorNew, 641548d14f4092a817f7d90ad3e7a65266dc85fbc5Sebastian Redl FunctionDecl *operatorDelete, 652aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl bool usualArrayDeleteWantsSize, 663b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr*> placementArgs, 672aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl SourceRange typeIdParens, Expr *arraySize, 682aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl InitializationStyle initializationStyle, 692aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl Expr *initializer, QualType ty, 702aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl TypeSourceInfo *allocatedTypeInfo, 712aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl SourceLocation startLoc, SourceRange directInitRange) 72f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(CXXNewExprClass, ty, VK_RValue, OK_Ordinary, 73bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ty->isDependentType(), ty->isDependentType(), 74561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor ty->isInstantiationDependentType(), 75bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ty->containsUnexpandedParameterPack()), 762aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl SubExprs(0), OperatorNew(operatorNew), OperatorDelete(operatorDelete), 772aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl AllocatedTypeInfo(allocatedTypeInfo), TypeIdParens(typeIdParens), 78d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer StartLoc(startLoc), DirectInitRange(directInitRange), 79d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer GlobalNew(globalNew), UsualArrayDeleteWantsSize(usualArrayDeleteWantsSize) { 802aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl assert((initializer != 0 || initializationStyle == NoInit) && 812aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl "Only NoInit can have no initializer."); 822aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl StoredInitializationStyle = initializer ? initializationStyle + 1 : 0; 833b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer AllocateArgsArray(C, arraySize != 0, placementArgs.size(), initializer != 0); 844c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl unsigned i = 0; 85bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (Array) { 86561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor if (arraySize->isInstantiationDependent()) 87561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor ExprBits.InstantiationDependent = true; 88561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor 89bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (arraySize->containsUnexpandedParameterPack()) 90bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = true; 91bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 92cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl SubExprs[i++] = arraySize; 93bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 94bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 952aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl if (initializer) { 962aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl if (initializer->isInstantiationDependent()) 97561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor ExprBits.InstantiationDependent = true; 982aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl 992aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl if (initializer->containsUnexpandedParameterPack()) 100bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = true; 101bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 1022aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl SubExprs[i++] = initializer; 103bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 104bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 1053b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer for (unsigned j = 0; j != placementArgs.size(); ++j) { 1062aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl if (placementArgs[j]->isInstantiationDependent()) 107561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor ExprBits.InstantiationDependent = true; 1082aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl if (placementArgs[j]->containsUnexpandedParameterPack()) 109bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = true; 110bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 1112aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl SubExprs[i++] = placementArgs[j]; 112bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 1134c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl} 1144c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 1155921863d8f24084797863b5df37842113bac4352Chris Lattnervoid CXXNewExpr::AllocateArgsArray(ASTContext &C, bool isArray, 1162aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl unsigned numPlaceArgs, bool hasInitializer){ 1175921863d8f24084797863b5df37842113bac4352Chris Lattner assert(SubExprs == 0 && "SubExprs already allocated"); 1185921863d8f24084797863b5df37842113bac4352Chris Lattner Array = isArray; 1195921863d8f24084797863b5df37842113bac4352Chris Lattner NumPlacementArgs = numPlaceArgs; 1202aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl 1212aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl unsigned TotalSize = Array + hasInitializer + NumPlacementArgs; 1225921863d8f24084797863b5df37842113bac4352Chris Lattner SubExprs = new (C) Stmt*[TotalSize]; 1235921863d8f24084797863b5df37842113bac4352Chris Lattner} 1245921863d8f24084797863b5df37842113bac4352Chris Lattner 1258026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redlbool CXXNewExpr::shouldNullCheckAllocation(ASTContext &Ctx) const { 126c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall return getOperatorNew()->getType()-> 1278026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl castAs<FunctionProtoType>()->isNothrow(Ctx); 128c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall} 1295921863d8f24084797863b5df37842113bac4352Chris Lattner 1302aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian RedlSourceLocation CXXNewExpr::getEndLoc() const { 1312aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl switch (getInitializationStyle()) { 1322aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl case NoInit: 1332aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return AllocatedTypeInfo->getTypeLoc().getEndLoc(); 1342aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl case CallInit: 1352aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return DirectInitRange.getEnd(); 1362aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl case ListInit: 1372aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return getInitializer()->getSourceRange().getEnd(); 1382aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl } 139ebc6af1279178e1d5f4dcd9f1bbf0f06d89e3a53Matt Beaumont-Gay llvm_unreachable("bogus initialization style"); 1402aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl} 1412aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl 1424c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl// CXXDeleteExpr 1435833b0b831d6afae2885e6af420e2bda639652e6Douglas GregorQualType CXXDeleteExpr::getDestroyedType() const { 1445833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor const Expr *Arg = getArgument(); 1450fa0b78c82b864be1f956ca4af9564db7c8bb5b6Craig Silverstein // The type-to-delete may not be a pointer if it's a dependent type. 146c87fa06caeaec2d6cb9772a187708a8bf6cf187cCraig Silverstein const QualType ArgType = Arg->getType(); 147a437ad3ec5b407ede394d74e6f9f463fa3657dbeCraig Silverstein 148a437ad3ec5b407ede394d74e6f9f463fa3657dbeCraig Silverstein if (ArgType->isDependentType() && !ArgType->isPointerType()) 149a437ad3ec5b407ede394d74e6f9f463fa3657dbeCraig Silverstein return QualType(); 1505833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor 1510fa0b78c82b864be1f956ca4af9564db7c8bb5b6Craig Silverstein return ArgType->getAs<PointerType>()->getPointeeType(); 1525833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor} 1535833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor 154a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor// CXXPseudoDestructorExpr 155a2e7dd2f4a50d835351153aee568d35ccc986310Douglas GregorPseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info) 156a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor : Type(Info) 157a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor{ 158bd054dba8a3023821f2a0951b0fae05e3522a7c9Abramo Bagnara Location = Info->getTypeLoc().getLocalSourceRange().getBegin(); 159a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor} 160a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor 161e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCallCXXPseudoDestructorExpr::CXXPseudoDestructorExpr(ASTContext &Context, 162f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor Expr *Base, bool isArrow, SourceLocation OperatorLoc, 163f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor NestedNameSpecifierLoc QualifierLoc, TypeSourceInfo *ScopeType, 164f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor SourceLocation ColonColonLoc, SourceLocation TildeLoc, 165f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor PseudoDestructorTypeStorage DestroyedType) 166e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall : Expr(CXXPseudoDestructorExprClass, 167e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall Context.getPointerType(Context.getFunctionType(Context.VoidTy, 0, 0, 168e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo())), 169e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall VK_RValue, OK_Ordinary, 170e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall /*isTypeDependent=*/(Base->isTypeDependent() || 171e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall (DestroyedType.getTypeSourceInfo() && 172e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall DestroyedType.getTypeSourceInfo()->getType()->isDependentType())), 173bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor /*isValueDependent=*/Base->isValueDependent(), 174561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor (Base->isInstantiationDependent() || 175561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor (QualifierLoc && 176561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent()) || 177561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor (ScopeType && 178561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor ScopeType->getType()->isInstantiationDependentType()) || 179561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor (DestroyedType.getTypeSourceInfo() && 180561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor DestroyedType.getTypeSourceInfo()->getType() 181561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor ->isInstantiationDependentType())), 182bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor // ContainsUnexpandedParameterPack 183bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor (Base->containsUnexpandedParameterPack() || 184f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor (QualifierLoc && 185f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor QualifierLoc.getNestedNameSpecifier() 186f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor ->containsUnexpandedParameterPack()) || 187bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor (ScopeType && 188bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ScopeType->getType()->containsUnexpandedParameterPack()) || 189bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor (DestroyedType.getTypeSourceInfo() && 190bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor DestroyedType.getTypeSourceInfo()->getType() 191bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ->containsUnexpandedParameterPack()))), 192e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall Base(static_cast<Stmt *>(Base)), IsArrow(isArrow), 193f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor OperatorLoc(OperatorLoc), QualifierLoc(QualifierLoc), 194e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall ScopeType(ScopeType), ColonColonLoc(ColonColonLoc), TildeLoc(TildeLoc), 195e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall DestroyedType(DestroyedType) { } 196e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 197a2e7dd2f4a50d835351153aee568d35ccc986310Douglas GregorQualType CXXPseudoDestructorExpr::getDestroyedType() const { 198a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo()) 199a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor return TInfo->getType(); 200a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor 201a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor return QualType(); 202a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor} 203a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor 20426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas GregorSourceRange CXXPseudoDestructorExpr::getSourceRange() const { 205a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor SourceLocation End = DestroyedType.getLocation(); 206a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo()) 207bd054dba8a3023821f2a0951b0fae05e3522a7c9Abramo Bagnara End = TInfo->getTypeLoc().getLocalSourceRange().getEnd(); 208a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor return SourceRange(Base->getLocStart(), End); 20926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor} 21026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 211ba13543329afac4a0d01304ec2ec4924d99306a6John McCall// UnresolvedLookupExpr 212f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCallUnresolvedLookupExpr * 213bebbe0d9b7568ce43a464286bee49429489ef483Douglas GregorUnresolvedLookupExpr::Create(ASTContext &C, 214c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall CXXRecordDecl *NamingClass, 2154c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 216e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 2172577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 2182577743c5650c646fb705df01403707e94f2df04Abramo Bagnara bool ADL, 2199d9922af13edf3ddf8804a41a98d997324fdd58eAbramo Bagnara const TemplateArgumentListInfo *Args, 2209d9922af13edf3ddf8804a41a98d997324fdd58eAbramo Bagnara UnresolvedSetIterator Begin, 2219d9922af13edf3ddf8804a41a98d997324fdd58eAbramo Bagnara UnresolvedSetIterator End) 222f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall{ 2239d9922af13edf3ddf8804a41a98d997324fdd58eAbramo Bagnara assert(Args || TemplateKWLoc.isValid()); 2249d9922af13edf3ddf8804a41a98d997324fdd58eAbramo Bagnara unsigned num_args = Args ? Args->size() : 0; 225e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara void *Mem = C.Allocate(sizeof(UnresolvedLookupExpr) + 2269d9922af13edf3ddf8804a41a98d997324fdd58eAbramo Bagnara ASTTemplateKWAndArgsInfo::sizeFor(num_args)); 227e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return new (Mem) UnresolvedLookupExpr(C, NamingClass, QualifierLoc, 228e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara TemplateKWLoc, NameInfo, 2299d9922af13edf3ddf8804a41a98d997324fdd58eAbramo Bagnara ADL, /*Overload*/ true, Args, 230ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith Begin, End, /*StdIsAssociated=*/false); 231f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall} 232f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 233bd65bb511c26549c96b829c1282e4c877588564aArgyrios KyrtzidisUnresolvedLookupExpr * 234e4b92761b43ced611c417ae478568610f1ad7b1eAbramo BagnaraUnresolvedLookupExpr::CreateEmpty(ASTContext &C, 235e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool HasTemplateKWAndArgsInfo, 236def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor unsigned NumTemplateArgs) { 237bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis std::size_t size = sizeof(UnresolvedLookupExpr); 238e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (HasTemplateKWAndArgsInfo) 239e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara size += ASTTemplateKWAndArgsInfo::sizeFor(NumTemplateArgs); 240bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis 2413248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedLookupExpr>()); 242bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis UnresolvedLookupExpr *E = new (Mem) UnresolvedLookupExpr(EmptyShell()); 243e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara E->HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo; 244bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis return E; 245bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis} 246bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis 247bebbe0d9b7568ce43a464286bee49429489ef483Douglas GregorOverloadExpr::OverloadExpr(StmtClass K, ASTContext &C, 2484c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 249e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 2502577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 251bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor const TemplateArgumentListInfo *TemplateArgs, 252928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor UnresolvedSetIterator Begin, 253bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor UnresolvedSetIterator End, 254bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor bool KnownDependent, 255561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor bool KnownInstantiationDependent, 256bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor bool KnownContainsUnexpandedParameterPack) 257bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(K, C.OverloadTy, VK_LValue, OK_Ordinary, KnownDependent, 258bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor KnownDependent, 259561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor (KnownInstantiationDependent || 260561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor NameInfo.isInstantiationDependent() || 261561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor (QualifierLoc && 262561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent())), 263bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor (KnownContainsUnexpandedParameterPack || 264bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor NameInfo.containsUnexpandedParameterPack() || 2654c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor (QualifierLoc && 2664c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor QualifierLoc.getNestedNameSpecifier() 2674c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor ->containsUnexpandedParameterPack()))), 268d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer NameInfo(NameInfo), QualifierLoc(QualifierLoc), 269d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer Results(0), NumResults(End - Begin), 270e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara HasTemplateKWAndArgsInfo(TemplateArgs != 0 || TemplateKWLoc.isValid()) 271928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor{ 272a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis NumResults = End - Begin; 273928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor if (NumResults) { 274bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor // Determine whether this expression is type-dependent. 275bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I) { 276bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if ((*I)->getDeclContext()->isDependentContext() || 277bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor isa<UnresolvedUsingValueDecl>(*I)) { 278bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.TypeDependent = true; 279bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ValueDependent = true; 2807657fd7d34426e7df6e84aa6e3d73be532a75f78Richard Smith ExprBits.InstantiationDependent = true; 281bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 282bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 283bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 284928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor Results = static_cast<DeclAccessPair *>( 285928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor C.Allocate(sizeof(DeclAccessPair) * NumResults, 2863248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner llvm::alignOf<DeclAccessPair>())); 287928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor memcpy(Results, &*Begin.getIterator(), 288a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis NumResults * sizeof(DeclAccessPair)); 289928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor } 290a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis 291bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor // If we have explicit template arguments, check for dependent 292bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor // template arguments and whether they contain any unexpanded pack 293bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor // expansions. 294bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (TemplateArgs) { 295bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor bool Dependent = false; 296561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor bool InstantiationDependent = false; 297bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor bool ContainsUnexpandedParameterPack = false; 298e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc, *TemplateArgs, 299e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara Dependent, 300e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara InstantiationDependent, 301e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara ContainsUnexpandedParameterPack); 302bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 303bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (Dependent) { 304561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor ExprBits.TypeDependent = true; 305561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor ExprBits.ValueDependent = true; 306561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor } 307561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor if (InstantiationDependent) 308561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor ExprBits.InstantiationDependent = true; 309bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (ContainsUnexpandedParameterPack) 310bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = true; 311e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } else if (TemplateKWLoc.isValid()) { 312e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc); 313bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 314f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 315bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (isTypeDependent()) 316bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor setType(C.DependentTy); 317bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor} 318f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 319bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregorvoid OverloadExpr::initializeResults(ASTContext &C, 320bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor UnresolvedSetIterator Begin, 321bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor UnresolvedSetIterator End) { 322bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor assert(Results == 0 && "Results already initialized!"); 323bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor NumResults = End - Begin; 324bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (NumResults) { 325bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Results = static_cast<DeclAccessPair *>( 326bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor C.Allocate(sizeof(DeclAccessPair) * NumResults, 327bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 328bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor llvm::alignOf<DeclAccessPair>())); 329bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor memcpy(Results, &*Begin.getIterator(), 330bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor NumResults * sizeof(DeclAccessPair)); 331bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 332f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall} 333f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 334e9ee23edd17c4bb7f271e67f8790792b4de677fcJohn McCallCXXRecordDecl *OverloadExpr::getNamingClass() const { 335e9ee23edd17c4bb7f271e67f8790792b4de677fcJohn McCall if (isa<UnresolvedLookupExpr>(this)) 336e9ee23edd17c4bb7f271e67f8790792b4de677fcJohn McCall return cast<UnresolvedLookupExpr>(this)->getNamingClass(); 337e9ee23edd17c4bb7f271e67f8790792b4de677fcJohn McCall else 338e9ee23edd17c4bb7f271e67f8790792b4de677fcJohn McCall return cast<UnresolvedMemberExpr>(this)->getNamingClass(); 339e9ee23edd17c4bb7f271e67f8790792b4de677fcJohn McCall} 340e9ee23edd17c4bb7f271e67f8790792b4de677fcJohn McCall 341865d447ac6a4721ab58e898d014a21f2eff74b06John McCall// DependentScopeDeclRefExpr 342bebbe0d9b7568ce43a464286bee49429489ef483Douglas GregorDependentScopeDeclRefExpr::DependentScopeDeclRefExpr(QualType T, 34300cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor NestedNameSpecifierLoc QualifierLoc, 344e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 345bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor const DeclarationNameInfo &NameInfo, 346bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor const TemplateArgumentListInfo *Args) 347bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(DependentScopeDeclRefExprClass, T, VK_LValue, OK_Ordinary, 348bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor true, true, 349561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor (NameInfo.isInstantiationDependent() || 350561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor (QualifierLoc && 351561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent())), 352bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor (NameInfo.containsUnexpandedParameterPack() || 35300cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor (QualifierLoc && 35400cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor QualifierLoc.getNestedNameSpecifier() 35500cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor ->containsUnexpandedParameterPack()))), 35600cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor QualifierLoc(QualifierLoc), NameInfo(NameInfo), 357e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara HasTemplateKWAndArgsInfo(Args != 0 || TemplateKWLoc.isValid()) 358bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor{ 359bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (Args) { 360bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor bool Dependent = true; 361561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor bool InstantiationDependent = true; 362bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor bool ContainsUnexpandedParameterPack 363bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor = ExprBits.ContainsUnexpandedParameterPack; 364e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc, *Args, 365e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara Dependent, 366e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara InstantiationDependent, 367e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara ContainsUnexpandedParameterPack); 368bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack; 369e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } else if (TemplateKWLoc.isValid()) { 370e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc); 371bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 372bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor} 373bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 374f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCallDependentScopeDeclRefExpr * 375f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCallDependentScopeDeclRefExpr::Create(ASTContext &C, 37600cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor NestedNameSpecifierLoc QualifierLoc, 377e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 3782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 379f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall const TemplateArgumentListInfo *Args) { 380f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall std::size_t size = sizeof(DependentScopeDeclRefExpr); 381f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (Args) 382e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara size += ASTTemplateKWAndArgsInfo::sizeFor(Args->size()); 383e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara else if (TemplateKWLoc.isValid()) 384e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara size += ASTTemplateKWAndArgsInfo::sizeFor(0); 385bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor void *Mem = C.Allocate(size); 386e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return new (Mem) DependentScopeDeclRefExpr(C.DependentTy, QualifierLoc, 387e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara TemplateKWLoc, NameInfo, Args); 388f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall} 389f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 39012dffcddb60380c5bed4f085a1f51534afda3b87Argyrios KyrtzidisDependentScopeDeclRefExpr * 39112dffcddb60380c5bed4f085a1f51534afda3b87Argyrios KyrtzidisDependentScopeDeclRefExpr::CreateEmpty(ASTContext &C, 392e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool HasTemplateKWAndArgsInfo, 39312dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis unsigned NumTemplateArgs) { 39412dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis std::size_t size = sizeof(DependentScopeDeclRefExpr); 395e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (HasTemplateKWAndArgsInfo) 396e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara size += ASTTemplateKWAndArgsInfo::sizeFor(NumTemplateArgs); 39712dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis void *Mem = C.Allocate(size); 398e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara DependentScopeDeclRefExpr *E 39900cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor = new (Mem) DependentScopeDeclRefExpr(QualType(), NestedNameSpecifierLoc(), 400e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation(), 401def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor DeclarationNameInfo(), 0); 402e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara E->HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo; 403def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor return E; 40412dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis} 40512dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis 406428edafa9eb80e01dd40aab31d4166a787a741e1Chandler CarruthSourceRange CXXConstructExpr::getSourceRange() const { 4072882eca5a184c78f793188083f6ce539740a5cf2John McCall if (isa<CXXTemporaryObjectExpr>(this)) 4082882eca5a184c78f793188083f6ce539740a5cf2John McCall return cast<CXXTemporaryObjectExpr>(this)->getSourceRange(); 4092882eca5a184c78f793188083f6ce539740a5cf2John McCall 41040749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor if (ParenRange.isValid()) 41140749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor return SourceRange(Loc, ParenRange.getEnd()); 41240749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor 41340749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor SourceLocation End = Loc; 41440749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor for (unsigned I = getNumArgs(); I > 0; --I) { 41540749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor const Expr *Arg = getArg(I-1); 41640749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor if (!Arg->isDefaultArgument()) { 41740749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor SourceLocation NewEnd = Arg->getLocEnd(); 41840749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor if (NewEnd.isValid()) { 41940749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor End = NewEnd; 42040749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor break; 42140749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor } 42240749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor } 42340749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor } 42440749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor 42540749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor return SourceRange(Loc, End); 426e383768f7f5d45ca4af0b1c11cbf072de18bce98Ted Kremenek} 427e383768f7f5d45ca4af0b1c11cbf072de18bce98Ted Kremenek 4284548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios KyrtzidisSourceRange CXXOperatorCallExpr::getSourceRangeImpl() const { 429b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OverloadedOperatorKind Kind = getOperator(); 430b4609806e9232593ece09ce08b630836e825865cDouglas Gregor if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) { 431b4609806e9232593ece09ce08b630836e825865cDouglas Gregor if (getNumArgs() == 1) 432b4609806e9232593ece09ce08b630836e825865cDouglas Gregor // Prefix operator 4333539b0c5a38ab61fac136724512309333d91ee48Argyrios Kyrtzidis return SourceRange(getOperatorLoc(), getArg(0)->getLocEnd()); 434b4609806e9232593ece09ce08b630836e825865cDouglas Gregor else 435b4609806e9232593ece09ce08b630836e825865cDouglas Gregor // Postfix operator 4363539b0c5a38ab61fac136724512309333d91ee48Argyrios Kyrtzidis return SourceRange(getArg(0)->getLocStart(), getOperatorLoc()); 437d7650610b39947ad8ea8273e7e5099894f71bb08Chandler Carruth } else if (Kind == OO_Arrow) { 438d7650610b39947ad8ea8273e7e5099894f71bb08Chandler Carruth return getArg(0)->getSourceRange(); 439b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (Kind == OO_Call) { 4403539b0c5a38ab61fac136724512309333d91ee48Argyrios Kyrtzidis return SourceRange(getArg(0)->getLocStart(), getRParenLoc()); 441b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (Kind == OO_Subscript) { 4423539b0c5a38ab61fac136724512309333d91ee48Argyrios Kyrtzidis return SourceRange(getArg(0)->getLocStart(), getRParenLoc()); 443b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (getNumArgs() == 1) { 4443539b0c5a38ab61fac136724512309333d91ee48Argyrios Kyrtzidis return SourceRange(getOperatorLoc(), getArg(0)->getLocEnd()); 445b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (getNumArgs() == 2) { 4463539b0c5a38ab61fac136724512309333d91ee48Argyrios Kyrtzidis return SourceRange(getArg(0)->getLocStart(), getArg(1)->getLocEnd()); 447b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else { 4484548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios Kyrtzidis return getOperatorLoc(); 449b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } 450b4609806e9232593ece09ce08b630836e825865cDouglas Gregor} 451b4609806e9232593ece09ce08b630836e825865cDouglas Gregor 452b277159055933e610bbc80262b600d3ad7e0595cTed KremenekExpr *CXXMemberCallExpr::getImplicitObjectArgument() const { 45351e87c5fa1d506058ed594b4290b06775ec74a8eJordan Rose const Expr *Callee = getCallee()->IgnoreParens(); 45451e87c5fa1d506058ed594b4290b06775ec74a8eJordan Rose if (const MemberExpr *MemExpr = dyn_cast<MemberExpr>(Callee)) 45588a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor return MemExpr->getBase(); 45651e87c5fa1d506058ed594b4290b06775ec74a8eJordan Rose if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(Callee)) 45751e87c5fa1d506058ed594b4290b06775ec74a8eJordan Rose if (BO->getOpcode() == BO_PtrMemD || BO->getOpcode() == BO_PtrMemI) 45851e87c5fa1d506058ed594b4290b06775ec74a8eJordan Rose return BO->getLHS(); 45988a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor 46088a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor // FIXME: Will eventually need to cope with member pointers. 46188a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor return 0; 46288a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor} 46388a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor 464b277159055933e610bbc80262b600d3ad7e0595cTed KremenekCXXMethodDecl *CXXMemberCallExpr::getMethodDecl() const { 465b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek if (const MemberExpr *MemExpr = 466b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek dyn_cast<MemberExpr>(getCallee()->IgnoreParens())) 467b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek return cast<CXXMethodDecl>(MemExpr->getMemberDecl()); 468b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek 469b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek // FIXME: Will eventually need to cope with member pointers. 470b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek return 0; 471b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek} 472b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek 473b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek 4740cf3c0eecbff007cea2750c113894b47d9e09f33David BlaikieCXXRecordDecl *CXXMemberCallExpr::getRecordDecl() const { 475007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth Expr* ThisArg = getImplicitObjectArgument(); 476007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth if (!ThisArg) 477007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth return 0; 478007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth 479007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth if (ThisArg->getType()->isAnyPointerType()) 480007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth return ThisArg->getType()->getPointeeType()->getAsCXXRecordDecl(); 481007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth 482007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth return ThisArg->getType()->getAsCXXRecordDecl(); 483007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth} 484007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth 48500b98c229ef28a5e82943bb23d09fb46d24ca381Douglas Gregor 48649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor//===----------------------------------------------------------------------===// 48749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor// Named casts 48849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor//===----------------------------------------------------------------------===// 48949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 49049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// getCastName - Get the name of the C++ cast being used, e.g., 49149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// "static_cast", "dynamic_cast", "reinterpret_cast", or 49249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// "const_cast". The returned pointer must not be freed. 49349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorconst char *CXXNamedCastExpr::getCastName() const { 49449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor switch (getStmtClass()) { 49549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor case CXXStaticCastExprClass: return "static_cast"; 49649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor case CXXDynamicCastExprClass: return "dynamic_cast"; 49749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor case CXXReinterpretCastExprClass: return "reinterpret_cast"; 49849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor case CXXConstCastExprClass: return "const_cast"; 49949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor default: return "<invalid cast>"; 50049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor } 50149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 502506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor 503f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXStaticCastExpr *CXXStaticCastExpr::Create(ASTContext &C, QualType T, 504f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, 505f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CastKind K, Expr *Op, 506f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall const CXXCastPath *BasePath, 507f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall TypeSourceInfo *WrittenTy, 5081d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor SourceLocation L, 5091d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor SourceLocation RParenLoc) { 510f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned PathSize = (BasePath ? BasePath->size() : 0); 511f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall void *Buffer = C.Allocate(sizeof(CXXStaticCastExpr) 512f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall + PathSize * sizeof(CXXBaseSpecifier*)); 513f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXStaticCastExpr *E = 5141d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor new (Buffer) CXXStaticCastExpr(T, VK, K, Op, PathSize, WrittenTy, L, 5151d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor RParenLoc); 516f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall if (PathSize) E->setCastPath(*BasePath); 517f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return E; 518f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall} 519f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 520f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(ASTContext &C, 521f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned PathSize) { 522f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall void *Buffer = 523f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall C.Allocate(sizeof(CXXStaticCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 524f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize); 525f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall} 526f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 527f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXDynamicCastExpr *CXXDynamicCastExpr::Create(ASTContext &C, QualType T, 528f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, 529f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CastKind K, Expr *Op, 530f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall const CXXCastPath *BasePath, 531f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall TypeSourceInfo *WrittenTy, 5321d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor SourceLocation L, 5331d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor SourceLocation RParenLoc) { 534f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned PathSize = (BasePath ? BasePath->size() : 0); 535f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall void *Buffer = C.Allocate(sizeof(CXXDynamicCastExpr) 536f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall + PathSize * sizeof(CXXBaseSpecifier*)); 537f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXDynamicCastExpr *E = 5381d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor new (Buffer) CXXDynamicCastExpr(T, VK, K, Op, PathSize, WrittenTy, L, 5391d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor RParenLoc); 540f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall if (PathSize) E->setCastPath(*BasePath); 541f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return E; 542f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall} 543f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 544f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(ASTContext &C, 545f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned PathSize) { 546f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall void *Buffer = 547f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall C.Allocate(sizeof(CXXDynamicCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 548f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize); 549f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall} 550f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 5510fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson/// isAlwaysNull - Return whether the result of the dynamic_cast is proven 5520fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson/// to always be null. For example: 5530fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson/// 5540fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson/// struct A { }; 5550fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson/// struct B final : A { }; 5560fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson/// struct C { }; 5570fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson/// 5580fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson/// C *f(B* b) { return dynamic_cast<C*>(b); } 5590fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlssonbool CXXDynamicCastExpr::isAlwaysNull() const 5600fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson{ 5610fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson QualType SrcType = getSubExpr()->getType(); 5620fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson QualType DestType = getType(); 5630fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson 5640fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson if (const PointerType *SrcPTy = SrcType->getAs<PointerType>()) { 5650fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson SrcType = SrcPTy->getPointeeType(); 5660fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson DestType = DestType->castAs<PointerType>()->getPointeeType(); 5670fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson } 5680fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson 5695ca8639f97663255880f0da81f1026a06a14d003Sean Hunt if (DestType->isVoidType()) 5705ca8639f97663255880f0da81f1026a06a14d003Sean Hunt return false; 5715ca8639f97663255880f0da81f1026a06a14d003Sean Hunt 5720fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson const CXXRecordDecl *SrcRD = 5730fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson cast<CXXRecordDecl>(SrcType->castAs<RecordType>()->getDecl()); 5740fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson 5753532936f4f50c15fcec4d00f4cbb81a7a9dd9b7eJakob Stoklund Olesen if (!SrcRD->hasAttr<FinalAttr>()) 5763532936f4f50c15fcec4d00f4cbb81a7a9dd9b7eJakob Stoklund Olesen return false; 5773532936f4f50c15fcec4d00f4cbb81a7a9dd9b7eJakob Stoklund Olesen 5780fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson const CXXRecordDecl *DestRD = 5790fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson cast<CXXRecordDecl>(DestType->castAs<RecordType>()->getDecl()); 5800fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson 5810fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson return !DestRD->isDerivedFrom(SrcRD); 5820fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson} 5830fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson 584f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXReinterpretCastExpr * 585f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCallCXXReinterpretCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK, 586f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CastKind K, Expr *Op, 587f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall const CXXCastPath *BasePath, 5881d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor TypeSourceInfo *WrittenTy, SourceLocation L, 5891d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor SourceLocation RParenLoc) { 590f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned PathSize = (BasePath ? BasePath->size() : 0); 591f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall void *Buffer = 592f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall C.Allocate(sizeof(CXXReinterpretCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 593f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXReinterpretCastExpr *E = 5941d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor new (Buffer) CXXReinterpretCastExpr(T, VK, K, Op, PathSize, WrittenTy, L, 5951d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor RParenLoc); 596f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall if (PathSize) E->setCastPath(*BasePath); 597f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return E; 598f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall} 599f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 600f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXReinterpretCastExpr * 601f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXReinterpretCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) { 602f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall void *Buffer = C.Allocate(sizeof(CXXReinterpretCastExpr) 603f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall + PathSize * sizeof(CXXBaseSpecifier*)); 604f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize); 605f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall} 606f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 607f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCallCXXConstCastExpr *CXXConstCastExpr::Create(ASTContext &C, QualType T, 608f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, Expr *Op, 609f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall TypeSourceInfo *WrittenTy, 6101d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor SourceLocation L, 6111d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor SourceLocation RParenLoc) { 6121d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor return new (C) CXXConstCastExpr(T, VK, Op, WrittenTy, L, RParenLoc); 613f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall} 614f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 615f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXConstCastExpr *CXXConstCastExpr::CreateEmpty(ASTContext &C) { 616f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return new (C) CXXConstCastExpr(EmptyShell()); 617f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall} 618f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 619f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXFunctionalCastExpr * 620f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCallCXXFunctionalCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK, 621f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall TypeSourceInfo *Written, SourceLocation L, 622f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CastKind K, Expr *Op, const CXXCastPath *BasePath, 623f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall SourceLocation R) { 624f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned PathSize = (BasePath ? BasePath->size() : 0); 625f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr) 626f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall + PathSize * sizeof(CXXBaseSpecifier*)); 627f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXFunctionalCastExpr *E = 628f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall new (Buffer) CXXFunctionalCastExpr(T, VK, Written, L, K, Op, PathSize, R); 629f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall if (PathSize) E->setCastPath(*BasePath); 630f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return E; 631f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall} 632f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 633f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXFunctionalCastExpr * 634f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXFunctionalCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) { 635f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr) 636f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall + PathSize * sizeof(CXXBaseSpecifier*)); 637f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize); 638f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall} 639f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 6409fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard SmithUserDefinedLiteral::LiteralOperatorKind 6419fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard SmithUserDefinedLiteral::getLiteralOperatorKind() const { 6429fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith if (getNumArgs() == 0) 6439fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith return LOK_Template; 6449fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith if (getNumArgs() == 2) 6459fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith return LOK_String; 6469fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 6479fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith assert(getNumArgs() == 1 && "unexpected #args in literal operator call"); 6489fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith QualType ParamTy = 6499fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith cast<FunctionDecl>(getCalleeDecl())->getParamDecl(0)->getType(); 6509fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith if (ParamTy->isPointerType()) 6519fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith return LOK_Raw; 6529fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith if (ParamTy->isAnyCharacterType()) 6539fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith return LOK_Character; 6549fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith if (ParamTy->isIntegerType()) 6559fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith return LOK_Integer; 6569fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith if (ParamTy->isFloatingType()) 6579fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith return LOK_Floating; 6589fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 6599fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith llvm_unreachable("unknown kind of literal operator"); 6609fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith} 6619fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 6629fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard SmithExpr *UserDefinedLiteral::getCookedLiteral() { 6639fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith#ifndef NDEBUG 6649fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith LiteralOperatorKind LOK = getLiteralOperatorKind(); 6659fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith assert(LOK != LOK_Template && LOK != LOK_Raw && "not a cooked literal"); 6669fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith#endif 6679fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith return getArg(0); 6689fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith} 6699fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 6709fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smithconst IdentifierInfo *UserDefinedLiteral::getUDSuffix() const { 6719fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith return cast<FunctionDecl>(getCalleeDecl())->getLiteralIdentifier(); 6729fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith} 673f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 67465222e82d97af2120b3952d19cbd3cd923f4b43eDouglas GregorCXXDefaultArgExpr * 675036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas GregorCXXDefaultArgExpr::Create(ASTContext &C, SourceLocation Loc, 676036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor ParmVarDecl *Param, Expr *SubExpr) { 67765222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor void *Mem = C.Allocate(sizeof(CXXDefaultArgExpr) + sizeof(Stmt *)); 678036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param, 679036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor SubExpr); 68065222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor} 68165222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor 6821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCXXTemporary *CXXTemporary::Create(ASTContext &C, 683b859f35459ae3e1188d1e1b86df08d649695fd86Anders Carlsson const CXXDestructorDecl *Destructor) { 68488eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlsson return new (C) CXXTemporary(Destructor); 68588eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlsson} 68688eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlsson 6871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C, 688fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson CXXTemporary *Temp, 689fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson Expr* SubExpr) { 690bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne assert((SubExpr->getType()->isRecordType() || 691bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne SubExpr->getType()->isArrayType()) && 692bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne "Expression bound to a temporary must have record or array type!"); 693fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson 694bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor return new (C) CXXBindTemporaryExpr(Temp, SubExpr); 695fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson} 696fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson 6978e587a15da6d3457a418239d5eb4146fcbd209f3Anders CarlssonCXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C, 69826de54983e7977fad615c94012f2f67d0d1cf404Anders Carlsson CXXConstructorDecl *Cons, 699ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *Type, 7003b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr*> Args, 701428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange parenRange, 7027cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool HadMultipleCandidates, 7031c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor bool ZeroInitialization) 704ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor : CXXConstructExpr(C, CXXTemporaryObjectExprClass, 705ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor Type->getType().getNonReferenceType(), 706ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor Type->getTypeLoc().getBeginLoc(), 7073b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer Cons, false, Args, 7085b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl HadMultipleCandidates, /*FIXME*/false, ZeroInitialization, 709428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth CXXConstructExpr::CK_Complete, parenRange), 710428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth Type(Type) { 711ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor} 712ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor 713ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas GregorSourceRange CXXTemporaryObjectExpr::getSourceRange() const { 714428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth return SourceRange(Type->getTypeLoc().getBeginLoc(), 715428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth getParenRange().getEnd()); 716506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor} 71719d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson 7181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T, 71999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SourceLocation Loc, 7208e587a15da6d3457a418239d5eb4146fcbd209f3Anders Carlsson CXXConstructorDecl *D, bool Elidable, 7213b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr*> Args, 7227cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool HadMultipleCandidates, 7235b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl bool ListInitialization, 7249db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor bool ZeroInitialization, 725428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth ConstructionKind ConstructKind, 726428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange ParenRange) { 72799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D, 7283b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer Elidable, Args, 7295b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl HadMultipleCandidates, ListInitialization, 7305b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl ZeroInitialization, ConstructKind, 7315b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl ParenRange); 732e349bea668622ef31bd51a229960a73d69940709Anders Carlsson} 733e349bea668622ef31bd51a229960a73d69940709Anders Carlsson 7341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T, 73599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SourceLocation Loc, 7368e587a15da6d3457a418239d5eb4146fcbd209f3Anders Carlsson CXXConstructorDecl *D, bool elidable, 7373b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr*> args, 7387cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool HadMultipleCandidates, 7395b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl bool ListInitialization, 7407cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool ZeroInitialization, 741428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth ConstructionKind ConstructKind, 742428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange ParenRange) 743bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(SC, T, VK_RValue, OK_Ordinary, 744bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor T->isDependentType(), T->isDependentType(), 745561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor T->isInstantiationDependentType(), 746bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor T->containsUnexpandedParameterPack()), 7473b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer Constructor(D), Loc(Loc), ParenRange(ParenRange), NumArgs(args.size()), 7487cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara Elidable(elidable), HadMultipleCandidates(HadMultipleCandidates), 7495b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl ListInitialization(ListInitialization), 7507cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara ZeroInitialization(ZeroInitialization), 751a48e676a717309afa50ae06a3d4674acec025bf9Douglas Gregor ConstructKind(ConstructKind), Args(0) 75216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor{ 75316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (NumArgs) { 7543b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer Args = new (C) Stmt*[args.size()]; 75516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor 7563b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer for (unsigned i = 0; i != args.size(); ++i) { 75716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor assert(args[i] && "NULL argument in CXXConstructExpr"); 758bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 759bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (args[i]->isValueDependent()) 760bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ValueDependent = true; 761561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor if (args[i]->isInstantiationDependent()) 762561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor ExprBits.InstantiationDependent = true; 763bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (args[i]->containsUnexpandedParameterPack()) 764bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = true; 765bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 76616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor Args[i] = args[i]; 767e349bea668622ef31bd51a229960a73d69940709Anders Carlsson } 76816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } 769e349bea668622ef31bd51a229960a73d69940709Anders Carlsson} 770e349bea668622ef31bd51a229960a73d69940709Anders Carlsson 77101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas GregorLambdaExpr::Capture::Capture(SourceLocation Loc, bool Implicit, 77201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor LambdaCaptureKind Kind, VarDecl *Var, 77301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor SourceLocation EllipsisLoc) 77401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor : VarAndBits(Var, 0), Loc(Loc), EllipsisLoc(EllipsisLoc) 77501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor{ 77601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor unsigned Bits = 0; 77701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor if (Implicit) 77801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor Bits |= Capture_Implicit; 77901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 78001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor switch (Kind) { 78101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor case LCK_This: 78201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor assert(Var == 0 && "'this' capture cannot have a variable!"); 78301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor break; 78401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 78501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor case LCK_ByCopy: 78601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor Bits |= Capture_ByCopy; 78701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor // Fall through 78801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor case LCK_ByRef: 78901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor assert(Var && "capture must have a variable!"); 79001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor break; 79101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor } 79201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor VarAndBits.setInt(Bits); 79301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor} 79401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 79501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas GregorLambdaCaptureKind LambdaExpr::Capture::getCaptureKind() const { 79601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor if (capturesThis()) 79701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor return LCK_This; 79801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 79901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor return (VarAndBits.getInt() & Capture_ByCopy)? LCK_ByCopy : LCK_ByRef; 80001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor} 80101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 80201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas GregorLambdaExpr::LambdaExpr(QualType T, 80301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor SourceRange IntroducerRange, 80401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor LambdaCaptureDefault CaptureDefault, 80501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor ArrayRef<Capture> Captures, 80601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor bool ExplicitParams, 807dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor bool ExplicitResultType, 80801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor ArrayRef<Expr *> CaptureInits, 8097ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor ArrayRef<VarDecl *> ArrayIndexVars, 8107ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor ArrayRef<unsigned> ArrayIndexStarts, 811612409ece080e814f79e06772c690d603f45fbd6Richard Smith SourceLocation ClosingBrace, 812612409ece080e814f79e06772c690d603f45fbd6Richard Smith bool ContainsUnexpandedParameterPack) 81301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor : Expr(LambdaExprClass, T, VK_RValue, OK_Ordinary, 81401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor T->isDependentType(), T->isDependentType(), T->isDependentType(), 815612409ece080e814f79e06772c690d603f45fbd6Richard Smith ContainsUnexpandedParameterPack), 81601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor IntroducerRange(IntroducerRange), 8177ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor NumCaptures(Captures.size()), 81801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor CaptureDefault(CaptureDefault), 81901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor ExplicitParams(ExplicitParams), 820dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor ExplicitResultType(ExplicitResultType), 82101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor ClosingBrace(ClosingBrace) 82201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor{ 82301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor assert(CaptureInits.size() == Captures.size() && "Wrong number of arguments"); 824da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor CXXRecordDecl *Class = getLambdaClass(); 825da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor CXXRecordDecl::LambdaDefinitionData &Data = Class->getLambdaData(); 826da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor 827da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor // FIXME: Propagate "has unexpanded parameter pack" bit. 8287ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor 8297ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor // Copy captures. 8307ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor ASTContext &Context = Class->getASTContext(); 8317ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor Data.NumCaptures = NumCaptures; 8327ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor Data.NumExplicitCaptures = 0; 8337ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor Data.Captures = (Capture *)Context.Allocate(sizeof(Capture) * NumCaptures); 8347ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor Capture *ToCapture = Data.Captures; 8357ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor for (unsigned I = 0, N = Captures.size(); I != N; ++I) { 8367ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor if (Captures[I].isExplicit()) 8377ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor ++Data.NumExplicitCaptures; 8387ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor 8397ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor *ToCapture++ = Captures[I]; 8407ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor } 8417ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor 8427ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor // Copy initialization expressions for the non-static data members. 8437ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor Stmt **Stored = getStoredStmts(); 8447ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor for (unsigned I = 0, N = CaptureInits.size(); I != N; ++I) 8457ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor *Stored++ = CaptureInits[I]; 8467ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor 8477ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor // Copy the body of the lambda. 8487ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor *Stored++ = getCallOperator()->getBody(); 8497ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor 8507ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor // Copy the array index variables, if any. 8517ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor HasArrayIndexVars = !ArrayIndexVars.empty(); 8527ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor if (HasArrayIndexVars) { 8537ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor assert(ArrayIndexStarts.size() == NumCaptures); 8547ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor memcpy(getArrayIndexVars(), ArrayIndexVars.data(), 8557ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor sizeof(VarDecl *) * ArrayIndexVars.size()); 8567ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor memcpy(getArrayIndexStarts(), ArrayIndexStarts.data(), 8577ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor sizeof(unsigned) * Captures.size()); 8587ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor getArrayIndexStarts()[Captures.size()] = ArrayIndexVars.size(); 8595878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor } 86001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor} 86101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 86201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas GregorLambdaExpr *LambdaExpr::Create(ASTContext &Context, 86301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor CXXRecordDecl *Class, 86401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor SourceRange IntroducerRange, 86501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor LambdaCaptureDefault CaptureDefault, 86601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor ArrayRef<Capture> Captures, 86701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor bool ExplicitParams, 868dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor bool ExplicitResultType, 86901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor ArrayRef<Expr *> CaptureInits, 8707ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor ArrayRef<VarDecl *> ArrayIndexVars, 8717ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor ArrayRef<unsigned> ArrayIndexStarts, 872612409ece080e814f79e06772c690d603f45fbd6Richard Smith SourceLocation ClosingBrace, 873612409ece080e814f79e06772c690d603f45fbd6Richard Smith bool ContainsUnexpandedParameterPack) { 87401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor // Determine the type of the expression (i.e., the type of the 87501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor // function object we're creating). 87601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor QualType T = Context.getTypeDeclType(Class); 87701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 8787ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor unsigned Size = sizeof(LambdaExpr) + sizeof(Stmt *) * (Captures.size() + 1); 87988d2f678e70ab9360f09f3534d9223e6ec20f129Richard Smith if (!ArrayIndexVars.empty()) { 88088d2f678e70ab9360f09f3534d9223e6ec20f129Richard Smith Size += sizeof(unsigned) * (Captures.size() + 1); 88188d2f678e70ab9360f09f3534d9223e6ec20f129Richard Smith // Realign for following VarDecl array. 882a796b6c4b99116ca31e6e61d8765b321678d580eRichard Smith Size = llvm::RoundUpToAlignment(Size, llvm::alignOf<VarDecl*>()); 88388d2f678e70ab9360f09f3534d9223e6ec20f129Richard Smith Size += sizeof(VarDecl *) * ArrayIndexVars.size(); 88488d2f678e70ab9360f09f3534d9223e6ec20f129Richard Smith } 8857ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor void *Mem = Context.Allocate(Size); 8867ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor return new (Mem) LambdaExpr(T, IntroducerRange, CaptureDefault, 887dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor Captures, ExplicitParams, ExplicitResultType, 888dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor CaptureInits, ArrayIndexVars, ArrayIndexStarts, 889612409ece080e814f79e06772c690d603f45fbd6Richard Smith ClosingBrace, ContainsUnexpandedParameterPack); 89001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor} 89101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 8929d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas GregorLambdaExpr *LambdaExpr::CreateDeserialized(ASTContext &C, unsigned NumCaptures, 8939d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor unsigned NumArrayIndexVars) { 8949d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor unsigned Size = sizeof(LambdaExpr) + sizeof(Stmt *) * (NumCaptures + 1); 8959d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor if (NumArrayIndexVars) 8969d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor Size += sizeof(VarDecl) * NumArrayIndexVars 8979d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor + sizeof(unsigned) * (NumCaptures + 1); 8989d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor void *Mem = C.Allocate(Size); 8999d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor return new (Mem) LambdaExpr(EmptyShell(), NumCaptures, NumArrayIndexVars > 0); 9009d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor} 9019d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor 902da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas GregorLambdaExpr::capture_iterator LambdaExpr::capture_begin() const { 9037ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor return getLambdaClass()->getLambdaData().Captures; 904da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor} 905da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor 906da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas GregorLambdaExpr::capture_iterator LambdaExpr::capture_end() const { 9077ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor return capture_begin() + NumCaptures; 908da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor} 909da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor 910da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas GregorLambdaExpr::capture_iterator LambdaExpr::explicit_capture_begin() const { 911da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor return capture_begin(); 912da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor} 913da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor 914da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas GregorLambdaExpr::capture_iterator LambdaExpr::explicit_capture_end() const { 915da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor struct CXXRecordDecl::LambdaDefinitionData &Data 916da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor = getLambdaClass()->getLambdaData(); 9177ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor return Data.Captures + Data.NumExplicitCaptures; 918da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor} 919da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor 920da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas GregorLambdaExpr::capture_iterator LambdaExpr::implicit_capture_begin() const { 921da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor return explicit_capture_end(); 922da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor} 923da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor 924da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas GregorLambdaExpr::capture_iterator LambdaExpr::implicit_capture_end() const { 925da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor return capture_end(); 926da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor} 927da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor 9289daa7bfdff7256cef693d7bf10084881bcb9253cDouglas GregorArrayRef<VarDecl *> 9299daa7bfdff7256cef693d7bf10084881bcb9253cDouglas GregorLambdaExpr::getCaptureInitIndexVars(capture_init_iterator Iter) const { 9307ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor assert(HasArrayIndexVars && "No array index-var data?"); 9319daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor 9329daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor unsigned Index = Iter - capture_init_begin(); 93343a1b00153a60e3bab1ff66e4674b1bc13d23817Matt Beaumont-Gay assert(Index < getLambdaClass()->getLambdaData().NumCaptures && 93443a1b00153a60e3bab1ff66e4674b1bc13d23817Matt Beaumont-Gay "Capture index out-of-range"); 9357ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor VarDecl **IndexVars = getArrayIndexVars(); 9367ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor unsigned *IndexStarts = getArrayIndexStarts(); 9379daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor return ArrayRef<VarDecl *>(IndexVars + IndexStarts[Index], 9389daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor IndexVars + IndexStarts[Index + 1]); 9399daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor} 9409daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor 94101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas GregorCXXRecordDecl *LambdaExpr::getLambdaClass() const { 94201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor return getType()->getAsCXXRecordDecl(); 94301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor} 94401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 94501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas GregorCXXMethodDecl *LambdaExpr::getCallOperator() const { 94601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor CXXRecordDecl *Record = getLambdaClass(); 94701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor DeclarationName Name 94801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor = Record->getASTContext().DeclarationNames.getCXXOperatorName(OO_Call); 94901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor DeclContext::lookup_result Calls = Record->lookup(Name); 95001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor assert(Calls.first != Calls.second && "Missing lambda call operator!"); 95101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor CXXMethodDecl *Result = cast<CXXMethodDecl>(*Calls.first++); 95201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor assert(Calls.first == Calls.second && "More than lambda one call operator?"); 95301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor return Result; 95401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor} 95501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 9569d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas GregorCompoundStmt *LambdaExpr::getBody() const { 9579d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor if (!getStoredStmts()[NumCaptures]) 9589d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor getStoredStmts()[NumCaptures] = getCallOperator()->getBody(); 9599d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor 9609d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor return reinterpret_cast<CompoundStmt *>(getStoredStmts()[NumCaptures]); 9619d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor} 9629d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor 96301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregorbool LambdaExpr::isMutable() const { 9644ef832ffc1147ce2f9777f9fad650cb3139a1d00David Blaikie return !getCallOperator()->isConst(); 96501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor} 96601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 96780ee6e878a169e6255d4686a91bb696151ff229fJohn McCallExprWithCleanups::ExprWithCleanups(Expr *subexpr, 96880ee6e878a169e6255d4686a91bb696151ff229fJohn McCall ArrayRef<CleanupObject> objects) 9694765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall : Expr(ExprWithCleanupsClass, subexpr->getType(), 970f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall subexpr->getValueKind(), subexpr->getObjectKind(), 971bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor subexpr->isTypeDependent(), subexpr->isValueDependent(), 972561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor subexpr->isInstantiationDependent(), 973bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor subexpr->containsUnexpandedParameterPack()), 97480ee6e878a169e6255d4686a91bb696151ff229fJohn McCall SubExpr(subexpr) { 97580ee6e878a169e6255d4686a91bb696151ff229fJohn McCall ExprWithCleanupsBits.NumObjects = objects.size(); 97680ee6e878a169e6255d4686a91bb696151ff229fJohn McCall for (unsigned i = 0, e = objects.size(); i != e; ++i) 97780ee6e878a169e6255d4686a91bb696151ff229fJohn McCall getObjectsBuffer()[i] = objects[i]; 97802bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson} 97902bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson 98080ee6e878a169e6255d4686a91bb696151ff229fJohn McCallExprWithCleanups *ExprWithCleanups::Create(ASTContext &C, Expr *subexpr, 98180ee6e878a169e6255d4686a91bb696151ff229fJohn McCall ArrayRef<CleanupObject> objects) { 98280ee6e878a169e6255d4686a91bb696151ff229fJohn McCall size_t size = sizeof(ExprWithCleanups) 98380ee6e878a169e6255d4686a91bb696151ff229fJohn McCall + objects.size() * sizeof(CleanupObject); 98480ee6e878a169e6255d4686a91bb696151ff229fJohn McCall void *buffer = C.Allocate(size, llvm::alignOf<ExprWithCleanups>()); 98580ee6e878a169e6255d4686a91bb696151ff229fJohn McCall return new (buffer) ExprWithCleanups(subexpr, objects); 986d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner} 987d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner 98880ee6e878a169e6255d4686a91bb696151ff229fJohn McCallExprWithCleanups::ExprWithCleanups(EmptyShell empty, unsigned numObjects) 98980ee6e878a169e6255d4686a91bb696151ff229fJohn McCall : Expr(ExprWithCleanupsClass, empty) { 99080ee6e878a169e6255d4686a91bb696151ff229fJohn McCall ExprWithCleanupsBits.NumObjects = numObjects; 99180ee6e878a169e6255d4686a91bb696151ff229fJohn McCall} 992d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner 99380ee6e878a169e6255d4686a91bb696151ff229fJohn McCallExprWithCleanups *ExprWithCleanups::Create(ASTContext &C, EmptyShell empty, 99480ee6e878a169e6255d4686a91bb696151ff229fJohn McCall unsigned numObjects) { 99580ee6e878a169e6255d4686a91bb696151ff229fJohn McCall size_t size = sizeof(ExprWithCleanups) + numObjects * sizeof(CleanupObject); 99680ee6e878a169e6255d4686a91bb696151ff229fJohn McCall void *buffer = C.Allocate(size, llvm::alignOf<ExprWithCleanups>()); 99780ee6e878a169e6255d4686a91bb696151ff229fJohn McCall return new (buffer) ExprWithCleanups(empty, numObjects); 99888eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlsson} 99988eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlsson 1000ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas GregorCXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type, 1001d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation LParenLoc, 10023b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr*> Args, 1003d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation RParenLoc) 1004ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor : Expr(CXXUnresolvedConstructExprClass, 1005ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor Type->getType().getNonReferenceType(), 1006032c86921177031ecbb46c398b3e710758ba915eDouglas Gregor (Type->getType()->isLValueReferenceType() ? VK_LValue 1007032c86921177031ecbb46c398b3e710758ba915eDouglas Gregor :Type->getType()->isRValueReferenceType()? VK_XValue 1008032c86921177031ecbb46c398b3e710758ba915eDouglas Gregor :VK_RValue), 1009032c86921177031ecbb46c398b3e710758ba915eDouglas Gregor OK_Ordinary, 1010561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor Type->getType()->isDependentType(), true, true, 1011bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Type->getType()->containsUnexpandedParameterPack()), 1012ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor Type(Type), 1013d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor LParenLoc(LParenLoc), 1014d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor RParenLoc(RParenLoc), 10153b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer NumArgs(Args.size()) { 1016d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1); 10173b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer for (unsigned I = 0; I != Args.size(); ++I) { 1018bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (Args[I]->containsUnexpandedParameterPack()) 1019bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = true; 1020bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 1021bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor StoredArgs[I] = Args[I]; 1022bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 1023d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor} 1024d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 1025d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas GregorCXXUnresolvedConstructExpr * 10261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCXXUnresolvedConstructExpr::Create(ASTContext &C, 1027ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *Type, 1028d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation LParenLoc, 10293b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr*> Args, 1030d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation RParenLoc) { 1031d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) + 10323b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer sizeof(Expr *) * Args.size()); 10333b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer return new (Mem) CXXUnresolvedConstructExpr(Type, LParenLoc, Args, RParenLoc); 1034d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor} 1035d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 10368dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios KyrtzidisCXXUnresolvedConstructExpr * 10378dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios KyrtzidisCXXUnresolvedConstructExpr::CreateEmpty(ASTContext &C, unsigned NumArgs) { 10388dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis Stmt::EmptyShell Empty; 10398dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) + 10408dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis sizeof(Expr *) * NumArgs); 10418dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis return new (Mem) CXXUnresolvedConstructExpr(Empty, NumArgs); 10428dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis} 10438dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 1044ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas GregorSourceRange CXXUnresolvedConstructExpr::getSourceRange() const { 1045ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return SourceRange(Type->getTypeLoc().getBeginLoc(), RParenLoc); 1046ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor} 1047ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor 1048865d447ac6a4721ab58e898d014a21f2eff74b06John McCallCXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C, 1049aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Expr *Base, QualType BaseType, 1050aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall bool IsArrow, 10513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation OperatorLoc, 1052e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara NestedNameSpecifierLoc QualifierLoc, 1053e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 10543b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NamedDecl *FirstQualifierFoundInScope, 10552577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo MemberNameInfo, 1056d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo *TemplateArgs) 1057f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(CXXDependentScopeMemberExprClass, C.DependentTy, 1058561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor VK_LValue, OK_Ordinary, true, true, true, 1059bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ((Base && Base->containsUnexpandedParameterPack()) || 10607c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor (QualifierLoc && 10617c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor QualifierLoc.getNestedNameSpecifier() 10627c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor ->containsUnexpandedParameterPack()) || 1063bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor MemberNameInfo.containsUnexpandedParameterPack())), 1064aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base(Base), BaseType(BaseType), IsArrow(IsArrow), 1065e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara HasTemplateKWAndArgsInfo(TemplateArgs != 0 || TemplateKWLoc.isValid()), 10667c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor OperatorLoc(OperatorLoc), QualifierLoc(QualifierLoc), 10673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierFoundInScope(FirstQualifierFoundInScope), 10682577743c5650c646fb705df01403707e94f2df04Abramo Bagnara MemberNameInfo(MemberNameInfo) { 1069bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (TemplateArgs) { 1070bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor bool Dependent = true; 1071561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor bool InstantiationDependent = true; 1072bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor bool ContainsUnexpandedParameterPack = false; 1073e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc, *TemplateArgs, 1074e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara Dependent, 1075e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara InstantiationDependent, 1076e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara ContainsUnexpandedParameterPack); 1077bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (ContainsUnexpandedParameterPack) 1078bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = true; 1079e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } else if (TemplateKWLoc.isValid()) { 1080e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc); 1081bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 10823b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor} 10833b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 1084bebbe0d9b7568ce43a464286bee49429489ef483Douglas GregorCXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C, 1085bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Expr *Base, QualType BaseType, 1086bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor bool IsArrow, 1087bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor SourceLocation OperatorLoc, 10887c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 1089bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor NamedDecl *FirstQualifierFoundInScope, 1090bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor DeclarationNameInfo MemberNameInfo) 1091bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(CXXDependentScopeMemberExprClass, C.DependentTy, 1092561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor VK_LValue, OK_Ordinary, true, true, true, 1093bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ((Base && Base->containsUnexpandedParameterPack()) || 10947c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor (QualifierLoc && 10957c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor QualifierLoc.getNestedNameSpecifier()-> 10967c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor containsUnexpandedParameterPack()) || 1097bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor MemberNameInfo.containsUnexpandedParameterPack())), 1098bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Base(Base), BaseType(BaseType), IsArrow(IsArrow), 1099e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara HasTemplateKWAndArgsInfo(false), 1100e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara OperatorLoc(OperatorLoc), QualifierLoc(QualifierLoc), 1101bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor FirstQualifierFoundInScope(FirstQualifierFoundInScope), 1102bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor MemberNameInfo(MemberNameInfo) { } 1103bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 1104865d447ac6a4721ab58e898d014a21f2eff74b06John McCallCXXDependentScopeMemberExpr * 1105865d447ac6a4721ab58e898d014a21f2eff74b06John McCallCXXDependentScopeMemberExpr::Create(ASTContext &C, 1106aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Expr *Base, QualType BaseType, bool IsArrow, 11073b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation OperatorLoc, 11087c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 1109e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 11103b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NamedDecl *FirstQualifierFoundInScope, 11112577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo MemberNameInfo, 1112d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo *TemplateArgs) { 1113e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!TemplateArgs && !TemplateKWLoc.isValid()) 1114aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return new (C) CXXDependentScopeMemberExpr(C, Base, BaseType, 1115aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall IsArrow, OperatorLoc, 11167c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor QualifierLoc, 1117aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall FirstQualifierFoundInScope, 11182577743c5650c646fb705df01403707e94f2df04Abramo Bagnara MemberNameInfo); 11191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1120e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara unsigned NumTemplateArgs = TemplateArgs ? TemplateArgs->size() : 0; 1121e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara std::size_t size = sizeof(CXXDependentScopeMemberExpr) 1122e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara + ASTTemplateKWAndArgsInfo::sizeFor(NumTemplateArgs); 1123d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 11243248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>()); 1125aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType, 1126aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall IsArrow, OperatorLoc, 11277c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor QualifierLoc, 1128e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara TemplateKWLoc, 1129aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall FirstQualifierFoundInScope, 11302577743c5650c646fb705df01403707e94f2df04Abramo Bagnara MemberNameInfo, TemplateArgs); 11313b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor} 11323b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 11338dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios KyrtzidisCXXDependentScopeMemberExpr * 11348dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios KyrtzidisCXXDependentScopeMemberExpr::CreateEmpty(ASTContext &C, 1135e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool HasTemplateKWAndArgsInfo, 11368dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis unsigned NumTemplateArgs) { 1137e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!HasTemplateKWAndArgsInfo) 11388dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis return new (C) CXXDependentScopeMemberExpr(C, 0, QualType(), 1139e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 0, SourceLocation(), 11407c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor NestedNameSpecifierLoc(), 0, 11412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo()); 11428dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 11438dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis std::size_t size = sizeof(CXXDependentScopeMemberExpr) + 1144e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara ASTTemplateKWAndArgsInfo::sizeFor(NumTemplateArgs); 11453248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>()); 11468dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis CXXDependentScopeMemberExpr *E 11478dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis = new (Mem) CXXDependentScopeMemberExpr(C, 0, QualType(), 1148e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 0, SourceLocation(), 1149e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara NestedNameSpecifierLoc(), 1150e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation(), 0, 11512577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo(), 0); 1152e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara E->HasTemplateKWAndArgsInfo = true; 11538dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis return E; 11548dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis} 11558dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 11564c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregorbool CXXDependentScopeMemberExpr::isImplicitAccess() const { 11574c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor if (Base == 0) 11584c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor return true; 11594c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor 116075e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor return cast<Expr>(Base)->isImplicitCXXThis(); 11614c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor} 11624c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor 1163864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCallstatic bool hasOnlyNonStaticMemberFunctions(UnresolvedSetIterator begin, 1164864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall UnresolvedSetIterator end) { 1165864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall do { 1166864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall NamedDecl *decl = *begin; 1167864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall if (isa<UnresolvedUsingValueDecl>(decl)) 1168864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall return false; 1169864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall if (isa<UsingShadowDecl>(decl)) 1170864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall decl = cast<UsingShadowDecl>(decl)->getUnderlyingDecl(); 1171864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall 1172864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall // Unresolved member expressions should only contain methods and 1173864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall // method templates. 1174864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall assert(isa<CXXMethodDecl>(decl) || isa<FunctionTemplateDecl>(decl)); 1175864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall 1176864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall if (isa<FunctionTemplateDecl>(decl)) 1177864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall decl = cast<FunctionTemplateDecl>(decl)->getTemplatedDecl(); 1178864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall if (cast<CXXMethodDecl>(decl)->isStatic()) 1179864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall return false; 1180864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall } while (++begin != end); 1181864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall 1182864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall return true; 1183864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall} 1184864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall 1185bebbe0d9b7568ce43a464286bee49429489ef483Douglas GregorUnresolvedMemberExpr::UnresolvedMemberExpr(ASTContext &C, 1186129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall bool HasUnresolvedUsing, 1187aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Expr *Base, QualType BaseType, 1188aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall bool IsArrow, 1189129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceLocation OperatorLoc, 11904c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 1191e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 11922577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &MemberNameInfo, 11935a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor const TemplateArgumentListInfo *TemplateArgs, 11945a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor UnresolvedSetIterator Begin, 11955a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor UnresolvedSetIterator End) 1196e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara : OverloadExpr(UnresolvedMemberExprClass, C, QualifierLoc, TemplateKWLoc, 1197e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara MemberNameInfo, TemplateArgs, Begin, End, 1198bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor // Dependent 1199bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ((Base && Base->isTypeDependent()) || 1200bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor BaseType->isDependentType()), 1201561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor ((Base && Base->isInstantiationDependent()) || 1202561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor BaseType->isInstantiationDependentType()), 1203bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor // Contains unexpanded parameter pack 1204bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ((Base && Base->containsUnexpandedParameterPack()) || 1205bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor BaseType->containsUnexpandedParameterPack())), 12067bb12da2b0749eeebb21854c77877736969e59f2John McCall IsArrow(IsArrow), HasUnresolvedUsing(HasUnresolvedUsing), 12077bb12da2b0749eeebb21854c77877736969e59f2John McCall Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) { 1208864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall 1209864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall // Check whether all of the members are non-static member functions, 1210864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall // and if so, mark give this bound-member type instead of overload type. 1211864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall if (hasOnlyNonStaticMemberFunctions(Begin, End)) 1212864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall setType(C.BoundMemberTy); 1213129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall} 1214129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 12154c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregorbool UnresolvedMemberExpr::isImplicitAccess() const { 12164c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor if (Base == 0) 12174c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor return true; 12184c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor 121975e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor return cast<Expr>(Base)->isImplicitCXXThis(); 12204c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor} 12214c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor 1222129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallUnresolvedMemberExpr * 1223bebbe0d9b7568ce43a464286bee49429489ef483Douglas GregorUnresolvedMemberExpr::Create(ASTContext &C, 1224129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall bool HasUnresolvedUsing, 1225aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Expr *Base, QualType BaseType, bool IsArrow, 1226129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceLocation OperatorLoc, 12274c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 1228e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 12292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &MemberNameInfo, 12305a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor const TemplateArgumentListInfo *TemplateArgs, 12315a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor UnresolvedSetIterator Begin, 12325a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor UnresolvedSetIterator End) { 1233129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall std::size_t size = sizeof(UnresolvedMemberExpr); 1234129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (TemplateArgs) 1235e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara size += ASTTemplateKWAndArgsInfo::sizeFor(TemplateArgs->size()); 1236e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara else if (TemplateKWLoc.isValid()) 1237e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara size += ASTTemplateKWAndArgsInfo::sizeFor(0); 1238129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 12393248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>()); 1240928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor return new (Mem) UnresolvedMemberExpr(C, 1241bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor HasUnresolvedUsing, Base, BaseType, 1242e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara IsArrow, OperatorLoc, QualifierLoc, TemplateKWLoc, 12432577743c5650c646fb705df01403707e94f2df04Abramo Bagnara MemberNameInfo, TemplateArgs, Begin, End); 1244129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall} 1245129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 1246a77eb0862507b900a10fa352af1568e639ed10b1Argyrios KyrtzidisUnresolvedMemberExpr * 1247e4b92761b43ced611c417ae478568610f1ad7b1eAbramo BagnaraUnresolvedMemberExpr::CreateEmpty(ASTContext &C, bool HasTemplateKWAndArgsInfo, 1248def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor unsigned NumTemplateArgs) { 1249a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis std::size_t size = sizeof(UnresolvedMemberExpr); 1250e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (HasTemplateKWAndArgsInfo) 1251e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara size += ASTTemplateKWAndArgsInfo::sizeFor(NumTemplateArgs); 1252a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis 12533248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>()); 1254a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis UnresolvedMemberExpr *E = new (Mem) UnresolvedMemberExpr(EmptyShell()); 1255e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara E->HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo; 1256a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis return E; 1257a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis} 1258a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis 1259c373d48502ca7683ab55385f5bd624d778eb288dJohn McCallCXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const { 1260c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this. 1261c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall 1262c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall // If there was a nested name specifier, it names the naming class. 1263c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall // It can't be dependent: after all, we were actually able to do the 1264c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall // lookup. 1265c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor CXXRecordDecl *Record = 0; 12667bb12da2b0749eeebb21854c77877736969e59f2John McCall if (getQualifier()) { 1267f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const Type *T = getQualifier()->getAsType(); 1268c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall assert(T && "qualifier in member expression does not name type"); 1269c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor Record = T->getAsCXXRecordDecl(); 1270c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor assert(Record && "qualifier in member expression does not name record"); 1271c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor } 1272c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall // Otherwise the naming class must have been the base class. 1273c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor else { 1274c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall QualType BaseType = getBaseType().getNonReferenceType(); 1275c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall if (isArrow()) { 1276c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall const PointerType *PT = BaseType->getAs<PointerType>(); 1277c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall assert(PT && "base of arrow member access is not pointer"); 1278c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall BaseType = PT->getPointeeType(); 1279c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall } 1280c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall 1281c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor Record = BaseType->getAsCXXRecordDecl(); 1282c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor assert(Record && "base of member expression does not name record"); 1283c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall } 1284c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall 1285c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor return Record; 1286c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall} 1287c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall 1288c7793c73ba8a343de3f2552d984851985a46f159Douglas GregorSubstNonTypeTemplateParmPackExpr:: 1289c7793c73ba8a343de3f2552d984851985a46f159Douglas GregorSubstNonTypeTemplateParmPackExpr(QualType T, 1290c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor NonTypeTemplateParmDecl *Param, 1291c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor SourceLocation NameLoc, 1292c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor const TemplateArgument &ArgPack) 1293c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor : Expr(SubstNonTypeTemplateParmPackExprClass, T, VK_RValue, OK_Ordinary, 1294561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor true, true, true, true), 1295c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor Param(Param), Arguments(ArgPack.pack_begin()), 1296c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor NumArguments(ArgPack.pack_size()), NameLoc(NameLoc) { } 1297c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor 1298c7793c73ba8a343de3f2552d984851985a46f159Douglas GregorTemplateArgument SubstNonTypeTemplateParmPackExpr::getArgumentPack() const { 1299c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor return TemplateArgument(Arguments, NumArguments); 1300c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor} 1301c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor 13024ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas GregorTypeTraitExpr::TypeTraitExpr(QualType T, SourceLocation Loc, TypeTrait Kind, 13034ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor ArrayRef<TypeSourceInfo *> Args, 13044ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor SourceLocation RParenLoc, 13054ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor bool Value) 13064ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor : Expr(TypeTraitExprClass, T, VK_RValue, OK_Ordinary, 13074ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /*TypeDependent=*/false, 13084ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /*ValueDependent=*/false, 13094ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /*InstantiationDependent=*/false, 13104ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /*ContainsUnexpandedParameterPack=*/false), 13114ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor Loc(Loc), RParenLoc(RParenLoc) 13124ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor{ 13134ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor TypeTraitExprBits.Kind = Kind; 13144ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor TypeTraitExprBits.Value = Value; 13154ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor TypeTraitExprBits.NumArgs = Args.size(); 13164ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 13174ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor TypeSourceInfo **ToArgs = getTypeSourceInfos(); 13184ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 13194ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor for (unsigned I = 0, N = Args.size(); I != N; ++I) { 13204ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor if (Args[I]->getType()->isDependentType()) 13214ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor setValueDependent(true); 13224ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor if (Args[I]->getType()->isInstantiationDependentType()) 13234ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor setInstantiationDependent(true); 13244ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor if (Args[I]->getType()->containsUnexpandedParameterPack()) 13254ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor setContainsUnexpandedParameterPack(true); 13264ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 13274ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor ToArgs[I] = Args[I]; 13284ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor } 13294ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor} 13304ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 13314ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas GregorTypeTraitExpr *TypeTraitExpr::Create(ASTContext &C, QualType T, 13324ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor SourceLocation Loc, 13334ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor TypeTrait Kind, 13344ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor ArrayRef<TypeSourceInfo *> Args, 13354ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor SourceLocation RParenLoc, 13364ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor bool Value) { 13374ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor unsigned Size = sizeof(TypeTraitExpr) + sizeof(TypeSourceInfo*) * Args.size(); 13384ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor void *Mem = C.Allocate(Size); 13394ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor return new (Mem) TypeTraitExpr(T, Loc, Kind, Args, RParenLoc, Value); 13404ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor} 13414ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 13424ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas GregorTypeTraitExpr *TypeTraitExpr::CreateDeserialized(ASTContext &C, 13434ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor unsigned NumArgs) { 13444ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor unsigned Size = sizeof(TypeTraitExpr) + sizeof(TypeSourceInfo*) * NumArgs; 13454ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor void *Mem = C.Allocate(Size); 13464ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor return new (Mem) TypeTraitExpr(EmptyShell()); 13474ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor} 13484ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 134999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ArrayTypeTraitExpr::anchor() { } 1350