14b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===--- DeclCXX.cpp - C++ Declaration AST Node Implementation ------------===// 24b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek// 34b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek// The LLVM Compiler Infrastructure 44b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek// 54b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek// This file is distributed under the University of Illinois Open Source 64b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek// License. See LICENSE.TXT for details. 74b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek// 84b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===// 94b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek// 104b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek// This file implements the C++ related Decl classes. 114b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek// 124b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===// 134b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek#include "clang/AST/DeclCXX.h" 144b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek#include "clang/AST/ASTContext.h" 15fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali#include "clang/AST/ASTLambda.h" 167b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis#include "clang/AST/ASTMutationListener.h" 177a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor#include "clang/AST/CXXInheritance.h" 1855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/DeclTemplate.h" 19fb311762bb52dc015c02cb257d2913f104b556f8Anders Carlsson#include "clang/AST/Expr.h" 2076852c218a207ef43583515cb835b6e855353a0fDouglas Gregor#include "clang/AST/ExprCXX.h" 21802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor#include "clang/AST/TypeLoc.h" 227d7e6727a5de032c86dcb58ae734e7c1603c26e6Douglas Gregor#include "clang/Basic/IdentifierTable.h" 23fdfab6b5ee678cd4b6a1c6d01c46ea5d0e3153edDouglas Gregor#include "llvm/ADT/STLExtras.h" 24faebcbbc7ca36e57a710f4690ee4f7fdf1d062eeFariborz Jahanian#include "llvm/ADT/SmallPtrSet.h" 254b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenekusing namespace clang; 264b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek 274b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===// 284b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek// Decl Allocation/Deallocation Method Implementations 294b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===// 3072c3f314d92d65c050ee1c07b7753623c044d6c7Douglas Gregor 3199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid AccessSpecDecl::anchor() { } 3299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 331e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorAccessSpecDecl *AccessSpecDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return new (C, ID) AccessSpecDecl(EmptyShell()); 351e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 361e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 37c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smithvoid LazyASTUnresolvedSet::getFromExternalSource(ASTContext &C) const { 38c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith ExternalASTSource *Source = C.getExternalSource(); 39c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith assert(Impl.Decls.isLazy() && "getFromExternalSource for non-lazy set"); 40c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith assert(Source && "getFromExternalSource with no external source"); 41c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith 42c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith for (ASTUnresolvedSet::iterator I = Impl.begin(); I != Impl.end(); ++I) 43c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith I.setDecl(cast<NamedDecl>(Source->GetExternalDecl( 44c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith reinterpret_cast<uintptr_t>(I.getDecl()) >> 2))); 45c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith Impl.Decls.setLazy(false); 46c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith} 47c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith 4886ff308724171494395a840fd2efbe25e62f352eJohn McCallCXXRecordDecl::DefinitionData::DefinitionData(CXXRecordDecl *D) 497d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith : UserDeclaredConstructor(false), UserDeclaredSpecialMembers(0), 5097c134ea0d41403e04cbcf0085fea3f10f21ec86Eli Friedman Aggregate(true), PlainOldData(true), Empty(true), Polymorphic(false), 51ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth Abstract(false), IsStandardLayout(true), HasNoNonEmptyBases(true), 52a8225449421e8c1e996a7c48300521028946482aChandler Carruth HasPrivateFields(false), HasProtectedFields(false), HasPublicFields(false), 53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines HasMutableFields(false), HasVariantMembers(false), HasOnlyCMembers(true), 54d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith HasInClassInitializer(false), HasUninitializedReferenceMember(false), 55bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith NeedOverloadResolutionForMoveConstructor(false), 56bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith NeedOverloadResolutionForMoveAssignment(false), 57bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith NeedOverloadResolutionForDestructor(false), 58bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith DefaultedMoveConstructorIsDeleted(false), 59bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith DefaultedMoveAssignmentIsDeleted(false), 60bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith DefaultedDestructorIsDeleted(false), 617d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith HasTrivialSpecialMembers(SMF_All), 62ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith DeclaredNonTrivialSpecialMembers(0), 637d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith HasIrrelevantDestructor(true), 646180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith HasConstexprNonCopyMoveConstructor(false), 656180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith DefaultedDefaultConstructorIsConstexpr(true), 667d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith HasConstexprDefaultConstructor(false), 67023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt HasNonLiteralTypeFieldsOrBases(false), ComputedVisibleConversions(false), 687d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith UserProvidedDefaultConstructor(false), DeclaredSpecialMembers(0), 69acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith ImplicitCopyConstructorHasConstParam(true), 70acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith ImplicitCopyAssignmentHasConstParam(true), 71acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith HasDeclaredCopyConstructorWithConstParam(false), 72acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith HasDeclaredCopyAssignmentWithConstParam(false), 73c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines IsLambda(false), IsParsingBaseSpecifiers(false), NumBases(0), NumVBases(0), 74c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Bases(), VBases(), 754fc5089e306fe606f2e3e4fa58063ebab35deb62Richard Smith Definition(D), FirstFriend() { 7686ff308724171494395a840fd2efbe25e62f352eJohn McCall} 7786ff308724171494395a840fd2efbe25e62f352eJohn McCall 78ee3096a2d3092892d4c6f607a6323d9409714ed5Benjamin KramerCXXBaseSpecifier *CXXRecordDecl::DefinitionData::getBasesSlowCase() const { 79ee3096a2d3092892d4c6f607a6323d9409714ed5Benjamin Kramer return Bases.get(Definition->getASTContext().getExternalSource()); 80ee3096a2d3092892d4c6f607a6323d9409714ed5Benjamin Kramer} 81ee3096a2d3092892d4c6f607a6323d9409714ed5Benjamin Kramer 82ee3096a2d3092892d4c6f607a6323d9409714ed5Benjamin KramerCXXBaseSpecifier *CXXRecordDecl::DefinitionData::getVBasesSlowCase() const { 83ee3096a2d3092892d4c6f607a6323d9409714ed5Benjamin Kramer return VBases.get(Definition->getASTContext().getExternalSource()); 84ee3096a2d3092892d4c6f607a6323d9409714ed5Benjamin Kramer} 85ee3096a2d3092892d4c6f607a6323d9409714ed5Benjamin Kramer 866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesCXXRecordDecl::CXXRecordDecl(Kind K, TagKind TK, const ASTContext &C, 876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DeclContext *DC, SourceLocation StartLoc, 886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation IdLoc, IdentifierInfo *Id, 896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CXXRecordDecl *PrevDecl) 906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : RecordDecl(K, TK, C, DC, StartLoc, IdLoc, Id, PrevDecl), 916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DefinitionData(PrevDecl ? PrevDecl->DefinitionData 926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : DefinitionDataPtr(this)), 936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TemplateOrInstantiation() {} 947d7e6727a5de032c86dcb58ae734e7c1603c26e6Douglas Gregor 954ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCXXRecordDecl *CXXRecordDecl::Create(const ASTContext &C, TagKind TK, 96ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, SourceLocation StartLoc, 97ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc, IdentifierInfo *Id, 98aafc0ccfcf860d921a86423c6c9a738301987abfDouglas Gregor CXXRecordDecl* PrevDecl, 99aafc0ccfcf860d921a86423c6c9a738301987abfDouglas Gregor bool DelayTypeCreation) { 1006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CXXRecordDecl *R = new (C, DC) CXXRecordDecl(CXXRecord, TK, C, DC, StartLoc, 101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IdLoc, Id, PrevDecl); 1026bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor R->MayHaveOutOfDateDef = C.getLangOpts().Modules; 1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1048e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor // FIXME: DelayTypeCreation seems like such a hack 105aafc0ccfcf860d921a86423c6c9a738301987abfDouglas Gregor if (!DelayTypeCreation) 1061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump C.getTypeDeclType(R, PrevDecl); 1074b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek return R; 1084b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek} 1094b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek 1106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesCXXRecordDecl * 1116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesCXXRecordDecl::CreateLambda(const ASTContext &C, DeclContext *DC, 1126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TypeSourceInfo *Info, SourceLocation Loc, 1136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool Dependent, bool IsGeneric, 1146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines LambdaCaptureDefault CaptureDefault) { 115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CXXRecordDecl *R = 1166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines new (C, DC) CXXRecordDecl(CXXRecord, TTK_Class, C, DC, Loc, Loc, 1176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nullptr, nullptr); 118da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor R->IsBeingDefined = true; 1196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines R->DefinitionData = 1206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines new (C) struct LambdaDefinitionData(R, Info, Dependent, IsGeneric, 1216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CaptureDefault); 1226bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor R->MayHaveOutOfDateDef = false; 123e3efec20260ea7a0071e2ae6eedf3c2865e476d3James Dennett R->setImplicit(true); 1246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines C.getTypeDeclType(R, /*PrevDecl=*/nullptr); 125da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor return R; 126da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor} 127da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor 1281e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorCXXRecordDecl * 1291e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorCXXRecordDecl::CreateDeserialized(const ASTContext &C, unsigned ID) { 130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CXXRecordDecl *R = new (C, ID) CXXRecordDecl( 1316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CXXRecord, TTK_Struct, C, nullptr, SourceLocation(), SourceLocation(), 1326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nullptr, nullptr); 1336bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor R->MayHaveOutOfDateDef = false; 1346bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor return R; 135b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis} 136b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis 1371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 1382d5b70386d6f5553b667b6e407ca781b4ca2009eDouglas GregorCXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases, 13957c856b96e6bbfc64c2d61b950b116b523dc3e46Douglas Gregor unsigned NumBases) { 1402d5b70386d6f5553b667b6e407ca781b4ca2009eDouglas Gregor ASTContext &C = getASTContext(); 14164bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor 1427c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor if (!data().Bases.isOffset() && data().NumBases > 0) 1437c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor C.Deallocate(data().getBases()); 1441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 145dd67723af339f94870149ee1934dd652f83ca738Richard Smith if (NumBases) { 146dd67723af339f94870149ee1934dd652f83ca738Richard Smith // C++ [dcl.init.aggr]p1: 147dd67723af339f94870149ee1934dd652f83ca738Richard Smith // An aggregate is [...] a class with [...] no base classes [...]. 148dd67723af339f94870149ee1934dd652f83ca738Richard Smith data().Aggregate = false; 149dd67723af339f94870149ee1934dd652f83ca738Richard Smith 150dd67723af339f94870149ee1934dd652f83ca738Richard Smith // C++ [class]p4: 151dd67723af339f94870149ee1934dd652f83ca738Richard Smith // A POD-struct is an aggregate class... 152dd67723af339f94870149ee1934dd652f83ca738Richard Smith data().PlainOldData = false; 153dd67723af339f94870149ee1934dd652f83ca738Richard Smith } 154dd67723af339f94870149ee1934dd652f83ca738Richard Smith 1556f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson // The set of seen virtual base types. 1561c3639351f8c252ddcc13d234cabf8780b1c235fAnders Carlsson llvm::SmallPtrSet<CanQualType, 8> SeenVBaseTypes; 1576f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson 1586f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson // The virtual bases of this class. 1595f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<const CXXBaseSpecifier *, 8> VBases; 1601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16186ff308724171494395a840fd2efbe25e62f352eJohn McCall data().Bases = new(C) CXXBaseSpecifier [NumBases]; 16286ff308724171494395a840fd2efbe25e62f352eJohn McCall data().NumBases = NumBases; 16340c072f44ff081293f79909ecc518af23938108eFariborz Jahanian for (unsigned i = 0; i < NumBases; ++i) { 1647c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor data().getBases()[i] = *Bases[i]; 16540c072f44ff081293f79909ecc518af23938108eFariborz Jahanian // Keep track of inherited vbases for this base class. 16640c072f44ff081293f79909ecc518af23938108eFariborz Jahanian const CXXBaseSpecifier *Base = Bases[i]; 16740c072f44ff081293f79909ecc518af23938108eFariborz Jahanian QualType BaseType = Base->getType(); 1685fe8c04009eff540ebaa0cceb2e75c3908322e11Douglas Gregor // Skip dependent types; we can't do any checking on them now. 16940c072f44ff081293f79909ecc518af23938108eFariborz Jahanian if (BaseType->isDependentType()) 17040c072f44ff081293f79909ecc518af23938108eFariborz Jahanian continue; 17140c072f44ff081293f79909ecc518af23938108eFariborz Jahanian CXXRecordDecl *BaseClassDecl 1726217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek = cast<CXXRecordDecl>(BaseType->getAs<RecordType>()->getDecl()); 1736f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson 1742cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor // A class with a non-empty base class is not empty. 1752cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor // FIXME: Standard ref? 176a8225449421e8c1e996a7c48300521028946482aChandler Carruth if (!BaseClassDecl->isEmpty()) { 177a8225449421e8c1e996a7c48300521028946482aChandler Carruth if (!data().Empty) { 178a8225449421e8c1e996a7c48300521028946482aChandler Carruth // C++0x [class]p7: 179a8225449421e8c1e996a7c48300521028946482aChandler Carruth // A standard-layout class is a class that: 180a8225449421e8c1e996a7c48300521028946482aChandler Carruth // [...] 181a8225449421e8c1e996a7c48300521028946482aChandler Carruth // -- either has no non-static data members in the most derived 182a8225449421e8c1e996a7c48300521028946482aChandler Carruth // class and at most one base class with non-static data members, 183a8225449421e8c1e996a7c48300521028946482aChandler Carruth // or has no base classes with non-static data members, and 184a8225449421e8c1e996a7c48300521028946482aChandler Carruth // If this is the second non-empty base, then neither of these two 185a8225449421e8c1e996a7c48300521028946482aChandler Carruth // clauses can be true. 186ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth data().IsStandardLayout = false; 187a8225449421e8c1e996a7c48300521028946482aChandler Carruth } 188a8225449421e8c1e996a7c48300521028946482aChandler Carruth 1892cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor data().Empty = false; 190a8225449421e8c1e996a7c48300521028946482aChandler Carruth data().HasNoNonEmptyBases = false; 191a8225449421e8c1e996a7c48300521028946482aChandler Carruth } 1922cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor 19385606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor // C++ [class.virtual]p1: 19485606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor // A class that declares or inherits a virtual function is called a 19585606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor // polymorphic class. 19685606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor if (BaseClassDecl->isPolymorphic()) 19785606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor data().Polymorphic = true; 1989b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth 199a8225449421e8c1e996a7c48300521028946482aChandler Carruth // C++0x [class]p7: 200a8225449421e8c1e996a7c48300521028946482aChandler Carruth // A standard-layout class is a class that: [...] 201a8225449421e8c1e996a7c48300521028946482aChandler Carruth // -- has no non-standard-layout base classes 202ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth if (!BaseClassDecl->isStandardLayout()) 203ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth data().IsStandardLayout = false; 204a8225449421e8c1e996a7c48300521028946482aChandler Carruth 2059b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth // Record if this base is the first non-literal field or base. 206a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith if (!hasNonLiteralTypeFieldsOrBases() && !BaseType->isLiteralType(C)) 2079b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth data().HasNonLiteralTypeFieldsOrBases = true; 20885606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor 2096f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson // Now go through all virtual bases of this base and add them. 210651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &VBase : BaseClassDecl->vbases()) { 2116f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson // Add this base if it's not already in the list. 212176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (SeenVBaseTypes.insert(C.getCanonicalType(VBase.getType())).second) { 213651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines VBases.push_back(&VBase); 214acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith 215acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // C++11 [class.copy]p8: 216acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // The implicitly-declared copy constructor for a class X will have 217acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // the form 'X::X(const X&)' if each [...] virtual base class B of X 218acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // has a copy constructor whose first parameter is of type 219acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // 'const B&' or 'const volatile B&' [...] 220651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (CXXRecordDecl *VBaseDecl = VBase.getType()->getAsCXXRecordDecl()) 221acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith if (!VBaseDecl->hasCopyConstructorWithConstParam()) 222acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith data().ImplicitCopyConstructorHasConstParam = false; 223acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith } 22440c072f44ff081293f79909ecc518af23938108eFariborz Jahanian } 2256f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson 2266f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson if (Base->isVirtual()) { 2276f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson // Add this base if it's not already in the list. 228176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (SeenVBaseTypes.insert(C.getCanonicalType(BaseType)).second) 229acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith VBases.push_back(Base); 230acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith 2312cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor // C++0x [meta.unary.prop] is_empty: 2322cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor // T is a class type, but not a union type, with ... no virtual base 2332cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor // classes 2342cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor data().Empty = false; 2354d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth 2367d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // C++11 [class.ctor]p5, C++11 [class.copy]p12, C++11 [class.copy]p25: 2377d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // A [default constructor, copy/move constructor, or copy/move assignment 2387d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // operator for a class X] is trivial [...] if: 2397d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // -- class X has [...] no virtual base classes 2407d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith data().HasTrivialSpecialMembers &= SMF_Destructor; 241a8225449421e8c1e996a7c48300521028946482aChandler Carruth 242a8225449421e8c1e996a7c48300521028946482aChandler Carruth // C++0x [class]p7: 243a8225449421e8c1e996a7c48300521028946482aChandler Carruth // A standard-layout class is a class that: [...] 244a8225449421e8c1e996a7c48300521028946482aChandler Carruth // -- has [...] no virtual base classes 245ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth data().IsStandardLayout = false; 2466180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 2476180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith // C++11 [dcl.constexpr]p4: 2486180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith // In the definition of a constexpr constructor [...] 2496180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith // -- the class shall not have any virtual base classes 2506180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith data().DefaultedDefaultConstructorIsConstexpr = false; 25185606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor } else { 25285606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor // C++ [class.ctor]p5: 253023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt // A default constructor is trivial [...] if: 254023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt // -- all the direct base classes of its class have trivial default 255023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt // constructors. 256023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt if (!BaseClassDecl->hasTrivialDefaultConstructor()) 2577d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor; 2587d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith 2594d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // C++0x [class.copy]p13: 2604d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // A copy/move constructor for class X is trivial if [...] 2614d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // [...] 2624d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // -- the constructor selected to copy/move each direct base class 2634d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // subobject is trivial, and 26485606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor if (!BaseClassDecl->hasTrivialCopyConstructor()) 2657d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor; 266bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // If the base class doesn't have a simple move constructor, we'll eagerly 267bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // declare it and perform overload resolution to determine which function 268bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // it actually calls. If it does have a simple move constructor, this 269bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // check is correct. 270426391cd51af86f9d59eceb0fb1c42153eccbb9aRichard Smith if (!BaseClassDecl->hasTrivialMoveConstructor()) 2717d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor; 2724d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth 2734d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // C++0x [class.copy]p27: 2744d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // A copy/move assignment operator for class X is trivial if [...] 2754d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // [...] 2764d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // -- the assignment operator selected to copy/move each direct base 2774d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // class subobject is trivial, and 27885606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor if (!BaseClassDecl->hasTrivialCopyAssignment()) 2797d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment; 280bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // If the base class doesn't have a simple move assignment, we'll eagerly 281bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // declare it and perform overload resolution to determine which function 282bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // it actually calls. If it does have a simple move assignment, this 283bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // check is correct. 284426391cd51af86f9d59eceb0fb1c42153eccbb9aRichard Smith if (!BaseClassDecl->hasTrivialMoveAssignment()) 2857d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment; 2866180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 2876180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith // C++11 [class.ctor]p6: 288de8facc81f505ca7e86022911145271f614b96eaRichard Smith // If that user-written default constructor would satisfy the 2896180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith // requirements of a constexpr constructor, the implicitly-defined 2906180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith // default constructor is constexpr. 2916180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith if (!BaseClassDecl->hasConstexprDefaultConstructor()) 2926180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith data().DefaultedDefaultConstructorIsConstexpr = false; 29340c072f44ff081293f79909ecc518af23938108eFariborz Jahanian } 294ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith 29585606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor // C++ [class.ctor]p3: 29685606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor // A destructor is trivial if all the direct base classes of its class 29785606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor // have trivial destructors. 29885606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor if (!BaseClassDecl->hasTrivialDestructor()) 2997d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith data().HasTrivialSpecialMembers &= ~SMF_Destructor; 300dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith 301dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith if (!BaseClassDecl->hasIrrelevantDestructor()) 302dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith data().HasIrrelevantDestructor = false; 303dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith 304acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // C++11 [class.copy]p18: 305acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // The implicitly-declared copy assignment oeprator for a class X will 306acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // have the form 'X& X::operator=(const X&)' if each direct base class B 307acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // of X has a copy assignment operator whose parameter is of type 'const 308acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // B&', 'const volatile B&', or 'B' [...] 309acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith if (!BaseClassDecl->hasCopyAssignmentWithConstParam()) 310acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith data().ImplicitCopyAssignmentHasConstParam = false; 311acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith 312acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // C++11 [class.copy]p8: 313acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // The implicitly-declared copy constructor for a class X will have 314acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // the form 'X::X(const X&)' if each direct [...] base class B of X 315acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // has a copy constructor whose first parameter is of type 316acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // 'const B&' or 'const volatile B&' [...] 317acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith if (!BaseClassDecl->hasCopyConstructorWithConstParam()) 318acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith data().ImplicitCopyConstructorHasConstParam = false; 319acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith 320f85e193739c953358c865005855253af4f68a497John McCall // A class has an Objective-C object member if... or any of its bases 321f85e193739c953358c865005855253af4f68a497John McCall // has an Objective-C object member. 322f85e193739c953358c865005855253af4f68a497John McCall if (BaseClassDecl->hasObjectMember()) 323f85e193739c953358c865005855253af4f68a497John McCall setHasObjectMember(true); 3243ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian 3253ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian if (BaseClassDecl->hasVolatileMember()) 3263ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian setHasVolatileMember(true); 327f85e193739c953358c865005855253af4f68a497John McCall 3282bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor // Keep track of the presence of mutable fields. 3292bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor if (BaseClassDecl->hasMutableFields()) 3302bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor data().HasMutableFields = true; 331d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith 332d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith if (BaseClassDecl->hasUninitializedReferenceMember()) 333d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith data().HasUninitializedReferenceMember = true; 334bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith 335bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith addedClassSubobject(BaseClassDecl); 33640c072f44ff081293f79909ecc518af23938108eFariborz Jahanian } 3376f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson 338c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (VBases.empty()) { 339c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines data().IsParsingBaseSpecifiers = false; 3406f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson return; 341c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 3426f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson 3436f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson // Create base specifier for any direct or indirect virtual bases. 3446f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson data().VBases = new (C) CXXBaseSpecifier[VBases.size()]; 3456f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson data().NumVBases = VBases.size(); 346bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith for (int I = 0, E = VBases.size(); I != E; ++I) { 347bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith QualType Type = VBases[I]->getType(); 348bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith if (!Type->isDependentType()) 349bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith addedClassSubobject(Type->getAsCXXRecordDecl()); 3509f8ee2ea0a62551ad5488669cf69308e7b48a9ddRichard Smith data().getVBases()[I] = *VBases[I]; 351bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith } 352c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 353c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines data().IsParsingBaseSpecifiers = false; 354bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith} 355bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith 356bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smithvoid CXXRecordDecl::addedClassSubobject(CXXRecordDecl *Subobj) { 357bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // C++11 [class.copy]p11: 358bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // A defaulted copy/move constructor for a class X is defined as 359bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // deleted if X has: 360bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // -- a direct or virtual base class B that cannot be copied/moved [...] 361bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // -- a non-static data member of class type M (or array thereof) 362bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // that cannot be copied or moved [...] 363bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith if (!Subobj->hasSimpleMoveConstructor()) 364bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith data().NeedOverloadResolutionForMoveConstructor = true; 365bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith 366bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // C++11 [class.copy]p23: 367bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // A defaulted copy/move assignment operator for a class X is defined as 368bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // deleted if X has: 369bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // -- a direct or virtual base class B that cannot be copied/moved [...] 370bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // -- a non-static data member of class type M (or array thereof) 371bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // that cannot be copied or moved [...] 372bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith if (!Subobj->hasSimpleMoveAssignment()) 373bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith data().NeedOverloadResolutionForMoveAssignment = true; 374bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith 375bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // C++11 [class.ctor]p5, C++11 [class.copy]p11, C++11 [class.dtor]p5: 376bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // A defaulted [ctor or dtor] for a class X is defined as 377bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // deleted if X has: 378bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // -- any direct or virtual base class [...] has a type with a destructor 379bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // that is deleted or inaccessible from the defaulted [ctor or dtor]. 380bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // -- any non-static data member has a type with a destructor 381bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // that is deleted or inaccessible from the defaulted [ctor or dtor]. 382bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith if (!Subobj->hasSimpleDestructor()) { 383bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith data().NeedOverloadResolutionForMoveConstructor = true; 384bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith data().NeedOverloadResolutionForDestructor = true; 385bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith } 38657c856b96e6bbfc64c2d61b950b116b523dc3e46Douglas Gregor} 38757c856b96e6bbfc64c2d61b950b116b523dc3e46Douglas Gregor 3889edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor/// Callback function for CXXRecordDecl::forallBases that acknowledges 3899edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor/// that it saw a base class. 3909edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregorstatic bool SawBase(const CXXRecordDecl *, void *) { 3919edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor return true; 3929edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor} 3939edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor 3949edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregorbool CXXRecordDecl::hasAnyDependentBases() const { 3959edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor if (!isDependentContext()) 3969edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor return false; 3979edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor 3986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return !forallBases(SawBase, nullptr); 3999edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor} 4009edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor 401b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruthbool CXXRecordDecl::isTriviallyCopyable() const { 402b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth // C++0x [class]p5: 403b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth // A trivially copyable class is a class that: 404b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth // -- has no non-trivial copy constructors, 405426391cd51af86f9d59eceb0fb1c42153eccbb9aRichard Smith if (hasNonTrivialCopyConstructor()) return false; 406b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth // -- has no non-trivial move constructors, 407426391cd51af86f9d59eceb0fb1c42153eccbb9aRichard Smith if (hasNonTrivialMoveConstructor()) return false; 408b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth // -- has no non-trivial copy assignment operators, 409426391cd51af86f9d59eceb0fb1c42153eccbb9aRichard Smith if (hasNonTrivialCopyAssignment()) return false; 410b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth // -- has no non-trivial move assignment operators, and 411426391cd51af86f9d59eceb0fb1c42153eccbb9aRichard Smith if (hasNonTrivialMoveAssignment()) return false; 412b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth // -- has a trivial destructor. 413b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth if (!hasTrivialDestructor()) return false; 414b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth 415b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth return true; 416b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth} 417b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth 4182138664dd2cff39de52ff11ca35f653c20b2e4b0Douglas Gregorvoid CXXRecordDecl::markedVirtualFunctionPure() { 4192138664dd2cff39de52ff11ca35f653c20b2e4b0Douglas Gregor // C++ [class.abstract]p2: 4202138664dd2cff39de52ff11ca35f653c20b2e4b0Douglas Gregor // A class is abstract if it has at least one pure virtual function. 4212138664dd2cff39de52ff11ca35f653c20b2e4b0Douglas Gregor data().Abstract = true; 4222138664dd2cff39de52ff11ca35f653c20b2e4b0Douglas Gregor} 4232138664dd2cff39de52ff11ca35f653c20b2e4b0Douglas Gregor 4242138664dd2cff39de52ff11ca35f653c20b2e4b0Douglas Gregorvoid CXXRecordDecl::addedMember(Decl *D) { 42517d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos if (!D->isImplicit() && 42617d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos !isa<FieldDecl>(D) && 42717d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos !isa<IndirectFieldDecl>(D) && 42817d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos (!isa<TagDecl>(D) || cast<TagDecl>(D)->getTagKind() == TTK_Class || 42917d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos cast<TagDecl>(D)->getTagKind() == TTK_Interface)) 43017d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos data().HasOnlyCMembers = false; 43117d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos 43217d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos // Ignore friends and invalid declarations. 43327c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor if (D->getFriendObjectKind() || D->isInvalidDecl()) 4345c0646b98b203d105c10ad8cc11be11cc99a4218Douglas Gregor return; 4355c0646b98b203d105c10ad8cc11be11cc99a4218Douglas Gregor 43627c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D); 43727c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor if (FunTmpl) 43827c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor D = FunTmpl->getTemplatedDecl(); 43927c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor 4409fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) { 4419fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor if (Method->isVirtual()) { 4429fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor // C++ [dcl.init.aggr]p1: 4439fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor // An aggregate is an array or a class with [...] no virtual functions. 4449fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor data().Aggregate = false; 4459fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor 4469fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor // C++ [class]p4: 4479fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor // A POD-struct is an aggregate class... 4489fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor data().PlainOldData = false; 4492cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor 4502cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor // Virtual functions make the class non-empty. 4512cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor // FIXME: Standard ref? 4522cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor data().Empty = false; 45385606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor 45485606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor // C++ [class.virtual]p1: 45585606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor // A class that declares or inherits a virtual function is called a 45685606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor // polymorphic class. 45785606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor data().Polymorphic = true; 4584d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth 4597d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // C++11 [class.ctor]p5, C++11 [class.copy]p12, C++11 [class.copy]p25: 4607d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // A [default constructor, copy/move constructor, or copy/move 4617d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // assignment operator for a class X] is trivial [...] if: 4624d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // -- class X has no virtual functions [...] 4637d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith data().HasTrivialSpecialMembers &= SMF_Destructor; 4644d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth 465a8225449421e8c1e996a7c48300521028946482aChandler Carruth // C++0x [class]p7: 466a8225449421e8c1e996a7c48300521028946482aChandler Carruth // A standard-layout class is a class that: [...] 467a8225449421e8c1e996a7c48300521028946482aChandler Carruth // -- has no virtual functions 468ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth data().IsStandardLayout = false; 4699fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor } 4709fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor } 4712cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor 472acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // Notify the listener if an implicit member was added after the definition 473acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // was completed. 474acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith if (!isBeingDefined() && D->isImplicit()) 475acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith if (ASTMutationListener *L = getASTMutationListener()) 476acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith L->AddedCXXImplicitMember(data().Definition, D); 477acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith 4787d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // The kind of special member this declaration is, if any. 4797d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith unsigned SMKind = 0; 4807d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith 481acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // Handle constructors. 48227c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) { 483acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith if (!Constructor->isImplicit()) { 484acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // Note that we have a user-declared constructor. 485acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith data().UserDeclaredConstructor = true; 486acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith 487acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // C++ [class]p4: 488acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // A POD-struct is an aggregate class [...] 489acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // Since the POD bit is meant to be C++03 POD-ness, clear it even if the 490acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // type is technically an aggregate in C++0x since it wouldn't be in 03. 491acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith data().PlainOldData = false; 492acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith } 4938bc3fa4eb6bcb307bef7965a9578afffe22eab4bFariborz Jahanian 494017ab77655b262311a3550342ca19b85380f8f20Richard Smith // Technically, "user-provided" is only defined for special member 495017ab77655b262311a3550342ca19b85380f8f20Richard Smith // functions, but the intent of the standard is clearly that it should apply 496017ab77655b262311a3550342ca19b85380f8f20Richard Smith // to all functions. 497017ab77655b262311a3550342ca19b85380f8f20Richard Smith bool UserProvided = Constructor->isUserProvided(); 49827c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor 49937b8c9ee7cf2b4d5ce3ccd3be1fcadd18a783a57Sean Hunt if (Constructor->isDefaultConstructor()) { 5007d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith SMKind |= SMF_DefaultConstructor; 5017d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith 5027d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith if (UserProvided) 503cdee3fee8ca4df7fb9179f29cc3ba96ac4fd0f95Sean Hunt data().UserProvidedDefaultConstructor = true; 504acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith if (Constructor->isConstexpr()) 5056180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith data().HasConstexprDefaultConstructor = true; 50637b8c9ee7cf2b4d5ce3ccd3be1fcadd18a783a57Sean Hunt } 50727c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor 5084d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth if (!FunTmpl) { 509acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith unsigned Quals; 510acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith if (Constructor->isCopyConstructor(Quals)) { 5117d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith SMKind |= SMF_CopyConstructor; 512acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith 513acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith if (Quals & Qualifiers::Const) 514acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith data().HasDeclaredCopyConstructorWithConstParam = true; 5157d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith } else if (Constructor->isMoveConstructor()) 5167d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith SMKind |= SMF_MoveConstructor; 51727c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor } 518acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith 519acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // Record if we see any constexpr constructors which are neither copy 520acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // nor move constructors. 521acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith if (Constructor->isConstexpr() && !Constructor->isCopyOrMoveConstructor()) 5226b8bc0707f26aa6acfdd80a59b9a3850cafbe387Richard Smith data().HasConstexprNonCopyMoveConstructor = true; 5234d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth 52437b8c9ee7cf2b4d5ce3ccd3be1fcadd18a783a57Sean Hunt // C++ [dcl.init.aggr]p1: 52537b8c9ee7cf2b4d5ce3ccd3be1fcadd18a783a57Sean Hunt // An aggregate is an array or a class with no user-declared 52637b8c9ee7cf2b4d5ce3ccd3be1fcadd18a783a57Sean Hunt // constructors [...]. 527c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith // C++11 [dcl.init.aggr]p1: 52837b8c9ee7cf2b4d5ce3ccd3be1fcadd18a783a57Sean Hunt // An aggregate is an array or a class with no user-provided 52937b8c9ee7cf2b4d5ce3ccd3be1fcadd18a783a57Sean Hunt // constructors [...]. 53080ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith if (getASTContext().getLangOpts().CPlusPlus11 531acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith ? UserProvided : !Constructor->isImplicit()) 53237b8c9ee7cf2b4d5ce3ccd3be1fcadd18a783a57Sean Hunt data().Aggregate = false; 5331f2023ab8b35e0f665eb6c0f11dd6d9b9bca12b8Douglas Gregor } 534030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor 535acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // Handle destructors. 536cf34e757b968f1fa7965cab1464212ade4d9f991Sean Hunt if (CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(D)) { 5377d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith SMKind |= SMF_Destructor; 538dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith 539651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (DD->isUserProvided()) 540acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith data().HasIrrelevantDestructor = false; 541651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If the destructor is explicitly defaulted and not trivial or not public 542651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // or if the destructor is deleted, we clear HasIrrelevantDestructor in 543651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // finishedDefaultedOrDeletedMember. 544acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith 545acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // C++11 [class.dtor]p5: 5467d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // A destructor is trivial if [...] the destructor is not virtual. 5477d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith if (DD->isVirtual()) 5487d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith data().HasTrivialSpecialMembers &= ~SMF_Destructor; 5490ed2e0823cc7b727abd9307db4cd887f293eebe2Douglas Gregor } 550acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith 551acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // Handle member functions. 55227c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) { 553ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt if (Method->isCopyAssignmentOperator()) { 5547d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith SMKind |= SMF_CopyAssignment; 5554d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth 556acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith const ReferenceType *ParamTy = 557acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith Method->getParamDecl(0)->getType()->getAs<ReferenceType>(); 558acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith if (!ParamTy || ParamTy->getPointeeType().isConstQualified()) 559acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith data().HasDeclaredCopyAssignmentWithConstParam = true; 560ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt } 561ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt 5627d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith if (Method->isMoveAssignmentOperator()) 5637d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith SMKind |= SMF_MoveAssignment; 5644d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth 565e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor // Keep the list of conversion functions up-to-date. 566e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor if (CXXConversionDecl *Conversion = dyn_cast<CXXConversionDecl>(D)) { 567109f5fc8dff6f3bd707e0e4140dc99ef7d4f3e88Douglas Gregor // FIXME: We use the 'unsafe' accessor for the access specifier here, 568109f5fc8dff6f3bd707e0e4140dc99ef7d4f3e88Douglas Gregor // because Sema may not have set it yet. That's really just a misdesign 569109f5fc8dff6f3bd707e0e4140dc99ef7d4f3e88Douglas Gregor // in Sema. However, LLDB *will* have set the access specifier correctly, 570109f5fc8dff6f3bd707e0e4140dc99ef7d4f3e88Douglas Gregor // and adds declarations after the class is technically completed, 571109f5fc8dff6f3bd707e0e4140dc99ef7d4f3e88Douglas Gregor // so completeDefinition()'s overriding of the access specifiers doesn't 572109f5fc8dff6f3bd707e0e4140dc99ef7d4f3e88Douglas Gregor // work. 573109f5fc8dff6f3bd707e0e4140dc99ef7d4f3e88Douglas Gregor AccessSpecifier AS = Conversion->getAccessUnsafe(); 574109f5fc8dff6f3bd707e0e4140dc99ef7d4f3e88Douglas Gregor 5757d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith if (Conversion->getPrimaryTemplate()) { 5767d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // We don't record specializations. 577e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor } else { 578c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith ASTContext &Ctx = getASTContext(); 579c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith ASTUnresolvedSet &Conversions = data().Conversions.get(Ctx); 580c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith NamedDecl *Primary = 581c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith FunTmpl ? cast<NamedDecl>(FunTmpl) : cast<NamedDecl>(Conversion); 582c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith if (Primary->getPreviousDecl()) 583c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith Conversions.replace(cast<NamedDecl>(Primary->getPreviousDecl()), 584c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith Primary, AS); 585e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor else 586c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith Conversions.addDecl(Ctx, Primary, AS); 587e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor } 588e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor } 589acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith 5907d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith if (SMKind) { 591ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith // If this is the first declaration of a special member, we no longer have 592ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith // an implicit trivial special member. 593ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith data().HasTrivialSpecialMembers &= 594ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith data().DeclaredSpecialMembers | ~SMKind; 595ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith 596ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith if (!Method->isImplicit() && !Method->isUserProvided()) { 597ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith // This method is user-declared but not user-provided. We can't work out 598ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith // whether it's trivial yet (not until we get to the end of the class). 599ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith // We'll handle this method in finishedDefaultedOrDeletedMember. 600ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith } else if (Method->isTrivial()) 601ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith data().HasTrivialSpecialMembers |= SMKind; 602ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith else 603ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith data().DeclaredNonTrivialSpecialMembers |= SMKind; 604ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith 6057d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // Note when we have declared a declared special member, and suppress the 6067d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // implicit declaration of this special member. 6077d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith data().DeclaredSpecialMembers |= SMKind; 6087d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith 6097d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith if (!Method->isImplicit()) { 6107d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith data().UserDeclaredSpecialMembers |= SMKind; 6117d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith 6127d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // C++03 [class]p4: 6137d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // A POD-struct is an aggregate class that has [...] no user-defined 6147d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // copy assignment operator and no user-defined destructor. 6157d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // 6167d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // Since the POD bit is meant to be C++03 POD-ness, and in C++03, 6177d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // aggregates could not have any constructors, clear it even for an 6187d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // explicitly defaulted or deleted constructor. 6197d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // type is technically an aggregate in C++0x since it wouldn't be in 03. 6207d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // 6217d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // Also, a user-declared move assignment operator makes a class non-POD. 6227d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith // This is an extension in C++03. 6237d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith data().PlainOldData = false; 6247d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith } 6257d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith } 6267d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith 62764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl return; 62827c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor } 6297d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith 6309fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor // Handle non-static data members. 6319fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor if (FieldDecl *Field = dyn_cast<FieldDecl>(D)) { 632d61db33331c264d6361283602b248a7423040597Douglas Gregor // C++ [class.bit]p2: 633d61db33331c264d6361283602b248a7423040597Douglas Gregor // A declaration for a bit-field that omits the identifier declares an 634d61db33331c264d6361283602b248a7423040597Douglas Gregor // unnamed bit-field. Unnamed bit-fields are not members and cannot be 635d61db33331c264d6361283602b248a7423040597Douglas Gregor // initialized. 636d61db33331c264d6361283602b248a7423040597Douglas Gregor if (Field->isUnnamedBitfield()) 637d61db33331c264d6361283602b248a7423040597Douglas Gregor return; 638d61db33331c264d6361283602b248a7423040597Douglas Gregor 6399fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor // C++ [dcl.init.aggr]p1: 6409fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor // An aggregate is an array or a class (clause 9) with [...] no 6419fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor // private or protected non-static data members (clause 11). 6429fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor // 6439fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor // A POD must be an aggregate. 6449fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor if (D->getAccess() == AS_private || D->getAccess() == AS_protected) { 6459fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor data().Aggregate = false; 6469fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor data().PlainOldData = false; 6479fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor } 648a8225449421e8c1e996a7c48300521028946482aChandler Carruth 649a8225449421e8c1e996a7c48300521028946482aChandler Carruth // C++0x [class]p7: 650a8225449421e8c1e996a7c48300521028946482aChandler Carruth // A standard-layout class is a class that: 651a8225449421e8c1e996a7c48300521028946482aChandler Carruth // [...] 652a8225449421e8c1e996a7c48300521028946482aChandler Carruth // -- has the same access control for all non-static data members, 653a8225449421e8c1e996a7c48300521028946482aChandler Carruth switch (D->getAccess()) { 654a8225449421e8c1e996a7c48300521028946482aChandler Carruth case AS_private: data().HasPrivateFields = true; break; 655a8225449421e8c1e996a7c48300521028946482aChandler Carruth case AS_protected: data().HasProtectedFields = true; break; 656a8225449421e8c1e996a7c48300521028946482aChandler Carruth case AS_public: data().HasPublicFields = true; break; 657b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie case AS_none: llvm_unreachable("Invalid access specifier"); 658a8225449421e8c1e996a7c48300521028946482aChandler Carruth }; 659a8225449421e8c1e996a7c48300521028946482aChandler Carruth if ((data().HasPrivateFields + data().HasProtectedFields + 660a8225449421e8c1e996a7c48300521028946482aChandler Carruth data().HasPublicFields) > 1) 661ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth data().IsStandardLayout = false; 662a8225449421e8c1e996a7c48300521028946482aChandler Carruth 6632bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor // Keep track of the presence of mutable fields. 6642bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor if (Field->isMutable()) 6652bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor data().HasMutableFields = true; 666651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 667651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // C++11 [class.union]p8, DR1460: 668651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If X is a union, a non-static data member of X that is not an anonymous 669651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // union is a variant member of X. 670651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isUnion() && !Field->isAnonymousStructOrUnion()) 671651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines data().HasVariantMembers = true; 672651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 6734d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // C++0x [class]p9: 6749fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor // A POD struct is a class that is both a trivial class and a 6759fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor // standard-layout class, and has no non-static data members of type 6769fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor // non-POD struct, non-POD union (or array of such types). 677f85e193739c953358c865005855253af4f68a497John McCall // 678f85e193739c953358c865005855253af4f68a497John McCall // Automatic Reference Counting: the presence of a member of Objective-C pointer type 679f85e193739c953358c865005855253af4f68a497John McCall // that does not explicitly have no lifetime makes the class a non-POD. 6809fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor ASTContext &Context = getASTContext(); 6819fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor QualType T = Context.getBaseElementType(Field->getType()); 682f85e193739c953358c865005855253af4f68a497John McCall if (T->isObjCRetainableType() || T.isObjCGCStrong()) { 683176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!Context.getLangOpts().ObjCAutoRefCount) { 684f85e193739c953358c865005855253af4f68a497John McCall setHasObjectMember(true); 685176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else if (T.getObjCLifetime() != Qualifiers::OCL_ExplicitNone) { 686176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Objective-C Automatic Reference Counting: 687176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // If a class has a non-static data member of Objective-C pointer 688176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // type (or array thereof), it is a non-POD type and its 689176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // default constructor (if any), copy constructor, move constructor, 690176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // copy assignment operator, move assignment operator, and destructor are 691176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // non-trivial. 692176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines setHasObjectMember(true); 693176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct DefinitionData &Data = data(); 694176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Data.PlainOldData = false; 695176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Data.HasTrivialSpecialMembers = 0; 696176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Data.HasIrrelevantDestructor = false; 697176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 698654005265b1faab223f055bff3dd254476df7ff5Eli Friedman } else if (!T.isCXX98PODType(Context)) 6999fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor data().PlainOldData = false; 700f85e193739c953358c865005855253af4f68a497John McCall 701a8225449421e8c1e996a7c48300521028946482aChandler Carruth if (T->isReferenceType()) { 702d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith if (!Field->hasInClassInitializer()) 703d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith data().HasUninitializedReferenceMember = true; 7049b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth 705a8225449421e8c1e996a7c48300521028946482aChandler Carruth // C++0x [class]p7: 706a8225449421e8c1e996a7c48300521028946482aChandler Carruth // A standard-layout class is a class that: 707a8225449421e8c1e996a7c48300521028946482aChandler Carruth // -- has no non-static data members of type [...] reference, 708ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth data().IsStandardLayout = false; 709a8225449421e8c1e996a7c48300521028946482aChandler Carruth } 710a8225449421e8c1e996a7c48300521028946482aChandler Carruth 71186c3ae46250cdcc57778c27826060779a92f3815Richard Smith // Record if this field is the first non-literal or volatile field or base. 712a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith if (!T->isLiteralType(Context) || T.isVolatileQualified()) 7139b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth data().HasNonLiteralTypeFieldsOrBases = true; 7149b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth 715651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Field->hasInClassInitializer() || 716651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (Field->isAnonymousStructOrUnion() && 717651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Field->getType()->getAsCXXRecordDecl()->hasInClassInitializer())) { 718d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith data().HasInClassInitializer = true; 719d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith 720d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith // C++11 [class]p5: 7217a614d8380297fcd2bc23986241905d97222948cRichard Smith // A default constructor is trivial if [...] no non-static data member 7227a614d8380297fcd2bc23986241905d97222948cRichard Smith // of its class has a brace-or-equal-initializer. 7237d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor; 7247a614d8380297fcd2bc23986241905d97222948cRichard Smith 725d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith // C++11 [dcl.init.aggr]p1: 7267a614d8380297fcd2bc23986241905d97222948cRichard Smith // An aggregate is a [...] class with [...] no 7277a614d8380297fcd2bc23986241905d97222948cRichard Smith // brace-or-equal-initializers for non-static data members. 728c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith // 729c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith // This rule was removed in C++1y. 730176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!getASTContext().getLangOpts().CPlusPlus14) 731c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith data().Aggregate = false; 7327a614d8380297fcd2bc23986241905d97222948cRichard Smith 733d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith // C++11 [class]p10: 7347a614d8380297fcd2bc23986241905d97222948cRichard Smith // A POD struct is [...] a trivial class. 7357a614d8380297fcd2bc23986241905d97222948cRichard Smith data().PlainOldData = false; 7367a614d8380297fcd2bc23986241905d97222948cRichard Smith } 7377a614d8380297fcd2bc23986241905d97222948cRichard Smith 738bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // C++11 [class.copy]p23: 739bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // A defaulted copy/move assignment operator for a class X is defined 740bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // as deleted if X has: 741bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // -- a non-static data member of reference type 742bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith if (T->isReferenceType()) 743bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith data().DefaultedMoveAssignmentIsDeleted = true; 744bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith 74585606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor if (const RecordType *RecordTy = T->getAs<RecordType>()) { 74685606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor CXXRecordDecl* FieldRec = cast<CXXRecordDecl>(RecordTy->getDecl()); 74785606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor if (FieldRec->getDefinition()) { 748bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith addedClassSubobject(FieldRec); 749bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith 7507bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling // We may need to perform overload resolution to determine whether a 7517bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling // field can be moved if it's const or volatile qualified. 7527bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling if (T.getCVRQualifiers() & (Qualifiers::Const | Qualifiers::Volatile)) { 7537bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling data().NeedOverloadResolutionForMoveConstructor = true; 7547bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling data().NeedOverloadResolutionForMoveAssignment = true; 7557bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling } 7567bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling 757bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // C++11 [class.ctor]p5, C++11 [class.copy]p11: 758bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // A defaulted [special member] for a class X is defined as 759bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // deleted if: 760bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // -- X is a union-like class that has a variant member with a 761bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // non-trivial [corresponding special member] 762bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith if (isUnion()) { 763bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith if (FieldRec->hasNonTrivialMoveConstructor()) 764bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith data().DefaultedMoveConstructorIsDeleted = true; 765bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith if (FieldRec->hasNonTrivialMoveAssignment()) 766bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith data().DefaultedMoveAssignmentIsDeleted = true; 767bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith if (FieldRec->hasNonTrivialDestructor()) 768bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith data().DefaultedDestructorIsDeleted = true; 769bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith } 770bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith 771023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt // C++0x [class.ctor]p5: 7726180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith // A default constructor is trivial [...] if: 773023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt // -- for all the non-static data members of its class that are of 774023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt // class type (or array thereof), each such class has a trivial 775023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt // default constructor. 776023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt if (!FieldRec->hasTrivialDefaultConstructor()) 7777d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor; 7784d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth 7794d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // C++0x [class.copy]p13: 7804d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // A copy/move constructor for class X is trivial if [...] 7814d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // [...] 7824d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // -- for each non-static data member of X that is of class type (or 7834d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // an array thereof), the constructor selected to copy/move that 7844d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // member is trivial; 78585606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor if (!FieldRec->hasTrivialCopyConstructor()) 7867d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor; 787bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // If the field doesn't have a simple move constructor, we'll eagerly 788bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // declare the move constructor for this class and we'll decide whether 789bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // it's trivial then. 790426391cd51af86f9d59eceb0fb1c42153eccbb9aRichard Smith if (!FieldRec->hasTrivialMoveConstructor()) 7917d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor; 7924d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth 7934d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // C++0x [class.copy]p27: 7944d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // A copy/move assignment operator for class X is trivial if [...] 7954d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // [...] 7964d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // -- for each non-static data member of X that is of class type (or 7974d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // an array thereof), the assignment operator selected to 7984d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth // copy/move that member is trivial; 79985606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor if (!FieldRec->hasTrivialCopyAssignment()) 8007d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment; 801bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // If the field doesn't have a simple move assignment, we'll eagerly 802bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // declare the move assignment for this class and we'll decide whether 803bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // it's trivial then. 804426391cd51af86f9d59eceb0fb1c42153eccbb9aRichard Smith if (!FieldRec->hasTrivialMoveAssignment()) 8057d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment; 8064d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth 80785606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor if (!FieldRec->hasTrivialDestructor()) 8087d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith data().HasTrivialSpecialMembers &= ~SMF_Destructor; 809dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith if (!FieldRec->hasIrrelevantDestructor()) 810dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith data().HasIrrelevantDestructor = false; 811f85e193739c953358c865005855253af4f68a497John McCall if (FieldRec->hasObjectMember()) 812f85e193739c953358c865005855253af4f68a497John McCall setHasObjectMember(true); 8133ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian if (FieldRec->hasVolatileMember()) 8143ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian setHasVolatileMember(true); 815a8225449421e8c1e996a7c48300521028946482aChandler Carruth 816a8225449421e8c1e996a7c48300521028946482aChandler Carruth // C++0x [class]p7: 817a8225449421e8c1e996a7c48300521028946482aChandler Carruth // A standard-layout class is a class that: 818a8225449421e8c1e996a7c48300521028946482aChandler Carruth // -- has no non-static data members of type non-standard-layout 819a8225449421e8c1e996a7c48300521028946482aChandler Carruth // class (or array of such types) [...] 820ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth if (!FieldRec->isStandardLayout()) 821ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth data().IsStandardLayout = false; 822a8225449421e8c1e996a7c48300521028946482aChandler Carruth 823a8225449421e8c1e996a7c48300521028946482aChandler Carruth // C++0x [class]p7: 824a8225449421e8c1e996a7c48300521028946482aChandler Carruth // A standard-layout class is a class that: 825a8225449421e8c1e996a7c48300521028946482aChandler Carruth // [...] 826a8225449421e8c1e996a7c48300521028946482aChandler Carruth // -- has no base classes of the same type as the first non-static 827a8225449421e8c1e996a7c48300521028946482aChandler Carruth // data member. 828a8225449421e8c1e996a7c48300521028946482aChandler Carruth // We don't want to expend bits in the state of the record decl 829a8225449421e8c1e996a7c48300521028946482aChandler Carruth // tracking whether this is the first non-static data member so we 830a8225449421e8c1e996a7c48300521028946482aChandler Carruth // cheat a bit and use some of the existing state: the empty bit. 831a8225449421e8c1e996a7c48300521028946482aChandler Carruth // Virtual bases and virtual methods make a class non-empty, but they 832a8225449421e8c1e996a7c48300521028946482aChandler Carruth // also make it non-standard-layout so we needn't check here. 833a8225449421e8c1e996a7c48300521028946482aChandler Carruth // A non-empty base class may leave the class standard-layout, but not 834651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // if we have arrived here, and have at least one non-static data 835ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth // member. If IsStandardLayout remains true, then the first non-static 836a8225449421e8c1e996a7c48300521028946482aChandler Carruth // data member must come through here with Empty still true, and Empty 837a8225449421e8c1e996a7c48300521028946482aChandler Carruth // will subsequently be set to false below. 838ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth if (data().IsStandardLayout && data().Empty) { 839651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &BI : bases()) { 840651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Context.hasSameUnqualifiedType(BI.getType(), T)) { 841ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth data().IsStandardLayout = false; 842a8225449421e8c1e996a7c48300521028946482aChandler Carruth break; 843a8225449421e8c1e996a7c48300521028946482aChandler Carruth } 844a8225449421e8c1e996a7c48300521028946482aChandler Carruth } 845a8225449421e8c1e996a7c48300521028946482aChandler Carruth } 8462bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor 8472bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor // Keep track of the presence of mutable fields. 8482bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor if (FieldRec->hasMutableFields()) 8492bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor data().HasMutableFields = true; 8506180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 8516180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith // C++11 [class.copy]p13: 8526180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith // If the implicitly-defined constructor would satisfy the 8536180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith // requirements of a constexpr constructor, the implicitly-defined 8546180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith // constructor is constexpr. 8556180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith // C++11 [dcl.constexpr]p4: 8566180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith // -- every constructor involved in initializing non-static data 8576180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith // members [...] shall be a constexpr constructor 8586180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith if (!Field->hasInClassInitializer() && 859d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith !FieldRec->hasConstexprDefaultConstructor() && !isUnion()) 8606180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith // The standard requires any in-class initializer to be a constant 8616180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith // expression. We consider this to be a defect. 8626180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith data().DefaultedDefaultConstructorIsConstexpr = false; 863acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith 864acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // C++11 [class.copy]p8: 865acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // The implicitly-declared copy constructor for a class X will have 866acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // the form 'X::X(const X&)' if [...] for all the non-static data 867acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // members of X that are of a class type M (or array thereof), each 868acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // such class type has a copy constructor whose first parameter is 869acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // of type 'const M&' or 'const volatile M&'. 870acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith if (!FieldRec->hasCopyConstructorWithConstParam()) 871acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith data().ImplicitCopyConstructorHasConstParam = false; 872acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith 873acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // C++11 [class.copy]p18: 874acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // The implicitly-declared copy assignment oeprator for a class X will 875acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // have the form 'X& X::operator=(const X&)' if [...] for all the 876acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // non-static data members of X that are of a class type M (or array 877acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // thereof), each such class type has a copy assignment operator whose 878acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith // parameter is of type 'const M&', 'const volatile M&' or 'M'. 879acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith if (!FieldRec->hasCopyAssignmentWithConstParam()) 880acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith data().ImplicitCopyAssignmentHasConstParam = false; 881d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith 882d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith if (FieldRec->hasUninitializedReferenceMember() && 883d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith !Field->hasInClassInitializer()) 884d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith data().HasUninitializedReferenceMember = true; 885651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 886651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // C++11 [class.union]p8, DR1460: 887651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // a non-static data member of an anonymous union that is a member of 888651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // X is also a variant member of X. 889651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (FieldRec->hasVariantMembers() && 890651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Field->isAnonymousStructOrUnion()) 891651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines data().HasVariantMembers = true; 89285606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor } 8936180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith } else { 8946180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith // Base element type of field is a non-class type. 895a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith if (!T->isLiteralType(Context) || 896d3861ce75a308c65b58c0159e2cee58aea2dff1cRichard Smith (!Field->hasInClassInitializer() && !isUnion())) 8976180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith data().DefaultedDefaultConstructorIsConstexpr = false; 898bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith 899bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // C++11 [class.copy]p23: 900bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // A defaulted copy/move assignment operator for a class X is defined 901bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // as deleted if X has: 902bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // -- a non-static data member of const non-class type (or array 903bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith // thereof) 904bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith if (T.isConstQualified()) 905bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith data().DefaultedMoveAssignmentIsDeleted = true; 90685606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor } 907a8225449421e8c1e996a7c48300521028946482aChandler Carruth 908a8225449421e8c1e996a7c48300521028946482aChandler Carruth // C++0x [class]p7: 909a8225449421e8c1e996a7c48300521028946482aChandler Carruth // A standard-layout class is a class that: 910a8225449421e8c1e996a7c48300521028946482aChandler Carruth // [...] 911a8225449421e8c1e996a7c48300521028946482aChandler Carruth // -- either has no non-static data members in the most derived 912a8225449421e8c1e996a7c48300521028946482aChandler Carruth // class and at most one base class with non-static data members, 913a8225449421e8c1e996a7c48300521028946482aChandler Carruth // or has no base classes with non-static data members, and 914a8225449421e8c1e996a7c48300521028946482aChandler Carruth // At this point we know that we have a non-static data member, so the last 915a8225449421e8c1e996a7c48300521028946482aChandler Carruth // clause holds. 916a8225449421e8c1e996a7c48300521028946482aChandler Carruth if (!data().HasNoNonEmptyBases) 917ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth data().IsStandardLayout = false; 918a8225449421e8c1e996a7c48300521028946482aChandler Carruth 9192cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor // If this is not a zero-length bit-field, then the class is not empty. 9202cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor if (data().Empty) { 921a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith if (!Field->isBitField() || 922a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith (!Field->getBitWidth()->isTypeDependent() && 923a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith !Field->getBitWidth()->isValueDependent() && 924a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith Field->getBitWidthValue(Context) != 0)) 9252cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor data().Empty = false; 9262cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor } 9279fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor } 928e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor 929e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor // Handle using declarations of conversion functions. 930c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith if (UsingShadowDecl *Shadow = dyn_cast<UsingShadowDecl>(D)) { 931e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor if (Shadow->getDeclName().getNameKind() 932c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith == DeclarationName::CXXConversionFunctionName) { 933c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith ASTContext &Ctx = getASTContext(); 934c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith data().Conversions.get(Ctx).addDecl(Ctx, Shadow, Shadow->getAccess()); 935c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith } 936c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith } 93717d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos} 93817d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos 939ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smithvoid CXXRecordDecl::finishedDefaultedOrDeletedMember(CXXMethodDecl *D) { 940ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith assert(!D->isImplicit() && !D->isUserProvided()); 941ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith 942ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith // The kind of special member this declaration is, if any. 943ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith unsigned SMKind = 0; 944ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith 945ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) { 946ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith if (Constructor->isDefaultConstructor()) { 947ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith SMKind |= SMF_DefaultConstructor; 948ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith if (Constructor->isConstexpr()) 949ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith data().HasConstexprDefaultConstructor = true; 950ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith } 951ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith if (Constructor->isCopyConstructor()) 952ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith SMKind |= SMF_CopyConstructor; 953ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith else if (Constructor->isMoveConstructor()) 954ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith SMKind |= SMF_MoveConstructor; 955ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith else if (Constructor->isConstexpr()) 956ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith // We may now know that the constructor is constexpr. 957ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith data().HasConstexprNonCopyMoveConstructor = true; 958651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (isa<CXXDestructorDecl>(D)) { 959ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith SMKind |= SMF_Destructor; 960651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!D->isTrivial() || D->getAccess() != AS_public || D->isDeleted()) 961651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines data().HasIrrelevantDestructor = false; 962651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (D->isCopyAssignmentOperator()) 963ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith SMKind |= SMF_CopyAssignment; 964ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith else if (D->isMoveAssignmentOperator()) 965ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith SMKind |= SMF_MoveAssignment; 966ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith 967ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith // Update which trivial / non-trivial special members we have. 968ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith // addedMember will have skipped this step for this member. 969ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith if (D->isTrivial()) 970ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith data().HasTrivialSpecialMembers |= SMKind; 971ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith else 972ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith data().DeclaredNonTrivialSpecialMembers |= SMKind; 973ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith} 974ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith 97517d35c36fbae764fcd68fa8b31624078a033aabcJoao Matosbool CXXRecordDecl::isCLike() const { 97617d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos if (getTagKind() == TTK_Class || getTagKind() == TTK_Interface || 97717d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos !TemplateOrInstantiation.isNull()) 97817d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos return false; 97917d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos if (!hasDefinition()) 98017d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos return true; 981277b15684582193d26f6c15b40e90a6e45299857Argyrios Kyrtzidis 982c221411ad52edf93659392058341dfec4cdae4faArgyrios Kyrtzidis return isPOD() && data().HasOnlyCMembers; 983277b15684582193d26f6c15b40e90a6e45299857Argyrios Kyrtzidis} 984bef582b0159e8f0deb606c7700e3590a6f5a4ab2Faisal Vali 985fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Valibool CXXRecordDecl::isGenericLambda() const { 986bef582b0159e8f0deb606c7700e3590a6f5a4ab2Faisal Vali if (!isLambda()) return false; 987bef582b0159e8f0deb606c7700e3590a6f5a4ab2Faisal Vali return getLambdaData().IsGenericLambda; 988fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali} 989fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali 990fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal ValiCXXMethodDecl* CXXRecordDecl::getLambdaCallOperator() const { 9916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!isLambda()) return nullptr; 99256fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali DeclarationName Name = 99356fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali getASTContext().DeclarationNames.getCXXOperatorName(OO_Call); 9940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DeclContext::lookup_result Calls = lookup(Name); 99556fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali 99656fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali assert(!Calls.empty() && "Missing lambda call operator!"); 99756fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali assert(Calls.size() == 1 && "More than one lambda call operator!"); 99856fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali 99956fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali NamedDecl *CallOp = Calls.front(); 100056fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali if (FunctionTemplateDecl *CallOpTmpl = 100156fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali dyn_cast<FunctionTemplateDecl>(CallOp)) 100256fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali return cast<CXXMethodDecl>(CallOpTmpl->getTemplatedDecl()); 1003fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali 1004fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali return cast<CXXMethodDecl>(CallOp); 1005fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali} 1006fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali 1007fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal ValiCXXMethodDecl* CXXRecordDecl::getLambdaStaticInvoker() const { 10086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!isLambda()) return nullptr; 100956fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali DeclarationName Name = 101056fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali &getASTContext().Idents.get(getLambdaStaticInvokerName()); 10110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DeclContext::lookup_result Invoker = lookup(Name); 10126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Invoker.empty()) return nullptr; 101356fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali assert(Invoker.size() == 1 && "More than one static invoker operator!"); 101456fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali NamedDecl *InvokerFun = Invoker.front(); 101556fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali if (FunctionTemplateDecl *InvokerTemplate = 101656fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali dyn_cast<FunctionTemplateDecl>(InvokerFun)) 101756fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali return cast<CXXMethodDecl>(InvokerTemplate->getTemplatedDecl()); 101856fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali 1019d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali return cast<CXXMethodDecl>(InvokerFun); 1020fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali} 1021fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali 10224d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregorvoid CXXRecordDecl::getCaptureFields( 10234d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor llvm::DenseMap<const VarDecl *, FieldDecl *> &Captures, 102441105ad37a2de9bccfcd8137ccfa869cc8345275Eli Friedman FieldDecl *&ThisCapture) const { 10254d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor Captures.clear(); 10266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ThisCapture = nullptr; 10274d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor 1028da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor LambdaDefinitionData &Lambda = getLambdaData(); 10294d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor RecordDecl::field_iterator Field = field_begin(); 10306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (const LambdaCapture *C = Lambda.Captures, *CEnd = C + Lambda.NumCaptures; 10314d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor C != CEnd; ++C, ++Field) { 10320d8e9646bc000bab521ce52ed294209a92298cefRichard Smith if (C->capturesThis()) 1033581deb3da481053c4993c7600f97acf7768caac5David Blaikie ThisCapture = *Field; 10340d8e9646bc000bab521ce52ed294209a92298cefRichard Smith else if (C->capturesVariable()) 10350d8e9646bc000bab521ce52ed294209a92298cefRichard Smith Captures[C->getCapturedVar()] = *Field; 10364d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor } 103704fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith assert(Field == field_end()); 10384d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor} 10394d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor 1040fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal ValiTemplateParameterList * 1041fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal ValiCXXRecordDecl::getGenericLambdaTemplateParameterList() const { 10426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!isLambda()) return nullptr; 1043fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali CXXMethodDecl *CallOp = getLambdaCallOperator(); 1044fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali if (FunctionTemplateDecl *Tmpl = CallOp->getDescribedFunctionTemplate()) 1045fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali return Tmpl->getTemplateParameters(); 10466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 1047fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali} 10484d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor 1049b05b5f35f114505182b076aa70002843c0669bebJohn McCallstatic CanQualType GetConversionType(ASTContext &Context, NamedDecl *Conv) { 1050651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType T = 1051651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cast<CXXConversionDecl>(Conv->getUnderlyingDecl()->getAsFunction()) 1052651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ->getConversionType(); 1053b05b5f35f114505182b076aa70002843c0669bebJohn McCall return Context.getCanonicalType(T); 10540351a1e2e17c1edf27f90c23fbf65d8fcad995c4Fariborz Jahanian} 10550351a1e2e17c1edf27f90c23fbf65d8fcad995c4Fariborz Jahanian 1056b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// Collect the visible conversions of a base class. 1057b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// 1058a125350491ca56a2068e3ddcf96ffce007480b56James Dennett/// \param Record a base class of the class we're considering 1059b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// \param InVirtual whether this base class is a virtual base (or a base 1060b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// of a virtual base) 1061b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// \param Access the access along the inheritance path to this base 1062b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// \param ParentHiddenTypes the conversions provided by the inheritors 1063b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// of this base 1064b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// \param Output the set to which to add conversions from non-virtual bases 1065b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// \param VOutput the set to which to add conversions from virtual bases 1066b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// \param HiddenVBaseCs the set of conversions which were hidden in a 1067b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// virtual base along some inheritance path 1068b05b5f35f114505182b076aa70002843c0669bebJohn McCallstatic void CollectVisibleConversions(ASTContext &Context, 1069b05b5f35f114505182b076aa70002843c0669bebJohn McCall CXXRecordDecl *Record, 1070b05b5f35f114505182b076aa70002843c0669bebJohn McCall bool InVirtual, 1071b05b5f35f114505182b076aa70002843c0669bebJohn McCall AccessSpecifier Access, 1072b05b5f35f114505182b076aa70002843c0669bebJohn McCall const llvm::SmallPtrSet<CanQualType, 8> &ParentHiddenTypes, 10732a82ca255b0f99f6201a75ed52b91fc024f6e9cfArgyrios Kyrtzidis ASTUnresolvedSet &Output, 1074b05b5f35f114505182b076aa70002843c0669bebJohn McCall UnresolvedSetImpl &VOutput, 1075b05b5f35f114505182b076aa70002843c0669bebJohn McCall llvm::SmallPtrSet<NamedDecl*, 8> &HiddenVBaseCs) { 1076b05b5f35f114505182b076aa70002843c0669bebJohn McCall // The set of types which have conversions in this class or its 1077b05b5f35f114505182b076aa70002843c0669bebJohn McCall // subclasses. As an optimization, we don't copy the derived set 1078b05b5f35f114505182b076aa70002843c0669bebJohn McCall // unless it might change. 1079b05b5f35f114505182b076aa70002843c0669bebJohn McCall const llvm::SmallPtrSet<CanQualType, 8> *HiddenTypes = &ParentHiddenTypes; 1080b05b5f35f114505182b076aa70002843c0669bebJohn McCall llvm::SmallPtrSet<CanQualType, 8> HiddenTypesBuffer; 1081b05b5f35f114505182b076aa70002843c0669bebJohn McCall 1082b05b5f35f114505182b076aa70002843c0669bebJohn McCall // Collect the direct conversions and figure out which conversions 1083b05b5f35f114505182b076aa70002843c0669bebJohn McCall // will be hidden in the subclasses. 10849d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis CXXRecordDecl::conversion_iterator ConvI = Record->conversion_begin(); 10859d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis CXXRecordDecl::conversion_iterator ConvE = Record->conversion_end(); 10869d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis if (ConvI != ConvE) { 1087b05b5f35f114505182b076aa70002843c0669bebJohn McCall HiddenTypesBuffer = ParentHiddenTypes; 1088b05b5f35f114505182b076aa70002843c0669bebJohn McCall HiddenTypes = &HiddenTypesBuffer; 1089b05b5f35f114505182b076aa70002843c0669bebJohn McCall 10909d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis for (CXXRecordDecl::conversion_iterator I = ConvI; I != ConvE; ++I) { 1091f108c63ccc576fe6a3ca08399dbcec574b089ea8Richard Smith CanQualType ConvType(GetConversionType(Context, I.getDecl())); 1092f108c63ccc576fe6a3ca08399dbcec574b089ea8Richard Smith bool Hidden = ParentHiddenTypes.count(ConvType); 1093f108c63ccc576fe6a3ca08399dbcec574b089ea8Richard Smith if (!Hidden) 1094f108c63ccc576fe6a3ca08399dbcec574b089ea8Richard Smith HiddenTypesBuffer.insert(ConvType); 1095b05b5f35f114505182b076aa70002843c0669bebJohn McCall 1096b05b5f35f114505182b076aa70002843c0669bebJohn McCall // If this conversion is hidden and we're in a virtual base, 1097b05b5f35f114505182b076aa70002843c0669bebJohn McCall // remember that it's hidden along some inheritance path. 1098b05b5f35f114505182b076aa70002843c0669bebJohn McCall if (Hidden && InVirtual) 1099b05b5f35f114505182b076aa70002843c0669bebJohn McCall HiddenVBaseCs.insert(cast<NamedDecl>(I.getDecl()->getCanonicalDecl())); 1100b05b5f35f114505182b076aa70002843c0669bebJohn McCall 1101b05b5f35f114505182b076aa70002843c0669bebJohn McCall // If this conversion isn't hidden, add it to the appropriate output. 1102b05b5f35f114505182b076aa70002843c0669bebJohn McCall else if (!Hidden) { 1103b05b5f35f114505182b076aa70002843c0669bebJohn McCall AccessSpecifier IAccess 1104b05b5f35f114505182b076aa70002843c0669bebJohn McCall = CXXRecordDecl::MergeAccess(Access, I.getAccess()); 1105b05b5f35f114505182b076aa70002843c0669bebJohn McCall 1106b05b5f35f114505182b076aa70002843c0669bebJohn McCall if (InVirtual) 1107b05b5f35f114505182b076aa70002843c0669bebJohn McCall VOutput.addDecl(I.getDecl(), IAccess); 11086250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian else 11092a82ca255b0f99f6201a75ed52b91fc024f6e9cfArgyrios Kyrtzidis Output.addDecl(Context, I.getDecl(), IAccess); 11105346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian } 11115346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian } 11125346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian } 11139994a34f6cf842721ba7723edc0b9036229fe387Sebastian Redl 1114b05b5f35f114505182b076aa70002843c0669bebJohn McCall // Collect information recursively from any base classes. 1115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &I : Record->bases()) { 1116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const RecordType *RT = I.getType()->getAs<RecordType>(); 1117b05b5f35f114505182b076aa70002843c0669bebJohn McCall if (!RT) continue; 11189994a34f6cf842721ba7723edc0b9036229fe387Sebastian Redl 1119b05b5f35f114505182b076aa70002843c0669bebJohn McCall AccessSpecifier BaseAccess 1120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines = CXXRecordDecl::MergeAccess(Access, I.getAccessSpecifier()); 1121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool BaseInVirtual = InVirtual || I.isVirtual(); 11229994a34f6cf842721ba7723edc0b9036229fe387Sebastian Redl 1123b05b5f35f114505182b076aa70002843c0669bebJohn McCall CXXRecordDecl *Base = cast<CXXRecordDecl>(RT->getDecl()); 1124b05b5f35f114505182b076aa70002843c0669bebJohn McCall CollectVisibleConversions(Context, Base, BaseInVirtual, BaseAccess, 1125b05b5f35f114505182b076aa70002843c0669bebJohn McCall *HiddenTypes, Output, VOutput, HiddenVBaseCs); 11265346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian } 1127b05b5f35f114505182b076aa70002843c0669bebJohn McCall} 11289994a34f6cf842721ba7723edc0b9036229fe387Sebastian Redl 1129b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// Collect the visible conversions of a class. 1130b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// 1131b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// This would be extremely straightforward if it weren't for virtual 1132b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// bases. It might be worth special-casing that, really. 1133b05b5f35f114505182b076aa70002843c0669bebJohn McCallstatic void CollectVisibleConversions(ASTContext &Context, 1134b05b5f35f114505182b076aa70002843c0669bebJohn McCall CXXRecordDecl *Record, 11352a82ca255b0f99f6201a75ed52b91fc024f6e9cfArgyrios Kyrtzidis ASTUnresolvedSet &Output) { 1136b05b5f35f114505182b076aa70002843c0669bebJohn McCall // The collection of all conversions in virtual bases that we've 1137b05b5f35f114505182b076aa70002843c0669bebJohn McCall // found. These will be added to the output as long as they don't 1138b05b5f35f114505182b076aa70002843c0669bebJohn McCall // appear in the hidden-conversions set. 1139b05b5f35f114505182b076aa70002843c0669bebJohn McCall UnresolvedSet<8> VBaseCs; 1140b05b5f35f114505182b076aa70002843c0669bebJohn McCall 1141b05b5f35f114505182b076aa70002843c0669bebJohn McCall // The set of conversions in virtual bases that we've determined to 1142b05b5f35f114505182b076aa70002843c0669bebJohn McCall // be hidden. 1143b05b5f35f114505182b076aa70002843c0669bebJohn McCall llvm::SmallPtrSet<NamedDecl*, 8> HiddenVBaseCs; 1144b05b5f35f114505182b076aa70002843c0669bebJohn McCall 1145b05b5f35f114505182b076aa70002843c0669bebJohn McCall // The set of types hidden by classes derived from this one. 1146b05b5f35f114505182b076aa70002843c0669bebJohn McCall llvm::SmallPtrSet<CanQualType, 8> HiddenTypes; 1147b05b5f35f114505182b076aa70002843c0669bebJohn McCall 1148b05b5f35f114505182b076aa70002843c0669bebJohn McCall // Go ahead and collect the direct conversions and add them to the 1149b05b5f35f114505182b076aa70002843c0669bebJohn McCall // hidden-types set. 11509d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis CXXRecordDecl::conversion_iterator ConvI = Record->conversion_begin(); 11519d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis CXXRecordDecl::conversion_iterator ConvE = Record->conversion_end(); 11522a82ca255b0f99f6201a75ed52b91fc024f6e9cfArgyrios Kyrtzidis Output.append(Context, ConvI, ConvE); 11539d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis for (; ConvI != ConvE; ++ConvI) 11549d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis HiddenTypes.insert(GetConversionType(Context, ConvI.getDecl())); 1155b05b5f35f114505182b076aa70002843c0669bebJohn McCall 1156b05b5f35f114505182b076aa70002843c0669bebJohn McCall // Recursively collect conversions from base classes. 1157651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &I : Record->bases()) { 1158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const RecordType *RT = I.getType()->getAs<RecordType>(); 1159b05b5f35f114505182b076aa70002843c0669bebJohn McCall if (!RT) continue; 1160b05b5f35f114505182b076aa70002843c0669bebJohn McCall 1161b05b5f35f114505182b076aa70002843c0669bebJohn McCall CollectVisibleConversions(Context, cast<CXXRecordDecl>(RT->getDecl()), 1162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines I.isVirtual(), I.getAccessSpecifier(), 1163b05b5f35f114505182b076aa70002843c0669bebJohn McCall HiddenTypes, Output, VBaseCs, HiddenVBaseCs); 1164b05b5f35f114505182b076aa70002843c0669bebJohn McCall } 1165b05b5f35f114505182b076aa70002843c0669bebJohn McCall 1166b05b5f35f114505182b076aa70002843c0669bebJohn McCall // Add any unhidden conversions provided by virtual bases. 1167b05b5f35f114505182b076aa70002843c0669bebJohn McCall for (UnresolvedSetIterator I = VBaseCs.begin(), E = VBaseCs.end(); 1168b05b5f35f114505182b076aa70002843c0669bebJohn McCall I != E; ++I) { 1169b05b5f35f114505182b076aa70002843c0669bebJohn McCall if (!HiddenVBaseCs.count(cast<NamedDecl>(I.getDecl()->getCanonicalDecl()))) 11702a82ca255b0f99f6201a75ed52b91fc024f6e9cfArgyrios Kyrtzidis Output.addDecl(Context, I.getDecl(), I.getAccess()); 11715346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian } 11726250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian} 11736250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian 11746250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian/// getVisibleConversionFunctions - get all conversion functions visible 11756250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian/// in current class; including conversion function templates. 11760e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesllvm::iterator_range<CXXRecordDecl::conversion_iterator> 11779d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios KyrtzidisCXXRecordDecl::getVisibleConversionFunctions() { 1178c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith ASTContext &Ctx = getASTContext(); 1179c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith 1180c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith ASTUnresolvedSet *Set; 1181c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith if (bases_begin() == bases_end()) { 1182c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith // If root class, all conversions are visible. 1183c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith Set = &data().Conversions.get(Ctx); 1184c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith } else { 1185c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith Set = &data().VisibleConversions.get(Ctx); 1186c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith // If visible conversion list is not evaluated, evaluate it. 1187c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith if (!data().ComputedVisibleConversions) { 1188c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith CollectVisibleConversions(Ctx, this, *Set); 1189c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith data().ComputedVisibleConversions = true; 1190c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith } 11919d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis } 11920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return llvm::make_range(Set->begin(), Set->end()); 11935346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian} 11945346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian 119532daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCallvoid CXXRecordDecl::removeConversion(const NamedDecl *ConvDecl) { 119632daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall // This operation is O(N) but extremely rare. Sema only uses it to 119732daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall // remove UsingShadowDecls in a class that were followed by a direct 119832daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall // declaration, e.g.: 119932daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall // class A : B { 120032daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall // using B::operator int; 120132daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall // operator int(); 120232daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall // }; 120332daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall // This is uncommon by itself and even more uncommon in conjunction 120432daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall // with sufficiently large numbers of directly-declared conversions 120532daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall // that asymptotic behavior matters. 120632daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall 1207c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith ASTUnresolvedSet &Convs = data().Conversions.get(getASTContext()); 120832daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall for (unsigned I = 0, E = Convs.size(); I != E; ++I) { 120932daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall if (Convs[I].getDecl() == ConvDecl) { 121032daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall Convs.erase(I); 121132daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall assert(std::find(Convs.begin(), Convs.end(), ConvDecl) == Convs.end() 121232daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall && "conversion was found multiple times in unresolved set"); 121332daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall return; 121432daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall } 121532daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall } 12162f1bc5285ccd40f411af5f5993f013e27e74ab78Douglas Gregor 121732daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall llvm_unreachable("conversion not found in set!"); 121865ec1fda479688d143fe2403242cd9c730c800a1Douglas Gregor} 1219f8dcb866d344aa9355595e14c429852830b63095Fariborz Jahanian 1220f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas GregorCXXRecordDecl *CXXRecordDecl::getInstantiatedFromMemberClass() const { 1221b3ae4fcd4314a9c1c46d41b200883599c32025b4Douglas Gregor if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) 1222f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor return cast<CXXRecordDecl>(MSInfo->getInstantiatedFrom()); 12236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 12246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 1225f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor} 1226f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor 1227f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregorvoid 1228f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas GregorCXXRecordDecl::setInstantiationOfMemberClass(CXXRecordDecl *RD, 1229f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor TemplateSpecializationKind TSK) { 1230f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor assert(TemplateOrInstantiation.isNull() && 1231f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor "Previous template or instantiation?"); 1232b3617be53923ac3e5885ff5001aa748bd0223102Bill Wendling assert(!isa<ClassTemplatePartialSpecializationDecl>(this)); 1233f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor TemplateOrInstantiation 1234f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor = new (getASTContext()) MemberSpecializationInfo(RD, TSK); 1235f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor} 1236f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor 1237b13e357dac872bc7d507a770c4fb0f7b47ff0ac9Anders CarlssonTemplateSpecializationKind CXXRecordDecl::getTemplateSpecializationKind() const{ 1238b13e357dac872bc7d507a770c4fb0f7b47ff0ac9Anders Carlsson if (const ClassTemplateSpecializationDecl *Spec 1239f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor = dyn_cast<ClassTemplateSpecializationDecl>(this)) 1240f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor return Spec->getSpecializationKind(); 1241f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor 1242b3ae4fcd4314a9c1c46d41b200883599c32025b4Douglas Gregor if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) 1243f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor return MSInfo->getTemplateSpecializationKind(); 1244f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor 1245f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor return TSK_Undeclared; 1246f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor} 1247f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor 1248f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregorvoid 1249f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas GregorCXXRecordDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK) { 1250f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor if (ClassTemplateSpecializationDecl *Spec 1251f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor = dyn_cast<ClassTemplateSpecializationDecl>(this)) { 1252f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor Spec->setSpecializationKind(TSK); 1253f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor return; 1254f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor } 1255f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor 1256b3ae4fcd4314a9c1c46d41b200883599c32025b4Douglas Gregor if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) { 1257f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor MSInfo->setTemplateSpecializationKind(TSK); 1258f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor return; 1259f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor } 1260f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor 1261b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Not a class template or member class specialization"); 1262f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor} 1263f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor 1264176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesconst CXXRecordDecl *CXXRecordDecl::getTemplateInstantiationPattern() const { 1265176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // If it's a class template specialization, find the template or partial 1266176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // specialization from which it was instantiated. 1267176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(this)) { 1268176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines auto From = TD->getInstantiatedFrom(); 1269176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (auto *CTD = From.dyn_cast<ClassTemplateDecl *>()) { 1270176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines while (auto *NewCTD = CTD->getInstantiatedFromMemberTemplate()) { 1271176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (NewCTD->isMemberSpecialization()) 1272176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 1273176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CTD = NewCTD; 1274176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1275176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return CTD->getTemplatedDecl(); 1276176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1277176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (auto *CTPSD = 1278176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines From.dyn_cast<ClassTemplatePartialSpecializationDecl *>()) { 1279176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines while (auto *NewCTPSD = CTPSD->getInstantiatedFromMember()) { 1280176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (NewCTPSD->isMemberSpecialization()) 1281176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 1282176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CTPSD = NewCTPSD; 1283176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1284176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return CTPSD; 1285176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1286176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1287176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1288176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) { 1289176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) { 1290176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const CXXRecordDecl *RD = this; 1291176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines while (auto *NewRD = RD->getInstantiatedFromMemberClass()) 1292176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RD = NewRD; 1293176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return RD; 1294176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1295176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1296176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1297176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(!isTemplateInstantiation(this->getTemplateSpecializationKind()) && 1298176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "couldn't find pattern for class template instantiation"); 1299176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return nullptr; 1300176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 1301176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 13021d110e05e0ff48c1c7a483d6b7fd094cdf28316aDouglas GregorCXXDestructorDecl *CXXRecordDecl::getDestructor() const { 13031d110e05e0ff48c1c7a483d6b7fd094cdf28316aDouglas Gregor ASTContext &Context = getASTContext(); 13047267c1693abe7875b0c57268be05005ae013c6c9Anders Carlsson QualType ClassType = Context.getTypeDeclType(this); 13051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 13061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 130750d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor = Context.DeclarationNames.getCXXDestructorName( 130850d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor Context.getCanonicalType(ClassType)); 13097267c1693abe7875b0c57268be05005ae013c6c9Anders Carlsson 13100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DeclContext::lookup_result R = lookup(Name); 13113bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie if (R.empty()) 13126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 13131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 13143bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie CXXDestructorDecl *Dtor = cast<CXXDestructorDecl>(R.front()); 13157267c1693abe7875b0c57268be05005ae013c6c9Anders Carlsson return Dtor; 13167267c1693abe7875b0c57268be05005ae013c6c9Anders Carlsson} 13177267c1693abe7875b0c57268be05005ae013c6c9Anders Carlsson 1318da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregorvoid CXXRecordDecl::completeDefinition() { 13196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines completeDefinition(nullptr); 1320da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor} 1321da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 1322da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregorvoid CXXRecordDecl::completeDefinition(CXXFinalOverriderMap *FinalOverriders) { 1323da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor RecordDecl::completeDefinition(); 1324da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 13257a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor // If the class may be abstract (but hasn't been marked as such), check for 13267a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor // any pure final overriders. 13277a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor if (mayBeAbstract()) { 13287a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor CXXFinalOverriderMap MyFinalOverriders; 13297a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor if (!FinalOverriders) { 13307a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor getFinalOverriders(MyFinalOverriders); 13317a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor FinalOverriders = &MyFinalOverriders; 13327a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor } 13337a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor 13347a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor bool Done = false; 13357a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor for (CXXFinalOverriderMap::iterator M = FinalOverriders->begin(), 13367a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor MEnd = FinalOverriders->end(); 13377a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor M != MEnd && !Done; ++M) { 13387a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor for (OverridingMethods::iterator SO = M->second.begin(), 13397a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor SOEnd = M->second.end(); 13407a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor SO != SOEnd && !Done; ++SO) { 13417a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor assert(SO->second.size() > 0 && 13427a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor "All virtual functions have overridding virtual functions"); 13437a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor 13447a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor // C++ [class.abstract]p4: 13457a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor // A class is abstract if it contains or inherits at least one 13467a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor // pure virtual function for which the final overrider is pure 13477a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor // virtual. 13487a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor if (SO->second.front().Method->isPure()) { 13497a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor data().Abstract = true; 13507a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor Done = true; 13517a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor break; 13527a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor } 13537a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor } 13547a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor } 13557a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor } 1356e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor 1357e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor // Set access bits correctly on the directly-declared conversions. 1358c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith for (conversion_iterator I = conversion_begin(), E = conversion_end(); 1359e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor I != E; ++I) 13602a82ca255b0f99f6201a75ed52b91fc024f6e9cfArgyrios Kyrtzidis I.setAccess((*I)->getAccess()); 13617a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor} 13627a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor 13637a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregorbool CXXRecordDecl::mayBeAbstract() const { 13647a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor if (data().Abstract || isInvalidDecl() || !data().Polymorphic || 13657a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor isDependentContext()) 13667a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor return false; 13677a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor 1368651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &B : bases()) { 13697a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor CXXRecordDecl *BaseDecl 1370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines = cast<CXXRecordDecl>(B.getType()->getAs<RecordType>()->getDecl()); 13717a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor if (BaseDecl->isAbstract()) 13727a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor return true; 13737a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor } 13747a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor 13757a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor return false; 13767a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor} 13777a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor 137899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid CXXMethodDecl::anchor() { } 137999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 1380d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindolabool CXXMethodDecl::isStatic() const { 138172fdc8947e54be1a8dd36b03e24f112aba1241e1Rafael Espindola const CXXMethodDecl *MD = getCanonicalDecl(); 1382d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola 1383d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola if (MD->getStorageClass() == SC_Static) 1384d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola return true; 1385d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola 1386d1a32c328bce903fb1b17fc8147b646be818298eReid Kleckner OverloadedOperatorKind OOK = getDeclName().getCXXOverloadedOperator(); 1387d1a32c328bce903fb1b17fc8147b646be818298eReid Kleckner return isStaticOverloadedOperator(OOK); 1388d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola} 1389d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola 13900b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindolastatic bool recursivelyOverrides(const CXXMethodDecl *DerivedMD, 13910b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola const CXXMethodDecl *BaseMD) { 13920b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola for (CXXMethodDecl::method_iterator I = DerivedMD->begin_overridden_methods(), 13930b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola E = DerivedMD->end_overridden_methods(); I != E; ++I) { 13940b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola const CXXMethodDecl *MD = *I; 13950b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola if (MD->getCanonicalDecl() == BaseMD->getCanonicalDecl()) 13960b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola return true; 13970b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola if (recursivelyOverrides(MD, BaseMD)) 13980b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola return true; 13990b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola } 14000b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola return false; 14010b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola} 14020b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola 14030b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael EspindolaCXXMethodDecl * 14044e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan RoseCXXMethodDecl::getCorrespondingMethodInClass(const CXXRecordDecl *RD, 14054e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan Rose bool MayBeBase) { 14060b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola if (this->getParent()->getCanonicalDecl() == RD->getCanonicalDecl()) 14070b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola return this; 14080b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola 14090b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola // Lookup doesn't work for destructors, so handle them separately. 14100b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola if (isa<CXXDestructorDecl>(this)) { 14110b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola CXXMethodDecl *MD = RD->getDestructor(); 14124e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan Rose if (MD) { 14134e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan Rose if (recursivelyOverrides(MD, this)) 14144e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan Rose return MD; 14154e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan Rose if (MayBeBase && recursivelyOverrides(this, MD)) 14164e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan Rose return MD; 14174e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan Rose } 14186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 14190b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola } 14200b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola 14210e2c34f92f00628d48968dfea096d36381f494cbStephen Hines for (auto *ND : RD->lookup(getDeclName())) { 14220e2c34f92f00628d48968dfea096d36381f494cbStephen Hines CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(ND); 14230b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola if (!MD) 14240b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola continue; 14250b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola if (recursivelyOverrides(MD, this)) 14260b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola return MD; 14274e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan Rose if (MayBeBase && recursivelyOverrides(this, MD)) 14284e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan Rose return MD; 14290b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola } 14300b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola 1431651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &I : RD->bases()) { 1432651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const RecordType *RT = I.getType()->getAs<RecordType>(); 14330b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola if (!RT) 14340b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola continue; 14350b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola const CXXRecordDecl *Base = cast<CXXRecordDecl>(RT->getDecl()); 14360b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola CXXMethodDecl *T = this->getCorrespondingMethodInClass(Base); 14370b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola if (T) 14380b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola return T; 14390b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola } 14400b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola 14416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 14420b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola} 14430b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola 14444b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed KremenekCXXMethodDecl * 14454b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed KremenekCXXMethodDecl::Create(ASTContext &C, CXXRecordDecl *RD, 1446ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, 14472577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 1448a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall QualType T, TypeSourceInfo *TInfo, 1449d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola StorageClass SC, bool isInline, 1450af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith bool isConstexpr, SourceLocation EndLocation) { 14516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, RD) CXXMethodDecl(CXXMethod, C, RD, StartLoc, NameInfo, 14526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T, TInfo, SC, isInline, isConstexpr, 14536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines EndLocation); 14544b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek} 14554b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek 14561e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorCXXMethodDecl *CXXMethodDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 14576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) CXXMethodDecl(CXXMethod, C, nullptr, SourceLocation(), 14586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DeclarationNameInfo(), QualType(), nullptr, 1459651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SC_None, false, false, SourceLocation()); 14601e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 14611e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 14629091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregorbool CXXMethodDecl::isUsualDeallocationFunction() const { 14639091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor if (getOverloadedOperator() != OO_Delete && 14649091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor getOverloadedOperator() != OO_Array_Delete) 14659091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor return false; 14666d90870fe821a9b1a7822d3e28032042d03e5680Douglas Gregor 14676d90870fe821a9b1a7822d3e28032042d03e5680Douglas Gregor // C++ [basic.stc.dynamic.deallocation]p2: 14686d90870fe821a9b1a7822d3e28032042d03e5680Douglas Gregor // A template instance is never a usual deallocation function, 14696d90870fe821a9b1a7822d3e28032042d03e5680Douglas Gregor // regardless of its signature. 14706d90870fe821a9b1a7822d3e28032042d03e5680Douglas Gregor if (getPrimaryTemplate()) 14716d90870fe821a9b1a7822d3e28032042d03e5680Douglas Gregor return false; 14726d90870fe821a9b1a7822d3e28032042d03e5680Douglas Gregor 14739091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor // C++ [basic.stc.dynamic.deallocation]p2: 14749091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor // If a class T has a member deallocation function named operator delete 14759091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor // with exactly one parameter, then that function is a usual (non-placement) 14769091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor // deallocation function. [...] 14779091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor if (getNumParams() == 1) 14789091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor return true; 14799091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor 14809091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor // C++ [basic.stc.dynamic.deallocation]p2: 14819091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor // [...] If class T does not declare such an operator delete but does 14829091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor // declare a member deallocation function named operator delete with 14839091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor // exactly two parameters, the second of which has type std::size_t (18.1), 14849091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor // then this function is a usual deallocation function. 14859091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor ASTContext &Context = getASTContext(); 14869091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor if (getNumParams() != 2 || 1487e228ba97c9aff14dcf788773b8af455b9d85f210Chandler Carruth !Context.hasSameUnqualifiedType(getParamDecl(1)->getType(), 1488e228ba97c9aff14dcf788773b8af455b9d85f210Chandler Carruth Context.getSizeType())) 14899091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor return false; 14909091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor 14919091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor // This function is a usual deallocation function if there are no 14929091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor // single-parameter deallocation functions of the same kind. 14930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DeclContext::lookup_result R = getDeclContext()->lookup(getDeclName()); 14940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines for (DeclContext::lookup_result::iterator I = R.begin(), E = R.end(); 14953bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie I != E; ++I) { 14963bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*I)) 14979091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor if (FD->getNumParams() == 1) 14989091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor return false; 14999091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor } 15009091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor 15019091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor return true; 15029091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor} 15039091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor 150406a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregorbool CXXMethodDecl::isCopyAssignmentOperator() const { 1505ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt // C++0x [class.copy]p17: 150606a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor // A user-declared copy assignment operator X::operator= is a non-static 150706a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor // non-template member function of class X with exactly one parameter of 150806a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor // type X, X&, const X&, volatile X& or const volatile X&. 150906a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor if (/*operator=*/getOverloadedOperator() != OO_Equal || 151006a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor /*non-static*/ isStatic() || 1511fcb5a251e9c0c8c2d54323677d4f2ba5219301d0Eli Friedman /*non-template*/getPrimaryTemplate() || getDescribedFunctionTemplate() || 1512fcb5a251e9c0c8c2d54323677d4f2ba5219301d0Eli Friedman getNumParams() != 1) 151306a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor return false; 151406a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor 151506a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor QualType ParamType = getParamDecl(0)->getType(); 151606a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor if (const LValueReferenceType *Ref = ParamType->getAs<LValueReferenceType>()) 151706a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor ParamType = Ref->getPointeeType(); 151806a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor 151906a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor ASTContext &Context = getASTContext(); 152006a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor QualType ClassType 152106a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor = Context.getCanonicalType(Context.getTypeDeclType(getParent())); 152206a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor return Context.hasSameUnqualifiedType(ClassType, ParamType); 152306a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor} 152406a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor 1525ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Huntbool CXXMethodDecl::isMoveAssignmentOperator() const { 1526ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt // C++0x [class.copy]p19: 1527ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt // A user-declared move assignment operator X::operator= is a non-static 1528ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt // non-template member function of class X with exactly one parameter of type 1529ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt // X&&, const X&&, volatile X&&, or const volatile X&&. 1530ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt if (getOverloadedOperator() != OO_Equal || isStatic() || 1531fcb5a251e9c0c8c2d54323677d4f2ba5219301d0Eli Friedman getPrimaryTemplate() || getDescribedFunctionTemplate() || 1532fcb5a251e9c0c8c2d54323677d4f2ba5219301d0Eli Friedman getNumParams() != 1) 1533ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt return false; 1534ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt 1535ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt QualType ParamType = getParamDecl(0)->getType(); 1536ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt if (!isa<RValueReferenceType>(ParamType)) 1537ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt return false; 1538ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt ParamType = ParamType->getPointeeType(); 1539ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt 1540ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt ASTContext &Context = getASTContext(); 1541ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt QualType ClassType 1542ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt = Context.getCanonicalType(Context.getTypeDeclType(getParent())); 1543ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt return Context.hasSameUnqualifiedType(ClassType, ParamType); 1544ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt} 1545ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt 154605eb24474218d70366b4d7d6b5b19dda2473a163Anders Carlssonvoid CXXMethodDecl::addOverriddenMethod(const CXXMethodDecl *MD) { 15473aaf486af649d6be464e6b937c8181529ffef931Anders Carlsson assert(MD->isCanonicalDecl() && "Method is not canonical!"); 1548c076c450e4fdc7be27c8541b273451f28345044aAnders Carlsson assert(!MD->getParent()->isDependentContext() && 1549c076c450e4fdc7be27c8541b273451f28345044aAnders Carlsson "Can't add an overridden method to a class template!"); 1550540659e102670e08773986862b191ed2c46a0e86Eli Friedman assert(MD->isVirtual() && "Method is not virtual!"); 1551c076c450e4fdc7be27c8541b273451f28345044aAnders Carlsson 15527d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor getASTContext().addOverriddenMethod(this, MD); 155305eb24474218d70366b4d7d6b5b19dda2473a163Anders Carlsson} 155405eb24474218d70366b4d7d6b5b19dda2473a163Anders Carlsson 155505eb24474218d70366b4d7d6b5b19dda2473a163Anders CarlssonCXXMethodDecl::method_iterator CXXMethodDecl::begin_overridden_methods() const { 15566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (isa<CXXConstructorDecl>(this)) return nullptr; 15577d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor return getASTContext().overridden_methods_begin(this); 155805eb24474218d70366b4d7d6b5b19dda2473a163Anders Carlsson} 155905eb24474218d70366b4d7d6b5b19dda2473a163Anders Carlsson 156005eb24474218d70366b4d7d6b5b19dda2473a163Anders CarlssonCXXMethodDecl::method_iterator CXXMethodDecl::end_overridden_methods() const { 15616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (isa<CXXConstructorDecl>(this)) return nullptr; 15627d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor return getASTContext().overridden_methods_end(this); 156305eb24474218d70366b4d7d6b5b19dda2473a163Anders Carlsson} 156405eb24474218d70366b4d7d6b5b19dda2473a163Anders Carlsson 1565c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidisunsigned CXXMethodDecl::size_overridden_methods() const { 1566540659e102670e08773986862b191ed2c46a0e86Eli Friedman if (isa<CXXConstructorDecl>(this)) return 0; 1567c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis return getASTContext().overridden_methods_size(this); 1568c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis} 1569c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis 15704b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed KremenekQualType CXXMethodDecl::getThisType(ASTContext &C) const { 1571b0d178d78fd9a67627b89a7e2dafde2c93fbcd1cArgyrios Kyrtzidis // C++ 9.3.2p1: The type of this in a member function of a class X is X*. 1572b0d178d78fd9a67627b89a7e2dafde2c93fbcd1cArgyrios Kyrtzidis // If the member function is declared const, the type of this is const X*, 1573b0d178d78fd9a67627b89a7e2dafde2c93fbcd1cArgyrios Kyrtzidis // if the member function is declared volatile, the type of this is 1574b0d178d78fd9a67627b89a7e2dafde2c93fbcd1cArgyrios Kyrtzidis // volatile X*, and if the member function is declared const volatile, 1575b0d178d78fd9a67627b89a7e2dafde2c93fbcd1cArgyrios Kyrtzidis // the type of this is const volatile X*. 1576b0d178d78fd9a67627b89a7e2dafde2c93fbcd1cArgyrios Kyrtzidis 15774b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek assert(isInstance() && "No 'this' for static methods!"); 157831a08752eda39ca17154538e2f2587f8d339a1faAnders Carlsson 15793cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall QualType ClassTy = C.getTypeDeclType(getParent()); 15800953e767ff7817f97b3ab20896b229891eeff45bJohn McCall ClassTy = C.getQualifiedType(ClassTy, 15810953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Qualifiers::fromCVRMask(getTypeQualifiers())); 15824e579922ada4e19618710878c32543322f86c9c8Anders Carlsson return C.getPointerType(ClassTy); 15834b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek} 15844b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek 1585d7d7f67c1dd8626520bb243d3928f59d32424534Eli Friedmanbool CXXMethodDecl::hasInlineBody() const { 1586bd6d6197fcfc98356ea60e816365eb0648b69556Douglas Gregor // If this function is a template instantiation, look at the template from 1587bd6d6197fcfc98356ea60e816365eb0648b69556Douglas Gregor // which it was instantiated. 1588bd6d6197fcfc98356ea60e816365eb0648b69556Douglas Gregor const FunctionDecl *CheckFn = getTemplateInstantiationPattern(); 1589bd6d6197fcfc98356ea60e816365eb0648b69556Douglas Gregor if (!CheckFn) 1590bd6d6197fcfc98356ea60e816365eb0648b69556Douglas Gregor CheckFn = this; 1591bd6d6197fcfc98356ea60e816365eb0648b69556Douglas Gregor 1592d7d7f67c1dd8626520bb243d3928f59d32424534Eli Friedman const FunctionDecl *fn; 159306a54a38be5054c910ffc92db60edab23f9ea105Argyrios Kyrtzidis return CheckFn->hasBody(fn) && !fn->isOutOfLine(); 1594d7d7f67c1dd8626520bb243d3928f59d32424534Eli Friedman} 1595d7d7f67c1dd8626520bb243d3928f59d32424534Eli Friedman 159627dd7d962bbf774988bc5e59d04a7743ed503514Douglas Gregorbool CXXMethodDecl::isLambdaStaticInvoker() const { 1597d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali const CXXRecordDecl *P = getParent(); 1598d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali if (P->isLambda()) { 1599d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali if (const CXXMethodDecl *StaticInvoker = P->getLambdaStaticInvoker()) { 1600d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali if (StaticInvoker == this) return true; 1601d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali if (P->isGenericLambda() && this->isFunctionTemplateSpecialization()) 1602d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali return StaticInvoker == this->getPrimaryTemplate()->getTemplatedDecl(); 1603d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali } 1604d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali } 1605d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali return false; 160627dd7d962bbf774988bc5e59d04a7743ed503514Douglas Gregor} 160727dd7d962bbf774988bc5e59d04a7743ed503514Douglas Gregor 1608cbb67480094b3bcb5b715acd827cbad55e2a204cSean HuntCXXCtorInitializer::CXXCtorInitializer(ASTContext &Context, 1609cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt TypeSourceInfo *TInfo, bool IsVirtual, 1610cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt SourceLocation L, Expr *Init, 1611cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt SourceLocation R, 1612cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt SourceLocation EllipsisLoc) 1613f51d0b6c2f5abd09d3a7ba907a3d9b7a43752f3dSean Hunt : Initializee(TInfo), MemberOrEllipsisLocation(EllipsisLoc), Init(Init), 161476852c218a207ef43583515cb835b6e855353a0fDouglas Gregor LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(IsVirtual), 161576852c218a207ef43583515cb835b6e855353a0fDouglas Gregor IsWritten(false), SourceOrderOrNumArrayIndices(0) 1616802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor{ 16177ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor} 16187ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor 1619cbb67480094b3bcb5b715acd827cbad55e2a204cSean HuntCXXCtorInitializer::CXXCtorInitializer(ASTContext &Context, 1620cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt FieldDecl *Member, 1621cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt SourceLocation MemberLoc, 1622cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt SourceLocation L, Expr *Init, 1623cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt SourceLocation R) 1624f51d0b6c2f5abd09d3a7ba907a3d9b7a43752f3dSean Hunt : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init), 162576852c218a207ef43583515cb835b6e855353a0fDouglas Gregor LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false), 162600eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet IsWritten(false), SourceOrderOrNumArrayIndices(0) 162700eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet{ 162800eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet} 162900eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet 1630cbb67480094b3bcb5b715acd827cbad55e2a204cSean HuntCXXCtorInitializer::CXXCtorInitializer(ASTContext &Context, 1631cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt IndirectFieldDecl *Member, 1632cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt SourceLocation MemberLoc, 1633cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt SourceLocation L, Expr *Init, 1634cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt SourceLocation R) 1635f51d0b6c2f5abd09d3a7ba907a3d9b7a43752f3dSean Hunt : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init), 163676852c218a207ef43583515cb835b6e855353a0fDouglas Gregor LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false), 1637a0af3b453160fc4c67363c204da13820b0586909Abramo Bagnara IsWritten(false), SourceOrderOrNumArrayIndices(0) 1638802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor{ 16397ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor} 16407ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor 1641cbb67480094b3bcb5b715acd827cbad55e2a204cSean HuntCXXCtorInitializer::CXXCtorInitializer(ASTContext &Context, 164276852c218a207ef43583515cb835b6e855353a0fDouglas Gregor TypeSourceInfo *TInfo, 164376852c218a207ef43583515cb835b6e855353a0fDouglas Gregor SourceLocation L, Expr *Init, 16444171766318a2564fbc9a739be0a2851f441c0d29Sean Hunt SourceLocation R) 164576852c218a207ef43583515cb835b6e855353a0fDouglas Gregor : Initializee(TInfo), MemberOrEllipsisLocation(), Init(Init), 164676852c218a207ef43583515cb835b6e855353a0fDouglas Gregor LParenLoc(L), RParenLoc(R), IsDelegating(true), IsVirtual(false), 16474171766318a2564fbc9a739be0a2851f441c0d29Sean Hunt IsWritten(false), SourceOrderOrNumArrayIndices(0) 16484171766318a2564fbc9a739be0a2851f441c0d29Sean Hunt{ 16494171766318a2564fbc9a739be0a2851f441c0d29Sean Hunt} 16504171766318a2564fbc9a739be0a2851f441c0d29Sean Hunt 16514171766318a2564fbc9a739be0a2851f441c0d29Sean HuntCXXCtorInitializer::CXXCtorInitializer(ASTContext &Context, 1652cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt FieldDecl *Member, 1653cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt SourceLocation MemberLoc, 1654cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt SourceLocation L, Expr *Init, 1655cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt SourceLocation R, 1656cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt VarDecl **Indices, 1657cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt unsigned NumIndices) 1658f51d0b6c2f5abd09d3a7ba907a3d9b7a43752f3dSean Hunt : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init), 1659176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false), 1660a0af3b453160fc4c67363c204da13820b0586909Abramo Bagnara IsWritten(false), SourceOrderOrNumArrayIndices(NumIndices) 1661fb8cc253420e93cee33d29df5a2bdae6aaf16e39Douglas Gregor{ 1662fb8cc253420e93cee33d29df5a2bdae6aaf16e39Douglas Gregor VarDecl **MyIndices = reinterpret_cast<VarDecl **> (this + 1); 1663fb8cc253420e93cee33d29df5a2bdae6aaf16e39Douglas Gregor memcpy(MyIndices, Indices, NumIndices * sizeof(VarDecl *)); 1664fb8cc253420e93cee33d29df5a2bdae6aaf16e39Douglas Gregor} 1665fb8cc253420e93cee33d29df5a2bdae6aaf16e39Douglas Gregor 1666cbb67480094b3bcb5b715acd827cbad55e2a204cSean HuntCXXCtorInitializer *CXXCtorInitializer::Create(ASTContext &Context, 1667cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt FieldDecl *Member, 1668cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt SourceLocation MemberLoc, 1669cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt SourceLocation L, Expr *Init, 1670cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt SourceLocation R, 1671cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt VarDecl **Indices, 1672cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt unsigned NumIndices) { 1673cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt void *Mem = Context.Allocate(sizeof(CXXCtorInitializer) + 1674fb8cc253420e93cee33d29df5a2bdae6aaf16e39Douglas Gregor sizeof(VarDecl *) * NumIndices, 1675cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt llvm::alignOf<CXXCtorInitializer>()); 1676f51d0b6c2f5abd09d3a7ba907a3d9b7a43752f3dSean Hunt return new (Mem) CXXCtorInitializer(Context, Member, MemberLoc, L, Init, R, 1677f51d0b6c2f5abd09d3a7ba907a3d9b7a43752f3dSean Hunt Indices, NumIndices); 1678fb8cc253420e93cee33d29df5a2bdae6aaf16e39Douglas Gregor} 1679fb8cc253420e93cee33d29df5a2bdae6aaf16e39Douglas Gregor 1680cbb67480094b3bcb5b715acd827cbad55e2a204cSean HuntTypeLoc CXXCtorInitializer::getBaseClassLoc() const { 1681802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor if (isBaseInitializer()) 1682f51d0b6c2f5abd09d3a7ba907a3d9b7a43752f3dSean Hunt return Initializee.get<TypeSourceInfo*>()->getTypeLoc(); 1683802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor else 1684802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor return TypeLoc(); 1685802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor} 1686802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor 1687cbb67480094b3bcb5b715acd827cbad55e2a204cSean Huntconst Type *CXXCtorInitializer::getBaseClass() const { 1688802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor if (isBaseInitializer()) 1689f51d0b6c2f5abd09d3a7ba907a3d9b7a43752f3dSean Hunt return Initializee.get<TypeSourceInfo*>()->getType().getTypePtr(); 1690802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor else 16916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 1692802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor} 1693802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor 1694cbb67480094b3bcb5b715acd827cbad55e2a204cSean HuntSourceLocation CXXCtorInitializer::getSourceLocation() const { 16957a614d8380297fcd2bc23986241905d97222948cRichard Smith if (isInClassMemberInitializer()) 16967a614d8380297fcd2bc23986241905d97222948cRichard Smith return getAnyMember()->getLocation(); 1697802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor 16980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (isAnyMemberInitializer()) 16990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return getMemberLocation(); 17000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 170176852c218a207ef43583515cb835b6e855353a0fDouglas Gregor if (TypeSourceInfo *TSInfo = Initializee.get<TypeSourceInfo*>()) 170276852c218a207ef43583515cb835b6e855353a0fDouglas Gregor return TSInfo->getTypeLoc().getLocalSourceRange().getBegin(); 170376852c218a207ef43583515cb835b6e855353a0fDouglas Gregor 170476852c218a207ef43583515cb835b6e855353a0fDouglas Gregor return SourceLocation(); 1705802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor} 1706802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor 1707cbb67480094b3bcb5b715acd827cbad55e2a204cSean HuntSourceRange CXXCtorInitializer::getSourceRange() const { 17087a614d8380297fcd2bc23986241905d97222948cRichard Smith if (isInClassMemberInitializer()) { 17097a614d8380297fcd2bc23986241905d97222948cRichard Smith FieldDecl *D = getAnyMember(); 17107a614d8380297fcd2bc23986241905d97222948cRichard Smith if (Expr *I = D->getInClassInitializer()) 17117a614d8380297fcd2bc23986241905d97222948cRichard Smith return I->getSourceRange(); 17127a614d8380297fcd2bc23986241905d97222948cRichard Smith return SourceRange(); 17137a614d8380297fcd2bc23986241905d97222948cRichard Smith } 17147a614d8380297fcd2bc23986241905d97222948cRichard Smith 1715802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor return SourceRange(getSourceLocation(), getRParenLoc()); 17167ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor} 17177ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor 171899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid CXXConstructorDecl::anchor() { } 171999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 1720b48fe3812047e84164925c8938ce82be0624c40cDouglas GregorCXXConstructorDecl * 17211e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorCXXConstructorDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 17226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) CXXConstructorDecl(C, nullptr, SourceLocation(), 1723651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DeclarationNameInfo(), QualType(), 17246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nullptr, false, false, false, false); 17256ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 17266ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 17276ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris LattnerCXXConstructorDecl * 1728b48fe3812047e84164925c8938ce82be0624c40cDouglas GregorCXXConstructorDecl::Create(ASTContext &C, CXXRecordDecl *RD, 1729ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, 17302577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 1731a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall QualType T, TypeSourceInfo *TInfo, 1732af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith bool isExplicit, bool isInline, 1733af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith bool isImplicitlyDeclared, bool isConstexpr) { 17342577743c5650c646fb705df01403707e94f2df04Abramo Bagnara assert(NameInfo.getName().getNameKind() 17352577743c5650c646fb705df01403707e94f2df04Abramo Bagnara == DeclarationName::CXXConstructorName && 17362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor "Name must refer to a constructor"); 17376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, RD) CXXConstructorDecl(C, RD, StartLoc, NameInfo, T, TInfo, 1738651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines isExplicit, isInline, 1739651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines isImplicitlyDeclared, isConstexpr); 1740b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor} 1741b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor 17423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga NainarCXXConstructorDecl::init_const_iterator CXXConstructorDecl::init_begin() const { 17433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return CtorInitializers.get(getASTContext().getExternalSource()); 17443ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 17453ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 174676852c218a207ef43583515cb835b6e855353a0fDouglas GregorCXXConstructorDecl *CXXConstructorDecl::getTargetConstructor() const { 174776852c218a207ef43583515cb835b6e855353a0fDouglas Gregor assert(isDelegatingConstructor() && "Not a delegating constructor!"); 174876852c218a207ef43583515cb835b6e855353a0fDouglas Gregor Expr *E = (*init_begin())->getInit()->IgnoreImplicit(); 174976852c218a207ef43583515cb835b6e855353a0fDouglas Gregor if (CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(E)) 175076852c218a207ef43583515cb835b6e855353a0fDouglas Gregor return Construct->getConstructor(); 17516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 17526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 175376852c218a207ef43583515cb835b6e855353a0fDouglas Gregor} 175476852c218a207ef43583515cb835b6e855353a0fDouglas Gregor 1755030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregorbool CXXConstructorDecl::isDefaultConstructor() const { 1756030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor // C++ [class.ctor]p5: 175764bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor // A default constructor for a class X is a constructor of class 175864bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor // X that can be called without an argument. 1759030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor return (getNumParams() == 0) || 1760da3f4e2dd5938145f132be237a2ed5914cc86702Anders Carlsson (getNumParams() > 0 && getParamDecl(0)->hasDefaultArg()); 1761030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor} 1762030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor 17631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool 17649e9199d8649cf3e10c98a69403f05dbb666d8fb1Douglas GregorCXXConstructorDecl::isCopyConstructor(unsigned &TypeQuals) const { 1765cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor return isCopyOrMoveConstructor(TypeQuals) && 1766cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor getParamDecl(0)->getType()->isLValueReferenceType(); 1767cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor} 1768cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor 1769cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregorbool CXXConstructorDecl::isMoveConstructor(unsigned &TypeQuals) const { 1770cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor return isCopyOrMoveConstructor(TypeQuals) && 1771cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor getParamDecl(0)->getType()->isRValueReferenceType(); 1772cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor} 1773cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor 1774cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor/// \brief Determine whether this is a copy or move constructor. 1775cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregorbool CXXConstructorDecl::isCopyOrMoveConstructor(unsigned &TypeQuals) const { 1776030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor // C++ [class.copy]p2: 177764bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor // A non-template constructor for class X is a copy constructor 177864bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor // if its first parameter is of type X&, const X&, volatile X& or 177964bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor // const volatile X&, and either there are no other parameters 178064bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor // or else all other parameters have default arguments (8.3.6). 1781cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor // C++0x [class.copy]p3: 1782cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor // A non-template constructor for class X is a move constructor if its 1783cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor // first parameter is of type X&&, const X&&, volatile X&&, or 1784cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor // const volatile X&&, and either there are no other parameters or else 1785cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor // all other parameters have default arguments. 1786030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor if ((getNumParams() < 1) || 178777da3f4815069dbd029823edb072425551143cb1Douglas Gregor (getNumParams() > 1 && !getParamDecl(1)->hasDefaultArg()) || 17886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (getPrimaryTemplate() != nullptr) || 17896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (getDescribedFunctionTemplate() != nullptr)) 1790030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor return false; 1791cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor 1792030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor const ParmVarDecl *Param = getParamDecl(0); 1793cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor 1794cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor // Do we have a reference type? 1795cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor const ReferenceType *ParamRefType = Param->getType()->getAs<ReferenceType>(); 1796fd47648b5d351ff6d1a3e886e1c3d10712ba4675Douglas Gregor if (!ParamRefType) 1797fd47648b5d351ff6d1a3e886e1c3d10712ba4675Douglas Gregor return false; 1798cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor 1799fd47648b5d351ff6d1a3e886e1c3d10712ba4675Douglas Gregor // Is it a reference to our class type? 18009e9199d8649cf3e10c98a69403f05dbb666d8fb1Douglas Gregor ASTContext &Context = getASTContext(); 18019e9199d8649cf3e10c98a69403f05dbb666d8fb1Douglas Gregor 1802fd47648b5d351ff6d1a3e886e1c3d10712ba4675Douglas Gregor CanQualType PointeeType 1803fd47648b5d351ff6d1a3e886e1c3d10712ba4675Douglas Gregor = Context.getCanonicalType(ParamRefType->getPointeeType()); 180414e0b3d8a58d8e2d6d154c17f13e9881d3740784Douglas Gregor CanQualType ClassTy 180514e0b3d8a58d8e2d6d154c17f13e9881d3740784Douglas Gregor = Context.getCanonicalType(Context.getTagDeclType(getParent())); 1806030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor if (PointeeType.getUnqualifiedType() != ClassTy) 1807030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor return false; 1808cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor 18090953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // FIXME: other qualifiers? 1810cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor 1811cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor // We have a copy or move constructor. 1812030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor TypeQuals = PointeeType.getCVRQualifiers(); 1813cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor return true; 1814030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor} 1815030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor 1816faccd72e2448b552f17992eaba6cfe12ec497e58Anders Carlssonbool CXXConstructorDecl::isConvertingConstructor(bool AllowExplicit) const { 181760d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor // C++ [class.conv.ctor]p1: 181860d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor // A constructor declared without the function-specifier explicit 181960d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor // that can be called with a single parameter specifies a 182060d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor // conversion from the type of its first parameter to the type of 182160d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor // its class. Such a constructor is called a converting 182260d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor // constructor. 1823faccd72e2448b552f17992eaba6cfe12ec497e58Anders Carlsson if (isExplicit() && !AllowExplicit) 182460d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor return false; 182560d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor 18261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return (getNumParams() == 0 && 1827183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall getType()->getAs<FunctionProtoType>()->isVariadic()) || 182860d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor (getNumParams() == 1) || 1829113c4448003ff6fd76eaabde08d3ebfffd8a327aDouglas Gregor (getNumParams() > 1 && 1830113c4448003ff6fd76eaabde08d3ebfffd8a327aDouglas Gregor (getParamDecl(1)->hasDefaultArg() || 1831113c4448003ff6fd76eaabde08d3ebfffd8a327aDouglas Gregor getParamDecl(1)->isParameterPack())); 183260d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor} 1833b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor 18346493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregorbool CXXConstructorDecl::isSpecializationCopyingObject() const { 183566724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor if ((getNumParams() < 1) || 183666724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor (getNumParams() > 1 && !getParamDecl(1)->hasDefaultArg()) || 18376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (getDescribedFunctionTemplate() != nullptr)) 183866724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor return false; 183966724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor 184066724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor const ParmVarDecl *Param = getParamDecl(0); 184166724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor 184266724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor ASTContext &Context = getASTContext(); 184366724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor CanQualType ParamType = Context.getCanonicalType(Param->getType()); 184466724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor 184566724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor // Is it the same as our our class type? 184666724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor CanQualType ClassTy 184766724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor = Context.getCanonicalType(Context.getTagDeclType(getParent())); 184866724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor if (ParamType.getUnqualifiedType() != ClassTy) 184966724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor return false; 185066724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor 185166724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor return true; 185266724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor} 185366724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor 1854f677ea3cc9598d9952ad7ffab5fb322ba4c5be31Sebastian Redlconst CXXConstructorDecl *CXXConstructorDecl::getInheritedConstructor() const { 1855f677ea3cc9598d9952ad7ffab5fb322ba4c5be31Sebastian Redl // Hack: we store the inherited constructor in the overridden method table 1856540659e102670e08773986862b191ed2c46a0e86Eli Friedman method_iterator It = getASTContext().overridden_methods_begin(this); 1857540659e102670e08773986862b191ed2c46a0e86Eli Friedman if (It == getASTContext().overridden_methods_end(this)) 18586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 1859f677ea3cc9598d9952ad7ffab5fb322ba4c5be31Sebastian Redl 1860f677ea3cc9598d9952ad7ffab5fb322ba4c5be31Sebastian Redl return cast<CXXConstructorDecl>(*It); 1861f677ea3cc9598d9952ad7ffab5fb322ba4c5be31Sebastian Redl} 1862f677ea3cc9598d9952ad7ffab5fb322ba4c5be31Sebastian Redl 1863f677ea3cc9598d9952ad7ffab5fb322ba4c5be31Sebastian Redlvoid 1864f677ea3cc9598d9952ad7ffab5fb322ba4c5be31Sebastian RedlCXXConstructorDecl::setInheritedConstructor(const CXXConstructorDecl *BaseCtor){ 1865f677ea3cc9598d9952ad7ffab5fb322ba4c5be31Sebastian Redl // Hack: we store the inherited constructor in the overridden method table 1866540659e102670e08773986862b191ed2c46a0e86Eli Friedman assert(getASTContext().overridden_methods_size(this) == 0 && 1867540659e102670e08773986862b191ed2c46a0e86Eli Friedman "Base ctor already set."); 1868540659e102670e08773986862b191ed2c46a0e86Eli Friedman getASTContext().addOverriddenMethod(this, BaseCtor); 1869f677ea3cc9598d9952ad7ffab5fb322ba4c5be31Sebastian Redl} 1870f677ea3cc9598d9952ad7ffab5fb322ba4c5be31Sebastian Redl 187199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid CXXDestructorDecl::anchor() { } 187299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 187342a552f8200ba5948661aee0106fce0c04e39818Douglas GregorCXXDestructorDecl * 18741e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorCXXDestructorDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 18756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) 18766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CXXDestructorDecl(C, nullptr, SourceLocation(), DeclarationNameInfo(), 18776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines QualType(), nullptr, false, false); 18786ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 18796ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 18806ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris LattnerCXXDestructorDecl * 188142a552f8200ba5948661aee0106fce0c04e39818Douglas GregorCXXDestructorDecl::Create(ASTContext &C, CXXRecordDecl *RD, 1882ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, 18832577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 1884b41d899a6023385c00a61eb9dd3e44db9dc7994eCraig Silverstein QualType T, TypeSourceInfo *TInfo, 1885af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith bool isInline, bool isImplicitlyDeclared) { 18862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara assert(NameInfo.getName().getNameKind() 18872577743c5650c646fb705df01403707e94f2df04Abramo Bagnara == DeclarationName::CXXDestructorName && 18882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor "Name must refer to a destructor"); 18896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, RD) CXXDestructorDecl(C, RD, StartLoc, NameInfo, T, TInfo, 1890651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines isInline, isImplicitlyDeclared); 189142a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor} 189242a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor 18933ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarvoid CXXDestructorDecl::setOperatorDelete(FunctionDecl *OD) { 18943ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar auto *First = cast<CXXDestructorDecl>(getFirstDecl()); 18953ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (OD && !First->OperatorDelete) { 18963ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar First->OperatorDelete = OD; 18973ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (auto *L = getASTMutationListener()) 18983ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar L->ResolvedOperatorDelete(First, OD); 18993ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 19003ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 19013ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 190299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid CXXConversionDecl::anchor() { } 190399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 19042f1bc5285ccd40f411af5f5993f013e27e74ab78Douglas GregorCXXConversionDecl * 19051e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorCXXConversionDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 19066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) CXXConversionDecl(C, nullptr, SourceLocation(), 1907651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DeclarationNameInfo(), QualType(), 19086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nullptr, false, false, false, 1909651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation()); 19106ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 19116ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 19126ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris LattnerCXXConversionDecl * 19132f1bc5285ccd40f411af5f5993f013e27e74ab78Douglas GregorCXXConversionDecl::Create(ASTContext &C, CXXRecordDecl *RD, 1914ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, 19152577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 1916a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall QualType T, TypeSourceInfo *TInfo, 1917f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor bool isInline, bool isExplicit, 1918af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith bool isConstexpr, SourceLocation EndLocation) { 19192577743c5650c646fb705df01403707e94f2df04Abramo Bagnara assert(NameInfo.getName().getNameKind() 19202577743c5650c646fb705df01403707e94f2df04Abramo Bagnara == DeclarationName::CXXConversionFunctionName && 19212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor "Name must refer to a conversion function"); 19226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, RD) CXXConversionDecl(C, RD, StartLoc, NameInfo, T, TInfo, 1923651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines isInline, isExplicit, isConstexpr, 1924651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EndLocation); 19252f1bc5285ccd40f411af5f5993f013e27e74ab78Douglas Gregor} 19262f1bc5285ccd40f411af5f5993f013e27e74ab78Douglas Gregor 1927f6e2e0291b8964ed41b4325e21dd90b86e791f10Douglas Gregorbool CXXConversionDecl::isLambdaToBlockPointerConversion() const { 1928f6e2e0291b8964ed41b4325e21dd90b86e791f10Douglas Gregor return isImplicit() && getParent()->isLambda() && 1929f6e2e0291b8964ed41b4325e21dd90b86e791f10Douglas Gregor getConversionType()->isBlockPointerType(); 1930f6e2e0291b8964ed41b4325e21dd90b86e791f10Douglas Gregor} 1931f6e2e0291b8964ed41b4325e21dd90b86e791f10Douglas Gregor 193299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid LinkageSpecDecl::anchor() { } 193399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 193421ef7ae45c8b91f23cf5eab2263421bb398a644bChris LattnerLinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C, 19351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclContext *DC, 1936a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara SourceLocation ExternLoc, 1937a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara SourceLocation LangLoc, 19385f6bcbebedb85ee745cbd9a3ca51ca8c766a6117Abramo Bagnara LanguageIDs Lang, 1939e5e575ded9cd4b80229fb299a2d97e9d44728edaRafael Espindola bool HasBraces) { 1940651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return new (C, DC) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, HasBraces); 1941f44515a49b549171dc3ee9faa6281b72609da563Douglas Gregor} 19422a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 1943651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLinkageSpecDecl *LinkageSpecDecl::CreateDeserialized(ASTContext &C, 1944651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned ID) { 19456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) LinkageSpecDecl(nullptr, SourceLocation(), 19466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation(), lang_c, false); 19471e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 19481e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 194999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid UsingDirectiveDecl::anchor() { } 195099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 19512a3009a432bdcec59e6383d7b2b17494d6f91649Douglas GregorUsingDirectiveDecl *UsingDirectiveDecl::Create(ASTContext &C, DeclContext *DC, 19522a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor SourceLocation L, 19532a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor SourceLocation NamespaceLoc, 1954db9924191092b4d426cc066637d81698211846aaDouglas Gregor NestedNameSpecifierLoc QualifierLoc, 19552a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor SourceLocation IdentLoc, 1956eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl NamedDecl *Used, 19572a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor DeclContext *CommonAncestor) { 1958eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl if (NamespaceDecl *NS = dyn_cast_or_null<NamespaceDecl>(Used)) 1959eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl Used = NS->getOriginalNamespace(); 1960651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return new (C, DC) UsingDirectiveDecl(DC, L, NamespaceLoc, QualifierLoc, 1961651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IdentLoc, Used, CommonAncestor); 19622a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor} 19632a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 1964651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesUsingDirectiveDecl *UsingDirectiveDecl::CreateDeserialized(ASTContext &C, 1965651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned ID) { 19666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) UsingDirectiveDecl(nullptr, SourceLocation(), 19676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation(), 1968651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines NestedNameSpecifierLoc(), 19696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation(), nullptr, nullptr); 19701e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 19711e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 1972eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian RedlNamespaceDecl *UsingDirectiveDecl::getNominatedNamespace() { 1973eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl if (NamespaceAliasDecl *NA = 1974eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl dyn_cast_or_null<NamespaceAliasDecl>(NominatedNamespace)) 1975eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl return NA->getNamespace(); 1976eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl return cast_or_null<NamespaceDecl>(NominatedNamespace); 1977eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl} 1978eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl 19796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesNamespaceDecl::NamespaceDecl(ASTContext &C, DeclContext *DC, bool Inline, 19806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation StartLoc, SourceLocation IdLoc, 19816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IdentifierInfo *Id, NamespaceDecl *PrevDecl) 19826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : NamedDecl(Namespace, DC, IdLoc, Id), DeclContext(Namespace), 19836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines redeclarable_base(C), LocStart(StartLoc), RBraceLoc(), 19846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AnonOrFirstNamespaceAndInline(nullptr, Inline) { 1985bc6509175e1ce5cc1b48d1b97ac8d23d8b74167cRafael Espindola setPreviousDecl(PrevDecl); 19866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1987f5c9f9fd6f5e2850b9b0f19283430245b696c6e5Douglas Gregor if (PrevDecl) 1988f5c9f9fd6f5e2850b9b0f19283430245b696c6e5Douglas Gregor AnonOrFirstNamespaceAndInline.setPointer(PrevDecl->getOriginalNamespace()); 1989f5c9f9fd6f5e2850b9b0f19283430245b696c6e5Douglas Gregor} 1990f5c9f9fd6f5e2850b9b0f19283430245b696c6e5Douglas Gregor 19911e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC, 1992f5c9f9fd6f5e2850b9b0f19283430245b696c6e5Douglas Gregor bool Inline, SourceLocation StartLoc, 1993f5c9f9fd6f5e2850b9b0f19283430245b696c6e5Douglas Gregor SourceLocation IdLoc, IdentifierInfo *Id, 1994f5c9f9fd6f5e2850b9b0f19283430245b696c6e5Douglas Gregor NamespaceDecl *PrevDecl) { 19956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, DC) NamespaceDecl(C, DC, Inline, StartLoc, IdLoc, Id, 19966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PrevDecl); 19971e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 19981e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 19991e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNamespaceDecl *NamespaceDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 20006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) NamespaceDecl(C, nullptr, false, SourceLocation(), 20016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation(), nullptr, nullptr); 2002651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 2003651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 20046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesNamespaceDecl *NamespaceDecl::getNextRedeclarationImpl() { 20056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return getNextRedeclaration(); 2006651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 2007651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesNamespaceDecl *NamespaceDecl::getPreviousDeclImpl() { 2008651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return getPreviousDecl(); 2009651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 2010651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesNamespaceDecl *NamespaceDecl::getMostRecentDeclImpl() { 2011651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return getMostRecentDecl(); 20121e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 20131e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 201499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid NamespaceAliasDecl::anchor() { } 201599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 2016176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesNamespaceAliasDecl *NamespaceAliasDecl::getNextRedeclarationImpl() { 2017176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return getNextRedeclaration(); 2018176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 2019176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesNamespaceAliasDecl *NamespaceAliasDecl::getPreviousDeclImpl() { 2020176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return getPreviousDecl(); 2021176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 2022176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesNamespaceAliasDecl *NamespaceAliasDecl::getMostRecentDeclImpl() { 2023176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return getMostRecentDecl(); 2024176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 2025176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 20261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpNamespaceAliasDecl *NamespaceAliasDecl::Create(ASTContext &C, DeclContext *DC, 20270a35bceb7768fc0be62cb644a4e31d8bfd9fb44aDouglas Gregor SourceLocation UsingLoc, 20281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation AliasLoc, 20291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump IdentifierInfo *Alias, 20300cfaf6a270ecd0f5c7e541a8047c87948317548bDouglas Gregor NestedNameSpecifierLoc QualifierLoc, 20311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation IdentLoc, 203268771c73f4293620dc1a99154ec02111e6490e28Anders Carlsson NamedDecl *Namespace) { 2033176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // FIXME: Preserve the aliased namespace as written. 2034eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl if (NamespaceDecl *NS = dyn_cast_or_null<NamespaceDecl>(Namespace)) 2035eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl Namespace = NS->getOriginalNamespace(); 2036176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return new (C, DC) NamespaceAliasDecl(C, DC, UsingLoc, AliasLoc, Alias, 2037651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualifierLoc, IdentLoc, Namespace); 203868771c73f4293620dc1a99154ec02111e6490e28Anders Carlsson} 203968771c73f4293620dc1a99154ec02111e6490e28Anders Carlsson 20401e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNamespaceAliasDecl * 20411e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNamespaceAliasDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 2042176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return new (C, ID) NamespaceAliasDecl(C, nullptr, SourceLocation(), 20436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation(), nullptr, 20446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NestedNameSpecifierLoc(), 20456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation(), nullptr); 20461e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 20471e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 204899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid UsingShadowDecl::anchor() { } 204999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 20501e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorUsingShadowDecl * 20511e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorUsingShadowDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 20526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) UsingShadowDecl(C, nullptr, SourceLocation(), 20536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nullptr, nullptr); 20541e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 20551e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 2056826faa22bae112e01293a58534a40711043cce65Argyrios KyrtzidisUsingDecl *UsingShadowDecl::getUsingDecl() const { 2057826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis const UsingShadowDecl *Shadow = this; 2058826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis while (const UsingShadowDecl *NextShadow = 2059826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis dyn_cast<UsingShadowDecl>(Shadow->UsingOrNextShadow)) 2060826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis Shadow = NextShadow; 2061826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis return cast<UsingDecl>(Shadow->UsingOrNextShadow); 2062826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis} 2063826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis 206499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid UsingDecl::anchor() { } 206599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 2066826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidisvoid UsingDecl::addShadowDecl(UsingShadowDecl *S) { 2067826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis assert(std::find(shadow_begin(), shadow_end(), S) == shadow_end() && 2068826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis "declaration already in set"); 2069826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis assert(S->getUsingDecl() == this); 2070826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis 20719bc6fb6317f9bc6aaaacd266b9ea36996ad338bbBenjamin Kramer if (FirstUsingShadow.getPointer()) 20729bc6fb6317f9bc6aaaacd266b9ea36996ad338bbBenjamin Kramer S->UsingOrNextShadow = FirstUsingShadow.getPointer(); 20739bc6fb6317f9bc6aaaacd266b9ea36996ad338bbBenjamin Kramer FirstUsingShadow.setPointer(S); 2074826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis} 2075826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis 2076826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidisvoid UsingDecl::removeShadowDecl(UsingShadowDecl *S) { 2077826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis assert(std::find(shadow_begin(), shadow_end(), S) != shadow_end() && 2078826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis "declaration not in set"); 2079826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis assert(S->getUsingDecl() == this); 2080826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis 2081826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis // Remove S from the shadow decl chain. This is O(n) but hopefully rare. 2082826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis 20839bc6fb6317f9bc6aaaacd266b9ea36996ad338bbBenjamin Kramer if (FirstUsingShadow.getPointer() == S) { 20849bc6fb6317f9bc6aaaacd266b9ea36996ad338bbBenjamin Kramer FirstUsingShadow.setPointer( 20859bc6fb6317f9bc6aaaacd266b9ea36996ad338bbBenjamin Kramer dyn_cast<UsingShadowDecl>(S->UsingOrNextShadow)); 2086826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis S->UsingOrNextShadow = this; 2087826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis return; 2088826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis } 2089826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis 20909bc6fb6317f9bc6aaaacd266b9ea36996ad338bbBenjamin Kramer UsingShadowDecl *Prev = FirstUsingShadow.getPointer(); 2091826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis while (Prev->UsingOrNextShadow != S) 2092826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis Prev = cast<UsingShadowDecl>(Prev->UsingOrNextShadow); 2093826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis Prev->UsingOrNextShadow = S->UsingOrNextShadow; 2094826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis S->UsingOrNextShadow = this; 2095826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis} 2096826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis 2097dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas GregorUsingDecl *UsingDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation UL, 2098dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor NestedNameSpecifierLoc QualifierLoc, 2099ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara const DeclarationNameInfo &NameInfo, 21008d030c7a6f36438f6c7dd977f8be0de0cc781ad5Enea Zaffanella bool HasTypename) { 2101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return new (C, DC) UsingDecl(DC, UL, QualifierLoc, NameInfo, HasTypename); 21029cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor} 21039cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor 21041e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorUsingDecl *UsingDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 21056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) UsingDecl(nullptr, SourceLocation(), 21066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NestedNameSpecifierLoc(), DeclarationNameInfo(), 21076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines false); 21081e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 21091e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 2110d4de59d3e54421ef88316d650e35802ba9c572cfEnea ZaffanellaSourceRange UsingDecl::getSourceRange() const { 2111d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella SourceLocation Begin = isAccessDeclaration() 2112d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella ? getQualifierLoc().getBeginLoc() : UsingLocation; 2113d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella return SourceRange(Begin, getNameInfo().getEndLoc()); 2114d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella} 2115d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella 211699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid UnresolvedUsingValueDecl::anchor() { } 211799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 21187ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallUnresolvedUsingValueDecl * 21197ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallUnresolvedUsingValueDecl::Create(ASTContext &C, DeclContext *DC, 21207ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall SourceLocation UsingLoc, 2121dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor NestedNameSpecifierLoc QualifierLoc, 2122ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara const DeclarationNameInfo &NameInfo) { 2123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return new (C, DC) UnresolvedUsingValueDecl(DC, C.DependentTy, UsingLoc, 2124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualifierLoc, NameInfo); 21257ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall} 21267ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall 21271e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorUnresolvedUsingValueDecl * 21281e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorUnresolvedUsingValueDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 21296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) UnresolvedUsingValueDecl(nullptr, QualType(), 21306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation(), 2131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines NestedNameSpecifierLoc(), 21326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DeclarationNameInfo()); 21331e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 21341e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 2135d4de59d3e54421ef88316d650e35802ba9c572cfEnea ZaffanellaSourceRange UnresolvedUsingValueDecl::getSourceRange() const { 2136d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella SourceLocation Begin = isAccessDeclaration() 2137d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella ? getQualifierLoc().getBeginLoc() : UsingLocation; 2138d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella return SourceRange(Begin, getNameInfo().getEndLoc()); 2139d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella} 2140d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella 214199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid UnresolvedUsingTypenameDecl::anchor() { } 214299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 21437ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallUnresolvedUsingTypenameDecl * 21447ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallUnresolvedUsingTypenameDecl::Create(ASTContext &C, DeclContext *DC, 21457ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall SourceLocation UsingLoc, 21467ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall SourceLocation TypenameLoc, 2147dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor NestedNameSpecifierLoc QualifierLoc, 21487ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall SourceLocation TargetNameLoc, 21497ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall DeclarationName TargetName) { 2150651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return new (C, DC) UnresolvedUsingTypenameDecl( 2151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DC, UsingLoc, TypenameLoc, QualifierLoc, TargetNameLoc, 2152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TargetName.getAsIdentifierInfo()); 2153665b49c62d637d16826036118f92d35f116f3ef3Anders Carlsson} 2154665b49c62d637d16826036118f92d35f116f3ef3Anders Carlsson 21551e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorUnresolvedUsingTypenameDecl * 21561e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorUnresolvedUsingTypenameDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 2157651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return new (C, ID) UnresolvedUsingTypenameDecl( 21586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nullptr, SourceLocation(), SourceLocation(), NestedNameSpecifierLoc(), 21596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation(), nullptr); 21601e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 21611e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 216299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid StaticAssertDecl::anchor() { } 216399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 2164fb311762bb52dc015c02cb257d2913f104b556f8Anders CarlssonStaticAssertDecl *StaticAssertDecl::Create(ASTContext &C, DeclContext *DC, 2165a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara SourceLocation StaticAssertLoc, 2166a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara Expr *AssertExpr, 2167a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara StringLiteral *Message, 2168e3f470a718ec00eb8b546e405fa59bc2df2d7c46Richard Smith SourceLocation RParenLoc, 2169e3f470a718ec00eb8b546e405fa59bc2df2d7c46Richard Smith bool Failed) { 2170651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return new (C, DC) StaticAssertDecl(DC, StaticAssertLoc, AssertExpr, Message, 2171651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines RParenLoc, Failed); 2172fb311762bb52dc015c02cb257d2913f104b556f8Anders Carlsson} 2173fb311762bb52dc015c02cb257d2913f104b556f8Anders Carlsson 2174651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesStaticAssertDecl *StaticAssertDecl::CreateDeserialized(ASTContext &C, 21751e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 21766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) StaticAssertDecl(nullptr, SourceLocation(), nullptr, 21776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nullptr, SourceLocation(), false); 2178651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 2179651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2180651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesMSPropertyDecl *MSPropertyDecl::Create(ASTContext &C, DeclContext *DC, 2181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation L, DeclarationName N, 2182651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType T, TypeSourceInfo *TInfo, 2183651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation StartL, 2184651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IdentifierInfo *Getter, 2185651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IdentifierInfo *Setter) { 2186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return new (C, DC) MSPropertyDecl(DC, L, N, T, TInfo, StartL, Getter, Setter); 2187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 2188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2189651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesMSPropertyDecl *MSPropertyDecl::CreateDeserialized(ASTContext &C, 2190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned ID) { 21916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) MSPropertyDecl(nullptr, SourceLocation(), 21926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DeclarationName(), QualType(), nullptr, 21936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation(), nullptr, nullptr); 21941e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 21951e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 219605bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlssonstatic const char *getAccessName(AccessSpecifier AS) { 219705bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson switch (AS) { 219805bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson case AS_none: 2199b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Invalid access specifier!"); 220005bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson case AS_public: 220105bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson return "public"; 220205bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson case AS_private: 220305bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson return "private"; 220405bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson case AS_protected: 220505bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson return "protected"; 220605bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson } 2207561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie llvm_unreachable("Invalid access specifier!"); 220805bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson} 220905bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson 221005bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlssonconst DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB, 221105bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson AccessSpecifier AS) { 221205bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson return DB << getAccessName(AS); 221305bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson} 2214f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith 2215f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smithconst PartialDiagnostic &clang::operator<<(const PartialDiagnostic &DB, 2216f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith AccessSpecifier AS) { 2217f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith return DB << getAccessName(AS); 2218f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith} 2219