blob: a9759b4c0a202a60c1b0e83abd8a5918116d99c9 [file] [log] [blame]
Ted Kremenek21475702008-09-05 17:16:31 +00001//===--- DeclCXX.cpp - C++ Declaration AST Node Implementation ------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the C++ related Decl classes.
11//
12//===----------------------------------------------------------------------===//
Ted Kremenek21475702008-09-05 17:16:31 +000013#include "clang/AST/DeclCXX.h"
14#include "clang/AST/ASTContext.h"
Faisal Vali2b391ab2013-09-26 19:54:12 +000015#include "clang/AST/ASTLambda.h"
Argyrios Kyrtzidis65ad5692010-10-24 17:26:36 +000016#include "clang/AST/ASTMutationListener.h"
Douglas Gregor8fb95122010-09-29 00:15:42 +000017#include "clang/AST/CXXInheritance.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000018#include "clang/AST/DeclTemplate.h"
Anders Carlsson5bbe1d72009-03-14 00:25:26 +000019#include "clang/AST/Expr.h"
Douglas Gregord73f3dd2011-11-01 01:16:03 +000020#include "clang/AST/ExprCXX.h"
Richard Trieue7f7ed22017-02-22 01:11:25 +000021#include "clang/AST/ODRHash.h"
Douglas Gregorc8c44b5d2009-12-02 22:36:29 +000022#include "clang/AST/TypeLoc.h"
Douglas Gregorb6acda02008-11-12 23:21:09 +000023#include "clang/Basic/IdentifierTable.h"
Douglas Gregor74a34442008-12-23 21:31:30 +000024#include "llvm/ADT/STLExtras.h"
Fariborz Jahaniana9540492009-09-12 19:52:10 +000025#include "llvm/ADT/SmallPtrSet.h"
Ted Kremenek21475702008-09-05 17:16:31 +000026using namespace clang;
27
28//===----------------------------------------------------------------------===//
29// Decl Allocation/Deallocation Method Implementations
30//===----------------------------------------------------------------------===//
Douglas Gregor5101c242008-12-05 18:15:24 +000031
David Blaikie68e081d2011-12-20 02:48:34 +000032void AccessSpecDecl::anchor() { }
33
Douglas Gregor72172e92012-01-05 21:55:30 +000034AccessSpecDecl *AccessSpecDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
Richard Smithf7981722013-11-22 09:01:48 +000035 return new (C, ID) AccessSpecDecl(EmptyShell());
Douglas Gregor72172e92012-01-05 21:55:30 +000036}
37
Richard Smitha4ba74c2013-08-30 04:46:40 +000038void LazyASTUnresolvedSet::getFromExternalSource(ASTContext &C) const {
39 ExternalASTSource *Source = C.getExternalSource();
40 assert(Impl.Decls.isLazy() && "getFromExternalSource for non-lazy set");
41 assert(Source && "getFromExternalSource with no external source");
42
43 for (ASTUnresolvedSet::iterator I = Impl.begin(); I != Impl.end(); ++I)
44 I.setDecl(cast<NamedDecl>(Source->GetExternalDecl(
45 reinterpret_cast<uintptr_t>(I.getDecl()) >> 2)));
46 Impl.Decls.setLazy(false);
47}
48
John McCall67da35c2010-02-04 22:26:26 +000049CXXRecordDecl::DefinitionData::DefinitionData(CXXRecordDecl *D)
Nico Weber6a6376b2016-02-19 01:52:46 +000050 : UserDeclaredConstructor(false), UserDeclaredSpecialMembers(0),
51 Aggregate(true), PlainOldData(true), Empty(true), Polymorphic(false),
52 Abstract(false), IsStandardLayout(true), HasNoNonEmptyBases(true),
53 HasPrivateFields(false), HasProtectedFields(false),
54 HasPublicFields(false), HasMutableFields(false), HasVariantMembers(false),
55 HasOnlyCMembers(true), HasInClassInitializer(false),
56 HasUninitializedReferenceMember(false), HasUninitializedFields(false),
Richard Smith12e79312016-05-13 06:47:56 +000057 HasInheritedConstructor(false), HasInheritedAssignment(false),
Richard Smith96cd6712017-08-16 01:49:53 +000058 NeedOverloadResolutionForCopyConstructor(false),
Nico Weber6a6376b2016-02-19 01:52:46 +000059 NeedOverloadResolutionForMoveConstructor(false),
60 NeedOverloadResolutionForMoveAssignment(false),
61 NeedOverloadResolutionForDestructor(false),
Richard Smith96cd6712017-08-16 01:49:53 +000062 DefaultedCopyConstructorIsDeleted(false),
Nico Weber6a6376b2016-02-19 01:52:46 +000063 DefaultedMoveConstructorIsDeleted(false),
64 DefaultedMoveAssignmentIsDeleted(false),
65 DefaultedDestructorIsDeleted(false), HasTrivialSpecialMembers(SMF_All),
66 DeclaredNonTrivialSpecialMembers(0), HasIrrelevantDestructor(true),
67 HasConstexprNonCopyMoveConstructor(false),
Nico Weber72c57f42016-02-24 20:58:14 +000068 HasDefaultedDefaultConstructor(false),
Richard Smith96cd6712017-08-16 01:49:53 +000069 CanPassInRegisters(true),
Nico Weber6a6376b2016-02-19 01:52:46 +000070 DefaultedDefaultConstructorIsConstexpr(true),
71 HasConstexprDefaultConstructor(false),
72 HasNonLiteralTypeFieldsOrBases(false), ComputedVisibleConversions(false),
73 UserProvidedDefaultConstructor(false), DeclaredSpecialMembers(0),
Richard Smithdf054d32017-02-25 23:53:05 +000074 ImplicitCopyConstructorCanHaveConstParamForVBase(true),
75 ImplicitCopyConstructorCanHaveConstParamForNonVBase(true),
Nico Weber6a6376b2016-02-19 01:52:46 +000076 ImplicitCopyAssignmentHasConstParam(true),
77 HasDeclaredCopyConstructorWithConstParam(false),
78 HasDeclaredCopyAssignmentWithConstParam(false), IsLambda(false),
Richard Trieufd1acbb2017-04-11 21:31:00 +000079 IsParsingBaseSpecifiers(false), HasODRHash(false), ODRHash(0),
80 NumBases(0), NumVBases(0), Bases(), VBases(), Definition(D),
81 FirstFriend() {}
John McCall67da35c2010-02-04 22:26:26 +000082
Benjamin Kramer300c0632012-07-04 17:03:33 +000083CXXBaseSpecifier *CXXRecordDecl::DefinitionData::getBasesSlowCase() const {
84 return Bases.get(Definition->getASTContext().getExternalSource());
85}
86
87CXXBaseSpecifier *CXXRecordDecl::DefinitionData::getVBasesSlowCase() const {
88 return VBases.get(Definition->getASTContext().getExternalSource());
89}
90
Richard Smith053f6c62014-05-16 23:01:30 +000091CXXRecordDecl::CXXRecordDecl(Kind K, TagKind TK, const ASTContext &C,
92 DeclContext *DC, SourceLocation StartLoc,
93 SourceLocation IdLoc, IdentifierInfo *Id,
94 CXXRecordDecl *PrevDecl)
95 : RecordDecl(K, TK, C, DC, StartLoc, IdLoc, Id, PrevDecl),
96 DefinitionData(PrevDecl ? PrevDecl->DefinitionData
Richard Smithb6483992016-05-17 22:44:15 +000097 : nullptr),
Richard Smith053f6c62014-05-16 23:01:30 +000098 TemplateOrInstantiation() {}
Douglas Gregorb6acda02008-11-12 23:21:09 +000099
Jay Foad39c79802011-01-12 09:06:06 +0000100CXXRecordDecl *CXXRecordDecl::Create(const ASTContext &C, TagKind TK,
Abramo Bagnara29c2d462011-03-09 14:09:51 +0000101 DeclContext *DC, SourceLocation StartLoc,
102 SourceLocation IdLoc, IdentifierInfo *Id,
Douglas Gregor1ec5e9f2009-05-15 19:11:46 +0000103 CXXRecordDecl* PrevDecl,
104 bool DelayTypeCreation) {
Richard Smith053f6c62014-05-16 23:01:30 +0000105 CXXRecordDecl *R = new (C, DC) CXXRecordDecl(CXXRecord, TK, C, DC, StartLoc,
Richard Smithf7981722013-11-22 09:01:48 +0000106 IdLoc, Id, PrevDecl);
Douglas Gregor7dab26b2013-02-09 01:35:03 +0000107 R->MayHaveOutOfDateDef = C.getLangOpts().Modules;
Mike Stump11289f42009-09-09 15:08:12 +0000108
Douglas Gregorb6b8f9e2009-07-29 23:36:44 +0000109 // FIXME: DelayTypeCreation seems like such a hack
Douglas Gregor1ec5e9f2009-05-15 19:11:46 +0000110 if (!DelayTypeCreation)
Mike Stump11289f42009-09-09 15:08:12 +0000111 C.getTypeDeclType(R, PrevDecl);
Ted Kremenek21475702008-09-05 17:16:31 +0000112 return R;
113}
114
Richard Smith053f6c62014-05-16 23:01:30 +0000115CXXRecordDecl *
116CXXRecordDecl::CreateLambda(const ASTContext &C, DeclContext *DC,
117 TypeSourceInfo *Info, SourceLocation Loc,
118 bool Dependent, bool IsGeneric,
119 LambdaCaptureDefault CaptureDefault) {
Richard Smithf7981722013-11-22 09:01:48 +0000120 CXXRecordDecl *R =
Richard Smith053f6c62014-05-16 23:01:30 +0000121 new (C, DC) CXXRecordDecl(CXXRecord, TTK_Class, C, DC, Loc, Loc,
122 nullptr, nullptr);
Douglas Gregorc8a73492012-02-13 15:44:47 +0000123 R->IsBeingDefined = true;
Richard Smith64c06302014-05-22 23:19:02 +0000124 R->DefinitionData =
Richard Smith053f6c62014-05-16 23:01:30 +0000125 new (C) struct LambdaDefinitionData(R, Info, Dependent, IsGeneric,
Richard Smith64c06302014-05-22 23:19:02 +0000126 CaptureDefault);
Douglas Gregor7dab26b2013-02-09 01:35:03 +0000127 R->MayHaveOutOfDateDef = false;
James Dennett8f60cdd2013-09-05 17:46:21 +0000128 R->setImplicit(true);
Craig Topper36250ad2014-05-12 05:36:57 +0000129 C.getTypeDeclType(R, /*PrevDecl=*/nullptr);
Douglas Gregorc8a73492012-02-13 15:44:47 +0000130 return R;
131}
132
Douglas Gregor72172e92012-01-05 21:55:30 +0000133CXXRecordDecl *
134CXXRecordDecl::CreateDeserialized(const ASTContext &C, unsigned ID) {
Richard Smithf7981722013-11-22 09:01:48 +0000135 CXXRecordDecl *R = new (C, ID) CXXRecordDecl(
Richard Smith053f6c62014-05-16 23:01:30 +0000136 CXXRecord, TTK_Struct, C, nullptr, SourceLocation(), SourceLocation(),
Craig Topper36250ad2014-05-12 05:36:57 +0000137 nullptr, nullptr);
Douglas Gregor7dab26b2013-02-09 01:35:03 +0000138 R->MayHaveOutOfDateDef = false;
139 return R;
Argyrios Kyrtzidis39f0e302010-07-02 11:54:55 +0000140}
141
Mike Stump11289f42009-09-09 15:08:12 +0000142void
Craig Toppere6337e12015-12-25 00:36:02 +0000143CXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases,
144 unsigned NumBases) {
Douglas Gregor4a62bdf2010-02-11 01:30:34 +0000145 ASTContext &C = getASTContext();
Douglas Gregorcfd8ddc2008-11-05 16:20:31 +0000146
Douglas Gregord4c5ed02010-10-29 22:39:52 +0000147 if (!data().Bases.isOffset() && data().NumBases > 0)
148 C.Deallocate(data().getBases());
Mike Stump11289f42009-09-09 15:08:12 +0000149
Craig Toppere6337e12015-12-25 00:36:02 +0000150 if (NumBases) {
Richard Smith872307e2016-03-08 22:17:41 +0000151 if (!C.getLangOpts().CPlusPlus1z) {
152 // C++ [dcl.init.aggr]p1:
153 // An aggregate is [...] a class with [...] no base classes [...].
154 data().Aggregate = false;
155 }
Richard Smithaed32b42011-10-18 20:08:55 +0000156
157 // C++ [class]p4:
158 // A POD-struct is an aggregate class...
159 data().PlainOldData = false;
160 }
161
Anders Carlssonabb20e62010-03-29 05:13:12 +0000162 // The set of seen virtual base types.
Anders Carlssone47380f2010-03-29 19:49:09 +0000163 llvm::SmallPtrSet<CanQualType, 8> SeenVBaseTypes;
Anders Carlssonabb20e62010-03-29 05:13:12 +0000164
165 // The virtual bases of this class.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000166 SmallVector<const CXXBaseSpecifier *, 8> VBases;
Mike Stump11289f42009-09-09 15:08:12 +0000167
Craig Toppere6337e12015-12-25 00:36:02 +0000168 data().Bases = new(C) CXXBaseSpecifier [NumBases];
169 data().NumBases = NumBases;
170 for (unsigned i = 0; i < NumBases; ++i) {
Douglas Gregord4c5ed02010-10-29 22:39:52 +0000171 data().getBases()[i] = *Bases[i];
Fariborz Jahanian3554b5a2009-07-10 20:13:23 +0000172 // Keep track of inherited vbases for this base class.
173 const CXXBaseSpecifier *Base = Bases[i];
174 QualType BaseType = Base->getType();
Douglas Gregorbeab56e2010-02-27 00:25:28 +0000175 // Skip dependent types; we can't do any checking on them now.
Fariborz Jahanian3554b5a2009-07-10 20:13:23 +0000176 if (BaseType->isDependentType())
177 continue;
178 CXXRecordDecl *BaseClassDecl
Ted Kremenekc23c7e62009-07-29 21:53:49 +0000179 = cast<CXXRecordDecl>(BaseType->getAs<RecordType>()->getDecl());
Anders Carlssonabb20e62010-03-29 05:13:12 +0000180
Chandler Carruthb1963742011-04-30 09:17:45 +0000181 if (!BaseClassDecl->isEmpty()) {
182 if (!data().Empty) {
183 // C++0x [class]p7:
184 // A standard-layout class is a class that:
185 // [...]
186 // -- either has no non-static data members in the most derived
187 // class and at most one base class with non-static data members,
188 // or has no base classes with non-static data members, and
189 // If this is the second non-empty base, then neither of these two
190 // clauses can be true.
Chandler Carruth583edf82011-04-30 10:07:30 +0000191 data().IsStandardLayout = false;
Chandler Carruthb1963742011-04-30 09:17:45 +0000192 }
193
David Majnemer5cfda6f2016-05-22 05:34:26 +0000194 // C++14 [meta.unary.prop]p4:
195 // T is a class type [...] with [...] no base class B for which
196 // is_empty<B>::value is false.
Douglas Gregor9d5938a2010-09-28 20:38:10 +0000197 data().Empty = false;
Chandler Carruthb1963742011-04-30 09:17:45 +0000198 data().HasNoNonEmptyBases = false;
199 }
Douglas Gregor9d5938a2010-09-28 20:38:10 +0000200
Richard Smith872307e2016-03-08 22:17:41 +0000201 // C++1z [dcl.init.agg]p1:
202 // An aggregate is a class with [...] no private or protected base classes
203 if (Base->getAccessSpecifier() != AS_public)
204 data().Aggregate = false;
205
Douglas Gregor11c024b2010-09-28 20:50:54 +0000206 // C++ [class.virtual]p1:
207 // A class that declares or inherits a virtual function is called a
208 // polymorphic class.
209 if (BaseClassDecl->isPolymorphic())
210 data().Polymorphic = true;
Chandler Carruthe71d0622011-04-24 02:49:34 +0000211
Chandler Carruthb1963742011-04-30 09:17:45 +0000212 // C++0x [class]p7:
213 // A standard-layout class is a class that: [...]
214 // -- has no non-standard-layout base classes
Chandler Carruth583edf82011-04-30 10:07:30 +0000215 if (!BaseClassDecl->isStandardLayout())
216 data().IsStandardLayout = false;
Chandler Carruthb1963742011-04-30 09:17:45 +0000217
Chandler Carruthe71d0622011-04-24 02:49:34 +0000218 // Record if this base is the first non-literal field or base.
Richard Smithd9f663b2013-04-22 15:31:51 +0000219 if (!hasNonLiteralTypeFieldsOrBases() && !BaseType->isLiteralType(C))
Chandler Carruthe71d0622011-04-24 02:49:34 +0000220 data().HasNonLiteralTypeFieldsOrBases = true;
Douglas Gregor11c024b2010-09-28 20:50:54 +0000221
Anders Carlssonabb20e62010-03-29 05:13:12 +0000222 // Now go through all virtual bases of this base and add them.
Aaron Ballman445a9392014-03-13 16:15:17 +0000223 for (const auto &VBase : BaseClassDecl->vbases()) {
Anders Carlssonabb20e62010-03-29 05:13:12 +0000224 // Add this base if it's not already in the list.
David Blaikie82e95a32014-11-19 07:49:47 +0000225 if (SeenVBaseTypes.insert(C.getCanonicalType(VBase.getType())).second) {
Aaron Ballman445a9392014-03-13 16:15:17 +0000226 VBases.push_back(&VBase);
Richard Smith1c33fe82012-11-28 06:23:12 +0000227
228 // C++11 [class.copy]p8:
229 // The implicitly-declared copy constructor for a class X will have
230 // the form 'X::X(const X&)' if each [...] virtual base class B of X
231 // has a copy constructor whose first parameter is of type
232 // 'const B&' or 'const volatile B&' [...]
Aaron Ballman445a9392014-03-13 16:15:17 +0000233 if (CXXRecordDecl *VBaseDecl = VBase.getType()->getAsCXXRecordDecl())
Richard Smith1c33fe82012-11-28 06:23:12 +0000234 if (!VBaseDecl->hasCopyConstructorWithConstParam())
Richard Smithdf054d32017-02-25 23:53:05 +0000235 data().ImplicitCopyConstructorCanHaveConstParamForVBase = false;
Richard Smith872307e2016-03-08 22:17:41 +0000236
237 // C++1z [dcl.init.agg]p1:
238 // An aggregate is a class with [...] no virtual base classes
239 data().Aggregate = false;
Richard Smith1c33fe82012-11-28 06:23:12 +0000240 }
Fariborz Jahanian3554b5a2009-07-10 20:13:23 +0000241 }
Anders Carlssonabb20e62010-03-29 05:13:12 +0000242
243 if (Base->isVirtual()) {
244 // Add this base if it's not already in the list.
David Blaikie82e95a32014-11-19 07:49:47 +0000245 if (SeenVBaseTypes.insert(C.getCanonicalType(BaseType)).second)
Richard Smith1c33fe82012-11-28 06:23:12 +0000246 VBases.push_back(Base);
247
David Majnemer5cfda6f2016-05-22 05:34:26 +0000248 // C++14 [meta.unary.prop] is_empty:
249 // T is a class type, but not a union type, with ... no virtual base
250 // classes
Douglas Gregor9d5938a2010-09-28 20:38:10 +0000251 data().Empty = false;
Chandler Carruthad7d4042011-04-23 23:10:33 +0000252
Richard Smith872307e2016-03-08 22:17:41 +0000253 // C++1z [dcl.init.agg]p1:
254 // An aggregate is a class with [...] no virtual base classes
255 data().Aggregate = false;
256
Richard Smith328aae52012-11-30 05:11:39 +0000257 // C++11 [class.ctor]p5, C++11 [class.copy]p12, C++11 [class.copy]p25:
258 // A [default constructor, copy/move constructor, or copy/move assignment
259 // operator for a class X] is trivial [...] if:
260 // -- class X has [...] no virtual base classes
261 data().HasTrivialSpecialMembers &= SMF_Destructor;
Chandler Carruthb1963742011-04-30 09:17:45 +0000262
263 // C++0x [class]p7:
264 // A standard-layout class is a class that: [...]
265 // -- has [...] no virtual base classes
Chandler Carruth583edf82011-04-30 10:07:30 +0000266 data().IsStandardLayout = false;
Richard Smithcc36f692011-12-22 02:22:31 +0000267
268 // C++11 [dcl.constexpr]p4:
269 // In the definition of a constexpr constructor [...]
270 // -- the class shall not have any virtual base classes
271 data().DefaultedDefaultConstructorIsConstexpr = false;
Richard Smithdf054d32017-02-25 23:53:05 +0000272
273 // C++1z [class.copy]p8:
274 // The implicitly-declared copy constructor for a class X will have
275 // the form 'X::X(const X&)' if each potentially constructed subobject
276 // has a copy constructor whose first parameter is of type
277 // 'const B&' or 'const volatile B&' [...]
278 if (!BaseClassDecl->hasCopyConstructorWithConstParam())
279 data().ImplicitCopyConstructorCanHaveConstParamForVBase = false;
Douglas Gregor11c024b2010-09-28 20:50:54 +0000280 } else {
281 // C++ [class.ctor]p5:
Alexis Huntf479f1b2011-05-09 18:22:59 +0000282 // A default constructor is trivial [...] if:
283 // -- all the direct base classes of its class have trivial default
284 // constructors.
285 if (!BaseClassDecl->hasTrivialDefaultConstructor())
Richard Smith328aae52012-11-30 05:11:39 +0000286 data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
287
Chandler Carruthad7d4042011-04-23 23:10:33 +0000288 // C++0x [class.copy]p13:
289 // A copy/move constructor for class X is trivial if [...]
290 // [...]
291 // -- the constructor selected to copy/move each direct base class
292 // subobject is trivial, and
Douglas Gregor11c024b2010-09-28 20:50:54 +0000293 if (!BaseClassDecl->hasTrivialCopyConstructor())
Richard Smith328aae52012-11-30 05:11:39 +0000294 data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor;
Richard Smith6b02d462012-12-08 08:32:28 +0000295 // If the base class doesn't have a simple move constructor, we'll eagerly
296 // declare it and perform overload resolution to determine which function
297 // it actually calls. If it does have a simple move constructor, this
298 // check is correct.
Richard Smith16488472012-11-16 00:53:38 +0000299 if (!BaseClassDecl->hasTrivialMoveConstructor())
Richard Smith328aae52012-11-30 05:11:39 +0000300 data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor;
Chandler Carruthad7d4042011-04-23 23:10:33 +0000301
302 // C++0x [class.copy]p27:
303 // A copy/move assignment operator for class X is trivial if [...]
304 // [...]
305 // -- the assignment operator selected to copy/move each direct base
306 // class subobject is trivial, and
Douglas Gregor11c024b2010-09-28 20:50:54 +0000307 if (!BaseClassDecl->hasTrivialCopyAssignment())
Richard Smith328aae52012-11-30 05:11:39 +0000308 data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment;
Richard Smith6b02d462012-12-08 08:32:28 +0000309 // If the base class doesn't have a simple move assignment, we'll eagerly
310 // declare it and perform overload resolution to determine which function
311 // it actually calls. If it does have a simple move assignment, this
312 // check is correct.
Richard Smith16488472012-11-16 00:53:38 +0000313 if (!BaseClassDecl->hasTrivialMoveAssignment())
Richard Smith328aae52012-11-30 05:11:39 +0000314 data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment;
Richard Smithcc36f692011-12-22 02:22:31 +0000315
316 // C++11 [class.ctor]p6:
Richard Smithc101e612012-01-11 18:26:05 +0000317 // If that user-written default constructor would satisfy the
Richard Smithcc36f692011-12-22 02:22:31 +0000318 // requirements of a constexpr constructor, the implicitly-defined
319 // default constructor is constexpr.
320 if (!BaseClassDecl->hasConstexprDefaultConstructor())
321 data().DefaultedDefaultConstructorIsConstexpr = false;
Richard Smithdf054d32017-02-25 23:53:05 +0000322
323 // C++1z [class.copy]p8:
324 // The implicitly-declared copy constructor for a class X will have
325 // the form 'X::X(const X&)' if each potentially constructed subobject
326 // has a copy constructor whose first parameter is of type
327 // 'const B&' or 'const volatile B&' [...]
328 if (!BaseClassDecl->hasCopyConstructorWithConstParam())
329 data().ImplicitCopyConstructorCanHaveConstParamForNonVBase = false;
Anders Carlssonabb20e62010-03-29 05:13:12 +0000330 }
Richard Smith92f241f2012-12-08 02:53:02 +0000331
Douglas Gregor11c024b2010-09-28 20:50:54 +0000332 // C++ [class.ctor]p3:
333 // A destructor is trivial if all the direct base classes of its class
334 // have trivial destructors.
335 if (!BaseClassDecl->hasTrivialDestructor())
Richard Smith328aae52012-11-30 05:11:39 +0000336 data().HasTrivialSpecialMembers &= ~SMF_Destructor;
Richard Smith561fb152012-02-25 07:33:38 +0000337
338 if (!BaseClassDecl->hasIrrelevantDestructor())
339 data().HasIrrelevantDestructor = false;
340
Richard Smith1c33fe82012-11-28 06:23:12 +0000341 // C++11 [class.copy]p18:
342 // The implicitly-declared copy assignment oeprator for a class X will
343 // have the form 'X& X::operator=(const X&)' if each direct base class B
344 // of X has a copy assignment operator whose parameter is of type 'const
345 // B&', 'const volatile B&', or 'B' [...]
346 if (!BaseClassDecl->hasCopyAssignmentWithConstParam())
347 data().ImplicitCopyAssignmentHasConstParam = false;
348
John McCall31168b02011-06-15 23:02:42 +0000349 // A class has an Objective-C object member if... or any of its bases
350 // has an Objective-C object member.
351 if (BaseClassDecl->hasObjectMember())
352 setHasObjectMember(true);
Fariborz Jahanian78652202013-01-25 23:57:05 +0000353
354 if (BaseClassDecl->hasVolatileMember())
355 setHasVolatileMember(true);
John McCall31168b02011-06-15 23:02:42 +0000356
Douglas Gregor61226d32011-05-13 01:05:07 +0000357 // Keep track of the presence of mutable fields.
Richard Smith96cd6712017-08-16 01:49:53 +0000358 if (BaseClassDecl->hasMutableFields()) {
Douglas Gregor61226d32011-05-13 01:05:07 +0000359 data().HasMutableFields = true;
Richard Smith96cd6712017-08-16 01:49:53 +0000360 data().NeedOverloadResolutionForCopyConstructor = true;
361 }
Richard Smith593f9932012-12-08 02:01:17 +0000362
363 if (BaseClassDecl->hasUninitializedReferenceMember())
364 data().HasUninitializedReferenceMember = true;
Richard Smith6b02d462012-12-08 08:32:28 +0000365
Nico Weber6a6376b2016-02-19 01:52:46 +0000366 if (!BaseClassDecl->allowConstDefaultInit())
367 data().HasUninitializedFields = true;
368
Richard Smith6b02d462012-12-08 08:32:28 +0000369 addedClassSubobject(BaseClassDecl);
Fariborz Jahanian3554b5a2009-07-10 20:13:23 +0000370 }
Anders Carlssonabb20e62010-03-29 05:13:12 +0000371
David Majnemer5ef4fe72014-06-13 06:43:46 +0000372 if (VBases.empty()) {
373 data().IsParsingBaseSpecifiers = false;
Anders Carlssonabb20e62010-03-29 05:13:12 +0000374 return;
David Majnemer5ef4fe72014-06-13 06:43:46 +0000375 }
Anders Carlssonabb20e62010-03-29 05:13:12 +0000376
377 // Create base specifier for any direct or indirect virtual bases.
378 data().VBases = new (C) CXXBaseSpecifier[VBases.size()];
379 data().NumVBases = VBases.size();
Richard Smith6b02d462012-12-08 08:32:28 +0000380 for (int I = 0, E = VBases.size(); I != E; ++I) {
381 QualType Type = VBases[I]->getType();
382 if (!Type->isDependentType())
383 addedClassSubobject(Type->getAsCXXRecordDecl());
Richard Smith26935e62011-07-12 23:49:11 +0000384 data().getVBases()[I] = *VBases[I];
Richard Smith6b02d462012-12-08 08:32:28 +0000385 }
David Majnemer5ef4fe72014-06-13 06:43:46 +0000386
387 data().IsParsingBaseSpecifiers = false;
Richard Smith6b02d462012-12-08 08:32:28 +0000388}
389
Richard Trieufd1acbb2017-04-11 21:31:00 +0000390unsigned CXXRecordDecl::getODRHash() const {
391 assert(hasDefinition() && "ODRHash only for records with definitions");
Richard Trieue7f7ed22017-02-22 01:11:25 +0000392
Richard Trieufd1acbb2017-04-11 21:31:00 +0000393 // Previously calculated hash is stored in DefinitionData.
394 if (DefinitionData->HasODRHash)
395 return DefinitionData->ODRHash;
396
397 // Only calculate hash on first call of getODRHash per record.
Richard Trieue7f7ed22017-02-22 01:11:25 +0000398 ODRHash Hash;
Richard Trieufd1acbb2017-04-11 21:31:00 +0000399 Hash.AddCXXRecordDecl(getDefinition());
400 DefinitionData->HasODRHash = true;
Richard Trieue7f7ed22017-02-22 01:11:25 +0000401 DefinitionData->ODRHash = Hash.CalculateHash();
Richard Trieufd1acbb2017-04-11 21:31:00 +0000402
403 return DefinitionData->ODRHash;
Richard Trieue7f7ed22017-02-22 01:11:25 +0000404}
Richard Trieub6adf542017-02-18 02:09:28 +0000405
Richard Trieufd1acbb2017-04-11 21:31:00 +0000406
Richard Smith6b02d462012-12-08 08:32:28 +0000407void CXXRecordDecl::addedClassSubobject(CXXRecordDecl *Subobj) {
408 // C++11 [class.copy]p11:
409 // A defaulted copy/move constructor for a class X is defined as
410 // deleted if X has:
411 // -- a direct or virtual base class B that cannot be copied/moved [...]
412 // -- a non-static data member of class type M (or array thereof)
413 // that cannot be copied or moved [...]
Richard Smith96cd6712017-08-16 01:49:53 +0000414 if (!Subobj->hasSimpleCopyConstructor())
415 data().NeedOverloadResolutionForCopyConstructor = true;
Richard Smith6b02d462012-12-08 08:32:28 +0000416 if (!Subobj->hasSimpleMoveConstructor())
417 data().NeedOverloadResolutionForMoveConstructor = true;
418
419 // C++11 [class.copy]p23:
420 // A defaulted copy/move assignment operator for a class X is defined as
421 // deleted if X has:
422 // -- a direct or virtual base class B that cannot be copied/moved [...]
423 // -- a non-static data member of class type M (or array thereof)
424 // that cannot be copied or moved [...]
425 if (!Subobj->hasSimpleMoveAssignment())
426 data().NeedOverloadResolutionForMoveAssignment = true;
427
428 // C++11 [class.ctor]p5, C++11 [class.copy]p11, C++11 [class.dtor]p5:
429 // A defaulted [ctor or dtor] for a class X is defined as
430 // deleted if X has:
431 // -- any direct or virtual base class [...] has a type with a destructor
432 // that is deleted or inaccessible from the defaulted [ctor or dtor].
433 // -- any non-static data member has a type with a destructor
434 // that is deleted or inaccessible from the defaulted [ctor or dtor].
435 if (!Subobj->hasSimpleDestructor()) {
Richard Smith96cd6712017-08-16 01:49:53 +0000436 data().NeedOverloadResolutionForCopyConstructor = true;
Richard Smith6b02d462012-12-08 08:32:28 +0000437 data().NeedOverloadResolutionForMoveConstructor = true;
438 data().NeedOverloadResolutionForDestructor = true;
439 }
Douglas Gregor9d6290b2008-10-23 18:13:27 +0000440}
441
Douglas Gregord2e6a452010-01-14 17:47:39 +0000442bool CXXRecordDecl::hasAnyDependentBases() const {
443 if (!isDependentContext())
444 return false;
445
Benjamin Kramer6e4f6e12015-07-25 15:07:25 +0000446 return !forallBases([](const CXXRecordDecl *) { return true; });
Douglas Gregord2e6a452010-01-14 17:47:39 +0000447}
448
Chandler Carrutha3e1f9a2011-04-23 10:47:28 +0000449bool CXXRecordDecl::isTriviallyCopyable() const {
450 // C++0x [class]p5:
451 // A trivially copyable class is a class that:
452 // -- has no non-trivial copy constructors,
Richard Smith16488472012-11-16 00:53:38 +0000453 if (hasNonTrivialCopyConstructor()) return false;
Chandler Carrutha3e1f9a2011-04-23 10:47:28 +0000454 // -- has no non-trivial move constructors,
Richard Smith16488472012-11-16 00:53:38 +0000455 if (hasNonTrivialMoveConstructor()) return false;
Chandler Carrutha3e1f9a2011-04-23 10:47:28 +0000456 // -- has no non-trivial copy assignment operators,
Richard Smith16488472012-11-16 00:53:38 +0000457 if (hasNonTrivialCopyAssignment()) return false;
Chandler Carrutha3e1f9a2011-04-23 10:47:28 +0000458 // -- has no non-trivial move assignment operators, and
Richard Smith16488472012-11-16 00:53:38 +0000459 if (hasNonTrivialMoveAssignment()) return false;
Chandler Carrutha3e1f9a2011-04-23 10:47:28 +0000460 // -- has a trivial destructor.
461 if (!hasTrivialDestructor()) return false;
462
463 return true;
464}
465
Douglas Gregor7d9120c2010-09-28 21:55:22 +0000466void CXXRecordDecl::markedVirtualFunctionPure() {
467 // C++ [class.abstract]p2:
468 // A class is abstract if it has at least one pure virtual function.
469 data().Abstract = true;
470}
471
472void CXXRecordDecl::addedMember(Decl *D) {
Joao Matose9a3ed42012-08-31 22:18:20 +0000473 if (!D->isImplicit() &&
474 !isa<FieldDecl>(D) &&
475 !isa<IndirectFieldDecl>(D) &&
476 (!isa<TagDecl>(D) || cast<TagDecl>(D)->getTagKind() == TTK_Class ||
477 cast<TagDecl>(D)->getTagKind() == TTK_Interface))
478 data().HasOnlyCMembers = false;
479
480 // Ignore friends and invalid declarations.
Douglas Gregora1ce1f82010-09-27 22:06:20 +0000481 if (D->getFriendObjectKind() || D->isInvalidDecl())
Douglas Gregord30e79f2010-09-27 21:17:54 +0000482 return;
483
Douglas Gregora1ce1f82010-09-27 22:06:20 +0000484 FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D);
485 if (FunTmpl)
486 D = FunTmpl->getTemplatedDecl();
Richard Smith5179eb72016-06-28 19:03:57 +0000487
488 // FIXME: Pass NamedDecl* to addedMember?
489 Decl *DUnderlying = D;
490 if (auto *ND = dyn_cast<NamedDecl>(DUnderlying)) {
491 DUnderlying = ND->getUnderlyingDecl();
492 if (FunctionTemplateDecl *UnderlyingFunTmpl =
493 dyn_cast<FunctionTemplateDecl>(DUnderlying))
494 DUnderlying = UnderlyingFunTmpl->getTemplatedDecl();
495 }
Douglas Gregora1ce1f82010-09-27 22:06:20 +0000496
Douglas Gregora832d3e2010-09-28 19:45:33 +0000497 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
498 if (Method->isVirtual()) {
499 // C++ [dcl.init.aggr]p1:
500 // An aggregate is an array or a class with [...] no virtual functions.
501 data().Aggregate = false;
502
503 // C++ [class]p4:
504 // A POD-struct is an aggregate class...
505 data().PlainOldData = false;
Douglas Gregor9d5938a2010-09-28 20:38:10 +0000506
David Majnemer5cfda6f2016-05-22 05:34:26 +0000507 // C++14 [meta.unary.prop]p4:
508 // T is a class type [...] with [...] no virtual member functions...
Douglas Gregor9d5938a2010-09-28 20:38:10 +0000509 data().Empty = false;
Douglas Gregor11c024b2010-09-28 20:50:54 +0000510
511 // C++ [class.virtual]p1:
512 // A class that declares or inherits a virtual function is called a
513 // polymorphic class.
514 data().Polymorphic = true;
Chandler Carruthad7d4042011-04-23 23:10:33 +0000515
Richard Smith328aae52012-11-30 05:11:39 +0000516 // C++11 [class.ctor]p5, C++11 [class.copy]p12, C++11 [class.copy]p25:
517 // A [default constructor, copy/move constructor, or copy/move
518 // assignment operator for a class X] is trivial [...] if:
Chandler Carruthad7d4042011-04-23 23:10:33 +0000519 // -- class X has no virtual functions [...]
Richard Smith328aae52012-11-30 05:11:39 +0000520 data().HasTrivialSpecialMembers &= SMF_Destructor;
Chandler Carruthad7d4042011-04-23 23:10:33 +0000521
Chandler Carruthb1963742011-04-30 09:17:45 +0000522 // C++0x [class]p7:
523 // A standard-layout class is a class that: [...]
524 // -- has no virtual functions
Chandler Carruth583edf82011-04-30 10:07:30 +0000525 data().IsStandardLayout = false;
Douglas Gregora832d3e2010-09-28 19:45:33 +0000526 }
527 }
Argyrios Kyrtzidis00f52662010-10-20 23:48:42 +0000528
Richard Smith1c33fe82012-11-28 06:23:12 +0000529 // Notify the listener if an implicit member was added after the definition
530 // was completed.
531 if (!isBeingDefined() && D->isImplicit())
532 if (ASTMutationListener *L = getASTMutationListener())
533 L->AddedCXXImplicitMember(data().Definition, D);
Douglas Gregor9d5938a2010-09-28 20:38:10 +0000534
Richard Smith328aae52012-11-30 05:11:39 +0000535 // The kind of special member this declaration is, if any.
536 unsigned SMKind = 0;
537
Richard Smith1c33fe82012-11-28 06:23:12 +0000538 // Handle constructors.
Douglas Gregora1ce1f82010-09-27 22:06:20 +0000539 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
Richard Smith1c33fe82012-11-28 06:23:12 +0000540 if (!Constructor->isImplicit()) {
541 // Note that we have a user-declared constructor.
542 data().UserDeclaredConstructor = true;
543
544 // C++ [class]p4:
545 // A POD-struct is an aggregate class [...]
546 // Since the POD bit is meant to be C++03 POD-ness, clear it even if the
547 // type is technically an aggregate in C++0x since it wouldn't be in 03.
548 data().PlainOldData = false;
549 }
Douglas Gregora1ce1f82010-09-27 22:06:20 +0000550
Alexis Hunt88c75c32011-05-09 21:45:35 +0000551 if (Constructor->isDefaultConstructor()) {
Richard Smith328aae52012-11-30 05:11:39 +0000552 SMKind |= SMF_DefaultConstructor;
553
Richard Smith5179eb72016-06-28 19:03:57 +0000554 if (Constructor->isUserProvided())
Alexis Huntea6f0322011-05-11 22:34:38 +0000555 data().UserProvidedDefaultConstructor = true;
Richard Smith1c33fe82012-11-28 06:23:12 +0000556 if (Constructor->isConstexpr())
Richard Smithcc36f692011-12-22 02:22:31 +0000557 data().HasConstexprDefaultConstructor = true;
Nico Weber72c57f42016-02-24 20:58:14 +0000558 if (Constructor->isDefaulted())
559 data().HasDefaultedDefaultConstructor = true;
Alexis Hunt88c75c32011-05-09 21:45:35 +0000560 }
Douglas Gregora1ce1f82010-09-27 22:06:20 +0000561
Chandler Carruthad7d4042011-04-23 23:10:33 +0000562 if (!FunTmpl) {
Richard Smith1c33fe82012-11-28 06:23:12 +0000563 unsigned Quals;
564 if (Constructor->isCopyConstructor(Quals)) {
Richard Smith328aae52012-11-30 05:11:39 +0000565 SMKind |= SMF_CopyConstructor;
Richard Smith1c33fe82012-11-28 06:23:12 +0000566
567 if (Quals & Qualifiers::Const)
568 data().HasDeclaredCopyConstructorWithConstParam = true;
Richard Smith328aae52012-11-30 05:11:39 +0000569 } else if (Constructor->isMoveConstructor())
570 SMKind |= SMF_MoveConstructor;
Douglas Gregora1ce1f82010-09-27 22:06:20 +0000571 }
Eric Fiselier283d8d42016-12-03 01:26:47 +0000572
Eric Fiselier283d8d42016-12-03 01:26:47 +0000573 // C++11 [dcl.init.aggr]p1: DR1518
Richard Smith505ef812016-12-21 01:57:02 +0000574 // An aggregate is an array or a class with no user-provided, explicit, or
575 // inherited constructors
576 if (Constructor->isUserProvided() || Constructor->isExplicit())
Eric Fiselier283d8d42016-12-03 01:26:47 +0000577 data().Aggregate = false;
Richard Smith5179eb72016-06-28 19:03:57 +0000578 }
Richard Smith1c33fe82012-11-28 06:23:12 +0000579
Richard Smith5179eb72016-06-28 19:03:57 +0000580 // Handle constructors, including those inherited from base classes.
581 if (CXXConstructorDecl *Constructor =
582 dyn_cast<CXXConstructorDecl>(DUnderlying)) {
Richard Smith1c33fe82012-11-28 06:23:12 +0000583 // Record if we see any constexpr constructors which are neither copy
584 // nor move constructors.
Richard Smith5179eb72016-06-28 19:03:57 +0000585 // C++1z [basic.types]p10:
586 // [...] has at least one constexpr constructor or constructor template
587 // (possibly inherited from a base class) that is not a copy or move
588 // constructor [...]
Richard Smith1c33fe82012-11-28 06:23:12 +0000589 if (Constructor->isConstexpr() && !Constructor->isCopyOrMoveConstructor())
Richard Smith111af8d2011-08-10 18:11:37 +0000590 data().HasConstexprNonCopyMoveConstructor = true;
Douglas Gregord30e79f2010-09-27 21:17:54 +0000591 }
Douglas Gregora1ce1f82010-09-27 22:06:20 +0000592
Richard Smith1c33fe82012-11-28 06:23:12 +0000593 // Handle destructors.
Alexis Hunt97ab5542011-05-16 22:41:40 +0000594 if (CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(D)) {
Richard Smith328aae52012-11-30 05:11:39 +0000595 SMKind |= SMF_Destructor;
Richard Smith561fb152012-02-25 07:33:38 +0000596
Stephan Tolksdorfd85fa232014-03-27 20:23:12 +0000597 if (DD->isUserProvided())
Richard Smith1c33fe82012-11-28 06:23:12 +0000598 data().HasIrrelevantDestructor = false;
Stephan Tolksdorfd85fa232014-03-27 20:23:12 +0000599 // If the destructor is explicitly defaulted and not trivial or not public
600 // or if the destructor is deleted, we clear HasIrrelevantDestructor in
601 // finishedDefaultedOrDeletedMember.
Richard Smith1c33fe82012-11-28 06:23:12 +0000602
Richard Smith1c33fe82012-11-28 06:23:12 +0000603 // C++11 [class.dtor]p5:
Richard Smith328aae52012-11-30 05:11:39 +0000604 // A destructor is trivial if [...] the destructor is not virtual.
605 if (DD->isVirtual())
606 data().HasTrivialSpecialMembers &= ~SMF_Destructor;
Douglas Gregor8f9ebe52010-09-27 22:48:58 +0000607 }
Richard Smith1c33fe82012-11-28 06:23:12 +0000608
609 // Handle member functions.
Douglas Gregora1ce1f82010-09-27 22:06:20 +0000610 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
Alexis Huntfcaeae42011-05-25 20:50:04 +0000611 if (Method->isCopyAssignmentOperator()) {
Richard Smith328aae52012-11-30 05:11:39 +0000612 SMKind |= SMF_CopyAssignment;
Richard Smith1c33fe82012-11-28 06:23:12 +0000613
614 const ReferenceType *ParamTy =
615 Method->getParamDecl(0)->getType()->getAs<ReferenceType>();
616 if (!ParamTy || ParamTy->getPointeeType().isConstQualified())
617 data().HasDeclaredCopyAssignmentWithConstParam = true;
Alexis Huntfcaeae42011-05-25 20:50:04 +0000618 }
Alexis Huntfcaeae42011-05-25 20:50:04 +0000619
Richard Smith328aae52012-11-30 05:11:39 +0000620 if (Method->isMoveAssignmentOperator())
621 SMKind |= SMF_MoveAssignment;
Chandler Carruthad7d4042011-04-23 23:10:33 +0000622
Douglas Gregor457104e2010-09-29 04:25:11 +0000623 // Keep the list of conversion functions up-to-date.
624 if (CXXConversionDecl *Conversion = dyn_cast<CXXConversionDecl>(D)) {
Douglas Gregor92fde2f2013-04-08 17:12:58 +0000625 // FIXME: We use the 'unsafe' accessor for the access specifier here,
626 // because Sema may not have set it yet. That's really just a misdesign
627 // in Sema. However, LLDB *will* have set the access specifier correctly,
628 // and adds declarations after the class is technically completed,
629 // so completeDefinition()'s overriding of the access specifiers doesn't
630 // work.
631 AccessSpecifier AS = Conversion->getAccessUnsafe();
632
Richard Smith328aae52012-11-30 05:11:39 +0000633 if (Conversion->getPrimaryTemplate()) {
634 // We don't record specializations.
Douglas Gregor457104e2010-09-29 04:25:11 +0000635 } else {
Richard Smitha4ba74c2013-08-30 04:46:40 +0000636 ASTContext &Ctx = getASTContext();
637 ASTUnresolvedSet &Conversions = data().Conversions.get(Ctx);
638 NamedDecl *Primary =
639 FunTmpl ? cast<NamedDecl>(FunTmpl) : cast<NamedDecl>(Conversion);
640 if (Primary->getPreviousDecl())
641 Conversions.replace(cast<NamedDecl>(Primary->getPreviousDecl()),
642 Primary, AS);
Douglas Gregor457104e2010-09-29 04:25:11 +0000643 else
Richard Smitha4ba74c2013-08-30 04:46:40 +0000644 Conversions.addDecl(Ctx, Primary, AS);
Douglas Gregor457104e2010-09-29 04:25:11 +0000645 }
646 }
Richard Smith1c33fe82012-11-28 06:23:12 +0000647
Richard Smith328aae52012-11-30 05:11:39 +0000648 if (SMKind) {
Richard Smith92f241f2012-12-08 02:53:02 +0000649 // If this is the first declaration of a special member, we no longer have
650 // an implicit trivial special member.
651 data().HasTrivialSpecialMembers &=
652 data().DeclaredSpecialMembers | ~SMKind;
653
654 if (!Method->isImplicit() && !Method->isUserProvided()) {
655 // This method is user-declared but not user-provided. We can't work out
656 // whether it's trivial yet (not until we get to the end of the class).
657 // We'll handle this method in finishedDefaultedOrDeletedMember.
658 } else if (Method->isTrivial())
659 data().HasTrivialSpecialMembers |= SMKind;
660 else
661 data().DeclaredNonTrivialSpecialMembers |= SMKind;
662
Richard Smith328aae52012-11-30 05:11:39 +0000663 // Note when we have declared a declared special member, and suppress the
664 // implicit declaration of this special member.
665 data().DeclaredSpecialMembers |= SMKind;
666
667 if (!Method->isImplicit()) {
668 data().UserDeclaredSpecialMembers |= SMKind;
669
670 // C++03 [class]p4:
671 // A POD-struct is an aggregate class that has [...] no user-defined
672 // copy assignment operator and no user-defined destructor.
673 //
674 // Since the POD bit is meant to be C++03 POD-ness, and in C++03,
675 // aggregates could not have any constructors, clear it even for an
676 // explicitly defaulted or deleted constructor.
677 // type is technically an aggregate in C++0x since it wouldn't be in 03.
678 //
679 // Also, a user-declared move assignment operator makes a class non-POD.
680 // This is an extension in C++03.
681 data().PlainOldData = false;
682 }
Richard Smith328aae52012-11-30 05:11:39 +0000683 }
684
Douglas Gregora1ce1f82010-09-27 22:06:20 +0000685 return;
Douglas Gregor8a273912009-07-22 18:25:24 +0000686 }
Richard Smith328aae52012-11-30 05:11:39 +0000687
Douglas Gregora832d3e2010-09-28 19:45:33 +0000688 // Handle non-static data members.
689 if (FieldDecl *Field = dyn_cast<FieldDecl>(D)) {
Douglas Gregor556e5862011-10-10 17:22:13 +0000690 // C++ [class.bit]p2:
691 // A declaration for a bit-field that omits the identifier declares an
692 // unnamed bit-field. Unnamed bit-fields are not members and cannot be
693 // initialized.
694 if (Field->isUnnamedBitfield())
695 return;
696
Douglas Gregora832d3e2010-09-28 19:45:33 +0000697 // C++ [dcl.init.aggr]p1:
698 // An aggregate is an array or a class (clause 9) with [...] no
699 // private or protected non-static data members (clause 11).
700 //
701 // A POD must be an aggregate.
702 if (D->getAccess() == AS_private || D->getAccess() == AS_protected) {
703 data().Aggregate = false;
704 data().PlainOldData = false;
705 }
Chandler Carruthb1963742011-04-30 09:17:45 +0000706
707 // C++0x [class]p7:
708 // A standard-layout class is a class that:
709 // [...]
710 // -- has the same access control for all non-static data members,
711 switch (D->getAccess()) {
712 case AS_private: data().HasPrivateFields = true; break;
713 case AS_protected: data().HasProtectedFields = true; break;
714 case AS_public: data().HasPublicFields = true; break;
David Blaikie83d382b2011-09-23 05:06:16 +0000715 case AS_none: llvm_unreachable("Invalid access specifier");
Chandler Carruthb1963742011-04-30 09:17:45 +0000716 };
717 if ((data().HasPrivateFields + data().HasProtectedFields +
718 data().HasPublicFields) > 1)
Chandler Carruth583edf82011-04-30 10:07:30 +0000719 data().IsStandardLayout = false;
Chandler Carruthb1963742011-04-30 09:17:45 +0000720
Douglas Gregor61226d32011-05-13 01:05:07 +0000721 // Keep track of the presence of mutable fields.
Richard Smith96cd6712017-08-16 01:49:53 +0000722 if (Field->isMutable()) {
Douglas Gregor61226d32011-05-13 01:05:07 +0000723 data().HasMutableFields = true;
Richard Smith96cd6712017-08-16 01:49:53 +0000724 data().NeedOverloadResolutionForCopyConstructor = true;
725 }
Richard Smithab44d5b2013-12-10 08:25:00 +0000726
727 // C++11 [class.union]p8, DR1460:
728 // If X is a union, a non-static data member of X that is not an anonymous
729 // union is a variant member of X.
730 if (isUnion() && !Field->isAnonymousStructOrUnion())
731 data().HasVariantMembers = true;
732
Chandler Carruthad7d4042011-04-23 23:10:33 +0000733 // C++0x [class]p9:
Douglas Gregora832d3e2010-09-28 19:45:33 +0000734 // A POD struct is a class that is both a trivial class and a
735 // standard-layout class, and has no non-static data members of type
736 // non-POD struct, non-POD union (or array of such types).
John McCall31168b02011-06-15 23:02:42 +0000737 //
738 // Automatic Reference Counting: the presence of a member of Objective-C pointer type
739 // that does not explicitly have no lifetime makes the class a non-POD.
Douglas Gregora832d3e2010-09-28 19:45:33 +0000740 ASTContext &Context = getASTContext();
741 QualType T = Context.getBaseElementType(Field->getType());
John McCall31168b02011-06-15 23:02:42 +0000742 if (T->isObjCRetainableType() || T.isObjCGCStrong()) {
Brian Kelley036603a2017-03-29 17:31:42 +0000743 if (T.hasNonTrivialObjCLifetime()) {
Ben Langmuir11eab612014-09-26 15:27:29 +0000744 // Objective-C Automatic Reference Counting:
745 // If a class has a non-static data member of Objective-C pointer
746 // type (or array thereof), it is a non-POD type and its
747 // default constructor (if any), copy constructor, move constructor,
748 // copy assignment operator, move assignment operator, and destructor are
749 // non-trivial.
750 setHasObjectMember(true);
751 struct DefinitionData &Data = data();
752 Data.PlainOldData = false;
753 Data.HasTrivialSpecialMembers = 0;
754 Data.HasIrrelevantDestructor = false;
Brian Kelley036603a2017-03-29 17:31:42 +0000755 } else if (!Context.getLangOpts().ObjCAutoRefCount) {
756 setHasObjectMember(true);
Ben Langmuir11eab612014-09-26 15:27:29 +0000757 }
Eli Friedmana5433322013-07-20 01:06:31 +0000758 } else if (!T.isCXX98PODType(Context))
Douglas Gregora832d3e2010-09-28 19:45:33 +0000759 data().PlainOldData = false;
John McCall31168b02011-06-15 23:02:42 +0000760
Chandler Carruthb1963742011-04-30 09:17:45 +0000761 if (T->isReferenceType()) {
Richard Smith593f9932012-12-08 02:01:17 +0000762 if (!Field->hasInClassInitializer())
763 data().HasUninitializedReferenceMember = true;
Chandler Carruthe71d0622011-04-24 02:49:34 +0000764
Chandler Carruthb1963742011-04-30 09:17:45 +0000765 // C++0x [class]p7:
766 // A standard-layout class is a class that:
767 // -- has no non-static data members of type [...] reference,
Chandler Carruth583edf82011-04-30 10:07:30 +0000768 data().IsStandardLayout = false;
Richard Smith96cd6712017-08-16 01:49:53 +0000769
770 // C++1z [class.copy.ctor]p10:
771 // A defaulted copy constructor for a class X is defined as deleted if X has:
772 // -- a non-static data member of rvalue reference type
773 if (T->isRValueReferenceType())
774 data().DefaultedCopyConstructorIsDeleted = true;
Chandler Carruthb1963742011-04-30 09:17:45 +0000775 }
776
Nico Weber6a6376b2016-02-19 01:52:46 +0000777 if (!Field->hasInClassInitializer() && !Field->isMutable()) {
Richard Smith9b182172016-10-28 19:11:18 +0000778 if (CXXRecordDecl *FieldType = T->getAsCXXRecordDecl()) {
Nico Weber344abaa2016-02-19 02:51:07 +0000779 if (FieldType->hasDefinition() && !FieldType->allowConstDefaultInit())
Nico Weber6a6376b2016-02-19 01:52:46 +0000780 data().HasUninitializedFields = true;
781 } else {
782 data().HasUninitializedFields = true;
783 }
784 }
785
Richard Smith3607ffe2012-02-13 03:54:03 +0000786 // Record if this field is the first non-literal or volatile field or base.
Richard Smithd9f663b2013-04-22 15:31:51 +0000787 if (!T->isLiteralType(Context) || T.isVolatileQualified())
Chandler Carruthe71d0622011-04-24 02:49:34 +0000788 data().HasNonLiteralTypeFieldsOrBases = true;
789
Richard Smithab44d5b2013-12-10 08:25:00 +0000790 if (Field->hasInClassInitializer() ||
791 (Field->isAnonymousStructOrUnion() &&
792 Field->getType()->getAsCXXRecordDecl()->hasInClassInitializer())) {
Richard Smithe2648ba2012-05-07 01:07:30 +0000793 data().HasInClassInitializer = true;
794
795 // C++11 [class]p5:
Richard Smith938f40b2011-06-11 17:19:42 +0000796 // A default constructor is trivial if [...] no non-static data member
797 // of its class has a brace-or-equal-initializer.
Richard Smith328aae52012-11-30 05:11:39 +0000798 data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
Richard Smith938f40b2011-06-11 17:19:42 +0000799
Richard Smithe2648ba2012-05-07 01:07:30 +0000800 // C++11 [dcl.init.aggr]p1:
Richard Smith938f40b2011-06-11 17:19:42 +0000801 // An aggregate is a [...] class with [...] no
802 // brace-or-equal-initializers for non-static data members.
Richard Smith852c9db2013-04-20 22:23:05 +0000803 //
Richard Smith872307e2016-03-08 22:17:41 +0000804 // This rule was removed in C++14.
Aaron Ballmandd69ef32014-08-19 15:55:55 +0000805 if (!getASTContext().getLangOpts().CPlusPlus14)
Richard Smith852c9db2013-04-20 22:23:05 +0000806 data().Aggregate = false;
Richard Smith938f40b2011-06-11 17:19:42 +0000807
Richard Smithe2648ba2012-05-07 01:07:30 +0000808 // C++11 [class]p10:
Richard Smith938f40b2011-06-11 17:19:42 +0000809 // A POD struct is [...] a trivial class.
810 data().PlainOldData = false;
811 }
812
Richard Smith6b02d462012-12-08 08:32:28 +0000813 // C++11 [class.copy]p23:
814 // A defaulted copy/move assignment operator for a class X is defined
815 // as deleted if X has:
816 // -- a non-static data member of reference type
817 if (T->isReferenceType())
818 data().DefaultedMoveAssignmentIsDeleted = true;
819
Douglas Gregor11c024b2010-09-28 20:50:54 +0000820 if (const RecordType *RecordTy = T->getAs<RecordType>()) {
821 CXXRecordDecl* FieldRec = cast<CXXRecordDecl>(RecordTy->getDecl());
822 if (FieldRec->getDefinition()) {
Richard Smith6b02d462012-12-08 08:32:28 +0000823 addedClassSubobject(FieldRec);
824
Richard Smithc91d12c2013-11-25 07:07:05 +0000825 // We may need to perform overload resolution to determine whether a
826 // field can be moved if it's const or volatile qualified.
827 if (T.getCVRQualifiers() & (Qualifiers::Const | Qualifiers::Volatile)) {
Richard Smith96cd6712017-08-16 01:49:53 +0000828 // We need to care about 'const' for the copy constructor because an
829 // implicit copy constructor might be declared with a non-const
830 // parameter.
831 data().NeedOverloadResolutionForCopyConstructor = true;
Richard Smithc91d12c2013-11-25 07:07:05 +0000832 data().NeedOverloadResolutionForMoveConstructor = true;
833 data().NeedOverloadResolutionForMoveAssignment = true;
834 }
835
Richard Smith6b02d462012-12-08 08:32:28 +0000836 // C++11 [class.ctor]p5, C++11 [class.copy]p11:
837 // A defaulted [special member] for a class X is defined as
838 // deleted if:
839 // -- X is a union-like class that has a variant member with a
840 // non-trivial [corresponding special member]
841 if (isUnion()) {
Richard Smith96cd6712017-08-16 01:49:53 +0000842 if (FieldRec->hasNonTrivialCopyConstructor())
843 data().DefaultedCopyConstructorIsDeleted = true;
Richard Smith6b02d462012-12-08 08:32:28 +0000844 if (FieldRec->hasNonTrivialMoveConstructor())
845 data().DefaultedMoveConstructorIsDeleted = true;
846 if (FieldRec->hasNonTrivialMoveAssignment())
847 data().DefaultedMoveAssignmentIsDeleted = true;
848 if (FieldRec->hasNonTrivialDestructor())
849 data().DefaultedDestructorIsDeleted = true;
850 }
851
Richard Smithdd5619f2016-08-16 00:13:47 +0000852 // For an anonymous union member, our overload resolution will perform
853 // overload resolution for its members.
854 if (Field->isAnonymousStructOrUnion()) {
Richard Smith96cd6712017-08-16 01:49:53 +0000855 data().NeedOverloadResolutionForCopyConstructor |=
856 FieldRec->data().NeedOverloadResolutionForCopyConstructor;
Richard Smithdd5619f2016-08-16 00:13:47 +0000857 data().NeedOverloadResolutionForMoveConstructor |=
858 FieldRec->data().NeedOverloadResolutionForMoveConstructor;
859 data().NeedOverloadResolutionForMoveAssignment |=
860 FieldRec->data().NeedOverloadResolutionForMoveAssignment;
861 data().NeedOverloadResolutionForDestructor |=
862 FieldRec->data().NeedOverloadResolutionForDestructor;
863 }
864
Alexis Huntf479f1b2011-05-09 18:22:59 +0000865 // C++0x [class.ctor]p5:
Richard Smithcc36f692011-12-22 02:22:31 +0000866 // A default constructor is trivial [...] if:
Alexis Huntf479f1b2011-05-09 18:22:59 +0000867 // -- for all the non-static data members of its class that are of
868 // class type (or array thereof), each such class has a trivial
869 // default constructor.
870 if (!FieldRec->hasTrivialDefaultConstructor())
Richard Smith328aae52012-11-30 05:11:39 +0000871 data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
Chandler Carruthad7d4042011-04-23 23:10:33 +0000872
873 // C++0x [class.copy]p13:
874 // A copy/move constructor for class X is trivial if [...]
875 // [...]
876 // -- for each non-static data member of X that is of class type (or
877 // an array thereof), the constructor selected to copy/move that
878 // member is trivial;
Douglas Gregor11c024b2010-09-28 20:50:54 +0000879 if (!FieldRec->hasTrivialCopyConstructor())
Richard Smith328aae52012-11-30 05:11:39 +0000880 data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor;
Richard Smith6b02d462012-12-08 08:32:28 +0000881 // If the field doesn't have a simple move constructor, we'll eagerly
882 // declare the move constructor for this class and we'll decide whether
883 // it's trivial then.
Richard Smith16488472012-11-16 00:53:38 +0000884 if (!FieldRec->hasTrivialMoveConstructor())
Richard Smith328aae52012-11-30 05:11:39 +0000885 data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor;
Chandler Carruthad7d4042011-04-23 23:10:33 +0000886
887 // C++0x [class.copy]p27:
888 // A copy/move assignment operator for class X is trivial if [...]
889 // [...]
890 // -- for each non-static data member of X that is of class type (or
891 // an array thereof), the assignment operator selected to
892 // copy/move that member is trivial;
Douglas Gregor11c024b2010-09-28 20:50:54 +0000893 if (!FieldRec->hasTrivialCopyAssignment())
Richard Smith328aae52012-11-30 05:11:39 +0000894 data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment;
Richard Smith6b02d462012-12-08 08:32:28 +0000895 // If the field doesn't have a simple move assignment, we'll eagerly
896 // declare the move assignment for this class and we'll decide whether
897 // it's trivial then.
Richard Smith16488472012-11-16 00:53:38 +0000898 if (!FieldRec->hasTrivialMoveAssignment())
Richard Smith328aae52012-11-30 05:11:39 +0000899 data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment;
Chandler Carruthad7d4042011-04-23 23:10:33 +0000900
Douglas Gregor11c024b2010-09-28 20:50:54 +0000901 if (!FieldRec->hasTrivialDestructor())
Richard Smith328aae52012-11-30 05:11:39 +0000902 data().HasTrivialSpecialMembers &= ~SMF_Destructor;
Richard Smith561fb152012-02-25 07:33:38 +0000903 if (!FieldRec->hasIrrelevantDestructor())
904 data().HasIrrelevantDestructor = false;
John McCall31168b02011-06-15 23:02:42 +0000905 if (FieldRec->hasObjectMember())
906 setHasObjectMember(true);
Fariborz Jahanian78652202013-01-25 23:57:05 +0000907 if (FieldRec->hasVolatileMember())
908 setHasVolatileMember(true);
Chandler Carruthb1963742011-04-30 09:17:45 +0000909
910 // C++0x [class]p7:
911 // A standard-layout class is a class that:
912 // -- has no non-static data members of type non-standard-layout
913 // class (or array of such types) [...]
Chandler Carruth583edf82011-04-30 10:07:30 +0000914 if (!FieldRec->isStandardLayout())
915 data().IsStandardLayout = false;
Chandler Carruthb1963742011-04-30 09:17:45 +0000916
917 // C++0x [class]p7:
918 // A standard-layout class is a class that:
919 // [...]
920 // -- has no base classes of the same type as the first non-static
921 // data member.
922 // We don't want to expend bits in the state of the record decl
923 // tracking whether this is the first non-static data member so we
924 // cheat a bit and use some of the existing state: the empty bit.
925 // Virtual bases and virtual methods make a class non-empty, but they
926 // also make it non-standard-layout so we needn't check here.
927 // A non-empty base class may leave the class standard-layout, but not
Richard Smithab44d5b2013-12-10 08:25:00 +0000928 // if we have arrived here, and have at least one non-static data
Chandler Carruth583edf82011-04-30 10:07:30 +0000929 // member. If IsStandardLayout remains true, then the first non-static
Chandler Carruthb1963742011-04-30 09:17:45 +0000930 // data member must come through here with Empty still true, and Empty
931 // will subsequently be set to false below.
Chandler Carruth583edf82011-04-30 10:07:30 +0000932 if (data().IsStandardLayout && data().Empty) {
Aaron Ballman574705e2014-03-13 15:41:46 +0000933 for (const auto &BI : bases()) {
934 if (Context.hasSameUnqualifiedType(BI.getType(), T)) {
Chandler Carruth583edf82011-04-30 10:07:30 +0000935 data().IsStandardLayout = false;
Chandler Carruthb1963742011-04-30 09:17:45 +0000936 break;
937 }
938 }
939 }
Douglas Gregor61226d32011-05-13 01:05:07 +0000940
941 // Keep track of the presence of mutable fields.
Richard Smith96cd6712017-08-16 01:49:53 +0000942 if (FieldRec->hasMutableFields()) {
Douglas Gregor61226d32011-05-13 01:05:07 +0000943 data().HasMutableFields = true;
Richard Smith96cd6712017-08-16 01:49:53 +0000944 data().NeedOverloadResolutionForCopyConstructor = true;
945 }
Richard Smithcc36f692011-12-22 02:22:31 +0000946
947 // C++11 [class.copy]p13:
948 // If the implicitly-defined constructor would satisfy the
949 // requirements of a constexpr constructor, the implicitly-defined
950 // constructor is constexpr.
951 // C++11 [dcl.constexpr]p4:
952 // -- every constructor involved in initializing non-static data
953 // members [...] shall be a constexpr constructor
954 if (!Field->hasInClassInitializer() &&
Richard Smithe2648ba2012-05-07 01:07:30 +0000955 !FieldRec->hasConstexprDefaultConstructor() && !isUnion())
Richard Smithcc36f692011-12-22 02:22:31 +0000956 // The standard requires any in-class initializer to be a constant
957 // expression. We consider this to be a defect.
958 data().DefaultedDefaultConstructorIsConstexpr = false;
Richard Smith1c33fe82012-11-28 06:23:12 +0000959
960 // C++11 [class.copy]p8:
961 // The implicitly-declared copy constructor for a class X will have
Richard Smithdf054d32017-02-25 23:53:05 +0000962 // the form 'X::X(const X&)' if each potentially constructed subobject
963 // of a class type M (or array thereof) has a copy constructor whose
964 // first parameter is of type 'const M&' or 'const volatile M&'.
Richard Smith1c33fe82012-11-28 06:23:12 +0000965 if (!FieldRec->hasCopyConstructorWithConstParam())
Richard Smithdf054d32017-02-25 23:53:05 +0000966 data().ImplicitCopyConstructorCanHaveConstParamForNonVBase = false;
Richard Smith1c33fe82012-11-28 06:23:12 +0000967
968 // C++11 [class.copy]p18:
969 // The implicitly-declared copy assignment oeprator for a class X will
970 // have the form 'X& X::operator=(const X&)' if [...] for all the
971 // non-static data members of X that are of a class type M (or array
972 // thereof), each such class type has a copy assignment operator whose
973 // parameter is of type 'const M&', 'const volatile M&' or 'M'.
974 if (!FieldRec->hasCopyAssignmentWithConstParam())
975 data().ImplicitCopyAssignmentHasConstParam = false;
Richard Smith593f9932012-12-08 02:01:17 +0000976
977 if (FieldRec->hasUninitializedReferenceMember() &&
978 !Field->hasInClassInitializer())
979 data().HasUninitializedReferenceMember = true;
Richard Smithab44d5b2013-12-10 08:25:00 +0000980
981 // C++11 [class.union]p8, DR1460:
982 // a non-static data member of an anonymous union that is a member of
983 // X is also a variant member of X.
984 if (FieldRec->hasVariantMembers() &&
985 Field->isAnonymousStructOrUnion())
986 data().HasVariantMembers = true;
Douglas Gregor11c024b2010-09-28 20:50:54 +0000987 }
Richard Smithcc36f692011-12-22 02:22:31 +0000988 } else {
989 // Base element type of field is a non-class type.
Richard Smithd9f663b2013-04-22 15:31:51 +0000990 if (!T->isLiteralType(Context) ||
Richard Smith4086a132012-06-10 07:07:24 +0000991 (!Field->hasInClassInitializer() && !isUnion()))
Richard Smithcc36f692011-12-22 02:22:31 +0000992 data().DefaultedDefaultConstructorIsConstexpr = false;
Richard Smith6b02d462012-12-08 08:32:28 +0000993
994 // C++11 [class.copy]p23:
995 // A defaulted copy/move assignment operator for a class X is defined
996 // as deleted if X has:
997 // -- a non-static data member of const non-class type (or array
998 // thereof)
999 if (T.isConstQualified())
1000 data().DefaultedMoveAssignmentIsDeleted = true;
Douglas Gregor11c024b2010-09-28 20:50:54 +00001001 }
Chandler Carruthb1963742011-04-30 09:17:45 +00001002
1003 // C++0x [class]p7:
1004 // A standard-layout class is a class that:
1005 // [...]
1006 // -- either has no non-static data members in the most derived
1007 // class and at most one base class with non-static data members,
1008 // or has no base classes with non-static data members, and
1009 // At this point we know that we have a non-static data member, so the last
1010 // clause holds.
1011 if (!data().HasNoNonEmptyBases)
Chandler Carruth583edf82011-04-30 10:07:30 +00001012 data().IsStandardLayout = false;
Chandler Carruthb1963742011-04-30 09:17:45 +00001013
David Majnemer5cfda6f2016-05-22 05:34:26 +00001014 // C++14 [meta.unary.prop]p4:
1015 // T is a class type [...] with [...] no non-static data members other
1016 // than bit-fields of length 0...
Douglas Gregor9d5938a2010-09-28 20:38:10 +00001017 if (data().Empty) {
Richard Smithcaf33902011-10-10 18:28:20 +00001018 if (!Field->isBitField() ||
1019 (!Field->getBitWidth()->isTypeDependent() &&
1020 !Field->getBitWidth()->isValueDependent() &&
1021 Field->getBitWidthValue(Context) != 0))
Douglas Gregor9d5938a2010-09-28 20:38:10 +00001022 data().Empty = false;
Douglas Gregor9d5938a2010-09-28 20:38:10 +00001023 }
Douglas Gregora832d3e2010-09-28 19:45:33 +00001024 }
Douglas Gregor457104e2010-09-29 04:25:11 +00001025
1026 // Handle using declarations of conversion functions.
Richard Smitha4ba74c2013-08-30 04:46:40 +00001027 if (UsingShadowDecl *Shadow = dyn_cast<UsingShadowDecl>(D)) {
Douglas Gregor457104e2010-09-29 04:25:11 +00001028 if (Shadow->getDeclName().getNameKind()
Richard Smitha4ba74c2013-08-30 04:46:40 +00001029 == DeclarationName::CXXConversionFunctionName) {
1030 ASTContext &Ctx = getASTContext();
1031 data().Conversions.get(Ctx).addDecl(Ctx, Shadow, Shadow->getAccess());
1032 }
1033 }
Richard Smith12e79312016-05-13 06:47:56 +00001034
1035 if (UsingDecl *Using = dyn_cast<UsingDecl>(D)) {
1036 if (Using->getDeclName().getNameKind() ==
Eric Fiselier283d8d42016-12-03 01:26:47 +00001037 DeclarationName::CXXConstructorName) {
Richard Smith12e79312016-05-13 06:47:56 +00001038 data().HasInheritedConstructor = true;
Eric Fiselier283d8d42016-12-03 01:26:47 +00001039 // C++1z [dcl.init.aggr]p1:
1040 // An aggregate is [...] a class [...] with no inherited constructors
1041 data().Aggregate = false;
1042 }
Richard Smith12e79312016-05-13 06:47:56 +00001043
1044 if (Using->getDeclName().getCXXOverloadedOperator() == OO_Equal)
1045 data().HasInheritedAssignment = true;
1046 }
Joao Matose9a3ed42012-08-31 22:18:20 +00001047}
1048
Richard Smith92f241f2012-12-08 02:53:02 +00001049void CXXRecordDecl::finishedDefaultedOrDeletedMember(CXXMethodDecl *D) {
1050 assert(!D->isImplicit() && !D->isUserProvided());
1051
1052 // The kind of special member this declaration is, if any.
1053 unsigned SMKind = 0;
1054
1055 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
1056 if (Constructor->isDefaultConstructor()) {
1057 SMKind |= SMF_DefaultConstructor;
1058 if (Constructor->isConstexpr())
1059 data().HasConstexprDefaultConstructor = true;
1060 }
1061 if (Constructor->isCopyConstructor())
1062 SMKind |= SMF_CopyConstructor;
1063 else if (Constructor->isMoveConstructor())
1064 SMKind |= SMF_MoveConstructor;
1065 else if (Constructor->isConstexpr())
1066 // We may now know that the constructor is constexpr.
1067 data().HasConstexprNonCopyMoveConstructor = true;
Stephan Tolksdorfd85fa232014-03-27 20:23:12 +00001068 } else if (isa<CXXDestructorDecl>(D)) {
Richard Smith92f241f2012-12-08 02:53:02 +00001069 SMKind |= SMF_Destructor;
Stephan Tolksdorfd85fa232014-03-27 20:23:12 +00001070 if (!D->isTrivial() || D->getAccess() != AS_public || D->isDeleted())
1071 data().HasIrrelevantDestructor = false;
1072 } else if (D->isCopyAssignmentOperator())
Richard Smith92f241f2012-12-08 02:53:02 +00001073 SMKind |= SMF_CopyAssignment;
1074 else if (D->isMoveAssignmentOperator())
1075 SMKind |= SMF_MoveAssignment;
1076
1077 // Update which trivial / non-trivial special members we have.
1078 // addedMember will have skipped this step for this member.
1079 if (D->isTrivial())
1080 data().HasTrivialSpecialMembers |= SMKind;
1081 else
1082 data().DeclaredNonTrivialSpecialMembers |= SMKind;
1083}
1084
Joao Matose9a3ed42012-08-31 22:18:20 +00001085bool CXXRecordDecl::isCLike() const {
1086 if (getTagKind() == TTK_Class || getTagKind() == TTK_Interface ||
1087 !TemplateOrInstantiation.isNull())
1088 return false;
1089 if (!hasDefinition())
1090 return true;
Argyrios Kyrtzidis5c4e0652012-01-23 16:58:45 +00001091
Argyrios Kyrtzidisc3c9ee52012-02-01 06:36:44 +00001092 return isPOD() && data().HasOnlyCMembers;
Argyrios Kyrtzidis5c4e0652012-01-23 16:58:45 +00001093}
Faisal Valic1a6dc42013-10-23 16:10:50 +00001094
Faisal Vali2b391ab2013-09-26 19:54:12 +00001095bool CXXRecordDecl::isGenericLambda() const {
Faisal Valic1a6dc42013-10-23 16:10:50 +00001096 if (!isLambda()) return false;
1097 return getLambdaData().IsGenericLambda;
Faisal Vali2b391ab2013-09-26 19:54:12 +00001098}
1099
1100CXXMethodDecl* CXXRecordDecl::getLambdaCallOperator() const {
Craig Topper36250ad2014-05-12 05:36:57 +00001101 if (!isLambda()) return nullptr;
Faisal Vali850da1a2013-09-29 17:08:32 +00001102 DeclarationName Name =
1103 getASTContext().DeclarationNames.getCXXOperatorName(OO_Call);
Richard Smithcf4bdde2015-02-21 02:45:19 +00001104 DeclContext::lookup_result Calls = lookup(Name);
Faisal Vali850da1a2013-09-29 17:08:32 +00001105
1106 assert(!Calls.empty() && "Missing lambda call operator!");
1107 assert(Calls.size() == 1 && "More than one lambda call operator!");
1108
1109 NamedDecl *CallOp = Calls.front();
1110 if (FunctionTemplateDecl *CallOpTmpl =
1111 dyn_cast<FunctionTemplateDecl>(CallOp))
1112 return cast<CXXMethodDecl>(CallOpTmpl->getTemplatedDecl());
Faisal Vali2b391ab2013-09-26 19:54:12 +00001113
1114 return cast<CXXMethodDecl>(CallOp);
1115}
1116
1117CXXMethodDecl* CXXRecordDecl::getLambdaStaticInvoker() const {
Craig Topper36250ad2014-05-12 05:36:57 +00001118 if (!isLambda()) return nullptr;
Faisal Vali850da1a2013-09-29 17:08:32 +00001119 DeclarationName Name =
1120 &getASTContext().Idents.get(getLambdaStaticInvokerName());
Richard Smithcf4bdde2015-02-21 02:45:19 +00001121 DeclContext::lookup_result Invoker = lookup(Name);
Craig Topper36250ad2014-05-12 05:36:57 +00001122 if (Invoker.empty()) return nullptr;
Faisal Vali850da1a2013-09-29 17:08:32 +00001123 assert(Invoker.size() == 1 && "More than one static invoker operator!");
1124 NamedDecl *InvokerFun = Invoker.front();
1125 if (FunctionTemplateDecl *InvokerTemplate =
1126 dyn_cast<FunctionTemplateDecl>(InvokerFun))
1127 return cast<CXXMethodDecl>(InvokerTemplate->getTemplatedDecl());
1128
Faisal Vali571df122013-09-29 08:45:24 +00001129 return cast<CXXMethodDecl>(InvokerFun);
Faisal Vali2b391ab2013-09-26 19:54:12 +00001130}
1131
Douglas Gregor9c702202012-02-10 07:45:31 +00001132void CXXRecordDecl::getCaptureFields(
1133 llvm::DenseMap<const VarDecl *, FieldDecl *> &Captures,
Eli Friedman7e7da2d2012-02-11 00:18:00 +00001134 FieldDecl *&ThisCapture) const {
Douglas Gregor9c702202012-02-10 07:45:31 +00001135 Captures.clear();
Craig Topper36250ad2014-05-12 05:36:57 +00001136 ThisCapture = nullptr;
Douglas Gregor9c702202012-02-10 07:45:31 +00001137
Douglas Gregorc8a73492012-02-13 15:44:47 +00001138 LambdaDefinitionData &Lambda = getLambdaData();
Douglas Gregor9c702202012-02-10 07:45:31 +00001139 RecordDecl::field_iterator Field = field_begin();
Benjamin Kramerf3ca26982014-05-10 16:31:55 +00001140 for (const LambdaCapture *C = Lambda.Captures, *CEnd = C + Lambda.NumCaptures;
Douglas Gregor9c702202012-02-10 07:45:31 +00001141 C != CEnd; ++C, ++Field) {
Richard Smithba71c082013-05-16 06:20:58 +00001142 if (C->capturesThis())
David Blaikie40ed2972012-06-06 20:45:41 +00001143 ThisCapture = *Field;
Richard Smithba71c082013-05-16 06:20:58 +00001144 else if (C->capturesVariable())
1145 Captures[C->getCapturedVar()] = *Field;
Douglas Gregor9c702202012-02-10 07:45:31 +00001146 }
Richard Smithbb13c9a2013-09-28 04:02:39 +00001147 assert(Field == field_end());
Douglas Gregor9c702202012-02-10 07:45:31 +00001148}
1149
Faisal Vali2b391ab2013-09-26 19:54:12 +00001150TemplateParameterList *
1151CXXRecordDecl::getGenericLambdaTemplateParameterList() const {
Craig Topper36250ad2014-05-12 05:36:57 +00001152 if (!isLambda()) return nullptr;
Faisal Vali2b391ab2013-09-26 19:54:12 +00001153 CXXMethodDecl *CallOp = getLambdaCallOperator();
1154 if (FunctionTemplateDecl *Tmpl = CallOp->getDescribedFunctionTemplate())
1155 return Tmpl->getTemplateParameters();
Craig Topper36250ad2014-05-12 05:36:57 +00001156 return nullptr;
Faisal Vali2b391ab2013-09-26 19:54:12 +00001157}
Douglas Gregor9c702202012-02-10 07:45:31 +00001158
Richard Smith0bae6242016-08-25 00:34:00 +00001159Decl *CXXRecordDecl::getLambdaContextDecl() const {
1160 assert(isLambda() && "Not a lambda closure type!");
1161 ExternalASTSource *Source = getParentASTContext().getExternalSource();
1162 return getLambdaData().ContextDecl.get(Source);
1163}
1164
John McCall1e3a1a72010-03-15 09:07:48 +00001165static CanQualType GetConversionType(ASTContext &Context, NamedDecl *Conv) {
Alp Tokera2794f92014-01-22 07:29:52 +00001166 QualType T =
1167 cast<CXXConversionDecl>(Conv->getUnderlyingDecl()->getAsFunction())
1168 ->getConversionType();
John McCall1e3a1a72010-03-15 09:07:48 +00001169 return Context.getCanonicalType(T);
Fariborz Jahanian3ee21f12009-10-07 20:43:36 +00001170}
1171
John McCall1e3a1a72010-03-15 09:07:48 +00001172/// Collect the visible conversions of a base class.
1173///
James Dennettb5d5f812012-06-15 22:28:09 +00001174/// \param Record a base class of the class we're considering
John McCall1e3a1a72010-03-15 09:07:48 +00001175/// \param InVirtual whether this base class is a virtual base (or a base
1176/// of a virtual base)
1177/// \param Access the access along the inheritance path to this base
1178/// \param ParentHiddenTypes the conversions provided by the inheritors
1179/// of this base
1180/// \param Output the set to which to add conversions from non-virtual bases
1181/// \param VOutput the set to which to add conversions from virtual bases
1182/// \param HiddenVBaseCs the set of conversions which were hidden in a
1183/// virtual base along some inheritance path
1184static void CollectVisibleConversions(ASTContext &Context,
1185 CXXRecordDecl *Record,
1186 bool InVirtual,
1187 AccessSpecifier Access,
1188 const llvm::SmallPtrSet<CanQualType, 8> &ParentHiddenTypes,
Argyrios Kyrtzidis0f05fb92012-11-28 03:56:16 +00001189 ASTUnresolvedSet &Output,
John McCall1e3a1a72010-03-15 09:07:48 +00001190 UnresolvedSetImpl &VOutput,
1191 llvm::SmallPtrSet<NamedDecl*, 8> &HiddenVBaseCs) {
1192 // The set of types which have conversions in this class or its
1193 // subclasses. As an optimization, we don't copy the derived set
1194 // unless it might change.
1195 const llvm::SmallPtrSet<CanQualType, 8> *HiddenTypes = &ParentHiddenTypes;
1196 llvm::SmallPtrSet<CanQualType, 8> HiddenTypesBuffer;
1197
1198 // Collect the direct conversions and figure out which conversions
1199 // will be hidden in the subclasses.
Argyrios Kyrtzidisa6567c42012-11-28 03:56:09 +00001200 CXXRecordDecl::conversion_iterator ConvI = Record->conversion_begin();
1201 CXXRecordDecl::conversion_iterator ConvE = Record->conversion_end();
1202 if (ConvI != ConvE) {
John McCall1e3a1a72010-03-15 09:07:48 +00001203 HiddenTypesBuffer = ParentHiddenTypes;
1204 HiddenTypes = &HiddenTypesBuffer;
1205
Argyrios Kyrtzidisa6567c42012-11-28 03:56:09 +00001206 for (CXXRecordDecl::conversion_iterator I = ConvI; I != ConvE; ++I) {
Richard Smith99fdf8d2012-05-06 00:04:32 +00001207 CanQualType ConvType(GetConversionType(Context, I.getDecl()));
1208 bool Hidden = ParentHiddenTypes.count(ConvType);
1209 if (!Hidden)
1210 HiddenTypesBuffer.insert(ConvType);
John McCall1e3a1a72010-03-15 09:07:48 +00001211
1212 // If this conversion is hidden and we're in a virtual base,
1213 // remember that it's hidden along some inheritance path.
1214 if (Hidden && InVirtual)
1215 HiddenVBaseCs.insert(cast<NamedDecl>(I.getDecl()->getCanonicalDecl()));
1216
1217 // If this conversion isn't hidden, add it to the appropriate output.
1218 else if (!Hidden) {
1219 AccessSpecifier IAccess
1220 = CXXRecordDecl::MergeAccess(Access, I.getAccess());
1221
1222 if (InVirtual)
1223 VOutput.addDecl(I.getDecl(), IAccess);
Fariborz Jahanianb394f502009-09-12 18:26:03 +00001224 else
Argyrios Kyrtzidis0f05fb92012-11-28 03:56:16 +00001225 Output.addDecl(Context, I.getDecl(), IAccess);
Fariborz Jahanianb54ccb22009-09-11 21:44:33 +00001226 }
1227 }
1228 }
Sebastian Redl1054fae2009-10-25 17:03:50 +00001229
John McCall1e3a1a72010-03-15 09:07:48 +00001230 // Collect information recursively from any base classes.
Aaron Ballman574705e2014-03-13 15:41:46 +00001231 for (const auto &I : Record->bases()) {
1232 const RecordType *RT = I.getType()->getAs<RecordType>();
John McCall1e3a1a72010-03-15 09:07:48 +00001233 if (!RT) continue;
Sebastian Redl1054fae2009-10-25 17:03:50 +00001234
John McCall1e3a1a72010-03-15 09:07:48 +00001235 AccessSpecifier BaseAccess
Aaron Ballman574705e2014-03-13 15:41:46 +00001236 = CXXRecordDecl::MergeAccess(Access, I.getAccessSpecifier());
1237 bool BaseInVirtual = InVirtual || I.isVirtual();
Sebastian Redl1054fae2009-10-25 17:03:50 +00001238
John McCall1e3a1a72010-03-15 09:07:48 +00001239 CXXRecordDecl *Base = cast<CXXRecordDecl>(RT->getDecl());
1240 CollectVisibleConversions(Context, Base, BaseInVirtual, BaseAccess,
1241 *HiddenTypes, Output, VOutput, HiddenVBaseCs);
Fariborz Jahanianb54ccb22009-09-11 21:44:33 +00001242 }
John McCall1e3a1a72010-03-15 09:07:48 +00001243}
Sebastian Redl1054fae2009-10-25 17:03:50 +00001244
John McCall1e3a1a72010-03-15 09:07:48 +00001245/// Collect the visible conversions of a class.
1246///
1247/// This would be extremely straightforward if it weren't for virtual
1248/// bases. It might be worth special-casing that, really.
1249static void CollectVisibleConversions(ASTContext &Context,
1250 CXXRecordDecl *Record,
Argyrios Kyrtzidis0f05fb92012-11-28 03:56:16 +00001251 ASTUnresolvedSet &Output) {
John McCall1e3a1a72010-03-15 09:07:48 +00001252 // The collection of all conversions in virtual bases that we've
1253 // found. These will be added to the output as long as they don't
1254 // appear in the hidden-conversions set.
1255 UnresolvedSet<8> VBaseCs;
1256
1257 // The set of conversions in virtual bases that we've determined to
1258 // be hidden.
1259 llvm::SmallPtrSet<NamedDecl*, 8> HiddenVBaseCs;
1260
1261 // The set of types hidden by classes derived from this one.
1262 llvm::SmallPtrSet<CanQualType, 8> HiddenTypes;
1263
1264 // Go ahead and collect the direct conversions and add them to the
1265 // hidden-types set.
Argyrios Kyrtzidisa6567c42012-11-28 03:56:09 +00001266 CXXRecordDecl::conversion_iterator ConvI = Record->conversion_begin();
1267 CXXRecordDecl::conversion_iterator ConvE = Record->conversion_end();
Argyrios Kyrtzidis0f05fb92012-11-28 03:56:16 +00001268 Output.append(Context, ConvI, ConvE);
Argyrios Kyrtzidisa6567c42012-11-28 03:56:09 +00001269 for (; ConvI != ConvE; ++ConvI)
1270 HiddenTypes.insert(GetConversionType(Context, ConvI.getDecl()));
John McCall1e3a1a72010-03-15 09:07:48 +00001271
1272 // Recursively collect conversions from base classes.
Aaron Ballman574705e2014-03-13 15:41:46 +00001273 for (const auto &I : Record->bases()) {
1274 const RecordType *RT = I.getType()->getAs<RecordType>();
John McCall1e3a1a72010-03-15 09:07:48 +00001275 if (!RT) continue;
1276
1277 CollectVisibleConversions(Context, cast<CXXRecordDecl>(RT->getDecl()),
Aaron Ballman574705e2014-03-13 15:41:46 +00001278 I.isVirtual(), I.getAccessSpecifier(),
John McCall1e3a1a72010-03-15 09:07:48 +00001279 HiddenTypes, Output, VBaseCs, HiddenVBaseCs);
1280 }
1281
1282 // Add any unhidden conversions provided by virtual bases.
1283 for (UnresolvedSetIterator I = VBaseCs.begin(), E = VBaseCs.end();
1284 I != E; ++I) {
1285 if (!HiddenVBaseCs.count(cast<NamedDecl>(I.getDecl()->getCanonicalDecl())))
Argyrios Kyrtzidis0f05fb92012-11-28 03:56:16 +00001286 Output.addDecl(Context, I.getDecl(), I.getAccess());
Fariborz Jahanianb54ccb22009-09-11 21:44:33 +00001287 }
Fariborz Jahanianb394f502009-09-12 18:26:03 +00001288}
1289
1290/// getVisibleConversionFunctions - get all conversion functions visible
1291/// in current class; including conversion function templates.
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00001292llvm::iterator_range<CXXRecordDecl::conversion_iterator>
Argyrios Kyrtzidisa6567c42012-11-28 03:56:09 +00001293CXXRecordDecl::getVisibleConversionFunctions() {
Richard Smitha4ba74c2013-08-30 04:46:40 +00001294 ASTContext &Ctx = getASTContext();
1295
1296 ASTUnresolvedSet *Set;
1297 if (bases_begin() == bases_end()) {
1298 // If root class, all conversions are visible.
1299 Set = &data().Conversions.get(Ctx);
1300 } else {
1301 Set = &data().VisibleConversions.get(Ctx);
1302 // If visible conversion list is not evaluated, evaluate it.
1303 if (!data().ComputedVisibleConversions) {
1304 CollectVisibleConversions(Ctx, this, *Set);
1305 data().ComputedVisibleConversions = true;
1306 }
Argyrios Kyrtzidisa6567c42012-11-28 03:56:09 +00001307 }
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00001308 return llvm::make_range(Set->begin(), Set->end());
Fariborz Jahanianb54ccb22009-09-11 21:44:33 +00001309}
1310
John McCallda4458e2010-03-31 01:36:47 +00001311void CXXRecordDecl::removeConversion(const NamedDecl *ConvDecl) {
1312 // This operation is O(N) but extremely rare. Sema only uses it to
1313 // remove UsingShadowDecls in a class that were followed by a direct
1314 // declaration, e.g.:
1315 // class A : B {
1316 // using B::operator int;
1317 // operator int();
1318 // };
1319 // This is uncommon by itself and even more uncommon in conjunction
1320 // with sufficiently large numbers of directly-declared conversions
1321 // that asymptotic behavior matters.
1322
Richard Smitha4ba74c2013-08-30 04:46:40 +00001323 ASTUnresolvedSet &Convs = data().Conversions.get(getASTContext());
John McCallda4458e2010-03-31 01:36:47 +00001324 for (unsigned I = 0, E = Convs.size(); I != E; ++I) {
1325 if (Convs[I].getDecl() == ConvDecl) {
1326 Convs.erase(I);
1327 assert(std::find(Convs.begin(), Convs.end(), ConvDecl) == Convs.end()
1328 && "conversion was found multiple times in unresolved set");
1329 return;
1330 }
1331 }
1332
1333 llvm_unreachable("conversion not found in set!");
Douglas Gregor05155d82009-08-21 23:19:43 +00001334}
Fariborz Jahanian423a81f2009-06-19 19:55:27 +00001335
Douglas Gregorbbe8f462009-10-08 15:14:33 +00001336CXXRecordDecl *CXXRecordDecl::getInstantiatedFromMemberClass() const {
Douglas Gregor06db9f52009-10-12 20:18:28 +00001337 if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo())
Douglas Gregorbbe8f462009-10-08 15:14:33 +00001338 return cast<CXXRecordDecl>(MSInfo->getInstantiatedFrom());
Craig Topper36250ad2014-05-12 05:36:57 +00001339
1340 return nullptr;
Douglas Gregorbbe8f462009-10-08 15:14:33 +00001341}
1342
Chandler Carruth21c90602015-12-30 03:24:14 +00001343MemberSpecializationInfo *CXXRecordDecl::getMemberSpecializationInfo() const {
1344 return TemplateOrInstantiation.dyn_cast<MemberSpecializationInfo *>();
1345}
1346
Douglas Gregorbbe8f462009-10-08 15:14:33 +00001347void
1348CXXRecordDecl::setInstantiationOfMemberClass(CXXRecordDecl *RD,
1349 TemplateSpecializationKind TSK) {
1350 assert(TemplateOrInstantiation.isNull() &&
1351 "Previous template or instantiation?");
Richard Smith8a0dde72013-12-14 01:04:22 +00001352 assert(!isa<ClassTemplatePartialSpecializationDecl>(this));
Douglas Gregorbbe8f462009-10-08 15:14:33 +00001353 TemplateOrInstantiation
1354 = new (getASTContext()) MemberSpecializationInfo(RD, TSK);
1355}
1356
Chandler Carruth21c90602015-12-30 03:24:14 +00001357ClassTemplateDecl *CXXRecordDecl::getDescribedClassTemplate() const {
1358 return TemplateOrInstantiation.dyn_cast<ClassTemplateDecl *>();
1359}
1360
1361void CXXRecordDecl::setDescribedClassTemplate(ClassTemplateDecl *Template) {
1362 TemplateOrInstantiation = Template;
1363}
1364
Anders Carlsson27cfc6e2009-12-07 06:33:48 +00001365TemplateSpecializationKind CXXRecordDecl::getTemplateSpecializationKind() const{
1366 if (const ClassTemplateSpecializationDecl *Spec
Douglas Gregorbbe8f462009-10-08 15:14:33 +00001367 = dyn_cast<ClassTemplateSpecializationDecl>(this))
1368 return Spec->getSpecializationKind();
1369
Douglas Gregor06db9f52009-10-12 20:18:28 +00001370 if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo())
Douglas Gregorbbe8f462009-10-08 15:14:33 +00001371 return MSInfo->getTemplateSpecializationKind();
1372
1373 return TSK_Undeclared;
1374}
1375
1376void
1377CXXRecordDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK) {
1378 if (ClassTemplateSpecializationDecl *Spec
1379 = dyn_cast<ClassTemplateSpecializationDecl>(this)) {
1380 Spec->setSpecializationKind(TSK);
1381 return;
1382 }
1383
Douglas Gregor06db9f52009-10-12 20:18:28 +00001384 if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) {
Douglas Gregorbbe8f462009-10-08 15:14:33 +00001385 MSInfo->setTemplateSpecializationKind(TSK);
1386 return;
1387 }
1388
David Blaikie83d382b2011-09-23 05:06:16 +00001389 llvm_unreachable("Not a class template or member class specialization");
Douglas Gregorbbe8f462009-10-08 15:14:33 +00001390}
1391
Reid Klecknere7367d62014-10-14 20:28:40 +00001392const CXXRecordDecl *CXXRecordDecl::getTemplateInstantiationPattern() const {
Richard Smith2195ec92017-04-21 01:15:13 +00001393 auto GetDefinitionOrSelf =
1394 [](const CXXRecordDecl *D) -> const CXXRecordDecl * {
1395 if (auto *Def = D->getDefinition())
1396 return Def;
1397 return D;
1398 };
1399
Reid Klecknere7367d62014-10-14 20:28:40 +00001400 // If it's a class template specialization, find the template or partial
1401 // specialization from which it was instantiated.
1402 if (auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(this)) {
1403 auto From = TD->getInstantiatedFrom();
1404 if (auto *CTD = From.dyn_cast<ClassTemplateDecl *>()) {
1405 while (auto *NewCTD = CTD->getInstantiatedFromMemberTemplate()) {
1406 if (NewCTD->isMemberSpecialization())
1407 break;
1408 CTD = NewCTD;
1409 }
Richard Smith2195ec92017-04-21 01:15:13 +00001410 return GetDefinitionOrSelf(CTD->getTemplatedDecl());
Reid Klecknere7367d62014-10-14 20:28:40 +00001411 }
1412 if (auto *CTPSD =
1413 From.dyn_cast<ClassTemplatePartialSpecializationDecl *>()) {
1414 while (auto *NewCTPSD = CTPSD->getInstantiatedFromMember()) {
1415 if (NewCTPSD->isMemberSpecialization())
1416 break;
1417 CTPSD = NewCTPSD;
1418 }
Richard Smith2195ec92017-04-21 01:15:13 +00001419 return GetDefinitionOrSelf(CTPSD);
Reid Klecknere7367d62014-10-14 20:28:40 +00001420 }
1421 }
1422
1423 if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) {
1424 if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) {
1425 const CXXRecordDecl *RD = this;
1426 while (auto *NewRD = RD->getInstantiatedFromMemberClass())
1427 RD = NewRD;
Richard Smith2195ec92017-04-21 01:15:13 +00001428 return GetDefinitionOrSelf(RD);
Reid Klecknere7367d62014-10-14 20:28:40 +00001429 }
1430 }
1431
1432 assert(!isTemplateInstantiation(this->getTemplateSpecializationKind()) &&
1433 "couldn't find pattern for class template instantiation");
1434 return nullptr;
1435}
1436
Douglas Gregorbac74902010-07-01 14:13:13 +00001437CXXDestructorDecl *CXXRecordDecl::getDestructor() const {
1438 ASTContext &Context = getASTContext();
Anders Carlsson0a637412009-05-29 21:03:38 +00001439 QualType ClassType = Context.getTypeDeclType(this);
Mike Stump11289f42009-09-09 15:08:12 +00001440
1441 DeclarationName Name
Douglas Gregor2211d342009-08-05 05:36:45 +00001442 = Context.DeclarationNames.getCXXDestructorName(
1443 Context.getCanonicalType(ClassType));
Anders Carlsson0a637412009-05-29 21:03:38 +00001444
Richard Smithcf4bdde2015-02-21 02:45:19 +00001445 DeclContext::lookup_result R = lookup(Name);
Mike Stump11289f42009-09-09 15:08:12 +00001446
Hubert Tong3cede512017-06-30 22:43:54 +00001447 return R.empty() ? nullptr : dyn_cast<CXXDestructorDecl>(R.front());
Anders Carlsson0a637412009-05-29 21:03:38 +00001448}
1449
Richard Trieu95a192a2015-05-28 00:14:02 +00001450bool CXXRecordDecl::isAnyDestructorNoReturn() const {
1451 // Destructor is noreturn.
1452 if (const CXXDestructorDecl *Destructor = getDestructor())
1453 if (Destructor->isNoReturn())
1454 return true;
1455
1456 // Check base classes destructor for noreturn.
1457 for (const auto &Base : bases())
Alexander Kornienko29333342017-05-12 11:24:25 +00001458 if (const CXXRecordDecl *RD = Base.getType()->getAsCXXRecordDecl())
1459 if (RD->isAnyDestructorNoReturn())
1460 return true;
Richard Trieu95a192a2015-05-28 00:14:02 +00001461
1462 // Check fields for noreturn.
1463 for (const auto *Field : fields())
1464 if (const CXXRecordDecl *RD =
1465 Field->getType()->getBaseElementTypeUnsafe()->getAsCXXRecordDecl())
1466 if (RD->isAnyDestructorNoReturn())
1467 return true;
1468
1469 // All destructors are not noreturn.
1470 return false;
1471}
1472
Erich Keane3e08f662017-09-29 21:06:00 +00001473static bool isDeclContextInNamespace(const DeclContext *DC) {
1474 while (!DC->isTranslationUnit()) {
1475 if (DC->isNamespace())
1476 return true;
1477 DC = DC->getParent();
1478 }
1479 return false;
1480}
1481
Erich Keane58bd6032017-09-15 16:03:35 +00001482bool CXXRecordDecl::isInterfaceLike() const {
1483 assert(hasDefinition() && "checking for interface-like without a definition");
1484 // All __interfaces are inheritently interface-like.
1485 if (isInterface())
1486 return true;
1487
1488 // Interface-like types cannot have a user declared constructor, destructor,
1489 // friends, VBases, conversion functions, or fields. Additionally, lambdas
1490 // cannot be interface types.
1491 if (isLambda() || hasUserDeclaredConstructor() ||
1492 hasUserDeclaredDestructor() || !field_empty() || hasFriends() ||
1493 getNumVBases() > 0 || conversion_end() - conversion_begin() > 0)
1494 return false;
1495
1496 // No interface-like type can have a method with a definition.
1497 for (const auto *const Method : methods())
Erich Keane3e08f662017-09-29 21:06:00 +00001498 if (Method->isDefined() && !Method->isImplicit())
Erich Keane58bd6032017-09-15 16:03:35 +00001499 return false;
1500
1501 // Check "Special" types.
1502 const auto *Uuid = getAttr<UuidAttr>();
Erich Keane3e08f662017-09-29 21:06:00 +00001503 // MS SDK declares IUnknown/IDispatch both in the root of a TU, or in an
1504 // extern C++ block directly in the TU. These are only valid if in one
1505 // of these two situations.
1506 if (Uuid && isStruct() && !getDeclContext()->isExternCContext() &&
1507 !isDeclContextInNamespace(getDeclContext()) &&
Erich Keane58bd6032017-09-15 16:03:35 +00001508 ((getName() == "IUnknown" &&
1509 Uuid->getGuid() == "00000000-0000-0000-C000-000000000046") ||
1510 (getName() == "IDispatch" &&
1511 Uuid->getGuid() == "00020400-0000-0000-C000-000000000046"))) {
1512 if (getNumBases() > 0)
1513 return false;
1514 return true;
1515 }
1516
1517 // FIXME: Any access specifiers is supposed to make this no longer interface
1518 // like.
1519
1520 // If this isn't a 'special' type, it must have a single interface-like base.
1521 if (getNumBases() != 1)
1522 return false;
1523
1524 const auto BaseSpec = *bases_begin();
1525 if (BaseSpec.isVirtual() || BaseSpec.getAccessSpecifier() != AS_public)
1526 return false;
1527 const auto *Base = BaseSpec.getType()->getAsCXXRecordDecl();
1528 if (Base->isInterface() || !Base->isInterfaceLike())
1529 return false;
1530 return true;
1531}
1532
Douglas Gregorb11aad82011-02-19 18:51:44 +00001533void CXXRecordDecl::completeDefinition() {
Craig Topper36250ad2014-05-12 05:36:57 +00001534 completeDefinition(nullptr);
Douglas Gregorb11aad82011-02-19 18:51:44 +00001535}
1536
1537void CXXRecordDecl::completeDefinition(CXXFinalOverriderMap *FinalOverriders) {
1538 RecordDecl::completeDefinition();
Richard Smith96cd6712017-08-16 01:49:53 +00001539
Douglas Gregor8fb95122010-09-29 00:15:42 +00001540 // If the class may be abstract (but hasn't been marked as such), check for
1541 // any pure final overriders.
1542 if (mayBeAbstract()) {
1543 CXXFinalOverriderMap MyFinalOverriders;
1544 if (!FinalOverriders) {
1545 getFinalOverriders(MyFinalOverriders);
1546 FinalOverriders = &MyFinalOverriders;
1547 }
1548
1549 bool Done = false;
1550 for (CXXFinalOverriderMap::iterator M = FinalOverriders->begin(),
1551 MEnd = FinalOverriders->end();
1552 M != MEnd && !Done; ++M) {
1553 for (OverridingMethods::iterator SO = M->second.begin(),
1554 SOEnd = M->second.end();
1555 SO != SOEnd && !Done; ++SO) {
1556 assert(SO->second.size() > 0 &&
1557 "All virtual functions have overridding virtual functions");
1558
1559 // C++ [class.abstract]p4:
1560 // A class is abstract if it contains or inherits at least one
1561 // pure virtual function for which the final overrider is pure
1562 // virtual.
1563 if (SO->second.front().Method->isPure()) {
1564 data().Abstract = true;
1565 Done = true;
1566 break;
1567 }
1568 }
1569 }
1570 }
Douglas Gregor457104e2010-09-29 04:25:11 +00001571
1572 // Set access bits correctly on the directly-declared conversions.
Richard Smitha4ba74c2013-08-30 04:46:40 +00001573 for (conversion_iterator I = conversion_begin(), E = conversion_end();
Douglas Gregor457104e2010-09-29 04:25:11 +00001574 I != E; ++I)
Argyrios Kyrtzidis0f05fb92012-11-28 03:56:16 +00001575 I.setAccess((*I)->getAccess());
Douglas Gregor8fb95122010-09-29 00:15:42 +00001576}
1577
1578bool CXXRecordDecl::mayBeAbstract() const {
1579 if (data().Abstract || isInvalidDecl() || !data().Polymorphic ||
1580 isDependentContext())
1581 return false;
1582
Aaron Ballman574705e2014-03-13 15:41:46 +00001583 for (const auto &B : bases()) {
Douglas Gregor8fb95122010-09-29 00:15:42 +00001584 CXXRecordDecl *BaseDecl
Aaron Ballman574705e2014-03-13 15:41:46 +00001585 = cast<CXXRecordDecl>(B.getType()->getAs<RecordType>()->getDecl());
Douglas Gregor8fb95122010-09-29 00:15:42 +00001586 if (BaseDecl->isAbstract())
1587 return true;
1588 }
1589
1590 return false;
1591}
1592
Richard Smithbc491202017-02-17 20:05:37 +00001593void CXXDeductionGuideDecl::anchor() { }
1594
1595CXXDeductionGuideDecl *CXXDeductionGuideDecl::Create(
1596 ASTContext &C, DeclContext *DC, SourceLocation StartLoc, bool IsExplicit,
1597 const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
1598 SourceLocation EndLocation) {
1599 return new (C, DC) CXXDeductionGuideDecl(C, DC, StartLoc, IsExplicit,
1600 NameInfo, T, TInfo, EndLocation);
1601}
1602
1603CXXDeductionGuideDecl *CXXDeductionGuideDecl::CreateDeserialized(ASTContext &C,
1604 unsigned ID) {
1605 return new (C, ID) CXXDeductionGuideDecl(C, nullptr, SourceLocation(), false,
1606 DeclarationNameInfo(), QualType(),
1607 nullptr, SourceLocation());
1608}
1609
David Blaikie68e081d2011-12-20 02:48:34 +00001610void CXXMethodDecl::anchor() { }
1611
Rafael Espindola6ae7e502013-04-03 19:27:57 +00001612bool CXXMethodDecl::isStatic() const {
Rafael Espindola29cda592013-04-15 12:38:20 +00001613 const CXXMethodDecl *MD = getCanonicalDecl();
Rafael Espindola6ae7e502013-04-03 19:27:57 +00001614
1615 if (MD->getStorageClass() == SC_Static)
1616 return true;
1617
Reid Kleckner9a7f3e62013-10-08 00:58:57 +00001618 OverloadedOperatorKind OOK = getDeclName().getCXXOverloadedOperator();
1619 return isStaticOverloadedOperator(OOK);
Rafael Espindola6ae7e502013-04-03 19:27:57 +00001620}
1621
Rafael Espindola49e860b2012-06-26 17:45:31 +00001622static bool recursivelyOverrides(const CXXMethodDecl *DerivedMD,
1623 const CXXMethodDecl *BaseMD) {
1624 for (CXXMethodDecl::method_iterator I = DerivedMD->begin_overridden_methods(),
1625 E = DerivedMD->end_overridden_methods(); I != E; ++I) {
1626 const CXXMethodDecl *MD = *I;
1627 if (MD->getCanonicalDecl() == BaseMD->getCanonicalDecl())
1628 return true;
1629 if (recursivelyOverrides(MD, BaseMD))
1630 return true;
1631 }
1632 return false;
1633}
1634
1635CXXMethodDecl *
Jordan Rose5fc5da02012-08-15 20:07:17 +00001636CXXMethodDecl::getCorrespondingMethodInClass(const CXXRecordDecl *RD,
1637 bool MayBeBase) {
Rafael Espindola49e860b2012-06-26 17:45:31 +00001638 if (this->getParent()->getCanonicalDecl() == RD->getCanonicalDecl())
1639 return this;
1640
1641 // Lookup doesn't work for destructors, so handle them separately.
1642 if (isa<CXXDestructorDecl>(this)) {
1643 CXXMethodDecl *MD = RD->getDestructor();
Jordan Rose5fc5da02012-08-15 20:07:17 +00001644 if (MD) {
1645 if (recursivelyOverrides(MD, this))
1646 return MD;
1647 if (MayBeBase && recursivelyOverrides(this, MD))
1648 return MD;
1649 }
Craig Topper36250ad2014-05-12 05:36:57 +00001650 return nullptr;
Rafael Espindola49e860b2012-06-26 17:45:31 +00001651 }
1652
Richard Smith40c78062015-02-21 02:31:57 +00001653 for (auto *ND : RD->lookup(getDeclName())) {
1654 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(ND);
Rafael Espindola49e860b2012-06-26 17:45:31 +00001655 if (!MD)
1656 continue;
1657 if (recursivelyOverrides(MD, this))
1658 return MD;
Jordan Rose5fc5da02012-08-15 20:07:17 +00001659 if (MayBeBase && recursivelyOverrides(this, MD))
1660 return MD;
Rafael Espindola49e860b2012-06-26 17:45:31 +00001661 }
1662
Aaron Ballman574705e2014-03-13 15:41:46 +00001663 for (const auto &I : RD->bases()) {
1664 const RecordType *RT = I.getType()->getAs<RecordType>();
Rafael Espindola49e860b2012-06-26 17:45:31 +00001665 if (!RT)
1666 continue;
1667 const CXXRecordDecl *Base = cast<CXXRecordDecl>(RT->getDecl());
1668 CXXMethodDecl *T = this->getCorrespondingMethodInClass(Base);
1669 if (T)
1670 return T;
1671 }
1672
Craig Topper36250ad2014-05-12 05:36:57 +00001673 return nullptr;
Rafael Espindola49e860b2012-06-26 17:45:31 +00001674}
1675
Ted Kremenek21475702008-09-05 17:16:31 +00001676CXXMethodDecl *
1677CXXMethodDecl::Create(ASTContext &C, CXXRecordDecl *RD,
Abramo Bagnaradff19302011-03-08 08:55:46 +00001678 SourceLocation StartLoc,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001679 const DeclarationNameInfo &NameInfo,
John McCallbcd03502009-12-07 02:54:59 +00001680 QualType T, TypeSourceInfo *TInfo,
Rafael Espindola6ae7e502013-04-03 19:27:57 +00001681 StorageClass SC, bool isInline,
Richard Smitha77a0a62011-08-15 21:04:07 +00001682 bool isConstexpr, SourceLocation EndLocation) {
Richard Smith053f6c62014-05-16 23:01:30 +00001683 return new (C, RD) CXXMethodDecl(CXXMethod, C, RD, StartLoc, NameInfo,
1684 T, TInfo, SC, isInline, isConstexpr,
1685 EndLocation);
Ted Kremenek21475702008-09-05 17:16:31 +00001686}
1687
Douglas Gregor72172e92012-01-05 21:55:30 +00001688CXXMethodDecl *CXXMethodDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
Richard Smith053f6c62014-05-16 23:01:30 +00001689 return new (C, ID) CXXMethodDecl(CXXMethod, C, nullptr, SourceLocation(),
Craig Topper36250ad2014-05-12 05:36:57 +00001690 DeclarationNameInfo(), QualType(), nullptr,
Richard Smithf7981722013-11-22 09:01:48 +00001691 SC_None, false, false, SourceLocation());
Douglas Gregor72172e92012-01-05 21:55:30 +00001692}
1693
Akira Hatanaka22461672017-07-13 06:08:27 +00001694CXXMethodDecl *CXXMethodDecl::getDevirtualizedMethod(const Expr *Base,
1695 bool IsAppleKext) {
1696 assert(isVirtual() && "this method is expected to be virtual");
1697
1698 // When building with -fapple-kext, all calls must go through the vtable since
1699 // the kernel linker can do runtime patching of vtables.
1700 if (IsAppleKext)
1701 return nullptr;
1702
1703 // If the member function is marked 'final', we know that it can't be
1704 // overridden and can therefore devirtualize it unless it's pure virtual.
1705 if (hasAttr<FinalAttr>())
1706 return isPure() ? nullptr : this;
1707
1708 // If Base is unknown, we cannot devirtualize.
1709 if (!Base)
1710 return nullptr;
1711
1712 // If the base expression (after skipping derived-to-base conversions) is a
1713 // class prvalue, then we can devirtualize.
1714 Base = Base->getBestDynamicClassTypeExpr();
1715 if (Base->isRValue() && Base->getType()->isRecordType())
1716 return this;
1717
1718 // If we don't even know what we would call, we can't devirtualize.
1719 const CXXRecordDecl *BestDynamicDecl = Base->getBestDynamicClassType();
1720 if (!BestDynamicDecl)
1721 return nullptr;
1722
1723 // There may be a method corresponding to MD in a derived class.
1724 CXXMethodDecl *DevirtualizedMethod =
1725 getCorrespondingMethodInClass(BestDynamicDecl);
1726
1727 // If that method is pure virtual, we can't devirtualize. If this code is
1728 // reached, the result would be UB, not a direct call to the derived class
1729 // function, and we can't assume the derived class function is defined.
1730 if (DevirtualizedMethod->isPure())
1731 return nullptr;
1732
1733 // If that method is marked final, we can devirtualize it.
1734 if (DevirtualizedMethod->hasAttr<FinalAttr>())
1735 return DevirtualizedMethod;
1736
1737 // Similarly, if the class itself is marked 'final' it can't be overridden
1738 // and we can therefore devirtualize the member function call.
1739 if (BestDynamicDecl->hasAttr<FinalAttr>())
1740 return DevirtualizedMethod;
1741
1742 if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base)) {
1743 if (const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl()))
1744 if (VD->getType()->isRecordType())
1745 // This is a record decl. We know the type and can devirtualize it.
1746 return DevirtualizedMethod;
1747
1748 return nullptr;
1749 }
1750
1751 // We can devirtualize calls on an object accessed by a class member access
1752 // expression, since by C++11 [basic.life]p6 we know that it can't refer to
1753 // a derived class object constructed in the same location.
1754 if (const MemberExpr *ME = dyn_cast<MemberExpr>(Base))
1755 if (const ValueDecl *VD = dyn_cast<ValueDecl>(ME->getMemberDecl()))
1756 return VD->getType()->isRecordType() ? DevirtualizedMethod : nullptr;
1757
1758 // Likewise for calls on an object accessed by a (non-reference) pointer to
1759 // member access.
1760 if (auto *BO = dyn_cast<BinaryOperator>(Base)) {
1761 if (BO->isPtrMemOp()) {
1762 auto *MPT = BO->getRHS()->getType()->castAs<MemberPointerType>();
1763 if (MPT->getPointeeType()->isRecordType())
1764 return DevirtualizedMethod;
1765 }
1766 }
1767
1768 // We can't devirtualize the call.
1769 return nullptr;
1770}
1771
Douglas Gregorbb3e12f2009-09-29 18:16:17 +00001772bool CXXMethodDecl::isUsualDeallocationFunction() const {
1773 if (getOverloadedOperator() != OO_Delete &&
1774 getOverloadedOperator() != OO_Array_Delete)
1775 return false;
Douglas Gregor6642ca22010-02-26 05:06:18 +00001776
1777 // C++ [basic.stc.dynamic.deallocation]p2:
1778 // A template instance is never a usual deallocation function,
1779 // regardless of its signature.
1780 if (getPrimaryTemplate())
1781 return false;
1782
Douglas Gregorbb3e12f2009-09-29 18:16:17 +00001783 // C++ [basic.stc.dynamic.deallocation]p2:
1784 // If a class T has a member deallocation function named operator delete
1785 // with exactly one parameter, then that function is a usual (non-placement)
1786 // deallocation function. [...]
1787 if (getNumParams() == 1)
1788 return true;
Richard Smithb2f0f052016-10-10 18:54:32 +00001789 unsigned UsualParams = 1;
Richard Smith96269c52016-09-29 22:49:46 +00001790
Richard Smithb2f0f052016-10-10 18:54:32 +00001791 // C++ <=14 [basic.stc.dynamic.deallocation]p2:
Douglas Gregorbb3e12f2009-09-29 18:16:17 +00001792 // [...] If class T does not declare such an operator delete but does
1793 // declare a member deallocation function named operator delete with
1794 // exactly two parameters, the second of which has type std::size_t (18.1),
1795 // then this function is a usual deallocation function.
Richard Smithb2f0f052016-10-10 18:54:32 +00001796 //
1797 // C++17 says a usual deallocation function is one with the signature
1798 // (void* [, size_t] [, std::align_val_t] [, ...])
1799 // and all such functions are usual deallocation functions. It's not clear
1800 // that allowing varargs functions was intentional.
Douglas Gregorbb3e12f2009-09-29 18:16:17 +00001801 ASTContext &Context = getASTContext();
Richard Smithb2f0f052016-10-10 18:54:32 +00001802 if (UsualParams < getNumParams() &&
1803 Context.hasSameUnqualifiedType(getParamDecl(UsualParams)->getType(),
1804 Context.getSizeType()))
1805 ++UsualParams;
1806
1807 if (UsualParams < getNumParams() &&
1808 getParamDecl(UsualParams)->getType()->isAlignValT())
1809 ++UsualParams;
1810
1811 if (UsualParams != getNumParams())
Douglas Gregorbb3e12f2009-09-29 18:16:17 +00001812 return false;
Richard Smithb2f0f052016-10-10 18:54:32 +00001813
1814 // In C++17 onwards, all potential usual deallocation functions are actual
1815 // usual deallocation functions.
1816 if (Context.getLangOpts().AlignedAllocation)
1817 return true;
Douglas Gregorbb3e12f2009-09-29 18:16:17 +00001818
1819 // This function is a usual deallocation function if there are no
1820 // single-parameter deallocation functions of the same kind.
Richard Smithcf4bdde2015-02-21 02:45:19 +00001821 DeclContext::lookup_result R = getDeclContext()->lookup(getDeclName());
1822 for (DeclContext::lookup_result::iterator I = R.begin(), E = R.end();
David Blaikieff7d47a2012-12-19 00:45:41 +00001823 I != E; ++I) {
1824 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*I))
Douglas Gregorbb3e12f2009-09-29 18:16:17 +00001825 if (FD->getNumParams() == 1)
1826 return false;
1827 }
1828
1829 return true;
1830}
1831
Douglas Gregorb139cd52010-05-01 20:49:11 +00001832bool CXXMethodDecl::isCopyAssignmentOperator() const {
Alexis Huntfcaeae42011-05-25 20:50:04 +00001833 // C++0x [class.copy]p17:
Douglas Gregorb139cd52010-05-01 20:49:11 +00001834 // A user-declared copy assignment operator X::operator= is a non-static
1835 // non-template member function of class X with exactly one parameter of
1836 // type X, X&, const X&, volatile X& or const volatile X&.
1837 if (/*operator=*/getOverloadedOperator() != OO_Equal ||
1838 /*non-static*/ isStatic() ||
Eli Friedman84c0143e2013-07-11 23:55:07 +00001839 /*non-template*/getPrimaryTemplate() || getDescribedFunctionTemplate() ||
1840 getNumParams() != 1)
Douglas Gregorb139cd52010-05-01 20:49:11 +00001841 return false;
1842
1843 QualType ParamType = getParamDecl(0)->getType();
1844 if (const LValueReferenceType *Ref = ParamType->getAs<LValueReferenceType>())
1845 ParamType = Ref->getPointeeType();
1846
1847 ASTContext &Context = getASTContext();
1848 QualType ClassType
1849 = Context.getCanonicalType(Context.getTypeDeclType(getParent()));
1850 return Context.hasSameUnqualifiedType(ClassType, ParamType);
1851}
1852
Alexis Huntfcaeae42011-05-25 20:50:04 +00001853bool CXXMethodDecl::isMoveAssignmentOperator() const {
1854 // C++0x [class.copy]p19:
1855 // A user-declared move assignment operator X::operator= is a non-static
1856 // non-template member function of class X with exactly one parameter of type
1857 // X&&, const X&&, volatile X&&, or const volatile X&&.
1858 if (getOverloadedOperator() != OO_Equal || isStatic() ||
Eli Friedman84c0143e2013-07-11 23:55:07 +00001859 getPrimaryTemplate() || getDescribedFunctionTemplate() ||
1860 getNumParams() != 1)
Alexis Huntfcaeae42011-05-25 20:50:04 +00001861 return false;
1862
1863 QualType ParamType = getParamDecl(0)->getType();
1864 if (!isa<RValueReferenceType>(ParamType))
1865 return false;
1866 ParamType = ParamType->getPointeeType();
1867
1868 ASTContext &Context = getASTContext();
1869 QualType ClassType
1870 = Context.getCanonicalType(Context.getTypeDeclType(getParent()));
1871 return Context.hasSameUnqualifiedType(ClassType, ParamType);
1872}
1873
Anders Carlsson36d87e12009-05-16 23:58:37 +00001874void CXXMethodDecl::addOverriddenMethod(const CXXMethodDecl *MD) {
Anders Carlssonf3935b42009-12-04 05:51:56 +00001875 assert(MD->isCanonicalDecl() && "Method is not canonical!");
Anders Carlssonbd32c432010-01-30 17:42:34 +00001876 assert(!MD->getParent()->isDependentContext() &&
1877 "Can't add an overridden method to a class template!");
Eli Friedman91359022012-03-10 01:39:01 +00001878 assert(MD->isVirtual() && "Method is not virtual!");
Anders Carlssonbd32c432010-01-30 17:42:34 +00001879
Douglas Gregor832940b2010-03-02 23:58:15 +00001880 getASTContext().addOverriddenMethod(this, MD);
Anders Carlsson36d87e12009-05-16 23:58:37 +00001881}
1882
1883CXXMethodDecl::method_iterator CXXMethodDecl::begin_overridden_methods() const {
Craig Topper36250ad2014-05-12 05:36:57 +00001884 if (isa<CXXConstructorDecl>(this)) return nullptr;
Douglas Gregor832940b2010-03-02 23:58:15 +00001885 return getASTContext().overridden_methods_begin(this);
Anders Carlsson36d87e12009-05-16 23:58:37 +00001886}
1887
1888CXXMethodDecl::method_iterator CXXMethodDecl::end_overridden_methods() const {
Craig Topper36250ad2014-05-12 05:36:57 +00001889 if (isa<CXXConstructorDecl>(this)) return nullptr;
Douglas Gregor832940b2010-03-02 23:58:15 +00001890 return getASTContext().overridden_methods_end(this);
Anders Carlsson36d87e12009-05-16 23:58:37 +00001891}
1892
Argyrios Kyrtzidis6685e8a2010-07-04 21:44:35 +00001893unsigned CXXMethodDecl::size_overridden_methods() const {
Eli Friedman91359022012-03-10 01:39:01 +00001894 if (isa<CXXConstructorDecl>(this)) return 0;
Argyrios Kyrtzidis6685e8a2010-07-04 21:44:35 +00001895 return getASTContext().overridden_methods_size(this);
1896}
1897
Clement Courbet6ecaec82016-07-05 07:49:31 +00001898CXXMethodDecl::overridden_method_range
1899CXXMethodDecl::overridden_methods() const {
1900 if (isa<CXXConstructorDecl>(this))
1901 return overridden_method_range(nullptr, nullptr);
1902 return getASTContext().overridden_methods(this);
1903}
1904
Ted Kremenek21475702008-09-05 17:16:31 +00001905QualType CXXMethodDecl::getThisType(ASTContext &C) const {
Argyrios Kyrtzidis962c20e2008-10-24 22:28:18 +00001906 // C++ 9.3.2p1: The type of this in a member function of a class X is X*.
1907 // If the member function is declared const, the type of this is const X*,
1908 // if the member function is declared volatile, the type of this is
1909 // volatile X*, and if the member function is declared const volatile,
1910 // the type of this is const volatile X*.
1911
Ted Kremenek21475702008-09-05 17:16:31 +00001912 assert(isInstance() && "No 'this' for static methods!");
Anders Carlsson20ee0ed2009-06-13 02:59:33 +00001913
John McCalle78aac42010-03-10 03:28:59 +00001914 QualType ClassTy = C.getTypeDeclType(getParent());
John McCall8ccfcb52009-09-24 19:53:00 +00001915 ClassTy = C.getQualifiedType(ClassTy,
Andrey Bokhanko67a41862016-05-26 10:06:01 +00001916 Qualifiers::fromCVRUMask(getTypeQualifiers()));
Anders Carlsson7ca3f6f2009-07-10 21:35:09 +00001917 return C.getPointerType(ClassTy);
Ted Kremenek21475702008-09-05 17:16:31 +00001918}
1919
Eli Friedman71a26d82009-12-06 20:50:05 +00001920bool CXXMethodDecl::hasInlineBody() const {
Douglas Gregora318efd2010-01-05 19:06:31 +00001921 // If this function is a template instantiation, look at the template from
1922 // which it was instantiated.
1923 const FunctionDecl *CheckFn = getTemplateInstantiationPattern();
1924 if (!CheckFn)
1925 CheckFn = this;
Richard Smith6c7161162017-08-12 01:46:03 +00001926
Eli Friedman71a26d82009-12-06 20:50:05 +00001927 const FunctionDecl *fn;
Richard Smith6c7161162017-08-12 01:46:03 +00001928 return CheckFn->isDefined(fn) && !fn->isOutOfLine() &&
1929 (fn->doesThisDeclarationHaveABody() || fn->willHaveBody());
Eli Friedman71a26d82009-12-06 20:50:05 +00001930}
1931
Douglas Gregor355efbb2012-02-17 03:02:34 +00001932bool CXXMethodDecl::isLambdaStaticInvoker() const {
Faisal Vali571df122013-09-29 08:45:24 +00001933 const CXXRecordDecl *P = getParent();
1934 if (P->isLambda()) {
1935 if (const CXXMethodDecl *StaticInvoker = P->getLambdaStaticInvoker()) {
1936 if (StaticInvoker == this) return true;
1937 if (P->isGenericLambda() && this->isFunctionTemplateSpecialization())
1938 return StaticInvoker == this->getPrimaryTemplate()->getTemplatedDecl();
1939 }
1940 }
1941 return false;
Douglas Gregor355efbb2012-02-17 03:02:34 +00001942}
1943
Alexis Hunt1d792652011-01-08 20:30:50 +00001944CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
1945 TypeSourceInfo *TInfo, bool IsVirtual,
1946 SourceLocation L, Expr *Init,
1947 SourceLocation R,
1948 SourceLocation EllipsisLoc)
Alexis Hunta50dd462011-01-08 23:01:16 +00001949 : Initializee(TInfo), MemberOrEllipsisLocation(EllipsisLoc), Init(Init),
Douglas Gregord73f3dd2011-11-01 01:16:03 +00001950 LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(IsVirtual),
Richard Smith30e304e2016-12-14 00:03:17 +00001951 IsWritten(false), SourceOrder(0)
Douglas Gregorc8c44b5d2009-12-02 22:36:29 +00001952{
Douglas Gregore8381c02008-11-05 04:29:56 +00001953}
1954
Alexis Hunt1d792652011-01-08 20:30:50 +00001955CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
1956 FieldDecl *Member,
1957 SourceLocation MemberLoc,
1958 SourceLocation L, Expr *Init,
1959 SourceLocation R)
Alexis Hunta50dd462011-01-08 23:01:16 +00001960 : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init),
Douglas Gregord73f3dd2011-11-01 01:16:03 +00001961 LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
Richard Smith30e304e2016-12-14 00:03:17 +00001962 IsWritten(false), SourceOrder(0)
Francois Pichetd583da02010-12-04 09:14:42 +00001963{
1964}
1965
Alexis Hunt1d792652011-01-08 20:30:50 +00001966CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
1967 IndirectFieldDecl *Member,
1968 SourceLocation MemberLoc,
1969 SourceLocation L, Expr *Init,
1970 SourceLocation R)
Alexis Hunta50dd462011-01-08 23:01:16 +00001971 : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init),
Douglas Gregord73f3dd2011-11-01 01:16:03 +00001972 LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
Richard Smith30e304e2016-12-14 00:03:17 +00001973 IsWritten(false), SourceOrder(0)
Douglas Gregorc8c44b5d2009-12-02 22:36:29 +00001974{
Douglas Gregore8381c02008-11-05 04:29:56 +00001975}
1976
Alexis Hunt1d792652011-01-08 20:30:50 +00001977CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
Douglas Gregord73f3dd2011-11-01 01:16:03 +00001978 TypeSourceInfo *TInfo,
1979 SourceLocation L, Expr *Init,
Alexis Huntc5575cc2011-02-26 19:13:13 +00001980 SourceLocation R)
Douglas Gregord73f3dd2011-11-01 01:16:03 +00001981 : Initializee(TInfo), MemberOrEllipsisLocation(), Init(Init),
1982 LParenLoc(L), RParenLoc(R), IsDelegating(true), IsVirtual(false),
Richard Smith30e304e2016-12-14 00:03:17 +00001983 IsWritten(false), SourceOrder(0)
Alexis Huntc5575cc2011-02-26 19:13:13 +00001984{
1985}
1986
Alexis Hunt1d792652011-01-08 20:30:50 +00001987TypeLoc CXXCtorInitializer::getBaseClassLoc() const {
Douglas Gregorc8c44b5d2009-12-02 22:36:29 +00001988 if (isBaseInitializer())
Alexis Hunta50dd462011-01-08 23:01:16 +00001989 return Initializee.get<TypeSourceInfo*>()->getTypeLoc();
Douglas Gregorc8c44b5d2009-12-02 22:36:29 +00001990 else
1991 return TypeLoc();
1992}
1993
Alexis Hunt1d792652011-01-08 20:30:50 +00001994const Type *CXXCtorInitializer::getBaseClass() const {
Douglas Gregorc8c44b5d2009-12-02 22:36:29 +00001995 if (isBaseInitializer())
Alexis Hunta50dd462011-01-08 23:01:16 +00001996 return Initializee.get<TypeSourceInfo*>()->getType().getTypePtr();
Douglas Gregorc8c44b5d2009-12-02 22:36:29 +00001997 else
Craig Topper36250ad2014-05-12 05:36:57 +00001998 return nullptr;
Douglas Gregorc8c44b5d2009-12-02 22:36:29 +00001999}
2000
Alexis Hunt1d792652011-01-08 20:30:50 +00002001SourceLocation CXXCtorInitializer::getSourceLocation() const {
Richard Smith938f40b2011-06-11 17:19:42 +00002002 if (isInClassMemberInitializer())
2003 return getAnyMember()->getLocation();
Douglas Gregorc8c44b5d2009-12-02 22:36:29 +00002004
David Blaikiea81d4102015-01-18 00:12:58 +00002005 if (isAnyMemberInitializer())
2006 return getMemberLocation();
2007
Douglas Gregord73f3dd2011-11-01 01:16:03 +00002008 if (TypeSourceInfo *TSInfo = Initializee.get<TypeSourceInfo*>())
2009 return TSInfo->getTypeLoc().getLocalSourceRange().getBegin();
2010
2011 return SourceLocation();
Douglas Gregorc8c44b5d2009-12-02 22:36:29 +00002012}
2013
Alexis Hunt1d792652011-01-08 20:30:50 +00002014SourceRange CXXCtorInitializer::getSourceRange() const {
Richard Smith938f40b2011-06-11 17:19:42 +00002015 if (isInClassMemberInitializer()) {
2016 FieldDecl *D = getAnyMember();
2017 if (Expr *I = D->getInClassInitializer())
2018 return I->getSourceRange();
2019 return SourceRange();
2020 }
2021
Douglas Gregorc8c44b5d2009-12-02 22:36:29 +00002022 return SourceRange(getSourceLocation(), getRParenLoc());
Douglas Gregore8381c02008-11-05 04:29:56 +00002023}
2024
David Blaikie68e081d2011-12-20 02:48:34 +00002025void CXXConstructorDecl::anchor() { }
2026
Richard Smith5179eb72016-06-28 19:03:57 +00002027CXXConstructorDecl *CXXConstructorDecl::CreateDeserialized(ASTContext &C,
2028 unsigned ID,
2029 bool Inherited) {
2030 unsigned Extra = additionalSizeToAlloc<InheritedConstructor>(Inherited);
2031 auto *Result = new (C, ID, Extra) CXXConstructorDecl(
2032 C, nullptr, SourceLocation(), DeclarationNameInfo(), QualType(), nullptr,
2033 false, false, false, false, InheritedConstructor());
2034 Result->IsInheritingConstructor = Inherited;
2035 return Result;
Chris Lattnerca025db2010-05-07 21:43:38 +00002036}
2037
2038CXXConstructorDecl *
Douglas Gregor61956c42008-10-31 09:07:45 +00002039CXXConstructorDecl::Create(ASTContext &C, CXXRecordDecl *RD,
Abramo Bagnaradff19302011-03-08 08:55:46 +00002040 SourceLocation StartLoc,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00002041 const DeclarationNameInfo &NameInfo,
John McCallbcd03502009-12-07 02:54:59 +00002042 QualType T, TypeSourceInfo *TInfo,
Richard Smitha77a0a62011-08-15 21:04:07 +00002043 bool isExplicit, bool isInline,
Richard Smith5179eb72016-06-28 19:03:57 +00002044 bool isImplicitlyDeclared, bool isConstexpr,
2045 InheritedConstructor Inherited) {
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00002046 assert(NameInfo.getName().getNameKind()
2047 == DeclarationName::CXXConstructorName &&
Douglas Gregor77324f32008-11-17 14:58:09 +00002048 "Name must refer to a constructor");
Richard Smith5179eb72016-06-28 19:03:57 +00002049 unsigned Extra =
2050 additionalSizeToAlloc<InheritedConstructor>(Inherited ? 1 : 0);
2051 return new (C, RD, Extra) CXXConstructorDecl(
2052 C, RD, StartLoc, NameInfo, T, TInfo, isExplicit, isInline,
2053 isImplicitlyDeclared, isConstexpr, Inherited);
Douglas Gregor61956c42008-10-31 09:07:45 +00002054}
2055
Richard Smithc2bb8182015-03-24 06:36:48 +00002056CXXConstructorDecl::init_const_iterator CXXConstructorDecl::init_begin() const {
2057 return CtorInitializers.get(getASTContext().getExternalSource());
2058}
2059
Douglas Gregord73f3dd2011-11-01 01:16:03 +00002060CXXConstructorDecl *CXXConstructorDecl::getTargetConstructor() const {
2061 assert(isDelegatingConstructor() && "Not a delegating constructor!");
2062 Expr *E = (*init_begin())->getInit()->IgnoreImplicit();
2063 if (CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(E))
2064 return Construct->getConstructor();
Craig Topper36250ad2014-05-12 05:36:57 +00002065
2066 return nullptr;
Douglas Gregord73f3dd2011-11-01 01:16:03 +00002067}
2068
Douglas Gregoreebb5c12008-10-31 20:25:05 +00002069bool CXXConstructorDecl::isDefaultConstructor() const {
2070 // C++ [class.ctor]p5:
Douglas Gregorcfd8ddc2008-11-05 16:20:31 +00002071 // A default constructor for a class X is a constructor of class
2072 // X that can be called without an argument.
Douglas Gregoreebb5c12008-10-31 20:25:05 +00002073 return (getNumParams() == 0) ||
Anders Carlsson6eb55572009-08-25 05:12:04 +00002074 (getNumParams() > 0 && getParamDecl(0)->hasDefaultArg());
Douglas Gregoreebb5c12008-10-31 20:25:05 +00002075}
2076
Mike Stump11289f42009-09-09 15:08:12 +00002077bool
Douglas Gregor507eb872009-12-22 00:34:07 +00002078CXXConstructorDecl::isCopyConstructor(unsigned &TypeQuals) const {
Douglas Gregorf282a762011-01-21 19:38:21 +00002079 return isCopyOrMoveConstructor(TypeQuals) &&
2080 getParamDecl(0)->getType()->isLValueReferenceType();
2081}
2082
2083bool CXXConstructorDecl::isMoveConstructor(unsigned &TypeQuals) const {
2084 return isCopyOrMoveConstructor(TypeQuals) &&
2085 getParamDecl(0)->getType()->isRValueReferenceType();
2086}
2087
2088/// \brief Determine whether this is a copy or move constructor.
2089bool CXXConstructorDecl::isCopyOrMoveConstructor(unsigned &TypeQuals) const {
Douglas Gregoreebb5c12008-10-31 20:25:05 +00002090 // C++ [class.copy]p2:
Douglas Gregorcfd8ddc2008-11-05 16:20:31 +00002091 // A non-template constructor for class X is a copy constructor
2092 // if its first parameter is of type X&, const X&, volatile X& or
2093 // const volatile X&, and either there are no other parameters
2094 // or else all other parameters have default arguments (8.3.6).
Douglas Gregorf282a762011-01-21 19:38:21 +00002095 // C++0x [class.copy]p3:
2096 // A non-template constructor for class X is a move constructor if its
2097 // first parameter is of type X&&, const X&&, volatile X&&, or
2098 // const volatile X&&, and either there are no other parameters or else
2099 // all other parameters have default arguments.
Douglas Gregoreebb5c12008-10-31 20:25:05 +00002100 if ((getNumParams() < 1) ||
Douglas Gregora14b43b2009-10-13 23:45:19 +00002101 (getNumParams() > 1 && !getParamDecl(1)->hasDefaultArg()) ||
Craig Topper36250ad2014-05-12 05:36:57 +00002102 (getPrimaryTemplate() != nullptr) ||
2103 (getDescribedFunctionTemplate() != nullptr))
Douglas Gregoreebb5c12008-10-31 20:25:05 +00002104 return false;
Douglas Gregorf282a762011-01-21 19:38:21 +00002105
Douglas Gregoreebb5c12008-10-31 20:25:05 +00002106 const ParmVarDecl *Param = getParamDecl(0);
Douglas Gregorf282a762011-01-21 19:38:21 +00002107
2108 // Do we have a reference type?
2109 const ReferenceType *ParamRefType = Param->getType()->getAs<ReferenceType>();
Douglas Gregorff7028a2009-11-13 23:59:09 +00002110 if (!ParamRefType)
2111 return false;
Douglas Gregorf282a762011-01-21 19:38:21 +00002112
Douglas Gregorff7028a2009-11-13 23:59:09 +00002113 // Is it a reference to our class type?
Douglas Gregor507eb872009-12-22 00:34:07 +00002114 ASTContext &Context = getASTContext();
2115
Douglas Gregorff7028a2009-11-13 23:59:09 +00002116 CanQualType PointeeType
2117 = Context.getCanonicalType(ParamRefType->getPointeeType());
Douglas Gregorf70b2b42009-09-15 20:50:23 +00002118 CanQualType ClassTy
2119 = Context.getCanonicalType(Context.getTagDeclType(getParent()));
Douglas Gregoreebb5c12008-10-31 20:25:05 +00002120 if (PointeeType.getUnqualifiedType() != ClassTy)
2121 return false;
Douglas Gregorf282a762011-01-21 19:38:21 +00002122
John McCall8ccfcb52009-09-24 19:53:00 +00002123 // FIXME: other qualifiers?
Douglas Gregorf282a762011-01-21 19:38:21 +00002124
2125 // We have a copy or move constructor.
Douglas Gregoreebb5c12008-10-31 20:25:05 +00002126 TypeQuals = PointeeType.getCVRQualifiers();
Douglas Gregorf282a762011-01-21 19:38:21 +00002127 return true;
Douglas Gregoreebb5c12008-10-31 20:25:05 +00002128}
2129
Anders Carlssond20e7952009-08-28 16:57:08 +00002130bool CXXConstructorDecl::isConvertingConstructor(bool AllowExplicit) const {
Douglas Gregor26bee0b2008-10-31 16:23:19 +00002131 // C++ [class.conv.ctor]p1:
2132 // A constructor declared without the function-specifier explicit
2133 // that can be called with a single parameter specifies a
2134 // conversion from the type of its first parameter to the type of
2135 // its class. Such a constructor is called a converting
2136 // constructor.
Anders Carlssond20e7952009-08-28 16:57:08 +00002137 if (isExplicit() && !AllowExplicit)
Douglas Gregor26bee0b2008-10-31 16:23:19 +00002138 return false;
2139
Mike Stump11289f42009-09-09 15:08:12 +00002140 return (getNumParams() == 0 &&
John McCall9dd450b2009-09-21 23:43:11 +00002141 getType()->getAs<FunctionProtoType>()->isVariadic()) ||
Douglas Gregor26bee0b2008-10-31 16:23:19 +00002142 (getNumParams() == 1) ||
Douglas Gregorc65e1592012-06-05 23:44:51 +00002143 (getNumParams() > 1 &&
2144 (getParamDecl(1)->hasDefaultArg() ||
2145 getParamDecl(1)->isParameterPack()));
Douglas Gregor26bee0b2008-10-31 16:23:19 +00002146}
Douglas Gregor61956c42008-10-31 09:07:45 +00002147
Douglas Gregorbd6b17f2010-11-08 17:16:59 +00002148bool CXXConstructorDecl::isSpecializationCopyingObject() const {
Douglas Gregorffe14e32009-11-14 01:20:54 +00002149 if ((getNumParams() < 1) ||
2150 (getNumParams() > 1 && !getParamDecl(1)->hasDefaultArg()) ||
Craig Topper36250ad2014-05-12 05:36:57 +00002151 (getDescribedFunctionTemplate() != nullptr))
Douglas Gregorffe14e32009-11-14 01:20:54 +00002152 return false;
2153
2154 const ParmVarDecl *Param = getParamDecl(0);
2155
2156 ASTContext &Context = getASTContext();
2157 CanQualType ParamType = Context.getCanonicalType(Param->getType());
2158
Douglas Gregorffe14e32009-11-14 01:20:54 +00002159 // Is it the same as our our class type?
2160 CanQualType ClassTy
2161 = Context.getCanonicalType(Context.getTagDeclType(getParent()));
2162 if (ParamType.getUnqualifiedType() != ClassTy)
2163 return false;
2164
2165 return true;
2166}
2167
David Blaikie68e081d2011-12-20 02:48:34 +00002168void CXXDestructorDecl::anchor() { }
2169
Douglas Gregor831c93f2008-11-05 20:51:48 +00002170CXXDestructorDecl *
Douglas Gregor72172e92012-01-05 21:55:30 +00002171CXXDestructorDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
Richard Smith053f6c62014-05-16 23:01:30 +00002172 return new (C, ID)
2173 CXXDestructorDecl(C, nullptr, SourceLocation(), DeclarationNameInfo(),
2174 QualType(), nullptr, false, false);
Chris Lattnerca025db2010-05-07 21:43:38 +00002175}
2176
2177CXXDestructorDecl *
Douglas Gregor831c93f2008-11-05 20:51:48 +00002178CXXDestructorDecl::Create(ASTContext &C, CXXRecordDecl *RD,
Abramo Bagnaradff19302011-03-08 08:55:46 +00002179 SourceLocation StartLoc,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00002180 const DeclarationNameInfo &NameInfo,
Craig Silversteinaf8808d2010-10-21 00:44:50 +00002181 QualType T, TypeSourceInfo *TInfo,
Richard Smitha77a0a62011-08-15 21:04:07 +00002182 bool isInline, bool isImplicitlyDeclared) {
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00002183 assert(NameInfo.getName().getNameKind()
2184 == DeclarationName::CXXDestructorName &&
Douglas Gregor77324f32008-11-17 14:58:09 +00002185 "Name must refer to a destructor");
Richard Smith053f6c62014-05-16 23:01:30 +00002186 return new (C, RD) CXXDestructorDecl(C, RD, StartLoc, NameInfo, T, TInfo,
Richard Smithf7981722013-11-22 09:01:48 +00002187 isInline, isImplicitlyDeclared);
Douglas Gregor831c93f2008-11-05 20:51:48 +00002188}
2189
Richard Smithf8134002015-03-10 01:41:22 +00002190void CXXDestructorDecl::setOperatorDelete(FunctionDecl *OD) {
2191 auto *First = cast<CXXDestructorDecl>(getFirstDecl());
2192 if (OD && !First->OperatorDelete) {
2193 First->OperatorDelete = OD;
2194 if (auto *L = getASTMutationListener())
2195 L->ResolvedOperatorDelete(First, OD);
2196 }
2197}
2198
David Blaikie68e081d2011-12-20 02:48:34 +00002199void CXXConversionDecl::anchor() { }
2200
Douglas Gregordbc5daf2008-11-07 20:08:42 +00002201CXXConversionDecl *
Douglas Gregor72172e92012-01-05 21:55:30 +00002202CXXConversionDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
Richard Smith053f6c62014-05-16 23:01:30 +00002203 return new (C, ID) CXXConversionDecl(C, nullptr, SourceLocation(),
Richard Smithf7981722013-11-22 09:01:48 +00002204 DeclarationNameInfo(), QualType(),
Craig Topper36250ad2014-05-12 05:36:57 +00002205 nullptr, false, false, false,
Richard Smithf7981722013-11-22 09:01:48 +00002206 SourceLocation());
Chris Lattnerca025db2010-05-07 21:43:38 +00002207}
2208
2209CXXConversionDecl *
Douglas Gregordbc5daf2008-11-07 20:08:42 +00002210CXXConversionDecl::Create(ASTContext &C, CXXRecordDecl *RD,
Abramo Bagnaradff19302011-03-08 08:55:46 +00002211 SourceLocation StartLoc,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00002212 const DeclarationNameInfo &NameInfo,
John McCallbcd03502009-12-07 02:54:59 +00002213 QualType T, TypeSourceInfo *TInfo,
Douglas Gregorf2f08062011-03-08 17:10:18 +00002214 bool isInline, bool isExplicit,
Richard Smitha77a0a62011-08-15 21:04:07 +00002215 bool isConstexpr, SourceLocation EndLocation) {
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00002216 assert(NameInfo.getName().getNameKind()
2217 == DeclarationName::CXXConversionFunctionName &&
Douglas Gregor77324f32008-11-17 14:58:09 +00002218 "Name must refer to a conversion function");
Richard Smith053f6c62014-05-16 23:01:30 +00002219 return new (C, RD) CXXConversionDecl(C, RD, StartLoc, NameInfo, T, TInfo,
Richard Smithf7981722013-11-22 09:01:48 +00002220 isInline, isExplicit, isConstexpr,
2221 EndLocation);
Douglas Gregordbc5daf2008-11-07 20:08:42 +00002222}
2223
Douglas Gregord3b672c2012-02-16 01:06:16 +00002224bool CXXConversionDecl::isLambdaToBlockPointerConversion() const {
2225 return isImplicit() && getParent()->isLambda() &&
2226 getConversionType()->isBlockPointerType();
2227}
2228
David Blaikie68e081d2011-12-20 02:48:34 +00002229void LinkageSpecDecl::anchor() { }
2230
Chris Lattnerb8c18fa2008-11-04 16:51:42 +00002231LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C,
Mike Stump11289f42009-09-09 15:08:12 +00002232 DeclContext *DC,
Abramo Bagnaraea947882011-03-08 16:41:52 +00002233 SourceLocation ExternLoc,
2234 SourceLocation LangLoc,
Abramo Bagnara4a8cda82011-03-03 14:52:38 +00002235 LanguageIDs Lang,
Rafael Espindola327be3c2013-04-26 01:30:23 +00002236 bool HasBraces) {
Richard Smithf7981722013-11-22 09:01:48 +00002237 return new (C, DC) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, HasBraces);
Douglas Gregor29ff7d02008-12-16 22:23:02 +00002238}
Douglas Gregor889ceb72009-02-03 19:21:40 +00002239
Richard Smithf7981722013-11-22 09:01:48 +00002240LinkageSpecDecl *LinkageSpecDecl::CreateDeserialized(ASTContext &C,
2241 unsigned ID) {
Craig Topper36250ad2014-05-12 05:36:57 +00002242 return new (C, ID) LinkageSpecDecl(nullptr, SourceLocation(),
2243 SourceLocation(), lang_c, false);
Douglas Gregor72172e92012-01-05 21:55:30 +00002244}
2245
David Blaikie68e081d2011-12-20 02:48:34 +00002246void UsingDirectiveDecl::anchor() { }
2247
Douglas Gregor889ceb72009-02-03 19:21:40 +00002248UsingDirectiveDecl *UsingDirectiveDecl::Create(ASTContext &C, DeclContext *DC,
2249 SourceLocation L,
2250 SourceLocation NamespaceLoc,
Douglas Gregor12441b32011-02-25 16:33:46 +00002251 NestedNameSpecifierLoc QualifierLoc,
Douglas Gregor889ceb72009-02-03 19:21:40 +00002252 SourceLocation IdentLoc,
Sebastian Redla6602e92009-11-23 15:34:23 +00002253 NamedDecl *Used,
Douglas Gregor889ceb72009-02-03 19:21:40 +00002254 DeclContext *CommonAncestor) {
Sebastian Redla6602e92009-11-23 15:34:23 +00002255 if (NamespaceDecl *NS = dyn_cast_or_null<NamespaceDecl>(Used))
2256 Used = NS->getOriginalNamespace();
Richard Smithf7981722013-11-22 09:01:48 +00002257 return new (C, DC) UsingDirectiveDecl(DC, L, NamespaceLoc, QualifierLoc,
2258 IdentLoc, Used, CommonAncestor);
Douglas Gregor889ceb72009-02-03 19:21:40 +00002259}
2260
Richard Smithf7981722013-11-22 09:01:48 +00002261UsingDirectiveDecl *UsingDirectiveDecl::CreateDeserialized(ASTContext &C,
2262 unsigned ID) {
Craig Topper36250ad2014-05-12 05:36:57 +00002263 return new (C, ID) UsingDirectiveDecl(nullptr, SourceLocation(),
2264 SourceLocation(),
Richard Smithf7981722013-11-22 09:01:48 +00002265 NestedNameSpecifierLoc(),
Craig Topper36250ad2014-05-12 05:36:57 +00002266 SourceLocation(), nullptr, nullptr);
Douglas Gregor72172e92012-01-05 21:55:30 +00002267}
2268
Sebastian Redla6602e92009-11-23 15:34:23 +00002269NamespaceDecl *UsingDirectiveDecl::getNominatedNamespace() {
2270 if (NamespaceAliasDecl *NA =
2271 dyn_cast_or_null<NamespaceAliasDecl>(NominatedNamespace))
2272 return NA->getNamespace();
2273 return cast_or_null<NamespaceDecl>(NominatedNamespace);
2274}
2275
Richard Smith053f6c62014-05-16 23:01:30 +00002276NamespaceDecl::NamespaceDecl(ASTContext &C, DeclContext *DC, bool Inline,
2277 SourceLocation StartLoc, SourceLocation IdLoc,
2278 IdentifierInfo *Id, NamespaceDecl *PrevDecl)
2279 : NamedDecl(Namespace, DC, IdLoc, Id), DeclContext(Namespace),
2280 redeclarable_base(C), LocStart(StartLoc), RBraceLoc(),
2281 AnonOrFirstNamespaceAndInline(nullptr, Inline) {
Rafael Espindola8db352d2013-10-17 15:37:26 +00002282 setPreviousDecl(PrevDecl);
Richard Smith053f6c62014-05-16 23:01:30 +00002283
Douglas Gregore57e7522012-01-07 09:11:48 +00002284 if (PrevDecl)
2285 AnonOrFirstNamespaceAndInline.setPointer(PrevDecl->getOriginalNamespace());
2286}
2287
Douglas Gregor72172e92012-01-05 21:55:30 +00002288NamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC,
Douglas Gregore57e7522012-01-07 09:11:48 +00002289 bool Inline, SourceLocation StartLoc,
2290 SourceLocation IdLoc, IdentifierInfo *Id,
2291 NamespaceDecl *PrevDecl) {
Richard Smith053f6c62014-05-16 23:01:30 +00002292 return new (C, DC) NamespaceDecl(C, DC, Inline, StartLoc, IdLoc, Id,
2293 PrevDecl);
Douglas Gregor72172e92012-01-05 21:55:30 +00002294}
2295
2296NamespaceDecl *NamespaceDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
Richard Smith053f6c62014-05-16 23:01:30 +00002297 return new (C, ID) NamespaceDecl(C, nullptr, false, SourceLocation(),
Craig Topper36250ad2014-05-12 05:36:57 +00002298 SourceLocation(), nullptr, nullptr);
Douglas Gregor72172e92012-01-05 21:55:30 +00002299}
2300
Chandler Carruth21c90602015-12-30 03:24:14 +00002301NamespaceDecl *NamespaceDecl::getOriginalNamespace() {
2302 if (isFirstDecl())
2303 return this;
2304
2305 return AnonOrFirstNamespaceAndInline.getPointer();
2306}
2307
2308const NamespaceDecl *NamespaceDecl::getOriginalNamespace() const {
2309 if (isFirstDecl())
2310 return this;
2311
2312 return AnonOrFirstNamespaceAndInline.getPointer();
2313}
2314
2315bool NamespaceDecl::isOriginalNamespace() const { return isFirstDecl(); }
2316
Richard Smithd7af8a32014-05-10 01:17:36 +00002317NamespaceDecl *NamespaceDecl::getNextRedeclarationImpl() {
2318 return getNextRedeclaration();
Rafael Espindola8ef7f682013-11-26 15:12:20 +00002319}
2320NamespaceDecl *NamespaceDecl::getPreviousDeclImpl() {
2321 return getPreviousDecl();
2322}
2323NamespaceDecl *NamespaceDecl::getMostRecentDeclImpl() {
2324 return getMostRecentDecl();
2325}
2326
David Blaikie68e081d2011-12-20 02:48:34 +00002327void NamespaceAliasDecl::anchor() { }
2328
Richard Smithf4634362014-09-03 23:11:22 +00002329NamespaceAliasDecl *NamespaceAliasDecl::getNextRedeclarationImpl() {
2330 return getNextRedeclaration();
2331}
2332NamespaceAliasDecl *NamespaceAliasDecl::getPreviousDeclImpl() {
2333 return getPreviousDecl();
2334}
2335NamespaceAliasDecl *NamespaceAliasDecl::getMostRecentDeclImpl() {
2336 return getMostRecentDecl();
2337}
2338
Mike Stump11289f42009-09-09 15:08:12 +00002339NamespaceAliasDecl *NamespaceAliasDecl::Create(ASTContext &C, DeclContext *DC,
Douglas Gregor01a430132010-09-01 03:07:18 +00002340 SourceLocation UsingLoc,
Mike Stump11289f42009-09-09 15:08:12 +00002341 SourceLocation AliasLoc,
2342 IdentifierInfo *Alias,
Douglas Gregorc05ba2e2011-02-25 17:08:07 +00002343 NestedNameSpecifierLoc QualifierLoc,
Mike Stump11289f42009-09-09 15:08:12 +00002344 SourceLocation IdentLoc,
Anders Carlssonff25fdf2009-03-28 22:58:02 +00002345 NamedDecl *Namespace) {
Richard Smithf4634362014-09-03 23:11:22 +00002346 // FIXME: Preserve the aliased namespace as written.
Sebastian Redla6602e92009-11-23 15:34:23 +00002347 if (NamespaceDecl *NS = dyn_cast_or_null<NamespaceDecl>(Namespace))
2348 Namespace = NS->getOriginalNamespace();
Richard Smithf4634362014-09-03 23:11:22 +00002349 return new (C, DC) NamespaceAliasDecl(C, DC, UsingLoc, AliasLoc, Alias,
Richard Smithf7981722013-11-22 09:01:48 +00002350 QualifierLoc, IdentLoc, Namespace);
Anders Carlssonff25fdf2009-03-28 22:58:02 +00002351}
2352
Douglas Gregor72172e92012-01-05 21:55:30 +00002353NamespaceAliasDecl *
2354NamespaceAliasDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
Richard Smithf4634362014-09-03 23:11:22 +00002355 return new (C, ID) NamespaceAliasDecl(C, nullptr, SourceLocation(),
Craig Topper36250ad2014-05-12 05:36:57 +00002356 SourceLocation(), nullptr,
2357 NestedNameSpecifierLoc(),
2358 SourceLocation(), nullptr);
Douglas Gregor72172e92012-01-05 21:55:30 +00002359}
2360
David Blaikie68e081d2011-12-20 02:48:34 +00002361void UsingShadowDecl::anchor() { }
2362
Richard Smith5179eb72016-06-28 19:03:57 +00002363UsingShadowDecl::UsingShadowDecl(Kind K, ASTContext &C, DeclContext *DC,
2364 SourceLocation Loc, UsingDecl *Using,
2365 NamedDecl *Target)
2366 : NamedDecl(K, DC, Loc, Using ? Using->getDeclName() : DeclarationName()),
2367 redeclarable_base(C), Underlying(Target),
2368 UsingOrNextShadow(cast<NamedDecl>(Using)) {
2369 if (Target)
2370 IdentifierNamespace = Target->getIdentifierNamespace();
2371 setImplicit();
2372}
2373
2374UsingShadowDecl::UsingShadowDecl(Kind K, ASTContext &C, EmptyShell Empty)
2375 : NamedDecl(K, nullptr, SourceLocation(), DeclarationName()),
2376 redeclarable_base(C), Underlying(), UsingOrNextShadow() {}
2377
Douglas Gregor72172e92012-01-05 21:55:30 +00002378UsingShadowDecl *
2379UsingShadowDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
Richard Smith5179eb72016-06-28 19:03:57 +00002380 return new (C, ID) UsingShadowDecl(UsingShadow, C, EmptyShell());
Douglas Gregor72172e92012-01-05 21:55:30 +00002381}
2382
Argyrios Kyrtzidis2703beb2010-11-10 05:40:41 +00002383UsingDecl *UsingShadowDecl::getUsingDecl() const {
2384 const UsingShadowDecl *Shadow = this;
2385 while (const UsingShadowDecl *NextShadow =
2386 dyn_cast<UsingShadowDecl>(Shadow->UsingOrNextShadow))
2387 Shadow = NextShadow;
2388 return cast<UsingDecl>(Shadow->UsingOrNextShadow);
2389}
2390
Richard Smith5179eb72016-06-28 19:03:57 +00002391void ConstructorUsingShadowDecl::anchor() { }
2392
2393ConstructorUsingShadowDecl *
2394ConstructorUsingShadowDecl::Create(ASTContext &C, DeclContext *DC,
2395 SourceLocation Loc, UsingDecl *Using,
2396 NamedDecl *Target, bool IsVirtual) {
2397 return new (C, DC) ConstructorUsingShadowDecl(C, DC, Loc, Using, Target,
2398 IsVirtual);
2399}
2400
2401ConstructorUsingShadowDecl *
2402ConstructorUsingShadowDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2403 return new (C, ID) ConstructorUsingShadowDecl(C, EmptyShell());
2404}
2405
2406CXXRecordDecl *ConstructorUsingShadowDecl::getNominatedBaseClass() const {
2407 return getUsingDecl()->getQualifier()->getAsRecordDecl();
2408}
2409
David Blaikie68e081d2011-12-20 02:48:34 +00002410void UsingDecl::anchor() { }
2411
Argyrios Kyrtzidis2703beb2010-11-10 05:40:41 +00002412void UsingDecl::addShadowDecl(UsingShadowDecl *S) {
2413 assert(std::find(shadow_begin(), shadow_end(), S) == shadow_end() &&
2414 "declaration already in set");
2415 assert(S->getUsingDecl() == this);
2416
Benjamin Kramere78f8ee2012-01-07 19:09:05 +00002417 if (FirstUsingShadow.getPointer())
2418 S->UsingOrNextShadow = FirstUsingShadow.getPointer();
2419 FirstUsingShadow.setPointer(S);
Argyrios Kyrtzidis2703beb2010-11-10 05:40:41 +00002420}
2421
2422void UsingDecl::removeShadowDecl(UsingShadowDecl *S) {
2423 assert(std::find(shadow_begin(), shadow_end(), S) != shadow_end() &&
2424 "declaration not in set");
2425 assert(S->getUsingDecl() == this);
2426
2427 // Remove S from the shadow decl chain. This is O(n) but hopefully rare.
2428
Benjamin Kramere78f8ee2012-01-07 19:09:05 +00002429 if (FirstUsingShadow.getPointer() == S) {
2430 FirstUsingShadow.setPointer(
2431 dyn_cast<UsingShadowDecl>(S->UsingOrNextShadow));
Argyrios Kyrtzidis2703beb2010-11-10 05:40:41 +00002432 S->UsingOrNextShadow = this;
2433 return;
2434 }
2435
Benjamin Kramere78f8ee2012-01-07 19:09:05 +00002436 UsingShadowDecl *Prev = FirstUsingShadow.getPointer();
Argyrios Kyrtzidis2703beb2010-11-10 05:40:41 +00002437 while (Prev->UsingOrNextShadow != S)
2438 Prev = cast<UsingShadowDecl>(Prev->UsingOrNextShadow);
2439 Prev->UsingOrNextShadow = S->UsingOrNextShadow;
2440 S->UsingOrNextShadow = this;
2441}
2442
Douglas Gregora9d87bc2011-02-25 00:36:19 +00002443UsingDecl *UsingDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation UL,
2444 NestedNameSpecifierLoc QualifierLoc,
Abramo Bagnara8de74e92010-08-12 11:46:03 +00002445 const DeclarationNameInfo &NameInfo,
Enea Zaffanellae05a3cf2013-07-22 10:54:09 +00002446 bool HasTypename) {
Richard Smithf7981722013-11-22 09:01:48 +00002447 return new (C, DC) UsingDecl(DC, UL, QualifierLoc, NameInfo, HasTypename);
Douglas Gregorfec52632009-06-20 00:51:54 +00002448}
2449
Douglas Gregor72172e92012-01-05 21:55:30 +00002450UsingDecl *UsingDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
Craig Topper36250ad2014-05-12 05:36:57 +00002451 return new (C, ID) UsingDecl(nullptr, SourceLocation(),
2452 NestedNameSpecifierLoc(), DeclarationNameInfo(),
2453 false);
Douglas Gregor72172e92012-01-05 21:55:30 +00002454}
2455
Enea Zaffanellac70b2512013-07-17 17:28:56 +00002456SourceRange UsingDecl::getSourceRange() const {
2457 SourceLocation Begin = isAccessDeclaration()
2458 ? getQualifierLoc().getBeginLoc() : UsingLocation;
2459 return SourceRange(Begin, getNameInfo().getEndLoc());
2460}
2461
Richard Smith151c4562016-12-20 21:35:28 +00002462void UsingPackDecl::anchor() { }
2463
2464UsingPackDecl *UsingPackDecl::Create(ASTContext &C, DeclContext *DC,
2465 NamedDecl *InstantiatedFrom,
2466 ArrayRef<NamedDecl *> UsingDecls) {
2467 size_t Extra = additionalSizeToAlloc<NamedDecl *>(UsingDecls.size());
2468 return new (C, DC, Extra) UsingPackDecl(DC, InstantiatedFrom, UsingDecls);
2469}
2470
2471UsingPackDecl *UsingPackDecl::CreateDeserialized(ASTContext &C, unsigned ID,
2472 unsigned NumExpansions) {
2473 size_t Extra = additionalSizeToAlloc<NamedDecl *>(NumExpansions);
2474 auto *Result = new (C, ID, Extra) UsingPackDecl(nullptr, nullptr, None);
2475 Result->NumExpansions = NumExpansions;
2476 auto *Trail = Result->getTrailingObjects<NamedDecl *>();
2477 for (unsigned I = 0; I != NumExpansions; ++I)
2478 new (Trail + I) NamedDecl*(nullptr);
2479 return Result;
2480}
2481
David Blaikie68e081d2011-12-20 02:48:34 +00002482void UnresolvedUsingValueDecl::anchor() { }
2483
John McCalle61f2ba2009-11-18 02:36:19 +00002484UnresolvedUsingValueDecl *
2485UnresolvedUsingValueDecl::Create(ASTContext &C, DeclContext *DC,
2486 SourceLocation UsingLoc,
Douglas Gregora9d87bc2011-02-25 00:36:19 +00002487 NestedNameSpecifierLoc QualifierLoc,
Richard Smith151c4562016-12-20 21:35:28 +00002488 const DeclarationNameInfo &NameInfo,
2489 SourceLocation EllipsisLoc) {
Richard Smithf7981722013-11-22 09:01:48 +00002490 return new (C, DC) UnresolvedUsingValueDecl(DC, C.DependentTy, UsingLoc,
Richard Smith151c4562016-12-20 21:35:28 +00002491 QualifierLoc, NameInfo,
2492 EllipsisLoc);
John McCalle61f2ba2009-11-18 02:36:19 +00002493}
2494
Douglas Gregor72172e92012-01-05 21:55:30 +00002495UnresolvedUsingValueDecl *
2496UnresolvedUsingValueDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
Craig Topper36250ad2014-05-12 05:36:57 +00002497 return new (C, ID) UnresolvedUsingValueDecl(nullptr, QualType(),
2498 SourceLocation(),
Richard Smithf7981722013-11-22 09:01:48 +00002499 NestedNameSpecifierLoc(),
Richard Smith151c4562016-12-20 21:35:28 +00002500 DeclarationNameInfo(),
2501 SourceLocation());
Douglas Gregor72172e92012-01-05 21:55:30 +00002502}
2503
Enea Zaffanellac70b2512013-07-17 17:28:56 +00002504SourceRange UnresolvedUsingValueDecl::getSourceRange() const {
2505 SourceLocation Begin = isAccessDeclaration()
2506 ? getQualifierLoc().getBeginLoc() : UsingLocation;
2507 return SourceRange(Begin, getNameInfo().getEndLoc());
2508}
2509
David Blaikie68e081d2011-12-20 02:48:34 +00002510void UnresolvedUsingTypenameDecl::anchor() { }
2511
John McCalle61f2ba2009-11-18 02:36:19 +00002512UnresolvedUsingTypenameDecl *
2513UnresolvedUsingTypenameDecl::Create(ASTContext &C, DeclContext *DC,
2514 SourceLocation UsingLoc,
2515 SourceLocation TypenameLoc,
Douglas Gregora9d87bc2011-02-25 00:36:19 +00002516 NestedNameSpecifierLoc QualifierLoc,
John McCalle61f2ba2009-11-18 02:36:19 +00002517 SourceLocation TargetNameLoc,
Richard Smith151c4562016-12-20 21:35:28 +00002518 DeclarationName TargetName,
2519 SourceLocation EllipsisLoc) {
Richard Smithf7981722013-11-22 09:01:48 +00002520 return new (C, DC) UnresolvedUsingTypenameDecl(
2521 DC, UsingLoc, TypenameLoc, QualifierLoc, TargetNameLoc,
Richard Smith151c4562016-12-20 21:35:28 +00002522 TargetName.getAsIdentifierInfo(), EllipsisLoc);
Anders Carlsson8305c1f2009-08-28 05:30:28 +00002523}
2524
Douglas Gregor72172e92012-01-05 21:55:30 +00002525UnresolvedUsingTypenameDecl *
2526UnresolvedUsingTypenameDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
Richard Smithf7981722013-11-22 09:01:48 +00002527 return new (C, ID) UnresolvedUsingTypenameDecl(
Craig Topper36250ad2014-05-12 05:36:57 +00002528 nullptr, SourceLocation(), SourceLocation(), NestedNameSpecifierLoc(),
Richard Smith151c4562016-12-20 21:35:28 +00002529 SourceLocation(), nullptr, SourceLocation());
Douglas Gregor72172e92012-01-05 21:55:30 +00002530}
2531
David Blaikie68e081d2011-12-20 02:48:34 +00002532void StaticAssertDecl::anchor() { }
2533
Anders Carlsson5bbe1d72009-03-14 00:25:26 +00002534StaticAssertDecl *StaticAssertDecl::Create(ASTContext &C, DeclContext *DC,
Abramo Bagnaraea947882011-03-08 16:41:52 +00002535 SourceLocation StaticAssertLoc,
2536 Expr *AssertExpr,
2537 StringLiteral *Message,
Richard Smithded9c2e2012-07-11 22:37:56 +00002538 SourceLocation RParenLoc,
2539 bool Failed) {
Richard Smithf7981722013-11-22 09:01:48 +00002540 return new (C, DC) StaticAssertDecl(DC, StaticAssertLoc, AssertExpr, Message,
2541 RParenLoc, Failed);
Anders Carlsson5bbe1d72009-03-14 00:25:26 +00002542}
2543
Richard Smithf7981722013-11-22 09:01:48 +00002544StaticAssertDecl *StaticAssertDecl::CreateDeserialized(ASTContext &C,
Douglas Gregor72172e92012-01-05 21:55:30 +00002545 unsigned ID) {
Craig Topper36250ad2014-05-12 05:36:57 +00002546 return new (C, ID) StaticAssertDecl(nullptr, SourceLocation(), nullptr,
2547 nullptr, SourceLocation(), false);
Richard Smithf7981722013-11-22 09:01:48 +00002548}
2549
Richard Smithbdb84f32016-07-22 23:36:59 +00002550void BindingDecl::anchor() {}
2551
2552BindingDecl *BindingDecl::Create(ASTContext &C, DeclContext *DC,
2553 SourceLocation IdLoc, IdentifierInfo *Id) {
Richard Smith32cb8c92016-08-12 00:53:41 +00002554 return new (C, DC) BindingDecl(DC, IdLoc, Id);
Richard Smithbdb84f32016-07-22 23:36:59 +00002555}
2556
2557BindingDecl *BindingDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
Richard Smith32cb8c92016-08-12 00:53:41 +00002558 return new (C, ID) BindingDecl(nullptr, SourceLocation(), nullptr);
Richard Smithbdb84f32016-07-22 23:36:59 +00002559}
2560
Richard Smith97fcf4b2016-08-14 23:15:52 +00002561VarDecl *BindingDecl::getHoldingVar() const {
2562 Expr *B = getBinding();
2563 if (!B)
2564 return nullptr;
2565 auto *DRE = dyn_cast<DeclRefExpr>(B->IgnoreImplicit());
2566 if (!DRE)
2567 return nullptr;
2568
2569 auto *VD = dyn_cast<VarDecl>(DRE->getDecl());
2570 assert(VD->isImplicit() && "holding var for binding decl not implicit");
2571 return VD;
2572}
2573
Richard Smithbdb84f32016-07-22 23:36:59 +00002574void DecompositionDecl::anchor() {}
2575
2576DecompositionDecl *DecompositionDecl::Create(ASTContext &C, DeclContext *DC,
2577 SourceLocation StartLoc,
2578 SourceLocation LSquareLoc,
2579 QualType T, TypeSourceInfo *TInfo,
2580 StorageClass SC,
2581 ArrayRef<BindingDecl *> Bindings) {
2582 size_t Extra = additionalSizeToAlloc<BindingDecl *>(Bindings.size());
2583 return new (C, DC, Extra)
2584 DecompositionDecl(C, DC, StartLoc, LSquareLoc, T, TInfo, SC, Bindings);
2585}
2586
2587DecompositionDecl *DecompositionDecl::CreateDeserialized(ASTContext &C,
2588 unsigned ID,
2589 unsigned NumBindings) {
2590 size_t Extra = additionalSizeToAlloc<BindingDecl *>(NumBindings);
Richard Smith7b76d812016-08-12 02:21:25 +00002591 auto *Result = new (C, ID, Extra)
2592 DecompositionDecl(C, nullptr, SourceLocation(), SourceLocation(),
2593 QualType(), nullptr, StorageClass(), None);
Richard Smithbdb84f32016-07-22 23:36:59 +00002594 // Set up and clean out the bindings array.
2595 Result->NumBindings = NumBindings;
2596 auto *Trail = Result->getTrailingObjects<BindingDecl *>();
2597 for (unsigned I = 0; I != NumBindings; ++I)
2598 new (Trail + I) BindingDecl*(nullptr);
2599 return Result;
2600}
2601
Richard Smith7873de02016-08-11 22:25:46 +00002602void DecompositionDecl::printName(llvm::raw_ostream &os) const {
2603 os << '[';
2604 bool Comma = false;
2605 for (auto *B : bindings()) {
2606 if (Comma)
2607 os << ", ";
2608 B->printName(os);
2609 Comma = true;
2610 }
2611 os << ']';
2612}
2613
Richard Smithf7981722013-11-22 09:01:48 +00002614MSPropertyDecl *MSPropertyDecl::Create(ASTContext &C, DeclContext *DC,
2615 SourceLocation L, DeclarationName N,
2616 QualType T, TypeSourceInfo *TInfo,
2617 SourceLocation StartL,
2618 IdentifierInfo *Getter,
2619 IdentifierInfo *Setter) {
2620 return new (C, DC) MSPropertyDecl(DC, L, N, T, TInfo, StartL, Getter, Setter);
2621}
2622
2623MSPropertyDecl *MSPropertyDecl::CreateDeserialized(ASTContext &C,
2624 unsigned ID) {
Craig Topper36250ad2014-05-12 05:36:57 +00002625 return new (C, ID) MSPropertyDecl(nullptr, SourceLocation(),
2626 DeclarationName(), QualType(), nullptr,
2627 SourceLocation(), nullptr, nullptr);
Douglas Gregor72172e92012-01-05 21:55:30 +00002628}
2629
Anders Carlsson6750d162009-03-26 23:46:50 +00002630static const char *getAccessName(AccessSpecifier AS) {
2631 switch (AS) {
Anders Carlsson6750d162009-03-26 23:46:50 +00002632 case AS_none:
David Blaikie83d382b2011-09-23 05:06:16 +00002633 llvm_unreachable("Invalid access specifier!");
Anders Carlsson6750d162009-03-26 23:46:50 +00002634 case AS_public:
2635 return "public";
2636 case AS_private:
2637 return "private";
2638 case AS_protected:
2639 return "protected";
2640 }
David Blaikief47fa302012-01-17 02:30:50 +00002641 llvm_unreachable("Invalid access specifier!");
Anders Carlsson6750d162009-03-26 23:46:50 +00002642}
2643
2644const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB,
2645 AccessSpecifier AS) {
2646 return DB << getAccessName(AS);
2647}
Richard Smith84f6dcf2012-02-02 01:16:57 +00002648
2649const PartialDiagnostic &clang::operator<<(const PartialDiagnostic &DB,
2650 AccessSpecifier AS) {
2651 return DB << getAccessName(AS);
2652}