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