blob: 7cf7bf1017eba887f29e66a9a167f7c92201277b [file] [log] [blame]
Ted Kremenek4b7c9832008-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//===----------------------------------------------------------------------===//
13
14#include "clang/AST/DeclCXX.h"
Douglas Gregord475b8d2009-03-25 21:17:03 +000015#include "clang/AST/DeclTemplate.h"
Ted Kremenek4b7c9832008-09-05 17:16:31 +000016#include "clang/AST/ASTContext.h"
Argyrios Kyrtzidis7b903402010-10-24 17:26:36 +000017#include "clang/AST/ASTMutationListener.h"
Douglas Gregor7a39dd02010-09-29 00:15:42 +000018#include "clang/AST/CXXInheritance.h"
Anders Carlssonfb311762009-03-14 00:25:26 +000019#include "clang/AST/Expr.h"
Douglas Gregor76852c22011-11-01 01:16:03 +000020#include "clang/AST/ExprCXX.h"
Douglas Gregor802ab452009-12-02 22:36:29 +000021#include "clang/AST/TypeLoc.h"
Douglas Gregor7d7e6722008-11-12 23:21:09 +000022#include "clang/Basic/IdentifierTable.h"
Douglas Gregorfdfab6b2008-12-23 21:31:30 +000023#include "llvm/ADT/STLExtras.h"
Fariborz Jahanianfaebcbb2009-09-12 19:52:10 +000024#include "llvm/ADT/SmallPtrSet.h"
Ted Kremenek4b7c9832008-09-05 17:16:31 +000025using namespace clang;
26
27//===----------------------------------------------------------------------===//
28// Decl Allocation/Deallocation Method Implementations
29//===----------------------------------------------------------------------===//
Douglas Gregor72c3f312008-12-05 18:15:24 +000030
David Blaikie99ba9e32011-12-20 02:48:34 +000031void AccessSpecDecl::anchor() { }
32
Douglas Gregor1e68ecc2012-01-05 21:55:30 +000033AccessSpecDecl *AccessSpecDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
34 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(AccessSpecDecl));
35 return new (Mem) AccessSpecDecl(EmptyShell());
36}
37
38
John McCall86ff3082010-02-04 22:26:26 +000039CXXRecordDecl::DefinitionData::DefinitionData(CXXRecordDecl *D)
40 : UserDeclaredConstructor(false), UserDeclaredCopyConstructor(false),
Sean Huntffe37fd2011-05-25 20:50:04 +000041 UserDeclaredMoveConstructor(false), UserDeclaredCopyAssignment(false),
42 UserDeclaredMoveAssignment(false), UserDeclaredDestructor(false),
Eli Friedman97c134e2009-08-15 22:23:00 +000043 Aggregate(true), PlainOldData(true), Empty(true), Polymorphic(false),
Chandler Carruthec997dc2011-04-30 10:07:30 +000044 Abstract(false), IsStandardLayout(true), HasNoNonEmptyBases(true),
Chandler Carrutha8225442011-04-30 09:17:45 +000045 HasPrivateFields(false), HasProtectedFields(false), HasPublicFields(false),
Argyrios Kyrtzidis277b1562012-01-23 16:58:45 +000046 HasMutableFields(false), HasOnlyFields(true),
47 HasTrivialDefaultConstructor(true),
Richard Smith61802452011-12-22 02:22:31 +000048 HasConstexprNonCopyMoveConstructor(false),
49 DefaultedDefaultConstructorIsConstexpr(true),
50 DefaultedCopyConstructorIsConstexpr(true),
51 DefaultedMoveConstructorIsConstexpr(true),
52 HasConstexprDefaultConstructor(false), HasConstexprCopyConstructor(false),
53 HasConstexprMoveConstructor(false), HasTrivialCopyConstructor(true),
Sean Hunt023df372011-05-09 18:22:59 +000054 HasTrivialMoveConstructor(true), HasTrivialCopyAssignment(true),
55 HasTrivialMoveAssignment(true), HasTrivialDestructor(true),
56 HasNonLiteralTypeFieldsOrBases(false), ComputedVisibleConversions(false),
Sean Huntcdee3fe2011-05-11 22:34:38 +000057 UserProvidedDefaultConstructor(false), DeclaredDefaultConstructor(false),
Sean Huntffe37fd2011-05-25 20:50:04 +000058 DeclaredCopyConstructor(false), DeclaredMoveConstructor(false),
59 DeclaredCopyAssignment(false), DeclaredMoveAssignment(false),
Sebastian Redl85ea7aa2011-08-30 19:58:05 +000060 DeclaredDestructor(false), FailedImplicitMoveConstructor(false),
Eli Friedman72899c32012-01-07 04:59:52 +000061 FailedImplicitMoveAssignment(false), IsLambda(false), NumBases(0),
62 NumVBases(0), Bases(), VBases(), Definition(D), FirstFriend(0) {
John McCall86ff3082010-02-04 22:26:26 +000063}
64
65CXXRecordDecl::CXXRecordDecl(Kind K, TagKind TK, DeclContext *DC,
Abramo Bagnaraba877ad2011-03-09 14:09:51 +000066 SourceLocation StartLoc, SourceLocation IdLoc,
67 IdentifierInfo *Id, CXXRecordDecl *PrevDecl)
68 : RecordDecl(K, TK, DC, StartLoc, IdLoc, Id, PrevDecl),
John McCall86ff3082010-02-04 22:26:26 +000069 DefinitionData(PrevDecl ? PrevDecl->DefinitionData : 0),
Douglas Gregord475b8d2009-03-25 21:17:03 +000070 TemplateOrInstantiation() { }
Douglas Gregor7d7e6722008-11-12 23:21:09 +000071
Jay Foad4ba2a172011-01-12 09:06:06 +000072CXXRecordDecl *CXXRecordDecl::Create(const ASTContext &C, TagKind TK,
Abramo Bagnaraba877ad2011-03-09 14:09:51 +000073 DeclContext *DC, SourceLocation StartLoc,
74 SourceLocation IdLoc, IdentifierInfo *Id,
Douglas Gregoraafc0cc2009-05-15 19:11:46 +000075 CXXRecordDecl* PrevDecl,
76 bool DelayTypeCreation) {
Abramo Bagnaraba877ad2011-03-09 14:09:51 +000077 CXXRecordDecl* R = new (C) CXXRecordDecl(CXXRecord, TK, DC, StartLoc, IdLoc,
78 Id, PrevDecl);
Mike Stump1eb44332009-09-09 15:08:12 +000079
Douglas Gregor8e9e9ef2009-07-29 23:36:44 +000080 // FIXME: DelayTypeCreation seems like such a hack
Douglas Gregoraafc0cc2009-05-15 19:11:46 +000081 if (!DelayTypeCreation)
Mike Stump1eb44332009-09-09 15:08:12 +000082 C.getTypeDeclType(R, PrevDecl);
Ted Kremenek4b7c9832008-09-05 17:16:31 +000083 return R;
84}
85
Douglas Gregor1e68ecc2012-01-05 21:55:30 +000086CXXRecordDecl *
87CXXRecordDecl::CreateDeserialized(const ASTContext &C, unsigned ID) {
88 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(CXXRecordDecl));
89 return new (Mem) CXXRecordDecl(CXXRecord, TTK_Struct, 0, SourceLocation(),
90 SourceLocation(), 0, 0);
Argyrios Kyrtzidisb8b03e62010-07-02 11:54:55 +000091}
92
Mike Stump1eb44332009-09-09 15:08:12 +000093void
Douglas Gregor2d5b7032010-02-11 01:30:34 +000094CXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases,
Douglas Gregor57c856b2008-10-23 18:13:27 +000095 unsigned NumBases) {
Douglas Gregor2d5b7032010-02-11 01:30:34 +000096 ASTContext &C = getASTContext();
Douglas Gregor64bffa92008-11-05 16:20:31 +000097
Douglas Gregor7c789c12010-10-29 22:39:52 +000098 if (!data().Bases.isOffset() && data().NumBases > 0)
99 C.Deallocate(data().getBases());
Mike Stump1eb44332009-09-09 15:08:12 +0000100
Richard Smithdd677232011-10-18 20:08:55 +0000101 if (NumBases) {
102 // C++ [dcl.init.aggr]p1:
103 // An aggregate is [...] a class with [...] no base classes [...].
104 data().Aggregate = false;
105
106 // C++ [class]p4:
107 // A POD-struct is an aggregate class...
108 data().PlainOldData = false;
109 }
110
Anders Carlsson6f6de732010-03-29 05:13:12 +0000111 // The set of seen virtual base types.
Anders Carlsson1c363932010-03-29 19:49:09 +0000112 llvm::SmallPtrSet<CanQualType, 8> SeenVBaseTypes;
Anders Carlsson6f6de732010-03-29 05:13:12 +0000113
114 // The virtual bases of this class.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000115 SmallVector<const CXXBaseSpecifier *, 8> VBases;
Mike Stump1eb44332009-09-09 15:08:12 +0000116
John McCall86ff3082010-02-04 22:26:26 +0000117 data().Bases = new(C) CXXBaseSpecifier [NumBases];
118 data().NumBases = NumBases;
Fariborz Jahanian40c072f2009-07-10 20:13:23 +0000119 for (unsigned i = 0; i < NumBases; ++i) {
Douglas Gregor7c789c12010-10-29 22:39:52 +0000120 data().getBases()[i] = *Bases[i];
Fariborz Jahanian40c072f2009-07-10 20:13:23 +0000121 // Keep track of inherited vbases for this base class.
122 const CXXBaseSpecifier *Base = Bases[i];
123 QualType BaseType = Base->getType();
Douglas Gregor5fe8c042010-02-27 00:25:28 +0000124 // Skip dependent types; we can't do any checking on them now.
Fariborz Jahanian40c072f2009-07-10 20:13:23 +0000125 if (BaseType->isDependentType())
126 continue;
127 CXXRecordDecl *BaseClassDecl
Ted Kremenek6217b802009-07-29 21:53:49 +0000128 = cast<CXXRecordDecl>(BaseType->getAs<RecordType>()->getDecl());
Anders Carlsson6f6de732010-03-29 05:13:12 +0000129
Douglas Gregor2cf9d652010-09-28 20:38:10 +0000130 // A class with a non-empty base class is not empty.
131 // FIXME: Standard ref?
Chandler Carrutha8225442011-04-30 09:17:45 +0000132 if (!BaseClassDecl->isEmpty()) {
133 if (!data().Empty) {
134 // C++0x [class]p7:
135 // A standard-layout class is a class that:
136 // [...]
137 // -- either has no non-static data members in the most derived
138 // class and at most one base class with non-static data members,
139 // or has no base classes with non-static data members, and
140 // If this is the second non-empty base, then neither of these two
141 // clauses can be true.
Chandler Carruthec997dc2011-04-30 10:07:30 +0000142 data().IsStandardLayout = false;
Chandler Carrutha8225442011-04-30 09:17:45 +0000143 }
144
Douglas Gregor2cf9d652010-09-28 20:38:10 +0000145 data().Empty = false;
Chandler Carrutha8225442011-04-30 09:17:45 +0000146 data().HasNoNonEmptyBases = false;
147 }
Douglas Gregor2cf9d652010-09-28 20:38:10 +0000148
Douglas Gregor85606eb2010-09-28 20:50:54 +0000149 // C++ [class.virtual]p1:
150 // A class that declares or inherits a virtual function is called a
151 // polymorphic class.
152 if (BaseClassDecl->isPolymorphic())
153 data().Polymorphic = true;
Chandler Carruth9b6347c2011-04-24 02:49:34 +0000154
Chandler Carrutha8225442011-04-30 09:17:45 +0000155 // C++0x [class]p7:
156 // A standard-layout class is a class that: [...]
157 // -- has no non-standard-layout base classes
Chandler Carruthec997dc2011-04-30 10:07:30 +0000158 if (!BaseClassDecl->isStandardLayout())
159 data().IsStandardLayout = false;
Chandler Carrutha8225442011-04-30 09:17:45 +0000160
Chandler Carruth9b6347c2011-04-24 02:49:34 +0000161 // Record if this base is the first non-literal field or base.
162 if (!hasNonLiteralTypeFieldsOrBases() && !BaseType->isLiteralType())
163 data().HasNonLiteralTypeFieldsOrBases = true;
Douglas Gregor85606eb2010-09-28 20:50:54 +0000164
Anders Carlsson6f6de732010-03-29 05:13:12 +0000165 // Now go through all virtual bases of this base and add them.
Mike Stump1eb44332009-09-09 15:08:12 +0000166 for (CXXRecordDecl::base_class_iterator VBase =
Fariborz Jahanian40c072f2009-07-10 20:13:23 +0000167 BaseClassDecl->vbases_begin(),
168 E = BaseClassDecl->vbases_end(); VBase != E; ++VBase) {
Anders Carlsson6f6de732010-03-29 05:13:12 +0000169 // Add this base if it's not already in the list.
Anders Carlsson1c363932010-03-29 19:49:09 +0000170 if (SeenVBaseTypes.insert(C.getCanonicalType(VBase->getType())))
Anders Carlsson6f6de732010-03-29 05:13:12 +0000171 VBases.push_back(VBase);
Fariborz Jahanian40c072f2009-07-10 20:13:23 +0000172 }
Anders Carlsson6f6de732010-03-29 05:13:12 +0000173
174 if (Base->isVirtual()) {
175 // Add this base if it's not already in the list.
Anders Carlsson1c363932010-03-29 19:49:09 +0000176 if (SeenVBaseTypes.insert(C.getCanonicalType(BaseType)))
Anders Carlsson6f6de732010-03-29 05:13:12 +0000177 VBases.push_back(Base);
Douglas Gregor2cf9d652010-09-28 20:38:10 +0000178
179 // C++0x [meta.unary.prop] is_empty:
180 // T is a class type, but not a union type, with ... no virtual base
181 // classes
182 data().Empty = false;
Douglas Gregor85606eb2010-09-28 20:50:54 +0000183
184 // C++ [class.ctor]p5:
Sean Hunt023df372011-05-09 18:22:59 +0000185 // A default constructor is trivial [...] if:
186 // -- its class has [...] no virtual bases
187 data().HasTrivialDefaultConstructor = false;
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000188
189 // C++0x [class.copy]p13:
190 // A copy/move constructor for class X is trivial if it is neither
191 // user-provided nor deleted and if
192 // -- class X has no virtual functions and no virtual base classes, and
Douglas Gregor85606eb2010-09-28 20:50:54 +0000193 data().HasTrivialCopyConstructor = false;
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000194 data().HasTrivialMoveConstructor = false;
195
196 // C++0x [class.copy]p27:
197 // A copy/move assignment operator for class X is trivial if it is
198 // neither user-provided nor deleted and if
199 // -- class X has no virtual functions and no virtual base classes, and
Douglas Gregor85606eb2010-09-28 20:50:54 +0000200 data().HasTrivialCopyAssignment = false;
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000201 data().HasTrivialMoveAssignment = false;
Chandler Carrutha8225442011-04-30 09:17:45 +0000202
203 // C++0x [class]p7:
204 // A standard-layout class is a class that: [...]
205 // -- has [...] no virtual base classes
Chandler Carruthec997dc2011-04-30 10:07:30 +0000206 data().IsStandardLayout = false;
Richard Smith61802452011-12-22 02:22:31 +0000207
208 // C++11 [dcl.constexpr]p4:
209 // In the definition of a constexpr constructor [...]
210 // -- the class shall not have any virtual base classes
211 data().DefaultedDefaultConstructorIsConstexpr = false;
212 data().DefaultedCopyConstructorIsConstexpr = false;
213 data().DefaultedMoveConstructorIsConstexpr = false;
Douglas Gregor85606eb2010-09-28 20:50:54 +0000214 } else {
215 // C++ [class.ctor]p5:
Sean Hunt023df372011-05-09 18:22:59 +0000216 // A default constructor is trivial [...] if:
217 // -- all the direct base classes of its class have trivial default
218 // constructors.
219 if (!BaseClassDecl->hasTrivialDefaultConstructor())
220 data().HasTrivialDefaultConstructor = false;
Douglas Gregor85606eb2010-09-28 20:50:54 +0000221
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000222 // C++0x [class.copy]p13:
223 // A copy/move constructor for class X is trivial if [...]
224 // [...]
225 // -- the constructor selected to copy/move each direct base class
226 // subobject is trivial, and
227 // FIXME: C++0x: We need to only consider the selected constructor
228 // instead of all of them.
Douglas Gregor85606eb2010-09-28 20:50:54 +0000229 if (!BaseClassDecl->hasTrivialCopyConstructor())
230 data().HasTrivialCopyConstructor = false;
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000231 if (!BaseClassDecl->hasTrivialMoveConstructor())
232 data().HasTrivialMoveConstructor = false;
233
234 // C++0x [class.copy]p27:
235 // A copy/move assignment operator for class X is trivial if [...]
236 // [...]
237 // -- the assignment operator selected to copy/move each direct base
238 // class subobject is trivial, and
239 // FIXME: C++0x: We need to only consider the selected operator instead
240 // of all of them.
Douglas Gregor85606eb2010-09-28 20:50:54 +0000241 if (!BaseClassDecl->hasTrivialCopyAssignment())
242 data().HasTrivialCopyAssignment = false;
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000243 if (!BaseClassDecl->hasTrivialMoveAssignment())
244 data().HasTrivialMoveAssignment = false;
Richard Smith61802452011-12-22 02:22:31 +0000245
246 // C++11 [class.ctor]p6:
Richard Smithde8facc2012-01-11 18:26:05 +0000247 // If that user-written default constructor would satisfy the
Richard Smith61802452011-12-22 02:22:31 +0000248 // requirements of a constexpr constructor, the implicitly-defined
249 // default constructor is constexpr.
250 if (!BaseClassDecl->hasConstexprDefaultConstructor())
251 data().DefaultedDefaultConstructorIsConstexpr = false;
252
253 // C++11 [class.copy]p13:
254 // If the implicitly-defined constructor would satisfy the requirements
255 // of a constexpr constructor, the implicitly-defined constructor is
256 // constexpr.
257 // C++11 [dcl.constexpr]p4:
258 // -- every constructor involved in initializing [...] base class
259 // sub-objects shall be a constexpr constructor
260 if (!BaseClassDecl->hasConstexprCopyConstructor())
261 data().DefaultedCopyConstructorIsConstexpr = false;
262 if (BaseClassDecl->hasDeclaredMoveConstructor() ||
263 BaseClassDecl->needsImplicitMoveConstructor())
264 // FIXME: If the implicit move constructor generated for the base class
265 // would be ill-formed, the implicit move constructor generated for the
266 // derived class calls the base class' copy constructor.
267 data().DefaultedMoveConstructorIsConstexpr &=
Richard Smithde8facc2012-01-11 18:26:05 +0000268 BaseClassDecl->hasConstexprMoveConstructor();
Richard Smith61802452011-12-22 02:22:31 +0000269 else if (!BaseClassDecl->hasConstexprCopyConstructor())
270 data().DefaultedMoveConstructorIsConstexpr = false;
Anders Carlsson6f6de732010-03-29 05:13:12 +0000271 }
Douglas Gregor85606eb2010-09-28 20:50:54 +0000272
273 // C++ [class.ctor]p3:
274 // A destructor is trivial if all the direct base classes of its class
275 // have trivial destructors.
276 if (!BaseClassDecl->hasTrivialDestructor())
277 data().HasTrivialDestructor = false;
Douglas Gregor2bb11012011-05-13 01:05:07 +0000278
John McCallf85e1932011-06-15 23:02:42 +0000279 // A class has an Objective-C object member if... or any of its bases
280 // has an Objective-C object member.
281 if (BaseClassDecl->hasObjectMember())
282 setHasObjectMember(true);
283
Douglas Gregor2bb11012011-05-13 01:05:07 +0000284 // Keep track of the presence of mutable fields.
285 if (BaseClassDecl->hasMutableFields())
286 data().HasMutableFields = true;
Fariborz Jahanian40c072f2009-07-10 20:13:23 +0000287 }
Anders Carlsson6f6de732010-03-29 05:13:12 +0000288
289 if (VBases.empty())
290 return;
291
292 // Create base specifier for any direct or indirect virtual bases.
293 data().VBases = new (C) CXXBaseSpecifier[VBases.size()];
294 data().NumVBases = VBases.size();
Richard Smith9f8ee2e2011-07-12 23:49:11 +0000295 for (int I = 0, E = VBases.size(); I != E; ++I)
296 data().getVBases()[I] = *VBases[I];
Douglas Gregor57c856b2008-10-23 18:13:27 +0000297}
298
Douglas Gregor9edad9b2010-01-14 17:47:39 +0000299/// Callback function for CXXRecordDecl::forallBases that acknowledges
300/// that it saw a base class.
301static bool SawBase(const CXXRecordDecl *, void *) {
302 return true;
303}
304
305bool CXXRecordDecl::hasAnyDependentBases() const {
306 if (!isDependentContext())
307 return false;
308
309 return !forallBases(SawBase, 0);
310}
311
Sean Huntffe37fd2011-05-25 20:50:04 +0000312bool CXXRecordDecl::hasConstCopyConstructor() const {
313 return getCopyConstructor(Qualifiers::Const) != 0;
Fariborz Jahanian485f0872009-06-22 23:34:40 +0000314}
315
Chandler Carruthb7e95892011-04-23 10:47:28 +0000316bool CXXRecordDecl::isTriviallyCopyable() const {
317 // C++0x [class]p5:
318 // A trivially copyable class is a class that:
319 // -- has no non-trivial copy constructors,
320 if (!hasTrivialCopyConstructor()) return false;
321 // -- has no non-trivial move constructors,
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000322 if (!hasTrivialMoveConstructor()) return false;
Chandler Carruthb7e95892011-04-23 10:47:28 +0000323 // -- has no non-trivial copy assignment operators,
324 if (!hasTrivialCopyAssignment()) return false;
325 // -- has no non-trivial move assignment operators, and
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000326 if (!hasTrivialMoveAssignment()) return false;
Chandler Carruthb7e95892011-04-23 10:47:28 +0000327 // -- has a trivial destructor.
328 if (!hasTrivialDestructor()) return false;
329
330 return true;
331}
332
Douglas Gregor0d405db2010-07-01 20:59:04 +0000333/// \brief Perform a simplistic form of overload resolution that only considers
334/// cv-qualifiers on a single parameter, and return the best overload candidate
335/// (if there is one).
336static CXXMethodDecl *
337GetBestOverloadCandidateSimple(
Chris Lattner5f9e2722011-07-23 10:55:15 +0000338 const SmallVectorImpl<std::pair<CXXMethodDecl *, Qualifiers> > &Cands) {
Douglas Gregor0d405db2010-07-01 20:59:04 +0000339 if (Cands.empty())
340 return 0;
341 if (Cands.size() == 1)
342 return Cands[0].first;
343
344 unsigned Best = 0, N = Cands.size();
345 for (unsigned I = 1; I != N; ++I)
Douglas Gregor61d0b6b2011-04-28 00:56:09 +0000346 if (Cands[Best].second.compatiblyIncludes(Cands[I].second))
Douglas Gregor0d405db2010-07-01 20:59:04 +0000347 Best = I;
348
349 for (unsigned I = 1; I != N; ++I)
Douglas Gregor61d0b6b2011-04-28 00:56:09 +0000350 if (Cands[Best].second.compatiblyIncludes(Cands[I].second))
Douglas Gregor0d405db2010-07-01 20:59:04 +0000351 return 0;
352
353 return Cands[Best].first;
354}
355
Sean Huntffe37fd2011-05-25 20:50:04 +0000356CXXConstructorDecl *CXXRecordDecl::getCopyConstructor(unsigned TypeQuals) const{
357 ASTContext &Context = getASTContext();
Sebastian Redl64b45f72009-01-05 20:52:13 +0000358 QualType ClassType
359 = Context.getTypeDeclType(const_cast<CXXRecordDecl*>(this));
Mike Stump1eb44332009-09-09 15:08:12 +0000360 DeclarationName ConstructorName
Douglas Gregor9e7d9de2008-12-15 21:24:18 +0000361 = Context.DeclarationNames.getCXXConstructorName(
Fariborz Jahanian485f0872009-06-22 23:34:40 +0000362 Context.getCanonicalType(ClassType));
363 unsigned FoundTQs;
Chris Lattner5f9e2722011-07-23 10:55:15 +0000364 SmallVector<std::pair<CXXMethodDecl *, Qualifiers>, 4> Found;
Douglas Gregorfdfab6b2008-12-23 21:31:30 +0000365 DeclContext::lookup_const_iterator Con, ConEnd;
Argyrios Kyrtzidis17945a02009-06-30 02:36:12 +0000366 for (llvm::tie(Con, ConEnd) = this->lookup(ConstructorName);
Douglas Gregorfdfab6b2008-12-23 21:31:30 +0000367 Con != ConEnd; ++Con) {
Douglas Gregord93bacf2009-09-04 14:46:39 +0000368 // C++ [class.copy]p2:
369 // A non-template constructor for class X is a copy constructor if [...]
370 if (isa<FunctionTemplateDecl>(*Con))
371 continue;
372
Douglas Gregor0d405db2010-07-01 20:59:04 +0000373 CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(*Con);
374 if (Constructor->isCopyConstructor(FoundTQs)) {
John McCall0953e762009-09-24 19:53:00 +0000375 if (((TypeQuals & Qualifiers::Const) == (FoundTQs & Qualifiers::Const)) ||
376 (!(TypeQuals & Qualifiers::Const) && (FoundTQs & Qualifiers::Const)))
Douglas Gregor0d405db2010-07-01 20:59:04 +0000377 Found.push_back(std::make_pair(
378 const_cast<CXXConstructorDecl *>(Constructor),
379 Qualifiers::fromCVRMask(FoundTQs)));
Fariborz Jahanian485f0872009-06-22 23:34:40 +0000380 }
Douglas Gregor396b7cd2008-11-03 17:51:48 +0000381 }
Douglas Gregor0d405db2010-07-01 20:59:04 +0000382
383 return cast_or_null<CXXConstructorDecl>(
384 GetBestOverloadCandidateSimple(Found));
Douglas Gregor396b7cd2008-11-03 17:51:48 +0000385}
386
Sean Huntffe37fd2011-05-25 20:50:04 +0000387CXXConstructorDecl *CXXRecordDecl::getMoveConstructor() const {
388 for (ctor_iterator I = ctor_begin(), E = ctor_end(); I != E; ++I)
389 if (I->isMoveConstructor())
390 return *I;
391
392 return 0;
393}
394
Douglas Gregorb87786f2010-07-01 17:48:08 +0000395CXXMethodDecl *CXXRecordDecl::getCopyAssignmentOperator(bool ArgIsConst) const {
396 ASTContext &Context = getASTContext();
397 QualType Class = Context.getTypeDeclType(const_cast<CXXRecordDecl *>(this));
398 DeclarationName Name = Context.DeclarationNames.getCXXOperatorName(OO_Equal);
399
Chris Lattner5f9e2722011-07-23 10:55:15 +0000400 SmallVector<std::pair<CXXMethodDecl *, Qualifiers>, 4> Found;
Douglas Gregorb87786f2010-07-01 17:48:08 +0000401 DeclContext::lookup_const_iterator Op, OpEnd;
402 for (llvm::tie(Op, OpEnd) = this->lookup(Name); Op != OpEnd; ++Op) {
403 // C++ [class.copy]p9:
404 // A user-declared copy assignment operator is a non-static non-template
405 // member function of class X with exactly one parameter of type X, X&,
406 // const X&, volatile X& or const volatile X&.
407 const CXXMethodDecl* Method = dyn_cast<CXXMethodDecl>(*Op);
408 if (!Method || Method->isStatic() || Method->getPrimaryTemplate())
409 continue;
410
411 const FunctionProtoType *FnType
412 = Method->getType()->getAs<FunctionProtoType>();
413 assert(FnType && "Overloaded operator has no prototype.");
414 // Don't assert on this; an invalid decl might have been left in the AST.
415 if (FnType->getNumArgs() != 1 || FnType->isVariadic())
416 continue;
417
418 QualType ArgType = FnType->getArgType(0);
419 Qualifiers Quals;
420 if (const LValueReferenceType *Ref = ArgType->getAs<LValueReferenceType>()) {
421 ArgType = Ref->getPointeeType();
422 // If we have a const argument and we have a reference to a non-const,
423 // this function does not match.
424 if (ArgIsConst && !ArgType.isConstQualified())
425 continue;
426
427 Quals = ArgType.getQualifiers();
428 } else {
429 // By-value copy-assignment operators are treated like const X&
430 // copy-assignment operators.
431 Quals = Qualifiers::fromCVRMask(Qualifiers::Const);
432 }
433
434 if (!Context.hasSameUnqualifiedType(ArgType, Class))
435 continue;
436
437 // Save this copy-assignment operator. It might be "the one".
438 Found.push_back(std::make_pair(const_cast<CXXMethodDecl *>(Method), Quals));
439 }
440
441 // Use a simplistic form of overload resolution to find the candidate.
442 return GetBestOverloadCandidateSimple(Found);
443}
444
Sean Huntffe37fd2011-05-25 20:50:04 +0000445CXXMethodDecl *CXXRecordDecl::getMoveAssignmentOperator() const {
446 for (method_iterator I = method_begin(), E = method_end(); I != E; ++I)
447 if (I->isMoveAssignmentOperator())
448 return *I;
449
450 return 0;
451}
452
Douglas Gregor21386642010-09-28 21:55:22 +0000453void CXXRecordDecl::markedVirtualFunctionPure() {
454 // C++ [class.abstract]p2:
455 // A class is abstract if it has at least one pure virtual function.
456 data().Abstract = true;
457}
458
459void CXXRecordDecl::addedMember(Decl *D) {
Argyrios Kyrtzidis277b1562012-01-23 16:58:45 +0000460 if (!isa<FieldDecl>(D) && !isa<IndirectFieldDecl>(D) && !D->isImplicit())
461 data().HasOnlyFields = false;
462
Douglas Gregor27c08ab2010-09-27 22:06:20 +0000463 // Ignore friends and invalid declarations.
464 if (D->getFriendObjectKind() || D->isInvalidDecl())
Douglas Gregor5c0646b2010-09-27 21:17:54 +0000465 return;
466
Douglas Gregor27c08ab2010-09-27 22:06:20 +0000467 FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D);
468 if (FunTmpl)
469 D = FunTmpl->getTemplatedDecl();
470
Douglas Gregor9fe183a2010-09-28 19:45:33 +0000471 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
472 if (Method->isVirtual()) {
473 // C++ [dcl.init.aggr]p1:
474 // An aggregate is an array or a class with [...] no virtual functions.
475 data().Aggregate = false;
476
477 // C++ [class]p4:
478 // A POD-struct is an aggregate class...
479 data().PlainOldData = false;
Douglas Gregor2cf9d652010-09-28 20:38:10 +0000480
481 // Virtual functions make the class non-empty.
482 // FIXME: Standard ref?
483 data().Empty = false;
Douglas Gregor85606eb2010-09-28 20:50:54 +0000484
485 // C++ [class.virtual]p1:
486 // A class that declares or inherits a virtual function is called a
487 // polymorphic class.
488 data().Polymorphic = true;
489
Sean Hunt023df372011-05-09 18:22:59 +0000490 // C++0x [class.ctor]p5
491 // A default constructor is trivial [...] if:
492 // -- its class has no virtual functions [...]
493 data().HasTrivialDefaultConstructor = false;
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000494
495 // C++0x [class.copy]p13:
496 // A copy/move constructor for class X is trivial if [...]
497 // -- class X has no virtual functions [...]
Douglas Gregor85606eb2010-09-28 20:50:54 +0000498 data().HasTrivialCopyConstructor = false;
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000499 data().HasTrivialMoveConstructor = false;
500
501 // C++0x [class.copy]p27:
502 // A copy/move assignment operator for class X is trivial if [...]
503 // -- class X has no virtual functions [...]
Douglas Gregor85606eb2010-09-28 20:50:54 +0000504 data().HasTrivialCopyAssignment = false;
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000505 data().HasTrivialMoveAssignment = false;
Douglas Gregor45fa5602011-11-07 20:56:01 +0000506
Chandler Carrutha8225442011-04-30 09:17:45 +0000507 // C++0x [class]p7:
508 // A standard-layout class is a class that: [...]
509 // -- has no virtual functions
Chandler Carruthec997dc2011-04-30 10:07:30 +0000510 data().IsStandardLayout = false;
Douglas Gregor9fe183a2010-09-28 19:45:33 +0000511 }
512 }
513
Douglas Gregor27c08ab2010-09-27 22:06:20 +0000514 if (D->isImplicit()) {
Argyrios Kyrtzidisb6cc0e12010-10-24 17:26:54 +0000515 // Notify that an implicit member was added after the definition
516 // was completed.
517 if (!isBeingDefined())
518 if (ASTMutationListener *L = getASTMutationListener())
519 L->AddedCXXImplicitMember(data().Definition, D);
Argyrios Kyrtzidis046c03b2010-10-20 23:48:42 +0000520
Sean Huntffe37fd2011-05-25 20:50:04 +0000521 // If this is a special member function, note that it was added and then
522 // return early.
Douglas Gregor27c08ab2010-09-27 22:06:20 +0000523 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
Richard Smith61802452011-12-22 02:22:31 +0000524 if (Constructor->isDefaultConstructor()) {
Douglas Gregor27c08ab2010-09-27 22:06:20 +0000525 data().DeclaredDefaultConstructor = true;
Richard Smith61802452011-12-22 02:22:31 +0000526 if (Constructor->isConstexpr()) {
527 data().HasConstexprDefaultConstructor = true;
528 data().HasConstexprNonCopyMoveConstructor = true;
529 }
530 } else if (Constructor->isCopyConstructor()) {
Douglas Gregor27c08ab2010-09-27 22:06:20 +0000531 data().DeclaredCopyConstructor = true;
Richard Smith61802452011-12-22 02:22:31 +0000532 if (Constructor->isConstexpr())
533 data().HasConstexprCopyConstructor = true;
534 } else if (Constructor->isMoveConstructor()) {
Sean Huntffe37fd2011-05-25 20:50:04 +0000535 data().DeclaredMoveConstructor = true;
Richard Smith61802452011-12-22 02:22:31 +0000536 if (Constructor->isConstexpr())
537 data().HasConstexprMoveConstructor = true;
538 } else
Sean Huntffe37fd2011-05-25 20:50:04 +0000539 goto NotASpecialMember;
Douglas Gregor2cf9d652010-09-28 20:38:10 +0000540 return;
Sean Huntffe37fd2011-05-25 20:50:04 +0000541 } else if (isa<CXXDestructorDecl>(D)) {
Douglas Gregor0ed2e082010-09-27 22:48:58 +0000542 data().DeclaredDestructor = true;
Douglas Gregor2cf9d652010-09-28 20:38:10 +0000543 return;
Sean Huntffe37fd2011-05-25 20:50:04 +0000544 } else if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
545 if (Method->isCopyAssignmentOperator())
Douglas Gregor27c08ab2010-09-27 22:06:20 +0000546 data().DeclaredCopyAssignment = true;
Sean Huntffe37fd2011-05-25 20:50:04 +0000547 else if (Method->isMoveAssignmentOperator())
548 data().DeclaredMoveAssignment = true;
549 else
550 goto NotASpecialMember;
Douglas Gregor2cf9d652010-09-28 20:38:10 +0000551 return;
Douglas Gregor27c08ab2010-09-27 22:06:20 +0000552 }
Douglas Gregor2cf9d652010-09-28 20:38:10 +0000553
Sean Huntffe37fd2011-05-25 20:50:04 +0000554NotASpecialMember:;
Douglas Gregor2cf9d652010-09-28 20:38:10 +0000555 // Any other implicit declarations are handled like normal declarations.
Douglas Gregor27c08ab2010-09-27 22:06:20 +0000556 }
557
558 // Handle (user-declared) constructors.
559 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
560 // Note that we have a user-declared constructor.
561 data().UserDeclaredConstructor = true;
562
Richard Smith017ab772011-09-05 02:13:09 +0000563 // Technically, "user-provided" is only defined for special member
564 // functions, but the intent of the standard is clearly that it should apply
565 // to all functions.
566 bool UserProvided = Constructor->isUserProvided();
Douglas Gregor27c08ab2010-09-27 22:06:20 +0000567
Sean Hunt37b8c9e2011-05-09 21:45:35 +0000568 if (Constructor->isDefaultConstructor()) {
569 data().DeclaredDefaultConstructor = true;
Richard Smith017ab772011-09-05 02:13:09 +0000570 if (UserProvided) {
Richard Smith61802452011-12-22 02:22:31 +0000571 // C++0x [class.ctor]p5:
572 // A default constructor is trivial if it is not user-provided [...]
Sean Hunt37b8c9e2011-05-09 21:45:35 +0000573 data().HasTrivialDefaultConstructor = false;
Sean Huntcdee3fe2011-05-11 22:34:38 +0000574 data().UserProvidedDefaultConstructor = true;
Sean Hunt37b8c9e2011-05-09 21:45:35 +0000575 }
Richard Smith61802452011-12-22 02:22:31 +0000576 if (Constructor->isConstexpr()) {
577 data().HasConstexprDefaultConstructor = true;
578 data().HasConstexprNonCopyMoveConstructor = true;
579 }
Sean Hunt37b8c9e2011-05-09 21:45:35 +0000580 }
Douglas Gregor27c08ab2010-09-27 22:06:20 +0000581
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000582 // Note when we have a user-declared copy or move constructor, which will
583 // suppress the implicit declaration of those constructors.
584 if (!FunTmpl) {
585 if (Constructor->isCopyConstructor()) {
586 data().UserDeclaredCopyConstructor = true;
587 data().DeclaredCopyConstructor = true;
588
589 // C++0x [class.copy]p13:
Sean Hunt023df372011-05-09 18:22:59 +0000590 // A copy/move constructor for class X is trivial if it is not
591 // user-provided [...]
Richard Smith017ab772011-09-05 02:13:09 +0000592 if (UserProvided)
Sean Hunt023df372011-05-09 18:22:59 +0000593 data().HasTrivialCopyConstructor = false;
Richard Smith61802452011-12-22 02:22:31 +0000594
595 if (Constructor->isConstexpr())
596 data().HasConstexprCopyConstructor = true;
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000597 } else if (Constructor->isMoveConstructor()) {
Sean Huntffe37fd2011-05-25 20:50:04 +0000598 data().UserDeclaredMoveConstructor = true;
599 data().DeclaredMoveConstructor = true;
600
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000601 // C++0x [class.copy]p13:
Sean Hunt023df372011-05-09 18:22:59 +0000602 // A copy/move constructor for class X is trivial if it is not
603 // user-provided [...]
Richard Smith017ab772011-09-05 02:13:09 +0000604 if (UserProvided)
Sean Hunt023df372011-05-09 18:22:59 +0000605 data().HasTrivialMoveConstructor = false;
Richard Smith61802452011-12-22 02:22:31 +0000606
607 if (Constructor->isConstexpr())
608 data().HasConstexprMoveConstructor = true;
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000609 }
Douglas Gregor27c08ab2010-09-27 22:06:20 +0000610 }
Richard Smith6b8bc072011-08-10 18:11:37 +0000611 if (Constructor->isConstexpr() && !Constructor->isCopyOrMoveConstructor()) {
612 // Record if we see any constexpr constructors which are neither copy
Chandler Carruth9b6347c2011-04-24 02:49:34 +0000613 // nor move constructors.
Richard Smith6b8bc072011-08-10 18:11:37 +0000614 data().HasConstexprNonCopyMoveConstructor = true;
Chandler Carruth9b6347c2011-04-24 02:49:34 +0000615 }
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000616
Sean Hunt37b8c9e2011-05-09 21:45:35 +0000617 // C++ [dcl.init.aggr]p1:
618 // An aggregate is an array or a class with no user-declared
619 // constructors [...].
620 // C++0x [dcl.init.aggr]p1:
621 // An aggregate is an array or a class with no user-provided
622 // constructors [...].
623 if (!getASTContext().getLangOptions().CPlusPlus0x || UserProvided)
624 data().Aggregate = false;
625
626 // C++ [class]p4:
627 // A POD-struct is an aggregate class [...]
628 // Since the POD bit is meant to be C++03 POD-ness, clear it even if the
629 // type is technically an aggregate in C++0x since it wouldn't be in 03.
630 data().PlainOldData = false;
631
Douglas Gregor5c0646b2010-09-27 21:17:54 +0000632 return;
633 }
Douglas Gregor27c08ab2010-09-27 22:06:20 +0000634
Douglas Gregor0ed2e082010-09-27 22:48:58 +0000635 // Handle (user-declared) destructors.
Sean Huntcf34e752011-05-16 22:41:40 +0000636 if (CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(D)) {
Douglas Gregor0ed2e082010-09-27 22:48:58 +0000637 data().DeclaredDestructor = true;
638 data().UserDeclaredDestructor = true;
Douglas Gregor9fe183a2010-09-28 19:45:33 +0000639
640 // C++ [class]p4:
641 // A POD-struct is an aggregate class that has [...] no user-defined
642 // destructor.
Sean Huntcf34e752011-05-16 22:41:40 +0000643 // This bit is the C++03 POD bit, not the 0x one.
Douglas Gregor9fe183a2010-09-28 19:45:33 +0000644 data().PlainOldData = false;
645
Douglas Gregor45fa5602011-11-07 20:56:01 +0000646 // C++11 [class.dtor]p5:
647 // A destructor is trivial if it is not user-provided and if
648 // -- the destructor is not virtual.
Richard Smith61802452011-12-22 02:22:31 +0000649 if (DD->isUserProvided() || DD->isVirtual()) {
Sean Huntcf34e752011-05-16 22:41:40 +0000650 data().HasTrivialDestructor = false;
Richard Smith61802452011-12-22 02:22:31 +0000651 // C++11 [dcl.constexpr]p1:
652 // The constexpr specifier shall be applied only to [...] the
653 // declaration of a static data member of a literal type.
654 // C++11 [basic.types]p10:
655 // A type is a literal type if it is [...] a class type that [...] has
656 // a trivial destructor.
657 data().DefaultedDefaultConstructorIsConstexpr = false;
658 data().DefaultedCopyConstructorIsConstexpr = false;
659 data().DefaultedMoveConstructorIsConstexpr = false;
660 }
Douglas Gregor85606eb2010-09-28 20:50:54 +0000661
Douglas Gregor0ed2e082010-09-27 22:48:58 +0000662 return;
663 }
Douglas Gregor5c0646b2010-09-27 21:17:54 +0000664
Douglas Gregor0ed2e082010-09-27 22:48:58 +0000665 // Handle (user-declared) member functions.
Douglas Gregor27c08ab2010-09-27 22:06:20 +0000666 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
Sean Huntffe37fd2011-05-25 20:50:04 +0000667 if (Method->isCopyAssignmentOperator()) {
Douglas Gregor27c08ab2010-09-27 22:06:20 +0000668 // C++ [class]p4:
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000669 // A POD-struct is an aggregate class that [...] has no user-defined
670 // copy assignment operator [...].
Sean Huntcf34e752011-05-16 22:41:40 +0000671 // This is the C++03 bit only.
Douglas Gregor27c08ab2010-09-27 22:06:20 +0000672 data().PlainOldData = false;
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000673
Sean Huntffe37fd2011-05-25 20:50:04 +0000674 // This is a copy assignment operator.
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000675
Sean Huntffe37fd2011-05-25 20:50:04 +0000676 // Suppress the implicit declaration of a copy constructor.
677 data().UserDeclaredCopyAssignment = true;
678 data().DeclaredCopyAssignment = true;
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000679
Sean Huntffe37fd2011-05-25 20:50:04 +0000680 // C++0x [class.copy]p27:
681 // A copy/move assignment operator for class X is trivial if it is
682 // neither user-provided nor deleted [...]
683 if (Method->isUserProvided())
684 data().HasTrivialCopyAssignment = false;
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000685
Sean Huntffe37fd2011-05-25 20:50:04 +0000686 return;
687 }
688
689 if (Method->isMoveAssignmentOperator()) {
690 // This is an extension in C++03 mode, but we'll keep consistency by
691 // taking a move assignment operator to induce non-POD-ness
692 data().PlainOldData = false;
693
694 // This is a move assignment operator.
695 data().UserDeclaredMoveAssignment = true;
696 data().DeclaredMoveAssignment = true;
697
698 // C++0x [class.copy]p27:
699 // A copy/move assignment operator for class X is trivial if it is
700 // neither user-provided nor deleted [...]
701 if (Method->isUserProvided())
702 data().HasTrivialMoveAssignment = false;
Douglas Gregor27c08ab2010-09-27 22:06:20 +0000703 }
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000704
Douglas Gregore80622f2010-09-29 04:25:11 +0000705 // Keep the list of conversion functions up-to-date.
706 if (CXXConversionDecl *Conversion = dyn_cast<CXXConversionDecl>(D)) {
707 // We don't record specializations.
708 if (Conversion->getPrimaryTemplate())
709 return;
710
711 // FIXME: We intentionally don't use the decl's access here because it
712 // hasn't been set yet. That's really just a misdesign in Sema.
713
714 if (FunTmpl) {
Douglas Gregoref96ee02012-01-14 16:38:05 +0000715 if (FunTmpl->getPreviousDecl())
716 data().Conversions.replace(FunTmpl->getPreviousDecl(),
Douglas Gregore80622f2010-09-29 04:25:11 +0000717 FunTmpl);
718 else
719 data().Conversions.addDecl(FunTmpl);
720 } else {
Douglas Gregoref96ee02012-01-14 16:38:05 +0000721 if (Conversion->getPreviousDecl())
722 data().Conversions.replace(Conversion->getPreviousDecl(),
Douglas Gregore80622f2010-09-29 04:25:11 +0000723 Conversion);
724 else
725 data().Conversions.addDecl(Conversion);
726 }
727 }
728
Douglas Gregor27c08ab2010-09-27 22:06:20 +0000729 return;
Douglas Gregor1f2023a2009-07-22 18:25:24 +0000730 }
Douglas Gregor9fe183a2010-09-28 19:45:33 +0000731
732 // Handle non-static data members.
733 if (FieldDecl *Field = dyn_cast<FieldDecl>(D)) {
Douglas Gregord61db332011-10-10 17:22:13 +0000734 // C++ [class.bit]p2:
735 // A declaration for a bit-field that omits the identifier declares an
736 // unnamed bit-field. Unnamed bit-fields are not members and cannot be
737 // initialized.
738 if (Field->isUnnamedBitfield())
739 return;
740
Douglas Gregor9fe183a2010-09-28 19:45:33 +0000741 // C++ [dcl.init.aggr]p1:
742 // An aggregate is an array or a class (clause 9) with [...] no
743 // private or protected non-static data members (clause 11).
744 //
745 // A POD must be an aggregate.
746 if (D->getAccess() == AS_private || D->getAccess() == AS_protected) {
747 data().Aggregate = false;
748 data().PlainOldData = false;
749 }
Chandler Carrutha8225442011-04-30 09:17:45 +0000750
751 // C++0x [class]p7:
752 // A standard-layout class is a class that:
753 // [...]
754 // -- has the same access control for all non-static data members,
755 switch (D->getAccess()) {
756 case AS_private: data().HasPrivateFields = true; break;
757 case AS_protected: data().HasProtectedFields = true; break;
758 case AS_public: data().HasPublicFields = true; break;
David Blaikieb219cfc2011-09-23 05:06:16 +0000759 case AS_none: llvm_unreachable("Invalid access specifier");
Chandler Carrutha8225442011-04-30 09:17:45 +0000760 };
761 if ((data().HasPrivateFields + data().HasProtectedFields +
762 data().HasPublicFields) > 1)
Chandler Carruthec997dc2011-04-30 10:07:30 +0000763 data().IsStandardLayout = false;
Chandler Carrutha8225442011-04-30 09:17:45 +0000764
Douglas Gregor2bb11012011-05-13 01:05:07 +0000765 // Keep track of the presence of mutable fields.
766 if (Field->isMutable())
767 data().HasMutableFields = true;
768
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000769 // C++0x [class]p9:
Douglas Gregor9fe183a2010-09-28 19:45:33 +0000770 // A POD struct is a class that is both a trivial class and a
771 // standard-layout class, and has no non-static data members of type
772 // non-POD struct, non-POD union (or array of such types).
John McCallf85e1932011-06-15 23:02:42 +0000773 //
774 // Automatic Reference Counting: the presence of a member of Objective-C pointer type
775 // that does not explicitly have no lifetime makes the class a non-POD.
776 // However, we delay setting PlainOldData to false in this case so that
777 // Sema has a chance to diagnostic causes where the same class will be
778 // non-POD with Automatic Reference Counting but a POD without Instant Objects.
779 // In this case, the class will become a non-POD class when we complete
780 // the definition.
Douglas Gregor9fe183a2010-09-28 19:45:33 +0000781 ASTContext &Context = getASTContext();
782 QualType T = Context.getBaseElementType(Field->getType());
John McCallf85e1932011-06-15 23:02:42 +0000783 if (T->isObjCRetainableType() || T.isObjCGCStrong()) {
784 if (!Context.getLangOptions().ObjCAutoRefCount ||
785 T.getObjCLifetime() != Qualifiers::OCL_ExplicitNone)
786 setHasObjectMember(true);
787 } else if (!T.isPODType(Context))
Douglas Gregor9fe183a2010-09-28 19:45:33 +0000788 data().PlainOldData = false;
John McCallf85e1932011-06-15 23:02:42 +0000789
Chandler Carrutha8225442011-04-30 09:17:45 +0000790 if (T->isReferenceType()) {
Sean Hunt023df372011-05-09 18:22:59 +0000791 data().HasTrivialDefaultConstructor = false;
Chandler Carruth9b6347c2011-04-24 02:49:34 +0000792
Chandler Carrutha8225442011-04-30 09:17:45 +0000793 // C++0x [class]p7:
794 // A standard-layout class is a class that:
795 // -- has no non-static data members of type [...] reference,
Chandler Carruthec997dc2011-04-30 10:07:30 +0000796 data().IsStandardLayout = false;
Chandler Carrutha8225442011-04-30 09:17:45 +0000797 }
798
Chandler Carruth9b6347c2011-04-24 02:49:34 +0000799 // Record if this field is the first non-literal field or base.
Richard Smith5fa6a042011-10-12 05:08:15 +0000800 // As a slight variation on the standard, we regard mutable members as being
801 // non-literal, since mutating a constexpr variable would break C++11
802 // constant expression semantics.
803 if ((!hasNonLiteralTypeFieldsOrBases() && !T->isLiteralType()) ||
804 Field->isMutable())
Chandler Carruth9b6347c2011-04-24 02:49:34 +0000805 data().HasNonLiteralTypeFieldsOrBases = true;
806
Richard Smith7a614d82011-06-11 17:19:42 +0000807 if (Field->hasInClassInitializer()) {
808 // C++0x [class]p5:
809 // A default constructor is trivial if [...] no non-static data member
810 // of its class has a brace-or-equal-initializer.
811 data().HasTrivialDefaultConstructor = false;
812
813 // C++0x [dcl.init.aggr]p1:
814 // An aggregate is a [...] class with [...] no
815 // brace-or-equal-initializers for non-static data members.
816 data().Aggregate = false;
817
818 // C++0x [class]p10:
819 // A POD struct is [...] a trivial class.
820 data().PlainOldData = false;
821 }
822
Douglas Gregor85606eb2010-09-28 20:50:54 +0000823 if (const RecordType *RecordTy = T->getAs<RecordType>()) {
824 CXXRecordDecl* FieldRec = cast<CXXRecordDecl>(RecordTy->getDecl());
825 if (FieldRec->getDefinition()) {
Sean Hunt023df372011-05-09 18:22:59 +0000826 // C++0x [class.ctor]p5:
Richard Smith61802452011-12-22 02:22:31 +0000827 // A default constructor is trivial [...] if:
Sean Hunt023df372011-05-09 18:22:59 +0000828 // -- for all the non-static data members of its class that are of
829 // class type (or array thereof), each such class has a trivial
830 // default constructor.
831 if (!FieldRec->hasTrivialDefaultConstructor())
832 data().HasTrivialDefaultConstructor = false;
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000833
834 // C++0x [class.copy]p13:
835 // A copy/move constructor for class X is trivial if [...]
836 // [...]
837 // -- for each non-static data member of X that is of class type (or
838 // an array thereof), the constructor selected to copy/move that
839 // member is trivial;
840 // FIXME: C++0x: We don't correctly model 'selected' constructors.
Douglas Gregor85606eb2010-09-28 20:50:54 +0000841 if (!FieldRec->hasTrivialCopyConstructor())
842 data().HasTrivialCopyConstructor = false;
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000843 if (!FieldRec->hasTrivialMoveConstructor())
844 data().HasTrivialMoveConstructor = false;
845
846 // C++0x [class.copy]p27:
847 // A copy/move assignment operator for class X is trivial if [...]
848 // [...]
849 // -- for each non-static data member of X that is of class type (or
850 // an array thereof), the assignment operator selected to
851 // copy/move that member is trivial;
852 // FIXME: C++0x: We don't correctly model 'selected' operators.
Douglas Gregor85606eb2010-09-28 20:50:54 +0000853 if (!FieldRec->hasTrivialCopyAssignment())
854 data().HasTrivialCopyAssignment = false;
Chandler Carruth4d6e5a22011-04-23 23:10:33 +0000855 if (!FieldRec->hasTrivialMoveAssignment())
856 data().HasTrivialMoveAssignment = false;
857
Douglas Gregor85606eb2010-09-28 20:50:54 +0000858 if (!FieldRec->hasTrivialDestructor())
859 data().HasTrivialDestructor = false;
John McCallf85e1932011-06-15 23:02:42 +0000860 if (FieldRec->hasObjectMember())
861 setHasObjectMember(true);
Chandler Carrutha8225442011-04-30 09:17:45 +0000862
863 // C++0x [class]p7:
864 // A standard-layout class is a class that:
865 // -- has no non-static data members of type non-standard-layout
866 // class (or array of such types) [...]
Chandler Carruthec997dc2011-04-30 10:07:30 +0000867 if (!FieldRec->isStandardLayout())
868 data().IsStandardLayout = false;
Chandler Carrutha8225442011-04-30 09:17:45 +0000869
870 // C++0x [class]p7:
871 // A standard-layout class is a class that:
872 // [...]
873 // -- has no base classes of the same type as the first non-static
874 // data member.
875 // We don't want to expend bits in the state of the record decl
876 // tracking whether this is the first non-static data member so we
877 // cheat a bit and use some of the existing state: the empty bit.
878 // Virtual bases and virtual methods make a class non-empty, but they
879 // also make it non-standard-layout so we needn't check here.
880 // A non-empty base class may leave the class standard-layout, but not
881 // if we have arrived here, and have at least on non-static data
Chandler Carruthec997dc2011-04-30 10:07:30 +0000882 // member. If IsStandardLayout remains true, then the first non-static
Chandler Carrutha8225442011-04-30 09:17:45 +0000883 // data member must come through here with Empty still true, and Empty
884 // will subsequently be set to false below.
Chandler Carruthec997dc2011-04-30 10:07:30 +0000885 if (data().IsStandardLayout && data().Empty) {
Chandler Carrutha8225442011-04-30 09:17:45 +0000886 for (CXXRecordDecl::base_class_const_iterator BI = bases_begin(),
887 BE = bases_end();
888 BI != BE; ++BI) {
889 if (Context.hasSameUnqualifiedType(BI->getType(), T)) {
Chandler Carruthec997dc2011-04-30 10:07:30 +0000890 data().IsStandardLayout = false;
Chandler Carrutha8225442011-04-30 09:17:45 +0000891 break;
892 }
893 }
894 }
Douglas Gregor2bb11012011-05-13 01:05:07 +0000895
896 // Keep track of the presence of mutable fields.
897 if (FieldRec->hasMutableFields())
898 data().HasMutableFields = true;
Richard Smith61802452011-12-22 02:22:31 +0000899
900 // C++11 [class.copy]p13:
901 // If the implicitly-defined constructor would satisfy the
902 // requirements of a constexpr constructor, the implicitly-defined
903 // constructor is constexpr.
904 // C++11 [dcl.constexpr]p4:
905 // -- every constructor involved in initializing non-static data
906 // members [...] shall be a constexpr constructor
907 if (!Field->hasInClassInitializer() &&
908 !FieldRec->hasConstexprDefaultConstructor())
909 // The standard requires any in-class initializer to be a constant
910 // expression. We consider this to be a defect.
911 data().DefaultedDefaultConstructorIsConstexpr = false;
912
913 if (!FieldRec->hasConstexprCopyConstructor())
914 data().DefaultedCopyConstructorIsConstexpr = false;
915
916 if (FieldRec->hasDeclaredMoveConstructor() ||
917 FieldRec->needsImplicitMoveConstructor())
918 // FIXME: If the implicit move constructor generated for the member's
919 // class would be ill-formed, the implicit move constructor generated
920 // for this class calls the member's copy constructor.
921 data().DefaultedMoveConstructorIsConstexpr &=
922 FieldRec->hasConstexprMoveConstructor();
923 else if (!FieldRec->hasConstexprCopyConstructor())
924 data().DefaultedMoveConstructorIsConstexpr = false;
Douglas Gregor85606eb2010-09-28 20:50:54 +0000925 }
Richard Smith61802452011-12-22 02:22:31 +0000926 } else {
927 // Base element type of field is a non-class type.
928 if (!T->isLiteralType()) {
929 data().DefaultedDefaultConstructorIsConstexpr = false;
930 data().DefaultedCopyConstructorIsConstexpr = false;
931 data().DefaultedMoveConstructorIsConstexpr = false;
932 } else if (!Field->hasInClassInitializer())
933 data().DefaultedDefaultConstructorIsConstexpr = false;
Douglas Gregor85606eb2010-09-28 20:50:54 +0000934 }
Chandler Carrutha8225442011-04-30 09:17:45 +0000935
936 // C++0x [class]p7:
937 // A standard-layout class is a class that:
938 // [...]
939 // -- either has no non-static data members in the most derived
940 // class and at most one base class with non-static data members,
941 // or has no base classes with non-static data members, and
942 // At this point we know that we have a non-static data member, so the last
943 // clause holds.
944 if (!data().HasNoNonEmptyBases)
Chandler Carruthec997dc2011-04-30 10:07:30 +0000945 data().IsStandardLayout = false;
Chandler Carrutha8225442011-04-30 09:17:45 +0000946
Douglas Gregor2cf9d652010-09-28 20:38:10 +0000947 // If this is not a zero-length bit-field, then the class is not empty.
948 if (data().Empty) {
Richard Smitha6b8b2c2011-10-10 18:28:20 +0000949 if (!Field->isBitField() ||
950 (!Field->getBitWidth()->isTypeDependent() &&
951 !Field->getBitWidth()->isValueDependent() &&
952 Field->getBitWidthValue(Context) != 0))
Douglas Gregor2cf9d652010-09-28 20:38:10 +0000953 data().Empty = false;
Douglas Gregor2cf9d652010-09-28 20:38:10 +0000954 }
Douglas Gregor9fe183a2010-09-28 19:45:33 +0000955 }
Douglas Gregore80622f2010-09-29 04:25:11 +0000956
957 // Handle using declarations of conversion functions.
958 if (UsingShadowDecl *Shadow = dyn_cast<UsingShadowDecl>(D))
959 if (Shadow->getDeclName().getNameKind()
960 == DeclarationName::CXXConversionFunctionName)
961 data().Conversions.addDecl(Shadow, Shadow->getAccess());
Douglas Gregor030ff0c2008-10-31 20:25:05 +0000962}
963
Argyrios Kyrtzidis277b1562012-01-23 16:58:45 +0000964bool CXXRecordDecl::isCLike() const {
965 if (getTagKind() == TTK_Class || !TemplateOrInstantiation.isNull())
966 return false;
967 if (!hasDefinition())
968 return true;
969
970 return data().HasOnlyFields &&
971 !data().HasPrivateFields &&
972 !data().HasProtectedFields &&
973 !data().NumBases;
974}
975
John McCallb05b5f32010-03-15 09:07:48 +0000976static CanQualType GetConversionType(ASTContext &Context, NamedDecl *Conv) {
977 QualType T;
John McCall32daa422010-03-31 01:36:47 +0000978 if (isa<UsingShadowDecl>(Conv))
979 Conv = cast<UsingShadowDecl>(Conv)->getTargetDecl();
John McCallb05b5f32010-03-15 09:07:48 +0000980 if (FunctionTemplateDecl *ConvTemp = dyn_cast<FunctionTemplateDecl>(Conv))
981 T = ConvTemp->getTemplatedDecl()->getResultType();
982 else
983 T = cast<CXXConversionDecl>(Conv)->getConversionType();
984 return Context.getCanonicalType(T);
Fariborz Jahanian0351a1e2009-10-07 20:43:36 +0000985}
986
John McCallb05b5f32010-03-15 09:07:48 +0000987/// Collect the visible conversions of a base class.
988///
989/// \param Base a base class of the class we're considering
990/// \param InVirtual whether this base class is a virtual base (or a base
991/// of a virtual base)
992/// \param Access the access along the inheritance path to this base
993/// \param ParentHiddenTypes the conversions provided by the inheritors
994/// of this base
995/// \param Output the set to which to add conversions from non-virtual bases
996/// \param VOutput the set to which to add conversions from virtual bases
997/// \param HiddenVBaseCs the set of conversions which were hidden in a
998/// virtual base along some inheritance path
999static void CollectVisibleConversions(ASTContext &Context,
1000 CXXRecordDecl *Record,
1001 bool InVirtual,
1002 AccessSpecifier Access,
1003 const llvm::SmallPtrSet<CanQualType, 8> &ParentHiddenTypes,
1004 UnresolvedSetImpl &Output,
1005 UnresolvedSetImpl &VOutput,
1006 llvm::SmallPtrSet<NamedDecl*, 8> &HiddenVBaseCs) {
1007 // The set of types which have conversions in this class or its
1008 // subclasses. As an optimization, we don't copy the derived set
1009 // unless it might change.
1010 const llvm::SmallPtrSet<CanQualType, 8> *HiddenTypes = &ParentHiddenTypes;
1011 llvm::SmallPtrSet<CanQualType, 8> HiddenTypesBuffer;
1012
1013 // Collect the direct conversions and figure out which conversions
1014 // will be hidden in the subclasses.
1015 UnresolvedSetImpl &Cs = *Record->getConversionFunctions();
1016 if (!Cs.empty()) {
1017 HiddenTypesBuffer = ParentHiddenTypes;
1018 HiddenTypes = &HiddenTypesBuffer;
1019
1020 for (UnresolvedSetIterator I = Cs.begin(), E = Cs.end(); I != E; ++I) {
1021 bool Hidden =
1022 !HiddenTypesBuffer.insert(GetConversionType(Context, I.getDecl()));
1023
1024 // If this conversion is hidden and we're in a virtual base,
1025 // remember that it's hidden along some inheritance path.
1026 if (Hidden && InVirtual)
1027 HiddenVBaseCs.insert(cast<NamedDecl>(I.getDecl()->getCanonicalDecl()));
1028
1029 // If this conversion isn't hidden, add it to the appropriate output.
1030 else if (!Hidden) {
1031 AccessSpecifier IAccess
1032 = CXXRecordDecl::MergeAccess(Access, I.getAccess());
1033
1034 if (InVirtual)
1035 VOutput.addDecl(I.getDecl(), IAccess);
Fariborz Jahanian62509212009-09-12 18:26:03 +00001036 else
John McCallb05b5f32010-03-15 09:07:48 +00001037 Output.addDecl(I.getDecl(), IAccess);
Fariborz Jahanian53462782009-09-11 21:44:33 +00001038 }
1039 }
1040 }
Sebastian Redl9994a342009-10-25 17:03:50 +00001041
John McCallb05b5f32010-03-15 09:07:48 +00001042 // Collect information recursively from any base classes.
1043 for (CXXRecordDecl::base_class_iterator
1044 I = Record->bases_begin(), E = Record->bases_end(); I != E; ++I) {
1045 const RecordType *RT = I->getType()->getAs<RecordType>();
1046 if (!RT) continue;
Sebastian Redl9994a342009-10-25 17:03:50 +00001047
John McCallb05b5f32010-03-15 09:07:48 +00001048 AccessSpecifier BaseAccess
1049 = CXXRecordDecl::MergeAccess(Access, I->getAccessSpecifier());
1050 bool BaseInVirtual = InVirtual || I->isVirtual();
Sebastian Redl9994a342009-10-25 17:03:50 +00001051
John McCallb05b5f32010-03-15 09:07:48 +00001052 CXXRecordDecl *Base = cast<CXXRecordDecl>(RT->getDecl());
1053 CollectVisibleConversions(Context, Base, BaseInVirtual, BaseAccess,
1054 *HiddenTypes, Output, VOutput, HiddenVBaseCs);
Fariborz Jahanian53462782009-09-11 21:44:33 +00001055 }
John McCallb05b5f32010-03-15 09:07:48 +00001056}
Sebastian Redl9994a342009-10-25 17:03:50 +00001057
John McCallb05b5f32010-03-15 09:07:48 +00001058/// Collect the visible conversions of a class.
1059///
1060/// This would be extremely straightforward if it weren't for virtual
1061/// bases. It might be worth special-casing that, really.
1062static void CollectVisibleConversions(ASTContext &Context,
1063 CXXRecordDecl *Record,
1064 UnresolvedSetImpl &Output) {
1065 // The collection of all conversions in virtual bases that we've
1066 // found. These will be added to the output as long as they don't
1067 // appear in the hidden-conversions set.
1068 UnresolvedSet<8> VBaseCs;
1069
1070 // The set of conversions in virtual bases that we've determined to
1071 // be hidden.
1072 llvm::SmallPtrSet<NamedDecl*, 8> HiddenVBaseCs;
1073
1074 // The set of types hidden by classes derived from this one.
1075 llvm::SmallPtrSet<CanQualType, 8> HiddenTypes;
1076
1077 // Go ahead and collect the direct conversions and add them to the
1078 // hidden-types set.
1079 UnresolvedSetImpl &Cs = *Record->getConversionFunctions();
1080 Output.append(Cs.begin(), Cs.end());
1081 for (UnresolvedSetIterator I = Cs.begin(), E = Cs.end(); I != E; ++I)
1082 HiddenTypes.insert(GetConversionType(Context, I.getDecl()));
1083
1084 // Recursively collect conversions from base classes.
1085 for (CXXRecordDecl::base_class_iterator
1086 I = Record->bases_begin(), E = Record->bases_end(); I != E; ++I) {
1087 const RecordType *RT = I->getType()->getAs<RecordType>();
1088 if (!RT) continue;
1089
1090 CollectVisibleConversions(Context, cast<CXXRecordDecl>(RT->getDecl()),
1091 I->isVirtual(), I->getAccessSpecifier(),
1092 HiddenTypes, Output, VBaseCs, HiddenVBaseCs);
1093 }
1094
1095 // Add any unhidden conversions provided by virtual bases.
1096 for (UnresolvedSetIterator I = VBaseCs.begin(), E = VBaseCs.end();
1097 I != E; ++I) {
1098 if (!HiddenVBaseCs.count(cast<NamedDecl>(I.getDecl()->getCanonicalDecl())))
1099 Output.addDecl(I.getDecl(), I.getAccess());
Fariborz Jahanian53462782009-09-11 21:44:33 +00001100 }
Fariborz Jahanian62509212009-09-12 18:26:03 +00001101}
1102
1103/// getVisibleConversionFunctions - get all conversion functions visible
1104/// in current class; including conversion function templates.
John McCalleec51cf2010-01-20 00:46:10 +00001105const UnresolvedSetImpl *CXXRecordDecl::getVisibleConversionFunctions() {
Fariborz Jahanian62509212009-09-12 18:26:03 +00001106 // If root class, all conversions are visible.
1107 if (bases_begin() == bases_end())
John McCall86ff3082010-02-04 22:26:26 +00001108 return &data().Conversions;
Fariborz Jahanian62509212009-09-12 18:26:03 +00001109 // If visible conversion list is already evaluated, return it.
John McCall86ff3082010-02-04 22:26:26 +00001110 if (data().ComputedVisibleConversions)
1111 return &data().VisibleConversions;
John McCallb05b5f32010-03-15 09:07:48 +00001112 CollectVisibleConversions(getASTContext(), this, data().VisibleConversions);
John McCall86ff3082010-02-04 22:26:26 +00001113 data().ComputedVisibleConversions = true;
1114 return &data().VisibleConversions;
Fariborz Jahanian53462782009-09-11 21:44:33 +00001115}
1116
John McCall32daa422010-03-31 01:36:47 +00001117void CXXRecordDecl::removeConversion(const NamedDecl *ConvDecl) {
1118 // This operation is O(N) but extremely rare. Sema only uses it to
1119 // remove UsingShadowDecls in a class that were followed by a direct
1120 // declaration, e.g.:
1121 // class A : B {
1122 // using B::operator int;
1123 // operator int();
1124 // };
1125 // This is uncommon by itself and even more uncommon in conjunction
1126 // with sufficiently large numbers of directly-declared conversions
1127 // that asymptotic behavior matters.
1128
1129 UnresolvedSetImpl &Convs = *getConversionFunctions();
1130 for (unsigned I = 0, E = Convs.size(); I != E; ++I) {
1131 if (Convs[I].getDecl() == ConvDecl) {
1132 Convs.erase(I);
1133 assert(std::find(Convs.begin(), Convs.end(), ConvDecl) == Convs.end()
1134 && "conversion was found multiple times in unresolved set");
1135 return;
1136 }
1137 }
1138
1139 llvm_unreachable("conversion not found in set!");
Douglas Gregor65ec1fd2009-08-21 23:19:43 +00001140}
Fariborz Jahanianf8dcb862009-06-19 19:55:27 +00001141
Douglas Gregorf6b11852009-10-08 15:14:33 +00001142CXXRecordDecl *CXXRecordDecl::getInstantiatedFromMemberClass() const {
Douglas Gregorb3ae4fc2009-10-12 20:18:28 +00001143 if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo())
Douglas Gregorf6b11852009-10-08 15:14:33 +00001144 return cast<CXXRecordDecl>(MSInfo->getInstantiatedFrom());
1145
1146 return 0;
1147}
1148
Douglas Gregorb3ae4fc2009-10-12 20:18:28 +00001149MemberSpecializationInfo *CXXRecordDecl::getMemberSpecializationInfo() const {
1150 return TemplateOrInstantiation.dyn_cast<MemberSpecializationInfo *>();
1151}
1152
Douglas Gregorf6b11852009-10-08 15:14:33 +00001153void
1154CXXRecordDecl::setInstantiationOfMemberClass(CXXRecordDecl *RD,
1155 TemplateSpecializationKind TSK) {
1156 assert(TemplateOrInstantiation.isNull() &&
1157 "Previous template or instantiation?");
1158 assert(!isa<ClassTemplateSpecializationDecl>(this));
1159 TemplateOrInstantiation
1160 = new (getASTContext()) MemberSpecializationInfo(RD, TSK);
1161}
1162
Anders Carlssonb13e3572009-12-07 06:33:48 +00001163TemplateSpecializationKind CXXRecordDecl::getTemplateSpecializationKind() const{
1164 if (const ClassTemplateSpecializationDecl *Spec
Douglas Gregorf6b11852009-10-08 15:14:33 +00001165 = dyn_cast<ClassTemplateSpecializationDecl>(this))
1166 return Spec->getSpecializationKind();
1167
Douglas Gregorb3ae4fc2009-10-12 20:18:28 +00001168 if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo())
Douglas Gregorf6b11852009-10-08 15:14:33 +00001169 return MSInfo->getTemplateSpecializationKind();
1170
1171 return TSK_Undeclared;
1172}
1173
1174void
1175CXXRecordDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK) {
1176 if (ClassTemplateSpecializationDecl *Spec
1177 = dyn_cast<ClassTemplateSpecializationDecl>(this)) {
1178 Spec->setSpecializationKind(TSK);
1179 return;
1180 }
1181
Douglas Gregorb3ae4fc2009-10-12 20:18:28 +00001182 if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) {
Douglas Gregorf6b11852009-10-08 15:14:33 +00001183 MSInfo->setTemplateSpecializationKind(TSK);
1184 return;
1185 }
1186
David Blaikieb219cfc2011-09-23 05:06:16 +00001187 llvm_unreachable("Not a class template or member class specialization");
Douglas Gregorf6b11852009-10-08 15:14:33 +00001188}
1189
Douglas Gregor1d110e02010-07-01 14:13:13 +00001190CXXDestructorDecl *CXXRecordDecl::getDestructor() const {
1191 ASTContext &Context = getASTContext();
Anders Carlsson7267c162009-05-29 21:03:38 +00001192 QualType ClassType = Context.getTypeDeclType(this);
Mike Stump1eb44332009-09-09 15:08:12 +00001193
1194 DeclarationName Name
Douglas Gregor50d62d12009-08-05 05:36:45 +00001195 = Context.DeclarationNames.getCXXDestructorName(
1196 Context.getCanonicalType(ClassType));
Anders Carlsson7267c162009-05-29 21:03:38 +00001197
John McCallc0bf4622010-02-23 00:48:20 +00001198 DeclContext::lookup_const_iterator I, E;
Mike Stump1eb44332009-09-09 15:08:12 +00001199 llvm::tie(I, E) = lookup(Name);
Sebastian Redld4b25cb2010-09-02 23:19:42 +00001200 if (I == E)
1201 return 0;
Mike Stump1eb44332009-09-09 15:08:12 +00001202
Anders Carlsson5ec02ae2009-12-02 17:15:43 +00001203 CXXDestructorDecl *Dtor = cast<CXXDestructorDecl>(*I);
Anders Carlsson7267c162009-05-29 21:03:38 +00001204 return Dtor;
1205}
1206
Douglas Gregorda2142f2011-02-19 18:51:44 +00001207void CXXRecordDecl::completeDefinition() {
1208 completeDefinition(0);
1209}
1210
1211void CXXRecordDecl::completeDefinition(CXXFinalOverriderMap *FinalOverriders) {
1212 RecordDecl::completeDefinition();
1213
John McCallf85e1932011-06-15 23:02:42 +00001214 if (hasObjectMember() && getASTContext().getLangOptions().ObjCAutoRefCount) {
1215 // Objective-C Automatic Reference Counting:
1216 // If a class has a non-static data member of Objective-C pointer
1217 // type (or array thereof), it is a non-POD type and its
1218 // default constructor (if any), copy constructor, copy assignment
1219 // operator, and destructor are non-trivial.
1220 struct DefinitionData &Data = data();
1221 Data.PlainOldData = false;
1222 Data.HasTrivialDefaultConstructor = false;
1223 Data.HasTrivialCopyConstructor = false;
1224 Data.HasTrivialCopyAssignment = false;
1225 Data.HasTrivialDestructor = false;
1226 }
1227
Douglas Gregor7a39dd02010-09-29 00:15:42 +00001228 // If the class may be abstract (but hasn't been marked as such), check for
1229 // any pure final overriders.
1230 if (mayBeAbstract()) {
1231 CXXFinalOverriderMap MyFinalOverriders;
1232 if (!FinalOverriders) {
1233 getFinalOverriders(MyFinalOverriders);
1234 FinalOverriders = &MyFinalOverriders;
1235 }
1236
1237 bool Done = false;
1238 for (CXXFinalOverriderMap::iterator M = FinalOverriders->begin(),
1239 MEnd = FinalOverriders->end();
1240 M != MEnd && !Done; ++M) {
1241 for (OverridingMethods::iterator SO = M->second.begin(),
1242 SOEnd = M->second.end();
1243 SO != SOEnd && !Done; ++SO) {
1244 assert(SO->second.size() > 0 &&
1245 "All virtual functions have overridding virtual functions");
1246
1247 // C++ [class.abstract]p4:
1248 // A class is abstract if it contains or inherits at least one
1249 // pure virtual function for which the final overrider is pure
1250 // virtual.
1251 if (SO->second.front().Method->isPure()) {
1252 data().Abstract = true;
1253 Done = true;
1254 break;
1255 }
1256 }
1257 }
1258 }
Douglas Gregore80622f2010-09-29 04:25:11 +00001259
1260 // Set access bits correctly on the directly-declared conversions.
1261 for (UnresolvedSetIterator I = data().Conversions.begin(),
1262 E = data().Conversions.end();
1263 I != E; ++I)
1264 data().Conversions.setAccess(I, (*I)->getAccess());
Douglas Gregor7a39dd02010-09-29 00:15:42 +00001265}
1266
1267bool CXXRecordDecl::mayBeAbstract() const {
1268 if (data().Abstract || isInvalidDecl() || !data().Polymorphic ||
1269 isDependentContext())
1270 return false;
1271
1272 for (CXXRecordDecl::base_class_const_iterator B = bases_begin(),
1273 BEnd = bases_end();
1274 B != BEnd; ++B) {
1275 CXXRecordDecl *BaseDecl
1276 = cast<CXXRecordDecl>(B->getType()->getAs<RecordType>()->getDecl());
1277 if (BaseDecl->isAbstract())
1278 return true;
1279 }
1280
1281 return false;
1282}
1283
David Blaikie99ba9e32011-12-20 02:48:34 +00001284void CXXMethodDecl::anchor() { }
1285
Ted Kremenek4b7c9832008-09-05 17:16:31 +00001286CXXMethodDecl *
1287CXXMethodDecl::Create(ASTContext &C, CXXRecordDecl *RD,
Abramo Bagnaraff676cb2011-03-08 08:55:46 +00001288 SourceLocation StartLoc,
Abramo Bagnara25777432010-08-11 22:01:17 +00001289 const DeclarationNameInfo &NameInfo,
John McCalla93c9342009-12-07 02:54:59 +00001290 QualType T, TypeSourceInfo *TInfo,
Douglas Gregorf5251602011-03-08 17:10:18 +00001291 bool isStatic, StorageClass SCAsWritten, bool isInline,
Richard Smithaf1fc7a2011-08-15 21:04:07 +00001292 bool isConstexpr, SourceLocation EndLocation) {
Abramo Bagnaraff676cb2011-03-08 08:55:46 +00001293 return new (C) CXXMethodDecl(CXXMethod, RD, StartLoc, NameInfo, T, TInfo,
Richard Smithaf1fc7a2011-08-15 21:04:07 +00001294 isStatic, SCAsWritten, isInline, isConstexpr,
1295 EndLocation);
Ted Kremenek4b7c9832008-09-05 17:16:31 +00001296}
1297
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001298CXXMethodDecl *CXXMethodDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1299 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(CXXMethodDecl));
1300 return new (Mem) CXXMethodDecl(CXXMethod, 0, SourceLocation(),
1301 DeclarationNameInfo(), QualType(),
1302 0, false, SC_None, false, false,
1303 SourceLocation());
1304}
1305
Douglas Gregor90916562009-09-29 18:16:17 +00001306bool CXXMethodDecl::isUsualDeallocationFunction() const {
1307 if (getOverloadedOperator() != OO_Delete &&
1308 getOverloadedOperator() != OO_Array_Delete)
1309 return false;
Douglas Gregor6d908702010-02-26 05:06:18 +00001310
1311 // C++ [basic.stc.dynamic.deallocation]p2:
1312 // A template instance is never a usual deallocation function,
1313 // regardless of its signature.
1314 if (getPrimaryTemplate())
1315 return false;
1316
Douglas Gregor90916562009-09-29 18:16:17 +00001317 // C++ [basic.stc.dynamic.deallocation]p2:
1318 // If a class T has a member deallocation function named operator delete
1319 // with exactly one parameter, then that function is a usual (non-placement)
1320 // deallocation function. [...]
1321 if (getNumParams() == 1)
1322 return true;
1323
1324 // C++ [basic.stc.dynamic.deallocation]p2:
1325 // [...] If class T does not declare such an operator delete but does
1326 // declare a member deallocation function named operator delete with
1327 // exactly two parameters, the second of which has type std::size_t (18.1),
1328 // then this function is a usual deallocation function.
1329 ASTContext &Context = getASTContext();
1330 if (getNumParams() != 2 ||
Chandler Carruthe228ba92010-02-08 18:54:05 +00001331 !Context.hasSameUnqualifiedType(getParamDecl(1)->getType(),
1332 Context.getSizeType()))
Douglas Gregor90916562009-09-29 18:16:17 +00001333 return false;
1334
1335 // This function is a usual deallocation function if there are no
1336 // single-parameter deallocation functions of the same kind.
1337 for (DeclContext::lookup_const_result R = getDeclContext()->lookup(getDeclName());
1338 R.first != R.second; ++R.first) {
1339 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*R.first))
1340 if (FD->getNumParams() == 1)
1341 return false;
1342 }
1343
1344 return true;
1345}
1346
Douglas Gregor06a9f362010-05-01 20:49:11 +00001347bool CXXMethodDecl::isCopyAssignmentOperator() const {
Sean Huntffe37fd2011-05-25 20:50:04 +00001348 // C++0x [class.copy]p17:
Douglas Gregor06a9f362010-05-01 20:49:11 +00001349 // A user-declared copy assignment operator X::operator= is a non-static
1350 // non-template member function of class X with exactly one parameter of
1351 // type X, X&, const X&, volatile X& or const volatile X&.
1352 if (/*operator=*/getOverloadedOperator() != OO_Equal ||
1353 /*non-static*/ isStatic() ||
Sean Huntffe37fd2011-05-25 20:50:04 +00001354 /*non-template*/getPrimaryTemplate() || getDescribedFunctionTemplate())
Douglas Gregor06a9f362010-05-01 20:49:11 +00001355 return false;
1356
1357 QualType ParamType = getParamDecl(0)->getType();
1358 if (const LValueReferenceType *Ref = ParamType->getAs<LValueReferenceType>())
1359 ParamType = Ref->getPointeeType();
1360
1361 ASTContext &Context = getASTContext();
1362 QualType ClassType
1363 = Context.getCanonicalType(Context.getTypeDeclType(getParent()));
1364 return Context.hasSameUnqualifiedType(ClassType, ParamType);
1365}
1366
Sean Huntffe37fd2011-05-25 20:50:04 +00001367bool CXXMethodDecl::isMoveAssignmentOperator() const {
1368 // C++0x [class.copy]p19:
1369 // A user-declared move assignment operator X::operator= is a non-static
1370 // non-template member function of class X with exactly one parameter of type
1371 // X&&, const X&&, volatile X&&, or const volatile X&&.
1372 if (getOverloadedOperator() != OO_Equal || isStatic() ||
1373 getPrimaryTemplate() || getDescribedFunctionTemplate())
1374 return false;
1375
1376 QualType ParamType = getParamDecl(0)->getType();
1377 if (!isa<RValueReferenceType>(ParamType))
1378 return false;
1379 ParamType = ParamType->getPointeeType();
1380
1381 ASTContext &Context = getASTContext();
1382 QualType ClassType
1383 = Context.getCanonicalType(Context.getTypeDeclType(getParent()));
1384 return Context.hasSameUnqualifiedType(ClassType, ParamType);
1385}
1386
Anders Carlsson05eb2442009-05-16 23:58:37 +00001387void CXXMethodDecl::addOverriddenMethod(const CXXMethodDecl *MD) {
Anders Carlsson3aaf4862009-12-04 05:51:56 +00001388 assert(MD->isCanonicalDecl() && "Method is not canonical!");
Anders Carlssonc076c452010-01-30 17:42:34 +00001389 assert(!MD->getParent()->isDependentContext() &&
1390 "Can't add an overridden method to a class template!");
1391
Douglas Gregor7d10b7e2010-03-02 23:58:15 +00001392 getASTContext().addOverriddenMethod(this, MD);
Anders Carlsson05eb2442009-05-16 23:58:37 +00001393}
1394
1395CXXMethodDecl::method_iterator CXXMethodDecl::begin_overridden_methods() const {
Douglas Gregor7d10b7e2010-03-02 23:58:15 +00001396 return getASTContext().overridden_methods_begin(this);
Anders Carlsson05eb2442009-05-16 23:58:37 +00001397}
1398
1399CXXMethodDecl::method_iterator CXXMethodDecl::end_overridden_methods() const {
Douglas Gregor7d10b7e2010-03-02 23:58:15 +00001400 return getASTContext().overridden_methods_end(this);
Anders Carlsson05eb2442009-05-16 23:58:37 +00001401}
1402
Argyrios Kyrtzidisc91e9f42010-07-04 21:44:35 +00001403unsigned CXXMethodDecl::size_overridden_methods() const {
1404 return getASTContext().overridden_methods_size(this);
1405}
1406
Ted Kremenek4b7c9832008-09-05 17:16:31 +00001407QualType CXXMethodDecl::getThisType(ASTContext &C) const {
Argyrios Kyrtzidisb0d178d2008-10-24 22:28:18 +00001408 // C++ 9.3.2p1: The type of this in a member function of a class X is X*.
1409 // If the member function is declared const, the type of this is const X*,
1410 // if the member function is declared volatile, the type of this is
1411 // volatile X*, and if the member function is declared const volatile,
1412 // the type of this is const volatile X*.
1413
Ted Kremenek4b7c9832008-09-05 17:16:31 +00001414 assert(isInstance() && "No 'this' for static methods!");
Anders Carlsson31a08752009-06-13 02:59:33 +00001415
John McCall3cb0ebd2010-03-10 03:28:59 +00001416 QualType ClassTy = C.getTypeDeclType(getParent());
John McCall0953e762009-09-24 19:53:00 +00001417 ClassTy = C.getQualifiedType(ClassTy,
1418 Qualifiers::fromCVRMask(getTypeQualifiers()));
Anders Carlsson4e579922009-07-10 21:35:09 +00001419 return C.getPointerType(ClassTy);
Ted Kremenek4b7c9832008-09-05 17:16:31 +00001420}
1421
Eli Friedmand7d7f672009-12-06 20:50:05 +00001422bool CXXMethodDecl::hasInlineBody() const {
Douglas Gregorbd6d6192010-01-05 19:06:31 +00001423 // If this function is a template instantiation, look at the template from
1424 // which it was instantiated.
1425 const FunctionDecl *CheckFn = getTemplateInstantiationPattern();
1426 if (!CheckFn)
1427 CheckFn = this;
1428
Eli Friedmand7d7f672009-12-06 20:50:05 +00001429 const FunctionDecl *fn;
Argyrios Kyrtzidis06a54a32010-07-07 11:31:19 +00001430 return CheckFn->hasBody(fn) && !fn->isOutOfLine();
Eli Friedmand7d7f672009-12-06 20:50:05 +00001431}
1432
Sean Huntcbb67482011-01-08 20:30:50 +00001433CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
1434 TypeSourceInfo *TInfo, bool IsVirtual,
1435 SourceLocation L, Expr *Init,
1436 SourceLocation R,
1437 SourceLocation EllipsisLoc)
Sean Huntf51d0b62011-01-08 23:01:16 +00001438 : Initializee(TInfo), MemberOrEllipsisLocation(EllipsisLoc), Init(Init),
Douglas Gregor76852c22011-11-01 01:16:03 +00001439 LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(IsVirtual),
1440 IsWritten(false), SourceOrderOrNumArrayIndices(0)
Douglas Gregor802ab452009-12-02 22:36:29 +00001441{
Douglas Gregor7ad83902008-11-05 04:29:56 +00001442}
1443
Sean Huntcbb67482011-01-08 20:30:50 +00001444CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
1445 FieldDecl *Member,
1446 SourceLocation MemberLoc,
1447 SourceLocation L, Expr *Init,
1448 SourceLocation R)
Sean Huntf51d0b62011-01-08 23:01:16 +00001449 : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init),
Douglas Gregor76852c22011-11-01 01:16:03 +00001450 LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
Francois Pichet00eb3f92010-12-04 09:14:42 +00001451 IsWritten(false), SourceOrderOrNumArrayIndices(0)
1452{
1453}
1454
Sean Huntcbb67482011-01-08 20:30:50 +00001455CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
1456 IndirectFieldDecl *Member,
1457 SourceLocation MemberLoc,
1458 SourceLocation L, Expr *Init,
1459 SourceLocation R)
Sean Huntf51d0b62011-01-08 23:01:16 +00001460 : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init),
Douglas Gregor76852c22011-11-01 01:16:03 +00001461 LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
Abramo Bagnaraa0af3b42010-05-26 18:09:23 +00001462 IsWritten(false), SourceOrderOrNumArrayIndices(0)
Douglas Gregor802ab452009-12-02 22:36:29 +00001463{
Douglas Gregor7ad83902008-11-05 04:29:56 +00001464}
1465
Sean Huntcbb67482011-01-08 20:30:50 +00001466CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
Douglas Gregor76852c22011-11-01 01:16:03 +00001467 TypeSourceInfo *TInfo,
1468 SourceLocation L, Expr *Init,
Sean Hunt41717662011-02-26 19:13:13 +00001469 SourceLocation R)
Douglas Gregor76852c22011-11-01 01:16:03 +00001470 : Initializee(TInfo), MemberOrEllipsisLocation(), Init(Init),
1471 LParenLoc(L), RParenLoc(R), IsDelegating(true), IsVirtual(false),
Sean Hunt41717662011-02-26 19:13:13 +00001472 IsWritten(false), SourceOrderOrNumArrayIndices(0)
1473{
1474}
1475
1476CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
Sean Huntcbb67482011-01-08 20:30:50 +00001477 FieldDecl *Member,
1478 SourceLocation MemberLoc,
1479 SourceLocation L, Expr *Init,
1480 SourceLocation R,
1481 VarDecl **Indices,
1482 unsigned NumIndices)
Sean Huntf51d0b62011-01-08 23:01:16 +00001483 : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init),
Francois Pichet00eb3f92010-12-04 09:14:42 +00001484 LParenLoc(L), RParenLoc(R), IsVirtual(false),
Abramo Bagnaraa0af3b42010-05-26 18:09:23 +00001485 IsWritten(false), SourceOrderOrNumArrayIndices(NumIndices)
Douglas Gregorfb8cc252010-05-05 05:51:00 +00001486{
1487 VarDecl **MyIndices = reinterpret_cast<VarDecl **> (this + 1);
1488 memcpy(MyIndices, Indices, NumIndices * sizeof(VarDecl *));
1489}
1490
Sean Huntcbb67482011-01-08 20:30:50 +00001491CXXCtorInitializer *CXXCtorInitializer::Create(ASTContext &Context,
1492 FieldDecl *Member,
1493 SourceLocation MemberLoc,
1494 SourceLocation L, Expr *Init,
1495 SourceLocation R,
1496 VarDecl **Indices,
1497 unsigned NumIndices) {
1498 void *Mem = Context.Allocate(sizeof(CXXCtorInitializer) +
Douglas Gregorfb8cc252010-05-05 05:51:00 +00001499 sizeof(VarDecl *) * NumIndices,
Sean Huntcbb67482011-01-08 20:30:50 +00001500 llvm::alignOf<CXXCtorInitializer>());
Sean Huntf51d0b62011-01-08 23:01:16 +00001501 return new (Mem) CXXCtorInitializer(Context, Member, MemberLoc, L, Init, R,
1502 Indices, NumIndices);
Douglas Gregorfb8cc252010-05-05 05:51:00 +00001503}
1504
Sean Huntcbb67482011-01-08 20:30:50 +00001505TypeLoc CXXCtorInitializer::getBaseClassLoc() const {
Douglas Gregor802ab452009-12-02 22:36:29 +00001506 if (isBaseInitializer())
Sean Huntf51d0b62011-01-08 23:01:16 +00001507 return Initializee.get<TypeSourceInfo*>()->getTypeLoc();
Douglas Gregor802ab452009-12-02 22:36:29 +00001508 else
1509 return TypeLoc();
1510}
1511
Sean Huntcbb67482011-01-08 20:30:50 +00001512const Type *CXXCtorInitializer::getBaseClass() const {
Douglas Gregor802ab452009-12-02 22:36:29 +00001513 if (isBaseInitializer())
Sean Huntf51d0b62011-01-08 23:01:16 +00001514 return Initializee.get<TypeSourceInfo*>()->getType().getTypePtr();
Douglas Gregor802ab452009-12-02 22:36:29 +00001515 else
1516 return 0;
1517}
1518
Sean Huntcbb67482011-01-08 20:30:50 +00001519SourceLocation CXXCtorInitializer::getSourceLocation() const {
Douglas Gregor76852c22011-11-01 01:16:03 +00001520 if (isAnyMemberInitializer())
Douglas Gregor802ab452009-12-02 22:36:29 +00001521 return getMemberLocation();
Richard Smith7a614d82011-06-11 17:19:42 +00001522
1523 if (isInClassMemberInitializer())
1524 return getAnyMember()->getLocation();
Douglas Gregor802ab452009-12-02 22:36:29 +00001525
Douglas Gregor76852c22011-11-01 01:16:03 +00001526 if (TypeSourceInfo *TSInfo = Initializee.get<TypeSourceInfo*>())
1527 return TSInfo->getTypeLoc().getLocalSourceRange().getBegin();
1528
1529 return SourceLocation();
Douglas Gregor802ab452009-12-02 22:36:29 +00001530}
1531
Sean Huntcbb67482011-01-08 20:30:50 +00001532SourceRange CXXCtorInitializer::getSourceRange() const {
Richard Smith7a614d82011-06-11 17:19:42 +00001533 if (isInClassMemberInitializer()) {
1534 FieldDecl *D = getAnyMember();
1535 if (Expr *I = D->getInClassInitializer())
1536 return I->getSourceRange();
1537 return SourceRange();
1538 }
1539
Douglas Gregor802ab452009-12-02 22:36:29 +00001540 return SourceRange(getSourceLocation(), getRParenLoc());
Douglas Gregor7ad83902008-11-05 04:29:56 +00001541}
1542
David Blaikie99ba9e32011-12-20 02:48:34 +00001543void CXXConstructorDecl::anchor() { }
1544
Douglas Gregorb48fe382008-10-31 09:07:45 +00001545CXXConstructorDecl *
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001546CXXConstructorDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1547 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(CXXConstructorDecl));
1548 return new (Mem) CXXConstructorDecl(0, SourceLocation(),DeclarationNameInfo(),
1549 QualType(), 0, false, false, false,false);
Chris Lattner6ad9ac02010-05-07 21:43:38 +00001550}
1551
1552CXXConstructorDecl *
Douglas Gregorb48fe382008-10-31 09:07:45 +00001553CXXConstructorDecl::Create(ASTContext &C, CXXRecordDecl *RD,
Abramo Bagnaraff676cb2011-03-08 08:55:46 +00001554 SourceLocation StartLoc,
Abramo Bagnara25777432010-08-11 22:01:17 +00001555 const DeclarationNameInfo &NameInfo,
John McCalla93c9342009-12-07 02:54:59 +00001556 QualType T, TypeSourceInfo *TInfo,
Richard Smithaf1fc7a2011-08-15 21:04:07 +00001557 bool isExplicit, bool isInline,
1558 bool isImplicitlyDeclared, bool isConstexpr) {
Abramo Bagnara25777432010-08-11 22:01:17 +00001559 assert(NameInfo.getName().getNameKind()
1560 == DeclarationName::CXXConstructorName &&
Douglas Gregor2e1cd422008-11-17 14:58:09 +00001561 "Name must refer to a constructor");
Abramo Bagnaraff676cb2011-03-08 08:55:46 +00001562 return new (C) CXXConstructorDecl(RD, StartLoc, NameInfo, T, TInfo,
Richard Smithaf1fc7a2011-08-15 21:04:07 +00001563 isExplicit, isInline, isImplicitlyDeclared,
1564 isConstexpr);
Douglas Gregorb48fe382008-10-31 09:07:45 +00001565}
1566
Douglas Gregor76852c22011-11-01 01:16:03 +00001567CXXConstructorDecl *CXXConstructorDecl::getTargetConstructor() const {
1568 assert(isDelegatingConstructor() && "Not a delegating constructor!");
1569 Expr *E = (*init_begin())->getInit()->IgnoreImplicit();
1570 if (CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(E))
1571 return Construct->getConstructor();
1572
1573 return 0;
1574}
1575
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001576bool CXXConstructorDecl::isDefaultConstructor() const {
1577 // C++ [class.ctor]p5:
Douglas Gregor64bffa92008-11-05 16:20:31 +00001578 // A default constructor for a class X is a constructor of class
1579 // X that can be called without an argument.
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001580 return (getNumParams() == 0) ||
Anders Carlssonda3f4e22009-08-25 05:12:04 +00001581 (getNumParams() > 0 && getParamDecl(0)->hasDefaultArg());
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001582}
1583
Mike Stump1eb44332009-09-09 15:08:12 +00001584bool
Douglas Gregor9e9199d2009-12-22 00:34:07 +00001585CXXConstructorDecl::isCopyConstructor(unsigned &TypeQuals) const {
Douglas Gregorcc15f012011-01-21 19:38:21 +00001586 return isCopyOrMoveConstructor(TypeQuals) &&
1587 getParamDecl(0)->getType()->isLValueReferenceType();
1588}
1589
1590bool CXXConstructorDecl::isMoveConstructor(unsigned &TypeQuals) const {
1591 return isCopyOrMoveConstructor(TypeQuals) &&
1592 getParamDecl(0)->getType()->isRValueReferenceType();
1593}
1594
1595/// \brief Determine whether this is a copy or move constructor.
1596bool CXXConstructorDecl::isCopyOrMoveConstructor(unsigned &TypeQuals) const {
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001597 // C++ [class.copy]p2:
Douglas Gregor64bffa92008-11-05 16:20:31 +00001598 // A non-template constructor for class X is a copy constructor
1599 // if its first parameter is of type X&, const X&, volatile X& or
1600 // const volatile X&, and either there are no other parameters
1601 // or else all other parameters have default arguments (8.3.6).
Douglas Gregorcc15f012011-01-21 19:38:21 +00001602 // C++0x [class.copy]p3:
1603 // A non-template constructor for class X is a move constructor if its
1604 // first parameter is of type X&&, const X&&, volatile X&&, or
1605 // const volatile X&&, and either there are no other parameters or else
1606 // all other parameters have default arguments.
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001607 if ((getNumParams() < 1) ||
Douglas Gregor77da3f42009-10-13 23:45:19 +00001608 (getNumParams() > 1 && !getParamDecl(1)->hasDefaultArg()) ||
Douglas Gregorfd476482009-11-13 23:59:09 +00001609 (getPrimaryTemplate() != 0) ||
Douglas Gregor77da3f42009-10-13 23:45:19 +00001610 (getDescribedFunctionTemplate() != 0))
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001611 return false;
Douglas Gregorcc15f012011-01-21 19:38:21 +00001612
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001613 const ParmVarDecl *Param = getParamDecl(0);
Douglas Gregorcc15f012011-01-21 19:38:21 +00001614
1615 // Do we have a reference type?
1616 const ReferenceType *ParamRefType = Param->getType()->getAs<ReferenceType>();
Douglas Gregorfd476482009-11-13 23:59:09 +00001617 if (!ParamRefType)
1618 return false;
Douglas Gregorcc15f012011-01-21 19:38:21 +00001619
Douglas Gregorfd476482009-11-13 23:59:09 +00001620 // Is it a reference to our class type?
Douglas Gregor9e9199d2009-12-22 00:34:07 +00001621 ASTContext &Context = getASTContext();
1622
Douglas Gregorfd476482009-11-13 23:59:09 +00001623 CanQualType PointeeType
1624 = Context.getCanonicalType(ParamRefType->getPointeeType());
Douglas Gregor14e0b3d2009-09-15 20:50:23 +00001625 CanQualType ClassTy
1626 = Context.getCanonicalType(Context.getTagDeclType(getParent()));
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001627 if (PointeeType.getUnqualifiedType() != ClassTy)
1628 return false;
Douglas Gregorcc15f012011-01-21 19:38:21 +00001629
John McCall0953e762009-09-24 19:53:00 +00001630 // FIXME: other qualifiers?
Douglas Gregorcc15f012011-01-21 19:38:21 +00001631
1632 // We have a copy or move constructor.
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001633 TypeQuals = PointeeType.getCVRQualifiers();
Douglas Gregorcc15f012011-01-21 19:38:21 +00001634 return true;
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001635}
1636
Anders Carlssonfaccd722009-08-28 16:57:08 +00001637bool CXXConstructorDecl::isConvertingConstructor(bool AllowExplicit) const {
Douglas Gregor60d62c22008-10-31 16:23:19 +00001638 // C++ [class.conv.ctor]p1:
1639 // A constructor declared without the function-specifier explicit
1640 // that can be called with a single parameter specifies a
1641 // conversion from the type of its first parameter to the type of
1642 // its class. Such a constructor is called a converting
1643 // constructor.
Anders Carlssonfaccd722009-08-28 16:57:08 +00001644 if (isExplicit() && !AllowExplicit)
Douglas Gregor60d62c22008-10-31 16:23:19 +00001645 return false;
1646
Mike Stump1eb44332009-09-09 15:08:12 +00001647 return (getNumParams() == 0 &&
John McCall183700f2009-09-21 23:43:11 +00001648 getType()->getAs<FunctionProtoType>()->isVariadic()) ||
Douglas Gregor60d62c22008-10-31 16:23:19 +00001649 (getNumParams() == 1) ||
Anders Carlssonae0b4e72009-06-06 04:14:07 +00001650 (getNumParams() > 1 && getParamDecl(1)->hasDefaultArg());
Douglas Gregor60d62c22008-10-31 16:23:19 +00001651}
Douglas Gregorb48fe382008-10-31 09:07:45 +00001652
Douglas Gregor6493cc52010-11-08 17:16:59 +00001653bool CXXConstructorDecl::isSpecializationCopyingObject() const {
Douglas Gregor66724ea2009-11-14 01:20:54 +00001654 if ((getNumParams() < 1) ||
1655 (getNumParams() > 1 && !getParamDecl(1)->hasDefaultArg()) ||
1656 (getPrimaryTemplate() == 0) ||
1657 (getDescribedFunctionTemplate() != 0))
1658 return false;
1659
1660 const ParmVarDecl *Param = getParamDecl(0);
1661
1662 ASTContext &Context = getASTContext();
1663 CanQualType ParamType = Context.getCanonicalType(Param->getType());
1664
Douglas Gregor66724ea2009-11-14 01:20:54 +00001665 // Is it the same as our our class type?
1666 CanQualType ClassTy
1667 = Context.getCanonicalType(Context.getTagDeclType(getParent()));
1668 if (ParamType.getUnqualifiedType() != ClassTy)
1669 return false;
1670
1671 return true;
1672}
1673
Sebastian Redlf677ea32011-02-05 19:23:19 +00001674const CXXConstructorDecl *CXXConstructorDecl::getInheritedConstructor() const {
1675 // Hack: we store the inherited constructor in the overridden method table
1676 method_iterator It = begin_overridden_methods();
1677 if (It == end_overridden_methods())
1678 return 0;
1679
1680 return cast<CXXConstructorDecl>(*It);
1681}
1682
1683void
1684CXXConstructorDecl::setInheritedConstructor(const CXXConstructorDecl *BaseCtor){
1685 // Hack: we store the inherited constructor in the overridden method table
1686 assert(size_overridden_methods() == 0 && "Base ctor already set.");
1687 addOverriddenMethod(BaseCtor);
1688}
1689
David Blaikie99ba9e32011-12-20 02:48:34 +00001690void CXXDestructorDecl::anchor() { }
1691
Douglas Gregor42a552f2008-11-05 20:51:48 +00001692CXXDestructorDecl *
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001693CXXDestructorDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1694 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(CXXDestructorDecl));
1695 return new (Mem) CXXDestructorDecl(0, SourceLocation(), DeclarationNameInfo(),
Craig Silversteinb41d8992010-10-21 00:44:50 +00001696 QualType(), 0, false, false);
Chris Lattner6ad9ac02010-05-07 21:43:38 +00001697}
1698
1699CXXDestructorDecl *
Douglas Gregor42a552f2008-11-05 20:51:48 +00001700CXXDestructorDecl::Create(ASTContext &C, CXXRecordDecl *RD,
Abramo Bagnaraff676cb2011-03-08 08:55:46 +00001701 SourceLocation StartLoc,
Abramo Bagnara25777432010-08-11 22:01:17 +00001702 const DeclarationNameInfo &NameInfo,
Craig Silversteinb41d8992010-10-21 00:44:50 +00001703 QualType T, TypeSourceInfo *TInfo,
Richard Smithaf1fc7a2011-08-15 21:04:07 +00001704 bool isInline, bool isImplicitlyDeclared) {
Abramo Bagnara25777432010-08-11 22:01:17 +00001705 assert(NameInfo.getName().getNameKind()
1706 == DeclarationName::CXXDestructorName &&
Douglas Gregor2e1cd422008-11-17 14:58:09 +00001707 "Name must refer to a destructor");
Abramo Bagnaraff676cb2011-03-08 08:55:46 +00001708 return new (C) CXXDestructorDecl(RD, StartLoc, NameInfo, T, TInfo, isInline,
Abramo Bagnara25777432010-08-11 22:01:17 +00001709 isImplicitlyDeclared);
Douglas Gregor42a552f2008-11-05 20:51:48 +00001710}
1711
David Blaikie99ba9e32011-12-20 02:48:34 +00001712void CXXConversionDecl::anchor() { }
1713
Douglas Gregor2f1bc522008-11-07 20:08:42 +00001714CXXConversionDecl *
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001715CXXConversionDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1716 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(CXXConversionDecl));
1717 return new (Mem) CXXConversionDecl(0, SourceLocation(), DeclarationNameInfo(),
1718 QualType(), 0, false, false, false,
1719 SourceLocation());
Chris Lattner6ad9ac02010-05-07 21:43:38 +00001720}
1721
1722CXXConversionDecl *
Douglas Gregor2f1bc522008-11-07 20:08:42 +00001723CXXConversionDecl::Create(ASTContext &C, CXXRecordDecl *RD,
Abramo Bagnaraff676cb2011-03-08 08:55:46 +00001724 SourceLocation StartLoc,
Abramo Bagnara25777432010-08-11 22:01:17 +00001725 const DeclarationNameInfo &NameInfo,
John McCalla93c9342009-12-07 02:54:59 +00001726 QualType T, TypeSourceInfo *TInfo,
Douglas Gregorf5251602011-03-08 17:10:18 +00001727 bool isInline, bool isExplicit,
Richard Smithaf1fc7a2011-08-15 21:04:07 +00001728 bool isConstexpr, SourceLocation EndLocation) {
Abramo Bagnara25777432010-08-11 22:01:17 +00001729 assert(NameInfo.getName().getNameKind()
1730 == DeclarationName::CXXConversionFunctionName &&
Douglas Gregor2e1cd422008-11-17 14:58:09 +00001731 "Name must refer to a conversion function");
Abramo Bagnaraff676cb2011-03-08 08:55:46 +00001732 return new (C) CXXConversionDecl(RD, StartLoc, NameInfo, T, TInfo,
Richard Smithaf1fc7a2011-08-15 21:04:07 +00001733 isInline, isExplicit, isConstexpr,
1734 EndLocation);
Douglas Gregor2f1bc522008-11-07 20:08:42 +00001735}
1736
David Blaikie99ba9e32011-12-20 02:48:34 +00001737void LinkageSpecDecl::anchor() { }
1738
Chris Lattner21ef7ae2008-11-04 16:51:42 +00001739LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C,
Mike Stump1eb44332009-09-09 15:08:12 +00001740 DeclContext *DC,
Abramo Bagnaraa2026c92011-03-08 16:41:52 +00001741 SourceLocation ExternLoc,
1742 SourceLocation LangLoc,
Abramo Bagnara5f6bcbe2011-03-03 14:52:38 +00001743 LanguageIDs Lang,
Abramo Bagnara5f6bcbe2011-03-03 14:52:38 +00001744 SourceLocation RBraceLoc) {
Abramo Bagnaraa2026c92011-03-08 16:41:52 +00001745 return new (C) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, RBraceLoc);
Douglas Gregorf44515a2008-12-16 22:23:02 +00001746}
Douglas Gregor2a3009a2009-02-03 19:21:40 +00001747
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001748LinkageSpecDecl *LinkageSpecDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1749 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(LinkageSpecDecl));
1750 return new (Mem) LinkageSpecDecl(0, SourceLocation(), SourceLocation(),
1751 lang_c, SourceLocation());
1752}
1753
David Blaikie99ba9e32011-12-20 02:48:34 +00001754void UsingDirectiveDecl::anchor() { }
1755
Douglas Gregor2a3009a2009-02-03 19:21:40 +00001756UsingDirectiveDecl *UsingDirectiveDecl::Create(ASTContext &C, DeclContext *DC,
1757 SourceLocation L,
1758 SourceLocation NamespaceLoc,
Douglas Gregordb992412011-02-25 16:33:46 +00001759 NestedNameSpecifierLoc QualifierLoc,
Douglas Gregor2a3009a2009-02-03 19:21:40 +00001760 SourceLocation IdentLoc,
Sebastian Redleb0d8c92009-11-23 15:34:23 +00001761 NamedDecl *Used,
Douglas Gregor2a3009a2009-02-03 19:21:40 +00001762 DeclContext *CommonAncestor) {
Sebastian Redleb0d8c92009-11-23 15:34:23 +00001763 if (NamespaceDecl *NS = dyn_cast_or_null<NamespaceDecl>(Used))
1764 Used = NS->getOriginalNamespace();
Douglas Gregordb992412011-02-25 16:33:46 +00001765 return new (C) UsingDirectiveDecl(DC, L, NamespaceLoc, QualifierLoc,
1766 IdentLoc, Used, CommonAncestor);
Douglas Gregor2a3009a2009-02-03 19:21:40 +00001767}
1768
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001769UsingDirectiveDecl *
1770UsingDirectiveDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1771 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(UsingDirectiveDecl));
1772 return new (Mem) UsingDirectiveDecl(0, SourceLocation(), SourceLocation(),
1773 NestedNameSpecifierLoc(),
1774 SourceLocation(), 0, 0);
1775}
1776
Sebastian Redleb0d8c92009-11-23 15:34:23 +00001777NamespaceDecl *UsingDirectiveDecl::getNominatedNamespace() {
1778 if (NamespaceAliasDecl *NA =
1779 dyn_cast_or_null<NamespaceAliasDecl>(NominatedNamespace))
1780 return NA->getNamespace();
1781 return cast_or_null<NamespaceDecl>(NominatedNamespace);
1782}
1783
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001784void NamespaceDecl::anchor() { }
1785
Douglas Gregorf5c9f9f2012-01-07 09:11:48 +00001786NamespaceDecl::NamespaceDecl(DeclContext *DC, bool Inline,
1787 SourceLocation StartLoc,
1788 SourceLocation IdLoc, IdentifierInfo *Id,
1789 NamespaceDecl *PrevDecl)
1790 : NamedDecl(Namespace, DC, IdLoc, Id), DeclContext(Namespace),
1791 LocStart(StartLoc), RBraceLoc(), AnonOrFirstNamespaceAndInline(0, Inline)
1792{
1793 setPreviousDeclaration(PrevDecl);
1794
1795 if (PrevDecl)
1796 AnonOrFirstNamespaceAndInline.setPointer(PrevDecl->getOriginalNamespace());
1797}
1798
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001799NamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC,
Douglas Gregorf5c9f9f2012-01-07 09:11:48 +00001800 bool Inline, SourceLocation StartLoc,
1801 SourceLocation IdLoc, IdentifierInfo *Id,
1802 NamespaceDecl *PrevDecl) {
1803 return new (C) NamespaceDecl(DC, Inline, StartLoc, IdLoc, Id, PrevDecl);
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001804}
1805
1806NamespaceDecl *NamespaceDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1807 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(NamespaceDecl));
Douglas Gregorf5c9f9f2012-01-07 09:11:48 +00001808 return new (Mem) NamespaceDecl(0, false, SourceLocation(), SourceLocation(),
1809 0, 0);
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001810}
1811
David Blaikie99ba9e32011-12-20 02:48:34 +00001812void NamespaceAliasDecl::anchor() { }
1813
Mike Stump1eb44332009-09-09 15:08:12 +00001814NamespaceAliasDecl *NamespaceAliasDecl::Create(ASTContext &C, DeclContext *DC,
Douglas Gregor0a35bce2010-09-01 03:07:18 +00001815 SourceLocation UsingLoc,
Mike Stump1eb44332009-09-09 15:08:12 +00001816 SourceLocation AliasLoc,
1817 IdentifierInfo *Alias,
Douglas Gregor0cfaf6a2011-02-25 17:08:07 +00001818 NestedNameSpecifierLoc QualifierLoc,
Mike Stump1eb44332009-09-09 15:08:12 +00001819 SourceLocation IdentLoc,
Anders Carlsson68771c72009-03-28 22:58:02 +00001820 NamedDecl *Namespace) {
Sebastian Redleb0d8c92009-11-23 15:34:23 +00001821 if (NamespaceDecl *NS = dyn_cast_or_null<NamespaceDecl>(Namespace))
1822 Namespace = NS->getOriginalNamespace();
Douglas Gregor0cfaf6a2011-02-25 17:08:07 +00001823 return new (C) NamespaceAliasDecl(DC, UsingLoc, AliasLoc, Alias,
1824 QualifierLoc, IdentLoc, Namespace);
Anders Carlsson68771c72009-03-28 22:58:02 +00001825}
1826
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001827NamespaceAliasDecl *
1828NamespaceAliasDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1829 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(NamespaceAliasDecl));
1830 return new (Mem) NamespaceAliasDecl(0, SourceLocation(), SourceLocation(), 0,
1831 NestedNameSpecifierLoc(),
1832 SourceLocation(), 0);
1833}
1834
David Blaikie99ba9e32011-12-20 02:48:34 +00001835void UsingShadowDecl::anchor() { }
1836
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001837UsingShadowDecl *
1838UsingShadowDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1839 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(UsingShadowDecl));
1840 return new (Mem) UsingShadowDecl(0, SourceLocation(), 0, 0);
1841}
1842
Argyrios Kyrtzidis826faa22010-11-10 05:40:41 +00001843UsingDecl *UsingShadowDecl::getUsingDecl() const {
1844 const UsingShadowDecl *Shadow = this;
1845 while (const UsingShadowDecl *NextShadow =
1846 dyn_cast<UsingShadowDecl>(Shadow->UsingOrNextShadow))
1847 Shadow = NextShadow;
1848 return cast<UsingDecl>(Shadow->UsingOrNextShadow);
1849}
1850
David Blaikie99ba9e32011-12-20 02:48:34 +00001851void UsingDecl::anchor() { }
1852
Argyrios Kyrtzidis826faa22010-11-10 05:40:41 +00001853void UsingDecl::addShadowDecl(UsingShadowDecl *S) {
1854 assert(std::find(shadow_begin(), shadow_end(), S) == shadow_end() &&
1855 "declaration already in set");
1856 assert(S->getUsingDecl() == this);
1857
Benjamin Kramer9bc6fb62012-01-07 19:09:05 +00001858 if (FirstUsingShadow.getPointer())
1859 S->UsingOrNextShadow = FirstUsingShadow.getPointer();
1860 FirstUsingShadow.setPointer(S);
Argyrios Kyrtzidis826faa22010-11-10 05:40:41 +00001861}
1862
1863void UsingDecl::removeShadowDecl(UsingShadowDecl *S) {
1864 assert(std::find(shadow_begin(), shadow_end(), S) != shadow_end() &&
1865 "declaration not in set");
1866 assert(S->getUsingDecl() == this);
1867
1868 // Remove S from the shadow decl chain. This is O(n) but hopefully rare.
1869
Benjamin Kramer9bc6fb62012-01-07 19:09:05 +00001870 if (FirstUsingShadow.getPointer() == S) {
1871 FirstUsingShadow.setPointer(
1872 dyn_cast<UsingShadowDecl>(S->UsingOrNextShadow));
Argyrios Kyrtzidis826faa22010-11-10 05:40:41 +00001873 S->UsingOrNextShadow = this;
1874 return;
1875 }
1876
Benjamin Kramer9bc6fb62012-01-07 19:09:05 +00001877 UsingShadowDecl *Prev = FirstUsingShadow.getPointer();
Argyrios Kyrtzidis826faa22010-11-10 05:40:41 +00001878 while (Prev->UsingOrNextShadow != S)
1879 Prev = cast<UsingShadowDecl>(Prev->UsingOrNextShadow);
1880 Prev->UsingOrNextShadow = S->UsingOrNextShadow;
1881 S->UsingOrNextShadow = this;
1882}
1883
Douglas Gregordc355712011-02-25 00:36:19 +00001884UsingDecl *UsingDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation UL,
1885 NestedNameSpecifierLoc QualifierLoc,
Abramo Bagnaraef3dce82010-08-12 11:46:03 +00001886 const DeclarationNameInfo &NameInfo,
1887 bool IsTypeNameArg) {
Douglas Gregordc355712011-02-25 00:36:19 +00001888 return new (C) UsingDecl(DC, UL, QualifierLoc, NameInfo, IsTypeNameArg);
Douglas Gregor9cfbe482009-06-20 00:51:54 +00001889}
1890
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001891UsingDecl *UsingDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1892 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(UsingDecl));
1893 return new (Mem) UsingDecl(0, SourceLocation(), NestedNameSpecifierLoc(),
1894 DeclarationNameInfo(), false);
1895}
1896
David Blaikie99ba9e32011-12-20 02:48:34 +00001897void UnresolvedUsingValueDecl::anchor() { }
1898
John McCall7ba107a2009-11-18 02:36:19 +00001899UnresolvedUsingValueDecl *
1900UnresolvedUsingValueDecl::Create(ASTContext &C, DeclContext *DC,
1901 SourceLocation UsingLoc,
Douglas Gregordc355712011-02-25 00:36:19 +00001902 NestedNameSpecifierLoc QualifierLoc,
Abramo Bagnaraef3dce82010-08-12 11:46:03 +00001903 const DeclarationNameInfo &NameInfo) {
John McCall7ba107a2009-11-18 02:36:19 +00001904 return new (C) UnresolvedUsingValueDecl(DC, C.DependentTy, UsingLoc,
Douglas Gregordc355712011-02-25 00:36:19 +00001905 QualifierLoc, NameInfo);
John McCall7ba107a2009-11-18 02:36:19 +00001906}
1907
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001908UnresolvedUsingValueDecl *
1909UnresolvedUsingValueDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1910 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(UnresolvedUsingValueDecl));
1911 return new (Mem) UnresolvedUsingValueDecl(0, QualType(), SourceLocation(),
1912 NestedNameSpecifierLoc(),
1913 DeclarationNameInfo());
1914}
1915
David Blaikie99ba9e32011-12-20 02:48:34 +00001916void UnresolvedUsingTypenameDecl::anchor() { }
1917
John McCall7ba107a2009-11-18 02:36:19 +00001918UnresolvedUsingTypenameDecl *
1919UnresolvedUsingTypenameDecl::Create(ASTContext &C, DeclContext *DC,
1920 SourceLocation UsingLoc,
1921 SourceLocation TypenameLoc,
Douglas Gregordc355712011-02-25 00:36:19 +00001922 NestedNameSpecifierLoc QualifierLoc,
John McCall7ba107a2009-11-18 02:36:19 +00001923 SourceLocation TargetNameLoc,
1924 DeclarationName TargetName) {
1925 return new (C) UnresolvedUsingTypenameDecl(DC, UsingLoc, TypenameLoc,
Douglas Gregordc355712011-02-25 00:36:19 +00001926 QualifierLoc, TargetNameLoc,
John McCall7ba107a2009-11-18 02:36:19 +00001927 TargetName.getAsIdentifierInfo());
Anders Carlsson665b49c2009-08-28 05:30:28 +00001928}
1929
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001930UnresolvedUsingTypenameDecl *
1931UnresolvedUsingTypenameDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1932 void *Mem = AllocateDeserializedDecl(C, ID,
1933 sizeof(UnresolvedUsingTypenameDecl));
1934 return new (Mem) UnresolvedUsingTypenameDecl(0, SourceLocation(),
1935 SourceLocation(),
1936 NestedNameSpecifierLoc(),
1937 SourceLocation(),
1938 0);
1939}
1940
David Blaikie99ba9e32011-12-20 02:48:34 +00001941void StaticAssertDecl::anchor() { }
1942
Anders Carlssonfb311762009-03-14 00:25:26 +00001943StaticAssertDecl *StaticAssertDecl::Create(ASTContext &C, DeclContext *DC,
Abramo Bagnaraa2026c92011-03-08 16:41:52 +00001944 SourceLocation StaticAssertLoc,
1945 Expr *AssertExpr,
1946 StringLiteral *Message,
1947 SourceLocation RParenLoc) {
1948 return new (C) StaticAssertDecl(DC, StaticAssertLoc, AssertExpr, Message,
1949 RParenLoc);
Anders Carlssonfb311762009-03-14 00:25:26 +00001950}
1951
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001952StaticAssertDecl *StaticAssertDecl::CreateDeserialized(ASTContext &C,
1953 unsigned ID) {
1954 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(StaticAssertDecl));
1955 return new (Mem) StaticAssertDecl(0, SourceLocation(), 0, 0,SourceLocation());
1956}
1957
Anders Carlsson05bf2c72009-03-26 23:46:50 +00001958static const char *getAccessName(AccessSpecifier AS) {
1959 switch (AS) {
Anders Carlsson05bf2c72009-03-26 23:46:50 +00001960 case AS_none:
David Blaikieb219cfc2011-09-23 05:06:16 +00001961 llvm_unreachable("Invalid access specifier!");
Anders Carlsson05bf2c72009-03-26 23:46:50 +00001962 case AS_public:
1963 return "public";
1964 case AS_private:
1965 return "private";
1966 case AS_protected:
1967 return "protected";
1968 }
David Blaikie561d3ab2012-01-17 02:30:50 +00001969 llvm_unreachable("Invalid access specifier!");
Anders Carlsson05bf2c72009-03-26 23:46:50 +00001970}
1971
1972const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB,
1973 AccessSpecifier AS) {
1974 return DB << getAccessName(AS);
1975}