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)
494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : UserDeclaredConstructor(false), UserDeclaredSpecialMembers(0),
504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Aggregate(true), PlainOldData(true), Empty(true), Polymorphic(false),
514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Abstract(false), IsStandardLayout(true), HasNoNonEmptyBases(true),
524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      HasPrivateFields(false), HasProtectedFields(false),
534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      HasPublicFields(false), HasMutableFields(false), HasVariantMembers(false),
544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      HasOnlyCMembers(true), HasInClassInitializer(false),
554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      HasUninitializedReferenceMember(false), HasUninitializedFields(false),
564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      HasInheritedConstructor(false), HasInheritedAssignment(false),
574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      NeedOverloadResolutionForMoveConstructor(false),
584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      NeedOverloadResolutionForMoveAssignment(false),
594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      NeedOverloadResolutionForDestructor(false),
604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      DefaultedMoveConstructorIsDeleted(false),
614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      DefaultedMoveAssignmentIsDeleted(false),
624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      DefaultedDestructorIsDeleted(false), HasTrivialSpecialMembers(SMF_All),
634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      DeclaredNonTrivialSpecialMembers(0), HasIrrelevantDestructor(true),
644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      HasConstexprNonCopyMoveConstructor(false),
654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      HasDefaultedDefaultConstructor(false),
664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      DefaultedDefaultConstructorIsConstexpr(true),
674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      HasConstexprDefaultConstructor(false),
684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      HasNonLiteralTypeFieldsOrBases(false), ComputedVisibleConversions(false),
694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      UserProvidedDefaultConstructor(false), DeclaredSpecialMembers(0),
704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      ImplicitCopyConstructorHasConstParam(true),
714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      ImplicitCopyAssignmentHasConstParam(true),
724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      HasDeclaredCopyConstructorWithConstParam(false),
734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      HasDeclaredCopyAssignmentWithConstParam(false), IsLambda(false),
744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      IsParsingBaseSpecifiers(false), NumBases(0), NumVBases(0), Bases(),
754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      VBases(), Definition(D), FirstFriend() {}
7686ff308724171494395a840fd2efbe25e62f352eJohn McCall
77ee3096a2d3092892d4c6f607a6323d9409714ed5Benjamin KramerCXXBaseSpecifier *CXXRecordDecl::DefinitionData::getBasesSlowCase() const {
78ee3096a2d3092892d4c6f607a6323d9409714ed5Benjamin Kramer  return Bases.get(Definition->getASTContext().getExternalSource());
79ee3096a2d3092892d4c6f607a6323d9409714ed5Benjamin Kramer}
80ee3096a2d3092892d4c6f607a6323d9409714ed5Benjamin Kramer
81ee3096a2d3092892d4c6f607a6323d9409714ed5Benjamin KramerCXXBaseSpecifier *CXXRecordDecl::DefinitionData::getVBasesSlowCase() const {
82ee3096a2d3092892d4c6f607a6323d9409714ed5Benjamin Kramer  return VBases.get(Definition->getASTContext().getExternalSource());
83ee3096a2d3092892d4c6f607a6323d9409714ed5Benjamin Kramer}
84ee3096a2d3092892d4c6f607a6323d9409714ed5Benjamin Kramer
856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesCXXRecordDecl::CXXRecordDecl(Kind K, TagKind TK, const ASTContext &C,
866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                             DeclContext *DC, SourceLocation StartLoc,
876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                             SourceLocation IdLoc, IdentifierInfo *Id,
886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                             CXXRecordDecl *PrevDecl)
896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    : RecordDecl(K, TK, C, DC, StartLoc, IdLoc, Id, PrevDecl),
906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DefinitionData(PrevDecl ? PrevDecl->DefinitionData
914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              : nullptr),
926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      TemplateOrInstantiation() {}
937d7e6727a5de032c86dcb58ae734e7c1603c26e6Douglas Gregor
944ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCXXRecordDecl *CXXRecordDecl::Create(const ASTContext &C, TagKind TK,
95ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                     DeclContext *DC, SourceLocation StartLoc,
96ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                     SourceLocation IdLoc, IdentifierInfo *Id,
97aafc0ccfcf860d921a86423c6c9a738301987abfDouglas Gregor                                     CXXRecordDecl* PrevDecl,
98aafc0ccfcf860d921a86423c6c9a738301987abfDouglas Gregor                                     bool DelayTypeCreation) {
996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  CXXRecordDecl *R = new (C, DC) CXXRecordDecl(CXXRecord, TK, C, DC, StartLoc,
100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                               IdLoc, Id, PrevDecl);
1016bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor  R->MayHaveOutOfDateDef = C.getLangOpts().Modules;
1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1038e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor  // FIXME: DelayTypeCreation seems like such a hack
104aafc0ccfcf860d921a86423c6c9a738301987abfDouglas Gregor  if (!DelayTypeCreation)
1051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    C.getTypeDeclType(R, PrevDecl);
1064b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  return R;
1074b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek}
1084b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek
1096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesCXXRecordDecl *
1106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesCXXRecordDecl::CreateLambda(const ASTContext &C, DeclContext *DC,
1116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                            TypeSourceInfo *Info, SourceLocation Loc,
1126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                            bool Dependent, bool IsGeneric,
1136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                            LambdaCaptureDefault CaptureDefault) {
114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CXXRecordDecl *R =
1156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      new (C, DC) CXXRecordDecl(CXXRecord, TTK_Class, C, DC, Loc, Loc,
1166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                nullptr, nullptr);
117da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor  R->IsBeingDefined = true;
1186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  R->DefinitionData =
1196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      new (C) struct LambdaDefinitionData(R, Info, Dependent, IsGeneric,
1206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                          CaptureDefault);
1216bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor  R->MayHaveOutOfDateDef = false;
122e3efec20260ea7a0071e2ae6eedf3c2865e476d3James Dennett  R->setImplicit(true);
1236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  C.getTypeDeclType(R, /*PrevDecl=*/nullptr);
124da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor  return R;
125da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor}
126da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor
1271e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorCXXRecordDecl *
1281e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorCXXRecordDecl::CreateDeserialized(const ASTContext &C, unsigned ID) {
129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CXXRecordDecl *R = new (C, ID) CXXRecordDecl(
1306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      CXXRecord, TTK_Struct, C, nullptr, SourceLocation(), SourceLocation(),
1316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      nullptr, nullptr);
1326bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor  R->MayHaveOutOfDateDef = false;
1336bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor  return R;
134b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis}
135b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis
1361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid
1372d5b70386d6f5553b667b6e407ca781b4ca2009eDouglas GregorCXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases,
13857c856b96e6bbfc64c2d61b950b116b523dc3e46Douglas Gregor                        unsigned NumBases) {
1392d5b70386d6f5553b667b6e407ca781b4ca2009eDouglas Gregor  ASTContext &C = getASTContext();
14064bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor
1417c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor  if (!data().Bases.isOffset() && data().NumBases > 0)
1427c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor    C.Deallocate(data().getBases());
1431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
144dd67723af339f94870149ee1934dd652f83ca738Richard Smith  if (NumBases) {
1454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (!C.getLangOpts().CPlusPlus1z) {
1464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // C++ [dcl.init.aggr]p1:
1474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      //   An aggregate is [...] a class with [...] no base classes [...].
1484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      data().Aggregate = false;
1494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
150dd67723af339f94870149ee1934dd652f83ca738Richard Smith
151dd67723af339f94870149ee1934dd652f83ca738Richard Smith    // C++ [class]p4:
152dd67723af339f94870149ee1934dd652f83ca738Richard Smith    //   A POD-struct is an aggregate class...
153dd67723af339f94870149ee1934dd652f83ca738Richard Smith    data().PlainOldData = false;
154dd67723af339f94870149ee1934dd652f83ca738Richard Smith  }
155dd67723af339f94870149ee1934dd652f83ca738Richard Smith
1566f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson  // The set of seen virtual base types.
1571c3639351f8c252ddcc13d234cabf8780b1c235fAnders Carlsson  llvm::SmallPtrSet<CanQualType, 8> SeenVBaseTypes;
1586f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson
1596f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson  // The virtual bases of this class.
1605f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<const CXXBaseSpecifier *, 8> VBases;
1611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16286ff308724171494395a840fd2efbe25e62f352eJohn McCall  data().Bases = new(C) CXXBaseSpecifier [NumBases];
16386ff308724171494395a840fd2efbe25e62f352eJohn McCall  data().NumBases = NumBases;
16440c072f44ff081293f79909ecc518af23938108eFariborz Jahanian  for (unsigned i = 0; i < NumBases; ++i) {
1657c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor    data().getBases()[i] = *Bases[i];
16640c072f44ff081293f79909ecc518af23938108eFariborz Jahanian    // Keep track of inherited vbases for this base class.
16740c072f44ff081293f79909ecc518af23938108eFariborz Jahanian    const CXXBaseSpecifier *Base = Bases[i];
16840c072f44ff081293f79909ecc518af23938108eFariborz Jahanian    QualType BaseType = Base->getType();
1695fe8c04009eff540ebaa0cceb2e75c3908322e11Douglas Gregor    // Skip dependent types; we can't do any checking on them now.
17040c072f44ff081293f79909ecc518af23938108eFariborz Jahanian    if (BaseType->isDependentType())
17140c072f44ff081293f79909ecc518af23938108eFariborz Jahanian      continue;
17240c072f44ff081293f79909ecc518af23938108eFariborz Jahanian    CXXRecordDecl *BaseClassDecl
1736217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek      = cast<CXXRecordDecl>(BaseType->getAs<RecordType>()->getDecl());
1746f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson
175a8225449421e8c1e996a7c48300521028946482aChandler Carruth    if (!BaseClassDecl->isEmpty()) {
176a8225449421e8c1e996a7c48300521028946482aChandler Carruth      if (!data().Empty) {
177a8225449421e8c1e996a7c48300521028946482aChandler Carruth        // C++0x [class]p7:
178a8225449421e8c1e996a7c48300521028946482aChandler Carruth        //   A standard-layout class is a class that:
179a8225449421e8c1e996a7c48300521028946482aChandler Carruth        //    [...]
180a8225449421e8c1e996a7c48300521028946482aChandler Carruth        //    -- either has no non-static data members in the most derived
181a8225449421e8c1e996a7c48300521028946482aChandler Carruth        //       class and at most one base class with non-static data members,
182a8225449421e8c1e996a7c48300521028946482aChandler Carruth        //       or has no base classes with non-static data members, and
183a8225449421e8c1e996a7c48300521028946482aChandler Carruth        // If this is the second non-empty base, then neither of these two
184a8225449421e8c1e996a7c48300521028946482aChandler Carruth        // clauses can be true.
185ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth        data().IsStandardLayout = false;
186a8225449421e8c1e996a7c48300521028946482aChandler Carruth      }
187a8225449421e8c1e996a7c48300521028946482aChandler Carruth
1884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // C++14 [meta.unary.prop]p4:
1894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      //   T is a class type [...] with [...] no base class B for which
1904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      //   is_empty<B>::value is false.
1912cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor      data().Empty = false;
192a8225449421e8c1e996a7c48300521028946482aChandler Carruth      data().HasNoNonEmptyBases = false;
193a8225449421e8c1e996a7c48300521028946482aChandler Carruth    }
1942cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor
1954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // C++1z [dcl.init.agg]p1:
1964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    //   An aggregate is a class with [...] no private or protected base classes
1974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (Base->getAccessSpecifier() != AS_public)
1984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      data().Aggregate = false;
1994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
20085606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor    // C++ [class.virtual]p1:
20185606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor    //   A class that declares or inherits a virtual function is called a
20285606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor    //   polymorphic class.
20385606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor    if (BaseClassDecl->isPolymorphic())
20485606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor      data().Polymorphic = true;
2059b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth
206a8225449421e8c1e996a7c48300521028946482aChandler Carruth    // C++0x [class]p7:
207a8225449421e8c1e996a7c48300521028946482aChandler Carruth    //   A standard-layout class is a class that: [...]
208a8225449421e8c1e996a7c48300521028946482aChandler Carruth    //    -- has no non-standard-layout base classes
209ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth    if (!BaseClassDecl->isStandardLayout())
210ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth      data().IsStandardLayout = false;
211a8225449421e8c1e996a7c48300521028946482aChandler Carruth
2129b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth    // Record if this base is the first non-literal field or base.
213a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    if (!hasNonLiteralTypeFieldsOrBases() && !BaseType->isLiteralType(C))
2149b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth      data().HasNonLiteralTypeFieldsOrBases = true;
21585606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor
2166f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson    // Now go through all virtual bases of this base and add them.
217651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    for (const auto &VBase : BaseClassDecl->vbases()) {
2186f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson      // Add this base if it's not already in the list.
219176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (SeenVBaseTypes.insert(C.getCanonicalType(VBase.getType())).second) {
220651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        VBases.push_back(&VBase);
221acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith
222acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        // C++11 [class.copy]p8:
223acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        //   The implicitly-declared copy constructor for a class X will have
224acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        //   the form 'X::X(const X&)' if each [...] virtual base class B of X
225acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        //   has a copy constructor whose first parameter is of type
226acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        //   'const B&' or 'const volatile B&' [...]
227651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        if (CXXRecordDecl *VBaseDecl = VBase.getType()->getAsCXXRecordDecl())
228acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith          if (!VBaseDecl->hasCopyConstructorWithConstParam())
229acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith            data().ImplicitCopyConstructorHasConstParam = false;
2304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        // C++1z [dcl.init.agg]p1:
2324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        //   An aggregate is a class with [...] no virtual base classes
2334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        data().Aggregate = false;
234acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith      }
23540c072f44ff081293f79909ecc518af23938108eFariborz Jahanian    }
2366f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson
2376f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson    if (Base->isVirtual()) {
2386f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson      // Add this base if it's not already in the list.
239176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (SeenVBaseTypes.insert(C.getCanonicalType(BaseType)).second)
240acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        VBases.push_back(Base);
241acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith
2424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // C++14 [meta.unary.prop] is_empty:
2434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      //   T is a class type, but not a union type, with ... no virtual base
2444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      //   classes
2452cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor      data().Empty = false;
2464d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth
2474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // C++1z [dcl.init.agg]p1:
2484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      //   An aggregate is a class with [...] no virtual base classes
2494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      data().Aggregate = false;
2504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2517d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      // C++11 [class.ctor]p5, C++11 [class.copy]p12, C++11 [class.copy]p25:
2527d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      //   A [default constructor, copy/move constructor, or copy/move assignment
2537d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      //   operator for a class X] is trivial [...] if:
2547d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      //    -- class X has [...] no virtual base classes
2557d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      data().HasTrivialSpecialMembers &= SMF_Destructor;
256a8225449421e8c1e996a7c48300521028946482aChandler Carruth
257a8225449421e8c1e996a7c48300521028946482aChandler Carruth      // C++0x [class]p7:
258a8225449421e8c1e996a7c48300521028946482aChandler Carruth      //   A standard-layout class is a class that: [...]
259a8225449421e8c1e996a7c48300521028946482aChandler Carruth      //    -- has [...] no virtual base classes
260ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth      data().IsStandardLayout = false;
2616180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
2626180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      // C++11 [dcl.constexpr]p4:
2636180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      //   In the definition of a constexpr constructor [...]
2646180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      //    -- the class shall not have any virtual base classes
2656180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      data().DefaultedDefaultConstructorIsConstexpr = false;
26685606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor    } else {
26785606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor      // C++ [class.ctor]p5:
268023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt      //   A default constructor is trivial [...] if:
269023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt      //    -- all the direct base classes of its class have trivial default
270023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt      //       constructors.
271023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt      if (!BaseClassDecl->hasTrivialDefaultConstructor())
2727d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
2737d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith
2744d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth      // C++0x [class.copy]p13:
2754d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth      //   A copy/move constructor for class X is trivial if [...]
2764d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth      //    [...]
2774d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth      //    -- the constructor selected to copy/move each direct base class
2784d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth      //       subobject is trivial, and
27985606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor      if (!BaseClassDecl->hasTrivialCopyConstructor())
2807d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor;
281bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith      // If the base class doesn't have a simple move constructor, we'll eagerly
282bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith      // declare it and perform overload resolution to determine which function
283bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith      // it actually calls. If it does have a simple move constructor, this
284bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith      // check is correct.
285426391cd51af86f9d59eceb0fb1c42153eccbb9aRichard Smith      if (!BaseClassDecl->hasTrivialMoveConstructor())
2867d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor;
2874d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth
2884d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth      // C++0x [class.copy]p27:
2894d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth      //   A copy/move assignment operator for class X is trivial if [...]
2904d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth      //    [...]
2914d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth      //    -- the assignment operator selected to copy/move each direct base
2924d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth      //       class subobject is trivial, and
29385606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor      if (!BaseClassDecl->hasTrivialCopyAssignment())
2947d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment;
295bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith      // If the base class doesn't have a simple move assignment, we'll eagerly
296bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith      // declare it and perform overload resolution to determine which function
297bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith      // it actually calls. If it does have a simple move assignment, this
298bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith      // check is correct.
299426391cd51af86f9d59eceb0fb1c42153eccbb9aRichard Smith      if (!BaseClassDecl->hasTrivialMoveAssignment())
3007d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment;
3016180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
3026180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      // C++11 [class.ctor]p6:
303de8facc81f505ca7e86022911145271f614b96eaRichard Smith      //   If that user-written default constructor would satisfy the
3046180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      //   requirements of a constexpr constructor, the implicitly-defined
3056180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      //   default constructor is constexpr.
3066180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      if (!BaseClassDecl->hasConstexprDefaultConstructor())
3076180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith        data().DefaultedDefaultConstructorIsConstexpr = false;
30840c072f44ff081293f79909ecc518af23938108eFariborz Jahanian    }
309ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith
31085606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor    // C++ [class.ctor]p3:
31185606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor    //   A destructor is trivial if all the direct base classes of its class
31285606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor    //   have trivial destructors.
31385606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor    if (!BaseClassDecl->hasTrivialDestructor())
3147d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      data().HasTrivialSpecialMembers &= ~SMF_Destructor;
315dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith
316dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith    if (!BaseClassDecl->hasIrrelevantDestructor())
317dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith      data().HasIrrelevantDestructor = false;
318dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith
319acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith    // C++11 [class.copy]p18:
320acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith    //   The implicitly-declared copy assignment oeprator for a class X will
321acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith    //   have the form 'X& X::operator=(const X&)' if each direct base class B
322acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith    //   of X has a copy assignment operator whose parameter is of type 'const
323acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith    //   B&', 'const volatile B&', or 'B' [...]
324acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith    if (!BaseClassDecl->hasCopyAssignmentWithConstParam())
325acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith      data().ImplicitCopyAssignmentHasConstParam = false;
326acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith
327acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith    // C++11 [class.copy]p8:
328acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith    //   The implicitly-declared copy constructor for a class X will have
329acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith    //   the form 'X::X(const X&)' if each direct [...] base class B of X
330acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith    //   has a copy constructor whose first parameter is of type
331acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith    //   'const B&' or 'const volatile B&' [...]
332acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith    if (!BaseClassDecl->hasCopyConstructorWithConstParam())
333acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith      data().ImplicitCopyConstructorHasConstParam = false;
334acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith
335f85e193739c953358c865005855253af4f68a497John McCall    // A class has an Objective-C object member if... or any of its bases
336f85e193739c953358c865005855253af4f68a497John McCall    // has an Objective-C object member.
337f85e193739c953358c865005855253af4f68a497John McCall    if (BaseClassDecl->hasObjectMember())
338f85e193739c953358c865005855253af4f68a497John McCall      setHasObjectMember(true);
3393ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian
3403ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian    if (BaseClassDecl->hasVolatileMember())
3413ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian      setHasVolatileMember(true);
342f85e193739c953358c865005855253af4f68a497John McCall
3432bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor    // Keep track of the presence of mutable fields.
3442bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor    if (BaseClassDecl->hasMutableFields())
3452bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor      data().HasMutableFields = true;
346d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith
347d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith    if (BaseClassDecl->hasUninitializedReferenceMember())
348d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith      data().HasUninitializedReferenceMember = true;
349bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith
3504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (!BaseClassDecl->allowConstDefaultInit())
3514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      data().HasUninitializedFields = true;
3524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
353bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith    addedClassSubobject(BaseClassDecl);
35440c072f44ff081293f79909ecc518af23938108eFariborz Jahanian  }
3556f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson
356c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  if (VBases.empty()) {
357c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    data().IsParsingBaseSpecifiers = false;
3586f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson    return;
359c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
3606f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson
3616f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson  // Create base specifier for any direct or indirect virtual bases.
3626f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson  data().VBases = new (C) CXXBaseSpecifier[VBases.size()];
3636f6de731808ffd3664f0a179d1cb694c4e7e5342Anders Carlsson  data().NumVBases = VBases.size();
364bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  for (int I = 0, E = VBases.size(); I != E; ++I) {
365bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith    QualType Type = VBases[I]->getType();
366bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith    if (!Type->isDependentType())
367bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith      addedClassSubobject(Type->getAsCXXRecordDecl());
3689f8ee2ea0a62551ad5488669cf69308e7b48a9ddRichard Smith    data().getVBases()[I] = *VBases[I];
369bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  }
370c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
371c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  data().IsParsingBaseSpecifiers = false;
372bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith}
373bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith
374bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smithvoid CXXRecordDecl::addedClassSubobject(CXXRecordDecl *Subobj) {
375bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  // C++11 [class.copy]p11:
376bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  //   A defaulted copy/move constructor for a class X is defined as
377bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  //   deleted if X has:
378bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  //    -- a direct or virtual base class B that cannot be copied/moved [...]
379bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  //    -- a non-static data member of class type M (or array thereof)
380bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  //       that cannot be copied or moved [...]
381bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  if (!Subobj->hasSimpleMoveConstructor())
382bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith    data().NeedOverloadResolutionForMoveConstructor = true;
383bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith
384bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  // C++11 [class.copy]p23:
385bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  //   A defaulted copy/move assignment operator for a class X is defined as
386bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  //   deleted if X has:
387bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  //    -- a direct or virtual base class B that cannot be copied/moved [...]
388bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  //    -- a non-static data member of class type M (or array thereof)
389bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  //        that cannot be copied or moved [...]
390bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  if (!Subobj->hasSimpleMoveAssignment())
391bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith    data().NeedOverloadResolutionForMoveAssignment = true;
392bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith
393bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  // C++11 [class.ctor]p5, C++11 [class.copy]p11, C++11 [class.dtor]p5:
394bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  //   A defaulted [ctor or dtor] for a class X is defined as
395bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  //   deleted if X has:
396bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  //    -- any direct or virtual base class [...] has a type with a destructor
397bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  //       that is deleted or inaccessible from the defaulted [ctor or dtor].
398bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  //    -- any non-static data member has a type with a destructor
399bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  //       that is deleted or inaccessible from the defaulted [ctor or dtor].
400bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  if (!Subobj->hasSimpleDestructor()) {
401bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith    data().NeedOverloadResolutionForMoveConstructor = true;
402bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith    data().NeedOverloadResolutionForDestructor = true;
403bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith  }
40457c856b96e6bbfc64c2d61b950b116b523dc3e46Douglas Gregor}
40557c856b96e6bbfc64c2d61b950b116b523dc3e46Douglas Gregor
4069edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregorbool CXXRecordDecl::hasAnyDependentBases() const {
4079edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  if (!isDependentContext())
4089edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor    return false;
4099edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor
41087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return !forallBases([](const CXXRecordDecl *) { return true; });
4119edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor}
4129edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor
413b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruthbool CXXRecordDecl::isTriviallyCopyable() const {
414b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth  // C++0x [class]p5:
415b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth  //   A trivially copyable class is a class that:
416b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth  //   -- has no non-trivial copy constructors,
417426391cd51af86f9d59eceb0fb1c42153eccbb9aRichard Smith  if (hasNonTrivialCopyConstructor()) return false;
418b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth  //   -- has no non-trivial move constructors,
419426391cd51af86f9d59eceb0fb1c42153eccbb9aRichard Smith  if (hasNonTrivialMoveConstructor()) return false;
420b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth  //   -- has no non-trivial copy assignment operators,
421426391cd51af86f9d59eceb0fb1c42153eccbb9aRichard Smith  if (hasNonTrivialCopyAssignment()) return false;
422b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth  //   -- has no non-trivial move assignment operators, and
423426391cd51af86f9d59eceb0fb1c42153eccbb9aRichard Smith  if (hasNonTrivialMoveAssignment()) return false;
424b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth  //   -- has a trivial destructor.
425b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth  if (!hasTrivialDestructor()) return false;
426b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth
427b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth  return true;
428b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth}
429b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth
4302138664dd2cff39de52ff11ca35f653c20b2e4b0Douglas Gregorvoid CXXRecordDecl::markedVirtualFunctionPure() {
4312138664dd2cff39de52ff11ca35f653c20b2e4b0Douglas Gregor  // C++ [class.abstract]p2:
4322138664dd2cff39de52ff11ca35f653c20b2e4b0Douglas Gregor  //   A class is abstract if it has at least one pure virtual function.
4332138664dd2cff39de52ff11ca35f653c20b2e4b0Douglas Gregor  data().Abstract = true;
4342138664dd2cff39de52ff11ca35f653c20b2e4b0Douglas Gregor}
4352138664dd2cff39de52ff11ca35f653c20b2e4b0Douglas Gregor
4362138664dd2cff39de52ff11ca35f653c20b2e4b0Douglas Gregorvoid CXXRecordDecl::addedMember(Decl *D) {
43717d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos  if (!D->isImplicit() &&
43817d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos      !isa<FieldDecl>(D) &&
43917d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos      !isa<IndirectFieldDecl>(D) &&
44017d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos      (!isa<TagDecl>(D) || cast<TagDecl>(D)->getTagKind() == TTK_Class ||
44117d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos        cast<TagDecl>(D)->getTagKind() == TTK_Interface))
44217d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos    data().HasOnlyCMembers = false;
44317d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos
44417d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos  // Ignore friends and invalid declarations.
44527c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor  if (D->getFriendObjectKind() || D->isInvalidDecl())
4465c0646b98b203d105c10ad8cc11be11cc99a4218Douglas Gregor    return;
4475c0646b98b203d105c10ad8cc11be11cc99a4218Douglas Gregor
44827c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor  FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D);
44927c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor  if (FunTmpl)
45027c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor    D = FunTmpl->getTemplatedDecl();
4514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // FIXME: Pass NamedDecl* to addedMember?
4534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Decl *DUnderlying = D;
4544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (auto *ND = dyn_cast<NamedDecl>(DUnderlying)) {
4554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    DUnderlying = ND->getUnderlyingDecl();
4564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (FunctionTemplateDecl *UnderlyingFunTmpl =
4574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            dyn_cast<FunctionTemplateDecl>(DUnderlying))
4584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      DUnderlying = UnderlyingFunTmpl->getTemplatedDecl();
4594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
46027c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor
4619fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor  if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
4629fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor    if (Method->isVirtual()) {
4639fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor      // C++ [dcl.init.aggr]p1:
4649fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor      //   An aggregate is an array or a class with [...] no virtual functions.
4659fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor      data().Aggregate = false;
4669fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor
4679fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor      // C++ [class]p4:
4689fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor      //   A POD-struct is an aggregate class...
4699fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor      data().PlainOldData = false;
4702cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor
4714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // C++14 [meta.unary.prop]p4:
4724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      //   T is a class type [...] with [...] no virtual member functions...
4732cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor      data().Empty = false;
47485606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor
47585606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor      // C++ [class.virtual]p1:
47685606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor      //   A class that declares or inherits a virtual function is called a
47785606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor      //   polymorphic class.
47885606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor      data().Polymorphic = true;
4794d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth
4807d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      // C++11 [class.ctor]p5, C++11 [class.copy]p12, C++11 [class.copy]p25:
4817d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      //   A [default constructor, copy/move constructor, or copy/move
4827d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      //   assignment operator for a class X] is trivial [...] if:
4834d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth      //    -- class X has no virtual functions [...]
4847d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      data().HasTrivialSpecialMembers &= SMF_Destructor;
4854d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth
486a8225449421e8c1e996a7c48300521028946482aChandler Carruth      // C++0x [class]p7:
487a8225449421e8c1e996a7c48300521028946482aChandler Carruth      //   A standard-layout class is a class that: [...]
488a8225449421e8c1e996a7c48300521028946482aChandler Carruth      //    -- has no virtual functions
489ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth      data().IsStandardLayout = false;
4909fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor    }
4919fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor  }
4922cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor
493acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith  // Notify the listener if an implicit member was added after the definition
494acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith  // was completed.
495acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith  if (!isBeingDefined() && D->isImplicit())
496acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith    if (ASTMutationListener *L = getASTMutationListener())
497acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith      L->AddedCXXImplicitMember(data().Definition, D);
498acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith
4997d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith  // The kind of special member this declaration is, if any.
5007d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith  unsigned SMKind = 0;
5017d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith
502acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith  // Handle constructors.
50327c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor  if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
504acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith    if (!Constructor->isImplicit()) {
505acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith      // Note that we have a user-declared constructor.
506acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith      data().UserDeclaredConstructor = true;
507acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith
508acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith      // C++ [class]p4:
509acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith      //   A POD-struct is an aggregate class [...]
510acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith      // Since the POD bit is meant to be C++03 POD-ness, clear it even if the
511acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith      // type is technically an aggregate in C++0x since it wouldn't be in 03.
512acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith      data().PlainOldData = false;
513acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith    }
5148bc3fa4eb6bcb307bef7965a9578afffe22eab4bFariborz Jahanian
51537b8c9ee7cf2b4d5ce3ccd3be1fcadd18a783a57Sean Hunt    if (Constructor->isDefaultConstructor()) {
5167d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      SMKind |= SMF_DefaultConstructor;
5177d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith
5184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (Constructor->isUserProvided())
519cdee3fee8ca4df7fb9179f29cc3ba96ac4fd0f95Sean Hunt        data().UserProvidedDefaultConstructor = true;
520acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith      if (Constructor->isConstexpr())
5216180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith        data().HasConstexprDefaultConstructor = true;
5224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (Constructor->isDefaulted())
5234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        data().HasDefaultedDefaultConstructor = true;
52437b8c9ee7cf2b4d5ce3ccd3be1fcadd18a783a57Sean Hunt    }
52527c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor
5264d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth    if (!FunTmpl) {
527acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith      unsigned Quals;
528acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith      if (Constructor->isCopyConstructor(Quals)) {
5297d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        SMKind |= SMF_CopyConstructor;
530acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith
531acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        if (Quals & Qualifiers::Const)
532acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith          data().HasDeclaredCopyConstructorWithConstParam = true;
5337d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      } else if (Constructor->isMoveConstructor())
5347d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        SMKind |= SMF_MoveConstructor;
53527c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor    }
5364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
537acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith
5384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Handle constructors, including those inherited from base classes.
5394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (CXXConstructorDecl *Constructor =
5404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          dyn_cast<CXXConstructorDecl>(DUnderlying)) {
541acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith    // Record if we see any constexpr constructors which are neither copy
542acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith    // nor move constructors.
5434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // C++1z [basic.types]p10:
5444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    //   [...] has at least one constexpr constructor or constructor template
5454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    //   (possibly inherited from a base class) that is not a copy or move
5464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    //   constructor [...]
547acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith    if (Constructor->isConstexpr() && !Constructor->isCopyOrMoveConstructor())
5486b8bc0707f26aa6acfdd80a59b9a3850cafbe387Richard Smith      data().HasConstexprNonCopyMoveConstructor = true;
5494d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth
55037b8c9ee7cf2b4d5ce3ccd3be1fcadd18a783a57Sean Hunt    // C++ [dcl.init.aggr]p1:
55137b8c9ee7cf2b4d5ce3ccd3be1fcadd18a783a57Sean Hunt    //   An aggregate is an array or a class with no user-declared
55237b8c9ee7cf2b4d5ce3ccd3be1fcadd18a783a57Sean Hunt    //   constructors [...].
553c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith    // C++11 [dcl.init.aggr]p1:
55437b8c9ee7cf2b4d5ce3ccd3be1fcadd18a783a57Sean Hunt    //   An aggregate is an array or a class with no user-provided
55537b8c9ee7cf2b4d5ce3ccd3be1fcadd18a783a57Sean Hunt    //   constructors [...].
5564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // C++11 [dcl.init.aggr]p1:
5574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    //   An aggregate is an array or a class with no user-provided
5584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    //   constructors (including those inherited from a base class) [...].
55980ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith    if (getASTContext().getLangOpts().CPlusPlus11
5604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            ? Constructor->isUserProvided()
5614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            : !Constructor->isImplicit())
56237b8c9ee7cf2b4d5ce3ccd3be1fcadd18a783a57Sean Hunt      data().Aggregate = false;
5631f2023ab8b35e0f665eb6c0f11dd6d9b9bca12b8Douglas Gregor  }
564030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor
565acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith  // Handle destructors.
566cf34e757b968f1fa7965cab1464212ade4d9f991Sean Hunt  if (CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(D)) {
5677d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith    SMKind |= SMF_Destructor;
568dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith
569651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (DD->isUserProvided())
570acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith      data().HasIrrelevantDestructor = false;
571651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // If the destructor is explicitly defaulted and not trivial or not public
572651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // or if the destructor is deleted, we clear HasIrrelevantDestructor in
573651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // finishedDefaultedOrDeletedMember.
574acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith
575acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith    // C++11 [class.dtor]p5:
5767d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith    //   A destructor is trivial if [...] the destructor is not virtual.
5777d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith    if (DD->isVirtual())
5787d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      data().HasTrivialSpecialMembers &= ~SMF_Destructor;
5790ed2e0823cc7b727abd9307db4cd887f293eebe2Douglas Gregor  }
580acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith
581acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith  // Handle member functions.
58227c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor  if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
583ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt    if (Method->isCopyAssignmentOperator()) {
5847d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      SMKind |= SMF_CopyAssignment;
5854d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth
586acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith      const ReferenceType *ParamTy =
587acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        Method->getParamDecl(0)->getType()->getAs<ReferenceType>();
588acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith      if (!ParamTy || ParamTy->getPointeeType().isConstQualified())
589acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        data().HasDeclaredCopyAssignmentWithConstParam = true;
590ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt    }
591ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt
5927d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith    if (Method->isMoveAssignmentOperator())
5937d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      SMKind |= SMF_MoveAssignment;
5944d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth
595e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor    // Keep the list of conversion functions up-to-date.
596e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor    if (CXXConversionDecl *Conversion = dyn_cast<CXXConversionDecl>(D)) {
597109f5fc8dff6f3bd707e0e4140dc99ef7d4f3e88Douglas Gregor      // FIXME: We use the 'unsafe' accessor for the access specifier here,
598109f5fc8dff6f3bd707e0e4140dc99ef7d4f3e88Douglas Gregor      // because Sema may not have set it yet. That's really just a misdesign
599109f5fc8dff6f3bd707e0e4140dc99ef7d4f3e88Douglas Gregor      // in Sema. However, LLDB *will* have set the access specifier correctly,
600109f5fc8dff6f3bd707e0e4140dc99ef7d4f3e88Douglas Gregor      // and adds declarations after the class is technically completed,
601109f5fc8dff6f3bd707e0e4140dc99ef7d4f3e88Douglas Gregor      // so completeDefinition()'s overriding of the access specifiers doesn't
602109f5fc8dff6f3bd707e0e4140dc99ef7d4f3e88Douglas Gregor      // work.
603109f5fc8dff6f3bd707e0e4140dc99ef7d4f3e88Douglas Gregor      AccessSpecifier AS = Conversion->getAccessUnsafe();
604109f5fc8dff6f3bd707e0e4140dc99ef7d4f3e88Douglas Gregor
6057d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      if (Conversion->getPrimaryTemplate()) {
6067d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        // We don't record specializations.
607e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor      } else {
608c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith        ASTContext &Ctx = getASTContext();
609c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith        ASTUnresolvedSet &Conversions = data().Conversions.get(Ctx);
610c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith        NamedDecl *Primary =
611c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith            FunTmpl ? cast<NamedDecl>(FunTmpl) : cast<NamedDecl>(Conversion);
612c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith        if (Primary->getPreviousDecl())
613c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith          Conversions.replace(cast<NamedDecl>(Primary->getPreviousDecl()),
614c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith                              Primary, AS);
615e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor        else
616c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith          Conversions.addDecl(Ctx, Primary, AS);
617e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor      }
618e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor    }
619acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith
6207d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith    if (SMKind) {
621ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith      // If this is the first declaration of a special member, we no longer have
622ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith      // an implicit trivial special member.
623ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith      data().HasTrivialSpecialMembers &=
624ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith        data().DeclaredSpecialMembers | ~SMKind;
625ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith
626ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith      if (!Method->isImplicit() && !Method->isUserProvided()) {
627ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith        // This method is user-declared but not user-provided. We can't work out
628ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith        // whether it's trivial yet (not until we get to the end of the class).
629ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith        // We'll handle this method in finishedDefaultedOrDeletedMember.
630ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith      } else if (Method->isTrivial())
631ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith        data().HasTrivialSpecialMembers |= SMKind;
632ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith      else
633ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith        data().DeclaredNonTrivialSpecialMembers |= SMKind;
634ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith
6357d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      // Note when we have declared a declared special member, and suppress the
6367d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      // implicit declaration of this special member.
6377d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      data().DeclaredSpecialMembers |= SMKind;
6387d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith
6397d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      if (!Method->isImplicit()) {
6407d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        data().UserDeclaredSpecialMembers |= SMKind;
6417d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith
6427d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        // C++03 [class]p4:
6437d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        //   A POD-struct is an aggregate class that has [...] no user-defined
6447d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        //   copy assignment operator and no user-defined destructor.
6457d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        //
6467d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        // Since the POD bit is meant to be C++03 POD-ness, and in C++03,
6477d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        // aggregates could not have any constructors, clear it even for an
6487d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        // explicitly defaulted or deleted constructor.
6497d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        // type is technically an aggregate in C++0x since it wouldn't be in 03.
6507d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        //
6517d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        // Also, a user-declared move assignment operator makes a class non-POD.
6527d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        // This is an extension in C++03.
6537d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith        data().PlainOldData = false;
6547d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      }
6557d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith    }
6567d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith
65764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl    return;
65827c08ab4859d071efa158a256f7e47e13d924443Douglas Gregor  }
6597d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith
6609fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor  // Handle non-static data members.
6619fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor  if (FieldDecl *Field = dyn_cast<FieldDecl>(D)) {
662d61db33331c264d6361283602b248a7423040597Douglas Gregor    // C++ [class.bit]p2:
663d61db33331c264d6361283602b248a7423040597Douglas Gregor    //   A declaration for a bit-field that omits the identifier declares an
664d61db33331c264d6361283602b248a7423040597Douglas Gregor    //   unnamed bit-field. Unnamed bit-fields are not members and cannot be
665d61db33331c264d6361283602b248a7423040597Douglas Gregor    //   initialized.
666d61db33331c264d6361283602b248a7423040597Douglas Gregor    if (Field->isUnnamedBitfield())
667d61db33331c264d6361283602b248a7423040597Douglas Gregor      return;
668d61db33331c264d6361283602b248a7423040597Douglas Gregor
6699fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor    // C++ [dcl.init.aggr]p1:
6709fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor    //   An aggregate is an array or a class (clause 9) with [...] no
6719fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor    //   private or protected non-static data members (clause 11).
6729fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor    //
6739fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor    // A POD must be an aggregate.
6749fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor    if (D->getAccess() == AS_private || D->getAccess() == AS_protected) {
6759fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor      data().Aggregate = false;
6769fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor      data().PlainOldData = false;
6779fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor    }
678a8225449421e8c1e996a7c48300521028946482aChandler Carruth
679a8225449421e8c1e996a7c48300521028946482aChandler Carruth    // C++0x [class]p7:
680a8225449421e8c1e996a7c48300521028946482aChandler Carruth    //   A standard-layout class is a class that:
681a8225449421e8c1e996a7c48300521028946482aChandler Carruth    //    [...]
682a8225449421e8c1e996a7c48300521028946482aChandler Carruth    //    -- has the same access control for all non-static data members,
683a8225449421e8c1e996a7c48300521028946482aChandler Carruth    switch (D->getAccess()) {
684a8225449421e8c1e996a7c48300521028946482aChandler Carruth    case AS_private:    data().HasPrivateFields = true;   break;
685a8225449421e8c1e996a7c48300521028946482aChandler Carruth    case AS_protected:  data().HasProtectedFields = true; break;
686a8225449421e8c1e996a7c48300521028946482aChandler Carruth    case AS_public:     data().HasPublicFields = true;    break;
687b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    case AS_none:       llvm_unreachable("Invalid access specifier");
688a8225449421e8c1e996a7c48300521028946482aChandler Carruth    };
689a8225449421e8c1e996a7c48300521028946482aChandler Carruth    if ((data().HasPrivateFields + data().HasProtectedFields +
690a8225449421e8c1e996a7c48300521028946482aChandler Carruth         data().HasPublicFields) > 1)
691ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth      data().IsStandardLayout = false;
692a8225449421e8c1e996a7c48300521028946482aChandler Carruth
6932bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor    // Keep track of the presence of mutable fields.
6942bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor    if (Field->isMutable())
6952bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor      data().HasMutableFields = true;
696651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
697651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // C++11 [class.union]p8, DR1460:
698651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    //   If X is a union, a non-static data member of X that is not an anonymous
699651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    //   union is a variant member of X.
700651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (isUnion() && !Field->isAnonymousStructOrUnion())
701651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      data().HasVariantMembers = true;
702651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
7034d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth    // C++0x [class]p9:
7049fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor    //   A POD struct is a class that is both a trivial class and a
7059fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor    //   standard-layout class, and has no non-static data members of type
7069fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor    //   non-POD struct, non-POD union (or array of such types).
707f85e193739c953358c865005855253af4f68a497John McCall    //
708f85e193739c953358c865005855253af4f68a497John McCall    // Automatic Reference Counting: the presence of a member of Objective-C pointer type
709f85e193739c953358c865005855253af4f68a497John McCall    // that does not explicitly have no lifetime makes the class a non-POD.
7109fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor    ASTContext &Context = getASTContext();
7119fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor    QualType T = Context.getBaseElementType(Field->getType());
712f85e193739c953358c865005855253af4f68a497John McCall    if (T->isObjCRetainableType() || T.isObjCGCStrong()) {
713176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (!Context.getLangOpts().ObjCAutoRefCount) {
714f85e193739c953358c865005855253af4f68a497John McCall        setHasObjectMember(true);
715176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      } else if (T.getObjCLifetime() != Qualifiers::OCL_ExplicitNone) {
716176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        // Objective-C Automatic Reference Counting:
717176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //   If a class has a non-static data member of Objective-C pointer
718176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //   type (or array thereof), it is a non-POD type and its
719176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //   default constructor (if any), copy constructor, move constructor,
720176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //   copy assignment operator, move assignment operator, and destructor are
721176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //   non-trivial.
722176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        setHasObjectMember(true);
723176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        struct DefinitionData &Data = data();
724176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        Data.PlainOldData = false;
725176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        Data.HasTrivialSpecialMembers = 0;
726176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        Data.HasIrrelevantDestructor = false;
727176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
728654005265b1faab223f055bff3dd254476df7ff5Eli Friedman    } else if (!T.isCXX98PODType(Context))
7299fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor      data().PlainOldData = false;
730f85e193739c953358c865005855253af4f68a497John McCall
731a8225449421e8c1e996a7c48300521028946482aChandler Carruth    if (T->isReferenceType()) {
732d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith      if (!Field->hasInClassInitializer())
733d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith        data().HasUninitializedReferenceMember = true;
7349b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth
735a8225449421e8c1e996a7c48300521028946482aChandler Carruth      // C++0x [class]p7:
736a8225449421e8c1e996a7c48300521028946482aChandler Carruth      //   A standard-layout class is a class that:
737a8225449421e8c1e996a7c48300521028946482aChandler Carruth      //    -- has no non-static data members of type [...] reference,
738ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth      data().IsStandardLayout = false;
739a8225449421e8c1e996a7c48300521028946482aChandler Carruth    }
740a8225449421e8c1e996a7c48300521028946482aChandler Carruth
7414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (!Field->hasInClassInitializer() && !Field->isMutable()) {
7424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (CXXRecordDecl *FieldType = Field->getType()->getAsCXXRecordDecl()) {
7434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        if (FieldType->hasDefinition() && !FieldType->allowConstDefaultInit())
7444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          data().HasUninitializedFields = true;
7454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      } else {
7464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        data().HasUninitializedFields = true;
7474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
7484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
7494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
75086c3ae46250cdcc57778c27826060779a92f3815Richard Smith    // Record if this field is the first non-literal or volatile field or base.
751a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    if (!T->isLiteralType(Context) || T.isVolatileQualified())
7529b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth      data().HasNonLiteralTypeFieldsOrBases = true;
7539b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth
754651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Field->hasInClassInitializer() ||
755651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        (Field->isAnonymousStructOrUnion() &&
756651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         Field->getType()->getAsCXXRecordDecl()->hasInClassInitializer())) {
757d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith      data().HasInClassInitializer = true;
758d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith
759d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith      // C++11 [class]p5:
7607a614d8380297fcd2bc23986241905d97222948cRichard Smith      //   A default constructor is trivial if [...] no non-static data member
7617a614d8380297fcd2bc23986241905d97222948cRichard Smith      //   of its class has a brace-or-equal-initializer.
7627d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith      data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
7637a614d8380297fcd2bc23986241905d97222948cRichard Smith
764d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith      // C++11 [dcl.init.aggr]p1:
7657a614d8380297fcd2bc23986241905d97222948cRichard Smith      //   An aggregate is a [...] class with [...] no
7667a614d8380297fcd2bc23986241905d97222948cRichard Smith      //   brace-or-equal-initializers for non-static data members.
767c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith      //
7684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // This rule was removed in C++14.
769176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (!getASTContext().getLangOpts().CPlusPlus14)
770c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith        data().Aggregate = false;
7717a614d8380297fcd2bc23986241905d97222948cRichard Smith
772d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith      // C++11 [class]p10:
7737a614d8380297fcd2bc23986241905d97222948cRichard Smith      //   A POD struct is [...] a trivial class.
7747a614d8380297fcd2bc23986241905d97222948cRichard Smith      data().PlainOldData = false;
7757a614d8380297fcd2bc23986241905d97222948cRichard Smith    }
7767a614d8380297fcd2bc23986241905d97222948cRichard Smith
777bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith    // C++11 [class.copy]p23:
778bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith    //   A defaulted copy/move assignment operator for a class X is defined
779bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith    //   as deleted if X has:
780bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith    //    -- a non-static data member of reference type
781bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith    if (T->isReferenceType())
782bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith      data().DefaultedMoveAssignmentIsDeleted = true;
783bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith
78485606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor    if (const RecordType *RecordTy = T->getAs<RecordType>()) {
78585606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor      CXXRecordDecl* FieldRec = cast<CXXRecordDecl>(RecordTy->getDecl());
78685606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor      if (FieldRec->getDefinition()) {
787bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith        addedClassSubobject(FieldRec);
788bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith
7897bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling        // We may need to perform overload resolution to determine whether a
7907bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling        // field can be moved if it's const or volatile qualified.
7917bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling        if (T.getCVRQualifiers() & (Qualifiers::Const | Qualifiers::Volatile)) {
7927bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling          data().NeedOverloadResolutionForMoveConstructor = true;
7937bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling          data().NeedOverloadResolutionForMoveAssignment = true;
7947bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling        }
7957bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling
796bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith        // C++11 [class.ctor]p5, C++11 [class.copy]p11:
797bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith        //   A defaulted [special member] for a class X is defined as
798bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith        //   deleted if:
799bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith        //    -- X is a union-like class that has a variant member with a
800bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith        //       non-trivial [corresponding special member]
801bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith        if (isUnion()) {
802bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith          if (FieldRec->hasNonTrivialMoveConstructor())
803bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith            data().DefaultedMoveConstructorIsDeleted = true;
804bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith          if (FieldRec->hasNonTrivialMoveAssignment())
805bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith            data().DefaultedMoveAssignmentIsDeleted = true;
806bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith          if (FieldRec->hasNonTrivialDestructor())
807bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith            data().DefaultedDestructorIsDeleted = true;
808bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith        }
809bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith
810023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt        // C++0x [class.ctor]p5:
8116180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith        //   A default constructor is trivial [...] if:
812023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt        //    -- for all the non-static data members of its class that are of
813023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt        //       class type (or array thereof), each such class has a trivial
814023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt        //       default constructor.
815023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt        if (!FieldRec->hasTrivialDefaultConstructor())
8167d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith          data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
8174d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth
8184d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth        // C++0x [class.copy]p13:
8194d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth        //   A copy/move constructor for class X is trivial if [...]
8204d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth        //    [...]
8214d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth        //    -- for each non-static data member of X that is of class type (or
8224d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth        //       an array thereof), the constructor selected to copy/move that
8234d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth        //       member is trivial;
82485606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor        if (!FieldRec->hasTrivialCopyConstructor())
8257d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith          data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor;
826bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith        // If the field doesn't have a simple move constructor, we'll eagerly
827bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith        // declare the move constructor for this class and we'll decide whether
828bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith        // it's trivial then.
829426391cd51af86f9d59eceb0fb1c42153eccbb9aRichard Smith        if (!FieldRec->hasTrivialMoveConstructor())
8307d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith          data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor;
8314d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth
8324d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth        // C++0x [class.copy]p27:
8334d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth        //   A copy/move assignment operator for class X is trivial if [...]
8344d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth        //    [...]
8354d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth        //    -- for each non-static data member of X that is of class type (or
8364d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth        //       an array thereof), the assignment operator selected to
8374d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth        //       copy/move that member is trivial;
83885606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor        if (!FieldRec->hasTrivialCopyAssignment())
8397d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith          data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment;
840bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith        // If the field doesn't have a simple move assignment, we'll eagerly
841bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith        // declare the move assignment for this class and we'll decide whether
842bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith        // it's trivial then.
843426391cd51af86f9d59eceb0fb1c42153eccbb9aRichard Smith        if (!FieldRec->hasTrivialMoveAssignment())
8447d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith          data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment;
8454d6e5a22d9481bb83b82d911727540096d171c0bChandler Carruth
84685606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor        if (!FieldRec->hasTrivialDestructor())
8477d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith          data().HasTrivialSpecialMembers &= ~SMF_Destructor;
848dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith        if (!FieldRec->hasIrrelevantDestructor())
849dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith          data().HasIrrelevantDestructor = false;
850f85e193739c953358c865005855253af4f68a497John McCall        if (FieldRec->hasObjectMember())
851f85e193739c953358c865005855253af4f68a497John McCall          setHasObjectMember(true);
8523ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian        if (FieldRec->hasVolatileMember())
8533ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian          setHasVolatileMember(true);
854a8225449421e8c1e996a7c48300521028946482aChandler Carruth
855a8225449421e8c1e996a7c48300521028946482aChandler Carruth        // C++0x [class]p7:
856a8225449421e8c1e996a7c48300521028946482aChandler Carruth        //   A standard-layout class is a class that:
857a8225449421e8c1e996a7c48300521028946482aChandler Carruth        //    -- has no non-static data members of type non-standard-layout
858a8225449421e8c1e996a7c48300521028946482aChandler Carruth        //       class (or array of such types) [...]
859ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth        if (!FieldRec->isStandardLayout())
860ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth          data().IsStandardLayout = false;
861a8225449421e8c1e996a7c48300521028946482aChandler Carruth
862a8225449421e8c1e996a7c48300521028946482aChandler Carruth        // C++0x [class]p7:
863a8225449421e8c1e996a7c48300521028946482aChandler Carruth        //   A standard-layout class is a class that:
864a8225449421e8c1e996a7c48300521028946482aChandler Carruth        //    [...]
865a8225449421e8c1e996a7c48300521028946482aChandler Carruth        //    -- has no base classes of the same type as the first non-static
866a8225449421e8c1e996a7c48300521028946482aChandler Carruth        //       data member.
867a8225449421e8c1e996a7c48300521028946482aChandler Carruth        // We don't want to expend bits in the state of the record decl
868a8225449421e8c1e996a7c48300521028946482aChandler Carruth        // tracking whether this is the first non-static data member so we
869a8225449421e8c1e996a7c48300521028946482aChandler Carruth        // cheat a bit and use some of the existing state: the empty bit.
870a8225449421e8c1e996a7c48300521028946482aChandler Carruth        // Virtual bases and virtual methods make a class non-empty, but they
871a8225449421e8c1e996a7c48300521028946482aChandler Carruth        // also make it non-standard-layout so we needn't check here.
872a8225449421e8c1e996a7c48300521028946482aChandler Carruth        // A non-empty base class may leave the class standard-layout, but not
873651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        // if we have arrived here, and have at least one non-static data
874ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth        // member. If IsStandardLayout remains true, then the first non-static
875a8225449421e8c1e996a7c48300521028946482aChandler Carruth        // data member must come through here with Empty still true, and Empty
876a8225449421e8c1e996a7c48300521028946482aChandler Carruth        // will subsequently be set to false below.
877ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth        if (data().IsStandardLayout && data().Empty) {
878651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          for (const auto &BI : bases()) {
879651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            if (Context.hasSameUnqualifiedType(BI.getType(), T)) {
880ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth              data().IsStandardLayout = false;
881a8225449421e8c1e996a7c48300521028946482aChandler Carruth              break;
882a8225449421e8c1e996a7c48300521028946482aChandler Carruth            }
883a8225449421e8c1e996a7c48300521028946482aChandler Carruth          }
884a8225449421e8c1e996a7c48300521028946482aChandler Carruth        }
8852bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor
8862bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor        // Keep track of the presence of mutable fields.
8872bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor        if (FieldRec->hasMutableFields())
8882bb110125e0e5adb7c1c65d12adfa34151ca1c47Douglas Gregor          data().HasMutableFields = true;
8896180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
8906180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith        // C++11 [class.copy]p13:
8916180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith        //   If the implicitly-defined constructor would satisfy the
8926180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith        //   requirements of a constexpr constructor, the implicitly-defined
8936180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith        //   constructor is constexpr.
8946180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith        // C++11 [dcl.constexpr]p4:
8956180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith        //    -- every constructor involved in initializing non-static data
8966180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith        //       members [...] shall be a constexpr constructor
8976180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith        if (!Field->hasInClassInitializer() &&
898d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith            !FieldRec->hasConstexprDefaultConstructor() && !isUnion())
8996180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith          // The standard requires any in-class initializer to be a constant
9006180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith          // expression. We consider this to be a defect.
9016180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith          data().DefaultedDefaultConstructorIsConstexpr = false;
902acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith
903acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        // C++11 [class.copy]p8:
904acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        //   The implicitly-declared copy constructor for a class X will have
905acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        //   the form 'X::X(const X&)' if [...] for all the non-static data
906acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        //   members of X that are of a class type M (or array thereof), each
907acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        //   such class type has a copy constructor whose first parameter is
908acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        //   of type 'const M&' or 'const volatile M&'.
909acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        if (!FieldRec->hasCopyConstructorWithConstParam())
910acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith          data().ImplicitCopyConstructorHasConstParam = false;
911acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith
912acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        // C++11 [class.copy]p18:
913acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        //   The implicitly-declared copy assignment oeprator for a class X will
914acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        //   have the form 'X& X::operator=(const X&)' if [...] for all the
915acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        //   non-static data members of X that are of a class type M (or array
916acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        //   thereof), each such class type has a copy assignment operator whose
917acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        //   parameter is of type 'const M&', 'const volatile M&' or 'M'.
918acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith        if (!FieldRec->hasCopyAssignmentWithConstParam())
919acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith          data().ImplicitCopyAssignmentHasConstParam = false;
920d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith
921d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith        if (FieldRec->hasUninitializedReferenceMember() &&
922d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith            !Field->hasInClassInitializer())
923d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith          data().HasUninitializedReferenceMember = true;
924651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
925651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        // C++11 [class.union]p8, DR1460:
926651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        //   a non-static data member of an anonymous union that is a member of
927651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        //   X is also a variant member of X.
928651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        if (FieldRec->hasVariantMembers() &&
929651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            Field->isAnonymousStructOrUnion())
930651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          data().HasVariantMembers = true;
93185606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor      }
9326180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    } else {
9336180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      // Base element type of field is a non-class type.
934a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith      if (!T->isLiteralType(Context) ||
935d3861ce75a308c65b58c0159e2cee58aea2dff1cRichard Smith          (!Field->hasInClassInitializer() && !isUnion()))
9366180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith        data().DefaultedDefaultConstructorIsConstexpr = false;
937bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith
938bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith      // C++11 [class.copy]p23:
939bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith      //   A defaulted copy/move assignment operator for a class X is defined
940bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith      //   as deleted if X has:
941bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith      //    -- a non-static data member of const non-class type (or array
942bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith      //       thereof)
943bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith      if (T.isConstQualified())
944bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith        data().DefaultedMoveAssignmentIsDeleted = true;
94585606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor    }
946a8225449421e8c1e996a7c48300521028946482aChandler Carruth
947a8225449421e8c1e996a7c48300521028946482aChandler Carruth    // C++0x [class]p7:
948a8225449421e8c1e996a7c48300521028946482aChandler Carruth    //   A standard-layout class is a class that:
949a8225449421e8c1e996a7c48300521028946482aChandler Carruth    //    [...]
950a8225449421e8c1e996a7c48300521028946482aChandler Carruth    //    -- either has no non-static data members in the most derived
951a8225449421e8c1e996a7c48300521028946482aChandler Carruth    //       class and at most one base class with non-static data members,
952a8225449421e8c1e996a7c48300521028946482aChandler Carruth    //       or has no base classes with non-static data members, and
953a8225449421e8c1e996a7c48300521028946482aChandler Carruth    // At this point we know that we have a non-static data member, so the last
954a8225449421e8c1e996a7c48300521028946482aChandler Carruth    // clause holds.
955a8225449421e8c1e996a7c48300521028946482aChandler Carruth    if (!data().HasNoNonEmptyBases)
956ec997dc66627957bcdcd3db7906a68c1e14a279cChandler Carruth      data().IsStandardLayout = false;
957a8225449421e8c1e996a7c48300521028946482aChandler Carruth
9584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // C++14 [meta.unary.prop]p4:
9594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    //   T is a class type [...] with [...] no non-static data members other
9604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    //   than bit-fields of length 0...
9612cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor    if (data().Empty) {
962a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith      if (!Field->isBitField() ||
963a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          (!Field->getBitWidth()->isTypeDependent() &&
964a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith           !Field->getBitWidth()->isValueDependent() &&
965a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith           Field->getBitWidthValue(Context) != 0))
9662cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor        data().Empty = false;
9672cf9d656f6283f2a8be0549da110d7cfbb1ea4b2Douglas Gregor    }
9689fe183ae1ec568716501f861235afecebee8cd45Douglas Gregor  }
969e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor
970e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor  // Handle using declarations of conversion functions.
971c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith  if (UsingShadowDecl *Shadow = dyn_cast<UsingShadowDecl>(D)) {
972e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor    if (Shadow->getDeclName().getNameKind()
973c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith          == DeclarationName::CXXConversionFunctionName) {
974c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith      ASTContext &Ctx = getASTContext();
975c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith      data().Conversions.get(Ctx).addDecl(Ctx, Shadow, Shadow->getAccess());
976c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith    }
977c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith  }
9784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (UsingDecl *Using = dyn_cast<UsingDecl>(D)) {
9804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (Using->getDeclName().getNameKind() ==
9814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        DeclarationName::CXXConstructorName)
9824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      data().HasInheritedConstructor = true;
9834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (Using->getDeclName().getCXXOverloadedOperator() == OO_Equal)
9854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      data().HasInheritedAssignment = true;
9864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
98717d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos}
98817d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos
989ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smithvoid CXXRecordDecl::finishedDefaultedOrDeletedMember(CXXMethodDecl *D) {
990ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith  assert(!D->isImplicit() && !D->isUserProvided());
991ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith
992ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith  // The kind of special member this declaration is, if any.
993ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith  unsigned SMKind = 0;
994ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith
995ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith  if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
996ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith    if (Constructor->isDefaultConstructor()) {
997ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith      SMKind |= SMF_DefaultConstructor;
998ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith      if (Constructor->isConstexpr())
999ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith        data().HasConstexprDefaultConstructor = true;
1000ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith    }
1001ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith    if (Constructor->isCopyConstructor())
1002ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith      SMKind |= SMF_CopyConstructor;
1003ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith    else if (Constructor->isMoveConstructor())
1004ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith      SMKind |= SMF_MoveConstructor;
1005ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith    else if (Constructor->isConstexpr())
1006ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith      // We may now know that the constructor is constexpr.
1007ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith      data().HasConstexprNonCopyMoveConstructor = true;
1008651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } else if (isa<CXXDestructorDecl>(D)) {
1009ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith    SMKind |= SMF_Destructor;
1010651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!D->isTrivial() || D->getAccess() != AS_public || D->isDeleted())
1011651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      data().HasIrrelevantDestructor = false;
1012651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } else if (D->isCopyAssignmentOperator())
1013ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith    SMKind |= SMF_CopyAssignment;
1014ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith  else if (D->isMoveAssignmentOperator())
1015ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith    SMKind |= SMF_MoveAssignment;
1016ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith
1017ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith  // Update which trivial / non-trivial special members we have.
1018ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith  // addedMember will have skipped this step for this member.
1019ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith  if (D->isTrivial())
1020ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith    data().HasTrivialSpecialMembers |= SMKind;
1021ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith  else
1022ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith    data().DeclaredNonTrivialSpecialMembers |= SMKind;
1023ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith}
1024ac71351acdefc9de0c770c1d717e621ac9e684bfRichard Smith
102517d35c36fbae764fcd68fa8b31624078a033aabcJoao Matosbool CXXRecordDecl::isCLike() const {
102617d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos  if (getTagKind() == TTK_Class || getTagKind() == TTK_Interface ||
102717d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos      !TemplateOrInstantiation.isNull())
102817d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos    return false;
102917d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos  if (!hasDefinition())
103017d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos    return true;
1031277b15684582193d26f6c15b40e90a6e45299857Argyrios Kyrtzidis
1032c221411ad52edf93659392058341dfec4cdae4faArgyrios Kyrtzidis  return isPOD() && data().HasOnlyCMembers;
1033277b15684582193d26f6c15b40e90a6e45299857Argyrios Kyrtzidis}
1034bef582b0159e8f0deb606c7700e3590a6f5a4ab2Faisal Vali
1035fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Valibool CXXRecordDecl::isGenericLambda() const {
1036bef582b0159e8f0deb606c7700e3590a6f5a4ab2Faisal Vali  if (!isLambda()) return false;
1037bef582b0159e8f0deb606c7700e3590a6f5a4ab2Faisal Vali  return getLambdaData().IsGenericLambda;
1038fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali}
1039fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali
1040fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal ValiCXXMethodDecl* CXXRecordDecl::getLambdaCallOperator() const {
10416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!isLambda()) return nullptr;
104256fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali  DeclarationName Name =
104356fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali    getASTContext().DeclarationNames.getCXXOperatorName(OO_Call);
10440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  DeclContext::lookup_result Calls = lookup(Name);
104556fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali
104656fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali  assert(!Calls.empty() && "Missing lambda call operator!");
104756fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali  assert(Calls.size() == 1 && "More than one lambda call operator!");
104856fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali
104956fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali  NamedDecl *CallOp = Calls.front();
105056fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali  if (FunctionTemplateDecl *CallOpTmpl =
105156fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali                    dyn_cast<FunctionTemplateDecl>(CallOp))
105256fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali    return cast<CXXMethodDecl>(CallOpTmpl->getTemplatedDecl());
1053fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali
1054fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  return cast<CXXMethodDecl>(CallOp);
1055fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali}
1056fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali
1057fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal ValiCXXMethodDecl* CXXRecordDecl::getLambdaStaticInvoker() const {
10586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!isLambda()) return nullptr;
105956fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali  DeclarationName Name =
106056fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali    &getASTContext().Idents.get(getLambdaStaticInvokerName());
10610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  DeclContext::lookup_result Invoker = lookup(Name);
10626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (Invoker.empty()) return nullptr;
106356fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali  assert(Invoker.size() == 1 && "More than one static invoker operator!");
106456fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali  NamedDecl *InvokerFun = Invoker.front();
106556fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali  if (FunctionTemplateDecl *InvokerTemplate =
106656fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali                  dyn_cast<FunctionTemplateDecl>(InvokerFun))
106756fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali    return cast<CXXMethodDecl>(InvokerTemplate->getTemplatedDecl());
106856fe35b4e2a437bc7fee4ec321c742c8fd8c5cf6Faisal Vali
1069d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  return cast<CXXMethodDecl>(InvokerFun);
1070fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali}
1071fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali
10724d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregorvoid CXXRecordDecl::getCaptureFields(
10734d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor       llvm::DenseMap<const VarDecl *, FieldDecl *> &Captures,
107441105ad37a2de9bccfcd8137ccfa869cc8345275Eli Friedman       FieldDecl *&ThisCapture) const {
10754d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor  Captures.clear();
10766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ThisCapture = nullptr;
10774d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor
1078da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor  LambdaDefinitionData &Lambda = getLambdaData();
10794d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor  RecordDecl::field_iterator Field = field_begin();
10806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (const LambdaCapture *C = Lambda.Captures, *CEnd = C + Lambda.NumCaptures;
10814d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor       C != CEnd; ++C, ++Field) {
10820d8e9646bc000bab521ce52ed294209a92298cefRichard Smith    if (C->capturesThis())
1083581deb3da481053c4993c7600f97acf7768caac5David Blaikie      ThisCapture = *Field;
10840d8e9646bc000bab521ce52ed294209a92298cefRichard Smith    else if (C->capturesVariable())
10850d8e9646bc000bab521ce52ed294209a92298cefRichard Smith      Captures[C->getCapturedVar()] = *Field;
10864d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor  }
108704fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith  assert(Field == field_end());
10884d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor}
10894d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor
1090fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal ValiTemplateParameterList *
1091fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal ValiCXXRecordDecl::getGenericLambdaTemplateParameterList() const {
10926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!isLambda()) return nullptr;
1093fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  CXXMethodDecl *CallOp = getLambdaCallOperator();
1094fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  if (FunctionTemplateDecl *Tmpl = CallOp->getDescribedFunctionTemplate())
1095fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali    return Tmpl->getTemplateParameters();
10966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return nullptr;
1097fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali}
10984d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor
1099b05b5f35f114505182b076aa70002843c0669bebJohn McCallstatic CanQualType GetConversionType(ASTContext &Context, NamedDecl *Conv) {
1100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  QualType T =
1101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      cast<CXXConversionDecl>(Conv->getUnderlyingDecl()->getAsFunction())
1102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          ->getConversionType();
1103b05b5f35f114505182b076aa70002843c0669bebJohn McCall  return Context.getCanonicalType(T);
11040351a1e2e17c1edf27f90c23fbf65d8fcad995c4Fariborz Jahanian}
11050351a1e2e17c1edf27f90c23fbf65d8fcad995c4Fariborz Jahanian
1106b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// Collect the visible conversions of a base class.
1107b05b5f35f114505182b076aa70002843c0669bebJohn McCall///
1108a125350491ca56a2068e3ddcf96ffce007480b56James Dennett/// \param Record a base class of the class we're considering
1109b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// \param InVirtual whether this base class is a virtual base (or a base
1110b05b5f35f114505182b076aa70002843c0669bebJohn McCall///   of a virtual base)
1111b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// \param Access the access along the inheritance path to this base
1112b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// \param ParentHiddenTypes the conversions provided by the inheritors
1113b05b5f35f114505182b076aa70002843c0669bebJohn McCall///   of this base
1114b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// \param Output the set to which to add conversions from non-virtual bases
1115b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// \param VOutput the set to which to add conversions from virtual bases
1116b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// \param HiddenVBaseCs the set of conversions which were hidden in a
1117b05b5f35f114505182b076aa70002843c0669bebJohn McCall///   virtual base along some inheritance path
1118b05b5f35f114505182b076aa70002843c0669bebJohn McCallstatic void CollectVisibleConversions(ASTContext &Context,
1119b05b5f35f114505182b076aa70002843c0669bebJohn McCall                                      CXXRecordDecl *Record,
1120b05b5f35f114505182b076aa70002843c0669bebJohn McCall                                      bool InVirtual,
1121b05b5f35f114505182b076aa70002843c0669bebJohn McCall                                      AccessSpecifier Access,
1122b05b5f35f114505182b076aa70002843c0669bebJohn McCall                  const llvm::SmallPtrSet<CanQualType, 8> &ParentHiddenTypes,
11232a82ca255b0f99f6201a75ed52b91fc024f6e9cfArgyrios Kyrtzidis                                      ASTUnresolvedSet &Output,
1124b05b5f35f114505182b076aa70002843c0669bebJohn McCall                                      UnresolvedSetImpl &VOutput,
1125b05b5f35f114505182b076aa70002843c0669bebJohn McCall                           llvm::SmallPtrSet<NamedDecl*, 8> &HiddenVBaseCs) {
1126b05b5f35f114505182b076aa70002843c0669bebJohn McCall  // The set of types which have conversions in this class or its
1127b05b5f35f114505182b076aa70002843c0669bebJohn McCall  // subclasses.  As an optimization, we don't copy the derived set
1128b05b5f35f114505182b076aa70002843c0669bebJohn McCall  // unless it might change.
1129b05b5f35f114505182b076aa70002843c0669bebJohn McCall  const llvm::SmallPtrSet<CanQualType, 8> *HiddenTypes = &ParentHiddenTypes;
1130b05b5f35f114505182b076aa70002843c0669bebJohn McCall  llvm::SmallPtrSet<CanQualType, 8> HiddenTypesBuffer;
1131b05b5f35f114505182b076aa70002843c0669bebJohn McCall
1132b05b5f35f114505182b076aa70002843c0669bebJohn McCall  // Collect the direct conversions and figure out which conversions
1133b05b5f35f114505182b076aa70002843c0669bebJohn McCall  // will be hidden in the subclasses.
11349d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis  CXXRecordDecl::conversion_iterator ConvI = Record->conversion_begin();
11359d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis  CXXRecordDecl::conversion_iterator ConvE = Record->conversion_end();
11369d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis  if (ConvI != ConvE) {
1137b05b5f35f114505182b076aa70002843c0669bebJohn McCall    HiddenTypesBuffer = ParentHiddenTypes;
1138b05b5f35f114505182b076aa70002843c0669bebJohn McCall    HiddenTypes = &HiddenTypesBuffer;
1139b05b5f35f114505182b076aa70002843c0669bebJohn McCall
11409d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis    for (CXXRecordDecl::conversion_iterator I = ConvI; I != ConvE; ++I) {
1141f108c63ccc576fe6a3ca08399dbcec574b089ea8Richard Smith      CanQualType ConvType(GetConversionType(Context, I.getDecl()));
1142f108c63ccc576fe6a3ca08399dbcec574b089ea8Richard Smith      bool Hidden = ParentHiddenTypes.count(ConvType);
1143f108c63ccc576fe6a3ca08399dbcec574b089ea8Richard Smith      if (!Hidden)
1144f108c63ccc576fe6a3ca08399dbcec574b089ea8Richard Smith        HiddenTypesBuffer.insert(ConvType);
1145b05b5f35f114505182b076aa70002843c0669bebJohn McCall
1146b05b5f35f114505182b076aa70002843c0669bebJohn McCall      // If this conversion is hidden and we're in a virtual base,
1147b05b5f35f114505182b076aa70002843c0669bebJohn McCall      // remember that it's hidden along some inheritance path.
1148b05b5f35f114505182b076aa70002843c0669bebJohn McCall      if (Hidden && InVirtual)
1149b05b5f35f114505182b076aa70002843c0669bebJohn McCall        HiddenVBaseCs.insert(cast<NamedDecl>(I.getDecl()->getCanonicalDecl()));
1150b05b5f35f114505182b076aa70002843c0669bebJohn McCall
1151b05b5f35f114505182b076aa70002843c0669bebJohn McCall      // If this conversion isn't hidden, add it to the appropriate output.
1152b05b5f35f114505182b076aa70002843c0669bebJohn McCall      else if (!Hidden) {
1153b05b5f35f114505182b076aa70002843c0669bebJohn McCall        AccessSpecifier IAccess
1154b05b5f35f114505182b076aa70002843c0669bebJohn McCall          = CXXRecordDecl::MergeAccess(Access, I.getAccess());
1155b05b5f35f114505182b076aa70002843c0669bebJohn McCall
1156b05b5f35f114505182b076aa70002843c0669bebJohn McCall        if (InVirtual)
1157b05b5f35f114505182b076aa70002843c0669bebJohn McCall          VOutput.addDecl(I.getDecl(), IAccess);
11586250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian        else
11592a82ca255b0f99f6201a75ed52b91fc024f6e9cfArgyrios Kyrtzidis          Output.addDecl(Context, I.getDecl(), IAccess);
11605346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian      }
11615346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian    }
11625346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian  }
11639994a34f6cf842721ba7723edc0b9036229fe387Sebastian Redl
1164b05b5f35f114505182b076aa70002843c0669bebJohn McCall  // Collect information recursively from any base classes.
1165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto &I : Record->bases()) {
1166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const RecordType *RT = I.getType()->getAs<RecordType>();
1167b05b5f35f114505182b076aa70002843c0669bebJohn McCall    if (!RT) continue;
11689994a34f6cf842721ba7723edc0b9036229fe387Sebastian Redl
1169b05b5f35f114505182b076aa70002843c0669bebJohn McCall    AccessSpecifier BaseAccess
1170651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      = CXXRecordDecl::MergeAccess(Access, I.getAccessSpecifier());
1171651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool BaseInVirtual = InVirtual || I.isVirtual();
11729994a34f6cf842721ba7723edc0b9036229fe387Sebastian Redl
1173b05b5f35f114505182b076aa70002843c0669bebJohn McCall    CXXRecordDecl *Base = cast<CXXRecordDecl>(RT->getDecl());
1174b05b5f35f114505182b076aa70002843c0669bebJohn McCall    CollectVisibleConversions(Context, Base, BaseInVirtual, BaseAccess,
1175b05b5f35f114505182b076aa70002843c0669bebJohn McCall                              *HiddenTypes, Output, VOutput, HiddenVBaseCs);
11765346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian  }
1177b05b5f35f114505182b076aa70002843c0669bebJohn McCall}
11789994a34f6cf842721ba7723edc0b9036229fe387Sebastian Redl
1179b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// Collect the visible conversions of a class.
1180b05b5f35f114505182b076aa70002843c0669bebJohn McCall///
1181b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// This would be extremely straightforward if it weren't for virtual
1182b05b5f35f114505182b076aa70002843c0669bebJohn McCall/// bases.  It might be worth special-casing that, really.
1183b05b5f35f114505182b076aa70002843c0669bebJohn McCallstatic void CollectVisibleConversions(ASTContext &Context,
1184b05b5f35f114505182b076aa70002843c0669bebJohn McCall                                      CXXRecordDecl *Record,
11852a82ca255b0f99f6201a75ed52b91fc024f6e9cfArgyrios Kyrtzidis                                      ASTUnresolvedSet &Output) {
1186b05b5f35f114505182b076aa70002843c0669bebJohn McCall  // The collection of all conversions in virtual bases that we've
1187b05b5f35f114505182b076aa70002843c0669bebJohn McCall  // found.  These will be added to the output as long as they don't
1188b05b5f35f114505182b076aa70002843c0669bebJohn McCall  // appear in the hidden-conversions set.
1189b05b5f35f114505182b076aa70002843c0669bebJohn McCall  UnresolvedSet<8> VBaseCs;
1190b05b5f35f114505182b076aa70002843c0669bebJohn McCall
1191b05b5f35f114505182b076aa70002843c0669bebJohn McCall  // The set of conversions in virtual bases that we've determined to
1192b05b5f35f114505182b076aa70002843c0669bebJohn McCall  // be hidden.
1193b05b5f35f114505182b076aa70002843c0669bebJohn McCall  llvm::SmallPtrSet<NamedDecl*, 8> HiddenVBaseCs;
1194b05b5f35f114505182b076aa70002843c0669bebJohn McCall
1195b05b5f35f114505182b076aa70002843c0669bebJohn McCall  // The set of types hidden by classes derived from this one.
1196b05b5f35f114505182b076aa70002843c0669bebJohn McCall  llvm::SmallPtrSet<CanQualType, 8> HiddenTypes;
1197b05b5f35f114505182b076aa70002843c0669bebJohn McCall
1198b05b5f35f114505182b076aa70002843c0669bebJohn McCall  // Go ahead and collect the direct conversions and add them to the
1199b05b5f35f114505182b076aa70002843c0669bebJohn McCall  // hidden-types set.
12009d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis  CXXRecordDecl::conversion_iterator ConvI = Record->conversion_begin();
12019d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis  CXXRecordDecl::conversion_iterator ConvE = Record->conversion_end();
12022a82ca255b0f99f6201a75ed52b91fc024f6e9cfArgyrios Kyrtzidis  Output.append(Context, ConvI, ConvE);
12039d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis  for (; ConvI != ConvE; ++ConvI)
12049d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis    HiddenTypes.insert(GetConversionType(Context, ConvI.getDecl()));
1205b05b5f35f114505182b076aa70002843c0669bebJohn McCall
1206b05b5f35f114505182b076aa70002843c0669bebJohn McCall  // Recursively collect conversions from base classes.
1207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto &I : Record->bases()) {
1208651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const RecordType *RT = I.getType()->getAs<RecordType>();
1209b05b5f35f114505182b076aa70002843c0669bebJohn McCall    if (!RT) continue;
1210b05b5f35f114505182b076aa70002843c0669bebJohn McCall
1211b05b5f35f114505182b076aa70002843c0669bebJohn McCall    CollectVisibleConversions(Context, cast<CXXRecordDecl>(RT->getDecl()),
1212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                              I.isVirtual(), I.getAccessSpecifier(),
1213b05b5f35f114505182b076aa70002843c0669bebJohn McCall                              HiddenTypes, Output, VBaseCs, HiddenVBaseCs);
1214b05b5f35f114505182b076aa70002843c0669bebJohn McCall  }
1215b05b5f35f114505182b076aa70002843c0669bebJohn McCall
1216b05b5f35f114505182b076aa70002843c0669bebJohn McCall  // Add any unhidden conversions provided by virtual bases.
1217b05b5f35f114505182b076aa70002843c0669bebJohn McCall  for (UnresolvedSetIterator I = VBaseCs.begin(), E = VBaseCs.end();
1218b05b5f35f114505182b076aa70002843c0669bebJohn McCall         I != E; ++I) {
1219b05b5f35f114505182b076aa70002843c0669bebJohn McCall    if (!HiddenVBaseCs.count(cast<NamedDecl>(I.getDecl()->getCanonicalDecl())))
12202a82ca255b0f99f6201a75ed52b91fc024f6e9cfArgyrios Kyrtzidis      Output.addDecl(Context, I.getDecl(), I.getAccess());
12215346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian  }
12226250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian}
12236250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian
12246250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian/// getVisibleConversionFunctions - get all conversion functions visible
12256250921cc5bd3493a0d99fa2c32ec9716767a965Fariborz Jahanian/// in current class; including conversion function templates.
12260e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesllvm::iterator_range<CXXRecordDecl::conversion_iterator>
12279d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios KyrtzidisCXXRecordDecl::getVisibleConversionFunctions() {
1228c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith  ASTContext &Ctx = getASTContext();
1229c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith
1230c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith  ASTUnresolvedSet *Set;
1231c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith  if (bases_begin() == bases_end()) {
1232c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith    // If root class, all conversions are visible.
1233c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith    Set = &data().Conversions.get(Ctx);
1234c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith  } else {
1235c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith    Set = &data().VisibleConversions.get(Ctx);
1236c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith    // If visible conversion list is not evaluated, evaluate it.
1237c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith    if (!data().ComputedVisibleConversions) {
1238c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith      CollectVisibleConversions(Ctx, this, *Set);
1239c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith      data().ComputedVisibleConversions = true;
1240c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith    }
12419d29543284e75648ac89c6e9586fc7cf786cf66fArgyrios Kyrtzidis  }
12420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  return llvm::make_range(Set->begin(), Set->end());
12435346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian}
12445346278f81930e7fd0545bbbb2fc217c6921b109Fariborz Jahanian
124532daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCallvoid CXXRecordDecl::removeConversion(const NamedDecl *ConvDecl) {
124632daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall  // This operation is O(N) but extremely rare.  Sema only uses it to
124732daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall  // remove UsingShadowDecls in a class that were followed by a direct
124832daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall  // declaration, e.g.:
124932daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall  //   class A : B {
125032daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall  //     using B::operator int;
125132daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall  //     operator int();
125232daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall  //   };
125332daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall  // This is uncommon by itself and even more uncommon in conjunction
125432daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall  // with sufficiently large numbers of directly-declared conversions
125532daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall  // that asymptotic behavior matters.
125632daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall
1257c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith  ASTUnresolvedSet &Convs = data().Conversions.get(getASTContext());
125832daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall  for (unsigned I = 0, E = Convs.size(); I != E; ++I) {
125932daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall    if (Convs[I].getDecl() == ConvDecl) {
126032daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall      Convs.erase(I);
126132daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall      assert(std::find(Convs.begin(), Convs.end(), ConvDecl) == Convs.end()
126232daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall             && "conversion was found multiple times in unresolved set");
126332daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall      return;
126432daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall    }
126532daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall  }
12662f1bc5285ccd40f411af5f5993f013e27e74ab78Douglas Gregor
126732daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall  llvm_unreachable("conversion not found in set!");
126865ec1fda479688d143fe2403242cd9c730c800a1Douglas Gregor}
1269f8dcb866d344aa9355595e14c429852830b63095Fariborz Jahanian
1270f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas GregorCXXRecordDecl *CXXRecordDecl::getInstantiatedFromMemberClass() const {
1271b3ae4fcd4314a9c1c46d41b200883599c32025b4Douglas Gregor  if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo())
1272f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor    return cast<CXXRecordDecl>(MSInfo->getInstantiatedFrom());
12736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
12746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return nullptr;
1275f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor}
1276f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor
12774967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarMemberSpecializationInfo *CXXRecordDecl::getMemberSpecializationInfo() const {
12784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return TemplateOrInstantiation.dyn_cast<MemberSpecializationInfo *>();
12794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1281f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregorvoid
1282f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas GregorCXXRecordDecl::setInstantiationOfMemberClass(CXXRecordDecl *RD,
1283f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor                                             TemplateSpecializationKind TSK) {
1284f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor  assert(TemplateOrInstantiation.isNull() &&
1285f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor         "Previous template or instantiation?");
1286b3617be53923ac3e5885ff5001aa748bd0223102Bill Wendling  assert(!isa<ClassTemplatePartialSpecializationDecl>(this));
1287f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor  TemplateOrInstantiation
1288f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor    = new (getASTContext()) MemberSpecializationInfo(RD, TSK);
1289f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor}
1290f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor
12914967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarClassTemplateDecl *CXXRecordDecl::getDescribedClassTemplate() const {
12924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return TemplateOrInstantiation.dyn_cast<ClassTemplateDecl *>();
12934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid CXXRecordDecl::setDescribedClassTemplate(ClassTemplateDecl *Template) {
12964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TemplateOrInstantiation = Template;
12974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1299b13e357dac872bc7d507a770c4fb0f7b47ff0ac9Anders CarlssonTemplateSpecializationKind CXXRecordDecl::getTemplateSpecializationKind() const{
1300b13e357dac872bc7d507a770c4fb0f7b47ff0ac9Anders Carlsson  if (const ClassTemplateSpecializationDecl *Spec
1301f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor        = dyn_cast<ClassTemplateSpecializationDecl>(this))
1302f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor    return Spec->getSpecializationKind();
1303f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor
1304b3ae4fcd4314a9c1c46d41b200883599c32025b4Douglas Gregor  if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo())
1305f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor    return MSInfo->getTemplateSpecializationKind();
1306f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor
1307f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor  return TSK_Undeclared;
1308f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor}
1309f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor
1310f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregorvoid
1311f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas GregorCXXRecordDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK) {
1312f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor  if (ClassTemplateSpecializationDecl *Spec
1313f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor      = dyn_cast<ClassTemplateSpecializationDecl>(this)) {
1314f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor    Spec->setSpecializationKind(TSK);
1315f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor    return;
1316f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor  }
1317f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor
1318b3ae4fcd4314a9c1c46d41b200883599c32025b4Douglas Gregor  if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) {
1319f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor    MSInfo->setTemplateSpecializationKind(TSK);
1320f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor    return;
1321f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor  }
1322f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor
1323b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Not a class template or member class specialization");
1324f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor}
1325f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor
1326176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesconst CXXRecordDecl *CXXRecordDecl::getTemplateInstantiationPattern() const {
1327176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // If it's a class template specialization, find the template or partial
1328176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // specialization from which it was instantiated.
1329176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(this)) {
1330176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    auto From = TD->getInstantiatedFrom();
1331176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (auto *CTD = From.dyn_cast<ClassTemplateDecl *>()) {
1332176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      while (auto *NewCTD = CTD->getInstantiatedFromMemberTemplate()) {
1333176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        if (NewCTD->isMemberSpecialization())
1334176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          break;
1335176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        CTD = NewCTD;
1336176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
133787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return CTD->getTemplatedDecl()->getDefinition();
1338176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
1339176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (auto *CTPSD =
1340176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            From.dyn_cast<ClassTemplatePartialSpecializationDecl *>()) {
1341176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      while (auto *NewCTPSD = CTPSD->getInstantiatedFromMember()) {
1342176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        if (NewCTPSD->isMemberSpecialization())
1343176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          break;
1344176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        CTPSD = NewCTPSD;
1345176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
134687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return CTPSD->getDefinition();
1347176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
1348176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1349176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1350176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) {
1351176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) {
1352176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      const CXXRecordDecl *RD = this;
1353176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      while (auto *NewRD = RD->getInstantiatedFromMemberClass())
1354176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        RD = NewRD;
135587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return RD->getDefinition();
1356176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
1357176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1358176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1359176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  assert(!isTemplateInstantiation(this->getTemplateSpecializationKind()) &&
1360176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines         "couldn't find pattern for class template instantiation");
1361176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return nullptr;
1362176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
1363176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
13641d110e05e0ff48c1c7a483d6b7fd094cdf28316aDouglas GregorCXXDestructorDecl *CXXRecordDecl::getDestructor() const {
13651d110e05e0ff48c1c7a483d6b7fd094cdf28316aDouglas Gregor  ASTContext &Context = getASTContext();
13667267c1693abe7875b0c57268be05005ae013c6c9Anders Carlsson  QualType ClassType = Context.getTypeDeclType(this);
13671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName Name
136950d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor    = Context.DeclarationNames.getCXXDestructorName(
137050d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor                                          Context.getCanonicalType(ClassType));
13717267c1693abe7875b0c57268be05005ae013c6c9Anders Carlsson
13720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  DeclContext::lookup_result R = lookup(Name);
13733bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie  if (R.empty())
13746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
13751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13763bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie  CXXDestructorDecl *Dtor = cast<CXXDestructorDecl>(R.front());
13777267c1693abe7875b0c57268be05005ae013c6c9Anders Carlsson  return Dtor;
13787267c1693abe7875b0c57268be05005ae013c6c9Anders Carlsson}
13797267c1693abe7875b0c57268be05005ae013c6c9Anders Carlsson
1380b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarbool CXXRecordDecl::isAnyDestructorNoReturn() const {
1381b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // Destructor is noreturn.
1382b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  if (const CXXDestructorDecl *Destructor = getDestructor())
1383b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (Destructor->isNoReturn())
1384b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      return true;
1385b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
1386b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // Check base classes destructor for noreturn.
1387b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  for (const auto &Base : bases())
1388b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (Base.getType()->getAsCXXRecordDecl()->isAnyDestructorNoReturn())
1389b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      return true;
1390b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
1391b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // Check fields for noreturn.
1392b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  for (const auto *Field : fields())
1393b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (const CXXRecordDecl *RD =
1394b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar            Field->getType()->getBaseElementTypeUnsafe()->getAsCXXRecordDecl())
1395b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      if (RD->isAnyDestructorNoReturn())
1396b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        return true;
1397b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
1398b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // All destructors are not noreturn.
1399b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  return false;
1400b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar}
1401b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
1402da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregorvoid CXXRecordDecl::completeDefinition() {
14036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  completeDefinition(nullptr);
1404da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor}
1405da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
1406da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregorvoid CXXRecordDecl::completeDefinition(CXXFinalOverriderMap *FinalOverriders) {
1407da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  RecordDecl::completeDefinition();
1408da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
14097a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor  // If the class may be abstract (but hasn't been marked as such), check for
14107a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor  // any pure final overriders.
14117a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor  if (mayBeAbstract()) {
14127a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor    CXXFinalOverriderMap MyFinalOverriders;
14137a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor    if (!FinalOverriders) {
14147a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor      getFinalOverriders(MyFinalOverriders);
14157a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor      FinalOverriders = &MyFinalOverriders;
14167a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor    }
14177a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor
14187a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor    bool Done = false;
14197a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor    for (CXXFinalOverriderMap::iterator M = FinalOverriders->begin(),
14207a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor                                     MEnd = FinalOverriders->end();
14217a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor         M != MEnd && !Done; ++M) {
14227a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor      for (OverridingMethods::iterator SO = M->second.begin(),
14237a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor                                    SOEnd = M->second.end();
14247a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor           SO != SOEnd && !Done; ++SO) {
14257a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor        assert(SO->second.size() > 0 &&
14267a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor               "All virtual functions have overridding virtual functions");
14277a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor
14287a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor        // C++ [class.abstract]p4:
14297a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor        //   A class is abstract if it contains or inherits at least one
14307a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor        //   pure virtual function for which the final overrider is pure
14317a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor        //   virtual.
14327a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor        if (SO->second.front().Method->isPure()) {
14337a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor          data().Abstract = true;
14347a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor          Done = true;
14357a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor          break;
14367a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor        }
14377a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor      }
14387a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor    }
14397a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor  }
1440e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor
1441e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor  // Set access bits correctly on the directly-declared conversions.
1442c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith  for (conversion_iterator I = conversion_begin(), E = conversion_end();
1443e80622fd48261b6e5c7e6629dcfee2f76b124487Douglas Gregor       I != E; ++I)
14442a82ca255b0f99f6201a75ed52b91fc024f6e9cfArgyrios Kyrtzidis    I.setAccess((*I)->getAccess());
14457a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor}
14467a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor
14477a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregorbool CXXRecordDecl::mayBeAbstract() const {
14487a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor  if (data().Abstract || isInvalidDecl() || !data().Polymorphic ||
14497a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor      isDependentContext())
14507a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor    return false;
14517a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor
1452651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto &B : bases()) {
14537a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor    CXXRecordDecl *BaseDecl
1454651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      = cast<CXXRecordDecl>(B.getType()->getAs<RecordType>()->getDecl());
14557a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor    if (BaseDecl->isAbstract())
14567a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor      return true;
14577a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor  }
14587a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor
14597a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor  return false;
14607a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor}
14617a39dd01edc43aa5f058e7259a39737fc1f43792Douglas Gregor
146299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid CXXMethodDecl::anchor() { }
146399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
1464d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindolabool CXXMethodDecl::isStatic() const {
146572fdc8947e54be1a8dd36b03e24f112aba1241e1Rafael Espindola  const CXXMethodDecl *MD = getCanonicalDecl();
1466d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola
1467d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola  if (MD->getStorageClass() == SC_Static)
1468d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola    return true;
1469d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola
1470d1a32c328bce903fb1b17fc8147b646be818298eReid Kleckner  OverloadedOperatorKind OOK = getDeclName().getCXXOverloadedOperator();
1471d1a32c328bce903fb1b17fc8147b646be818298eReid Kleckner  return isStaticOverloadedOperator(OOK);
1472d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola}
1473d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola
14740b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindolastatic bool recursivelyOverrides(const CXXMethodDecl *DerivedMD,
14750b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola                                 const CXXMethodDecl *BaseMD) {
14760b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola  for (CXXMethodDecl::method_iterator I = DerivedMD->begin_overridden_methods(),
14770b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola         E = DerivedMD->end_overridden_methods(); I != E; ++I) {
14780b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola    const CXXMethodDecl *MD = *I;
14790b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola    if (MD->getCanonicalDecl() == BaseMD->getCanonicalDecl())
14800b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola      return true;
14810b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola    if (recursivelyOverrides(MD, BaseMD))
14820b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola      return true;
14830b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola  }
14840b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola  return false;
14850b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola}
14860b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola
14870b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael EspindolaCXXMethodDecl *
14884e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan RoseCXXMethodDecl::getCorrespondingMethodInClass(const CXXRecordDecl *RD,
14894e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan Rose                                             bool MayBeBase) {
14900b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola  if (this->getParent()->getCanonicalDecl() == RD->getCanonicalDecl())
14910b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola    return this;
14920b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola
14930b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola  // Lookup doesn't work for destructors, so handle them separately.
14940b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola  if (isa<CXXDestructorDecl>(this)) {
14950b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola    CXXMethodDecl *MD = RD->getDestructor();
14964e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan Rose    if (MD) {
14974e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan Rose      if (recursivelyOverrides(MD, this))
14984e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan Rose        return MD;
14994e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan Rose      if (MayBeBase && recursivelyOverrides(this, MD))
15004e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan Rose        return MD;
15014e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan Rose    }
15026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
15030b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola  }
15040b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola
15050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  for (auto *ND : RD->lookup(getDeclName())) {
15060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(ND);
15070b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola    if (!MD)
15080b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola      continue;
15090b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola    if (recursivelyOverrides(MD, this))
15100b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola      return MD;
15114e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan Rose    if (MayBeBase && recursivelyOverrides(this, MD))
15124e79fdfe22db1c982e8fdf8397fee426a8c57821Jordan Rose      return MD;
15130b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola  }
15140b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola
1515651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto &I : RD->bases()) {
1516651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const RecordType *RT = I.getType()->getAs<RecordType>();
15170b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola    if (!RT)
15180b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola      continue;
15190b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola    const CXXRecordDecl *Base = cast<CXXRecordDecl>(RT->getDecl());
15200b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola    CXXMethodDecl *T = this->getCorrespondingMethodInClass(Base);
15210b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola    if (T)
15220b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola      return T;
15230b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola  }
15240b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola
15256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return nullptr;
15260b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola}
15270b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola
15284b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed KremenekCXXMethodDecl *
15294b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed KremenekCXXMethodDecl::Create(ASTContext &C, CXXRecordDecl *RD,
1530ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                      SourceLocation StartLoc,
15312577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                      const DeclarationNameInfo &NameInfo,
1532a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                      QualType T, TypeSourceInfo *TInfo,
1533d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola                      StorageClass SC, bool isInline,
1534af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith                      bool isConstexpr, SourceLocation EndLocation) {
15356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, RD) CXXMethodDecl(CXXMethod, C, RD, StartLoc, NameInfo,
15366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                   T, TInfo, SC, isInline, isConstexpr,
15376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                   EndLocation);
15384b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek}
15394b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek
15401e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorCXXMethodDecl *CXXMethodDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
15416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, ID) CXXMethodDecl(CXXMethod, C, nullptr, SourceLocation(),
15426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                   DeclarationNameInfo(), QualType(), nullptr,
1543651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                   SC_None, false, false, SourceLocation());
15441e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
15451e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
15469091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregorbool CXXMethodDecl::isUsualDeallocationFunction() const {
15479091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor  if (getOverloadedOperator() != OO_Delete &&
15489091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor      getOverloadedOperator() != OO_Array_Delete)
15499091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor    return false;
15506d90870fe821a9b1a7822d3e28032042d03e5680Douglas Gregor
15516d90870fe821a9b1a7822d3e28032042d03e5680Douglas Gregor  // C++ [basic.stc.dynamic.deallocation]p2:
15526d90870fe821a9b1a7822d3e28032042d03e5680Douglas Gregor  //   A template instance is never a usual deallocation function,
15536d90870fe821a9b1a7822d3e28032042d03e5680Douglas Gregor  //   regardless of its signature.
15546d90870fe821a9b1a7822d3e28032042d03e5680Douglas Gregor  if (getPrimaryTemplate())
15556d90870fe821a9b1a7822d3e28032042d03e5680Douglas Gregor    return false;
15566d90870fe821a9b1a7822d3e28032042d03e5680Douglas Gregor
15579091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor  // C++ [basic.stc.dynamic.deallocation]p2:
15589091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor  //   If a class T has a member deallocation function named operator delete
15599091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor  //   with exactly one parameter, then that function is a usual (non-placement)
15609091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor  //   deallocation function. [...]
15619091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor  if (getNumParams() == 1)
15629091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor    return true;
15639091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor
15649091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor  // C++ [basic.stc.dynamic.deallocation]p2:
15659091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor  //   [...] If class T does not declare such an operator delete but does
15669091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor  //   declare a member deallocation function named operator delete with
15679091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor  //   exactly two parameters, the second of which has type std::size_t (18.1),
15689091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor  //   then this function is a usual deallocation function.
15699091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor  ASTContext &Context = getASTContext();
15709091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor  if (getNumParams() != 2 ||
1571e228ba97c9aff14dcf788773b8af455b9d85f210Chandler Carruth      !Context.hasSameUnqualifiedType(getParamDecl(1)->getType(),
1572e228ba97c9aff14dcf788773b8af455b9d85f210Chandler Carruth                                      Context.getSizeType()))
15739091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor    return false;
15749091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor
15759091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor  // This function is a usual deallocation function if there are no
15769091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor  // single-parameter deallocation functions of the same kind.
15770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  DeclContext::lookup_result R = getDeclContext()->lookup(getDeclName());
15780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  for (DeclContext::lookup_result::iterator I = R.begin(), E = R.end();
15793bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie       I != E; ++I) {
15803bc93e3124ad5e7191c4a12dc981c8ee53578193David Blaikie    if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*I))
15819091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor      if (FD->getNumParams() == 1)
15829091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor        return false;
15839091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor  }
15849091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor
15859091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor  return true;
15869091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor}
15879091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor
158806a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregorbool CXXMethodDecl::isCopyAssignmentOperator() const {
1589ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt  // C++0x [class.copy]p17:
159006a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor  //  A user-declared copy assignment operator X::operator= is a non-static
159106a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor  //  non-template member function of class X with exactly one parameter of
159206a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor  //  type X, X&, const X&, volatile X& or const volatile X&.
159306a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor  if (/*operator=*/getOverloadedOperator() != OO_Equal ||
159406a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor      /*non-static*/ isStatic() ||
1595fcb5a251e9c0c8c2d54323677d4f2ba5219301d0Eli Friedman      /*non-template*/getPrimaryTemplate() || getDescribedFunctionTemplate() ||
1596fcb5a251e9c0c8c2d54323677d4f2ba5219301d0Eli Friedman      getNumParams() != 1)
159706a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor    return false;
159806a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor
159906a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor  QualType ParamType = getParamDecl(0)->getType();
160006a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor  if (const LValueReferenceType *Ref = ParamType->getAs<LValueReferenceType>())
160106a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor    ParamType = Ref->getPointeeType();
160206a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor
160306a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor  ASTContext &Context = getASTContext();
160406a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor  QualType ClassType
160506a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor    = Context.getCanonicalType(Context.getTypeDeclType(getParent()));
160606a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor  return Context.hasSameUnqualifiedType(ClassType, ParamType);
160706a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor}
160806a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor
1609ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Huntbool CXXMethodDecl::isMoveAssignmentOperator() const {
1610ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt  // C++0x [class.copy]p19:
1611ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt  //  A user-declared move assignment operator X::operator= is a non-static
1612ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt  //  non-template member function of class X with exactly one parameter of type
1613ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt  //  X&&, const X&&, volatile X&&, or const volatile X&&.
1614ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt  if (getOverloadedOperator() != OO_Equal || isStatic() ||
1615fcb5a251e9c0c8c2d54323677d4f2ba5219301d0Eli Friedman      getPrimaryTemplate() || getDescribedFunctionTemplate() ||
1616fcb5a251e9c0c8c2d54323677d4f2ba5219301d0Eli Friedman      getNumParams() != 1)
1617ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt    return false;
1618ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt
1619ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt  QualType ParamType = getParamDecl(0)->getType();
1620ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt  if (!isa<RValueReferenceType>(ParamType))
1621ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt    return false;
1622ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt  ParamType = ParamType->getPointeeType();
1623ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt
1624ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt  ASTContext &Context = getASTContext();
1625ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt  QualType ClassType
1626ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt    = Context.getCanonicalType(Context.getTypeDeclType(getParent()));
1627ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt  return Context.hasSameUnqualifiedType(ClassType, ParamType);
1628ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt}
1629ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt
163005eb24474218d70366b4d7d6b5b19dda2473a163Anders Carlssonvoid CXXMethodDecl::addOverriddenMethod(const CXXMethodDecl *MD) {
16313aaf486af649d6be464e6b937c8181529ffef931Anders Carlsson  assert(MD->isCanonicalDecl() && "Method is not canonical!");
1632c076c450e4fdc7be27c8541b273451f28345044aAnders Carlsson  assert(!MD->getParent()->isDependentContext() &&
1633c076c450e4fdc7be27c8541b273451f28345044aAnders Carlsson         "Can't add an overridden method to a class template!");
1634540659e102670e08773986862b191ed2c46a0e86Eli Friedman  assert(MD->isVirtual() && "Method is not virtual!");
1635c076c450e4fdc7be27c8541b273451f28345044aAnders Carlsson
16367d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  getASTContext().addOverriddenMethod(this, MD);
163705eb24474218d70366b4d7d6b5b19dda2473a163Anders Carlsson}
163805eb24474218d70366b4d7d6b5b19dda2473a163Anders Carlsson
163905eb24474218d70366b4d7d6b5b19dda2473a163Anders CarlssonCXXMethodDecl::method_iterator CXXMethodDecl::begin_overridden_methods() const {
16406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (isa<CXXConstructorDecl>(this)) return nullptr;
16417d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  return getASTContext().overridden_methods_begin(this);
164205eb24474218d70366b4d7d6b5b19dda2473a163Anders Carlsson}
164305eb24474218d70366b4d7d6b5b19dda2473a163Anders Carlsson
164405eb24474218d70366b4d7d6b5b19dda2473a163Anders CarlssonCXXMethodDecl::method_iterator CXXMethodDecl::end_overridden_methods() const {
16456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (isa<CXXConstructorDecl>(this)) return nullptr;
16467d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  return getASTContext().overridden_methods_end(this);
164705eb24474218d70366b4d7d6b5b19dda2473a163Anders Carlsson}
164805eb24474218d70366b4d7d6b5b19dda2473a163Anders Carlsson
1649c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidisunsigned CXXMethodDecl::size_overridden_methods() const {
1650540659e102670e08773986862b191ed2c46a0e86Eli Friedman  if (isa<CXXConstructorDecl>(this)) return 0;
1651c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  return getASTContext().overridden_methods_size(this);
1652c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis}
1653c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis
16544967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarCXXMethodDecl::overridden_method_range
16554967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarCXXMethodDecl::overridden_methods() const {
16564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (isa<CXXConstructorDecl>(this))
16574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return overridden_method_range(nullptr, nullptr);
16584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return getASTContext().overridden_methods(this);
16594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
16604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
16614b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed KremenekQualType CXXMethodDecl::getThisType(ASTContext &C) const {
1662b0d178d78fd9a67627b89a7e2dafde2c93fbcd1cArgyrios Kyrtzidis  // C++ 9.3.2p1: The type of this in a member function of a class X is X*.
1663b0d178d78fd9a67627b89a7e2dafde2c93fbcd1cArgyrios Kyrtzidis  // If the member function is declared const, the type of this is const X*,
1664b0d178d78fd9a67627b89a7e2dafde2c93fbcd1cArgyrios Kyrtzidis  // if the member function is declared volatile, the type of this is
1665b0d178d78fd9a67627b89a7e2dafde2c93fbcd1cArgyrios Kyrtzidis  // volatile X*, and if the member function is declared const volatile,
1666b0d178d78fd9a67627b89a7e2dafde2c93fbcd1cArgyrios Kyrtzidis  // the type of this is const volatile X*.
1667b0d178d78fd9a67627b89a7e2dafde2c93fbcd1cArgyrios Kyrtzidis
16684b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  assert(isInstance() && "No 'this' for static methods!");
166931a08752eda39ca17154538e2f2587f8d339a1faAnders Carlsson
16703cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  QualType ClassTy = C.getTypeDeclType(getParent());
16710953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  ClassTy = C.getQualifiedType(ClassTy,
16724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                               Qualifiers::fromCVRUMask(getTypeQualifiers()));
16734e579922ada4e19618710878c32543322f86c9c8Anders Carlsson  return C.getPointerType(ClassTy);
16744b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek}
16754b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek
1676d7d7f67c1dd8626520bb243d3928f59d32424534Eli Friedmanbool CXXMethodDecl::hasInlineBody() const {
1677bd6d6197fcfc98356ea60e816365eb0648b69556Douglas Gregor  // If this function is a template instantiation, look at the template from
1678bd6d6197fcfc98356ea60e816365eb0648b69556Douglas Gregor  // which it was instantiated.
1679bd6d6197fcfc98356ea60e816365eb0648b69556Douglas Gregor  const FunctionDecl *CheckFn = getTemplateInstantiationPattern();
1680bd6d6197fcfc98356ea60e816365eb0648b69556Douglas Gregor  if (!CheckFn)
1681bd6d6197fcfc98356ea60e816365eb0648b69556Douglas Gregor    CheckFn = this;
1682bd6d6197fcfc98356ea60e816365eb0648b69556Douglas Gregor
1683d7d7f67c1dd8626520bb243d3928f59d32424534Eli Friedman  const FunctionDecl *fn;
168406a54a38be5054c910ffc92db60edab23f9ea105Argyrios Kyrtzidis  return CheckFn->hasBody(fn) && !fn->isOutOfLine();
1685d7d7f67c1dd8626520bb243d3928f59d32424534Eli Friedman}
1686d7d7f67c1dd8626520bb243d3928f59d32424534Eli Friedman
168727dd7d962bbf774988bc5e59d04a7743ed503514Douglas Gregorbool CXXMethodDecl::isLambdaStaticInvoker() const {
1688d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  const CXXRecordDecl *P = getParent();
1689d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  if (P->isLambda()) {
1690d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali    if (const CXXMethodDecl *StaticInvoker = P->getLambdaStaticInvoker()) {
1691d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali      if (StaticInvoker == this) return true;
1692d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali      if (P->isGenericLambda() && this->isFunctionTemplateSpecialization())
1693d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali        return StaticInvoker == this->getPrimaryTemplate()->getTemplatedDecl();
1694d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali    }
1695d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  }
1696d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  return false;
169727dd7d962bbf774988bc5e59d04a7743ed503514Douglas Gregor}
169827dd7d962bbf774988bc5e59d04a7743ed503514Douglas Gregor
1699cbb67480094b3bcb5b715acd827cbad55e2a204cSean HuntCXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
1700cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                       TypeSourceInfo *TInfo, bool IsVirtual,
1701cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                       SourceLocation L, Expr *Init,
1702cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                       SourceLocation R,
1703cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                       SourceLocation EllipsisLoc)
1704f51d0b6c2f5abd09d3a7ba907a3d9b7a43752f3dSean Hunt  : Initializee(TInfo), MemberOrEllipsisLocation(EllipsisLoc), Init(Init),
170576852c218a207ef43583515cb835b6e855353a0fDouglas Gregor    LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(IsVirtual),
170676852c218a207ef43583515cb835b6e855353a0fDouglas Gregor    IsWritten(false), SourceOrderOrNumArrayIndices(0)
1707802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor{
17087ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor}
17097ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor
1710cbb67480094b3bcb5b715acd827cbad55e2a204cSean HuntCXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
1711cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                       FieldDecl *Member,
1712cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                       SourceLocation MemberLoc,
1713cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                       SourceLocation L, Expr *Init,
1714cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                       SourceLocation R)
1715f51d0b6c2f5abd09d3a7ba907a3d9b7a43752f3dSean Hunt  : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init),
171676852c218a207ef43583515cb835b6e855353a0fDouglas Gregor    LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
171700eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet    IsWritten(false), SourceOrderOrNumArrayIndices(0)
171800eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet{
171900eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet}
172000eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet
1721cbb67480094b3bcb5b715acd827cbad55e2a204cSean HuntCXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
1722cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                       IndirectFieldDecl *Member,
1723cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                       SourceLocation MemberLoc,
1724cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                       SourceLocation L, Expr *Init,
1725cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                       SourceLocation R)
1726f51d0b6c2f5abd09d3a7ba907a3d9b7a43752f3dSean Hunt  : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init),
172776852c218a207ef43583515cb835b6e855353a0fDouglas Gregor    LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
1728a0af3b453160fc4c67363c204da13820b0586909Abramo Bagnara    IsWritten(false), SourceOrderOrNumArrayIndices(0)
1729802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor{
17307ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor}
17317ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor
1732cbb67480094b3bcb5b715acd827cbad55e2a204cSean HuntCXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
173376852c218a207ef43583515cb835b6e855353a0fDouglas Gregor                                       TypeSourceInfo *TInfo,
173476852c218a207ef43583515cb835b6e855353a0fDouglas Gregor                                       SourceLocation L, Expr *Init,
17354171766318a2564fbc9a739be0a2851f441c0d29Sean Hunt                                       SourceLocation R)
173676852c218a207ef43583515cb835b6e855353a0fDouglas Gregor  : Initializee(TInfo), MemberOrEllipsisLocation(), Init(Init),
173776852c218a207ef43583515cb835b6e855353a0fDouglas Gregor    LParenLoc(L), RParenLoc(R), IsDelegating(true), IsVirtual(false),
17384171766318a2564fbc9a739be0a2851f441c0d29Sean Hunt    IsWritten(false), SourceOrderOrNumArrayIndices(0)
17394171766318a2564fbc9a739be0a2851f441c0d29Sean Hunt{
17404171766318a2564fbc9a739be0a2851f441c0d29Sean Hunt}
17414171766318a2564fbc9a739be0a2851f441c0d29Sean Hunt
17424171766318a2564fbc9a739be0a2851f441c0d29Sean HuntCXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
1743cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                       FieldDecl *Member,
1744cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                       SourceLocation MemberLoc,
1745cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                       SourceLocation L, Expr *Init,
1746cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                       SourceLocation R,
1747cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                       VarDecl **Indices,
1748cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                       unsigned NumIndices)
1749f51d0b6c2f5abd09d3a7ba907a3d9b7a43752f3dSean Hunt  : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init),
1750176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
1751a0af3b453160fc4c67363c204da13820b0586909Abramo Bagnara    IsWritten(false), SourceOrderOrNumArrayIndices(NumIndices)
1752fb8cc253420e93cee33d29df5a2bdae6aaf16e39Douglas Gregor{
17534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::uninitialized_copy(Indices, Indices + NumIndices,
17544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                          getTrailingObjects<VarDecl *>());
1755fb8cc253420e93cee33d29df5a2bdae6aaf16e39Douglas Gregor}
1756fb8cc253420e93cee33d29df5a2bdae6aaf16e39Douglas Gregor
1757cbb67480094b3bcb5b715acd827cbad55e2a204cSean HuntCXXCtorInitializer *CXXCtorInitializer::Create(ASTContext &Context,
1758cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                               FieldDecl *Member,
1759cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                               SourceLocation MemberLoc,
1760cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                               SourceLocation L, Expr *Init,
1761cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                               SourceLocation R,
1762cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                               VarDecl **Indices,
1763cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                               unsigned NumIndices) {
17644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void *Mem = Context.Allocate(totalSizeToAlloc<VarDecl *>(NumIndices),
1765cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                               llvm::alignOf<CXXCtorInitializer>());
1766f51d0b6c2f5abd09d3a7ba907a3d9b7a43752f3dSean Hunt  return new (Mem) CXXCtorInitializer(Context, Member, MemberLoc, L, Init, R,
1767f51d0b6c2f5abd09d3a7ba907a3d9b7a43752f3dSean Hunt                                      Indices, NumIndices);
1768fb8cc253420e93cee33d29df5a2bdae6aaf16e39Douglas Gregor}
1769fb8cc253420e93cee33d29df5a2bdae6aaf16e39Douglas Gregor
1770cbb67480094b3bcb5b715acd827cbad55e2a204cSean HuntTypeLoc CXXCtorInitializer::getBaseClassLoc() const {
1771802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor  if (isBaseInitializer())
1772f51d0b6c2f5abd09d3a7ba907a3d9b7a43752f3dSean Hunt    return Initializee.get<TypeSourceInfo*>()->getTypeLoc();
1773802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor  else
1774802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor    return TypeLoc();
1775802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor}
1776802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor
1777cbb67480094b3bcb5b715acd827cbad55e2a204cSean Huntconst Type *CXXCtorInitializer::getBaseClass() const {
1778802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor  if (isBaseInitializer())
1779f51d0b6c2f5abd09d3a7ba907a3d9b7a43752f3dSean Hunt    return Initializee.get<TypeSourceInfo*>()->getType().getTypePtr();
1780802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor  else
17816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
1782802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor}
1783802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor
1784cbb67480094b3bcb5b715acd827cbad55e2a204cSean HuntSourceLocation CXXCtorInitializer::getSourceLocation() const {
17857a614d8380297fcd2bc23986241905d97222948cRichard Smith  if (isInClassMemberInitializer())
17867a614d8380297fcd2bc23986241905d97222948cRichard Smith    return getAnyMember()->getLocation();
1787802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor
17880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  if (isAnyMemberInitializer())
17890e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    return getMemberLocation();
17900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
179176852c218a207ef43583515cb835b6e855353a0fDouglas Gregor  if (TypeSourceInfo *TSInfo = Initializee.get<TypeSourceInfo*>())
179276852c218a207ef43583515cb835b6e855353a0fDouglas Gregor    return TSInfo->getTypeLoc().getLocalSourceRange().getBegin();
179376852c218a207ef43583515cb835b6e855353a0fDouglas Gregor
179476852c218a207ef43583515cb835b6e855353a0fDouglas Gregor  return SourceLocation();
1795802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor}
1796802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor
1797cbb67480094b3bcb5b715acd827cbad55e2a204cSean HuntSourceRange CXXCtorInitializer::getSourceRange() const {
17987a614d8380297fcd2bc23986241905d97222948cRichard Smith  if (isInClassMemberInitializer()) {
17997a614d8380297fcd2bc23986241905d97222948cRichard Smith    FieldDecl *D = getAnyMember();
18007a614d8380297fcd2bc23986241905d97222948cRichard Smith    if (Expr *I = D->getInClassInitializer())
18017a614d8380297fcd2bc23986241905d97222948cRichard Smith      return I->getSourceRange();
18027a614d8380297fcd2bc23986241905d97222948cRichard Smith    return SourceRange();
18037a614d8380297fcd2bc23986241905d97222948cRichard Smith  }
18047a614d8380297fcd2bc23986241905d97222948cRichard Smith
1805802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor  return SourceRange(getSourceLocation(), getRParenLoc());
18067ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor}
18077ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor
180899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid CXXConstructorDecl::anchor() { }
180999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
18104967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarCXXConstructorDecl *CXXConstructorDecl::CreateDeserialized(ASTContext &C,
18114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                                           unsigned ID,
18124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                                           bool Inherited) {
18134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  unsigned Extra = additionalSizeToAlloc<InheritedConstructor>(Inherited);
18144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto *Result = new (C, ID, Extra) CXXConstructorDecl(
18154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      C, nullptr, SourceLocation(), DeclarationNameInfo(), QualType(), nullptr,
18164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      false, false, false, false, InheritedConstructor());
18174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Result->IsInheritingConstructor = Inherited;
18184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return Result;
18196ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
18206ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
18216ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris LattnerCXXConstructorDecl *
1822b48fe3812047e84164925c8938ce82be0624c40cDouglas GregorCXXConstructorDecl::Create(ASTContext &C, CXXRecordDecl *RD,
1823ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                           SourceLocation StartLoc,
18242577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                           const DeclarationNameInfo &NameInfo,
1825a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                           QualType T, TypeSourceInfo *TInfo,
1826af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith                           bool isExplicit, bool isInline,
18274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           bool isImplicitlyDeclared, bool isConstexpr,
18284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           InheritedConstructor Inherited) {
18292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  assert(NameInfo.getName().getNameKind()
18302577743c5650c646fb705df01403707e94f2df04Abramo Bagnara         == DeclarationName::CXXConstructorName &&
18312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "Name must refer to a constructor");
18324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  unsigned Extra =
18334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      additionalSizeToAlloc<InheritedConstructor>(Inherited ? 1 : 0);
18344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return new (C, RD, Extra) CXXConstructorDecl(
18354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      C, RD, StartLoc, NameInfo, T, TInfo, isExplicit, isInline,
18364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      isImplicitlyDeclared, isConstexpr, Inherited);
1837b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor}
1838b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor
18393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga NainarCXXConstructorDecl::init_const_iterator CXXConstructorDecl::init_begin() const {
18403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  return CtorInitializers.get(getASTContext().getExternalSource());
18413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar}
18423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
184376852c218a207ef43583515cb835b6e855353a0fDouglas GregorCXXConstructorDecl *CXXConstructorDecl::getTargetConstructor() const {
184476852c218a207ef43583515cb835b6e855353a0fDouglas Gregor  assert(isDelegatingConstructor() && "Not a delegating constructor!");
184576852c218a207ef43583515cb835b6e855353a0fDouglas Gregor  Expr *E = (*init_begin())->getInit()->IgnoreImplicit();
184676852c218a207ef43583515cb835b6e855353a0fDouglas Gregor  if (CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(E))
184776852c218a207ef43583515cb835b6e855353a0fDouglas Gregor    return Construct->getConstructor();
18486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
18496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return nullptr;
185076852c218a207ef43583515cb835b6e855353a0fDouglas Gregor}
185176852c218a207ef43583515cb835b6e855353a0fDouglas Gregor
1852030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregorbool CXXConstructorDecl::isDefaultConstructor() const {
1853030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor  // C++ [class.ctor]p5:
185464bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor  //   A default constructor for a class X is a constructor of class
185564bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor  //   X that can be called without an argument.
1856030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor  return (getNumParams() == 0) ||
1857da3f4e2dd5938145f132be237a2ed5914cc86702Anders Carlsson         (getNumParams() > 0 && getParamDecl(0)->hasDefaultArg());
1858030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor}
1859030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor
18601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool
18619e9199d8649cf3e10c98a69403f05dbb666d8fb1Douglas GregorCXXConstructorDecl::isCopyConstructor(unsigned &TypeQuals) const {
1862cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor  return isCopyOrMoveConstructor(TypeQuals) &&
1863cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor         getParamDecl(0)->getType()->isLValueReferenceType();
1864cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor}
1865cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor
1866cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregorbool CXXConstructorDecl::isMoveConstructor(unsigned &TypeQuals) const {
1867cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor  return isCopyOrMoveConstructor(TypeQuals) &&
1868cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor    getParamDecl(0)->getType()->isRValueReferenceType();
1869cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor}
1870cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor
1871cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor/// \brief Determine whether this is a copy or move constructor.
1872cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregorbool CXXConstructorDecl::isCopyOrMoveConstructor(unsigned &TypeQuals) const {
1873030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor  // C++ [class.copy]p2:
187464bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor  //   A non-template constructor for class X is a copy constructor
187564bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor  //   if its first parameter is of type X&, const X&, volatile X& or
187664bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor  //   const volatile X&, and either there are no other parameters
187764bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor  //   or else all other parameters have default arguments (8.3.6).
1878cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor  // C++0x [class.copy]p3:
1879cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor  //   A non-template constructor for class X is a move constructor if its
1880cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor  //   first parameter is of type X&&, const X&&, volatile X&&, or
1881cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor  //   const volatile X&&, and either there are no other parameters or else
1882cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor  //   all other parameters have default arguments.
1883030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor  if ((getNumParams() < 1) ||
188477da3f4815069dbd029823edb072425551143cb1Douglas Gregor      (getNumParams() > 1 && !getParamDecl(1)->hasDefaultArg()) ||
18856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      (getPrimaryTemplate() != nullptr) ||
18866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      (getDescribedFunctionTemplate() != nullptr))
1887030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor    return false;
1888cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor
1889030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor  const ParmVarDecl *Param = getParamDecl(0);
1890cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor
1891cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor  // Do we have a reference type?
1892cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor  const ReferenceType *ParamRefType = Param->getType()->getAs<ReferenceType>();
1893fd47648b5d351ff6d1a3e886e1c3d10712ba4675Douglas Gregor  if (!ParamRefType)
1894fd47648b5d351ff6d1a3e886e1c3d10712ba4675Douglas Gregor    return false;
1895cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor
1896fd47648b5d351ff6d1a3e886e1c3d10712ba4675Douglas Gregor  // Is it a reference to our class type?
18979e9199d8649cf3e10c98a69403f05dbb666d8fb1Douglas Gregor  ASTContext &Context = getASTContext();
18989e9199d8649cf3e10c98a69403f05dbb666d8fb1Douglas Gregor
1899fd47648b5d351ff6d1a3e886e1c3d10712ba4675Douglas Gregor  CanQualType PointeeType
1900fd47648b5d351ff6d1a3e886e1c3d10712ba4675Douglas Gregor    = Context.getCanonicalType(ParamRefType->getPointeeType());
190114e0b3d8a58d8e2d6d154c17f13e9881d3740784Douglas Gregor  CanQualType ClassTy
190214e0b3d8a58d8e2d6d154c17f13e9881d3740784Douglas Gregor    = Context.getCanonicalType(Context.getTagDeclType(getParent()));
1903030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor  if (PointeeType.getUnqualifiedType() != ClassTy)
1904030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor    return false;
1905cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor
19060953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // FIXME: other qualifiers?
1907cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor
1908cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor  // We have a copy or move constructor.
1909030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor  TypeQuals = PointeeType.getCVRQualifiers();
1910cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor  return true;
1911030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor}
1912030ff0cdad79b9e0602e143e0669364d2bad8bd2Douglas Gregor
1913faccd72e2448b552f17992eaba6cfe12ec497e58Anders Carlssonbool CXXConstructorDecl::isConvertingConstructor(bool AllowExplicit) const {
191460d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor  // C++ [class.conv.ctor]p1:
191560d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor  //   A constructor declared without the function-specifier explicit
191660d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor  //   that can be called with a single parameter specifies a
191760d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor  //   conversion from the type of its first parameter to the type of
191860d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor  //   its class. Such a constructor is called a converting
191960d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor  //   constructor.
1920faccd72e2448b552f17992eaba6cfe12ec497e58Anders Carlsson  if (isExplicit() && !AllowExplicit)
192160d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor    return false;
192260d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor
19231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return (getNumParams() == 0 &&
1924183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall          getType()->getAs<FunctionProtoType>()->isVariadic()) ||
192560d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor         (getNumParams() == 1) ||
1926113c4448003ff6fd76eaabde08d3ebfffd8a327aDouglas Gregor         (getNumParams() > 1 &&
1927113c4448003ff6fd76eaabde08d3ebfffd8a327aDouglas Gregor          (getParamDecl(1)->hasDefaultArg() ||
1928113c4448003ff6fd76eaabde08d3ebfffd8a327aDouglas Gregor           getParamDecl(1)->isParameterPack()));
192960d62c29d260596454aaf4cb50cbc756ac08875eDouglas Gregor}
1930b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor
19316493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregorbool CXXConstructorDecl::isSpecializationCopyingObject() const {
193266724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor  if ((getNumParams() < 1) ||
193366724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor      (getNumParams() > 1 && !getParamDecl(1)->hasDefaultArg()) ||
19346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      (getDescribedFunctionTemplate() != nullptr))
193566724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor    return false;
193666724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor
193766724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor  const ParmVarDecl *Param = getParamDecl(0);
193866724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor
193966724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor  ASTContext &Context = getASTContext();
194066724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor  CanQualType ParamType = Context.getCanonicalType(Param->getType());
194166724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor
194266724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor  // Is it the same as our our class type?
194366724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor  CanQualType ClassTy
194466724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor    = Context.getCanonicalType(Context.getTagDeclType(getParent()));
194566724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor  if (ParamType.getUnqualifiedType() != ClassTy)
194666724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor    return false;
194766724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor
194866724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor  return true;
194966724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor}
195066724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor
195199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid CXXDestructorDecl::anchor() { }
195299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
195342a552f8200ba5948661aee0106fce0c04e39818Douglas GregorCXXDestructorDecl *
19541e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorCXXDestructorDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
19556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, ID)
19566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      CXXDestructorDecl(C, nullptr, SourceLocation(), DeclarationNameInfo(),
19576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                        QualType(), nullptr, false, false);
19586ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
19596ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
19606ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris LattnerCXXDestructorDecl *
196142a552f8200ba5948661aee0106fce0c04e39818Douglas GregorCXXDestructorDecl::Create(ASTContext &C, CXXRecordDecl *RD,
1962ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                          SourceLocation StartLoc,
19632577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                          const DeclarationNameInfo &NameInfo,
1964b41d899a6023385c00a61eb9dd3e44db9dc7994eCraig Silverstein                          QualType T, TypeSourceInfo *TInfo,
1965af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith                          bool isInline, bool isImplicitlyDeclared) {
19662577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  assert(NameInfo.getName().getNameKind()
19672577743c5650c646fb705df01403707e94f2df04Abramo Bagnara         == DeclarationName::CXXDestructorName &&
19682e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "Name must refer to a destructor");
19696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, RD) CXXDestructorDecl(C, RD, StartLoc, NameInfo, T, TInfo,
1970651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                       isInline, isImplicitlyDeclared);
197142a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor}
197242a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor
19733ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarvoid CXXDestructorDecl::setOperatorDelete(FunctionDecl *OD) {
19743ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  auto *First = cast<CXXDestructorDecl>(getFirstDecl());
19753ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  if (OD && !First->OperatorDelete) {
19763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    First->OperatorDelete = OD;
19773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    if (auto *L = getASTMutationListener())
19783ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar      L->ResolvedOperatorDelete(First, OD);
19793ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
19803ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar}
19813ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
198299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid CXXConversionDecl::anchor() { }
198399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
19842f1bc5285ccd40f411af5f5993f013e27e74ab78Douglas GregorCXXConversionDecl *
19851e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorCXXConversionDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
19866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, ID) CXXConversionDecl(C, nullptr, SourceLocation(),
1987651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                       DeclarationNameInfo(), QualType(),
19886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                       nullptr, false, false, false,
1989651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                       SourceLocation());
19906ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
19916ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
19926ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris LattnerCXXConversionDecl *
19932f1bc5285ccd40f411af5f5993f013e27e74ab78Douglas GregorCXXConversionDecl::Create(ASTContext &C, CXXRecordDecl *RD,
1994ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                          SourceLocation StartLoc,
19952577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                          const DeclarationNameInfo &NameInfo,
1996a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                          QualType T, TypeSourceInfo *TInfo,
1997f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor                          bool isInline, bool isExplicit,
1998af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith                          bool isConstexpr, SourceLocation EndLocation) {
19992577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  assert(NameInfo.getName().getNameKind()
20002577743c5650c646fb705df01403707e94f2df04Abramo Bagnara         == DeclarationName::CXXConversionFunctionName &&
20012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "Name must refer to a conversion function");
20026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, RD) CXXConversionDecl(C, RD, StartLoc, NameInfo, T, TInfo,
2003651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                       isInline, isExplicit, isConstexpr,
2004651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                       EndLocation);
20052f1bc5285ccd40f411af5f5993f013e27e74ab78Douglas Gregor}
20062f1bc5285ccd40f411af5f5993f013e27e74ab78Douglas Gregor
2007f6e2e0291b8964ed41b4325e21dd90b86e791f10Douglas Gregorbool CXXConversionDecl::isLambdaToBlockPointerConversion() const {
2008f6e2e0291b8964ed41b4325e21dd90b86e791f10Douglas Gregor  return isImplicit() && getParent()->isLambda() &&
2009f6e2e0291b8964ed41b4325e21dd90b86e791f10Douglas Gregor         getConversionType()->isBlockPointerType();
2010f6e2e0291b8964ed41b4325e21dd90b86e791f10Douglas Gregor}
2011f6e2e0291b8964ed41b4325e21dd90b86e791f10Douglas Gregor
201299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid LinkageSpecDecl::anchor() { }
201399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
201421ef7ae45c8b91f23cf5eab2263421bb398a644bChris LattnerLinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C,
20151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                         DeclContext *DC,
2016a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara                                         SourceLocation ExternLoc,
2017a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara                                         SourceLocation LangLoc,
20185f6bcbebedb85ee745cbd9a3ca51ca8c766a6117Abramo Bagnara                                         LanguageIDs Lang,
2019e5e575ded9cd4b80229fb299a2d97e9d44728edaRafael Espindola                                         bool HasBraces) {
2020651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return new (C, DC) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, HasBraces);
2021f44515a49b549171dc3ee9faa6281b72609da563Douglas Gregor}
20222a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor
2023651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLinkageSpecDecl *LinkageSpecDecl::CreateDeserialized(ASTContext &C,
2024651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                                     unsigned ID) {
20256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, ID) LinkageSpecDecl(nullptr, SourceLocation(),
20266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                     SourceLocation(), lang_c, false);
20271e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
20281e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
202999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid UsingDirectiveDecl::anchor() { }
203099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
20312a3009a432bdcec59e6383d7b2b17494d6f91649Douglas GregorUsingDirectiveDecl *UsingDirectiveDecl::Create(ASTContext &C, DeclContext *DC,
20322a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor                                               SourceLocation L,
20332a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor                                               SourceLocation NamespaceLoc,
2034db9924191092b4d426cc066637d81698211846aaDouglas Gregor                                           NestedNameSpecifierLoc QualifierLoc,
20352a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor                                               SourceLocation IdentLoc,
2036eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl                                               NamedDecl *Used,
20372a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor                                               DeclContext *CommonAncestor) {
2038eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl  if (NamespaceDecl *NS = dyn_cast_or_null<NamespaceDecl>(Used))
2039eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl    Used = NS->getOriginalNamespace();
2040651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return new (C, DC) UsingDirectiveDecl(DC, L, NamespaceLoc, QualifierLoc,
2041651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                        IdentLoc, Used, CommonAncestor);
20422a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor}
20432a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor
2044651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesUsingDirectiveDecl *UsingDirectiveDecl::CreateDeserialized(ASTContext &C,
2045651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                                           unsigned ID) {
20466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, ID) UsingDirectiveDecl(nullptr, SourceLocation(),
20476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                        SourceLocation(),
2048651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                        NestedNameSpecifierLoc(),
20496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                        SourceLocation(), nullptr, nullptr);
20501e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
20511e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
2052eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian RedlNamespaceDecl *UsingDirectiveDecl::getNominatedNamespace() {
2053eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl  if (NamespaceAliasDecl *NA =
2054eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl        dyn_cast_or_null<NamespaceAliasDecl>(NominatedNamespace))
2055eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl    return NA->getNamespace();
2056eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl  return cast_or_null<NamespaceDecl>(NominatedNamespace);
2057eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl}
2058eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl
20596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesNamespaceDecl::NamespaceDecl(ASTContext &C, DeclContext *DC, bool Inline,
20606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                             SourceLocation StartLoc, SourceLocation IdLoc,
20616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                             IdentifierInfo *Id, NamespaceDecl *PrevDecl)
20626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    : NamedDecl(Namespace, DC, IdLoc, Id), DeclContext(Namespace),
20636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      redeclarable_base(C), LocStart(StartLoc), RBraceLoc(),
20646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      AnonOrFirstNamespaceAndInline(nullptr, Inline) {
2065bc6509175e1ce5cc1b48d1b97ac8d23d8b74167cRafael Espindola  setPreviousDecl(PrevDecl);
20666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2067f5c9f9fd6f5e2850b9b0f19283430245b696c6e5Douglas Gregor  if (PrevDecl)
2068f5c9f9fd6f5e2850b9b0f19283430245b696c6e5Douglas Gregor    AnonOrFirstNamespaceAndInline.setPointer(PrevDecl->getOriginalNamespace());
2069f5c9f9fd6f5e2850b9b0f19283430245b696c6e5Douglas Gregor}
2070f5c9f9fd6f5e2850b9b0f19283430245b696c6e5Douglas Gregor
20711e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC,
2072f5c9f9fd6f5e2850b9b0f19283430245b696c6e5Douglas Gregor                                     bool Inline, SourceLocation StartLoc,
2073f5c9f9fd6f5e2850b9b0f19283430245b696c6e5Douglas Gregor                                     SourceLocation IdLoc, IdentifierInfo *Id,
2074f5c9f9fd6f5e2850b9b0f19283430245b696c6e5Douglas Gregor                                     NamespaceDecl *PrevDecl) {
20756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, DC) NamespaceDecl(C, DC, Inline, StartLoc, IdLoc, Id,
20766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                   PrevDecl);
20771e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
20781e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
20791e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNamespaceDecl *NamespaceDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
20806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, ID) NamespaceDecl(C, nullptr, false, SourceLocation(),
20816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                   SourceLocation(), nullptr, nullptr);
2082651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2083651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
20844967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarNamespaceDecl *NamespaceDecl::getOriginalNamespace() {
20854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (isFirstDecl())
20864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return this;
20874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
20884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return AnonOrFirstNamespaceAndInline.getPointer();
20894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
20904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
20914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarconst NamespaceDecl *NamespaceDecl::getOriginalNamespace() const {
20924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (isFirstDecl())
20934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return this;
20944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
20954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return AnonOrFirstNamespaceAndInline.getPointer();
20964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
20974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
20984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool NamespaceDecl::isOriginalNamespace() const { return isFirstDecl(); }
20994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
21006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesNamespaceDecl *NamespaceDecl::getNextRedeclarationImpl() {
21016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return getNextRedeclaration();
2102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2103651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesNamespaceDecl *NamespaceDecl::getPreviousDeclImpl() {
2104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return getPreviousDecl();
2105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2106651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesNamespaceDecl *NamespaceDecl::getMostRecentDeclImpl() {
2107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return getMostRecentDecl();
21081e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
21091e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
211099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid NamespaceAliasDecl::anchor() { }
211199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
2112176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesNamespaceAliasDecl *NamespaceAliasDecl::getNextRedeclarationImpl() {
2113176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return getNextRedeclaration();
2114176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2115176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesNamespaceAliasDecl *NamespaceAliasDecl::getPreviousDeclImpl() {
2116176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return getPreviousDecl();
2117176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2118176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesNamespaceAliasDecl *NamespaceAliasDecl::getMostRecentDeclImpl() {
2119176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return getMostRecentDecl();
2120176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2121176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
21221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpNamespaceAliasDecl *NamespaceAliasDecl::Create(ASTContext &C, DeclContext *DC,
21230a35bceb7768fc0be62cb644a4e31d8bfd9fb44aDouglas Gregor                                               SourceLocation UsingLoc,
21241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               SourceLocation AliasLoc,
21251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               IdentifierInfo *Alias,
21260cfaf6a270ecd0f5c7e541a8047c87948317548bDouglas Gregor                                           NestedNameSpecifierLoc QualifierLoc,
21271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               SourceLocation IdentLoc,
212868771c73f4293620dc1a99154ec02111e6490e28Anders Carlsson                                               NamedDecl *Namespace) {
2129176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // FIXME: Preserve the aliased namespace as written.
2130eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl  if (NamespaceDecl *NS = dyn_cast_or_null<NamespaceDecl>(Namespace))
2131eb0d8c95b43549ebf1acbb78d597901ace6dc8b7Sebastian Redl    Namespace = NS->getOriginalNamespace();
2132176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return new (C, DC) NamespaceAliasDecl(C, DC, UsingLoc, AliasLoc, Alias,
2133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                        QualifierLoc, IdentLoc, Namespace);
213468771c73f4293620dc1a99154ec02111e6490e28Anders Carlsson}
213568771c73f4293620dc1a99154ec02111e6490e28Anders Carlsson
21361e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNamespaceAliasDecl *
21371e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNamespaceAliasDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2138176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return new (C, ID) NamespaceAliasDecl(C, nullptr, SourceLocation(),
21396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                        SourceLocation(), nullptr,
21406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                        NestedNameSpecifierLoc(),
21416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                        SourceLocation(), nullptr);
21421e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
21431e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
214499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid UsingShadowDecl::anchor() { }
214599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
21464967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarUsingShadowDecl::UsingShadowDecl(Kind K, ASTContext &C, DeclContext *DC,
21474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                 SourceLocation Loc, UsingDecl *Using,
21484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                 NamedDecl *Target)
21494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : NamedDecl(K, DC, Loc, Using ? Using->getDeclName() : DeclarationName()),
21504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      redeclarable_base(C), Underlying(Target),
21514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      UsingOrNextShadow(cast<NamedDecl>(Using)) {
21524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (Target)
21534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    IdentifierNamespace = Target->getIdentifierNamespace();
21544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  setImplicit();
21554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
21564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
21574967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarUsingShadowDecl::UsingShadowDecl(Kind K, ASTContext &C, EmptyShell Empty)
21584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : NamedDecl(K, nullptr, SourceLocation(), DeclarationName()),
21594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      redeclarable_base(C), Underlying(), UsingOrNextShadow() {}
21604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
21611e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorUsingShadowDecl *
21621e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorUsingShadowDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
21634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return new (C, ID) UsingShadowDecl(UsingShadow, C, EmptyShell());
21641e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
21651e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
2166826faa22bae112e01293a58534a40711043cce65Argyrios KyrtzidisUsingDecl *UsingShadowDecl::getUsingDecl() const {
2167826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis  const UsingShadowDecl *Shadow = this;
2168826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis  while (const UsingShadowDecl *NextShadow =
2169826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis         dyn_cast<UsingShadowDecl>(Shadow->UsingOrNextShadow))
2170826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis    Shadow = NextShadow;
2171826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis  return cast<UsingDecl>(Shadow->UsingOrNextShadow);
2172826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis}
2173826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis
21744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ConstructorUsingShadowDecl::anchor() { }
21754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
21764967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarConstructorUsingShadowDecl *
21774967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarConstructorUsingShadowDecl::Create(ASTContext &C, DeclContext *DC,
21784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                   SourceLocation Loc, UsingDecl *Using,
21794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                   NamedDecl *Target, bool IsVirtual) {
21804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return new (C, DC) ConstructorUsingShadowDecl(C, DC, Loc, Using, Target,
21814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                                IsVirtual);
21824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
21834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
21844967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarConstructorUsingShadowDecl *
21854967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarConstructorUsingShadowDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
21864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return new (C, ID) ConstructorUsingShadowDecl(C, EmptyShell());
21874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
21884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
21894967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarCXXRecordDecl *ConstructorUsingShadowDecl::getNominatedBaseClass() const {
21904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return getUsingDecl()->getQualifier()->getAsRecordDecl();
21914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
21924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
219399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid UsingDecl::anchor() { }
219499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
2195826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidisvoid UsingDecl::addShadowDecl(UsingShadowDecl *S) {
2196826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis  assert(std::find(shadow_begin(), shadow_end(), S) == shadow_end() &&
2197826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis         "declaration already in set");
2198826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis  assert(S->getUsingDecl() == this);
2199826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis
22009bc6fb6317f9bc6aaaacd266b9ea36996ad338bbBenjamin Kramer  if (FirstUsingShadow.getPointer())
22019bc6fb6317f9bc6aaaacd266b9ea36996ad338bbBenjamin Kramer    S->UsingOrNextShadow = FirstUsingShadow.getPointer();
22029bc6fb6317f9bc6aaaacd266b9ea36996ad338bbBenjamin Kramer  FirstUsingShadow.setPointer(S);
2203826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis}
2204826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis
2205826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidisvoid UsingDecl::removeShadowDecl(UsingShadowDecl *S) {
2206826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis  assert(std::find(shadow_begin(), shadow_end(), S) != shadow_end() &&
2207826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis         "declaration not in set");
2208826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis  assert(S->getUsingDecl() == this);
2209826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis
2210826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis  // Remove S from the shadow decl chain. This is O(n) but hopefully rare.
2211826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis
22129bc6fb6317f9bc6aaaacd266b9ea36996ad338bbBenjamin Kramer  if (FirstUsingShadow.getPointer() == S) {
22139bc6fb6317f9bc6aaaacd266b9ea36996ad338bbBenjamin Kramer    FirstUsingShadow.setPointer(
22149bc6fb6317f9bc6aaaacd266b9ea36996ad338bbBenjamin Kramer      dyn_cast<UsingShadowDecl>(S->UsingOrNextShadow));
2215826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis    S->UsingOrNextShadow = this;
2216826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis    return;
2217826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis  }
2218826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis
22199bc6fb6317f9bc6aaaacd266b9ea36996ad338bbBenjamin Kramer  UsingShadowDecl *Prev = FirstUsingShadow.getPointer();
2220826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis  while (Prev->UsingOrNextShadow != S)
2221826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis    Prev = cast<UsingShadowDecl>(Prev->UsingOrNextShadow);
2222826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis  Prev->UsingOrNextShadow = S->UsingOrNextShadow;
2223826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis  S->UsingOrNextShadow = this;
2224826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis}
2225826faa22bae112e01293a58534a40711043cce65Argyrios Kyrtzidis
2226dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas GregorUsingDecl *UsingDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation UL,
2227dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor                             NestedNameSpecifierLoc QualifierLoc,
2228ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara                             const DeclarationNameInfo &NameInfo,
22298d030c7a6f36438f6c7dd977f8be0de0cc781ad5Enea Zaffanella                             bool HasTypename) {
2230651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return new (C, DC) UsingDecl(DC, UL, QualifierLoc, NameInfo, HasTypename);
22319cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor}
22329cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor
22331e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorUsingDecl *UsingDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
22346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, ID) UsingDecl(nullptr, SourceLocation(),
22356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                               NestedNameSpecifierLoc(), DeclarationNameInfo(),
22366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                               false);
22371e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
22381e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
2239d4de59d3e54421ef88316d650e35802ba9c572cfEnea ZaffanellaSourceRange UsingDecl::getSourceRange() const {
2240d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella  SourceLocation Begin = isAccessDeclaration()
2241d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella    ? getQualifierLoc().getBeginLoc() : UsingLocation;
2242d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella  return SourceRange(Begin, getNameInfo().getEndLoc());
2243d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella}
2244d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella
224599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid UnresolvedUsingValueDecl::anchor() { }
224699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
22477ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallUnresolvedUsingValueDecl *
22487ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallUnresolvedUsingValueDecl::Create(ASTContext &C, DeclContext *DC,
22497ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall                                 SourceLocation UsingLoc,
2250dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor                                 NestedNameSpecifierLoc QualifierLoc,
2251ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara                                 const DeclarationNameInfo &NameInfo) {
2252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return new (C, DC) UnresolvedUsingValueDecl(DC, C.DependentTy, UsingLoc,
2253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                              QualifierLoc, NameInfo);
22547ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall}
22557ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall
22561e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorUnresolvedUsingValueDecl *
22571e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorUnresolvedUsingValueDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
22586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, ID) UnresolvedUsingValueDecl(nullptr, QualType(),
22596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                              SourceLocation(),
2260651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                              NestedNameSpecifierLoc(),
22616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                              DeclarationNameInfo());
22621e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
22631e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
2264d4de59d3e54421ef88316d650e35802ba9c572cfEnea ZaffanellaSourceRange UnresolvedUsingValueDecl::getSourceRange() const {
2265d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella  SourceLocation Begin = isAccessDeclaration()
2266d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella    ? getQualifierLoc().getBeginLoc() : UsingLocation;
2267d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella  return SourceRange(Begin, getNameInfo().getEndLoc());
2268d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella}
2269d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella
227099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid UnresolvedUsingTypenameDecl::anchor() { }
227199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
22727ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallUnresolvedUsingTypenameDecl *
22737ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallUnresolvedUsingTypenameDecl::Create(ASTContext &C, DeclContext *DC,
22747ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall                                    SourceLocation UsingLoc,
22757ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall                                    SourceLocation TypenameLoc,
2276dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor                                    NestedNameSpecifierLoc QualifierLoc,
22777ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall                                    SourceLocation TargetNameLoc,
22787ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall                                    DeclarationName TargetName) {
2279651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return new (C, DC) UnresolvedUsingTypenameDecl(
2280651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      DC, UsingLoc, TypenameLoc, QualifierLoc, TargetNameLoc,
2281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      TargetName.getAsIdentifierInfo());
2282665b49c62d637d16826036118f92d35f116f3ef3Anders Carlsson}
2283665b49c62d637d16826036118f92d35f116f3ef3Anders Carlsson
22841e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorUnresolvedUsingTypenameDecl *
22851e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorUnresolvedUsingTypenameDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2286651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return new (C, ID) UnresolvedUsingTypenameDecl(
22876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      nullptr, SourceLocation(), SourceLocation(), NestedNameSpecifierLoc(),
22886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      SourceLocation(), nullptr);
22891e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
22901e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
229199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid StaticAssertDecl::anchor() { }
229299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
2293fb311762bb52dc015c02cb257d2913f104b556f8Anders CarlssonStaticAssertDecl *StaticAssertDecl::Create(ASTContext &C, DeclContext *DC,
2294a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara                                           SourceLocation StaticAssertLoc,
2295a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara                                           Expr *AssertExpr,
2296a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara                                           StringLiteral *Message,
2297e3f470a718ec00eb8b546e405fa59bc2df2d7c46Richard Smith                                           SourceLocation RParenLoc,
2298e3f470a718ec00eb8b546e405fa59bc2df2d7c46Richard Smith                                           bool Failed) {
2299651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return new (C, DC) StaticAssertDecl(DC, StaticAssertLoc, AssertExpr, Message,
2300651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                      RParenLoc, Failed);
2301fb311762bb52dc015c02cb257d2913f104b556f8Anders Carlsson}
2302fb311762bb52dc015c02cb257d2913f104b556f8Anders Carlsson
2303651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesStaticAssertDecl *StaticAssertDecl::CreateDeserialized(ASTContext &C,
23041e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                       unsigned ID) {
23056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, ID) StaticAssertDecl(nullptr, SourceLocation(), nullptr,
23066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                      nullptr, SourceLocation(), false);
2307651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2308651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2309651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesMSPropertyDecl *MSPropertyDecl::Create(ASTContext &C, DeclContext *DC,
2310651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                       SourceLocation L, DeclarationName N,
2311651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                       QualType T, TypeSourceInfo *TInfo,
2312651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                       SourceLocation StartL,
2313651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                       IdentifierInfo *Getter,
2314651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                       IdentifierInfo *Setter) {
2315651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return new (C, DC) MSPropertyDecl(DC, L, N, T, TInfo, StartL, Getter, Setter);
2316651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2317651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2318651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesMSPropertyDecl *MSPropertyDecl::CreateDeserialized(ASTContext &C,
2319651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                                   unsigned ID) {
23206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, ID) MSPropertyDecl(nullptr, SourceLocation(),
23216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                    DeclarationName(), QualType(), nullptr,
23226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                    SourceLocation(), nullptr, nullptr);
23231e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
23241e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
232505bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlssonstatic const char *getAccessName(AccessSpecifier AS) {
232605bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson  switch (AS) {
232705bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson    case AS_none:
2328b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Invalid access specifier!");
232905bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson    case AS_public:
233005bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson      return "public";
233105bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson    case AS_private:
233205bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson      return "private";
233305bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson    case AS_protected:
233405bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson      return "protected";
233505bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson  }
2336561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie  llvm_unreachable("Invalid access specifier!");
233705bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson}
233805bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson
233905bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlssonconst DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB,
234005bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson                                           AccessSpecifier AS) {
234105bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson  return DB << getAccessName(AS);
234205bf2c79770927c66ca725e9bb589048ed3f069eAnders Carlsson}
2343f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith
2344f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smithconst PartialDiagnostic &clang::operator<<(const PartialDiagnostic &DB,
2345f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith                                           AccessSpecifier AS) {
2346f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  return DB << getAccessName(AS);
2347f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith}
2348