blob: 6db3efcd1847cb3019f3888945eb70c16b354445 [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
Argyrios Kyrtzidis69b26d62012-01-24 01:37:11 +0000970 return isPOD() &&
971 data().HasOnlyFields &&
Argyrios Kyrtzidis277b1562012-01-23 16:58:45 +0000972 !data().HasPrivateFields &&
973 !data().HasProtectedFields &&
974 !data().NumBases;
975}
976
John McCallb05b5f32010-03-15 09:07:48 +0000977static CanQualType GetConversionType(ASTContext &Context, NamedDecl *Conv) {
978 QualType T;
John McCall32daa422010-03-31 01:36:47 +0000979 if (isa<UsingShadowDecl>(Conv))
980 Conv = cast<UsingShadowDecl>(Conv)->getTargetDecl();
John McCallb05b5f32010-03-15 09:07:48 +0000981 if (FunctionTemplateDecl *ConvTemp = dyn_cast<FunctionTemplateDecl>(Conv))
982 T = ConvTemp->getTemplatedDecl()->getResultType();
983 else
984 T = cast<CXXConversionDecl>(Conv)->getConversionType();
985 return Context.getCanonicalType(T);
Fariborz Jahanian0351a1e2009-10-07 20:43:36 +0000986}
987
John McCallb05b5f32010-03-15 09:07:48 +0000988/// Collect the visible conversions of a base class.
989///
990/// \param Base a base class of the class we're considering
991/// \param InVirtual whether this base class is a virtual base (or a base
992/// of a virtual base)
993/// \param Access the access along the inheritance path to this base
994/// \param ParentHiddenTypes the conversions provided by the inheritors
995/// of this base
996/// \param Output the set to which to add conversions from non-virtual bases
997/// \param VOutput the set to which to add conversions from virtual bases
998/// \param HiddenVBaseCs the set of conversions which were hidden in a
999/// virtual base along some inheritance path
1000static void CollectVisibleConversions(ASTContext &Context,
1001 CXXRecordDecl *Record,
1002 bool InVirtual,
1003 AccessSpecifier Access,
1004 const llvm::SmallPtrSet<CanQualType, 8> &ParentHiddenTypes,
1005 UnresolvedSetImpl &Output,
1006 UnresolvedSetImpl &VOutput,
1007 llvm::SmallPtrSet<NamedDecl*, 8> &HiddenVBaseCs) {
1008 // The set of types which have conversions in this class or its
1009 // subclasses. As an optimization, we don't copy the derived set
1010 // unless it might change.
1011 const llvm::SmallPtrSet<CanQualType, 8> *HiddenTypes = &ParentHiddenTypes;
1012 llvm::SmallPtrSet<CanQualType, 8> HiddenTypesBuffer;
1013
1014 // Collect the direct conversions and figure out which conversions
1015 // will be hidden in the subclasses.
1016 UnresolvedSetImpl &Cs = *Record->getConversionFunctions();
1017 if (!Cs.empty()) {
1018 HiddenTypesBuffer = ParentHiddenTypes;
1019 HiddenTypes = &HiddenTypesBuffer;
1020
1021 for (UnresolvedSetIterator I = Cs.begin(), E = Cs.end(); I != E; ++I) {
1022 bool Hidden =
1023 !HiddenTypesBuffer.insert(GetConversionType(Context, I.getDecl()));
1024
1025 // If this conversion is hidden and we're in a virtual base,
1026 // remember that it's hidden along some inheritance path.
1027 if (Hidden && InVirtual)
1028 HiddenVBaseCs.insert(cast<NamedDecl>(I.getDecl()->getCanonicalDecl()));
1029
1030 // If this conversion isn't hidden, add it to the appropriate output.
1031 else if (!Hidden) {
1032 AccessSpecifier IAccess
1033 = CXXRecordDecl::MergeAccess(Access, I.getAccess());
1034
1035 if (InVirtual)
1036 VOutput.addDecl(I.getDecl(), IAccess);
Fariborz Jahanian62509212009-09-12 18:26:03 +00001037 else
John McCallb05b5f32010-03-15 09:07:48 +00001038 Output.addDecl(I.getDecl(), IAccess);
Fariborz Jahanian53462782009-09-11 21:44:33 +00001039 }
1040 }
1041 }
Sebastian Redl9994a342009-10-25 17:03:50 +00001042
John McCallb05b5f32010-03-15 09:07:48 +00001043 // Collect information recursively from any base classes.
1044 for (CXXRecordDecl::base_class_iterator
1045 I = Record->bases_begin(), E = Record->bases_end(); I != E; ++I) {
1046 const RecordType *RT = I->getType()->getAs<RecordType>();
1047 if (!RT) continue;
Sebastian Redl9994a342009-10-25 17:03:50 +00001048
John McCallb05b5f32010-03-15 09:07:48 +00001049 AccessSpecifier BaseAccess
1050 = CXXRecordDecl::MergeAccess(Access, I->getAccessSpecifier());
1051 bool BaseInVirtual = InVirtual || I->isVirtual();
Sebastian Redl9994a342009-10-25 17:03:50 +00001052
John McCallb05b5f32010-03-15 09:07:48 +00001053 CXXRecordDecl *Base = cast<CXXRecordDecl>(RT->getDecl());
1054 CollectVisibleConversions(Context, Base, BaseInVirtual, BaseAccess,
1055 *HiddenTypes, Output, VOutput, HiddenVBaseCs);
Fariborz Jahanian53462782009-09-11 21:44:33 +00001056 }
John McCallb05b5f32010-03-15 09:07:48 +00001057}
Sebastian Redl9994a342009-10-25 17:03:50 +00001058
John McCallb05b5f32010-03-15 09:07:48 +00001059/// Collect the visible conversions of a class.
1060///
1061/// This would be extremely straightforward if it weren't for virtual
1062/// bases. It might be worth special-casing that, really.
1063static void CollectVisibleConversions(ASTContext &Context,
1064 CXXRecordDecl *Record,
1065 UnresolvedSetImpl &Output) {
1066 // The collection of all conversions in virtual bases that we've
1067 // found. These will be added to the output as long as they don't
1068 // appear in the hidden-conversions set.
1069 UnresolvedSet<8> VBaseCs;
1070
1071 // The set of conversions in virtual bases that we've determined to
1072 // be hidden.
1073 llvm::SmallPtrSet<NamedDecl*, 8> HiddenVBaseCs;
1074
1075 // The set of types hidden by classes derived from this one.
1076 llvm::SmallPtrSet<CanQualType, 8> HiddenTypes;
1077
1078 // Go ahead and collect the direct conversions and add them to the
1079 // hidden-types set.
1080 UnresolvedSetImpl &Cs = *Record->getConversionFunctions();
1081 Output.append(Cs.begin(), Cs.end());
1082 for (UnresolvedSetIterator I = Cs.begin(), E = Cs.end(); I != E; ++I)
1083 HiddenTypes.insert(GetConversionType(Context, I.getDecl()));
1084
1085 // Recursively collect conversions from base classes.
1086 for (CXXRecordDecl::base_class_iterator
1087 I = Record->bases_begin(), E = Record->bases_end(); I != E; ++I) {
1088 const RecordType *RT = I->getType()->getAs<RecordType>();
1089 if (!RT) continue;
1090
1091 CollectVisibleConversions(Context, cast<CXXRecordDecl>(RT->getDecl()),
1092 I->isVirtual(), I->getAccessSpecifier(),
1093 HiddenTypes, Output, VBaseCs, HiddenVBaseCs);
1094 }
1095
1096 // Add any unhidden conversions provided by virtual bases.
1097 for (UnresolvedSetIterator I = VBaseCs.begin(), E = VBaseCs.end();
1098 I != E; ++I) {
1099 if (!HiddenVBaseCs.count(cast<NamedDecl>(I.getDecl()->getCanonicalDecl())))
1100 Output.addDecl(I.getDecl(), I.getAccess());
Fariborz Jahanian53462782009-09-11 21:44:33 +00001101 }
Fariborz Jahanian62509212009-09-12 18:26:03 +00001102}
1103
1104/// getVisibleConversionFunctions - get all conversion functions visible
1105/// in current class; including conversion function templates.
John McCalleec51cf2010-01-20 00:46:10 +00001106const UnresolvedSetImpl *CXXRecordDecl::getVisibleConversionFunctions() {
Fariborz Jahanian62509212009-09-12 18:26:03 +00001107 // If root class, all conversions are visible.
1108 if (bases_begin() == bases_end())
John McCall86ff3082010-02-04 22:26:26 +00001109 return &data().Conversions;
Fariborz Jahanian62509212009-09-12 18:26:03 +00001110 // If visible conversion list is already evaluated, return it.
John McCall86ff3082010-02-04 22:26:26 +00001111 if (data().ComputedVisibleConversions)
1112 return &data().VisibleConversions;
John McCallb05b5f32010-03-15 09:07:48 +00001113 CollectVisibleConversions(getASTContext(), this, data().VisibleConversions);
John McCall86ff3082010-02-04 22:26:26 +00001114 data().ComputedVisibleConversions = true;
1115 return &data().VisibleConversions;
Fariborz Jahanian53462782009-09-11 21:44:33 +00001116}
1117
John McCall32daa422010-03-31 01:36:47 +00001118void CXXRecordDecl::removeConversion(const NamedDecl *ConvDecl) {
1119 // This operation is O(N) but extremely rare. Sema only uses it to
1120 // remove UsingShadowDecls in a class that were followed by a direct
1121 // declaration, e.g.:
1122 // class A : B {
1123 // using B::operator int;
1124 // operator int();
1125 // };
1126 // This is uncommon by itself and even more uncommon in conjunction
1127 // with sufficiently large numbers of directly-declared conversions
1128 // that asymptotic behavior matters.
1129
1130 UnresolvedSetImpl &Convs = *getConversionFunctions();
1131 for (unsigned I = 0, E = Convs.size(); I != E; ++I) {
1132 if (Convs[I].getDecl() == ConvDecl) {
1133 Convs.erase(I);
1134 assert(std::find(Convs.begin(), Convs.end(), ConvDecl) == Convs.end()
1135 && "conversion was found multiple times in unresolved set");
1136 return;
1137 }
1138 }
1139
1140 llvm_unreachable("conversion not found in set!");
Douglas Gregor65ec1fd2009-08-21 23:19:43 +00001141}
Fariborz Jahanianf8dcb862009-06-19 19:55:27 +00001142
Douglas Gregorf6b11852009-10-08 15:14:33 +00001143CXXRecordDecl *CXXRecordDecl::getInstantiatedFromMemberClass() const {
Douglas Gregorb3ae4fc2009-10-12 20:18:28 +00001144 if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo())
Douglas Gregorf6b11852009-10-08 15:14:33 +00001145 return cast<CXXRecordDecl>(MSInfo->getInstantiatedFrom());
1146
1147 return 0;
1148}
1149
Douglas Gregorb3ae4fc2009-10-12 20:18:28 +00001150MemberSpecializationInfo *CXXRecordDecl::getMemberSpecializationInfo() const {
1151 return TemplateOrInstantiation.dyn_cast<MemberSpecializationInfo *>();
1152}
1153
Douglas Gregorf6b11852009-10-08 15:14:33 +00001154void
1155CXXRecordDecl::setInstantiationOfMemberClass(CXXRecordDecl *RD,
1156 TemplateSpecializationKind TSK) {
1157 assert(TemplateOrInstantiation.isNull() &&
1158 "Previous template or instantiation?");
1159 assert(!isa<ClassTemplateSpecializationDecl>(this));
1160 TemplateOrInstantiation
1161 = new (getASTContext()) MemberSpecializationInfo(RD, TSK);
1162}
1163
Anders Carlssonb13e3572009-12-07 06:33:48 +00001164TemplateSpecializationKind CXXRecordDecl::getTemplateSpecializationKind() const{
1165 if (const ClassTemplateSpecializationDecl *Spec
Douglas Gregorf6b11852009-10-08 15:14:33 +00001166 = dyn_cast<ClassTemplateSpecializationDecl>(this))
1167 return Spec->getSpecializationKind();
1168
Douglas Gregorb3ae4fc2009-10-12 20:18:28 +00001169 if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo())
Douglas Gregorf6b11852009-10-08 15:14:33 +00001170 return MSInfo->getTemplateSpecializationKind();
1171
1172 return TSK_Undeclared;
1173}
1174
1175void
1176CXXRecordDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK) {
1177 if (ClassTemplateSpecializationDecl *Spec
1178 = dyn_cast<ClassTemplateSpecializationDecl>(this)) {
1179 Spec->setSpecializationKind(TSK);
1180 return;
1181 }
1182
Douglas Gregorb3ae4fc2009-10-12 20:18:28 +00001183 if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) {
Douglas Gregorf6b11852009-10-08 15:14:33 +00001184 MSInfo->setTemplateSpecializationKind(TSK);
1185 return;
1186 }
1187
David Blaikieb219cfc2011-09-23 05:06:16 +00001188 llvm_unreachable("Not a class template or member class specialization");
Douglas Gregorf6b11852009-10-08 15:14:33 +00001189}
1190
Douglas Gregor1d110e02010-07-01 14:13:13 +00001191CXXDestructorDecl *CXXRecordDecl::getDestructor() const {
1192 ASTContext &Context = getASTContext();
Anders Carlsson7267c162009-05-29 21:03:38 +00001193 QualType ClassType = Context.getTypeDeclType(this);
Mike Stump1eb44332009-09-09 15:08:12 +00001194
1195 DeclarationName Name
Douglas Gregor50d62d12009-08-05 05:36:45 +00001196 = Context.DeclarationNames.getCXXDestructorName(
1197 Context.getCanonicalType(ClassType));
Anders Carlsson7267c162009-05-29 21:03:38 +00001198
John McCallc0bf4622010-02-23 00:48:20 +00001199 DeclContext::lookup_const_iterator I, E;
Mike Stump1eb44332009-09-09 15:08:12 +00001200 llvm::tie(I, E) = lookup(Name);
Sebastian Redld4b25cb2010-09-02 23:19:42 +00001201 if (I == E)
1202 return 0;
Mike Stump1eb44332009-09-09 15:08:12 +00001203
Anders Carlsson5ec02ae2009-12-02 17:15:43 +00001204 CXXDestructorDecl *Dtor = cast<CXXDestructorDecl>(*I);
Anders Carlsson7267c162009-05-29 21:03:38 +00001205 return Dtor;
1206}
1207
Douglas Gregorda2142f2011-02-19 18:51:44 +00001208void CXXRecordDecl::completeDefinition() {
1209 completeDefinition(0);
1210}
1211
1212void CXXRecordDecl::completeDefinition(CXXFinalOverriderMap *FinalOverriders) {
1213 RecordDecl::completeDefinition();
1214
John McCallf85e1932011-06-15 23:02:42 +00001215 if (hasObjectMember() && getASTContext().getLangOptions().ObjCAutoRefCount) {
1216 // Objective-C Automatic Reference Counting:
1217 // If a class has a non-static data member of Objective-C pointer
1218 // type (or array thereof), it is a non-POD type and its
1219 // default constructor (if any), copy constructor, copy assignment
1220 // operator, and destructor are non-trivial.
1221 struct DefinitionData &Data = data();
1222 Data.PlainOldData = false;
1223 Data.HasTrivialDefaultConstructor = false;
1224 Data.HasTrivialCopyConstructor = false;
1225 Data.HasTrivialCopyAssignment = false;
1226 Data.HasTrivialDestructor = false;
1227 }
1228
Douglas Gregor7a39dd02010-09-29 00:15:42 +00001229 // If the class may be abstract (but hasn't been marked as such), check for
1230 // any pure final overriders.
1231 if (mayBeAbstract()) {
1232 CXXFinalOverriderMap MyFinalOverriders;
1233 if (!FinalOverriders) {
1234 getFinalOverriders(MyFinalOverriders);
1235 FinalOverriders = &MyFinalOverriders;
1236 }
1237
1238 bool Done = false;
1239 for (CXXFinalOverriderMap::iterator M = FinalOverriders->begin(),
1240 MEnd = FinalOverriders->end();
1241 M != MEnd && !Done; ++M) {
1242 for (OverridingMethods::iterator SO = M->second.begin(),
1243 SOEnd = M->second.end();
1244 SO != SOEnd && !Done; ++SO) {
1245 assert(SO->second.size() > 0 &&
1246 "All virtual functions have overridding virtual functions");
1247
1248 // C++ [class.abstract]p4:
1249 // A class is abstract if it contains or inherits at least one
1250 // pure virtual function for which the final overrider is pure
1251 // virtual.
1252 if (SO->second.front().Method->isPure()) {
1253 data().Abstract = true;
1254 Done = true;
1255 break;
1256 }
1257 }
1258 }
1259 }
Douglas Gregore80622f2010-09-29 04:25:11 +00001260
1261 // Set access bits correctly on the directly-declared conversions.
1262 for (UnresolvedSetIterator I = data().Conversions.begin(),
1263 E = data().Conversions.end();
1264 I != E; ++I)
1265 data().Conversions.setAccess(I, (*I)->getAccess());
Douglas Gregor7a39dd02010-09-29 00:15:42 +00001266}
1267
1268bool CXXRecordDecl::mayBeAbstract() const {
1269 if (data().Abstract || isInvalidDecl() || !data().Polymorphic ||
1270 isDependentContext())
1271 return false;
1272
1273 for (CXXRecordDecl::base_class_const_iterator B = bases_begin(),
1274 BEnd = bases_end();
1275 B != BEnd; ++B) {
1276 CXXRecordDecl *BaseDecl
1277 = cast<CXXRecordDecl>(B->getType()->getAs<RecordType>()->getDecl());
1278 if (BaseDecl->isAbstract())
1279 return true;
1280 }
1281
1282 return false;
1283}
1284
David Blaikie99ba9e32011-12-20 02:48:34 +00001285void CXXMethodDecl::anchor() { }
1286
Ted Kremenek4b7c9832008-09-05 17:16:31 +00001287CXXMethodDecl *
1288CXXMethodDecl::Create(ASTContext &C, CXXRecordDecl *RD,
Abramo Bagnaraff676cb2011-03-08 08:55:46 +00001289 SourceLocation StartLoc,
Abramo Bagnara25777432010-08-11 22:01:17 +00001290 const DeclarationNameInfo &NameInfo,
John McCalla93c9342009-12-07 02:54:59 +00001291 QualType T, TypeSourceInfo *TInfo,
Douglas Gregorf5251602011-03-08 17:10:18 +00001292 bool isStatic, StorageClass SCAsWritten, bool isInline,
Richard Smithaf1fc7a2011-08-15 21:04:07 +00001293 bool isConstexpr, SourceLocation EndLocation) {
Abramo Bagnaraff676cb2011-03-08 08:55:46 +00001294 return new (C) CXXMethodDecl(CXXMethod, RD, StartLoc, NameInfo, T, TInfo,
Richard Smithaf1fc7a2011-08-15 21:04:07 +00001295 isStatic, SCAsWritten, isInline, isConstexpr,
1296 EndLocation);
Ted Kremenek4b7c9832008-09-05 17:16:31 +00001297}
1298
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001299CXXMethodDecl *CXXMethodDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1300 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(CXXMethodDecl));
1301 return new (Mem) CXXMethodDecl(CXXMethod, 0, SourceLocation(),
1302 DeclarationNameInfo(), QualType(),
1303 0, false, SC_None, false, false,
1304 SourceLocation());
1305}
1306
Douglas Gregor90916562009-09-29 18:16:17 +00001307bool CXXMethodDecl::isUsualDeallocationFunction() const {
1308 if (getOverloadedOperator() != OO_Delete &&
1309 getOverloadedOperator() != OO_Array_Delete)
1310 return false;
Douglas Gregor6d908702010-02-26 05:06:18 +00001311
1312 // C++ [basic.stc.dynamic.deallocation]p2:
1313 // A template instance is never a usual deallocation function,
1314 // regardless of its signature.
1315 if (getPrimaryTemplate())
1316 return false;
1317
Douglas Gregor90916562009-09-29 18:16:17 +00001318 // C++ [basic.stc.dynamic.deallocation]p2:
1319 // If a class T has a member deallocation function named operator delete
1320 // with exactly one parameter, then that function is a usual (non-placement)
1321 // deallocation function. [...]
1322 if (getNumParams() == 1)
1323 return true;
1324
1325 // C++ [basic.stc.dynamic.deallocation]p2:
1326 // [...] If class T does not declare such an operator delete but does
1327 // declare a member deallocation function named operator delete with
1328 // exactly two parameters, the second of which has type std::size_t (18.1),
1329 // then this function is a usual deallocation function.
1330 ASTContext &Context = getASTContext();
1331 if (getNumParams() != 2 ||
Chandler Carruthe228ba92010-02-08 18:54:05 +00001332 !Context.hasSameUnqualifiedType(getParamDecl(1)->getType(),
1333 Context.getSizeType()))
Douglas Gregor90916562009-09-29 18:16:17 +00001334 return false;
1335
1336 // This function is a usual deallocation function if there are no
1337 // single-parameter deallocation functions of the same kind.
1338 for (DeclContext::lookup_const_result R = getDeclContext()->lookup(getDeclName());
1339 R.first != R.second; ++R.first) {
1340 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*R.first))
1341 if (FD->getNumParams() == 1)
1342 return false;
1343 }
1344
1345 return true;
1346}
1347
Douglas Gregor06a9f362010-05-01 20:49:11 +00001348bool CXXMethodDecl::isCopyAssignmentOperator() const {
Sean Huntffe37fd2011-05-25 20:50:04 +00001349 // C++0x [class.copy]p17:
Douglas Gregor06a9f362010-05-01 20:49:11 +00001350 // A user-declared copy assignment operator X::operator= is a non-static
1351 // non-template member function of class X with exactly one parameter of
1352 // type X, X&, const X&, volatile X& or const volatile X&.
1353 if (/*operator=*/getOverloadedOperator() != OO_Equal ||
1354 /*non-static*/ isStatic() ||
Sean Huntffe37fd2011-05-25 20:50:04 +00001355 /*non-template*/getPrimaryTemplate() || getDescribedFunctionTemplate())
Douglas Gregor06a9f362010-05-01 20:49:11 +00001356 return false;
1357
1358 QualType ParamType = getParamDecl(0)->getType();
1359 if (const LValueReferenceType *Ref = ParamType->getAs<LValueReferenceType>())
1360 ParamType = Ref->getPointeeType();
1361
1362 ASTContext &Context = getASTContext();
1363 QualType ClassType
1364 = Context.getCanonicalType(Context.getTypeDeclType(getParent()));
1365 return Context.hasSameUnqualifiedType(ClassType, ParamType);
1366}
1367
Sean Huntffe37fd2011-05-25 20:50:04 +00001368bool CXXMethodDecl::isMoveAssignmentOperator() const {
1369 // C++0x [class.copy]p19:
1370 // A user-declared move assignment operator X::operator= is a non-static
1371 // non-template member function of class X with exactly one parameter of type
1372 // X&&, const X&&, volatile X&&, or const volatile X&&.
1373 if (getOverloadedOperator() != OO_Equal || isStatic() ||
1374 getPrimaryTemplate() || getDescribedFunctionTemplate())
1375 return false;
1376
1377 QualType ParamType = getParamDecl(0)->getType();
1378 if (!isa<RValueReferenceType>(ParamType))
1379 return false;
1380 ParamType = ParamType->getPointeeType();
1381
1382 ASTContext &Context = getASTContext();
1383 QualType ClassType
1384 = Context.getCanonicalType(Context.getTypeDeclType(getParent()));
1385 return Context.hasSameUnqualifiedType(ClassType, ParamType);
1386}
1387
Anders Carlsson05eb2442009-05-16 23:58:37 +00001388void CXXMethodDecl::addOverriddenMethod(const CXXMethodDecl *MD) {
Anders Carlsson3aaf4862009-12-04 05:51:56 +00001389 assert(MD->isCanonicalDecl() && "Method is not canonical!");
Anders Carlssonc076c452010-01-30 17:42:34 +00001390 assert(!MD->getParent()->isDependentContext() &&
1391 "Can't add an overridden method to a class template!");
1392
Douglas Gregor7d10b7e2010-03-02 23:58:15 +00001393 getASTContext().addOverriddenMethod(this, MD);
Anders Carlsson05eb2442009-05-16 23:58:37 +00001394}
1395
1396CXXMethodDecl::method_iterator CXXMethodDecl::begin_overridden_methods() const {
Douglas Gregor7d10b7e2010-03-02 23:58:15 +00001397 return getASTContext().overridden_methods_begin(this);
Anders Carlsson05eb2442009-05-16 23:58:37 +00001398}
1399
1400CXXMethodDecl::method_iterator CXXMethodDecl::end_overridden_methods() const {
Douglas Gregor7d10b7e2010-03-02 23:58:15 +00001401 return getASTContext().overridden_methods_end(this);
Anders Carlsson05eb2442009-05-16 23:58:37 +00001402}
1403
Argyrios Kyrtzidisc91e9f42010-07-04 21:44:35 +00001404unsigned CXXMethodDecl::size_overridden_methods() const {
1405 return getASTContext().overridden_methods_size(this);
1406}
1407
Ted Kremenek4b7c9832008-09-05 17:16:31 +00001408QualType CXXMethodDecl::getThisType(ASTContext &C) const {
Argyrios Kyrtzidisb0d178d2008-10-24 22:28:18 +00001409 // C++ 9.3.2p1: The type of this in a member function of a class X is X*.
1410 // If the member function is declared const, the type of this is const X*,
1411 // if the member function is declared volatile, the type of this is
1412 // volatile X*, and if the member function is declared const volatile,
1413 // the type of this is const volatile X*.
1414
Ted Kremenek4b7c9832008-09-05 17:16:31 +00001415 assert(isInstance() && "No 'this' for static methods!");
Anders Carlsson31a08752009-06-13 02:59:33 +00001416
John McCall3cb0ebd2010-03-10 03:28:59 +00001417 QualType ClassTy = C.getTypeDeclType(getParent());
John McCall0953e762009-09-24 19:53:00 +00001418 ClassTy = C.getQualifiedType(ClassTy,
1419 Qualifiers::fromCVRMask(getTypeQualifiers()));
Anders Carlsson4e579922009-07-10 21:35:09 +00001420 return C.getPointerType(ClassTy);
Ted Kremenek4b7c9832008-09-05 17:16:31 +00001421}
1422
Eli Friedmand7d7f672009-12-06 20:50:05 +00001423bool CXXMethodDecl::hasInlineBody() const {
Douglas Gregorbd6d6192010-01-05 19:06:31 +00001424 // If this function is a template instantiation, look at the template from
1425 // which it was instantiated.
1426 const FunctionDecl *CheckFn = getTemplateInstantiationPattern();
1427 if (!CheckFn)
1428 CheckFn = this;
1429
Eli Friedmand7d7f672009-12-06 20:50:05 +00001430 const FunctionDecl *fn;
Argyrios Kyrtzidis06a54a32010-07-07 11:31:19 +00001431 return CheckFn->hasBody(fn) && !fn->isOutOfLine();
Eli Friedmand7d7f672009-12-06 20:50:05 +00001432}
1433
Sean Huntcbb67482011-01-08 20:30:50 +00001434CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
1435 TypeSourceInfo *TInfo, bool IsVirtual,
1436 SourceLocation L, Expr *Init,
1437 SourceLocation R,
1438 SourceLocation EllipsisLoc)
Sean Huntf51d0b62011-01-08 23:01:16 +00001439 : Initializee(TInfo), MemberOrEllipsisLocation(EllipsisLoc), Init(Init),
Douglas Gregor76852c22011-11-01 01:16:03 +00001440 LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(IsVirtual),
1441 IsWritten(false), SourceOrderOrNumArrayIndices(0)
Douglas Gregor802ab452009-12-02 22:36:29 +00001442{
Douglas Gregor7ad83902008-11-05 04:29:56 +00001443}
1444
Sean Huntcbb67482011-01-08 20:30:50 +00001445CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
1446 FieldDecl *Member,
1447 SourceLocation MemberLoc,
1448 SourceLocation L, Expr *Init,
1449 SourceLocation R)
Sean Huntf51d0b62011-01-08 23:01:16 +00001450 : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init),
Douglas Gregor76852c22011-11-01 01:16:03 +00001451 LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
Francois Pichet00eb3f92010-12-04 09:14:42 +00001452 IsWritten(false), SourceOrderOrNumArrayIndices(0)
1453{
1454}
1455
Sean Huntcbb67482011-01-08 20:30:50 +00001456CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
1457 IndirectFieldDecl *Member,
1458 SourceLocation MemberLoc,
1459 SourceLocation L, Expr *Init,
1460 SourceLocation R)
Sean Huntf51d0b62011-01-08 23:01:16 +00001461 : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init),
Douglas Gregor76852c22011-11-01 01:16:03 +00001462 LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
Abramo Bagnaraa0af3b42010-05-26 18:09:23 +00001463 IsWritten(false), SourceOrderOrNumArrayIndices(0)
Douglas Gregor802ab452009-12-02 22:36:29 +00001464{
Douglas Gregor7ad83902008-11-05 04:29:56 +00001465}
1466
Sean Huntcbb67482011-01-08 20:30:50 +00001467CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
Douglas Gregor76852c22011-11-01 01:16:03 +00001468 TypeSourceInfo *TInfo,
1469 SourceLocation L, Expr *Init,
Sean Hunt41717662011-02-26 19:13:13 +00001470 SourceLocation R)
Douglas Gregor76852c22011-11-01 01:16:03 +00001471 : Initializee(TInfo), MemberOrEllipsisLocation(), Init(Init),
1472 LParenLoc(L), RParenLoc(R), IsDelegating(true), IsVirtual(false),
Sean Hunt41717662011-02-26 19:13:13 +00001473 IsWritten(false), SourceOrderOrNumArrayIndices(0)
1474{
1475}
1476
1477CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
Sean Huntcbb67482011-01-08 20:30:50 +00001478 FieldDecl *Member,
1479 SourceLocation MemberLoc,
1480 SourceLocation L, Expr *Init,
1481 SourceLocation R,
1482 VarDecl **Indices,
1483 unsigned NumIndices)
Sean Huntf51d0b62011-01-08 23:01:16 +00001484 : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init),
Francois Pichet00eb3f92010-12-04 09:14:42 +00001485 LParenLoc(L), RParenLoc(R), IsVirtual(false),
Abramo Bagnaraa0af3b42010-05-26 18:09:23 +00001486 IsWritten(false), SourceOrderOrNumArrayIndices(NumIndices)
Douglas Gregorfb8cc252010-05-05 05:51:00 +00001487{
1488 VarDecl **MyIndices = reinterpret_cast<VarDecl **> (this + 1);
1489 memcpy(MyIndices, Indices, NumIndices * sizeof(VarDecl *));
1490}
1491
Sean Huntcbb67482011-01-08 20:30:50 +00001492CXXCtorInitializer *CXXCtorInitializer::Create(ASTContext &Context,
1493 FieldDecl *Member,
1494 SourceLocation MemberLoc,
1495 SourceLocation L, Expr *Init,
1496 SourceLocation R,
1497 VarDecl **Indices,
1498 unsigned NumIndices) {
1499 void *Mem = Context.Allocate(sizeof(CXXCtorInitializer) +
Douglas Gregorfb8cc252010-05-05 05:51:00 +00001500 sizeof(VarDecl *) * NumIndices,
Sean Huntcbb67482011-01-08 20:30:50 +00001501 llvm::alignOf<CXXCtorInitializer>());
Sean Huntf51d0b62011-01-08 23:01:16 +00001502 return new (Mem) CXXCtorInitializer(Context, Member, MemberLoc, L, Init, R,
1503 Indices, NumIndices);
Douglas Gregorfb8cc252010-05-05 05:51:00 +00001504}
1505
Sean Huntcbb67482011-01-08 20:30:50 +00001506TypeLoc CXXCtorInitializer::getBaseClassLoc() const {
Douglas Gregor802ab452009-12-02 22:36:29 +00001507 if (isBaseInitializer())
Sean Huntf51d0b62011-01-08 23:01:16 +00001508 return Initializee.get<TypeSourceInfo*>()->getTypeLoc();
Douglas Gregor802ab452009-12-02 22:36:29 +00001509 else
1510 return TypeLoc();
1511}
1512
Sean Huntcbb67482011-01-08 20:30:50 +00001513const Type *CXXCtorInitializer::getBaseClass() const {
Douglas Gregor802ab452009-12-02 22:36:29 +00001514 if (isBaseInitializer())
Sean Huntf51d0b62011-01-08 23:01:16 +00001515 return Initializee.get<TypeSourceInfo*>()->getType().getTypePtr();
Douglas Gregor802ab452009-12-02 22:36:29 +00001516 else
1517 return 0;
1518}
1519
Sean Huntcbb67482011-01-08 20:30:50 +00001520SourceLocation CXXCtorInitializer::getSourceLocation() const {
Douglas Gregor76852c22011-11-01 01:16:03 +00001521 if (isAnyMemberInitializer())
Douglas Gregor802ab452009-12-02 22:36:29 +00001522 return getMemberLocation();
Richard Smith7a614d82011-06-11 17:19:42 +00001523
1524 if (isInClassMemberInitializer())
1525 return getAnyMember()->getLocation();
Douglas Gregor802ab452009-12-02 22:36:29 +00001526
Douglas Gregor76852c22011-11-01 01:16:03 +00001527 if (TypeSourceInfo *TSInfo = Initializee.get<TypeSourceInfo*>())
1528 return TSInfo->getTypeLoc().getLocalSourceRange().getBegin();
1529
1530 return SourceLocation();
Douglas Gregor802ab452009-12-02 22:36:29 +00001531}
1532
Sean Huntcbb67482011-01-08 20:30:50 +00001533SourceRange CXXCtorInitializer::getSourceRange() const {
Richard Smith7a614d82011-06-11 17:19:42 +00001534 if (isInClassMemberInitializer()) {
1535 FieldDecl *D = getAnyMember();
1536 if (Expr *I = D->getInClassInitializer())
1537 return I->getSourceRange();
1538 return SourceRange();
1539 }
1540
Douglas Gregor802ab452009-12-02 22:36:29 +00001541 return SourceRange(getSourceLocation(), getRParenLoc());
Douglas Gregor7ad83902008-11-05 04:29:56 +00001542}
1543
David Blaikie99ba9e32011-12-20 02:48:34 +00001544void CXXConstructorDecl::anchor() { }
1545
Douglas Gregorb48fe382008-10-31 09:07:45 +00001546CXXConstructorDecl *
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001547CXXConstructorDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1548 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(CXXConstructorDecl));
1549 return new (Mem) CXXConstructorDecl(0, SourceLocation(),DeclarationNameInfo(),
1550 QualType(), 0, false, false, false,false);
Chris Lattner6ad9ac02010-05-07 21:43:38 +00001551}
1552
1553CXXConstructorDecl *
Douglas Gregorb48fe382008-10-31 09:07:45 +00001554CXXConstructorDecl::Create(ASTContext &C, CXXRecordDecl *RD,
Abramo Bagnaraff676cb2011-03-08 08:55:46 +00001555 SourceLocation StartLoc,
Abramo Bagnara25777432010-08-11 22:01:17 +00001556 const DeclarationNameInfo &NameInfo,
John McCalla93c9342009-12-07 02:54:59 +00001557 QualType T, TypeSourceInfo *TInfo,
Richard Smithaf1fc7a2011-08-15 21:04:07 +00001558 bool isExplicit, bool isInline,
1559 bool isImplicitlyDeclared, bool isConstexpr) {
Abramo Bagnara25777432010-08-11 22:01:17 +00001560 assert(NameInfo.getName().getNameKind()
1561 == DeclarationName::CXXConstructorName &&
Douglas Gregor2e1cd422008-11-17 14:58:09 +00001562 "Name must refer to a constructor");
Abramo Bagnaraff676cb2011-03-08 08:55:46 +00001563 return new (C) CXXConstructorDecl(RD, StartLoc, NameInfo, T, TInfo,
Richard Smithaf1fc7a2011-08-15 21:04:07 +00001564 isExplicit, isInline, isImplicitlyDeclared,
1565 isConstexpr);
Douglas Gregorb48fe382008-10-31 09:07:45 +00001566}
1567
Douglas Gregor76852c22011-11-01 01:16:03 +00001568CXXConstructorDecl *CXXConstructorDecl::getTargetConstructor() const {
1569 assert(isDelegatingConstructor() && "Not a delegating constructor!");
1570 Expr *E = (*init_begin())->getInit()->IgnoreImplicit();
1571 if (CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(E))
1572 return Construct->getConstructor();
1573
1574 return 0;
1575}
1576
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001577bool CXXConstructorDecl::isDefaultConstructor() const {
1578 // C++ [class.ctor]p5:
Douglas Gregor64bffa92008-11-05 16:20:31 +00001579 // A default constructor for a class X is a constructor of class
1580 // X that can be called without an argument.
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001581 return (getNumParams() == 0) ||
Anders Carlssonda3f4e22009-08-25 05:12:04 +00001582 (getNumParams() > 0 && getParamDecl(0)->hasDefaultArg());
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001583}
1584
Mike Stump1eb44332009-09-09 15:08:12 +00001585bool
Douglas Gregor9e9199d2009-12-22 00:34:07 +00001586CXXConstructorDecl::isCopyConstructor(unsigned &TypeQuals) const {
Douglas Gregorcc15f012011-01-21 19:38:21 +00001587 return isCopyOrMoveConstructor(TypeQuals) &&
1588 getParamDecl(0)->getType()->isLValueReferenceType();
1589}
1590
1591bool CXXConstructorDecl::isMoveConstructor(unsigned &TypeQuals) const {
1592 return isCopyOrMoveConstructor(TypeQuals) &&
1593 getParamDecl(0)->getType()->isRValueReferenceType();
1594}
1595
1596/// \brief Determine whether this is a copy or move constructor.
1597bool CXXConstructorDecl::isCopyOrMoveConstructor(unsigned &TypeQuals) const {
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001598 // C++ [class.copy]p2:
Douglas Gregor64bffa92008-11-05 16:20:31 +00001599 // A non-template constructor for class X is a copy constructor
1600 // if its first parameter is of type X&, const X&, volatile X& or
1601 // const volatile X&, and either there are no other parameters
1602 // or else all other parameters have default arguments (8.3.6).
Douglas Gregorcc15f012011-01-21 19:38:21 +00001603 // C++0x [class.copy]p3:
1604 // A non-template constructor for class X is a move constructor if its
1605 // first parameter is of type X&&, const X&&, volatile X&&, or
1606 // const volatile X&&, and either there are no other parameters or else
1607 // all other parameters have default arguments.
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001608 if ((getNumParams() < 1) ||
Douglas Gregor77da3f42009-10-13 23:45:19 +00001609 (getNumParams() > 1 && !getParamDecl(1)->hasDefaultArg()) ||
Douglas Gregorfd476482009-11-13 23:59:09 +00001610 (getPrimaryTemplate() != 0) ||
Douglas Gregor77da3f42009-10-13 23:45:19 +00001611 (getDescribedFunctionTemplate() != 0))
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001612 return false;
Douglas Gregorcc15f012011-01-21 19:38:21 +00001613
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001614 const ParmVarDecl *Param = getParamDecl(0);
Douglas Gregorcc15f012011-01-21 19:38:21 +00001615
1616 // Do we have a reference type?
1617 const ReferenceType *ParamRefType = Param->getType()->getAs<ReferenceType>();
Douglas Gregorfd476482009-11-13 23:59:09 +00001618 if (!ParamRefType)
1619 return false;
Douglas Gregorcc15f012011-01-21 19:38:21 +00001620
Douglas Gregorfd476482009-11-13 23:59:09 +00001621 // Is it a reference to our class type?
Douglas Gregor9e9199d2009-12-22 00:34:07 +00001622 ASTContext &Context = getASTContext();
1623
Douglas Gregorfd476482009-11-13 23:59:09 +00001624 CanQualType PointeeType
1625 = Context.getCanonicalType(ParamRefType->getPointeeType());
Douglas Gregor14e0b3d2009-09-15 20:50:23 +00001626 CanQualType ClassTy
1627 = Context.getCanonicalType(Context.getTagDeclType(getParent()));
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001628 if (PointeeType.getUnqualifiedType() != ClassTy)
1629 return false;
Douglas Gregorcc15f012011-01-21 19:38:21 +00001630
John McCall0953e762009-09-24 19:53:00 +00001631 // FIXME: other qualifiers?
Douglas Gregorcc15f012011-01-21 19:38:21 +00001632
1633 // We have a copy or move constructor.
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001634 TypeQuals = PointeeType.getCVRQualifiers();
Douglas Gregorcc15f012011-01-21 19:38:21 +00001635 return true;
Douglas Gregor030ff0c2008-10-31 20:25:05 +00001636}
1637
Anders Carlssonfaccd722009-08-28 16:57:08 +00001638bool CXXConstructorDecl::isConvertingConstructor(bool AllowExplicit) const {
Douglas Gregor60d62c22008-10-31 16:23:19 +00001639 // C++ [class.conv.ctor]p1:
1640 // A constructor declared without the function-specifier explicit
1641 // that can be called with a single parameter specifies a
1642 // conversion from the type of its first parameter to the type of
1643 // its class. Such a constructor is called a converting
1644 // constructor.
Anders Carlssonfaccd722009-08-28 16:57:08 +00001645 if (isExplicit() && !AllowExplicit)
Douglas Gregor60d62c22008-10-31 16:23:19 +00001646 return false;
1647
Mike Stump1eb44332009-09-09 15:08:12 +00001648 return (getNumParams() == 0 &&
John McCall183700f2009-09-21 23:43:11 +00001649 getType()->getAs<FunctionProtoType>()->isVariadic()) ||
Douglas Gregor60d62c22008-10-31 16:23:19 +00001650 (getNumParams() == 1) ||
Anders Carlssonae0b4e72009-06-06 04:14:07 +00001651 (getNumParams() > 1 && getParamDecl(1)->hasDefaultArg());
Douglas Gregor60d62c22008-10-31 16:23:19 +00001652}
Douglas Gregorb48fe382008-10-31 09:07:45 +00001653
Douglas Gregor6493cc52010-11-08 17:16:59 +00001654bool CXXConstructorDecl::isSpecializationCopyingObject() const {
Douglas Gregor66724ea2009-11-14 01:20:54 +00001655 if ((getNumParams() < 1) ||
1656 (getNumParams() > 1 && !getParamDecl(1)->hasDefaultArg()) ||
1657 (getPrimaryTemplate() == 0) ||
1658 (getDescribedFunctionTemplate() != 0))
1659 return false;
1660
1661 const ParmVarDecl *Param = getParamDecl(0);
1662
1663 ASTContext &Context = getASTContext();
1664 CanQualType ParamType = Context.getCanonicalType(Param->getType());
1665
Douglas Gregor66724ea2009-11-14 01:20:54 +00001666 // Is it the same as our our class type?
1667 CanQualType ClassTy
1668 = Context.getCanonicalType(Context.getTagDeclType(getParent()));
1669 if (ParamType.getUnqualifiedType() != ClassTy)
1670 return false;
1671
1672 return true;
1673}
1674
Sebastian Redlf677ea32011-02-05 19:23:19 +00001675const CXXConstructorDecl *CXXConstructorDecl::getInheritedConstructor() const {
1676 // Hack: we store the inherited constructor in the overridden method table
1677 method_iterator It = begin_overridden_methods();
1678 if (It == end_overridden_methods())
1679 return 0;
1680
1681 return cast<CXXConstructorDecl>(*It);
1682}
1683
1684void
1685CXXConstructorDecl::setInheritedConstructor(const CXXConstructorDecl *BaseCtor){
1686 // Hack: we store the inherited constructor in the overridden method table
1687 assert(size_overridden_methods() == 0 && "Base ctor already set.");
1688 addOverriddenMethod(BaseCtor);
1689}
1690
David Blaikie99ba9e32011-12-20 02:48:34 +00001691void CXXDestructorDecl::anchor() { }
1692
Douglas Gregor42a552f2008-11-05 20:51:48 +00001693CXXDestructorDecl *
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001694CXXDestructorDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1695 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(CXXDestructorDecl));
1696 return new (Mem) CXXDestructorDecl(0, SourceLocation(), DeclarationNameInfo(),
Craig Silversteinb41d8992010-10-21 00:44:50 +00001697 QualType(), 0, false, false);
Chris Lattner6ad9ac02010-05-07 21:43:38 +00001698}
1699
1700CXXDestructorDecl *
Douglas Gregor42a552f2008-11-05 20:51:48 +00001701CXXDestructorDecl::Create(ASTContext &C, CXXRecordDecl *RD,
Abramo Bagnaraff676cb2011-03-08 08:55:46 +00001702 SourceLocation StartLoc,
Abramo Bagnara25777432010-08-11 22:01:17 +00001703 const DeclarationNameInfo &NameInfo,
Craig Silversteinb41d8992010-10-21 00:44:50 +00001704 QualType T, TypeSourceInfo *TInfo,
Richard Smithaf1fc7a2011-08-15 21:04:07 +00001705 bool isInline, bool isImplicitlyDeclared) {
Abramo Bagnara25777432010-08-11 22:01:17 +00001706 assert(NameInfo.getName().getNameKind()
1707 == DeclarationName::CXXDestructorName &&
Douglas Gregor2e1cd422008-11-17 14:58:09 +00001708 "Name must refer to a destructor");
Abramo Bagnaraff676cb2011-03-08 08:55:46 +00001709 return new (C) CXXDestructorDecl(RD, StartLoc, NameInfo, T, TInfo, isInline,
Abramo Bagnara25777432010-08-11 22:01:17 +00001710 isImplicitlyDeclared);
Douglas Gregor42a552f2008-11-05 20:51:48 +00001711}
1712
David Blaikie99ba9e32011-12-20 02:48:34 +00001713void CXXConversionDecl::anchor() { }
1714
Douglas Gregor2f1bc522008-11-07 20:08:42 +00001715CXXConversionDecl *
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001716CXXConversionDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1717 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(CXXConversionDecl));
1718 return new (Mem) CXXConversionDecl(0, SourceLocation(), DeclarationNameInfo(),
1719 QualType(), 0, false, false, false,
1720 SourceLocation());
Chris Lattner6ad9ac02010-05-07 21:43:38 +00001721}
1722
1723CXXConversionDecl *
Douglas Gregor2f1bc522008-11-07 20:08:42 +00001724CXXConversionDecl::Create(ASTContext &C, CXXRecordDecl *RD,
Abramo Bagnaraff676cb2011-03-08 08:55:46 +00001725 SourceLocation StartLoc,
Abramo Bagnara25777432010-08-11 22:01:17 +00001726 const DeclarationNameInfo &NameInfo,
John McCalla93c9342009-12-07 02:54:59 +00001727 QualType T, TypeSourceInfo *TInfo,
Douglas Gregorf5251602011-03-08 17:10:18 +00001728 bool isInline, bool isExplicit,
Richard Smithaf1fc7a2011-08-15 21:04:07 +00001729 bool isConstexpr, SourceLocation EndLocation) {
Abramo Bagnara25777432010-08-11 22:01:17 +00001730 assert(NameInfo.getName().getNameKind()
1731 == DeclarationName::CXXConversionFunctionName &&
Douglas Gregor2e1cd422008-11-17 14:58:09 +00001732 "Name must refer to a conversion function");
Abramo Bagnaraff676cb2011-03-08 08:55:46 +00001733 return new (C) CXXConversionDecl(RD, StartLoc, NameInfo, T, TInfo,
Richard Smithaf1fc7a2011-08-15 21:04:07 +00001734 isInline, isExplicit, isConstexpr,
1735 EndLocation);
Douglas Gregor2f1bc522008-11-07 20:08:42 +00001736}
1737
David Blaikie99ba9e32011-12-20 02:48:34 +00001738void LinkageSpecDecl::anchor() { }
1739
Chris Lattner21ef7ae2008-11-04 16:51:42 +00001740LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C,
Mike Stump1eb44332009-09-09 15:08:12 +00001741 DeclContext *DC,
Abramo Bagnaraa2026c92011-03-08 16:41:52 +00001742 SourceLocation ExternLoc,
1743 SourceLocation LangLoc,
Abramo Bagnara5f6bcbe2011-03-03 14:52:38 +00001744 LanguageIDs Lang,
Abramo Bagnara5f6bcbe2011-03-03 14:52:38 +00001745 SourceLocation RBraceLoc) {
Abramo Bagnaraa2026c92011-03-08 16:41:52 +00001746 return new (C) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, RBraceLoc);
Douglas Gregorf44515a2008-12-16 22:23:02 +00001747}
Douglas Gregor2a3009a2009-02-03 19:21:40 +00001748
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001749LinkageSpecDecl *LinkageSpecDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1750 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(LinkageSpecDecl));
1751 return new (Mem) LinkageSpecDecl(0, SourceLocation(), SourceLocation(),
1752 lang_c, SourceLocation());
1753}
1754
David Blaikie99ba9e32011-12-20 02:48:34 +00001755void UsingDirectiveDecl::anchor() { }
1756
Douglas Gregor2a3009a2009-02-03 19:21:40 +00001757UsingDirectiveDecl *UsingDirectiveDecl::Create(ASTContext &C, DeclContext *DC,
1758 SourceLocation L,
1759 SourceLocation NamespaceLoc,
Douglas Gregordb992412011-02-25 16:33:46 +00001760 NestedNameSpecifierLoc QualifierLoc,
Douglas Gregor2a3009a2009-02-03 19:21:40 +00001761 SourceLocation IdentLoc,
Sebastian Redleb0d8c92009-11-23 15:34:23 +00001762 NamedDecl *Used,
Douglas Gregor2a3009a2009-02-03 19:21:40 +00001763 DeclContext *CommonAncestor) {
Sebastian Redleb0d8c92009-11-23 15:34:23 +00001764 if (NamespaceDecl *NS = dyn_cast_or_null<NamespaceDecl>(Used))
1765 Used = NS->getOriginalNamespace();
Douglas Gregordb992412011-02-25 16:33:46 +00001766 return new (C) UsingDirectiveDecl(DC, L, NamespaceLoc, QualifierLoc,
1767 IdentLoc, Used, CommonAncestor);
Douglas Gregor2a3009a2009-02-03 19:21:40 +00001768}
1769
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001770UsingDirectiveDecl *
1771UsingDirectiveDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1772 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(UsingDirectiveDecl));
1773 return new (Mem) UsingDirectiveDecl(0, SourceLocation(), SourceLocation(),
1774 NestedNameSpecifierLoc(),
1775 SourceLocation(), 0, 0);
1776}
1777
Sebastian Redleb0d8c92009-11-23 15:34:23 +00001778NamespaceDecl *UsingDirectiveDecl::getNominatedNamespace() {
1779 if (NamespaceAliasDecl *NA =
1780 dyn_cast_or_null<NamespaceAliasDecl>(NominatedNamespace))
1781 return NA->getNamespace();
1782 return cast_or_null<NamespaceDecl>(NominatedNamespace);
1783}
1784
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001785void NamespaceDecl::anchor() { }
1786
Douglas Gregorf5c9f9f2012-01-07 09:11:48 +00001787NamespaceDecl::NamespaceDecl(DeclContext *DC, bool Inline,
1788 SourceLocation StartLoc,
1789 SourceLocation IdLoc, IdentifierInfo *Id,
1790 NamespaceDecl *PrevDecl)
1791 : NamedDecl(Namespace, DC, IdLoc, Id), DeclContext(Namespace),
1792 LocStart(StartLoc), RBraceLoc(), AnonOrFirstNamespaceAndInline(0, Inline)
1793{
1794 setPreviousDeclaration(PrevDecl);
1795
1796 if (PrevDecl)
1797 AnonOrFirstNamespaceAndInline.setPointer(PrevDecl->getOriginalNamespace());
1798}
1799
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001800NamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC,
Douglas Gregorf5c9f9f2012-01-07 09:11:48 +00001801 bool Inline, SourceLocation StartLoc,
1802 SourceLocation IdLoc, IdentifierInfo *Id,
1803 NamespaceDecl *PrevDecl) {
1804 return new (C) NamespaceDecl(DC, Inline, StartLoc, IdLoc, Id, PrevDecl);
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001805}
1806
1807NamespaceDecl *NamespaceDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1808 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(NamespaceDecl));
Douglas Gregorf5c9f9f2012-01-07 09:11:48 +00001809 return new (Mem) NamespaceDecl(0, false, SourceLocation(), SourceLocation(),
1810 0, 0);
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001811}
1812
David Blaikie99ba9e32011-12-20 02:48:34 +00001813void NamespaceAliasDecl::anchor() { }
1814
Mike Stump1eb44332009-09-09 15:08:12 +00001815NamespaceAliasDecl *NamespaceAliasDecl::Create(ASTContext &C, DeclContext *DC,
Douglas Gregor0a35bce2010-09-01 03:07:18 +00001816 SourceLocation UsingLoc,
Mike Stump1eb44332009-09-09 15:08:12 +00001817 SourceLocation AliasLoc,
1818 IdentifierInfo *Alias,
Douglas Gregor0cfaf6a2011-02-25 17:08:07 +00001819 NestedNameSpecifierLoc QualifierLoc,
Mike Stump1eb44332009-09-09 15:08:12 +00001820 SourceLocation IdentLoc,
Anders Carlsson68771c72009-03-28 22:58:02 +00001821 NamedDecl *Namespace) {
Sebastian Redleb0d8c92009-11-23 15:34:23 +00001822 if (NamespaceDecl *NS = dyn_cast_or_null<NamespaceDecl>(Namespace))
1823 Namespace = NS->getOriginalNamespace();
Douglas Gregor0cfaf6a2011-02-25 17:08:07 +00001824 return new (C) NamespaceAliasDecl(DC, UsingLoc, AliasLoc, Alias,
1825 QualifierLoc, IdentLoc, Namespace);
Anders Carlsson68771c72009-03-28 22:58:02 +00001826}
1827
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001828NamespaceAliasDecl *
1829NamespaceAliasDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1830 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(NamespaceAliasDecl));
1831 return new (Mem) NamespaceAliasDecl(0, SourceLocation(), SourceLocation(), 0,
1832 NestedNameSpecifierLoc(),
1833 SourceLocation(), 0);
1834}
1835
David Blaikie99ba9e32011-12-20 02:48:34 +00001836void UsingShadowDecl::anchor() { }
1837
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001838UsingShadowDecl *
1839UsingShadowDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1840 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(UsingShadowDecl));
1841 return new (Mem) UsingShadowDecl(0, SourceLocation(), 0, 0);
1842}
1843
Argyrios Kyrtzidis826faa22010-11-10 05:40:41 +00001844UsingDecl *UsingShadowDecl::getUsingDecl() const {
1845 const UsingShadowDecl *Shadow = this;
1846 while (const UsingShadowDecl *NextShadow =
1847 dyn_cast<UsingShadowDecl>(Shadow->UsingOrNextShadow))
1848 Shadow = NextShadow;
1849 return cast<UsingDecl>(Shadow->UsingOrNextShadow);
1850}
1851
David Blaikie99ba9e32011-12-20 02:48:34 +00001852void UsingDecl::anchor() { }
1853
Argyrios Kyrtzidis826faa22010-11-10 05:40:41 +00001854void UsingDecl::addShadowDecl(UsingShadowDecl *S) {
1855 assert(std::find(shadow_begin(), shadow_end(), S) == shadow_end() &&
1856 "declaration already in set");
1857 assert(S->getUsingDecl() == this);
1858
Benjamin Kramer9bc6fb62012-01-07 19:09:05 +00001859 if (FirstUsingShadow.getPointer())
1860 S->UsingOrNextShadow = FirstUsingShadow.getPointer();
1861 FirstUsingShadow.setPointer(S);
Argyrios Kyrtzidis826faa22010-11-10 05:40:41 +00001862}
1863
1864void UsingDecl::removeShadowDecl(UsingShadowDecl *S) {
1865 assert(std::find(shadow_begin(), shadow_end(), S) != shadow_end() &&
1866 "declaration not in set");
1867 assert(S->getUsingDecl() == this);
1868
1869 // Remove S from the shadow decl chain. This is O(n) but hopefully rare.
1870
Benjamin Kramer9bc6fb62012-01-07 19:09:05 +00001871 if (FirstUsingShadow.getPointer() == S) {
1872 FirstUsingShadow.setPointer(
1873 dyn_cast<UsingShadowDecl>(S->UsingOrNextShadow));
Argyrios Kyrtzidis826faa22010-11-10 05:40:41 +00001874 S->UsingOrNextShadow = this;
1875 return;
1876 }
1877
Benjamin Kramer9bc6fb62012-01-07 19:09:05 +00001878 UsingShadowDecl *Prev = FirstUsingShadow.getPointer();
Argyrios Kyrtzidis826faa22010-11-10 05:40:41 +00001879 while (Prev->UsingOrNextShadow != S)
1880 Prev = cast<UsingShadowDecl>(Prev->UsingOrNextShadow);
1881 Prev->UsingOrNextShadow = S->UsingOrNextShadow;
1882 S->UsingOrNextShadow = this;
1883}
1884
Douglas Gregordc355712011-02-25 00:36:19 +00001885UsingDecl *UsingDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation UL,
1886 NestedNameSpecifierLoc QualifierLoc,
Abramo Bagnaraef3dce82010-08-12 11:46:03 +00001887 const DeclarationNameInfo &NameInfo,
1888 bool IsTypeNameArg) {
Douglas Gregordc355712011-02-25 00:36:19 +00001889 return new (C) UsingDecl(DC, UL, QualifierLoc, NameInfo, IsTypeNameArg);
Douglas Gregor9cfbe482009-06-20 00:51:54 +00001890}
1891
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001892UsingDecl *UsingDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1893 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(UsingDecl));
1894 return new (Mem) UsingDecl(0, SourceLocation(), NestedNameSpecifierLoc(),
1895 DeclarationNameInfo(), false);
1896}
1897
David Blaikie99ba9e32011-12-20 02:48:34 +00001898void UnresolvedUsingValueDecl::anchor() { }
1899
John McCall7ba107a2009-11-18 02:36:19 +00001900UnresolvedUsingValueDecl *
1901UnresolvedUsingValueDecl::Create(ASTContext &C, DeclContext *DC,
1902 SourceLocation UsingLoc,
Douglas Gregordc355712011-02-25 00:36:19 +00001903 NestedNameSpecifierLoc QualifierLoc,
Abramo Bagnaraef3dce82010-08-12 11:46:03 +00001904 const DeclarationNameInfo &NameInfo) {
John McCall7ba107a2009-11-18 02:36:19 +00001905 return new (C) UnresolvedUsingValueDecl(DC, C.DependentTy, UsingLoc,
Douglas Gregordc355712011-02-25 00:36:19 +00001906 QualifierLoc, NameInfo);
John McCall7ba107a2009-11-18 02:36:19 +00001907}
1908
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001909UnresolvedUsingValueDecl *
1910UnresolvedUsingValueDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1911 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(UnresolvedUsingValueDecl));
1912 return new (Mem) UnresolvedUsingValueDecl(0, QualType(), SourceLocation(),
1913 NestedNameSpecifierLoc(),
1914 DeclarationNameInfo());
1915}
1916
David Blaikie99ba9e32011-12-20 02:48:34 +00001917void UnresolvedUsingTypenameDecl::anchor() { }
1918
John McCall7ba107a2009-11-18 02:36:19 +00001919UnresolvedUsingTypenameDecl *
1920UnresolvedUsingTypenameDecl::Create(ASTContext &C, DeclContext *DC,
1921 SourceLocation UsingLoc,
1922 SourceLocation TypenameLoc,
Douglas Gregordc355712011-02-25 00:36:19 +00001923 NestedNameSpecifierLoc QualifierLoc,
John McCall7ba107a2009-11-18 02:36:19 +00001924 SourceLocation TargetNameLoc,
1925 DeclarationName TargetName) {
1926 return new (C) UnresolvedUsingTypenameDecl(DC, UsingLoc, TypenameLoc,
Douglas Gregordc355712011-02-25 00:36:19 +00001927 QualifierLoc, TargetNameLoc,
John McCall7ba107a2009-11-18 02:36:19 +00001928 TargetName.getAsIdentifierInfo());
Anders Carlsson665b49c2009-08-28 05:30:28 +00001929}
1930
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001931UnresolvedUsingTypenameDecl *
1932UnresolvedUsingTypenameDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1933 void *Mem = AllocateDeserializedDecl(C, ID,
1934 sizeof(UnresolvedUsingTypenameDecl));
1935 return new (Mem) UnresolvedUsingTypenameDecl(0, SourceLocation(),
1936 SourceLocation(),
1937 NestedNameSpecifierLoc(),
1938 SourceLocation(),
1939 0);
1940}
1941
David Blaikie99ba9e32011-12-20 02:48:34 +00001942void StaticAssertDecl::anchor() { }
1943
Anders Carlssonfb311762009-03-14 00:25:26 +00001944StaticAssertDecl *StaticAssertDecl::Create(ASTContext &C, DeclContext *DC,
Abramo Bagnaraa2026c92011-03-08 16:41:52 +00001945 SourceLocation StaticAssertLoc,
1946 Expr *AssertExpr,
1947 StringLiteral *Message,
1948 SourceLocation RParenLoc) {
1949 return new (C) StaticAssertDecl(DC, StaticAssertLoc, AssertExpr, Message,
1950 RParenLoc);
Anders Carlssonfb311762009-03-14 00:25:26 +00001951}
1952
Douglas Gregor1e68ecc2012-01-05 21:55:30 +00001953StaticAssertDecl *StaticAssertDecl::CreateDeserialized(ASTContext &C,
1954 unsigned ID) {
1955 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(StaticAssertDecl));
1956 return new (Mem) StaticAssertDecl(0, SourceLocation(), 0, 0,SourceLocation());
1957}
1958
Anders Carlsson05bf2c72009-03-26 23:46:50 +00001959static const char *getAccessName(AccessSpecifier AS) {
1960 switch (AS) {
Anders Carlsson05bf2c72009-03-26 23:46:50 +00001961 case AS_none:
David Blaikieb219cfc2011-09-23 05:06:16 +00001962 llvm_unreachable("Invalid access specifier!");
Anders Carlsson05bf2c72009-03-26 23:46:50 +00001963 case AS_public:
1964 return "public";
1965 case AS_private:
1966 return "private";
1967 case AS_protected:
1968 return "protected";
1969 }
David Blaikie561d3ab2012-01-17 02:30:50 +00001970 llvm_unreachable("Invalid access specifier!");
Anders Carlsson05bf2c72009-03-26 23:46:50 +00001971}
1972
1973const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB,
1974 AccessSpecifier AS) {
1975 return DB << getAccessName(AS);
1976}